Store the instance id and packet_seq_num in indexes
[lttng-tools.git] / src / common / relayd / relayd.c
index ccb23c065ca7aaeb8037fc30a42016fd7c9c9f3b..60b7ee84970d89dfa1125c5b46a62387dff0b1d6 100644 (file)
@@ -15,7 +15,7 @@
  * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
-#define _GNU_SOURCE
+#define _LGPL_SOURCE
 #include <assert.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -25,6 +25,7 @@
 
 #include <common/common.h>
 #include <common/defaults.h>
+#include <common/compat/endian.h>
 #include <common/sessiond-comm/relayd.h>
 #include <common/index/ctf-index.h>
 
@@ -57,6 +58,7 @@ static int send_command(struct lttcomm_relayd_sock *rsock,
                goto alloc_error;
        }
 
+       memset(&header, 0, sizeof(header));
        header.cmd = htobe32(cmd);
        header.data_size = htobe64(size);
 
@@ -127,7 +129,15 @@ static int relayd_create_session_2_4(struct lttcomm_relayd_sock *rsock,
        int ret;
        struct lttcomm_relayd_create_session_2_4 msg;
 
+       if (strlen(session_name) >= sizeof(msg.session_name)) {
+               ret = -1;
+               goto error;
+       }
        strncpy(msg.session_name, session_name, sizeof(msg.session_name));
+       if (strlen(hostname) >= sizeof(msg.hostname)) {
+               ret = -1;
+               goto error;
+       }
        strncpy(msg.hostname, hostname, sizeof(msg.hostname));
        msg.live_timer = htobe32(session_live_timer);
        msg.snapshot = htobe32(snapshot);
@@ -244,7 +254,16 @@ int relayd_add_stream(struct lttcomm_relayd_sock *rsock, const char *channel_nam
 
        /* Compat with relayd 2.1 */
        if (rsock->minor == 1) {
+               memset(&msg, 0, sizeof(msg));
+               if (strlen(channel_name) >= sizeof(msg.channel_name)) {
+                       ret = -1;
+                       goto error;
+               }
                strncpy(msg.channel_name, channel_name, sizeof(msg.channel_name));
+               if (strlen(pathname) >= sizeof(msg.pathname)) {
+                       ret = -1;
+                       goto error;
+               }
                strncpy(msg.pathname, pathname, sizeof(msg.pathname));
 
                /* Send command */
@@ -253,8 +272,17 @@ int relayd_add_stream(struct lttcomm_relayd_sock *rsock, const char *channel_nam
                        goto error;
                }
        } else {
+               memset(&msg_2_2, 0, sizeof(msg_2_2));
                /* Compat with relayd 2.2+ */
+               if (strlen(channel_name) >= sizeof(msg_2_2.channel_name)) {
+                       ret = -1;
+                       goto error;
+               }
                strncpy(msg_2_2.channel_name, channel_name, sizeof(msg_2_2.channel_name));
+               if (strlen(pathname) >= sizeof(msg_2_2.pathname)) {
+                       ret = -1;
+                       goto error;
+               }
                strncpy(msg_2_2.pathname, pathname, sizeof(msg_2_2.pathname));
                msg_2_2.tracefile_size = htobe64(tracefile_size);
                msg_2_2.tracefile_count = htobe64(tracefile_count);
@@ -364,6 +392,7 @@ int relayd_version_check(struct lttcomm_relayd_sock *rsock)
        DBG("Relayd version check for major.minor %u.%u", rsock->major,
                        rsock->minor);
 
+       memset(&msg, 0, sizeof(msg));
        /* Prepare network byte order before transmission. */
        msg.major = htobe32(rsock->major);
        msg.minor = htobe32(rsock->minor);
@@ -565,6 +594,7 @@ int relayd_send_close_stream(struct lttcomm_relayd_sock *rsock, uint64_t stream_
 
        DBG("Relayd closing stream id %" PRIu64, stream_id);
 
+       memset(&msg, 0, sizeof(msg));
        msg.stream_id = htobe64(stream_id);
        msg.last_net_seq_num = htobe64(last_net_seq_num);
 
@@ -614,6 +644,7 @@ int relayd_data_pending(struct lttcomm_relayd_sock *rsock, uint64_t stream_id,
 
        DBG("Relayd data pending for stream id %" PRIu64, stream_id);
 
+       memset(&msg, 0, sizeof(msg));
        msg.stream_id = htobe64(stream_id);
        msg.last_net_seq_num = htobe64(last_net_seq_num);
 
@@ -662,6 +693,7 @@ int relayd_quiescent_control(struct lttcomm_relayd_sock *rsock,
 
        DBG("Relayd checking quiescent control state");
 
+       memset(&msg, 0, sizeof(msg));
        msg.stream_id = htobe64(metadata_stream_id);
 
        /* Send command */
@@ -706,6 +738,7 @@ int relayd_begin_data_pending(struct lttcomm_relayd_sock *rsock, uint64_t id)
 
        DBG("Relayd begin data pending");
 
+       memset(&msg, 0, sizeof(msg));
        msg.session_id = htobe64(id);
 
        /* Send command */
@@ -753,6 +786,7 @@ int relayd_end_data_pending(struct lttcomm_relayd_sock *rsock, uint64_t id,
 
        DBG("Relayd end data pending");
 
+       memset(&msg, 0, sizeof(msg));
        msg.session_id = htobe64(id);
 
        /* Send command */
@@ -805,6 +839,7 @@ int relayd_send_index(struct lttcomm_relayd_sock *rsock,
 
        DBG("Relayd sending index for stream ID %" PRIu64, relay_stream_id);
 
+       memset(&msg, 0, sizeof(msg));
        msg.relay_stream_id = htobe64(relay_stream_id);
        msg.net_seq_num = htobe64(net_seq_num);
 
@@ -816,6 +851,11 @@ int relayd_send_index(struct lttcomm_relayd_sock *rsock,
        msg.events_discarded = index->events_discarded;
        msg.stream_id = index->stream_id;
 
+       if (rsock->minor >= 8) {
+               msg.stream_instance_id = index->stream_instance_id;
+               msg.packet_seq_num = index->packet_seq_num;
+       }
+
        /* Send command */
        ret = send_command(rsock, RELAYD_SEND_INDEX, &msg, sizeof(msg), 0);
        if (ret < 0) {
This page took 0.024867 seconds and 4 git commands to generate.