X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=ltt-sessiond%2Fmain.c;h=e7ad6f9b140e1c48f05f2befcda5d73fc1ce2803;hp=97db535d142b16f802e9e80c77a19ef094097d5a;hb=2e442863aa3cf0488f358461f3bfb87b2497d788;hpb=c49dc785799508e445e3e386c87f8151eef3c34c diff --git a/ltt-sessiond/main.c b/ltt-sessiond/main.c index 97db535d1..e7ad6f9b1 100644 --- a/ltt-sessiond/main.c +++ b/ltt-sessiond/main.c @@ -493,7 +493,7 @@ static pid_t spawn_kconsumerd(void) /* * Exec kconsumerd. */ - execlp("kconsumerd", "kconsumerd", "--quiet", NULL); + execlp("kconsumerd", "kconsumerd", "--verbose", NULL); if (errno != 0) { perror("kernel start consumer exec"); } @@ -561,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]; - - /* 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); + struct lttcomm_kconsumerd_msg lkm; - 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"); @@ -600,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; @@ -629,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"); @@ -643,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 * @@ -685,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; } @@ -767,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; @@ -1136,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 @@ -1159,6 +1223,9 @@ static void *thread_manage_clients(void *data) } clean_command_ctx(cmd_ctx); + + /* End of transmission */ + close(sock); } error: @@ -1427,23 +1494,6 @@ 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 *