X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=ltt-sessiond%2Fmain.c;h=6385366047c53d785d8a080a5a67433046063477;hb=6f12d706aa950ade47085a2dadd0791d1e3fffb7;hp=4fba6a2cf53a701054601e88df4478f35b658342;hpb=d36b858358a8ef4e00de843379d670925f9c23b6;p=lttng-tools.git diff --git a/ltt-sessiond/main.c b/ltt-sessiond/main.c index 4fba6a2cf..638536604 100644 --- a/ltt-sessiond/main.c +++ b/ltt-sessiond/main.c @@ -803,6 +803,7 @@ static int process_client_msg(struct command_ctx *cmd_ctx) * Check kernel command for kernel session. */ switch (cmd_ctx->lsm->cmd_type) { + case LTTNG_KERNEL_ADD_CONTEXT: case LTTNG_KERNEL_CREATE_CHANNEL: case LTTNG_KERNEL_DISABLE_ALL_EVENT: case LTTNG_KERNEL_DISABLE_CHANNEL: @@ -852,6 +853,84 @@ static int process_client_msg(struct command_ctx *cmd_ctx) /* Process by command type */ switch (cmd_ctx->lsm->cmd_type) { + case LTTNG_KERNEL_ADD_CONTEXT: + { + int found = 0, no_event = 0; + struct ltt_kernel_channel *chan; + struct ltt_kernel_event *event; + + /* Setup lttng message with no payload */ + ret = setup_lttng_msg(cmd_ctx, 0); + if (ret < 0) { + goto setup_error; + } + + /* Check if event name is given */ + if (strlen(cmd_ctx->lsm->u.context.event_name) == 0) { + no_event = 1; + } + + if (strlen(cmd_ctx->lsm->u.context.channel_name) == 0) { + /* Go over all channels */ + DBG("Adding context to all channels"); + cds_list_for_each_entry(chan, + &cmd_ctx->session->kernel_session->channel_list.head, list) { + if (no_event) { + ret = kernel_add_channel_context(chan, + &cmd_ctx->lsm->u.context.ctx); + if (ret < 0) { + continue; + } + } else { + event = get_kernel_event_by_name(cmd_ctx->lsm->u.context.event_name, chan); + if (event != NULL) { + ret = kernel_add_event_context(event, + &cmd_ctx->lsm->u.context.ctx); + if (ret < 0) { + ret = LTTCOMM_KERN_CONTEXT_FAIL; + goto error; + } + found = 1; + break; + } + } + } + } else { + chan = get_kernel_channel_by_name(cmd_ctx->lsm->u.context.channel_name, + cmd_ctx->session->kernel_session); + if (chan == NULL) { + ret = LTTCOMM_KERN_CHAN_NOT_FOUND; + goto error; + } + + if (no_event) { + ret = kernel_add_channel_context(chan, + &cmd_ctx->lsm->u.context.ctx); + if (ret < 0) { + ret = LTTCOMM_KERN_CONTEXT_FAIL; + goto error; + } + } else { + event = get_kernel_event_by_name(cmd_ctx->lsm->u.context.event_name, chan); + if (event != NULL) { + ret = kernel_add_event_context(event, + &cmd_ctx->lsm->u.context.ctx); + if (ret < 0) { + ret = LTTCOMM_KERN_CONTEXT_FAIL; + goto error; + } + } + } + } + + if (!found && !no_event) { + ret = LTTCOMM_NO_EVENT; + goto error; + } + + ret = LTTCOMM_OK; + break; + } case LTTNG_KERNEL_CREATE_CHANNEL: { /* Setup lttng message with no payload */ @@ -873,6 +952,35 @@ static int process_client_msg(struct command_ctx *cmd_ctx) ret = LTTCOMM_OK; break; } + case LTTNG_KERNEL_DISABLE_CHANNEL: + { + struct ltt_kernel_channel *chan; + + /* Setup lttng message with no payload */ + ret = setup_lttng_msg(cmd_ctx, 0); + if (ret < 0) { + goto setup_error; + } + + chan = get_kernel_channel_by_name(cmd_ctx->lsm->u.disable.channel_name, + cmd_ctx->session->kernel_session); + if (chan == NULL) { + ret = LTTCOMM_KERN_CHAN_NOT_FOUND; + goto error; + } else if (chan->enabled == 1) { + ret = kernel_disable_channel(chan); + if (ret < 0) { + if (ret != EEXIST) { + ret = LTTCOMM_KERN_CHAN_DISABLE_FAIL; + } + goto error; + } + } + + kernel_wait_quiescent(kernel_tracer_fd); + ret = LTTCOMM_OK; + break; + } case LTTNG_KERNEL_DISABLE_EVENT: { struct ltt_kernel_channel *chan; @@ -1058,7 +1166,6 @@ static int process_client_msg(struct command_ctx *cmd_ctx) ret = kernel_create_event(&ev_attr, chan); if (ret < 0) { /* Ignore error here and continue */ - continue; } }