X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Fbin%2Flttng%2Fcommands%2Fremove_trigger.c;h=ce0e83ec7dfe5bef3c48fd8383e3f2d9fa7e1d71;hb=fc63f82bc420d29f2f55f447f7a76b2a1503e4eb;hp=1fabc70ec91e698db134f90332156339f83a4135;hpb=b61776fb63d4bb14df77c0b5a15de28beed7ddfc;p=lttng-tools.git diff --git a/src/bin/lttng/commands/remove_trigger.c b/src/bin/lttng/commands/remove_trigger.c index 1fabc70ec..ce0e83ec7 100644 --- a/src/bin/lttng/commands/remove_trigger.c +++ b/src/bin/lttng/commands/remove_trigger.c @@ -7,6 +7,7 @@ #include "../command.h" #include "common/argpar/argpar.h" +#include "common/mi-lttng.h" #include #include @@ -19,14 +20,14 @@ static const char help_msg[] = enum { OPT_HELP, OPT_LIST_OPTIONS, - OPT_USER_ID, + OPT_OWNER_UID, }; static const struct argpar_opt_descr remove_trigger_options[] = { { OPT_HELP, 'h', "help", false }, { OPT_LIST_OPTIONS, '\0', "list-options", false }, - { OPT_USER_ID, '\0', "user-id", true }, + { OPT_OWNER_UID, '\0', "owner-uid", true }, ARGPAR_OPT_DESCR_SENTINEL, }; @@ -58,16 +59,43 @@ end: int cmd_remove_trigger(int argc, const char **argv) { + enum lttng_error_code ret_code; int ret; struct argpar_parse_ret argpar_parse_ret = {}; - const char *id = NULL; + const char *name = NULL; int i; struct lttng_triggers *triggers = NULL; unsigned int triggers_count; enum lttng_trigger_status trigger_status; const struct lttng_trigger *trigger_to_remove = NULL; - char *user_id = NULL; + char *owner_uid = NULL; long long uid; + struct mi_writer *mi_writer = NULL; + + if (lttng_opt_mi) { + mi_writer = mi_lttng_writer_create( + fileno(stdout), lttng_opt_mi); + if (!mi_writer) { + ret = CMD_ERROR; + goto error; + } + + /* Open command element. */ + ret = mi_lttng_writer_command_open(mi_writer, + mi_lttng_element_command_remove_trigger); + if (ret) { + ret = CMD_ERROR; + goto error; + } + + /* Open output element. */ + ret = mi_lttng_writer_open_element( + mi_writer, mi_lttng_element_command_output); + if (ret) { + ret = CMD_ERROR; + goto error; + } + } argpar_parse_ret = argpar_parse(argc - 1, argv + 1, remove_trigger_options, true); @@ -94,10 +122,10 @@ int cmd_remove_trigger(int argc, const char **argv) remove_trigger_options); ret = 0; goto end; - case OPT_USER_ID: + case OPT_OWNER_UID: { - if (!assign_string(&user_id, item_opt->arg, - "--user-id")) { + if (!assign_string(&owner_uid, item_opt->arg, + "--owner-uid")) { goto error; } break; @@ -109,27 +137,27 @@ int cmd_remove_trigger(int argc, const char **argv) const struct argpar_item_non_opt *item_non_opt = (const struct argpar_item_non_opt *) item; - if (id) { + if (name) { ERR("Unexpected argument '%s'", item_non_opt->arg); goto error; } - id = item_non_opt->arg; + name = item_non_opt->arg; } } - if (!id) { - ERR("Missing `id` argument."); + if (!name) { + ERR("Missing `name` argument."); goto error; } - if (user_id) { + if (owner_uid) { char *end; errno = 0; - uid = strtol(user_id, &end, 10); - if (end == user_id || *end != '\0' || errno != 0) { - ERR("Failed to parse `%s` as an integer.", user_id); + uid = strtol(owner_uid, &end, 10); + if (end == owner_uid || *end != '\0' || errno != 0) { + ERR("Failed to parse `%s` as an integer.", owner_uid); } } else { uid = geteuid(); @@ -151,30 +179,45 @@ int cmd_remove_trigger(int argc, const char **argv) trigger = lttng_triggers_get_at_index(triggers, i); trigger_status = lttng_trigger_get_name(trigger, &trigger_name); - assert(trigger_status == LTTNG_TRIGGER_STATUS_OK); + switch (trigger_status) { + case LTTNG_TRIGGER_STATUS_OK: + break; + case LTTNG_TRIGGER_STATUS_UNSET: + /* Don't compare against anonymous triggers. */ + continue; + default: + abort(); + } trigger_status = lttng_trigger_get_owner_uid( trigger, &trigger_uid); assert(trigger_status == LTTNG_TRIGGER_STATUS_OK); - if (trigger_uid == uid && strcmp(trigger_name, id) == 0) { + if (trigger_uid == uid && strcmp(trigger_name, name) == 0) { trigger_to_remove = trigger; break; } } if (!trigger_to_remove) { - ERR("Couldn't find trigger with id `%s`.", id); + ERR("Couldn't find trigger with name `%s`.", name); goto error; } ret = lttng_unregister_trigger(trigger_to_remove); if (ret != 0) { - ERR("Failed to unregister trigger `%s`.", id); + ERR("Failed to unregister trigger `%s`.", name); goto error; } - MSG("Removed trigger `%s`.", id); + if (lttng_opt_mi) { + ret_code = lttng_trigger_mi_serialize( + trigger_to_remove, mi_writer, NULL); + if (ret_code != LTTNG_OK) { + goto error; + } + } + MSG("Removed trigger `%s`.", name); ret = 0; goto end; @@ -183,9 +226,38 @@ error: ret = 1; end: + /* Mi closing. */ + if (lttng_opt_mi && mi_writer) { + /* Close output element. */ + int mi_ret = mi_lttng_writer_close_element(mi_writer); + if (mi_ret) { + ret = 1; + goto cleanup; + } + + mi_ret = mi_lttng_writer_write_element_bool(mi_writer, + mi_lttng_element_command_success, ret ? 0 : 1); + if (mi_ret) { + ret = 1; + goto cleanup; + } + + /* Command element close. */ + mi_ret = mi_lttng_writer_command_close(mi_writer); + if (mi_ret) { + ret = 1; + goto cleanup; + } + } + +cleanup: argpar_parse_ret_fini(&argpar_parse_ret); lttng_triggers_destroy(triggers); - free(user_id); + free(owner_uid); + if (mi_writer && mi_lttng_writer_destroy(mi_writer)) { + /* Preserve original error code. */ + ret = ret ? ret : CMD_ERROR; + } return ret; }