cli: make config cli args functions return a status enum
authorSimon Marchi <simon.marchi@efficios.com>
Mon, 9 Aug 2021 15:55:58 +0000 (11:55 -0400)
committerSimon Marchi <simon.marchi@efficios.com>
Fri, 27 Aug 2021 01:28:02 +0000 (21:28 -0400)
The retcode returned by functions that create a bt_config from CLI args
is not very intuitive.  Replace that by a proper status enum.  Change
those functions to return the status as their return value, and return
the bt_config through an out parameter (only if the returned status is
BT_CONFIG_CLI_ARGS_STATUS_OK).

Change-Id: I2f273a6e28bcd0322a1b7ddd303639a696043872
Reviewed-on: https://review.lttng.org/c/babeltrace/+/6278
Reviewed-by: Simon Marchi <simon.marchi@efficios.com>
src/cli/babeltrace2-cfg-cli-args-default.c
src/cli/babeltrace2-cfg-cli-args-default.h
src/cli/babeltrace2-cfg-cli-args.c
src/cli/babeltrace2-cfg-cli-args.h
src/cli/babeltrace2.c

index e75b187178ee18d76a69bf5a857a6f205b1f3700..0e657720bc5788a489a047d4bc0f8daddb344ca2 100644 (file)
 
 #ifdef BT_SET_DEFAULT_IN_TREE_CONFIGURATION
 
