X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Fclient.c;h=2c7bd4787c9371305455dfa7765ab9397d07877f;hp=327c1fe1706efabaefdf9dd2a3c5dc7fb4865c3e;hb=2d97a0067600335f07eecb2c1d9ba68fc164583e;hpb=0f68efb616cd046543e5fc5a091466ec26df2216;ds=sidebyside diff --git a/src/bin/lttng-sessiond/client.c b/src/bin/lttng-sessiond/client.c index 327c1fe17..2c7bd4787 100644 --- a/src/bin/lttng-sessiond/client.c +++ b/src/bin/lttng-sessiond/client.c @@ -38,6 +38,7 @@ #include "testpoint.h" #include "utils.h" #include "manage-consumer.h" +#include "clear.h" static bool is_root; @@ -747,6 +748,7 @@ static int process_client_msg(struct command_ctx *cmd_ctx, int *sock, case LTTNG_ROTATION_GET_INFO: case LTTNG_ROTATION_SET_SCHEDULE: case LTTNG_SESSION_LIST_ROTATION_SCHEDULES: + case LTTNG_CLEAR_SESSION: need_domain = 0; break; default: @@ -787,7 +789,7 @@ static int process_client_msg(struct command_ctx *cmd_ctx, int *sock, case LTTNG_LIST_CHANNELS: case LTTNG_LIST_EVENTS: case LTTNG_LIST_SYSCALLS: - case LTTNG_LIST_TRACKER_PIDS: + case LTTNG_LIST_TRACKER_IDS: case LTTNG_DATA_PENDING: case LTTNG_ROTATE_SESSION: case LTTNG_ROTATION_GET_INFO: @@ -1203,18 +1205,141 @@ error_add_context: kernel_poll_pipe[1]); break; } - case LTTNG_TRACK_PID: + case LTTNG_TRACK_ID: { - ret = cmd_track_pid(cmd_ctx->session, - cmd_ctx->lsm->domain.type, - cmd_ctx->lsm->u.pid_tracker.pid); + struct lttng_tracker_id *id = NULL; + enum lttng_tracker_id_status status; + + id = lttng_tracker_id_create(); + if (!id) { + ret = LTTNG_ERR_NOMEM; + goto error; + } + + switch (cmd_ctx->lsm->u.id_tracker.id_type) { + case LTTNG_ID_ALL: + status = lttng_tracker_id_set_all(id); + break; + case LTTNG_ID_VALUE: + status = lttng_tracker_id_set_value( + id, cmd_ctx->lsm->u.id_tracker.u.value); + break; + case LTTNG_ID_STRING: + { + const size_t var_len = cmd_ctx->lsm->u.id_tracker.u.var_len; + char *string = NULL; + + string = zmalloc(var_len); + if (!string) { + lttng_tracker_id_destroy(id); + ret = LTTNG_ERR_NOMEM; + goto error; + } + DBG("Receiving var len tracker id string from client"); + ret = lttcomm_recv_unix_sock(*sock, string, var_len); + if (ret <= 0) { + DBG("Nothing received"); + *sock_error = 1; + free(string); + lttng_tracker_id_destroy(id); + ret = LTTNG_ERR_INVALID; + goto error; + } + if (strnlen(string, var_len) != var_len - 1) { + DBG("String received as tracker ID is not NULL-terminated"); + free(string); + lttng_tracker_id_destroy(id); + ret = LTTNG_ERR_INVALID; + goto error; + } + + status = lttng_tracker_id_set_string(id, string); + free(string); + break; + } + default: + lttng_tracker_id_destroy(id); + ret = LTTNG_ERR_INVALID; + goto error; + } + + if (status != LTTNG_TRACKER_ID_STATUS_OK) { + ERR("Invalid value for tracker id"); + ret = LTTNG_ERR_INVALID; + lttng_tracker_id_destroy(id); + goto error; + } + + ret = cmd_track_id(cmd_ctx->session, + cmd_ctx->lsm->u.id_tracker.tracker_type, + cmd_ctx->lsm->domain.type, id); + lttng_tracker_id_destroy(id); break; } - case LTTNG_UNTRACK_PID: + case LTTNG_UNTRACK_ID: { - ret = cmd_untrack_pid(cmd_ctx->session, - cmd_ctx->lsm->domain.type, - cmd_ctx->lsm->u.pid_tracker.pid); + struct lttng_tracker_id *id = NULL; + enum lttng_tracker_id_status status; + + id = lttng_tracker_id_create(); + + switch (cmd_ctx->lsm->u.id_tracker.id_type) { + case LTTNG_ID_ALL: + status = lttng_tracker_id_set_all(id); + break; + case LTTNG_ID_VALUE: + status = lttng_tracker_id_set_value( + id, cmd_ctx->lsm->u.id_tracker.u.value); + break; + case LTTNG_ID_STRING: + { + const size_t var_len = cmd_ctx->lsm->u.id_tracker.u.var_len; + char *string = NULL; + + string = zmalloc(var_len); + if (!string) { + ret = LTTNG_ERR_NOMEM; + lttng_tracker_id_destroy(id); + goto error; + } + DBG("Receiving var len tracker id string from client"); + ret = lttcomm_recv_unix_sock(*sock, string, var_len); + if (ret <= 0) { + DBG("Nothing received"); + *sock_error = 1; + lttng_tracker_id_destroy(id); + free(string); + ret = LTTNG_ERR_INVALID; + goto error; + } + if (strnlen(string, var_len) != var_len - 1) { + DBG("String received as tracker ID is not NULL-terminated"); + lttng_tracker_id_destroy(id); + free(string); + ret = LTTNG_ERR_INVALID; + goto error; + } + status = lttng_tracker_id_set_string(id, string); + free(string); + break; + } + default: + lttng_tracker_id_destroy(id); + ret = LTTNG_ERR_INVALID; + goto error; + } + + if (status != LTTNG_TRACKER_ID_STATUS_OK) { + ERR("Invalid tracker id"); + lttng_tracker_id_destroy(id); + ret = LTTNG_ERR_INVALID; + goto error; + } + + ret = cmd_untrack_id(cmd_ctx->session, + cmd_ctx->lsm->u.id_tracker.tracker_type, + cmd_ctx->lsm->domain.type, id); + lttng_tracker_id_destroy(id); break; } case LTTNG_ENABLE_EVENT: @@ -1440,27 +1565,81 @@ error_add_context: ret = LTTNG_OK; break; } - case LTTNG_LIST_TRACKER_PIDS: + case LTTNG_LIST_TRACKER_IDS: { - int32_t *pids = NULL; - ssize_t nr_pids; - - nr_pids = cmd_list_tracker_pids(cmd_ctx->session, - cmd_ctx->lsm->domain.type, &pids); - if (nr_pids < 0) { + struct lttcomm_tracker_command_header cmd_header; + struct lttng_tracker_id **ids = NULL; + ssize_t nr_ids, i; + struct lttng_dynamic_buffer buf; + + nr_ids = cmd_list_tracker_ids( + cmd_ctx->lsm->u.id_tracker.tracker_type, + cmd_ctx->session, cmd_ctx->lsm->domain.type, + &ids); + if (nr_ids < 0) { /* Return value is a negative lttng_error_code. */ - ret = -nr_pids; + ret = -nr_ids; goto error; } - /* - * Setup lttng message with payload size set to the event list size in - * bytes and then copy list into the llm payload. - */ - ret = setup_lttng_msg_no_cmd_header(cmd_ctx, pids, - sizeof(int32_t) * nr_pids); - free(pids); + lttng_dynamic_buffer_init(&buf); + for (i = 0; i < nr_ids; i++) { + struct lttng_tracker_id *id = ids[i]; + struct lttcomm_tracker_id_header id_hdr; + size_t var_data_len = 0; + enum lttng_tracker_id_status status; + const char *string; + int value; + + memset(&id_hdr, 0, sizeof(id_hdr)); + id_hdr.type = lttng_tracker_id_get_type(id); + switch (id_hdr.type) { + case LTTNG_ID_ALL: + break; + case LTTNG_ID_VALUE: + status = lttng_tracker_id_get_value(id, &value); + id_hdr.u.value = value; + if (status != LTTNG_TRACKER_ID_STATUS_OK) { + ret = LTTNG_ERR_INVALID; + goto error_list_tracker; + } + break; + case LTTNG_ID_STRING: + status = lttng_tracker_id_get_string( + id, &string); + if (status != LTTNG_TRACKER_ID_STATUS_OK) { + ret = LTTNG_ERR_INVALID; + goto error_list_tracker; + } + + id_hdr.u.var_data_len = var_data_len = + strlen(string) + 1; + break; + default: + ret = LTTNG_ERR_INVALID; + goto error_list_tracker; + } + ret = lttng_dynamic_buffer_append( + &buf, &id_hdr, sizeof(id_hdr)); + if (ret) { + ret = LTTNG_ERR_NOMEM; + goto error_list_tracker; + } + ret = lttng_dynamic_buffer_append( + &buf, string, var_data_len); + if (ret) { + ret = LTTNG_ERR_NOMEM; + goto error_list_tracker; + } + } + cmd_header.nb_tracker_id = nr_ids; + ret = setup_lttng_msg(cmd_ctx, buf.data, buf.size, &cmd_header, + sizeof(cmd_header)); + error_list_tracker: + lttng_tracker_ids_destroy(ids, nr_ids); + free(ids); + lttng_dynamic_buffer_reset(&buf); if (ret < 0) { goto setup_error; } @@ -1850,7 +2029,8 @@ error_add_context: } ret = cmd_rotate_session(cmd_ctx->session, &rotate_return, - false); + false, + LTTNG_TRACE_CHUNK_COMMAND_TYPE_MOVE_TO_COMPLETED); if (ret < 0) { ret = -ret; goto error; @@ -1934,6 +2114,11 @@ error_add_context: ret = LTTNG_OK; break; } + case LTTNG_CLEAR_SESSION: + { + ret = cmd_clear_session(cmd_ctx->session, sock); + break; + } default: ret = LTTNG_ERR_UND; break;