Cleanup: rename `get_domain_str()` -> `lttng_domain_type_str()`
[lttng-tools.git] / src / bin / lttng / commands / add_trigger.c
index 863e8fe1d629b765d43a0214b9e2760213f5ba97..8fb79d3786c577842475ea9724f92293ec591800 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>
@@ -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:
@@ -878,7 +878,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));
@@ -2189,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;
@@ -2281,7 +2306,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 +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;
@@ -2386,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);
@@ -2396,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.024723 seconds and 4 git commands to generate.