lttng: enable-event: wrap the use of poptContext into a unique_ptr
[lttng-tools.git] / src / bin / lttng / commands / enable_events.cpp
index 4f50083b74a7cd1a46e85342710a19a83916a715..2a74a15b4a5e4e8da7a2b9d5245fd12fc70aab94 100644 (file)
@@ -8,6 +8,7 @@
 #define _LGPL_SOURCE
 #include <common/compat/getenv.hpp>
 #include <common/compat/string.hpp>
+#include <common/make-unique-wrapper.hpp>
 #include <common/sessiond-comm/sessiond-comm.hpp>
 #include <common/string-utils/string-utils.hpp>
 #include <common/utils.hpp>
 #endif
 
 namespace {
+void _mi_lttng_writer_deleter_func(mi_writer *writer)
+{
+       if (writer && mi_lttng_writer_destroy(writer)) {
+               LTTNG_THROW_ERROR("Failed to destroy mi_writer instance");
+       }
+}
+
+using mi_writer_uptr = std::unique_ptr<
+       mi_writer,
+       lttng::memory::create_deleter_class<mi_writer, _mi_lttng_writer_deleter_func>::deleter>;
 
 int opt_event_type;
 const char *opt_loglevel;
@@ -54,6 +65,9 @@ char *opt_channel_name;
 char *opt_filter;
 char *opt_exclude;
 
+struct lttng_handle *handle;
+mi_writer_uptr writer;
+
 #ifdef LTTNG_EMBED_HELP
 static const char help_msg[] =
 #include <lttng-enable-event.1.h>
@@ -75,9 +89,6 @@ enum {
        OPT_EXCLUDE,
 };
 
-struct lttng_handle *handle;
-struct mi_writer *writer;
-
 struct poptOption long_options[] = {
        /* longName, shortName, argInfo, argPtr, value, descrip, argDesc */
        { "help", 'h', POPT_ARG_NONE, nullptr, OPT_HELP, nullptr, nullptr },
@@ -212,7 +223,7 @@ int mi_print_exclusion(const struct lttng_dynamic_pointer_array *exclusions)
                goto end;
        }
 
-       ret = mi_lttng_writer_open_element(writer, config_element_exclusions);
+       ret = mi_lttng_writer_open_element(writer.get(), config_element_exclusions);
        if (ret) {
                goto end;
        }
@@ -222,14 +233,14 @@ int mi_print_exclusion(const struct lttng_dynamic_pointer_array *exclusions)
                        (const char *) lttng_dynamic_pointer_array_get_pointer(exclusions, i);
 
                ret = mi_lttng_writer_write_element_string(
-                       writer, config_element_exclusion, exclusion);
+                       writer.get(), config_element_exclusion, exclusion);
                if (ret) {
                        goto end;
                }
        }
 
        /* Close exclusions element */
-       ret = mi_lttng_writer_close_element(writer);
+       ret = mi_lttng_writer_close_element(writer.get());
 
 end:
        return ret;
