}
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,
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,
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
* The returned string must be freed by the caller.
*/
static
-GString *__BT_ATTR_FORMAT_PRINTF(3, 4) format_arg_error(
+GString *__BT_ATTR_FORMAT_PRINTF(4, 5) format_arg_error(
const struct argpar_error *error,
- const char **argv, const char *prefix_fmt, ...)
-
+ const char **argv, unsigned int arg_index_offset,
+ const char *prefix_fmt, ...)
{
GString *str = g_string_new(NULL);
va_list args;
g_string_append_printf(
str,
WHILE_PARSING_ARG_N_FMT "Missing required argument for option `-%c`",
- orig_index + 1, arg, descr->short_name);
+ arg_index_offset + orig_index + 1, arg, descr->short_name);
} else {
g_string_append_printf(
str,
WHILE_PARSING_ARG_N_FMT "Missing required argument for option `--%s`",
- orig_index + 1, arg, descr->long_name);
+ arg_index_offset + orig_index + 1, arg, descr->long_name);
}
break;
g_string_append_printf(
str,
WHILE_PARSING_ARG_N_FMT "Unexpected argument for option `-%c`",
- orig_index + 1, arg, descr->short_name);
+ arg_index_offset + orig_index + 1, arg, descr->short_name);
} else {
g_string_append_printf(
str,
WHILE_PARSING_ARG_N_FMT "Unexpected argument for option `--%s`",
- orig_index + 1, arg, descr->long_name);
+ arg_index_offset + orig_index + 1, arg, descr->long_name);
}
break;
g_string_append_printf(
str,
WHILE_PARSING_ARG_N_FMT "Unknown option `%s`",
- orig_index + 1, arg, unknown_opt);
+ arg_index_offset + orig_index + 1, arg, unknown_opt);
break;
}
static
enum parse_next_item_status parse_next_item(struct argpar_iter *iter,
const struct argpar_item **item, const char **argv,
- const char *command)
+ const char *command, unsigned int consumed_args)
{
enum argpar_iter_next_status status;
const struct argpar_error *error = NULL;
case ARGPAR_ITER_NEXT_STATUS_ERROR:
{
GString *err_str = format_arg_error(error, argv,
- "While parsing `%s` command's command-line arguments", command);
+ consumed_args,
+ "While parsing `%s` command's command-line arguments",
+ command);
BT_CLI_LOGE_APPEND_CAUSE("%s", err_str->str);
g_string_free(err_str, TRUE);
ret = PARSE_NEXT_ITEM_STATUS_ERROR;
/*
* 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)
+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;
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;
}
while (true) {
- enum parse_next_item_status status =
- parse_next_item(argpar_iter, &argpar_item, argv, "help");
+ 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;
}
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();
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);
argpar_iter_destroy(argpar_iter);
argpar_item_destroy(argpar_item);
+ bt_object_put_ref(cfg);
- return cfg;
+ return status;
}
/*
/*
* 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)
+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;
goto error;
}
- *retcode = 0;
cfg = bt_config_query_create(plugin_paths);
if (!cfg) {
goto error;
}
while (true) {
- enum parse_next_item_status status =
- parse_next_item(argpar_iter, &argpar_item, argv, "query");
+ 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;
}
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:
{
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;
}
}
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);
}
bt_value_put_ref(params);
- return cfg;
+ bt_object_put_ref(cfg);
+
+ return status;
}
/*
/*
* 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)
+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;
}
while (true) {
- enum parse_next_item_status status =
- parse_next_item(argpar_iter, &argpar_item, argv, "list-plugins");
+ 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;
}
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();
}
}
+ 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;
}
/*
/*
* 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,
- int default_log_level)
+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;
ARGPAR_OPT_DESCR_SENTINEL
};
- *retcode = 0;
-
error_str = g_string_new(NULL);
if (!error_str) {
BT_CLI_LOGE_APPEND_CAUSE_OOM();
if (argc < 1) {
print_run_usage(stdout);
- *retcode = -1;
+ status = BT_CONFIG_CLI_ARGS_STATUS_INFO_ONLY;
goto end;
}
}
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");
- if (status == PARSE_NEXT_ITEM_STATUS_ERROR) {
+ parse_status = parse_next_item(argpar_iter, &argpar_item, argv, "run",
+ consumed_args);
+ 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;
}
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:
{
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) {
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);
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++) {
argv[i] = arg;
}
- cfg = bt_config_run_from_args((int) len, argv, retcode,
- plugin_paths, default_log_level);
+ 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;
}
/*
/*
* 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,
- int *default_log_level, const bt_interrupter *interrupter)
+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;
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;
}
}
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");
- if (status == PARSE_NEXT_ITEM_STATUS_ERROR) {
+ parse_status = parse_next_item(argpar_iter, &argpar_item, argv, "convert",
+ consumed_args);
+ 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;
}
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:
{
}
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");
- if (status == PARSE_NEXT_ITEM_STATUS_ERROR) {
+ parse_status = parse_next_item(argpar_iter, &argpar_item, argv, "convert",
+ consumed_args);
+ 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;
}
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);
output);
}
+ BT_OBJECT_MOVE_REF(*cfg_out, cfg);
goto end;
}
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,
output);
}
+ BT_OBJECT_MOVE_REF(*cfg_out, cfg);
goto end;
}
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;
}
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;
}
}
}
}
- *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);
g_string_free(auto_disc_comp_name, TRUE);
}
- return cfg;
+ bt_object_put_ref(cfg);
+
+ return status;
}
/*
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;
const struct argpar_item *argpar_item = NULL;
const struct argpar_error *argpar_error = NULL;
bt_value *plugin_paths = NULL;
+ unsigned int consumed_args;
/* Top-level option descriptions. */
static const struct argpar_opt_descr descrs[] = {
COMMAND_TYPE_QUERY,
} command_type = COMMAND_TYPE_NONE;
- *retcode = -1;
-
if (!initial_plugin_paths) {
plugin_paths = bt_value_array_create();
if (!plugin_paths) {
print_version();
puts("");
print_gen_usage(stdout);
+ status = BT_CONFIG_CLI_ARGS_STATUS_INFO_ONLY;
goto end;
}
}
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;
if (argpar_error_type(argpar_error)
!= ARGPAR_ERROR_TYPE_UNKNOWN_OPT) {
GString *err_str = format_arg_error(argpar_error, top_level_argv,
- "While parsing command-line arguments");
+ 0, "While parsing command-line arguments");
BT_CLI_LOGE_APPEND_CAUSE("%s", err_str->str);
g_string_free(err_str, TRUE);
goto error;
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);
/*
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();
* usage and quit.
*/
print_gen_usage(stdout);
+ status = BT_CONFIG_CLI_ARGS_STATUS_INFO_ONLY;
goto end;
}
goto error;
}
+ consumed_args = argpar_iter_ingested_orig_args(argpar_iter);
+
switch (command_type) {
case COMMAND_TYPE_RUN:
- config = bt_config_run_from_args(command_argc, command_argv,
- retcode, plugin_paths,
- default_log_level);
+ 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);
+ 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,
- default_log_level);
+ 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,
- default_log_level);
+ 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;
}