-struct bt_config *bt_config_cli_args_create_with_default(int argc,
-               const char *argv[], int *retcode,
+enum bt_config_cli_args_status bt_config_cli_args_create_with_default(int argc,
+               const char *argv[], struct bt_config **cfg,
                const bt_interrupter *interrupter)
 {
+       enum bt_config_cli_args_status status;
        bt_value *initial_plugin_paths;
-       struct bt_config *cfg = NULL;
        int ret;
 
        initial_plugin_paths = bt_value_array_create();
@@ -49,26 +49,25 @@ struct bt_config *bt_config_cli_args_create_with_default(int argc,
        g_setenv("LIBBABELTRACE2_PLUGIN_PROVIDER_DIR", "/nonexistent", 0);
 #endif
 
-       cfg = bt_config_cli_args_create(argc, argv, retcode, true, true,
+       status = bt_config_cli_args_create(argc, argv, cfg, true, true,
                initial_plugin_paths, interrupter);
        goto end;
 
 error:
-       *retcode = 1;
-       BT_OBJECT_PUT_REF_AND_RESET(cfg);
+       status = BT_CONFIG_CLI_ARGS_STATUS_ERROR;
 
 end:
        bt_value_put_ref(initial_plugin_paths);
-       return cfg;
+       return status;
 }
 
 #else /* BT_SET_DEFAULT_IN_TREE_CONFIGURATION */
 
-struct bt_config *bt_config_cli_args_create_with_default(int argc,
-               const char *argv[], int *retcode,
+enum bt_config_cli_args_status bt_config_cli_args_create_with_default(int argc,
+               const char *argv[], struct bt_config **cfg,
                const bt_interrupter *interrupter)
 {
-       return bt_config_cli_args_create(argc, argv, retcode, false, false,
+       return bt_config_cli_args_create(argc, argv, cfg, false, false,
                NULL, interrupter);
 }
 
index 793bb431980e3876f2348b731c0426a003148001..61927ba0d0113c6e1c67d2e17c55bb4356a1a9f9 100644 (file)
@@ -11,8 +11,8 @@
 
 #include "babeltrace2-cfg.h"
 
-struct bt_config *bt_config_cli_args_create_with_default(int argc,
-               const char *argv[], int *retcode,
+enum bt_config_cli_args_status bt_config_cli_args_create_with_default(int argc,
+               const char *argv[], struct bt_config **cfg,
                const bt_interrupter *interrupter);
 
 #endif /* CLI_BABELTRACE_CFG_CLI_ARGS_DEFAULT_H */
index 1d6dda97c5ee9b30661b9c3605311977c5411d8a..6c187b4f12df7a7b0c2a7b2b88d231138d4c4f2b 100644 (file)
@@ -1158,10 +1158,11 @@ end:
 }
 
 static
-struct bt_config *bt_config_print_ctf_metadata_create(
-               const bt_value *plugin_paths)
+enum bt_config_cli_args_status bt_config_print_ctf_metadata_create(
+               const bt_value *plugin_paths, struct bt_config **cfg_out)
 {
        struct bt_config *cfg;
+       enum bt_config_cli_args_status status;
 
        /* Create config */
        cfg = bt_config_base_create(BT_CONFIG_COMMAND_PRINT_CTF_METADATA,
@@ -1182,20 +1183,24 @@ struct bt_config *bt_config_print_ctf_metadata_create(
                goto error;
        }
 
+       BT_OBJECT_MOVE_REF(*cfg_out, cfg);
+       status = BT_CONFIG_CLI_ARGS_STATUS_OK;
        goto end;
 
 error:
-       BT_OBJECT_PUT_REF_AND_RESET(cfg);
+       status = BT_CONFIG_CLI_ARGS_STATUS_ERROR;
 
 end:
-       return cfg;
+       bt_object_put_ref(cfg);
+       return status;
 }
 
 static
-struct bt_config *bt_config_print_lttng_live_sessions_create(
-               const bt_value *plugin_paths)
+enum bt_config_cli_args_status bt_config_print_lttng_live_sessions_create(
+               const bt_value *plugin_paths, struct bt_config **cfg_out)
 {
        struct bt_config *cfg;
+       enum bt_config_cli_args_status status;
 
        /* Create config */
        cfg = bt_config_base_create(BT_CONFIG_COMMAND_PRINT_LTTNG_LIVE_SESSIONS,
@@ -1217,13 +1222,16 @@ struct bt_config *bt_config_print_lttng_live_sessions_create(
                goto error;
        }
 
+       BT_OBJECT_MOVE_REF(*cfg_out, cfg);
+       status = BT_CONFIG_CLI_ARGS_STATUS_OK;
        goto end;
 
 error:
-       BT_OBJECT_PUT_REF_AND_RESET(cfg);
+       status = BT_CONFIG_CLI_ARGS_STATUS_ERROR;
 
 end:
-       return cfg;
+       bt_object_put_ref(cfg);
+       return status;
 }
 
 static
@@ -1467,15 +1475,15 @@ const struct argpar_opt_descr help_options[] = {
 /*
  * Creates a Babeltrace config object from the arguments of a help
  * command.
- *
- * *retcode is set to the appropriate exit code to use.
  */
 static
-struct bt_config *bt_config_help_from_args(int argc, const char *argv[],
-               int *retcode, const bt_value *plugin_paths,
-               int default_log_level, unsigned int consumed_args)
+enum bt_config_cli_args_status bt_config_help_from_args(int argc,
+               const char *argv[], struct bt_config **cfg_out,
+               const bt_value *plugin_paths, int default_log_level,
+               unsigned int consumed_args)
 {
-       struct bt_config *cfg = NULL;
+       enum bt_config_cli_args_status status;
+       struct bt_config *cfg;
        const char *plugin_comp_cls_arg = NULL;
        char *plugin_name = NULL, *comp_cls_name = NULL;
        GString *substring = NULL;
@@ -1483,7 +1491,6 @@ struct bt_config *bt_config_help_from_args(int argc, const char *argv[],
        struct argpar_iter *argpar_iter = NULL;
        const struct argpar_item *argpar_item = NULL;
 
-       *retcode = 0;
        cfg = bt_config_help_create(plugin_paths, default_log_level);
        if (!cfg) {
                goto error;
@@ -1496,13 +1503,13 @@ struct bt_config *bt_config_help_from_args(int argc, const char *argv[],
        }
 
        while (true) {
-               enum parse_next_item_status status =
+               enum parse_next_item_status parse_status =
                        parse_next_item(argpar_iter, &argpar_item, argv, "help",
                                consumed_args);
 
-               if (status == PARSE_NEXT_ITEM_STATUS_ERROR) {
+               if (parse_status == PARSE_NEXT_ITEM_STATUS_ERROR) {
                        goto error;
-               } else if (status == PARSE_NEXT_ITEM_STATUS_END) {
+               } else if (parse_status == PARSE_NEXT_ITEM_STATUS_END) {
                        break;
                }
 
@@ -1513,8 +1520,7 @@ struct bt_config *bt_config_help_from_args(int argc, const char *argv[],
                        switch (opt_descr->id) {
                        case OPT_HELP:
                                print_help_usage(stdout);
-                               *retcode = -1;
-                               BT_OBJECT_PUT_REF_AND_RESET(cfg);
+                               status = BT_CONFIG_CLI_ARGS_STATUS_INFO_ONLY;
                                goto end;
                        default:
                                bt_common_abort();
@@ -1570,11 +1576,12 @@ struct bt_config *bt_config_help_from_args(int argc, const char *argv[],
                        comp_cls_name);
        }
 
+       BT_OBJECT_MOVE_REF(*cfg_out, cfg);
+       status = BT_CONFIG_CLI_ARGS_STATUS_OK;
        goto end;
 
 error:
-       *retcode = 1;
-       BT_OBJECT_PUT_REF_AND_RESET(cfg);
+       status = BT_CONFIG_CLI_ARGS_STATUS_ERROR;
 
 end:
        g_free(plugin_name);
@@ -1586,8 +1593,9 @@ end:
 
        argpar_iter_destroy(argpar_iter);
        argpar_item_destroy(argpar_item);
+       bt_object_put_ref(cfg);
 
-       return cfg;
+       return status;
 }
 
 /*
@@ -1618,14 +1626,14 @@ const struct argpar_opt_descr query_options[] = {
 /*
  * Creates a Babeltrace config object from the arguments of a query
  * command.
- *
- * *retcode is set to the appropriate exit code to use.
  */
 static
-struct bt_config *bt_config_query_from_args(int argc, const char *argv[],
-               int *retcode, const bt_value *plugin_paths,
-               int default_log_level, unsigned int consumed_args)
+enum bt_config_cli_args_status bt_config_query_from_args(int argc,
+               const char *argv[], struct bt_config **cfg_out,
+               const bt_value *plugin_paths, int default_log_level,
+               unsigned int consumed_args)
 {
+       enum bt_config_cli_args_status status;
        struct bt_config *cfg = NULL;
        const char *component_class_spec = NULL;
        const char *query_object = NULL;
@@ -1639,7 +1647,6 @@ struct bt_config *bt_config_query_from_args(int argc, const char *argv[],
                goto error;
        }
 
-       *retcode = 0;
        cfg = bt_config_query_create(plugin_paths);
        if (!cfg) {
                goto error;
@@ -1658,13 +1665,13 @@ struct bt_config *bt_config_query_from_args(int argc, const char *argv[],
        }
 
        while (true) {
-               enum parse_next_item_status status =
+               enum parse_next_item_status parse_status =
                        parse_next_item(argpar_iter, &argpar_item, argv, "query",
                                consumed_args);
 
-               if (status == PARSE_NEXT_ITEM_STATUS_ERROR) {
+               if (parse_status == PARSE_NEXT_ITEM_STATUS_ERROR) {
                        goto error;
-               } else if (status == PARSE_NEXT_ITEM_STATUS_END) {
+               } else if (parse_status == PARSE_NEXT_ITEM_STATUS_END) {
                        break;
                }
 
@@ -1676,8 +1683,7 @@ struct bt_config *bt_config_query_from_args(int argc, const char *argv[],
                        switch (opt_descr->id) {
                        case OPT_HELP:
                                print_query_usage(stdout);
-                               *retcode = -1;
-                               BT_OBJECT_PUT_REF_AND_RESET(cfg);
+                               status = BT_CONFIG_CLI_ARGS_STATUS_INFO_ONLY;
                                goto end;
                        case OPT_PARAMS:
                        {
@@ -1723,8 +1729,7 @@ struct bt_config *bt_config_query_from_args(int argc, const char *argv[],
 
        if (!component_class_spec || !query_object) {
                print_query_usage(stdout);
-               *retcode = -1;
-               BT_OBJECT_PUT_REF_AND_RESET(cfg);
+               status = BT_CONFIG_CLI_ARGS_STATUS_INFO_ONLY;
                goto end;
        }
 
@@ -1746,11 +1751,12 @@ struct bt_config *bt_config_query_from_args(int argc, const char *argv[],
        }
 
        g_string_assign(cfg->cmd_data.query.object, query_object);
+       BT_OBJECT_MOVE_REF(*cfg_out, cfg);
+       status = BT_CONFIG_CLI_ARGS_STATUS_OK;
        goto end;
 
 error:
-       *retcode = 1;
-       BT_OBJECT_PUT_REF_AND_RESET(cfg);
+       status = BT_CONFIG_CLI_ARGS_STATUS_ERROR;
 
 end:
        argpar_iter_destroy(argpar_iter);
@@ -1761,7 +1767,9 @@ end:
        }
 
        bt_value_put_ref(params);
-       return cfg;
+       bt_object_put_ref(cfg);
+
+       return status;
 }
 
 /*
@@ -1791,18 +1799,17 @@ const struct argpar_opt_descr list_plugins_options[] = {
 /*
  * Creates a Babeltrace config object from the arguments of a
  * list-plugins command.
- *
- * *retcode is set to the appropriate exit code to use.
  */
 static
-struct bt_config *bt_config_list_plugins_from_args(int argc, const char *argv[],
-               int *retcode, const bt_value *plugin_paths, unsigned int consumed_args)
+enum bt_config_cli_args_status bt_config_list_plugins_from_args(int argc,
+               const char *argv[], struct bt_config **cfg_out,
+               const bt_value *plugin_paths, unsigned int consumed_args)
 {
+       enum bt_config_cli_args_status status;
        struct bt_config *cfg = NULL;
        struct argpar_iter *argpar_iter = NULL;
        const struct argpar_item *argpar_item = NULL;
 
-       *retcode = 0;
        cfg = bt_config_list_plugins_create(plugin_paths);
        if (!cfg) {
                goto error;
@@ -1815,13 +1822,13 @@ struct bt_config *bt_config_list_plugins_from_args(int argc, const char *argv[],
        }
 
        while (true) {
-               enum parse_next_item_status status =
+               enum parse_next_item_status parse_status =
                        parse_next_item(argpar_iter, &argpar_item, argv, "list-plugins",
                                consumed_args);
 
-               if (status == PARSE_NEXT_ITEM_STATUS_ERROR) {
+               if (parse_status == PARSE_NEXT_ITEM_STATUS_ERROR) {
                        goto error;
-               } else if (status == PARSE_NEXT_ITEM_STATUS_END) {
+               } else if (parse_status == PARSE_NEXT_ITEM_STATUS_END) {
                        break;
                }
 
@@ -1832,8 +1839,7 @@ struct bt_config *bt_config_list_plugins_from_args(int argc, const char *argv[],
                        switch (opt_descr->id) {
                        case OPT_HELP:
                                print_list_plugins_usage(stdout);
-                               *retcode = -1;
-                               BT_OBJECT_PUT_REF_AND_RESET(cfg);
+                               status = BT_CONFIG_CLI_ARGS_STATUS_INFO_ONLY;
                                goto end;
                        default:
                                bt_common_abort();
@@ -1846,17 +1852,19 @@ struct bt_config *bt_config_list_plugins_from_args(int argc, const char *argv[],
                }
                }
 
+       BT_OBJECT_MOVE_REF(*cfg_out, cfg);
+       status = BT_CONFIG_CLI_ARGS_STATUS_OK;
        goto end;
 
 error:
-       *retcode = 1;
-       BT_OBJECT_PUT_REF_AND_RESET(cfg);
+       status = BT_CONFIG_CLI_ARGS_STATUS_ERROR;
 
 end:
        argpar_iter_destroy(argpar_iter);
        argpar_item_destroy(argpar_item);
+       bt_object_put_ref(cfg);
 
-       return cfg;
+       return status;
 }
 
 /*
@@ -1934,14 +1942,13 @@ void print_run_usage(FILE *fp)
 /*
  * Creates a Babeltrace config object from the arguments of a run
  * command.
- *
- * *retcode is set to the appropriate exit code to use.
  */
 static
-struct bt_config *bt_config_run_from_args(int argc, const char *argv[],
-               int *retcode, const bt_value *plugin_paths,
+enum bt_config_cli_args_status bt_config_run_from_args(int argc, const char *argv[],
+               struct bt_config **cfg_out, const bt_value *plugin_paths,
                int default_log_level, unsigned int consumed_args)
 {
+       enum bt_config_cli_args_status status;
        struct bt_config_component *cur_cfg_comp = NULL;
        bt_value *cur_base_params = NULL;
        int ret = 0;
@@ -1967,8 +1974,6 @@ struct bt_config *bt_config_run_from_args(int argc, const char *argv[],
                ARGPAR_OPT_DESCR_SENTINEL
        };
 
-       *retcode = 0;
-
        error_str = g_string_new(NULL);
        if (!error_str) {
                BT_CLI_LOGE_APPEND_CAUSE_OOM();
@@ -1977,7 +1982,7 @@ struct bt_config *bt_config_run_from_args(int argc, const char *argv[],
 
        if (argc < 1) {
                print_run_usage(stdout);
-               *retcode = -1;
+               status = BT_CONFIG_CLI_ARGS_STATUS_INFO_ONLY;
                goto end;
        }
 
@@ -2012,15 +2017,15 @@ struct bt_config *bt_config_run_from_args(int argc, const char *argv[],
        }
 
        while (true) {
-               enum parse_next_item_status status;
+               enum parse_next_item_status parse_status;
                const struct argpar_opt_descr *opt_descr;
                const char *arg;
 
-               status = parse_next_item(argpar_iter, &argpar_item, argv, "run",
+               parse_status = parse_next_item(argpar_iter, &argpar_item, argv, "run",
                        consumed_args);
-               if (status == PARSE_NEXT_ITEM_STATUS_ERROR) {
+               if (parse_status == PARSE_NEXT_ITEM_STATUS_ERROR) {
                        goto error;
-               } else if (status == PARSE_NEXT_ITEM_STATUS_END) {
+               } else if (parse_status == PARSE_NEXT_ITEM_STATUS_END) {
                        break;
                }
 
@@ -2037,8 +2042,7 @@ struct bt_config *bt_config_run_from_args(int argc, const char *argv[],
                switch (opt_descr->id) {
                case OPT_HELP:
                        print_run_usage(stdout);
-                       *retcode = -1;
-                       BT_OBJECT_PUT_REF_AND_RESET(cfg);
+                       status = BT_CONFIG_CLI_ARGS_STATUS_INFO_ONLY;
                        goto end;
                case OPT_COMPONENT:
                {
@@ -2203,11 +2207,12 @@ struct bt_config *bt_config_run_from_args(int argc, const char *argv[],
                goto error;
        }
 
+       BT_OBJECT_MOVE_REF(*cfg_out, cfg);
+       status = BT_CONFIG_CLI_ARGS_STATUS_OK;
        goto end;
 
 error:
-       *retcode = 1;
-       BT_OBJECT_PUT_REF_AND_RESET(cfg);
+       status = BT_CONFIG_CLI_ARGS_STATUS_ERROR;
 
 end:
        if (error_str) {
@@ -2221,15 +2226,18 @@ end:
        BT_VALUE_PUT_REF_AND_RESET(cur_base_params);
        BT_VALUE_PUT_REF_AND_RESET(instance_names);
        BT_VALUE_PUT_REF_AND_RESET(connection_args);
-       return cfg;
+       bt_object_put_ref(cfg);
+
+       return status;
 }
 
 static
-struct bt_config *bt_config_run_from_args_array(const bt_value *run_args,
-               int *retcode, const bt_value *plugin_paths,
+enum bt_config_cli_args_status bt_config_run_from_args_array(
+               const bt_value *run_args, struct bt_config **cfg,
+               const bt_value *plugin_paths,
                int default_log_level)
 {
-       struct bt_config *cfg = NULL;
+       enum bt_config_cli_args_status status;
        const char **argv;
        uint64_t i, len = bt_value_array_get_length(run_args);
 
@@ -2237,7 +2245,7 @@ struct bt_config *bt_config_run_from_args_array(const bt_value *run_args,
        argv = calloc((size_t) len, sizeof(*argv));
        if (!argv) {
                BT_CLI_LOGE_APPEND_CAUSE_OOM();
-               goto end;
+               goto error;
        }
 
        for (i = 0; i < len; i++) {
@@ -2251,12 +2259,17 @@ struct bt_config *bt_config_run_from_args_array(const bt_value *run_args,
                argv[i] = arg;
        }
 
-       cfg = bt_config_run_from_args((int) len, argv, retcode,
+       status = bt_config_run_from_args((int) len, argv, cfg,
                plugin_paths, default_log_level, 0);
 
+       goto end;
+
+error:
+       status = BT_CONFIG_CLI_ARGS_STATUS_ERROR;
+
 end:
        free(argv);
-       return cfg;
+       return status;
 }
 
 /*
@@ -3310,18 +3323,18 @@ enum convert_current_item_type {
 /*
  * Creates a Babeltrace config object from the arguments of a convert
  * command.
- *
- * *retcode is set to the appropriate exit code to use.
  */
 static
-struct bt_config *bt_config_convert_from_args(int argc, const char *argv[],
-               int *retcode, const bt_value *plugin_paths,
+enum bt_config_cli_args_status bt_config_convert_from_args(int argc,
+               const char *argv[], struct bt_config **cfg_out,
+               const bt_value *plugin_paths,
                int *default_log_level, const bt_interrupter *interrupter,
                unsigned int consumed_args)
 {
+       enum bt_config_cli_args_status status;
        enum convert_current_item_type current_item_type =
                CONVERT_CURRENT_ITEM_TYPE_NONE;
-       int ret = 0;
+       int ret;
        struct bt_config *cfg = NULL;
        bool got_input_format_opt = false;
        bool got_output_format_opt = false;
@@ -3374,11 +3387,10 @@ struct bt_config *bt_config_convert_from_args(int argc, const char *argv[],
        bool ctf_fs_source_force_clock_class_unix_epoch_origin = false;
        gchar *ctf_fs_source_clock_class_offset_arg = NULL;
        gchar *ctf_fs_source_clock_class_offset_ns_arg = NULL;
-       *retcode = 0;
 
        if (argc < 1) {
                print_convert_usage(stdout);
-               *retcode = -1;
+               status = BT_CONFIG_CLI_ARGS_STATUS_INFO_ONLY;
                goto end;
        }
 
@@ -3483,16 +3495,16 @@ struct bt_config *bt_config_convert_from_args(int argc, const char *argv[],
        }
 
        while (true) {
-               enum parse_next_item_status status;
+               enum parse_next_item_status parse_status;
                char *name = NULL;
                char *plugin_name = NULL;
                char *comp_cls_name = NULL;
 
-               status = parse_next_item(argpar_iter, &argpar_item, argv, "convert",
+               parse_status = parse_next_item(argpar_iter, &argpar_item, argv, "convert",
                        consumed_args);
-               if (status == PARSE_NEXT_ITEM_STATUS_ERROR) {
+               if (parse_status == PARSE_NEXT_ITEM_STATUS_ERROR) {
                        goto error;
-               } else if (status == PARSE_NEXT_ITEM_STATUS_END) {
+               } else if (parse_status == PARSE_NEXT_ITEM_STATUS_END) {
                        break;
                }
 
@@ -3504,8 +3516,7 @@ struct bt_config *bt_config_convert_from_args(int argc, const char *argv[],
                        switch (opt_descr->id) {
                        case OPT_HELP:
                                print_convert_usage(stdout);
-                               *retcode = -1;
-                               BT_OBJECT_PUT_REF_AND_RESET(cfg);
+                               status = BT_CONFIG_CLI_ARGS_STATUS_INFO_ONLY;
                                goto end;
                        case OPT_COMPONENT:
                        {
@@ -3765,15 +3776,15 @@ struct bt_config *bt_config_convert_from_args(int argc, const char *argv[],
        }
 
        while (true) {
-               enum parse_next_item_status status;
+               enum parse_next_item_status parse_status;
                const struct argpar_opt_descr *opt_descr;
                const char *arg;
 
-               status = parse_next_item(argpar_iter, &argpar_item, argv, "convert",
+               parse_status = parse_next_item(argpar_iter, &argpar_item, argv, "convert",
                        consumed_args);
-               if (status == PARSE_NEXT_ITEM_STATUS_ERROR) {
+               if (parse_status == PARSE_NEXT_ITEM_STATUS_ERROR) {
                        goto error;
-               } else if (status == PARSE_NEXT_ITEM_STATUS_END) {
+               } else if (parse_status == PARSE_NEXT_ITEM_STATUS_END) {
                        break;
                }
 
@@ -4096,9 +4107,9 @@ struct bt_config *bt_config_convert_from_args(int argc, const char *argv[],
                        goto error;
                }
 
-               cfg = bt_config_print_ctf_metadata_create(plugin_paths);
-               if (!cfg) {
-                       goto error;
+               status = bt_config_print_ctf_metadata_create(plugin_paths, &cfg);
+               if (status != BT_CONFIG_CLI_ARGS_STATUS_OK) {
+                       goto end;
                }
 
                bt_val_non_opt = bt_value_array_borrow_element_by_index_const(non_opts, 0);
@@ -4111,6 +4122,7 @@ struct bt_config *bt_config_convert_from_args(int argc, const char *argv[],
                                output);
                }
 
+               BT_OBJECT_MOVE_REF(*cfg_out, cfg);
                goto end;
        }
 
@@ -4190,10 +4202,10 @@ struct bt_config *bt_config_convert_from_args(int argc, const char *argv[],
 
                        if (!lttng_live_url_parts.session_name) {
                                /* Print LTTng live sessions */
-                               cfg = bt_config_print_lttng_live_sessions_create(
-                                       plugin_paths);
-                               if (!cfg) {
-                                       goto error;
+                               status = bt_config_print_lttng_live_sessions_create(
+                                       plugin_paths, &cfg);
+                               if (status != BT_CONFIG_CLI_ARGS_STATUS_OK) {
+                                       goto end;
                                }
 
                                g_string_assign(cfg->cmd_data.print_lttng_live_sessions.url,
@@ -4205,6 +4217,7 @@ struct bt_config *bt_config_convert_from_args(int argc, const char *argv[],
                                                output);
                                }
 
+                               BT_OBJECT_MOVE_REF(*cfg_out, cfg);
                                goto end;
                        }
 
@@ -4235,13 +4248,13 @@ struct bt_config *bt_config_convert_from_args(int argc, const char *argv[],
                                goto error;
                        }
                } else {
-                       int status;
                        size_t plugin_count;
                        const bt_plugin **plugins;
                        const bt_plugin *plugin;
+                       auto_source_discovery_status auto_disc_status;
 
-                       status = require_loaded_plugins(plugin_paths);
-                       if (status != 0) {
+                       ret = require_loaded_plugins(plugin_paths);
+                       if (ret != 0) {
                                goto error;
                        }
 
@@ -4254,22 +4267,23 @@ struct bt_config *bt_config_convert_from_args(int argc, const char *argv[],
                                plugins = borrow_loaded_plugins();
                        }
 
-                       status = auto_discover_source_components(non_opts, plugins, plugin_count,
+                       auto_disc_status = auto_discover_source_components(
+                               non_opts, plugins, plugin_count,
                                auto_source_discovery_restrict_component_class_name,
                                *default_log_level, &auto_disc, interrupter);
 
-                       if (status != 0) {
-                               if (status == AUTO_SOURCE_DISCOVERY_STATUS_INTERRUPTED) {
+                       if (auto_disc_status != AUTO_SOURCE_DISCOVERY_STATUS_OK) {
+                               if (auto_disc_status == AUTO_SOURCE_DISCOVERY_STATUS_INTERRUPTED) {
                                        BT_CURRENT_THREAD_ERROR_APPEND_CAUSE_FROM_UNKNOWN(
                                                "Babeltrace CLI", "Automatic source discovery interrupted by the user");
                                }
                                goto error;
                        }
 
-                       status = create_implicit_component_args_from_auto_discovered_sources(
+                       ret = create_implicit_component_args_from_auto_discovered_sources(
                                &auto_disc, non_opts, non_opt_params, non_opt_loglevels,
                                discovered_source_args);
-                       if (status != 0) {
+                       if (ret != 0) {
                                goto error;
                        }
                }
@@ -4553,23 +4567,22 @@ struct bt_config *bt_config_convert_from_args(int argc, const char *argv[],
                        }
                }
 
-               *retcode = -1;
-               BT_OBJECT_PUT_REF_AND_RESET(cfg);
+               status = BT_CONFIG_CLI_ARGS_STATUS_INFO_ONLY;
                goto end;
        }
 
-       cfg = bt_config_run_from_args_array(run_args, retcode,
+       status = bt_config_run_from_args_array(run_args, &cfg,
                plugin_paths, *default_log_level);
-       if (!cfg) {
-               goto error;
+       if (status != BT_CONFIG_CLI_ARGS_STATUS_OK) {
+               goto end;
        }
 
        cfg->cmd_data.run.stream_intersection_mode = stream_intersection_mode;
+       BT_OBJECT_MOVE_REF(*cfg_out, cfg);
        goto end;
 
 error:
-       *retcode = 1;
-       BT_OBJECT_PUT_REF_AND_RESET(cfg);
+       status = BT_CONFIG_CLI_ARGS_STATUS_ERROR;
 
 end:
        argpar_iter_destroy(argpar_iter);
@@ -4615,7 +4628,9 @@ end:
                g_string_free(auto_disc_comp_name, TRUE);
        }
 
-       return cfg;
+       bt_object_put_ref(cfg);
+
+       return status;
 }
 
 /*
@@ -4651,13 +4666,14 @@ void print_gen_usage(FILE *fp)
        fprintf(fp, "Use `babeltrace2 COMMAND --help` to show the help of COMMAND.\n");
 }
 
-struct bt_config *bt_config_cli_args_create(int argc, const char *argv[],
-               int *retcode, bool omit_system_plugin_path,
+enum bt_config_cli_args_status bt_config_cli_args_create(int argc,
+               const char *argv[], struct bt_config **cfg,
+               bool omit_system_plugin_path,
                bool omit_home_plugin_path,
                const bt_value *initial_plugin_paths,
                const bt_interrupter *interrupter)
 {
-       struct bt_config *config = NULL;
+       enum bt_config_cli_args_status status;
        int top_level_argc;
        const char **top_level_argv;
        int command_argc = -1;
@@ -4692,8 +4708,6 @@ struct bt_config *bt_config_cli_args_create(int argc, const char *argv[],
                COMMAND_TYPE_QUERY,
        } command_type = COMMAND_TYPE_NONE;
 
-       *retcode = -1;
-
        if (!initial_plugin_paths) {
                plugin_paths = bt_value_array_create();
                if (!plugin_paths) {
@@ -4722,6 +4736,7 @@ struct bt_config *bt_config_cli_args_create(int argc, const char *argv[],
                print_version();
                puts("");
                print_gen_usage(stdout);
+               status = BT_CONFIG_CLI_ARGS_STATUS_INFO_ONLY;
                goto end;
        }
 
@@ -4736,12 +4751,12 @@ struct bt_config *bt_config_cli_args_create(int argc, const char *argv[],
        }
 
        while (true) {
-               enum argpar_iter_next_status status;
+               enum argpar_iter_next_status argpar_status;
 
                ARGPAR_ITEM_DESTROY_AND_RESET(argpar_item);
-               status = argpar_iter_next(argpar_iter, &argpar_item, &argpar_error);
+               argpar_status = argpar_iter_next(argpar_iter, &argpar_item, &argpar_error);
 
-               switch (status) {
+               switch (argpar_status) {
                case ARGPAR_ITER_NEXT_STATUS_ERROR_MEMORY:
                        BT_CLI_LOGE_APPEND_CAUSE_OOM();
                        goto error;
@@ -4762,11 +4777,11 @@ struct bt_config *bt_config_cli_args_create(int argc, const char *argv[],
                        break;
                }
 
-               if (status == ARGPAR_ITER_NEXT_STATUS_END) {
+               if (argpar_status == ARGPAR_ITER_NEXT_STATUS_END) {
                        break;
                }
 
-               if (status == ARGPAR_ITER_NEXT_STATUS_ERROR) {
+               if (argpar_status == ARGPAR_ITER_NEXT_STATUS_ERROR) {
                        BT_ASSERT(argpar_error_type(argpar_error) ==
                                ARGPAR_ERROR_TYPE_UNKNOWN_OPT);
                        /*
@@ -4819,9 +4834,11 @@ struct bt_config *bt_config_cli_args_create(int argc, const char *argv[],
                                break;
                        case OPT_VERSION:
                                print_version();
+                               status = BT_CONFIG_CLI_ARGS_STATUS_INFO_ONLY;
                                goto end;
                        case OPT_HELP:
                                print_gen_usage(stdout);
+                               status = BT_CONFIG_CLI_ARGS_STATUS_INFO_ONLY;
                                goto end;
                        default:
                                bt_common_abort();
@@ -4880,6 +4897,7 @@ struct bt_config *bt_config_cli_args_create(int argc, const char *argv[],
                         * usage and quit.
                         */
                        print_gen_usage(stdout);
+                       status = BT_CONFIG_CLI_ARGS_STATUS_INFO_ONLY;
                        goto end;
                }
 
@@ -4925,48 +4943,55 @@ struct bt_config *bt_config_cli_args_create(int argc, const char *argv[],
 
        switch (command_type) {
        case COMMAND_TYPE_RUN:
-               config = bt_config_run_from_args(command_argc, command_argv,
-                       retcode, plugin_paths,
+               status = bt_config_run_from_args(command_argc, command_argv,
+                       cfg, plugin_paths,
                        default_log_level, consumed_args);
                break;
        case COMMAND_TYPE_CONVERT:
-               config = bt_config_convert_from_args(command_argc, command_argv,
-                       retcode, plugin_paths, &default_log_level, interrupter,
+               status = bt_config_convert_from_args(command_argc, command_argv,
+                       cfg, plugin_paths, &default_log_level, interrupter,
                        consumed_args);
                break;
        case COMMAND_TYPE_LIST_PLUGINS:
-               config = bt_config_list_plugins_from_args(command_argc,
-                       command_argv, retcode, plugin_paths, consumed_args);
+               status = bt_config_list_plugins_from_args(command_argc,
+                       command_argv, cfg, plugin_paths, consumed_args);
                break;
        case COMMAND_TYPE_HELP:
-               config = bt_config_help_from_args(command_argc,
-                       command_argv, retcode, plugin_paths,
+               status = bt_config_help_from_args(command_argc,
+                       command_argv, cfg, plugin_paths,
                        default_log_level, consumed_args);
                break;
        case COMMAND_TYPE_QUERY:
-               config = bt_config_query_from_args(command_argc,
-                       command_argv, retcode, plugin_paths,
+               status = bt_config_query_from_args(command_argc,
+                       command_argv, cfg, plugin_paths,
                        default_log_level, consumed_args);
                break;
        default:
                bt_common_abort();
        }
 
-       if (config) {
-               BT_ASSERT(default_log_level >= BT_LOG_TRACE);
-               config->log_level = default_log_level;
-               config->command_name = command_name;
+       if (status == BT_CONFIG_CLI_ARGS_STATUS_ERROR) {
+               goto error;
+       } else if (status == BT_CONFIG_CLI_ARGS_STATUS_INFO_ONLY) {
+               goto end;
        }
 
+       BT_ASSERT(status == BT_CONFIG_CLI_ARGS_STATUS_OK);
+       BT_ASSERT(*cfg);
+       BT_ASSERT(default_log_level >= BT_LOG_TRACE);
+       (*cfg)->log_level = default_log_level;
+       (*cfg)->command_name = command_name;
+
+       status = BT_CONFIG_CLI_ARGS_STATUS_OK;
        goto end;
 
 error:
-       *retcode = 1;
+       status = BT_CONFIG_CLI_ARGS_STATUS_ERROR;
 
 end:
        argpar_error_destroy(argpar_error);
        argpar_item_destroy(argpar_item);
        argpar_iter_destroy(argpar_iter);
        bt_value_put_ref(plugin_paths);
-       return config;
+       return status;
 }
index 74ed4768bdf2f59de5095efbede65ccd60c2b8e8..92f499950a7b72d4919275b6cd92bab2af4ad340 100644 (file)
 
 #include "babeltrace2-cfg.h"
 
-struct bt_config *bt_config_cli_args_create(int argc, const char *argv[],
-               int *retcode, bool force_omit_system_plugin_path,
+/*
+ * Return value of functions that create a bt_config from CLI args and return
+ * it through an out parameter.
+ */
+enum bt_config_cli_args_status
+{
+       /*
+        * Config was successfully created and returned through the out
+        * parameter.
+        */
+       BT_CONFIG_CLI_ARGS_STATUS_OK = 0,
+
+       /*
+        * Config could not be created due to an error. The out parameter is
+        * left unchanged.
+        */
+       BT_CONFIG_CLI_ARGS_STATUS_ERROR = -1,
+
+       /*
+        * The arguments caused the function to print some information (help,
+        * version, etc), not config was created.  The out parameter is left
+        * unchanged.
+        */
+       BT_CONFIG_CLI_ARGS_STATUS_INFO_ONLY = 1,
+};
+
+enum bt_config_cli_args_status bt_config_cli_args_create(int argc,
+               const char *argv[],
+               struct bt_config **cfg, bool force_omit_system_plugin_path,
                bool force_omit_home_plugin_path,
                const bt_value *initial_plugin_paths,
                const bt_interrupter *interrupter);
index c4b7c29fc1605bc67910bcbdb98608c9c872a309..c0acce97e7978446fee28da4e565173def719037 100644 (file)
@@ -28,6 +28,7 @@
 
 #define ENV_BABELTRACE_WARN_COMMAND_NAME_DIRECTORY_CLASH "BABELTRACE_CLI_WARN_COMMAND_NAME_DIRECTORY_CLASH"
 #define NSEC_PER_SEC   1000000000LL
+#define EXIT_INTERRUPTED 2
 
 enum bt_cmd_status {
        BT_CMD_STATUS_OK            = 0,
@@ -2614,7 +2615,8 @@ end:
 
 int main(int argc, const char **argv)
 {
-       int ret, retcode;
+       int retcode;
+       enum bt_config_cli_args_status cli_args_status;
        enum bt_cmd_status cmd_status;
        struct bt_config *cfg = NULL;
 
@@ -2626,41 +2628,38 @@ int main(int argc, const char **argv)
        the_interrupter = bt_interrupter_create();
        if (!the_interrupter) {
                BT_CLI_LOGE_APPEND_CAUSE("Failed to create an interrupter object.");
-               retcode = 1;
+               retcode = EXIT_FAILURE;
                goto end;
        }
 
-       cfg = bt_config_cli_args_create_with_default(argc, argv, &retcode,
+       cli_args_status = bt_config_cli_args_create_with_default(argc, argv, &cfg,
                the_interrupter);
-
-       if (retcode < 0) {
+       if (cli_args_status == BT_CONFIG_CLI_ARGS_STATUS_INFO_ONLY) {
                /* Quit without errors; typically usage/version */
-               retcode = 0;
+               retcode = EXIT_SUCCESS;
                BT_LOGI_STR("Quitting without errors.");
                goto end;
        }
 
-       if (retcode > 0) {
+       if (cli_args_status == BT_CONFIG_CLI_ARGS_STATUS_ERROR) {
+               retcode = EXIT_FAILURE;
                BT_CLI_LOGE_APPEND_CAUSE(
                        "Command-line error: retcode=%d", retcode);
                goto end;
        }
 
-       if (!cfg) {
-               BT_CLI_LOGE_APPEND_CAUSE(
-                       "Failed to create a valid Babeltrace CLI configuration.");
-               retcode = 1;
-               goto end;
-       }
+       BT_ASSERT(cli_args_status == BT_CONFIG_CLI_ARGS_STATUS_OK);
+       BT_ASSERT(cfg);
 
        print_cfg(cfg);
 
        if (cfg->command_needs_plugins) {
-               ret = require_loaded_plugins(cfg->plugin_paths);
+               int ret = require_loaded_plugins(cfg->plugin_paths);
+
                if (ret) {
                        BT_CLI_LOGE_APPEND_CAUSE(
                                "Failed to load plugins: ret=%d", ret);
-                       retcode = 1;
+                       retcode = EXIT_FAILURE;
                        goto end;
                }
        }
@@ -2698,13 +2697,13 @@ int main(int argc, const char **argv)
 
        switch (cmd_status) {
        case BT_CMD_STATUS_OK:
-               retcode = 0;
+               retcode = EXIT_SUCCESS;
                break;
        case BT_CMD_STATUS_ERROR:
-               retcode = 1;
+               retcode = EXIT_FAILURE;
                break;
        case BT_CMD_STATUS_INTERRUPTED:
-               retcode = 2;
+               retcode = EXIT_INTERRUPTED;
                break;
        default:
                BT_LOGF("Invalid command status: cmd-status=%d", cmd_status);
@@ -2712,7 +2711,7 @@ int main(int argc, const char **argv)
        }
 
 end:
-       if (retcode == 1) {
+       if (retcode == EXIT_FAILURE) {
                print_error_causes();
        }
 
This page took 0.041883 seconds and 4 git commands to generate.