3 #include "../command.h"
5 #include "common/argpar/argpar.h"
7 #ifdef LTTNG_EMBED_HELP
8 static const char help_msg
[] =
9 #include <lttng-remove-trigger.1.h>
20 struct argpar_opt_descr remove_trigger_options
[] = {
21 { OPT_HELP
, 'h', "help", false },
22 { OPT_LIST_OPTIONS
, '\0', "list-options", false },
23 { OPT_USER_ID
, '\0', "user-id", true },
24 ARGPAR_OPT_DESCR_SENTINEL
,
28 bool assign_string(char **dest
, const char *src
, const char *opt_name
)
34 "Duplicate %s given.", opt_name
);
40 ERR("Failed to allocate %s string.", opt_name
);
54 int cmd_remove_trigger(int argc
, const char **argv
)
57 struct argpar_parse_ret argpar_parse_ret
= { 0 };
58 const char *id
= NULL
;
60 struct lttng_triggers
*triggers
= NULL
;
61 unsigned int triggers_count
;
62 enum lttng_trigger_status trigger_status
;
63 const struct lttng_trigger
*trigger_to_remove
= NULL
;
67 argpar_parse_ret
= argpar_parse(argc
- 1, argv
+ 1,
68 remove_trigger_options
, true);
69 if (!argpar_parse_ret
.items
) {
70 ERR("%s", argpar_parse_ret
.error
);
74 for (i
= 0; i
< argpar_parse_ret
.items
->n_items
; i
++) {
75 struct argpar_item
*item
= argpar_parse_ret
.items
->items
[i
];
77 if (item
->type
== ARGPAR_ITEM_TYPE_OPT
) {
78 struct argpar_item_opt
*item_opt
=
79 (struct argpar_item_opt
*) item
;
81 switch (item_opt
->descr
->id
) {
87 case OPT_LIST_OPTIONS
:
88 list_cmd_options_argpar(stdout
,
89 remove_trigger_options
);
95 if (!assign_string(&user_id
, item_opt
->arg
,
107 struct argpar_item_non_opt
*item_non_opt
=
108 (struct argpar_item_non_opt
*) item
;
111 ERR("Unexpected argument: %s", item_non_opt
->arg
);
115 id
= item_non_opt
->arg
;
120 ERR("Missing `id` argument.");
128 uid
= strtol(user_id
, &end
, 10);
129 if (end
== user_id
|| *end
!= '\0' || errno
!= 0) {
130 ERR("Failed to parse `%s` as an integer.", user_id
);
137 ret
= lttng_list_triggers(&triggers
);
138 if (ret
!= LTTNG_OK
) {
139 ERR("Failed to get the list of triggers.");
143 trigger_status
= lttng_triggers_get_count(triggers
, &triggers_count
);
144 assert(trigger_status
== LTTNG_TRIGGER_STATUS_OK
);
146 for (i
= 0; i
< triggers_count
; i
++) {
147 const struct lttng_trigger
*trigger
;
148 const char *trigger_name
;
151 trigger
= lttng_triggers_get_at_index(triggers
, i
);
152 trigger_status
= lttng_trigger_get_name(trigger
, &trigger_name
);
153 assert(trigger_status
== LTTNG_TRIGGER_STATUS_OK
);
155 trigger_status
= lttng_trigger_get_user_identity(
156 trigger
, &trigger_uid
);
157 assert(trigger_status
== LTTNG_TRIGGER_STATUS_OK
);
159 if (trigger_uid
== uid
&&
160 strcmp(trigger_name
, id
) == 0) {
161 trigger_to_remove
= trigger
;
166 if (!trigger_to_remove
) {
167 ERR("Couldn't find trigger with id `%s`.", id
);
171 ret
= lttng_unregister_trigger(trigger_to_remove
);
173 ERR("Failed to unregister trigger `%s`.", id
);
177 MSG("Removed trigger `%s`.", id
);
186 argpar_parse_ret_fini(&argpar_parse_ret
);
187 lttng_triggers_destroy(triggers
);