X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fbin%2Flttng%2Fcommands%2Ftrack-untrack.c;h=c54b6407802ed7cd0e342c057f9d3c460c05a351;hp=25b4461f696a7e96beab3265da9f437eb1fda9d5;hb=2d97a0067600335f07eecb2c1d9ba68fc164583e;hpb=ef440343c0d6372c1aaca74d0cdecfcd700a5785 diff --git a/src/bin/lttng/commands/track-untrack.c b/src/bin/lttng/commands/track-untrack.c index 25b4461f6..c54b64078 100644 --- a/src/bin/lttng/commands/track-untrack.c +++ b/src/bin/lttng/commands/track-untrack.c @@ -56,7 +56,7 @@ struct opt_type { struct id_list { size_t nr; - struct lttng_tracker_id *array; + struct lttng_tracker_id **array; }; static char *opt_session_name; @@ -100,7 +100,7 @@ static struct poptOption long_options[] = { static struct id_list *alloc_id_list(size_t nr_items) { struct id_list *id_list; - struct lttng_tracker_id *items; + struct lttng_tracker_id **items; id_list = zmalloc(sizeof(*id_list)); if (!id_list) { @@ -128,15 +128,16 @@ static void free_id_list(struct id_list *list) } nr_items = list->nr; for (i = 0; i < nr_items; i++) { - struct lttng_tracker_id *item = &list->array[i]; - - free(item->string); + struct lttng_tracker_id *item = list->array[i]; + lttng_tracker_id_destroy(item); } free(list); } -static int parse_id_string( - const char *_id_string, int all, struct id_list **_id_list) +static int parse_id_string(const char *_id_string, + int all, + struct id_list **_id_list, + enum lttng_tracker_type tracker_type) { const char *one_id_str; char *iter; @@ -157,14 +158,28 @@ static int parse_id_string( goto error; } if (all) { - /* Empty ID string means all IDs */ + enum lttng_tracker_id_status status; + /* Empty `ID string means all IDs */ id_list = alloc_id_list(1); if (!id_list) { ERR("Out of memory"); retval = CMD_ERROR; goto error; } - id_list->array[0].type = LTTNG_ID_ALL; + + id_list->array[0] = lttng_tracker_id_create(); + if (id_list->array[0] == NULL) { + ERR("Out of memory"); + retval = CMD_ERROR; + goto error; + } + + status = lttng_tracker_id_set_all(id_list->array[0]); + if (status != LTTNG_TRACKER_ID_STATUS_OK) { + ERR("Invalid value for tracker id"); + retval = CMD_ERROR; + goto error; + } goto assign; } @@ -230,20 +245,30 @@ static int parse_id_string( count = 0; one_id_str = strtok_r(id_string, ",", &iter); while (one_id_str != NULL) { + enum lttng_tracker_id_status status; struct lttng_tracker_id *item; + item = lttng_tracker_id_create(); + if (item == NULL) { + ERR("Out of memory"); + retval = CMD_ERROR; + goto error; + } - item = &id_list->array[count++]; + id_list->array[count++] = item; if (isdigit(one_id_str[0])) { unsigned long v; v = strtoul(one_id_str, NULL, 10); - item->type = LTTNG_ID_VALUE; - item->value = (int) v; + status = lttng_tracker_id_set_value(item, (int) v); + if (status == LTTNG_TRACKER_ID_STATUS_INVALID) { + ERR("Invalid value"); + retval = CMD_ERROR; + goto error; + } } else { - item->type = LTTNG_ID_STRING; - item->string = strdup(one_id_str); - if (!item->string) { - PERROR("Failed to allocate ID string"); + status = lttng_tracker_id_set_string(item, one_id_str); + if (status == LTTNG_TRACKER_ID_STATUS_INVALID) { + ERR("Failed to set ID string"); retval = CMD_ERROR; goto error; } @@ -254,11 +279,12 @@ static int parse_id_string( } assign: + /* SUCCESS */ *_id_list = id_list; - goto end; /* SUCCESS */ + goto end; - /* ERROR */ error: + /* ERROR */ free_id_list(id_list); end: free(id_string); @@ -365,7 +391,7 @@ static enum cmd_error_code track_untrack_id(enum cmd_type cmd_type, retval = CMD_ERROR; goto end; } - ret = parse_id_string(id_string, all, &id_list); + ret = parse_id_string(id_string, all, &id_list, tracker_type); if (ret != CMD_SUCCESS) { ERR("Error parsing %s string", tracker_str); retval = CMD_ERROR; @@ -387,22 +413,51 @@ static enum cmd_error_code track_untrack_id(enum cmd_type cmd_type, } for (i = 0; i < id_list->nr; i++) { - struct lttng_tracker_id *item = &id_list->array[i]; + struct lttng_tracker_id *item = id_list->array[i]; + enum lttng_tracker_id_type type = + lttng_tracker_id_get_type(item); + enum lttng_tracker_id_status status = + LTTNG_TRACKER_ID_STATUS_OK; + int value; + const char *value_string; + + switch (type) { + case LTTNG_ID_ALL: + /* Nothing to check */ + break; + case LTTNG_ID_VALUE: + status = lttng_tracker_id_get_value(item, &value); + break; + case LTTNG_ID_STRING: + status = lttng_tracker_id_get_string( + item, &value_string); + break; + default: + retval = CMD_ERROR; + goto end; + } - switch (item->type) { + if (status != LTTNG_TRACKER_ID_STATUS_OK) { + ERR("Tracker id object is in an invalid state"); + retval = CMD_ERROR; + goto end; + } + + switch (type) { case LTTNG_ID_ALL: DBG("%s all IDs", cmd_str); break; case LTTNG_ID_VALUE: - DBG("%s ID %d", cmd_str, item->value); + DBG("%s ID %d", cmd_str, value); break; case LTTNG_ID_STRING: - DBG("%s ID '%s'", cmd_str, item->string); + DBG("%s ID '%s'", cmd_str, value_string); break; default: retval = CMD_ERROR; goto end; } + ret = cmd_func(handle, tracker_type, item); if (ret) { char *msg = NULL; @@ -425,7 +480,7 @@ static enum cmd_error_code track_untrack_id(enum cmd_type cmd_type, break; } if (msg) { - switch (item->type) { + switch (type) { case LTTNG_ID_ALL: WARN("All %ss %s in session %s", tracker_str, msg, @@ -433,14 +488,13 @@ static enum cmd_error_code track_untrack_id(enum cmd_type cmd_type, break; case LTTNG_ID_VALUE: WARN("%s %i %s in session %s", - tracker_str, - item->value, msg, + tracker_str, value, msg, session_name); break; case LTTNG_ID_STRING: WARN("%s '%s' %s in session %s", tracker_str, - item->string, msg, + value_string, msg, session_name); break; default: @@ -449,19 +503,18 @@ static enum cmd_error_code track_untrack_id(enum cmd_type cmd_type, } } } else { - switch (item->type) { + switch (type) { case LTTNG_ID_ALL: MSG("All %ss %sed in session %s", tracker_str, cmd_str, session_name); break; case LTTNG_ID_VALUE: MSG("%s %i %sed in session %s", tracker_str, - item->value, cmd_str, - session_name); + value, cmd_str, session_name); break; case LTTNG_ID_STRING: MSG("%s '%s' %sed in session %s", tracker_str, - item->string, cmd_str, + value_string, cmd_str, session_name); break; default: