X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Fbin%2Flttng%2Fcommands%2Fadd_trigger.c;h=27f6cc8c6e3312f7315ce4df59a09543f08e4057;hb=81663f073dbfb4b61c06a0ceb8ca33c4fc41b1c5;hp=863e8fe1d629b765d43a0214b9e2760213f5ba97;hpb=695f70446965aeac8b1118bb08d572630c96114d;p=lttng-tools.git diff --git a/src/bin/lttng/commands/add_trigger.c b/src/bin/lttng/commands/add_trigger.c index 863e8fe1d..27f6cc8c6 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 @@ -130,8 +132,6 @@ bool assign_event_rule_type(enum lttng_event_rule_type *dest, const char *arg) *dest = LTTNG_EVENT_RULE_TYPE_KERNEL_KPROBE; } else if (strcmp(arg, "kernel:uprobe") == 0) { *dest = LTTNG_EVENT_RULE_TYPE_KERNEL_UPROBE; - } else if (strcmp(arg, "function") == 0) { - *dest = LTTNG_EVENT_RULE_TYPE_KERNEL_FUNCTION; } else if (has_syscall_prefix(arg)) { /* * Matches the following: @@ -437,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) : @@ -462,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 @@ -560,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: @@ -609,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) { @@ -706,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 = @@ -832,7 +832,8 @@ struct parse_event_rule_res parse_event_rule(int *argc, const char ***argv) } if (event_rule_type == LTTNG_EVENT_RULE_TYPE_UNKNOWN) { - event_rule_type = LTTNG_EVENT_RULE_TYPE_USER_TRACEPOINT; + ERR("Event rule requires a --type."); + goto error; } /* @@ -878,7 +879,6 @@ struct parse_event_rule_res parse_event_rule(int *argc, const char ***argv) switch (event_rule_type) { case LTTNG_EVENT_RULE_TYPE_KERNEL_KPROBE: case LTTNG_EVENT_RULE_TYPE_KERNEL_UPROBE: - case LTTNG_EVENT_RULE_TYPE_KERNEL_FUNCTION: if (!location) { ERR("Event rule of type %s requires a --location.", lttng_event_rule_type_str(event_rule_type)); @@ -910,7 +910,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; @@ -1239,7 +1239,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."); @@ -1385,8 +1385,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) { @@ -1467,7 +1467,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 ':'. */ @@ -1565,7 +1565,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 = @@ -1586,7 +1586,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; @@ -1653,8 +1653,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 }, @@ -1683,7 +1683,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; @@ -1842,7 +1842,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 = @@ -1899,7 +1899,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; @@ -2189,9 +2189,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; @@ -2217,7 +2243,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 = @@ -2281,7 +2307,7 @@ int cmd_add_trigger(int argc, const char **argv) goto error; } - /* Ownership of the action was transferred to the group. */ + /* Ownership of the action was transferred to the list. */ action = NULL; break; @@ -2377,7 +2403,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; @@ -2386,6 +2429,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); @@ -2396,5 +2466,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; }