- const char *one_id_str;
- char *iter;
- int retval = CMD_SUCCESS;
- int count = 0;
- struct id_list *id_list = NULL;
- char *id_string = NULL;
- char *endptr;
-
- if (all && _id_string) {
- ERR("An empty ID string is expected with --all");
- retval = CMD_ERROR;
- goto error;
- }
- if (!all && !_id_string) {
- ERR("An ID string is expected");
- retval = CMD_ERROR;
- goto error;
- }
- if (all) {
- 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] = 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;
- }
-
- id_string = strdup(_id_string);
- if (!id_string) {
- ERR("Out of memory");
- retval = CMD_ERROR;
- goto error;
- }
-
- /* Count */
- one_id_str = strtok_r(id_string, ",", &iter);
- while (one_id_str != NULL) {
- unsigned long v;
-
- if (isdigit(one_id_str[0])) {
- errno = 0;
- v = strtoul(one_id_str, &endptr, 10);
- if ((v == 0 && errno == EINVAL) ||
- (v == ULONG_MAX && errno == ERANGE) ||
- (*one_id_str != '\0' &&
- *endptr != '\0')) {
- ERR("Error parsing ID %s", one_id_str);
- retval = CMD_ERROR;
- goto error;
- }
-
- if ((long) v > INT_MAX || (int) v < 0) {
- ERR("Invalid ID value %ld", (long) v);
- retval = CMD_ERROR;
- goto error;
- }
- }
- count++;
-
- /* For next loop */
- one_id_str = strtok_r(NULL, ",", &iter);
- }
- if (count == 0) {
- ERR("Fatal error occurred when parsing pid string");
- retval = CMD_ERROR;
- goto error;
- }
-
- free(id_string);
- /* Identity of delimiter has been lost in first pass. */
- id_string = strdup(_id_string);
- if (!id_string) {
- ERR("Out of memory");
- retval = CMD_ERROR;
- goto error;
- }
-
- /* Allocate */
- id_list = alloc_id_list(count);
- if (!id_list) {
- ERR("Out of memory");
- retval = CMD_ERROR;
- goto error;
- }
-
- /* Reparse string and populate the id list. */
- 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;
- }
-
- id_list->array[count++] = item;
- if (isdigit(one_id_str[0])) {
- unsigned long v;
-
- v = strtoul(one_id_str, NULL, 10);
- 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 {
- 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;
- }
- }
-
- /* For next loop */
- one_id_str = strtok_r(NULL, ",", &iter);
- }
-
-assign:
- /* SUCCESS */
- *_id_list = id_list;
- goto end;
-
-error:
- /* ERROR */
- free_id_list(id_list);
-end:
- free(id_string);
- return retval;