Force usage of assert() condition when NDEBUG is defined
[lttng-tools.git] / src / bin / lttng / commands / add_trigger.c
index 73bb0167c47949e1f2db5ee6bae826336915310a..6eaee74b274a56f80c3d474cab35835c332e3ceb 100644 (file)
 
 #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 <lttng/domain-internal.h>
 /* For lttng_event_rule_type_str(). */
 #include <lttng/event-rule/event-rule-internal.h>
 #include <lttng/lttng.h>
@@ -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;
 }
This page took 0.027255 seconds and 4 git commands to generate.