Add TODOs for session daemon
[lttng-tools.git] / ltt-sessiond / main.c
index e65e8198b756add9dc21ce96922300dd2170147e..e7ad6f9b140e1c48f05f2befcda5d73fc1ce2803 100644 (file)
@@ -486,12 +486,14 @@ static pid_t spawn_kconsumerd(void)
        int ret;
        pid_t pid;
 
+       DBG("Spawning kconsumerd");
+
        pid = fork();
        if (pid == 0) {
                /*
                 * Exec kconsumerd.
                 */
-               execlp("kconsumerd", "kconsumerd", "--daemonize", NULL);
+               execlp("kconsumerd", "kconsumerd", "--verbose", NULL);
                if (errno != 0) {
                        perror("kernel start consumer exec");
                }
@@ -518,21 +520,21 @@ static int start_kconsumerd(void)
 {
        int ret;
 
-       DBG("Spawning kconsumerd");
-
        pthread_mutex_lock(&kconsumerd_pid_mutex);
-       if (kconsumerd_pid == 0) {
-               ret = spawn_kconsumerd();
-               if (ret < 0) {
-                       ERR("Spawning kconsumerd failed");
-                       ret = LTTCOMM_KERN_CONSUMER_FAIL;
-                       pthread_mutex_unlock(&kconsumerd_pid_mutex);
-                       goto error;
-               }
+       if (kconsumerd_pid != 0) {
+               goto end;
+       }
 
-               /* Setting up the global kconsumerd_pid */
-               kconsumerd_pid = ret;
+       ret = spawn_kconsumerd();
+       if (ret < 0) {
+               ERR("Spawning kconsumerd failed");
+               ret = LTTCOMM_KERN_CONSUMER_FAIL;
+               pthread_mutex_unlock(&kconsumerd_pid_mutex);
+               goto error;
        }
+
+       /* Setting up the global kconsumerd_pid */
+       kconsumerd_pid = ret;
        pthread_mutex_unlock(&kconsumerd_pid_mutex);
 
        DBG("Kconsumerd pid %d", ret);
@@ -544,6 +546,8 @@ static int start_kconsumerd(void)
                goto error;
        }
 
+end:
+       pthread_mutex_unlock(&kconsumerd_pid_mutex);
        return 0;
 
 error:
@@ -557,35 +561,17 @@ error:
  */
 static int send_kconsumerd_fds(int sock, struct ltt_kernel_session *session)
 {
-       int ret, i = 0;
-       /* Plus one here for the metadata fd */
-       size_t nb_fd = session->stream_count_global + 1;
-       int fds[nb_fd];
+       int ret;
+       size_t nb_fd;
        struct ltt_kernel_stream *stream;
        struct ltt_kernel_channel *chan;
        struct lttcomm_kconsumerd_header lkh;
-       struct lttcomm_kconsumerd_msg buf[nb_fd];
+       struct lttcomm_kconsumerd_msg lkm;
 
-       /* Add metadata data */
-       fds[i] = session->metadata_stream_fd;
-       buf[i].fd = fds[i];
-       buf[i].state = ACTIVE_FD;
-       buf[i].max_sb_size = session->metadata->conf->subbuf_size;
-       strncpy(buf[i].path_name, session->metadata->pathname, PATH_MAX);
-
-       cds_list_for_each_entry(chan, &session->channel_list.head, list) {
-               cds_list_for_each_entry(stream, &chan->stream_list.head, list) {
-                       i++;
-                       fds[i] = stream->fd;
-                       buf[i].fd = stream->fd;
-                       buf[i].state = stream->state;
-                       buf[i].max_sb_size = chan->channel->subbuf_size;
-                       strncpy(buf[i].path_name, stream->pathname, PATH_MAX);
-               }
-       }
+       nb_fd = session->stream_count_global;
 
        /* Setup header */
-       lkh.payload_size = nb_fd * sizeof(struct lttcomm_kconsumerd_msg);
+       lkh.payload_size = (nb_fd + 1) * sizeof(struct lttcomm_kconsumerd_msg);
        lkh.cmd_type = ADD_STREAM;
 
        DBG("Sending kconsumerd header");
@@ -596,14 +582,37 @@ static int send_kconsumerd_fds(int sock, struct ltt_kernel_session *session)
                goto error;
        }
 
-       DBG("Sending all fds to kconsumerd");
+       DBG("Sending metadata stream fd");
 
-       ret = lttcomm_send_fds_unix_sock(sock, buf, fds, nb_fd, lkh.payload_size);
+       /* Send metadata stream fd first */
+       lkm.fd = session->metadata_stream_fd;
+       lkm.state = ACTIVE_FD;
+       lkm.max_sb_size = session->metadata->conf->subbuf_size;
+       strncpy(lkm.path_name, session->metadata->pathname, PATH_MAX);
+
+       ret = lttcomm_send_fds_unix_sock(sock, &lkm, &lkm.fd, 1, sizeof(lkm));
        if (ret < 0) {
-               perror("send kconsumerd fds");
+               perror("send kconsumerd fd");
                goto error;
        }
 
+       cds_list_for_each_entry(chan, &session->channel_list.head, list) {
+               cds_list_for_each_entry(stream, &chan->stream_list.head, list) {
+                       lkm.fd = stream->fd;
+                       lkm.state = stream->state;
+                       lkm.max_sb_size = chan->channel->subbuf_size;
+                       strncpy(lkm.path_name, stream->pathname, PATH_MAX);
+
+                       DBG("Sending fd %d to kconsumerd", lkm.fd);
+
+                       ret = lttcomm_send_fds_unix_sock(sock, &lkm, &lkm.fd, 1, sizeof(lkm));
+                       if (ret < 0) {
+                               perror("send kconsumerd fd");
+                               goto error;
+                       }
+               }
+       }
+
        DBG("Kconsumerd fds sent");
 
        return 0;
@@ -625,6 +634,7 @@ static int create_trace_dir(struct ltt_kernel_session *session)
        /* Create all channel directories */
        cds_list_for_each_entry(chan, &session->channel_list.head, list) {
                DBG("Creating trace directory at %s", chan->pathname);
+               // TODO: recursive create dir
                ret = mkdir(chan->pathname, S_IRWXU | S_IRWXG );
                if (ret < 0) {
                        perror("mkdir trace path");
@@ -639,6 +649,23 @@ error:
        return ret;
 }
 
+/*
+ *  init_kernel_tracer
+ *
+ *  Setup necessary data for kernel tracer action.
+ */
+static void init_kernel_tracer(void)
+{
+       /* Set the global kernel tracer fd */
+       kernel_tracer_fd = open(DEFAULT_KERNEL_TRACER_PATH, O_RDWR);
+       if (kernel_tracer_fd < 0) {
+               WARN("No kernel tracer available");
+               kernel_tracer_fd = 0;
+       }
+
+       DBG("Kernel tracer fd %d", kernel_tracer_fd);
+}
+
 /*
  *     process_client_msg
  *
@@ -681,11 +708,13 @@ static int process_client_msg(struct command_ctx *cmd_ctx)
        case KERNEL_OPEN_METADATA:
        case KERNEL_START_TRACE:
        case KERNEL_STOP_TRACE:
-               /* TODO: reconnect to kernel tracer to check if
-                * it's loadded */
+               /* Kernel tracer check */
                if (kernel_tracer_fd == 0) {
-                       ret = LTTCOMM_KERN_NA;
-                       goto error;
+                       init_kernel_tracer();
+                       if (kernel_tracer_fd == 0) {
+                               ret = LTTCOMM_KERN_NA;
+                               goto error;
+                       }
                }
                break;
        }
@@ -763,6 +792,43 @@ static int process_client_msg(struct command_ctx *cmd_ctx)
                ret = LTTCOMM_OK;
                break;
        }
+       case KERNEL_ENABLE_ALL_EVENT:
+       {
+               int pos, size;
+               char *event_list, *event, *ptr;
+
+               /* Setup lttng message with no payload */
+               ret = setup_lttng_msg(cmd_ctx, 0);
+               if (ret < 0) {
+                       goto setup_error;
+               }
+
+               DBG("Enabling all kernel event");
+
+               size = kernel_list_events(kernel_tracer_fd, &event_list);
+               if (size < 0) {
+                       ret = LTTCOMM_KERN_LIST_FAIL;
+                       goto error;
+               }
+
+               ptr = event_list;
+               while ((size = sscanf(ptr, "event { name = %m[^;]; };%n\n", &event, &pos)) == 1) {
+                       /* Enable each single event */
+                       ret = kernel_enable_event(cmd_ctx->session->kernel_session, event);
+                       if (ret < 0) {
+                               ret = LTTCOMM_KERN_ENABLE_FAIL;
+                               goto error;
+                       }
+                       /* Move pointer to the next line */
+                       ptr += pos + 1;
+                       free(event);
+               }
+
+               free(event_list);
+
+               ret = LTTCOMM_OK;
+               break;
+       }
        case KERNEL_LIST_EVENTS:
        {
                char *event_list;
@@ -1132,6 +1198,8 @@ static void *thread_manage_clients(void *data)
                        continue;
                }
 
+               // TODO: Validate cmd_ctx including sanity check for security purpose.
+
                /*
                 * This function dispatch the work to the kernel or userspace tracer
                 * libs and fill the lttcomm_lttng_msg data structure of all the needed
@@ -1155,6 +1223,9 @@ static void *thread_manage_clients(void *data)
                }
 
                clean_command_ctx(cmd_ctx);
+
+               /* End of transmission */
+               close(sock);
        }
 
 error:
@@ -1411,31 +1482,18 @@ static int create_lttng_rundir(void)
 
        ret = mkdir(LTTNG_RUNDIR, S_IRWXU | S_IRWXG );
        if (ret < 0) {
-               ERR("Unable to create " LTTNG_RUNDIR);
-               goto error;
+               if (errno != EEXIST) {
+                       ERR("Unable to create " LTTNG_RUNDIR);
+                       goto error;
+               } else {
+                       ret = 0;
+               }
        }
 
 error:
        return ret;
 }
 
-/*
- *  init_kernel_tracer
- *
- *  Setup necessary data for kernel tracer action.
- */
-static void init_kernel_tracer(void)
-{
-       /* Set the global kernel tracer fd */
-       kernel_tracer_fd = open(DEFAULT_KERNEL_TRACER_PATH, O_RDWR);
-       if (kernel_tracer_fd < 0) {
-               WARN("No kernel tracer available");
-               kernel_tracer_fd = 0;
-       }
-
-       DBG("Kernel tracer fd %d", kernel_tracer_fd);
-}
-
 /*
  *  set_kconsumerd_sockets
  *
This page took 0.026076 seconds and 4 git commands to generate.