X-Git-Url: http://git.efficios.com/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Fcmd.c;h=46a758e27eab8f9b01c502256bde42a60b32702d;hp=d36966322fc7278617109b9df471bda8196ea5cc;hb=35df275583d85652cb5132adb9416e32175524e7;hpb=2f77fc4b3720dc8f75847130498c2d4aad7c03ec diff --git a/src/bin/lttng-sessiond/cmd.c b/src/bin/lttng-sessiond/cmd.c index d36966322..46a758e27 100644 --- a/src/bin/lttng-sessiond/cmd.c +++ b/src/bin/lttng-sessiond/cmd.c @@ -188,7 +188,7 @@ static int list_lttng_ust_global_events(char *channel_name, lttng_ht_lookup(ust_global->channels, (void *)channel_name, &iter); node = lttng_ht_iter_get_node_str(&iter); if (node == NULL) { - ret = -LTTCOMM_UST_CHAN_NOT_FOUND; + ret = LTTNG_ERR_UST_CHAN_NOT_FOUND; goto error; } @@ -205,7 +205,7 @@ static int list_lttng_ust_global_events(char *channel_name, tmp = zmalloc(nb_event * sizeof(struct lttng_event)); if (tmp == NULL) { - ret = -LTTCOMM_FATAL; + ret = LTTNG_ERR_FATAL; goto error; } @@ -265,7 +265,7 @@ static int list_lttng_kernel_events(char *channel_name, kchan = trace_kernel_get_channel_by_name(channel_name, kernel_session); if (kchan == NULL) { - ret = LTTCOMM_KERN_CHAN_NOT_FOUND; + ret = LTTNG_ERR_KERN_CHAN_NOT_FOUND; goto error; } @@ -274,13 +274,12 @@ static int list_lttng_kernel_events(char *channel_name, DBG("Listing events for channel %s", kchan->channel->name); if (nb_event == 0) { - ret = nb_event; - goto error; + goto end; } *events = zmalloc(nb_event * sizeof(struct lttng_event)); if (*events == NULL) { - ret = LTTCOMM_FATAL; + ret = LTTNG_ERR_FATAL; goto error; } @@ -318,10 +317,12 @@ static int list_lttng_kernel_events(char *channel_name, i++; } +end: return nb_event; error: - return ret; + /* Negate the error code to differentiate the size from an error */ + return -ret; } /* @@ -331,14 +332,14 @@ error: static int add_uri_to_consumer(struct consumer_output *consumer, struct lttng_uri *uri, int domain, const char *session_name) { - int ret = LTTCOMM_OK; + int ret = LTTNG_OK; const char *default_trace_dir; assert(uri); if (consumer == NULL) { DBG("No consumer detected. Don't add URI. Stopping."); - ret = LTTCOMM_NO_CONSUMER; + ret = LTTNG_ERR_NO_CONSUMER; goto error; } @@ -365,7 +366,7 @@ static int add_uri_to_consumer(struct consumer_output *consumer, /* Set URI into consumer output object */ ret = consumer_set_network_uri(consumer, uri); if (ret < 0) { - ret = LTTCOMM_FATAL; + ret = LTTNG_ERR_FATAL; goto error; } else if (ret == 1) { /* @@ -378,14 +379,15 @@ static int add_uri_to_consumer(struct consumer_output *consumer, if (uri->stype == LTTNG_STREAM_CONTROL && strlen(uri->subdir) == 0) { ret = consumer_set_subdir(consumer, session_name); if (ret < 0) { - ret = LTTCOMM_FATAL; + ret = LTTNG_ERR_FATAL; goto error; } } if (uri->stype == LTTNG_STREAM_CONTROL) { /* On a new subdir, reappend the default trace dir. */ - strncat(consumer->subdir, default_trace_dir, sizeof(consumer->subdir)); + strncat(consumer->subdir, default_trace_dir, + sizeof(consumer->subdir) - strlen(consumer->subdir) - 1); DBG3("Append domain trace name to subdir %s", consumer->subdir); } @@ -398,7 +400,8 @@ static int add_uri_to_consumer(struct consumer_output *consumer, sizeof(consumer->dst.trace_path)); /* Append default trace dir */ strncat(consumer->dst.trace_path, default_trace_dir, - sizeof(consumer->dst.trace_path)); + sizeof(consumer->dst.trace_path) - + strlen(consumer->dst.trace_path) - 1); /* Flag consumer as local. */ consumer->type = CONSUMER_DST_LOCAL; break; @@ -429,7 +432,7 @@ static int init_kernel_tracing(struct ltt_kernel_session *session) ret = kernel_consumer_send_session(socket->fd, session); pthread_mutex_unlock(socket->lock); if (ret < 0) { - ret = LTTCOMM_KERN_CONSUMER_FAIL; + ret = LTTNG_ERR_KERN_CONSUMER_FAIL; goto error; } } @@ -455,13 +458,13 @@ static int create_connect_relayd(struct consumer_output *output, /* Create socket object from URI */ sock = lttcomm_alloc_sock_from_uri(uri); if (sock == NULL) { - ret = LTTCOMM_FATAL; + ret = LTTNG_ERR_FATAL; goto error; } ret = lttcomm_create_sock(sock); if (ret < 0) { - ret = LTTCOMM_FATAL; + ret = LTTNG_ERR_FATAL; goto error; } @@ -469,7 +472,7 @@ static int create_connect_relayd(struct consumer_output *output, ret = relayd_connect(sock); if (ret < 0) { ERR("Unable to reach lttng-relayd"); - ret = LTTCOMM_RELAYD_SESSION_FAIL; + ret = LTTNG_ERR_RELAYD_CONNECT_FAIL; goto free_sock; } @@ -481,7 +484,7 @@ static int create_connect_relayd(struct consumer_output *output, ret = relayd_version_check(sock, RELAYD_VERSION_COMM_MAJOR, RELAYD_VERSION_COMM_MINOR); if (ret < 0) { - ret = LTTCOMM_RELAYD_VERSION_FAIL; + ret = LTTNG_ERR_RELAYD_VERSION_FAIL; goto close_sock; } } else if (uri->stype == LTTNG_STREAM_DATA) { @@ -489,13 +492,13 @@ static int create_connect_relayd(struct consumer_output *output, } else { /* Command is not valid */ ERR("Relayd invalid stream type: %d", uri->stype); - ret = LTTCOMM_INVALID; + ret = LTTNG_ERR_INVALID; goto close_sock; } *relayd_sock = sock; - return LTTCOMM_OK; + return LTTNG_OK; close_sock: if (sock) { @@ -533,7 +536,7 @@ static int send_consumer_relayd_socket(int domain, struct ltt_session *session, /* Connect to relayd and make version check if uri is the control. */ ret = create_connect_relayd(consumer, session->name, relayd_uri, &sock); - if (ret != LTTCOMM_OK) { + if (ret != LTTNG_OK) { goto close_sock; } @@ -546,11 +549,18 @@ static int send_consumer_relayd_socket(int domain, struct ltt_session *session, ret = consumer_send_relayd_socket(consumer_fd, sock, consumer, relayd_uri->stype); if (ret < 0) { - ret = LTTCOMM_ENABLE_CONSUMER_FAIL; + ret = LTTNG_ERR_ENABLE_CONSUMER_FAIL; goto close_sock; } - ret = LTTCOMM_OK; + /* Flag that the corresponding socket was sent. */ + if (relayd_uri->stype == LTTNG_STREAM_CONTROL) { + consumer->dst.net.control_sock_sent = 1; + } else if (relayd_uri->stype == LTTNG_STREAM_DATA) { + consumer->dst.net.data_sock_sent = 1; + } + + ret = LTTNG_OK; /* * Close socket which was dup on the consumer side. The session daemon does @@ -574,34 +584,29 @@ close_sock: static int send_consumer_relayd_sockets(int domain, struct ltt_session *session, struct consumer_output *consumer, int fd) { - int ret; + int ret = LTTNG_OK; assert(session); assert(consumer); - /* Don't resend the sockets to the consumer. */ - if (consumer->dst.net.relayd_socks_sent) { - ret = LTTCOMM_OK; - goto error; - } - /* Sending control relayd socket. */ - ret = send_consumer_relayd_socket(domain, session, - &consumer->dst.net.control, consumer, fd); - if (ret != LTTCOMM_OK) { - goto error; + if (!consumer->dst.net.control_sock_sent) { + ret = send_consumer_relayd_socket(domain, session, + &consumer->dst.net.control, consumer, fd); + if (ret != LTTNG_OK) { + goto error; + } } /* Sending data relayd socket. */ - ret = send_consumer_relayd_socket(domain, session, - &consumer->dst.net.data, consumer, fd); - if (ret != LTTCOMM_OK) { - goto error; + if (!consumer->dst.net.data_sock_sent) { + ret = send_consumer_relayd_socket(domain, session, + &consumer->dst.net.data, consumer, fd); + if (ret != LTTNG_OK) { + goto error; + } } - /* Flag that all relayd sockets were sent to the consumer. */ - consumer->dst.net.relayd_socks_sent = 1; - error: return ret; } @@ -613,7 +618,7 @@ error: */ static int setup_relayd(struct ltt_session *session) { - int ret = LTTCOMM_OK; + int ret = LTTNG_OK; struct ltt_ust_session *usess; struct ltt_kernel_session *ksess; struct consumer_socket *socket; @@ -635,10 +640,10 @@ static int setup_relayd(struct ltt_session *session) assert(socket->fd >= 0); pthread_mutex_lock(socket->lock); - send_consumer_relayd_sockets(LTTNG_DOMAIN_UST, session, + ret = send_consumer_relayd_sockets(LTTNG_DOMAIN_UST, session, usess->consumer, socket->fd); pthread_mutex_unlock(socket->lock); - if (ret != LTTCOMM_OK) { + if (ret != LTTNG_OK) { goto error; } } @@ -652,10 +657,10 @@ static int setup_relayd(struct ltt_session *session) assert(socket->fd >= 0); pthread_mutex_lock(socket->lock); - send_consumer_relayd_sockets(LTTNG_DOMAIN_KERNEL, session, + ret = send_consumer_relayd_sockets(LTTNG_DOMAIN_KERNEL, session, ksess->consumer, socket->fd); pthread_mutex_unlock(socket->lock); - if (ret != LTTCOMM_OK) { + if (ret != LTTNG_OK) { goto error; } } @@ -681,7 +686,7 @@ int cmd_disable_channel(struct ltt_session *session, int domain, { ret = channel_kernel_disable(session->kernel_session, channel_name); - if (ret != LTTCOMM_OK) { + if (ret != LTTNG_OK) { goto error; } @@ -697,12 +702,12 @@ int cmd_disable_channel(struct ltt_session *session, int domain, uchan = trace_ust_find_channel_by_name(chan_ht, channel_name); if (uchan == NULL) { - ret = LTTCOMM_UST_CHAN_NOT_FOUND; + ret = LTTNG_ERR_UST_CHAN_NOT_FOUND; goto error; } ret = channel_ust_disable(usess, domain, uchan); - if (ret != LTTCOMM_OK) { + if (ret != LTTNG_OK) { goto error; } break; @@ -713,11 +718,11 @@ int cmd_disable_channel(struct ltt_session *session, int domain, case LTTNG_DOMAIN_UST_PID: #endif default: - ret = LTTCOMM_UNKNOWN_DOMAIN; + ret = LTTNG_ERR_UNKNOWN_DOMAIN; goto error; } - ret = LTTCOMM_OK; + ret = LTTNG_OK; error: return ret; @@ -756,7 +761,7 @@ int cmd_enable_channel(struct ltt_session *session, ret = channel_kernel_enable(session->kernel_session, kchan); } - if (ret != LTTCOMM_OK) { + if (ret != LTTNG_OK) { goto error; } @@ -783,7 +788,7 @@ int cmd_enable_channel(struct ltt_session *session, case LTTNG_DOMAIN_UST_PID: #endif default: - ret = LTTCOMM_UNKNOWN_DOMAIN; + ret = LTTNG_ERR_UNKNOWN_DOMAIN; goto error; } @@ -810,12 +815,12 @@ int cmd_disable_event(struct ltt_session *session, int domain, kchan = trace_kernel_get_channel_by_name(channel_name, ksess); if (kchan == NULL) { - ret = LTTCOMM_KERN_CHAN_NOT_FOUND; + ret = LTTNG_ERR_KERN_CHAN_NOT_FOUND; goto error; } ret = event_kernel_disable_tracepoint(ksess, kchan, event_name); - if (ret != LTTCOMM_OK) { + if (ret != LTTNG_OK) { goto error; } @@ -832,12 +837,12 @@ int cmd_disable_event(struct ltt_session *session, int domain, uchan = trace_ust_find_channel_by_name(usess->domain_global.channels, channel_name); if (uchan == NULL) { - ret = LTTCOMM_UST_CHAN_NOT_FOUND; + ret = LTTNG_ERR_UST_CHAN_NOT_FOUND; goto error; } ret = event_ust_disable_tracepoint(usess, domain, uchan, event_name); - if (ret != LTTCOMM_OK) { + if (ret != LTTNG_OK) { goto error; } @@ -851,11 +856,11 @@ int cmd_disable_event(struct ltt_session *session, int domain, case LTTNG_DOMAIN_UST_PID_FOLLOW_CHILDREN: #endif default: - ret = LTTCOMM_UND; + ret = LTTNG_ERR_UND; goto error; } - ret = LTTCOMM_OK; + ret = LTTNG_OK; error: return ret; @@ -879,12 +884,12 @@ int cmd_disable_event_all(struct ltt_session *session, int domain, kchan = trace_kernel_get_channel_by_name(channel_name, ksess); if (kchan == NULL) { - ret = LTTCOMM_KERN_CHAN_NOT_FOUND; + ret = LTTNG_ERR_KERN_CHAN_NOT_FOUND; goto error; } ret = event_kernel_disable_all(ksess, kchan); - if (ret != LTTCOMM_OK) { + if (ret != LTTNG_OK) { goto error; } @@ -901,7 +906,7 @@ int cmd_disable_event_all(struct ltt_session *session, int domain, uchan = trace_ust_find_channel_by_name(usess->domain_global.channels, channel_name); if (uchan == NULL) { - ret = LTTCOMM_UST_CHAN_NOT_FOUND; + ret = LTTNG_ERR_UST_CHAN_NOT_FOUND; goto error; } @@ -920,11 +925,11 @@ int cmd_disable_event_all(struct ltt_session *session, int domain, case LTTNG_DOMAIN_UST_PID_FOLLOW_CHILDREN: #endif default: - ret = LTTCOMM_UND; + ret = LTTNG_ERR_UND; goto error; } - ret = LTTCOMM_OK; + ret = LTTNG_OK; error: return ret; @@ -934,27 +939,57 @@ error: * Command LTTNG_ADD_CONTEXT processed by the client thread. */ int cmd_add_context(struct ltt_session *session, int domain, - char *channel_name, char *event_name, struct lttng_event_context *ctx) + char *channel_name, char *event_name, struct lttng_event_context *ctx, + int kwpipe) { int ret; switch (domain) { case LTTNG_DOMAIN_KERNEL: + assert(session->kernel_session); + + if (session->kernel_session->channel_count == 0) { + /* Create default channel */ + ret = channel_kernel_create(session->kernel_session, NULL, kwpipe); + if (ret != LTTNG_OK) { + goto error; + } + } + /* Add kernel context to kernel tracer */ ret = context_kernel_add(session->kernel_session, ctx, event_name, channel_name); - if (ret != LTTCOMM_OK) { + if (ret != LTTNG_OK) { goto error; } break; case LTTNG_DOMAIN_UST: { struct ltt_ust_session *usess = session->ust_session; - assert(usess); + unsigned int chan_count = + lttng_ht_get_count(usess->domain_global.channels); + if (chan_count == 0) { + struct lttng_channel *attr; + /* Create default channel */ + attr = channel_new_default_attr(domain); + if (attr == NULL) { + ret = LTTNG_ERR_FATAL; + goto error; + } + + ret = channel_ust_create(usess, domain, attr); + if (ret != LTTNG_OK) { + free(attr); + goto error; + } + free(attr); + } + + ret = context_ust_add(usess, domain, ctx, event_name, channel_name); - if (ret != LTTCOMM_OK) { + if (ret != LTTNG_OK) { goto error; } break; @@ -965,11 +1000,11 @@ int cmd_add_context(struct ltt_session *session, int domain, case LTTNG_DOMAIN_UST_PID_FOLLOW_CHILDREN: #endif default: - ret = LTTCOMM_UND; + ret = LTTNG_ERR_UND; goto error; } - ret = LTTCOMM_OK; + ret = LTTNG_OK; error: return ret; @@ -986,14 +1021,14 @@ int cmd_set_filter(struct ltt_session *session, int domain, switch (domain) { case LTTNG_DOMAIN_KERNEL: - ret = LTTCOMM_FATAL; + ret = LTTNG_ERR_FATAL; break; case LTTNG_DOMAIN_UST: { struct ltt_ust_session *usess = session->ust_session; ret = filter_ust_set(usess, domain, bytecode, event_name, channel_name); - if (ret != LTTCOMM_OK) { + if (ret != LTTNG_OK) { goto error; } break; @@ -1004,11 +1039,11 @@ int cmd_set_filter(struct ltt_session *session, int domain, case LTTNG_DOMAIN_UST_PID_FOLLOW_CHILDREN: #endif default: - ret = LTTCOMM_UND; + ret = LTTNG_ERR_UND; goto error; } - ret = LTTCOMM_OK; + ret = LTTNG_OK; error: return ret; @@ -1039,13 +1074,13 @@ int cmd_enable_event(struct ltt_session *session, int domain, if (kchan == NULL) { attr = channel_new_default_attr(domain); if (attr == NULL) { - ret = LTTCOMM_FATAL; + ret = LTTNG_ERR_FATAL; goto error; } strncpy(attr->name, channel_name, sizeof(attr->name)); ret = cmd_enable_channel(session, domain, attr, wpipe); - if (ret != LTTCOMM_OK) { + if (ret != LTTNG_OK) { free(attr); goto error; } @@ -1057,13 +1092,13 @@ int cmd_enable_event(struct ltt_session *session, int domain, session->kernel_session); if (kchan == NULL) { /* This sould not happen... */ - ret = LTTCOMM_FATAL; + ret = LTTNG_ERR_FATAL; goto error; } ret = event_kernel_enable_tracepoint(session->kernel_session, kchan, event); - if (ret != LTTCOMM_OK) { + if (ret != LTTNG_OK) { goto error; } @@ -1084,13 +1119,13 @@ int cmd_enable_event(struct ltt_session *session, int domain, /* Create default channel */ attr = channel_new_default_attr(domain); if (attr == NULL) { - ret = LTTCOMM_FATAL; + ret = LTTNG_ERR_FATAL; goto error; } strncpy(attr->name, channel_name, sizeof(attr->name)); ret = cmd_enable_channel(session, domain, attr, wpipe); - if (ret != LTTCOMM_OK) { + if (ret != LTTNG_OK) { free(attr); goto error; } @@ -1104,7 +1139,7 @@ int cmd_enable_event(struct ltt_session *session, int domain, /* At this point, the session and channel exist on the tracer */ ret = event_ust_enable_tracepoint(usess, domain, uchan, event); - if (ret != LTTCOMM_OK) { + if (ret != LTTNG_OK) { goto error; } break; @@ -1115,11 +1150,11 @@ int cmd_enable_event(struct ltt_session *session, int domain, case LTTNG_DOMAIN_UST_PID_FOLLOW_CHILDREN: #endif default: - ret = LTTCOMM_UND; + ret = LTTNG_ERR_UND; goto error; } - ret = LTTCOMM_OK; + ret = LTTNG_OK; error: return ret; @@ -1150,13 +1185,13 @@ int cmd_enable_event_all(struct ltt_session *session, int domain, /* Create default channel */ attr = channel_new_default_attr(domain); if (attr == NULL) { - ret = LTTCOMM_FATAL; + ret = LTTNG_ERR_FATAL; goto error; } strncpy(attr->name, channel_name, sizeof(attr->name)); ret = cmd_enable_channel(session, domain, attr, wpipe); - if (ret != LTTCOMM_OK) { + if (ret != LTTNG_OK) { free(attr); goto error; } @@ -1187,12 +1222,12 @@ int cmd_enable_event_all(struct ltt_session *session, int domain, kchan, kernel_tracer_fd); break; default: - ret = LTTCOMM_KERN_ENABLE_FAIL; + ret = LTTNG_ERR_KERN_ENABLE_FAIL; goto error; } /* Manage return value */ - if (ret != LTTCOMM_OK) { + if (ret != LTTNG_OK) { goto error; } @@ -1213,13 +1248,13 @@ int cmd_enable_event_all(struct ltt_session *session, int domain, /* Create default channel */ attr = channel_new_default_attr(domain); if (attr == NULL) { - ret = LTTCOMM_FATAL; + ret = LTTNG_ERR_FATAL; goto error; } strncpy(attr->name, channel_name, sizeof(attr->name)); ret = cmd_enable_channel(session, domain, attr, wpipe); - if (ret != LTTCOMM_OK) { + if (ret != LTTNG_OK) { free(attr); goto error; } @@ -1237,17 +1272,17 @@ int cmd_enable_event_all(struct ltt_session *session, int domain, case LTTNG_EVENT_ALL: case LTTNG_EVENT_TRACEPOINT: ret = event_ust_enable_all_tracepoints(usess, domain, uchan); - if (ret != LTTCOMM_OK) { + if (ret != LTTNG_OK) { goto error; } break; default: - ret = LTTCOMM_UST_ENABLE_FAIL; + ret = LTTNG_ERR_UST_ENABLE_FAIL; goto error; } /* Manage return value */ - if (ret != LTTCOMM_OK) { + if (ret != LTTNG_OK) { goto error; } @@ -1259,11 +1294,11 @@ int cmd_enable_event_all(struct ltt_session *session, int domain, case LTTNG_DOMAIN_UST_PID_FOLLOW_CHILDREN: #endif default: - ret = LTTCOMM_UND; + ret = LTTNG_ERR_UND; goto error; } - ret = LTTCOMM_OK; + ret = LTTNG_OK; error: return ret; @@ -1282,19 +1317,19 @@ ssize_t cmd_list_tracepoints(int domain, struct lttng_event **events) case LTTNG_DOMAIN_KERNEL: nb_events = kernel_list_events(kernel_tracer_fd, events); if (nb_events < 0) { - ret = LTTCOMM_KERN_LIST_FAIL; + ret = LTTNG_ERR_KERN_LIST_FAIL; goto error; } break; case LTTNG_DOMAIN_UST: nb_events = ust_app_list_events(events); if (nb_events < 0) { - ret = LTTCOMM_UST_LIST_FAIL; + ret = LTTNG_ERR_UST_LIST_FAIL; goto error; } break; default: - ret = LTTCOMM_UND; + ret = LTTNG_ERR_UND; goto error; } @@ -1318,13 +1353,13 @@ ssize_t cmd_list_tracepoint_fields(int domain, case LTTNG_DOMAIN_UST: nb_fields = ust_app_list_event_fields(fields); if (nb_fields < 0) { - ret = LTTCOMM_UST_LIST_FAIL; + ret = LTTNG_ERR_UST_LIST_FAIL; goto error; } break; case LTTNG_DOMAIN_KERNEL: default: /* fall-through */ - ret = LTTCOMM_UND; + ret = LTTNG_ERR_UND; goto error; } @@ -1353,14 +1388,14 @@ int cmd_start_trace(struct ltt_session *session) if (session->enabled) { /* Already started. */ - ret = LTTCOMM_TRACE_ALREADY_STARTED; + ret = LTTNG_ERR_TRACE_ALREADY_STARTED; goto error; } session->enabled = 1; ret = setup_relayd(session); - if (ret != LTTCOMM_OK) { + if (ret != LTTNG_OK) { ERR("Error setting up relayd for session %s", session->name); goto error; } @@ -1371,7 +1406,7 @@ int cmd_start_trace(struct ltt_session *session) if (ksession->metadata == NULL) { ret = kernel_open_metadata(ksession); if (ret < 0) { - ret = LTTCOMM_KERN_META_FAIL; + ret = LTTNG_ERR_KERN_META_FAIL; goto error; } } @@ -1381,7 +1416,7 @@ int cmd_start_trace(struct ltt_session *session) ret = kernel_open_metadata_stream(ksession); if (ret < 0) { ERR("Kernel create metadata stream failed"); - ret = LTTCOMM_KERN_STREAM_FAIL; + ret = LTTNG_ERR_KERN_STREAM_FAIL; goto error; } } @@ -1391,7 +1426,7 @@ int cmd_start_trace(struct ltt_session *session) if (kchan->stream_count == 0) { ret = kernel_open_channel_stream(kchan); if (ret < 0) { - ret = LTTCOMM_KERN_STREAM_FAIL; + ret = LTTNG_ERR_KERN_STREAM_FAIL; goto error; } /* Update the stream global counter */ @@ -1402,14 +1437,14 @@ int cmd_start_trace(struct ltt_session *session) /* Setup kernel consumer socket and send fds to it */ ret = init_kernel_tracing(ksession); if (ret < 0) { - ret = LTTCOMM_KERN_START_FAIL; + ret = LTTNG_ERR_KERN_START_FAIL; goto error; } /* This start the kernel tracing */ ret = kernel_start_session(ksession); if (ret < 0) { - ret = LTTCOMM_KERN_START_FAIL; + ret = LTTNG_ERR_KERN_START_FAIL; goto error; } @@ -1423,12 +1458,12 @@ int cmd_start_trace(struct ltt_session *session) ret = ust_app_start_trace_all(usess); if (ret < 0) { - ret = LTTCOMM_UST_START_FAIL; + ret = LTTNG_ERR_UST_START_FAIL; goto error; } } - ret = LTTCOMM_OK; + ret = LTTNG_OK; error: return ret; @@ -1451,7 +1486,7 @@ int cmd_stop_trace(struct ltt_session *session) usess = session->ust_session; if (!session->enabled) { - ret = LTTCOMM_TRACE_ALREADY_STOPPED; + ret = LTTNG_ERR_TRACE_ALREADY_STOPPED; goto error; } @@ -1479,7 +1514,7 @@ int cmd_stop_trace(struct ltt_session *session) ret = kernel_stop_session(ksession); if (ret < 0) { - ret = LTTCOMM_KERN_STOP_FAIL; + ret = LTTNG_ERR_KERN_STOP_FAIL; goto error; } @@ -1491,12 +1526,12 @@ int cmd_stop_trace(struct ltt_session *session) ret = ust_app_stop_trace_all(usess); if (ret < 0) { - ret = LTTCOMM_UST_STOP_FAIL; + ret = LTTNG_ERR_UST_STOP_FAIL; goto error; } } - ret = LTTCOMM_OK; + ret = LTTNG_OK; error: return ret; @@ -1519,12 +1554,7 @@ int cmd_set_consumer_uri(int domain, struct ltt_session *session, /* Can't enable consumer after session started. */ if (session->enabled) { - ret = LTTCOMM_TRACE_ALREADY_STARTED; - goto error; - } - - if (!session->start_consumer) { - ret = LTTCOMM_NO_CONSUMER; + ret = LTTNG_ERR_TRACE_ALREADY_STARTED; goto error; } @@ -1551,7 +1581,7 @@ int cmd_set_consumer_uri(int domain, struct ltt_session *session, if (consumer == NULL) { consumer = consumer_copy_output(ksess->consumer); if (consumer == NULL) { - ret = LTTCOMM_FATAL; + ret = LTTNG_ERR_FATAL; goto error; } /* Trash the consumer subdir, we are about to set a new one. */ @@ -1569,7 +1599,7 @@ int cmd_set_consumer_uri(int domain, struct ltt_session *session, if (consumer == NULL) { consumer = consumer_copy_output(usess->consumer); if (consumer == NULL) { - ret = LTTCOMM_FATAL; + ret = LTTNG_ERR_FATAL; goto error; } /* Trash the consumer subdir, we are about to set a new one. */ @@ -1591,10 +1621,13 @@ int cmd_set_consumer_uri(int domain, struct ltt_session *session, /* * Don't send relayd socket if URI is NOT remote or if the relayd - * sockets for the session are already sent. + * socket for the session was already sent. */ if (uris[i].dtype == LTTNG_DST_PATH || - consumer->dst.net.relayd_socks_sent) { + (uris[i].stype == LTTNG_STREAM_CONTROL && + consumer->dst.net.control_sock_sent) || + (uris[i].stype == LTTNG_STREAM_DATA && + consumer->dst.net.data_sock_sent)) { continue; } @@ -1610,7 +1643,7 @@ int cmd_set_consumer_uri(int domain, struct ltt_session *session, ret = send_consumer_relayd_socket(domain, session, &uris[i], consumer, socket->fd); pthread_mutex_unlock(socket->lock); - if (ret != LTTCOMM_OK) { + if (ret != LTTNG_OK) { rcu_read_unlock(); goto error; } @@ -1619,7 +1652,7 @@ int cmd_set_consumer_uri(int domain, struct ltt_session *session, } /* All good! */ - ret = LTTCOMM_OK; + ret = LTTNG_OK; error: return ret; @@ -1646,14 +1679,14 @@ int cmd_create_session_uri(char *name, struct lttng_uri *uris, */ session = session_find_by_name(name); if (session != NULL) { - ret = LTTCOMM_EXIST_SESS; + ret = LTTNG_ERR_EXIST_SESS; goto find_error; } /* Create tracing session in the registry */ ret = session_create(name, path, LTTNG_SOCK_GET_UID_CRED(creds), LTTNG_SOCK_GET_GID_CRED(creds)); - if (ret != LTTCOMM_OK) { + if (ret != LTTNG_OK) { goto session_error; } @@ -1670,7 +1703,7 @@ int cmd_create_session_uri(char *name, struct lttng_uri *uris, /* Create default consumer output for the session not yet created. */ session->consumer = consumer_create_output(CONSUMER_DST_LOCAL); if (session->consumer == NULL) { - ret = LTTCOMM_FATAL; + ret = LTTNG_ERR_FATAL; goto consumer_error; } @@ -1691,14 +1724,14 @@ int cmd_create_session_uri(char *name, struct lttng_uri *uris, session->start_consumer = 1; ret = cmd_set_consumer_uri(0, session, nb_uri, uris); - if (ret != LTTCOMM_OK) { + if (ret != LTTNG_OK) { goto consumer_error; } session->consumer->enabled = 1; end: - return LTTCOMM_OK; + return LTTNG_OK; consumer_error: session_destroy(session); @@ -1769,7 +1802,7 @@ int cmd_calibrate(int domain, struct lttng_calibrate *calibrate) kcalibrate.type = calibrate->type; ret = kernel_calibrate(kernel_tracer_fd, &kcalibrate); if (ret < 0) { - ret = LTTCOMM_KERN_ENABLE_FAIL; + ret = LTTNG_ERR_KERN_ENABLE_FAIL; goto error; } break; @@ -1781,17 +1814,17 @@ int cmd_calibrate(int domain, struct lttng_calibrate *calibrate) ucalibrate.type = calibrate->type; ret = ust_app_calibrate_glb(&ucalibrate); if (ret < 0) { - ret = LTTCOMM_UST_CALIBRATE_FAIL; + ret = LTTNG_ERR_UST_CALIBRATE_FAIL; goto error; } break; } default: - ret = LTTCOMM_UND; + ret = LTTNG_ERR_UND; goto error; } - ret = LTTCOMM_OK; + ret = LTTNG_OK; error: return ret; @@ -1819,19 +1852,19 @@ int cmd_register_consumer(struct ltt_session *session, int domain, /* Can't register a consumer if there is already one */ if (ksess->consumer_fds_sent != 0) { - ret = LTTCOMM_KERN_CONSUMER_FAIL; + ret = LTTNG_ERR_KERN_CONSUMER_FAIL; goto error; } sock = lttcomm_connect_unix_sock(sock_path); if (sock < 0) { - ret = LTTCOMM_CONNECT_FAIL; + ret = LTTNG_ERR_CONNECT_FAIL; goto error; } socket = consumer_allocate_socket(sock); if (socket == NULL) { - ret = LTTCOMM_FATAL; + ret = LTTNG_ERR_FATAL; close(sock); goto error; } @@ -1839,7 +1872,7 @@ int cmd_register_consumer(struct ltt_session *session, int domain, socket->lock = zmalloc(sizeof(pthread_mutex_t)); if (socket->lock == NULL) { PERROR("zmalloc pthread mutex"); - ret = LTTCOMM_FATAL; + ret = LTTNG_ERR_FATAL; goto error; } pthread_mutex_init(socket->lock, NULL); @@ -1857,11 +1890,11 @@ int cmd_register_consumer(struct ltt_session *session, int domain, } default: /* TODO: Userspace tracing */ - ret = LTTCOMM_UND; + ret = LTTNG_ERR_UND; goto error; } - ret = LTTCOMM_OK; + ret = LTTNG_OK; error: return ret; @@ -1888,7 +1921,7 @@ ssize_t cmd_list_domains(struct ltt_session *session, *domains = zmalloc(nb_dom * sizeof(struct lttng_domain)); if (*domains == NULL) { - ret = -LTTCOMM_FATAL; + ret = LTTNG_ERR_FATAL; goto error; } @@ -1905,7 +1938,8 @@ ssize_t cmd_list_domains(struct ltt_session *session, return nb_dom; error: - return ret; + /* Return negative value to differentiate return code */ + return -ret; } @@ -1924,6 +1958,9 @@ ssize_t cmd_list_channels(int domain, struct ltt_session *session, nb_chan = session->kernel_session->channel_count; } DBG3("Number of kernel channels %zd", nb_chan); + if (nb_chan <= 0) { + ret = LTTNG_ERR_KERN_CHAN_NOT_FOUND; + } break; case LTTNG_DOMAIN_UST: if (session->ust_session != NULL) { @@ -1931,29 +1968,35 @@ ssize_t cmd_list_channels(int domain, struct ltt_session *session, session->ust_session->domain_global.channels); } DBG3("Number of UST global channels %zd", nb_chan); + if (nb_chan <= 0) { + ret = LTTNG_ERR_UST_CHAN_NOT_FOUND; + } break; default: *channels = NULL; - ret = -LTTCOMM_UND; + ret = LTTNG_ERR_UND; goto error; } if (nb_chan > 0) { *channels = zmalloc(nb_chan * sizeof(struct lttng_channel)); if (*channels == NULL) { - ret = -LTTCOMM_FATAL; + ret = LTTNG_ERR_FATAL; goto error; } list_lttng_channels(domain, session, *channels); } else { *channels = NULL; + /* Ret value was set in the domain switch case */ + goto error; } return nb_chan; error: - return ret; + /* Return negative value to differentiate return code */ + return -ret; } /* @@ -1981,14 +2024,15 @@ ssize_t cmd_list_events(int domain, struct ltt_session *session, break; } default: - ret = -LTTCOMM_UND; + ret = LTTNG_ERR_UND; goto error; } - ret = nb_event; + return nb_event; error: - return ret; + /* Return negative value to differentiate return code */ + return -ret; } /* @@ -2058,12 +2102,12 @@ int cmd_disable_consumer(int domain, struct ltt_session *session) if (session->enabled) { /* Can't disable consumer on an already started session */ - ret = LTTCOMM_TRACE_ALREADY_STARTED; + ret = LTTNG_ERR_TRACE_ALREADY_STARTED; goto error; } if (!session->start_consumer) { - ret = LTTCOMM_NO_CONSUMER; + ret = LTTNG_ERR_NO_CONSUMER; goto error; } @@ -2089,16 +2133,16 @@ int cmd_disable_consumer(int domain, struct ltt_session *session) break; default: - ret = LTTCOMM_UNKNOWN_DOMAIN; + ret = LTTNG_ERR_UNKNOWN_DOMAIN; goto error; } if (consumer) { consumer->enabled = 0; /* Success at this point */ - ret = LTTCOMM_OK; + ret = LTTNG_OK; } else { - ret = LTTCOMM_NO_CONSUMER; + ret = LTTNG_ERR_NO_CONSUMER; } error: @@ -2119,12 +2163,7 @@ int cmd_enable_consumer(int domain, struct ltt_session *session) /* Can't enable consumer after session started. */ if (session->enabled) { - ret = LTTCOMM_TRACE_ALREADY_STARTED; - goto error; - } - - if (!session->start_consumer) { - ret = LTTCOMM_NO_CONSUMER; + ret = LTTNG_ERR_TRACE_ALREADY_STARTED; goto error; } @@ -2143,13 +2182,13 @@ int cmd_enable_consumer(int domain, struct ltt_session *session) * had previously occured. */ if (ksess->consumer_fds_sent) { - ret = LTTCOMM_ENABLE_CONSUMER_FAIL; + ret = LTTNG_ERR_ENABLE_CONSUMER_FAIL; goto error; } consumer = ksess->tmp_consumer; if (consumer == NULL) { - ret = LTTCOMM_OK; + ret = LTTNG_OK; /* No temp. consumer output exists. Using the current one. */ DBG3("No temporary consumer. Using default"); consumer = ksess->consumer; @@ -2166,7 +2205,7 @@ int cmd_enable_consumer(int domain, struct ltt_session *session) if (ret < 0) { if (ret != -EEXIST) { ERR("Trace directory creation error"); - ret = LTTCOMM_FATAL; + ret = LTTNG_ERR_FATAL; goto error; } } @@ -2175,18 +2214,18 @@ int cmd_enable_consumer(int domain, struct ltt_session *session) DBG2("Consumer output is network. Validating URIs"); /* Validate if we have both control and data path set. */ if (!consumer->dst.net.control_isset) { - ret = LTTCOMM_URL_CTRL_MISS; + ret = LTTNG_ERR_URL_CTRL_MISS; goto error; } if (!consumer->dst.net.data_isset) { - ret = LTTCOMM_URL_DATA_MISS; + ret = LTTNG_ERR_URL_DATA_MISS; goto error; } /* Check established network session state */ if (session->net_handle == 0) { - ret = LTTCOMM_ENABLE_CONSUMER_FAIL; + ret = LTTNG_ERR_ENABLE_CONSUMER_FAIL; ERR("Session network handle is not set on enable-consumer"); goto error; } @@ -2194,10 +2233,6 @@ int cmd_enable_consumer(int domain, struct ltt_session *session) break; } - /* Append default kernel trace dir to subdir */ - strncat(ksess->consumer->subdir, DEFAULT_KERNEL_TRACE_DIR, - sizeof(ksess->consumer->subdir)); - /* * @session-lock * This is race free for now since the session lock is acquired before @@ -2206,6 +2241,7 @@ int cmd_enable_consumer(int domain, struct ltt_session *session) * is valid. */ rcu_read_lock(); + /* Destroy current consumer. We are about to replace it */ consumer_destroy_output(ksess->consumer); rcu_read_unlock(); ksess->consumer = consumer; @@ -2222,13 +2258,13 @@ int cmd_enable_consumer(int domain, struct ltt_session *session) * had previously occured. */ if (usess->start_trace) { - ret = LTTCOMM_ENABLE_CONSUMER_FAIL; + ret = LTTNG_ERR_ENABLE_CONSUMER_FAIL; goto error; } consumer = usess->tmp_consumer; if (consumer == NULL) { - ret = LTTCOMM_OK; + ret = LTTNG_OK; /* No temp. consumer output exists. Using the current one. */ DBG3("No temporary consumer. Using default"); consumer = usess->consumer; @@ -2245,7 +2281,7 @@ int cmd_enable_consumer(int domain, struct ltt_session *session) if (ret < 0) { if (ret != -EEXIST) { ERR("Trace directory creation error"); - ret = LTTCOMM_FATAL; + ret = LTTNG_ERR_FATAL; goto error; } } @@ -2254,24 +2290,24 @@ int cmd_enable_consumer(int domain, struct ltt_session *session) DBG2("Consumer output is network. Validating URIs"); /* Validate if we have both control and data path set. */ if (!consumer->dst.net.control_isset) { - ret = LTTCOMM_URL_CTRL_MISS; + ret = LTTNG_ERR_URL_CTRL_MISS; goto error; } if (!consumer->dst.net.data_isset) { - ret = LTTCOMM_URL_DATA_MISS; + ret = LTTNG_ERR_URL_DATA_MISS; goto error; } /* Check established network session state */ if (session->net_handle == 0) { - ret = LTTCOMM_ENABLE_CONSUMER_FAIL; + ret = LTTNG_ERR_ENABLE_CONSUMER_FAIL; DBG2("Session network handle is not set on enable-consumer"); goto error; } if (consumer->net_seq_index == -1) { - ret = LTTCOMM_ENABLE_CONSUMER_FAIL; + ret = LTTNG_ERR_ENABLE_CONSUMER_FAIL; DBG2("Network index is not set on the consumer"); goto error; } @@ -2279,10 +2315,6 @@ int cmd_enable_consumer(int domain, struct ltt_session *session) break; } - /* Append default kernel trace dir to subdir */ - strncat(usess->consumer->subdir, DEFAULT_UST_TRACE_DIR, - sizeof(usess->consumer->subdir)); - /* * @session-lock * This is race free for now since the session lock is acquired before @@ -2291,6 +2323,7 @@ int cmd_enable_consumer(int domain, struct ltt_session *session) * is valid. */ rcu_read_lock(); + /* Destroy current consumer. We are about to replace it */ consumer_destroy_output(usess->consumer); rcu_read_unlock(); usess->consumer = consumer; @@ -2299,20 +2332,63 @@ int cmd_enable_consumer(int domain, struct ltt_session *session) break; } + session->start_consumer = 1; + /* Enable it */ if (consumer) { consumer->enabled = 1; /* Success at this point */ - ret = LTTCOMM_OK; + ret = LTTNG_OK; } else { /* Should not really happend... */ - ret = LTTCOMM_NO_CONSUMER; + ret = LTTNG_ERR_NO_CONSUMER; } error: return ret; } +/* + * 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. + */ +int cmd_data_pending(struct ltt_session *session) +{ + int ret; + struct ltt_kernel_session *ksess = session->kernel_session; + struct ltt_ust_session *usess = session->ust_session; + + assert(session); + + /* Session MUST be stopped to ask for data availability. */ + if (session->enabled) { + ret = LTTNG_ERR_SESSION_STARTED; + goto error; + } + + if (ksess && ksess->consumer) { + ret = consumer_is_data_pending(ksess->id, ksess->consumer); + if (ret == 1) { + /* Data is still being extracted for the kernel. */ + goto error; + } + } + + if (usess && usess->consumer) { + ret = consumer_is_data_pending(usess->id, usess->consumer); + if (ret == 1) { + /* Data is still being extracted for the kernel. */ + goto error; + } + } + + /* Data is ready to be read by a viewer */ + ret = 0; + +error: + return ret; +} + /* * Init command subsystem. */