X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Fbin%2Flttng%2Fcommands%2Fadd_trigger.c;h=6eaee74b274a56f80c3d474cab35835c332e3ceb;hb=a0377dfefe40662ba7d68617bce6ff467114136c;hp=73bb0167c47949e1f2db5ee6bae826336915310a;hpb=a8940c5eb1046e84c10bb0cf72c0f2575a8c9e4e;p=lttng-tools.git diff --git a/src/bin/lttng/commands/add_trigger.c b/src/bin/lttng/commands/add_trigger.c index 73bb0167c..6eaee74b2 100644 --- a/src/bin/lttng/commands/add_trigger.c +++ b/src/bin/lttng/commands/add_trigger.c @@ -15,8 +15,10 @@ #include "common/argpar/argpar.h" #include "common/dynamic-array.h" +#include "common/mi-lttng.h" #include "common/string-utils/string-utils.h" #include "common/utils.h" +#include /* For lttng_event_rule_type_str(). */ #include #include @@ -435,10 +437,10 @@ struct lttng_event_expr *ir_op_load_expr_to_event_expr( const char *field_name; load_expr_op = load_expr_op->next; - assert(load_expr_op); - assert(load_expr_op->type == IR_LOAD_EXPRESSION_GET_SYMBOL); + LTTNG_ASSERT(load_expr_op); + LTTNG_ASSERT(load_expr_op->type == IR_LOAD_EXPRESSION_GET_SYMBOL); field_name = load_expr_op->u.symbol; - assert(field_name); + LTTNG_ASSERT(field_name); event_expr = load_expr_child_type == IR_LOAD_EXPRESSION_GET_PAYLOAD_ROOT ? lttng_event_expr_event_payload_field_create(field_name) : @@ -460,10 +462,10 @@ struct lttng_event_expr *ir_op_load_expr_to_event_expr( const char *field_name; load_expr_op = load_expr_op->next; - assert(load_expr_op); - assert(load_expr_op->type == IR_LOAD_EXPRESSION_GET_SYMBOL); + LTTNG_ASSERT(load_expr_op); + LTTNG_ASSERT(load_expr_op->type == IR_LOAD_EXPRESSION_GET_SYMBOL); field_name = load_expr_op->u.symbol; - assert(field_name); + LTTNG_ASSERT(field_name); /* * The field name needs to be of the form PROVIDER:TYPE. We @@ -558,7 +560,7 @@ struct lttng_event_expr *ir_op_load_to_event_expr( { struct lttng_event_expr *event_expr = NULL; - assert(ir->op == IR_OP_LOAD); + LTTNG_ASSERT(ir->op == IR_OP_LOAD); switch (ir->data_type) { case IR_DATA_EXPRESSION: @@ -607,7 +609,7 @@ struct lttng_event_expr *ir_op_root_to_event_expr(const struct ir_op *ir, { struct lttng_event_expr *event_expr = NULL; - assert(ir->op == IR_OP_ROOT); + LTTNG_ASSERT(ir->op == IR_OP_ROOT); ir = ir->u.root.child; switch (ir->op) { @@ -704,7 +706,7 @@ struct parse_event_rule_res parse_event_rule(int *argc, const char ***argv) break; } - assert(status == ARGPAR_STATE_PARSE_NEXT_STATUS_OK); + LTTNG_ASSERT(status == ARGPAR_STATE_PARSE_NEXT_STATUS_OK); if (item->type == ARGPAR_ITEM_TYPE_OPT) { const struct argpar_item_opt *item_opt = @@ -907,7 +909,7 @@ struct parse_event_rule_res parse_event_rule(int *argc, const char ***argv) * Update *argc and *argv so our caller can keep parsing what follows. */ consumed_args = argpar_state_get_ingested_orig_args(state); - assert(consumed_args >= 0); + LTTNG_ASSERT(consumed_args >= 0); *argc -= consumed_args; *argv += consumed_args; @@ -1236,7 +1238,7 @@ struct parse_event_rule_res parse_event_rule(int *argc, const char ***argv) goto error; } - assert(kernel_probe_location); + LTTNG_ASSERT(kernel_probe_location); res.er = lttng_event_rule_kernel_kprobe_create(kernel_probe_location); if (!res.er) { ERR("Failed to create kprobe event rule."); @@ -1382,8 +1384,8 @@ struct lttng_condition *handle_condition_event(int *argc, const char ***argv) lttng_dynamic_array_get_element( &res.capture_descriptors.array, i); - assert(expr); - assert(*expr); + LTTNG_ASSERT(expr); + LTTNG_ASSERT(*expr); status = lttng_condition_event_rule_matches_append_capture_descriptor( c, *expr); if (status != LTTNG_CONDITION_STATUS_OK) { @@ -1464,7 +1466,7 @@ static struct lttng_rate_policy *parse_rate_policy(const char *policy_str) char *policy_type_str; char *policy_value_str; - assert(policy_str); + LTTNG_ASSERT(policy_str); lttng_dynamic_pointer_array_init(&tokens, NULL); /* Rate policy fields are separated by ':'. */ @@ -1562,7 +1564,7 @@ struct lttng_action *handle_action_notify(int *argc, const char ***argv) break; } - assert(status == ARGPAR_STATE_PARSE_NEXT_STATUS_OK); + LTTNG_ASSERT(status == ARGPAR_STATE_PARSE_NEXT_STATUS_OK); if (item->type == ARGPAR_ITEM_TYPE_OPT) { const struct argpar_item_opt *item_opt = @@ -1583,7 +1585,7 @@ struct lttng_action *handle_action_notify(int *argc, const char ***argv) } else { const struct argpar_item_non_opt *item_non_opt; - assert(item->type == ARGPAR_ITEM_TYPE_NON_OPT); + LTTNG_ASSERT(item->type == ARGPAR_ITEM_TYPE_NON_OPT); item_non_opt = (const struct argpar_item_non_opt *) item; @@ -1650,8 +1652,8 @@ static struct lttng_action *handle_action_simple_session_with_policy(int *argc, enum lttng_action_status action_status; struct lttng_rate_policy *policy = NULL; - assert(set_session_name_cb); - assert(set_rate_policy_cb); + LTTNG_ASSERT(set_session_name_cb); + LTTNG_ASSERT(set_rate_policy_cb); const struct argpar_opt_descr rate_policy_opt_descrs[] = { { OPT_RATE_POLICY, '\0', "rate-policy", true }, @@ -1680,7 +1682,7 @@ static struct lttng_action *handle_action_simple_session_with_policy(int *argc, break; } - assert(status == ARGPAR_STATE_PARSE_NEXT_STATUS_OK); + LTTNG_ASSERT(status == ARGPAR_STATE_PARSE_NEXT_STATUS_OK); if (item->type == ARGPAR_ITEM_TYPE_OPT) { const struct argpar_item_opt *item_opt = (const struct argpar_item_opt *) item; @@ -1839,7 +1841,7 @@ struct lttng_action *handle_action_snapshot_session(int *argc, break; } - assert(status == ARGPAR_STATE_PARSE_NEXT_STATUS_OK); + LTTNG_ASSERT(status == ARGPAR_STATE_PARSE_NEXT_STATUS_OK); if (item->type == ARGPAR_ITEM_TYPE_OPT) { const struct argpar_item_opt *item_opt = @@ -1896,7 +1898,7 @@ struct lttng_action *handle_action_snapshot_session(int *argc, } else { const struct argpar_item_non_opt *item_non_opt; - assert(item->type == ARGPAR_ITEM_TYPE_NON_OPT); + LTTNG_ASSERT(item->type == ARGPAR_ITEM_TYPE_NON_OPT); item_non_opt = (const struct argpar_item_non_opt *) item; @@ -2186,9 +2188,35 @@ int cmd_add_trigger(int argc, const char **argv) int i; char *owner_uid = NULL; enum lttng_error_code ret_code; + struct mi_writer *mi_writer = NULL; lttng_dynamic_pointer_array_init(&actions, lttng_actions_destructor); + 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_add_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; + } + } + while (true) { enum argpar_state_parse_next_status status; const struct argpar_item_opt *item_opt; @@ -2214,7 +2242,7 @@ int cmd_add_trigger(int argc, const char **argv) break; } - assert(status == ARGPAR_STATE_PARSE_NEXT_STATUS_OK); + LTTNG_ASSERT(status == ARGPAR_STATE_PARSE_NEXT_STATUS_OK); if (argpar_item->type == ARGPAR_ITEM_TYPE_NON_OPT) { const struct argpar_item_non_opt *item_non_opt = @@ -2374,7 +2402,24 @@ int cmd_add_trigger(int argc, const char **argv) goto error; } - MSG("Trigger registered successfully."); + if (lttng_opt_mi) { + ret_code = lttng_trigger_mi_serialize(trigger, mi_writer, NULL); + if (ret_code != LTTNG_OK) { + goto error; + } + } else { + const char *returned_trigger_name; + const enum lttng_trigger_status trigger_status = + lttng_trigger_get_name(trigger, + &returned_trigger_name); + + if (trigger_status != LTTNG_TRIGGER_STATUS_OK) { + WARN("Failed to retrieve the added trigger's name."); + } else { + MSG("Added trigger `%s`.", returned_trigger_name); + } + } + ret = 0; goto end; @@ -2383,6 +2428,33 @@ error: ret = 1; end: + /* Mi closing. */ + if (lttng_opt_mi && mi_writer) { + int mi_ret; + + /* Close output element. */ + 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_state_destroy(argpar_state); argpar_item_destroy(argpar_item); lttng_dynamic_pointer_array_reset(&actions); @@ -2393,5 +2465,10 @@ end: free(error); free(name); free(owner_uid); + if (mi_writer && mi_lttng_writer_destroy(mi_writer)) { + /* Preserve original error code. */ + ret = ret ? ret : CMD_ERROR; + } + return ret; }