@@ -492,7 +503,7 @@ int enable_events(char *session_name, char *event_list)
        /* Prepare Mi */
        if (lttng_opt_mi) {
                /* Open a events element */
-               ret = mi_lttng_writer_open_element(writer, config_element_events);
+               ret = mi_lttng_writer_open_element(writer.get(), config_element_events);
                if (ret) {
                        ret = CMD_ERROR;
                        goto error;
@@ -752,7 +763,7 @@ int enable_events(char *session_name, char *event_list)
                                ev->enabled = 0;
                                success = 0;
                        }
-                       ret = mi_lttng_event(writer, ev, 1, handle->domain.type);
+                       ret = mi_lttng_event(writer.get(), ev, 1, handle->domain.type);
                        if (ret) {
                                ret = CMD_ERROR;
                                goto error;
@@ -767,14 +778,14 @@ int enable_events(char *session_name, char *event_list)
 
                        /* Success ? */
                        ret = mi_lttng_writer_write_element_bool(
-                               writer, mi_lttng_element_command_success, success);
+                               writer.get(), mi_lttng_element_command_success, success);
                        if (ret) {
                                ret = CMD_ERROR;
                                goto error;
                        }
 
                        /* Close event element */
-                       ret = mi_lttng_writer_close_element(writer);
+                       ret = mi_lttng_writer_close_element(writer.get());
                        if (ret) {
                                ret = CMD_ERROR;
                                goto error;
@@ -1144,7 +1155,7 @@ int enable_events(char *session_name, char *event_list)
                                ev->enabled = 1;
                        }
 
-                       ret = mi_lttng_event(writer, ev, 1, handle->domain.type);
+                       ret = mi_lttng_event(writer.get(), ev, 1, handle->domain.type);
                        if (ret) {
                                ret = CMD_ERROR;
                                goto error;
@@ -1159,14 +1170,14 @@ int enable_events(char *session_name, char *event_list)
 
                        /* Success ? */
                        ret = mi_lttng_writer_write_element_bool(
-                               writer, mi_lttng_element_command_success, success);
+                               writer.get(), mi_lttng_element_command_success, success);
                        if (ret) {
                                ret = CMD_ERROR;
                                goto end;
                        }
 
                        /* Close event element */
-                       ret = mi_lttng_writer_close_element(writer);
+                       ret = mi_lttng_writer_close_element(writer.get());
                        if (ret) {
                                ret = CMD_ERROR;
                                goto end;
@@ -1183,7 +1194,7 @@ end:
        /* Close Mi */
        if (lttng_opt_mi) {
                /* Close events element */
-               ret = mi_lttng_writer_close_element(writer);
+               ret = mi_lttng_writer_close_element(writer.get());
                if (ret) {
                        ret = CMD_ERROR;
                        goto error;
@@ -1209,6 +1220,11 @@ error:
        return ret;
 }
 
+void _poptContextFree_deleter_func(poptContext ctx)
+{
+       poptFreeContext(ctx);
+}
+
 } /* namespace */
 
 int validate_exclusion_list(const char *event_name,
@@ -1263,20 +1279,20 @@ end:
 int cmd_enable_events(int argc, const char **argv)
 {
        int opt, ret = CMD_SUCCESS, command_ret = CMD_SUCCESS, success = 1;
-       static poptContext pc;
        char *session_name = nullptr;
        char *event_list = nullptr;
        const char *arg_event_list = nullptr;
        const char *leftover = nullptr;
        int event_type = -1;
 
-       pc = poptGetContext(nullptr, argc, argv, long_options, 0);
-       poptReadDefaultConfig(pc, 0);
+       auto pc = lttng::make_unique_wrapper<poptContext_s, _poptContextFree_deleter_func>(
+               poptGetContext(nullptr, argc, argv, long_options, 0));
+       poptReadDefaultConfig(pc.get(), 0);
 
        /* Default event type */
        opt_event_type = LTTNG_EVENT_ALL;
 
-       while ((opt = poptGetNextOpt(pc)) != -1) {
+       while ((opt = poptGetNextOpt(pc.get())) != -1) {
                switch (opt) {
                case OPT_HELP:
                        SHOW_HELP();
@@ -1301,11 +1317,11 @@ int cmd_enable_events(int argc, const char **argv)
                        break;
                case OPT_LOGLEVEL:
                        opt_loglevel_type = LTTNG_EVENT_LOGLEVEL_RANGE;
-                       opt_loglevel = poptGetOptArg(pc);
+                       opt_loglevel = poptGetOptArg(pc.get());
                        break;
                case OPT_LOGLEVEL_ONLY:
                        opt_loglevel_type = LTTNG_EVENT_LOGLEVEL_SINGLE;
-                       opt_loglevel = poptGetOptArg(pc);
+                       opt_loglevel = poptGetOptArg(pc.get());
                        break;
                case OPT_LIST_OPTIONS:
                        list_cmd_options(stdout, long_options);
@@ -1340,28 +1356,29 @@ int cmd_enable_events(int argc, const char **argv)
 
        /* Mi check */
        if (lttng_opt_mi) {
-               writer = mi_lttng_writer_create(fileno(stdout), lttng_opt_mi);
+               writer = mi_writer_uptr(mi_lttng_writer_create(fileno(stdout), lttng_opt_mi));
                if (!writer) {
                        ret = -LTTNG_ERR_NOMEM;
                        goto end;
                }
 
                /* Open command element */
-               ret = mi_lttng_writer_command_open(writer, mi_lttng_element_command_enable_event);
+               ret = mi_lttng_writer_command_open(writer.get(),
+                                                  mi_lttng_element_command_enable_event);
                if (ret) {
                        ret = CMD_ERROR;
                        goto end;
                }
 
                /* Open output element */
-               ret = mi_lttng_writer_open_element(writer, mi_lttng_element_command_output);
+               ret = mi_lttng_writer_open_element(writer.get(), mi_lttng_element_command_output);
                if (ret) {
                        ret = CMD_ERROR;
                        goto end;
                }
        }
 
-       arg_event_list = poptGetArg(pc);
+       arg_event_list = poptGetArg(pc.get());
        if (arg_event_list == nullptr && opt_enable_all == 0) {
                ERR("Missing event name(s).");
                ret = CMD_ERROR;
@@ -1377,7 +1394,7 @@ int cmd_enable_events(int argc, const char **argv)
                }
        }
 
-       leftover = poptGetArg(pc);
+       leftover = poptGetArg(pc.get());
        if (leftover) {
                ERR("Unknown argument: %s", leftover);
                ret = CMD_ERROR;
@@ -1405,21 +1422,21 @@ mi_closing:
        /* Mi closing */
        if (lttng_opt_mi) {
                /* Close  output element */
-               ret = mi_lttng_writer_close_element(writer);
+               ret = mi_lttng_writer_close_element(writer.get());
                if (ret) {
                        ret = CMD_ERROR;
                        goto end;
                }
 
                ret = mi_lttng_writer_write_element_bool(
-                       writer, mi_lttng_element_command_success, success);
+                       writer.get(), mi_lttng_element_command_success, success);
                if (ret) {
                        ret = CMD_ERROR;
                        goto end;
                }
 
                /* Command element close */
-               ret = mi_lttng_writer_command_close(writer);
+               ret = mi_lttng_writer_command_close(writer.get());
                if (ret) {
                        ret = CMD_ERROR;
                        goto end;
@@ -1427,12 +1444,6 @@ mi_closing:
        }
 
 end:
-       /* Mi clean-up */
-       if (writer && mi_lttng_writer_destroy(writer)) {
-               /* Preserve original error code */
-               ret = ret ? ret : LTTNG_ERR_MI_IO_FAIL;
-       }
-
        if (opt_session_name == nullptr) {
                free(session_name);
        }
@@ -1441,7 +1452,5 @@ end:
 
        /* Overwrite ret if an error occurred in enable_events */
        ret = command_ret ? command_ret : ret;
-
-       poptFreeContext(pc);
        return ret;
 }
This page took 0.027481 seconds and 4 git commands to generate.