Consumer daemon data available command support
[lttng-tools.git] / src / bin / lttng-sessiond / kernel-consumer.c
index 4c037a9eb25b426edb4677701349d560bc06d549..c86d52803b80ac19c254eb3a1e267f3223d6c5d9 100644 (file)
@@ -48,7 +48,8 @@ int kernel_consumer_add_channel(int sock, struct ltt_kernel_channel *channel)
                        channel->fd,
                        channel->channel->attr.subbuf_size,
                        0, /* Kernel */
-                       channel->channel->name);
+                       channel->channel->name,
+                       channel->stream_count);
 
        ret = consumer_send_channel(sock, &lkm);
        if (ret < 0) {
@@ -65,9 +66,10 @@ error:
 int kernel_consumer_add_metadata(int sock, struct ltt_kernel_session *session)
 {
        int ret;
+       char tmp_path[PATH_MAX];
        const char *pathname;
        struct lttcomm_consumer_msg lkm;
-       struct consumer_output *output;
+       struct consumer_output *consumer;
 
        /* Safety net */
        assert(session);
@@ -76,13 +78,37 @@ int kernel_consumer_add_metadata(int sock, struct ltt_kernel_session *session)
        DBG("Sending metadata %d to kernel consumer", session->metadata_stream_fd);
 
        /* Get consumer output pointer */
-       output = session->consumer;
+       consumer = session->consumer;
+
+       /* Get the right path name destination */
+       if (consumer->type == CONSUMER_DST_LOCAL) {
+               /* Set application path to the destination path */
+               ret = snprintf(tmp_path, sizeof(tmp_path), "%s/%s",
+                               consumer->dst.trace_path, consumer->subdir);
+               if (ret < 0) {
+                       PERROR("snprintf metadata path");
+                       goto error;
+               }
+               pathname = tmp_path;
 
-       /* Get correct path name destination */
-       if (output->type == CONSUMER_DST_LOCAL) {
-               pathname = output->dst.trace_path;
+               /* Create directory */
+               ret = run_as_mkdir_recursive(pathname, S_IRWXU | S_IRWXG,
+                               session->uid, session->gid);
+               if (ret < 0) {
+                       if (ret != -EEXIST) {
+                               ERR("Trace directory creation error");
+                               goto error;
+                       }
+               }
+               DBG3("Kernel local consumer tracefile path: %s", pathname);
        } else {
-               pathname = output->subdir;
+               ret = snprintf(tmp_path, sizeof(tmp_path), "%s", consumer->subdir);
+               if (ret < 0) {
+                       PERROR("snprintf metadata path");
+                       goto error;
+               }
+               pathname = tmp_path;
+               DBG3("Kernel network consumer subdir path: %s", pathname);
        }
 
        /* Prep channel message structure */
@@ -91,7 +117,8 @@ int kernel_consumer_add_metadata(int sock, struct ltt_kernel_session *session)
                        session->metadata->fd,
                        session->metadata->conf->attr.subbuf_size,
                        0, /* for kernel */
-                       "metadata");
+                       "metadata",
+                       1);
 
        ret = consumer_send_channel(sock, &lkm);
        if (ret < 0) {
@@ -108,13 +135,14 @@ int kernel_consumer_add_metadata(int sock, struct ltt_kernel_session *session)
                        0, /* Kernel */
                        session->uid,
                        session->gid,
-                       output->net_seq_index,
+                       consumer->net_seq_index,
                        1, /* Metadata flag set */
                        "metadata",
-                       pathname);
+                       pathname,
+                       session->id);
 
        /* Send stream and file descriptor */
-       ret = consumer_send_stream(sock, output, &lkm,
+       ret = consumer_send_stream(sock, consumer, &lkm,
                        &session->metadata_stream_fd, 1);
        if (ret < 0) {
                goto error;
@@ -131,9 +159,10 @@ int kernel_consumer_add_stream(int sock, struct ltt_kernel_channel *channel,
                struct ltt_kernel_stream *stream, struct ltt_kernel_session *session)
 {
        int ret;
+       char tmp_path[PATH_MAX];
        const char *pathname;
        struct lttcomm_consumer_msg lkm;
-       struct consumer_output *output;
+       struct consumer_output *consumer;
 
        assert(channel);
        assert(stream);
@@ -144,15 +173,27 @@ int kernel_consumer_add_stream(int sock, struct ltt_kernel_channel *channel,
                        stream->fd, channel->channel->name);
 
        /* Get consumer output pointer */
-       output = session->consumer;
+       consumer = session->consumer;
 
-       /* Get correct path name destination */
-       if (output->type == CONSUMER_DST_LOCAL) {
-               pathname = output->dst.trace_path;
-               DBG3("Consumer is local to %s", pathname);
+       /* Get the right path name destination */
+       if (consumer->type == CONSUMER_DST_LOCAL) {
+               /* Set application path to the destination path */
+               ret = snprintf(tmp_path, sizeof(tmp_path), "%s/%s",
+                               consumer->dst.trace_path, consumer->subdir);
+               if (ret < 0) {
+                       PERROR("snprintf stream path");
+                       goto error;
+               }
+               pathname = tmp_path;
+               DBG3("Kernel local consumer tracefile path: %s", pathname);
        } else {
-               pathname = output->subdir;
-               DBG3("Consumer is network to subdir %s", pathname);
+               ret = snprintf(tmp_path, sizeof(tmp_path), "%s", consumer->subdir);
+               if (ret < 0) {
+                       PERROR("snprintf stream path");
+                       goto error;
+               }
+               pathname = tmp_path;
+               DBG3("Kernel network consumer subdir path: %s", pathname);
        }
 
        /* Prep stream consumer message */
@@ -164,13 +205,14 @@ int kernel_consumer_add_stream(int sock, struct ltt_kernel_channel *channel,
                        0, /* Kernel */
                        session->uid,
                        session->gid,
-                       output->net_seq_index,
+                       consumer->net_seq_index,
                        0, /* Metadata flag unset */
                        stream->name,
-                       pathname);
+                       pathname,
+                       session->id);
 
        /* Send stream and file descriptor */
-       ret = consumer_send_stream(sock, output, &lkm, &stream->fd, 1);
+       ret = consumer_send_stream(sock, consumer, &lkm, &stream->fd, 1);
        if (ret < 0) {
                goto error;
        }
@@ -195,7 +237,7 @@ int kernel_consumer_send_channel_stream(int sock,
 
        /* Bail out if consumer is disabled */
        if (!session->consumer->enabled) {
-               ret = LTTCOMM_OK;
+               ret = LTTNG_OK;
                goto error;
        }
 
@@ -238,7 +280,7 @@ int kernel_consumer_send_session(int sock, struct ltt_kernel_session *session)
 
        /* Bail out if consumer is disabled */
        if (!session->consumer->enabled) {
-               ret = LTTCOMM_OK;
+               ret = LTTNG_OK;
                goto error;
        }
 
This page took 0.025914 seconds and 4 git commands to generate.