X-Git-Url: http://git.efficios.com/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Flib%2Flttng-ctl%2Flttng-ctl.c;h=406de885c713a4f4ab6a4d022c117f2a43946980;hp=085005c3940bd4d1c039996b83857f454a29cbf0;hb=2d97a0067600335f07eecb2c1d9ba68fc164583e;hpb=0dda67289b8a86fd3f117d644f00f2985d399208 diff --git a/src/lib/lttng-ctl/lttng-ctl.c b/src/lib/lttng-ctl/lttng-ctl.c index 085005c39..406de885c 100644 --- a/src/lib/lttng-ctl/lttng-ctl.c +++ b/src/lib/lttng-ctl/lttng-ctl.c @@ -46,6 +46,7 @@ #include #include #include +#include #include "filter/filter-ast.h" #include "filter/filter-parser.h" @@ -1606,98 +1607,6 @@ int lttng_disable_channel(struct lttng_handle *handle, const char *name) return lttng_ctl_ask_sessiond(&lsm, NULL); } -static int lttng_track_untrack_id(struct lttng_handle *handle, - enum lttng_tracker_type tracker_type, - const struct lttng_tracker_id *id, - enum lttcomm_sessiond_command cmd) -{ - struct lttcomm_session_msg lsm; - char *var_data = NULL; - size_t var_data_len = 0; - - /* NULL arguments are forbidden. No default values. */ - if (handle == NULL) { - return -LTTNG_ERR_INVALID; - } - - memset(&lsm, 0, sizeof(lsm)); - - lsm.cmd_type = cmd; - lsm.u.id_tracker.tracker_type = tracker_type; - lsm.u.id_tracker.id_type = id->type; - switch (id->type) { - case LTTNG_ID_ALL: - break; - case LTTNG_ID_VALUE: - lsm.u.id_tracker.u.value = id->value; - break; - case LTTNG_ID_STRING: - var_data = id->string; - var_data_len = strlen(var_data) + 1; /* Includes \0. */ - lsm.u.id_tracker.u.var_len = var_data_len; - break; - default: - return -LTTNG_ERR_INVALID; - } - - COPY_DOMAIN_PACKED(lsm.domain, handle->domain); - - lttng_ctl_copy_string(lsm.session.name, handle->session_name, - sizeof(lsm.session.name)); - - return lttng_ctl_ask_sessiond_varlen_no_cmd_header( - &lsm, var_data, var_data_len, NULL); -} - -/* - * Add ID to session tracker. - * Return 0 on success else a negative LTTng error code. - */ -int lttng_track_id(struct lttng_handle *handle, - enum lttng_tracker_type tracker_type, - const struct lttng_tracker_id *id) -{ - return lttng_track_untrack_id(handle, tracker_type, id, LTTNG_TRACK_ID); -} - -/* - * Remove ID from session tracker. - * Return 0 on success else a negative LTTng error code. - */ -int lttng_untrack_id(struct lttng_handle *handle, - enum lttng_tracker_type tracker_type, - const struct lttng_tracker_id *id) -{ - return lttng_track_untrack_id( - handle, tracker_type, id, LTTNG_UNTRACK_ID); -} - -/* - * Add PID to session tracker. - * Return 0 on success else a negative LTTng error code. - */ -int lttng_track_pid(struct lttng_handle *handle, int pid) -{ - struct lttng_tracker_id id; - - id.type = LTTNG_TRACKER_PID; - id.value = pid; - return lttng_track_id(handle, LTTNG_TRACKER_PID, &id); -} - -/* - * Remove PID from session tracker. - * Return 0 on success else a negative LTTng error code. - */ -int lttng_untrack_pid(struct lttng_handle *handle, int pid) -{ - struct lttng_tracker_id id; - - id.type = LTTNG_TRACKER_PID; - id.value = pid; - return lttng_untrack_id(handle, LTTNG_TRACKER_PID, &id); -} - /* * Lists all available tracepoints of domain. * Sets the contents of the events array. @@ -2923,14 +2832,14 @@ end: * * tracker_type is the type of tracker. * ids is set to an allocated array of IDs currently tracked. On - * success, ids and all the strings it contains must be freed by the caller. + * success, ids and contained ids must be freed/destroy by the caller. * nr_ids is set to the number of entries contained by the ids array. * * Returns 0 on success, else a negative LTTng error code. */ int lttng_list_tracker_ids(struct lttng_handle *handle, enum lttng_tracker_type tracker_type, - struct lttng_tracker_id **_ids, + struct lttng_tracker_id ***_ids, size_t *_nr_ids) { int ret, i; @@ -2939,7 +2848,7 @@ int lttng_list_tracker_ids(struct lttng_handle *handle, char *cmd_payload = NULL, *p; size_t cmd_header_len; size_t nr_ids = 0; - struct lttng_tracker_id *ids = NULL; + struct lttng_tracker_id **ids = NULL; if (handle == NULL) { return -LTTNG_ERR_INVALID; @@ -2978,29 +2887,40 @@ int lttng_list_tracker_ids(struct lttng_handle *handle, for (i = 0; i < nr_ids; i++) { struct lttcomm_tracker_id_header *tracker_id; struct lttng_tracker_id *id; + enum lttng_tracker_id_status status; tracker_id = (struct lttcomm_tracker_id_header *) p; p += sizeof(struct lttcomm_tracker_id_header); - id = &ids[i]; + id = lttng_tracker_id_create(); + if (!id) { + ret = -LTTNG_ERR_NOMEM; + goto error; + } - id->type = tracker_id->type; switch (tracker_id->type) { case LTTNG_ID_ALL: + status = lttng_tracker_id_set_all(id); break; case LTTNG_ID_VALUE: id->value = tracker_id->u.value; + status = lttng_tracker_id_set_value( + id, tracker_id->u.value); break; case LTTNG_ID_STRING: - id->string = strdup(p); - if (!id->string) { - ret = -LTTNG_ERR_NOMEM; - goto error; - } + status = lttng_tracker_id_set_string(id, p); p += tracker_id->u.var_data_len; break; default: goto error; } + + if (status != LTTNG_TRACKER_ID_STATUS_OK) { + ret = -LTTNG_ERR_INVALID; + goto error; + } + + /* Assign the new object to the list */ + ids[i] = id; } free(cmd_payload); *_ids = ids; @@ -3008,12 +2928,8 @@ int lttng_list_tracker_ids(struct lttng_handle *handle, return 0; error: - if (ids) { - for (i = 0; i < nr_ids; i++) { - free(ids[i].string); - } - free(ids); - } + lttng_tracker_ids_destroy(ids, nr_ids); + free(ids); free(cmd_payload); free(cmd_header); return ret; @@ -3032,16 +2948,17 @@ error: int lttng_list_tracker_pids(struct lttng_handle *handle, int *_enabled, int32_t **_pids, size_t *_nr_pids) { - struct lttng_tracker_id *ids = NULL; + struct lttng_tracker_id **ids = NULL; size_t nr_ids = 0; int *pids = NULL; int ret = 0, i; + enum lttng_tracker_id_status status; ret = lttng_list_tracker_ids(handle, LTTNG_TRACKER_PID, &ids, &nr_ids); if (ret < 0) return ret; - if (nr_ids == 1 && ids[0].type == LTTNG_ID_ALL) { + if (nr_ids == 1 && lttng_tracker_id_get_type(ids[0]) == LTTNG_ID_ALL) { *_enabled = 0; goto end; } @@ -3053,20 +2970,18 @@ int lttng_list_tracker_pids(struct lttng_handle *handle, goto end; } for (i = 0; i < nr_ids; i++) { - struct lttng_tracker_id *id = &ids[i]; + struct lttng_tracker_id *id = ids[i]; - if (id->type != LTTNG_ID_VALUE) { + status = lttng_tracker_id_get_value(id, &pids[i]); + if (status != LTTNG_TRACKER_ID_STATUS_OK) { ret = -LTTNG_ERR_UNK; goto end; } - pids[i] = id->value; } *_pids = pids; *_nr_pids = nr_ids; end: - for (i = 0; i < nr_ids; i++) { - free(ids[i].string); - } + lttng_tracker_ids_destroy(ids, nr_ids); free(ids); if (ret < 0) { free(pids); @@ -3208,6 +3123,131 @@ end: return ret; } +static int lttng_track_untrack_id(struct lttng_handle *handle, + enum lttng_tracker_type tracker_type, + const struct lttng_tracker_id *id, + enum lttcomm_sessiond_command cmd) +{ + int ret; + struct lttcomm_session_msg lsm; + const char *var_data; + size_t var_data_len = 0; + int value; + enum lttng_tracker_id_status status; + + /* NULL arguments are forbidden. No default values. */ + if (handle == NULL) { + goto error; + } + + memset(&lsm, 0, sizeof(lsm)); + + lsm.cmd_type = cmd; + lsm.u.id_tracker.tracker_type = tracker_type; + lsm.u.id_tracker.id_type = lttng_tracker_id_get_type(id); + switch (lsm.u.id_tracker.id_type) { + case LTTNG_ID_ALL: + break; + case LTTNG_ID_VALUE: + status = lttng_tracker_id_get_value(id, &value); + if (status != LTTNG_TRACKER_ID_STATUS_OK) { + goto error; + } + lsm.u.id_tracker.u.value = value; + break; + case LTTNG_ID_STRING: + status = lttng_tracker_id_get_string(id, &var_data); + if (status != LTTNG_TRACKER_ID_STATUS_OK) { + goto error; + } + var_data_len = strlen(var_data) + 1; /* Includes \0. */ + lsm.u.id_tracker.u.var_len = var_data_len; + break; + default: + goto error; + } + + COPY_DOMAIN_PACKED(lsm.domain, handle->domain); + + lttng_ctl_copy_string(lsm.session.name, handle->session_name, + sizeof(lsm.session.name)); + + ret = lttng_ctl_ask_sessiond_varlen_no_cmd_header( + &lsm, (char *) var_data, var_data_len, NULL); + return ret; +error: + return -LTTNG_ERR_INVALID; +} + +/* + * Add ID to session tracker. + * Return 0 on success else a negative LTTng error code. + */ +int lttng_track_id(struct lttng_handle *handle, + enum lttng_tracker_type tracker_type, + const struct lttng_tracker_id *id) +{ + return lttng_track_untrack_id(handle, tracker_type, id, LTTNG_TRACK_ID); +} + +/* + * Remove ID from session tracker. + * Return 0 on success else a negative LTTng error code. + */ +int lttng_untrack_id(struct lttng_handle *handle, + enum lttng_tracker_type tracker_type, + const struct lttng_tracker_id *id) +{ + return lttng_track_untrack_id( + handle, tracker_type, id, LTTNG_UNTRACK_ID); +} + +/* + * Add PID to session tracker. + * Return 0 on success else a negative LTTng error code. + */ +int lttng_track_pid(struct lttng_handle *handle, int pid) +{ + int ret; + struct lttng_tracker_id *id = NULL; + enum lttng_tracker_id_status status; + + id = lttng_tracker_id_create(); + status = lttng_tracker_id_set_value(id, pid); + if (status == LTTNG_TRACKER_ID_STATUS_INVALID) { + ret = -LTTNG_ERR_INVALID; + goto error; + } + + ret = lttng_track_id(handle, LTTNG_TRACKER_PID, id); +error: + lttng_tracker_id_destroy(id); + return ret; +} + +/* + * Remove PID from session tracker. + * Return 0 on success else a negative LTTng error code. + */ +int lttng_untrack_pid(struct lttng_handle *handle, int pid) +{ + int ret; + struct lttng_tracker_id *id = NULL; + enum lttng_tracker_id_status status; + + id = lttng_tracker_id_create(); + status = lttng_tracker_id_set_value(id, pid); + if (status == LTTNG_TRACKER_ID_STATUS_INVALID) { + ret = -LTTNG_ERR_INVALID; + goto error; + } + + ret = lttng_untrack_id(handle, LTTNG_TRACKER_PID, id); +error: + lttng_tracker_id_destroy(id); + return ret; +} + /* * lib constructor. */