X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Fcmd.c;h=64fa5c0bb5c1e870cd11d1f7e6cd3a69f2b7c6da;hb=31ea48462f529be003231ca0e14c5b882cd7d66e;hp=f55c772c147aafbcc2a3914d4a49746b848cdafc;hpb=1bfe73287bb3776cdba5a76d5a812ef79820bf10;p=lttng-tools.git diff --git a/src/bin/lttng-sessiond/cmd.c b/src/bin/lttng-sessiond/cmd.c index f55c772c1..64fa5c0bb 100644 --- a/src/bin/lttng-sessiond/cmd.c +++ b/src/bin/lttng-sessiond/cmd.c @@ -859,15 +859,6 @@ int cmd_enable_channel(struct ltt_session *session, rcu_read_lock(); - /* - * Don't try to enable a channel if the session has been started at - * some point in time before. The tracer does not allow it. - */ - if (session->started) { - ret = LTTNG_ERR_TRACE_ALREADY_STARTED; - goto error; - } - switch (domain->type) { case LTTNG_DOMAIN_KERNEL: { @@ -876,7 +867,19 @@ int cmd_enable_channel(struct ltt_session *session, kchan = trace_kernel_get_channel_by_name(attr->name, session->kernel_session); if (kchan == NULL) { + /* + * Don't try to create a channel if the session + * has been started at some point in time + * before. The tracer does not allow it. + */ + if (session->started) { + ret = LTTNG_ERR_TRACE_ALREADY_STARTED; + goto error; + } ret = channel_kernel_create(session->kernel_session, attr, wpipe); + if (attr->name[0] != '\0') { + session->kernel_session->has_non_default_channel = 1; + } } else { ret = channel_kernel_enable(session->kernel_session, kchan); } @@ -896,7 +899,19 @@ int cmd_enable_channel(struct ltt_session *session, uchan = trace_ust_find_channel_by_name(chan_ht, attr->name); if (uchan == NULL) { + /* + * Don't try to create a channel if the session + * has been started at some point in time + * before. The tracer does not allow it. + */ + if (session->started) { + ret = LTTNG_ERR_TRACE_ALREADY_STARTED; + goto error; + } ret = channel_ust_create(usess, attr, domain->buf_type); + if (attr->name[0] != '\0') { + usess->has_non_default_channel = 1; + } } else { ret = channel_ust_enable(usess, uchan); } @@ -931,6 +946,16 @@ int cmd_disable_event(struct ltt_session *session, int domain, ksess = session->kernel_session; + /* + * If a non-default channel has been created in the + * session, explicitely require that -c chan_name needs + * to be provided. + */ + if (ksess->has_non_default_channel && channel_name[0] == '\0') { + ret = LTTNG_ERR_NEED_CHANNEL_NAME; + goto error; + } + kchan = trace_kernel_get_channel_by_name(channel_name, ksess); if (kchan == NULL) { ret = LTTNG_ERR_KERN_CHAN_NOT_FOUND; @@ -952,6 +977,16 @@ int cmd_disable_event(struct ltt_session *session, int domain, usess = session->ust_session; + /* + * If a non-default channel has been created in the + * session, explicitely require that -c chan_name needs + * to be provided. + */ + if (usess->has_non_default_channel && channel_name[0] == '\0') { + ret = LTTNG_ERR_NEED_CHANNEL_NAME; + goto error; + } + uchan = trace_ust_find_channel_by_name(usess->domain_global.channels, channel_name); if (uchan == NULL) { @@ -1003,6 +1038,16 @@ int cmd_disable_event_all(struct ltt_session *session, int domain, ksess = session->kernel_session; + /* + * If a non-default channel has been created in the + * session, explicitely require that -c chan_name needs + * to be provided. + */ + if (ksess->has_non_default_channel && channel_name[0] == '\0') { + ret = LTTNG_ERR_NEED_CHANNEL_NAME; + goto error; + } + kchan = trace_kernel_get_channel_by_name(channel_name, ksess); if (kchan == NULL) { ret = LTTNG_ERR_KERN_CHAN_NOT_FOUND; @@ -1024,6 +1069,16 @@ int cmd_disable_event_all(struct ltt_session *session, int domain, usess = session->ust_session; + /* + * If a non-default channel has been created in the + * session, explicitely require that -c chan_name needs + * to be provided. + */ + if (usess->has_non_default_channel && channel_name[0] == '\0') { + ret = LTTNG_ERR_NEED_CHANNEL_NAME; + goto error; + } + uchan = trace_ust_find_channel_by_name(usess->domain_global.channels, channel_name); if (uchan == NULL) { @@ -1077,7 +1132,6 @@ int cmd_add_context(struct ltt_session *session, int domain, } chan_kern_created = 1; } - /* Add kernel context to kernel tracer */ ret = context_kernel_add(session->kernel_session, ctx, channel_name); if (ret != LTTNG_OK) { @@ -1087,10 +1141,11 @@ int cmd_add_context(struct ltt_session *session, int domain, case LTTNG_DOMAIN_UST: { struct ltt_ust_session *usess = session->ust_session; + unsigned int chan_count; + assert(usess); - unsigned int chan_count = - lttng_ht_get_count(usess->domain_global.channels); + chan_count = lttng_ht_get_count(usess->domain_global.channels); if (chan_count == 0) { struct lttng_channel *attr; /* Create default channel */ @@ -1173,6 +1228,17 @@ int cmd_enable_event(struct ltt_session *session, struct lttng_domain *domain, { struct ltt_kernel_channel *kchan; + /* + * If a non-default channel has been created in the + * session, explicitely require that -c chan_name needs + * to be provided. + */ + if (session->kernel_session->has_non_default_channel + && channel_name[0] == '\0') { + ret = LTTNG_ERR_NEED_CHANNEL_NAME; + goto error; + } + kchan = trace_kernel_get_channel_by_name(channel_name, session->kernel_session); if (kchan == NULL) { @@ -1222,6 +1288,16 @@ int cmd_enable_event(struct ltt_session *session, struct lttng_domain *domain, assert(usess); + /* + * If a non-default channel has been created in the + * session, explicitely require that -c chan_name needs + * to be provided. + */ + if (usess->has_non_default_channel && channel_name[0] == '\0') { + ret = LTTNG_ERR_NEED_CHANNEL_NAME; + goto error; + } + /* Get channel from global UST domain */ uchan = trace_ust_find_channel_by_name(usess->domain_global.channels, channel_name); @@ -1294,6 +1370,17 @@ int cmd_enable_event_all(struct ltt_session *session, assert(session->kernel_session); + /* + * If a non-default channel has been created in the + * session, explicitely require that -c chan_name needs + * to be provided. + */ + if (session->kernel_session->has_non_default_channel + && channel_name[0] == '\0') { + ret = LTTNG_ERR_NEED_CHANNEL_NAME; + goto error; + } + kchan = trace_kernel_get_channel_by_name(channel_name, session->kernel_session); if (kchan == NULL) { @@ -1358,6 +1445,16 @@ int cmd_enable_event_all(struct ltt_session *session, assert(usess); + /* + * If a non-default channel has been created in the + * session, explicitely require that -c chan_name needs + * to be provided. + */ + if (usess->has_non_default_channel && channel_name[0] == '\0') { + ret = LTTNG_ERR_NEED_CHANNEL_NAME; + goto error; + } + /* Get channel from global UST domain */ uchan = trace_ust_find_channel_by_name(usess->domain_global.channels, channel_name); @@ -2167,7 +2264,7 @@ void cmd_list_lttng_sessions(struct lttng_session *sessions, uid_t uid, /* * Command LTTNG_DATA_PENDING returning 0 if the data is NOT pending meaning - * ready for trace analysis (or anykind of reader) or else 1 for pending data. + * ready for trace analysis (or any kind of reader) or else 1 for pending data. */ int cmd_data_pending(struct ltt_session *session) { @@ -2223,8 +2320,8 @@ int cmd_snapshot_add_output(struct ltt_session *session, DBG("Cmd snapshot add output for session %s", session->name); /* - * Persmission denied to create an output if the session is not set in no - * output mode. + * Permission denied to create an output if the session is not + * set in no output mode. */ if (session->output_traces) { ret = LTTNG_ERR_EPERM; @@ -2287,8 +2384,8 @@ int cmd_snapshot_del_output(struct ltt_session *session, rcu_read_lock(); /* - * Persmission denied to create an output if the session is not set in no - * output mode. + * Permission denied to create an output if the session is not + * set in no output mode. */ if (session->output_traces) { ret = LTTNG_ERR_EPERM; @@ -2339,8 +2436,8 @@ ssize_t cmd_snapshot_list_outputs(struct ltt_session *session, DBG("Cmd snapshot list outputs for session %s", session->name); /* - * Persmission denied to create an output if the session is not set in no - * output mode. + * Permission denied to create an output if the session is not + * set in no output mode. */ if (session->output_traces) { ret = LTTNG_ERR_EPERM; @@ -2401,12 +2498,12 @@ error: * Send relayd sockets from snapshot output to consumer. Ignore request if the * snapshot output is *not* set with a remote destination. * - * Return 0 on success or else a negative value. + * Return 0 on success or a LTTNG_ERR code. */ static int set_relayd_for_snapshot(struct consumer_output *consumer, struct snapshot_output *snap_output, struct ltt_session *session) { - int ret = 0; + int ret = LTTNG_OK; struct lttng_ht_iter iter; struct consumer_socket *socket; @@ -2430,7 +2527,7 @@ static int set_relayd_for_snapshot(struct consumer_output *consumer, socket, node.node) { ret = send_consumer_relayd_sockets(0, session->id, snap_output->consumer, socket); - if (ret < 0) { + if (ret != LTTNG_OK) { rcu_read_unlock(); goto error; } @@ -2444,7 +2541,7 @@ error: /* * Record a kernel snapshot. * - * Return 0 on success or else a negative value. + * Return 0 on success or a LTTNG_ERR code. */ static int record_kernel_snapshot(struct ltt_kernel_session *ksess, struct snapshot_output *output, struct ltt_session *session, @@ -2460,7 +2557,7 @@ static int record_kernel_snapshot(struct ltt_kernel_session *ksess, ret = utils_get_current_time_str("%Y%m%d-%H%M%S", output->datetime, sizeof(output->datetime)); if (!ret) { - ret = -EINVAL; + ret = LTTNG_ERR_INVALID; goto error; } @@ -2470,23 +2567,28 @@ static int record_kernel_snapshot(struct ltt_kernel_session *ksess, */ ret = consumer_copy_sockets(output->consumer, ksess->consumer); if (ret < 0) { + ret = LTTNG_ERR_NOMEM; goto error; } ret = set_relayd_for_snapshot(ksess->consumer, output, session); - if (ret < 0) { + if (ret != LTTNG_OK) { goto error_snapshot; } ret = kernel_snapshot_record(ksess, output, wait, nb_streams); if (ret < 0) { - ret = -LTTNG_ERR_SNAPSHOT_FAIL; if (ret == -EINVAL) { - ret = -LTTNG_ERR_INVALID; + ret = LTTNG_ERR_INVALID; + goto error_snapshot; } + + ret = LTTNG_ERR_SNAPSHOT_FAIL; goto error_snapshot; } + ret = LTTNG_OK; + error_snapshot: /* Clean up copied sockets so this output can use some other later on. */ consumer_destroy_output_sockets(output->consumer); @@ -2497,7 +2599,7 @@ error: /* * Record a UST snapshot. * - * Return 0 on success or else a negative value. + * Return 0 on success or a LTTNG_ERR error code. */ static int record_ust_snapshot(struct ltt_ust_session *usess, struct snapshot_output *output, struct ltt_session *session, @@ -2513,33 +2615,38 @@ static int record_ust_snapshot(struct ltt_ust_session *usess, ret = utils_get_current_time_str("%Y%m%d-%H%M%S", output->datetime, sizeof(output->datetime)); if (!ret) { - ret = -EINVAL; + ret = LTTNG_ERR_INVALID; goto error; } /* - * Copy kernel session sockets so we can communicate with the right + * Copy UST session sockets so we can communicate with the right * consumer for the snapshot record command. */ ret = consumer_copy_sockets(output->consumer, usess->consumer); if (ret < 0) { + ret = LTTNG_ERR_NOMEM; goto error; } ret = set_relayd_for_snapshot(usess->consumer, output, session); - if (ret < 0) { + if (ret != LTTNG_OK) { goto error_snapshot; } ret = ust_app_snapshot_record(usess, output, wait, nb_streams); if (ret < 0) { - ret = -LTTNG_ERR_SNAPSHOT_FAIL; if (ret == -EINVAL) { - ret = -LTTNG_ERR_INVALID; + ret = LTTNG_ERR_INVALID; + goto error_snapshot; } + + ret = LTTNG_ERR_SNAPSHOT_FAIL; goto error_snapshot; } + ret = LTTNG_OK; + error_snapshot: /* Clean up copied sockets so this output can use some other later on. */ consumer_destroy_output_sockets(output->consumer); @@ -2591,8 +2698,8 @@ int cmd_snapshot_record(struct ltt_session *session, DBG("Cmd snapshot record for session %s", session->name); /* - * Persmission denied to create an output if the session is not set in no - * output mode. + * Permission denied to create an output if the session is not + * set in no output mode. */ if (session->output_traces) { ret = LTTNG_ERR_EPERM; @@ -2635,7 +2742,7 @@ int cmd_snapshot_record(struct ltt_session *session, if (use_tmp_output) { ret = record_kernel_snapshot(ksess, &tmp_output, session, wait, nb_streams); - if (ret < 0) { + if (ret != LTTNG_OK) { goto error; } snapshot_success = 1; @@ -2668,7 +2775,7 @@ int cmd_snapshot_record(struct ltt_session *session, ret = record_kernel_snapshot(ksess, &tmp_output, session, wait, nb_streams); - if (ret < 0) { + if (ret != LTTNG_OK) { rcu_read_unlock(); goto error; } @@ -2684,7 +2791,7 @@ int cmd_snapshot_record(struct ltt_session *session, if (use_tmp_output) { ret = record_ust_snapshot(usess, &tmp_output, session, wait, nb_streams); - if (ret < 0) { + if (ret != LTTNG_OK) { goto error; } snapshot_success = 1; @@ -2702,8 +2809,6 @@ int cmd_snapshot_record(struct ltt_session *session, memset(&tmp_output, 0, sizeof(tmp_output)); memcpy(&tmp_output, sout, sizeof(tmp_output)); - fprintf(stderr, "Name: %s\n", output->name); - /* Use temporary max size. */ if (output->max_size != (uint64_t) -1ULL) { tmp_output.max_size = output->max_size; @@ -2719,7 +2824,7 @@ int cmd_snapshot_record(struct ltt_session *session, ret = record_ust_snapshot(usess, &tmp_output, session, wait, nb_streams); - if (ret < 0) { + if (ret != LTTNG_OK) { rcu_read_unlock(); goto error; }