X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=src%2Fcli%2Fbabeltrace2-cfg-cli-args.c;h=8fbe0a96913ad485b2b307ad1183c3b692cb6f8d;hb=393729a6d00d2d9132000692547720e2e177d69b;hp=a332bf72168775a2fa716a820dbbbe578bf4a614;hpb=1ead9076477cc6be07b0c48ce02fa40e49ddc2f0;p=babeltrace.git diff --git a/src/cli/babeltrace2-cfg-cli-args.c b/src/cli/babeltrace2-cfg-cli-args.c index a332bf72..8fbe0a96 100644 --- a/src/cli/babeltrace2-cfg-cli-args.c +++ b/src/cli/babeltrace2-cfg-cli-args.c @@ -42,7 +42,8 @@ #include "babeltrace2-cfg-cli-args-connect.h" #include "babeltrace2-cfg-cli-params-arg.h" #include "babeltrace2-plugins.h" -#include "babeltrace2-cfg-src-auto-disc.h" +#include "babeltrace2-query.h" +#include "autodisc/autodisc.h" #include "common/version.h" static const int cli_default_log_level = BT_LOG_WARNING; @@ -797,7 +798,7 @@ int insert_flat_params_from_array(GString *params_arg, goto end; } - for (i = 0; i < bt_value_array_get_size(names_array); i++) { + for (i = 0; i < bt_value_array_get_length(names_array); i++) { const bt_value *str_obj = bt_value_array_borrow_element_by_index_const(names_array, i); @@ -1413,9 +1414,9 @@ struct bt_config *bt_config_help_from_args(int argc, const char *argv[], { int ret, i; struct bt_config *cfg = NULL; - const char *leftover = NULL; + const char *non_opt = NULL; char *plugin_name = NULL, *comp_cls_name = NULL; - struct bt_argpar_parse_ret argpar_parse_ret; + struct bt_argpar_parse_ret argpar_parse_ret = { 0 }; *retcode = 0; cfg = bt_config_help_create(initial_plugin_paths, default_log_level); @@ -1478,18 +1479,18 @@ struct bt_config *bt_config_help_from_args(int argc, const char *argv[], struct bt_argpar_item_non_opt *argpar_item_non_opt = (struct bt_argpar_item_non_opt *) argpar_item; - if (leftover) { + if (non_opt) { BT_CLI_LOGE_APPEND_CAUSE("Extraneous command-line argument specified to `help` command: `%s`.", argpar_item_non_opt->arg); goto error; } - leftover = argpar_item_non_opt->arg; + non_opt = argpar_item_non_opt->arg; } } - if (leftover) { - plugin_comp_cls_names(leftover, NULL, + if (non_opt) { + plugin_comp_cls_names(non_opt, NULL, &plugin_name, &comp_cls_name, &cfg->cmd_data.help.cfg_component->type); if (plugin_name && comp_cls_name) { @@ -1504,7 +1505,7 @@ struct bt_config *bt_config_help_from_args(int argc, const char *argv[], /* Fall back to plugin help */ g_string_assign( cfg->cmd_data.help.cfg_component->plugin_name, - leftover); + non_opt); } } else { print_help_usage(stdout); @@ -1584,7 +1585,7 @@ struct bt_config *bt_config_query_from_args(int argc, const char *argv[], const char *query_object = NULL; bt_value *params; GString *error_str = NULL; - struct bt_argpar_parse_ret argpar_parse_ret; + struct bt_argpar_parse_ret argpar_parse_ret = { 0 }; params = bt_value_null; bt_value_get_ref(bt_value_null); @@ -1667,8 +1668,9 @@ struct bt_config *bt_config_query_from_args(int argc, const char *argv[], = (struct bt_argpar_item_non_opt *) argpar_item; /* - * We need exactly two leftover arguments which are the - * mandatory component class specification and query object. + * We need exactly two non-option arguments + * which are the mandatory component class + * specification and query object. */ if (!component_class_spec) { component_class_spec = argpar_item_non_opt->arg; @@ -2044,7 +2046,7 @@ struct bt_config *bt_config_run_from_args(int argc, const char *argv[], struct bt_argpar_item_opt *argpar_item_opt; const char *arg; - /* This command does not accept leftover arguments. */ + /* This command does not accept non-option arguments.*/ if (argpar_item->type == BT_ARGPAR_ITEM_TYPE_NON_OPT) { struct bt_argpar_item_non_opt *argpar_nonopt_item = (struct bt_argpar_item_non_opt *) argpar_item; @@ -2269,7 +2271,7 @@ struct bt_config *bt_config_run_from_args_array(const bt_value *run_args, struct bt_config *cfg = NULL; const char **argv; int64_t i, len; - const size_t argc = bt_value_array_get_size(run_args); + const size_t argc = bt_value_array_get_length(run_args); argv = calloc(argc, sizeof(*argv)); if (!argv) { @@ -2277,7 +2279,7 @@ struct bt_config *bt_config_run_from_args_array(const bt_value *run_args, goto end; } - len = bt_value_array_get_size(run_args); + len = bt_value_array_get_length(run_args); if (len < 0) { BT_CLI_LOGE_APPEND_CAUSE("Invalid executable arguments."); goto end; @@ -2604,7 +2606,7 @@ int append_run_args_for_implicit_component( } } - for (i = 0; i < bt_value_array_get_size(impl_args->extra_params); + for (i = 0; i < bt_value_array_get_length(impl_args->extra_params); i++) { const bt_value *elem; const char *arg; @@ -2812,7 +2814,7 @@ int bt_value_to_cli_param_value_append(const bt_value *value, GString *buf) } case BT_VALUE_TYPE_ARRAY: { g_string_append_c(buf, '['); - uint64_t sz = bt_value_array_get_size(value); + uint64_t sz = bt_value_array_get_length(value); for (uint64_t i = 0; i < sz; i++) { const bt_value *item; int ret; @@ -3175,17 +3177,17 @@ end: } /* - * Create `struct implicit_component_args` structures for each of the source - * components we identified. Add them to `component_args`. + * Create `struct implicit_component_args` structures for each of the + * source components we identified. Add them to `component_args`. * - * `leftover_params` is an array where each element is an array of strings - * containing all the arguments to `--params` that apply to the leftover at the - * same index. For example, if, for a leftover, the following `--params` - * options applied: + * `non_opt_params` is an array where each element is an array of + * strings containing all the arguments to `--params` that apply to the + * non-option argument at the same index. For example, if, for a + * non-option argument, the following `--params` options applied: * * --params=a=2 --params=b=3,c=4 * - * its entry in `leftover_params` would contain + * its entry in `non_opt_params` would contain * * ["a=2", "b=3,c=4"] */ @@ -3193,7 +3195,8 @@ end: static int create_implicit_component_args_from_auto_discovered_sources( const struct auto_source_discovery *auto_disc, - const bt_value *leftover_params, + const bt_value *non_opt_params, + const bt_value *non_opt_loglevels, GPtrArray *component_args) { gchar *cc_name = NULL; @@ -3221,10 +3224,11 @@ int create_implicit_component_args_from_auto_discovered_sources( } /* - * Append parameters of all the leftovers that contributed to - * this component instance coming into existence. + * Append parameters and log levels of all the + * non-option arguments that contributed to this + * component instance coming into existence. */ - orig_indices_count = bt_value_array_get_size(res->original_input_indices); + orig_indices_count = bt_value_array_get_length(res->original_input_indices); for (orig_indices_i = 0; orig_indices_i < orig_indices_count; orig_indices_i++) { const bt_value *orig_idx_value = bt_value_array_borrow_element_by_index( @@ -3232,10 +3236,11 @@ int create_implicit_component_args_from_auto_discovered_sources( uint64_t orig_idx = bt_value_integer_unsigned_get(orig_idx_value); const bt_value *params_array = bt_value_array_borrow_element_by_index_const( - leftover_params, orig_idx); + non_opt_params, orig_idx); uint64_t params_i, params_count; + const bt_value *loglevel_value; - params_count = bt_value_array_get_size(params_array); + params_count = bt_value_array_get_length(params_array); for (params_i = 0; params_i < params_count; params_i++) { const bt_value *params_value = bt_value_array_borrow_element_by_index_const( @@ -3257,6 +3262,27 @@ int create_implicit_component_args_from_auto_discovered_sources( goto error; } } + + loglevel_value = bt_value_array_borrow_element_by_index_const( + non_opt_loglevels, orig_idx); + if (bt_value_get_type(loglevel_value) == BT_VALUE_TYPE_STRING) { + const char *loglevel = bt_value_string_get(loglevel_value); + bt_value_array_append_element_status append_status; + + append_status = bt_value_array_append_string_element( + comp->extra_params, "--log-level"); + if (append_status != BT_VALUE_ARRAY_APPEND_ELEMENT_STATUS_OK) { + BT_CLI_LOGE_APPEND_CAUSE("Failed to append array element."); + goto error; + } + + append_status = bt_value_array_append_string_element( + comp->extra_params, loglevel); + if (append_status != BT_VALUE_ARRAY_APPEND_ELEMENT_STATUS_OK) { + BT_CLI_LOGE_APPEND_CAUSE("Failed to append array element."); + goto error; + } + } } status = append_parameter_to_args(comp->extra_params, "inputs", res->inputs); @@ -3296,8 +3322,8 @@ enum convert_current_item_type { /* Current item is a component. */ CONVERT_CURRENT_ITEM_TYPE_COMPONENT, - /* Current item is a leftover. */ - CONVERT_CURRENT_ITEM_TYPE_LEFTOVER, + /* Current item is a non-option argument. */ + CONVERT_CURRENT_ITEM_TYPE_NON_OPT, }; /* @@ -3329,8 +3355,9 @@ struct bt_config *bt_config_convert_from_args(int argc, const char *argv[], GList *source_names = NULL; GList *filter_names = NULL; GList *sink_names = NULL; - bt_value *leftovers = NULL; - bt_value *leftover_params = NULL; + bt_value *non_opts = NULL; + bt_value *non_opt_params = NULL; + bt_value *non_opt_loglevels = NULL; struct implicit_component_args implicit_ctf_output_args = { 0 }; struct implicit_component_args implicit_lttng_live_args = { 0 }; struct implicit_component_args implicit_dummy_args = { 0 }; @@ -3433,14 +3460,20 @@ struct bt_config *bt_config_convert_from_args(int argc, const char *argv[], goto error; } - leftovers = bt_value_array_create(); - if (!leftovers) { + non_opts = bt_value_array_create(); + if (!non_opts) { + BT_CLI_LOGE_APPEND_CAUSE_OOM(); + goto error; + } + + non_opt_params = bt_value_array_create(); + if (!non_opt_params) { BT_CLI_LOGE_APPEND_CAUSE_OOM(); goto error; } - leftover_params = bt_value_array_create(); - if (!leftover_params) { + non_opt_loglevels = bt_value_array_create(); + if (!non_opt_loglevels) { BT_CLI_LOGE_APPEND_CAUSE_OOM(); goto error; } @@ -3613,12 +3646,16 @@ struct bt_config *bt_config_convert_from_args(int argc, const char *argv[], BT_CLI_LOGE_APPEND_CAUSE_OOM(); goto error; } - } else if (current_item_type == CONVERT_CURRENT_ITEM_TYPE_LEFTOVER) { - /* The current item is a leftover, record it in `leftover_params`. */ + } else if (current_item_type == CONVERT_CURRENT_ITEM_TYPE_NON_OPT) { + /* + * The current item is a + * non-option argument, record + * it in `non_opt_params`. + */ bt_value *array; - uint64_t idx = bt_value_array_get_size(leftover_params) - 1; + uint64_t idx = bt_value_array_get_length(non_opt_params) - 1; - array = bt_value_array_borrow_element_by_index(leftover_params, idx); + array = bt_value_array_borrow_element_by_index(non_opt_params, idx); bt_value_array_append_string_element(array, arg); } else { BT_CLI_LOGE_APPEND_CAUSE( @@ -3628,20 +3665,36 @@ struct bt_config *bt_config_convert_from_args(int argc, const char *argv[], } break; case OPT_LOG_LEVEL: - if (current_item_type != CONVERT_CURRENT_ITEM_TYPE_COMPONENT) { - BT_CLI_LOGE_APPEND_CAUSE( - "No current component (--component option) to assign a log level to:\n %s", - arg); - goto error; - } + if (current_item_type == CONVERT_CURRENT_ITEM_TYPE_COMPONENT) { + if (bt_value_array_append_string_element(run_args, "--log-level")) { + BT_CLI_LOGE_APPEND_CAUSE_OOM(); + goto error; + } - if (bt_value_array_append_string_element(run_args, "--log-level")) { - BT_CLI_LOGE_APPEND_CAUSE_OOM(); - goto error; - } + if (bt_value_array_append_string_element(run_args, arg)) { + BT_CLI_LOGE_APPEND_CAUSE_OOM(); + goto error; + } + } else if (current_item_type == CONVERT_CURRENT_ITEM_TYPE_NON_OPT) { + uint64_t idx = bt_value_array_get_length(non_opt_loglevels) - 1; + bt_value *log_level_str_value; - if (bt_value_array_append_string_element(run_args, arg)) { - BT_CLI_LOGE_APPEND_CAUSE_OOM(); + log_level_str_value = bt_value_string_create_init(arg); + if (!log_level_str_value) { + BT_CLI_LOGE_APPEND_CAUSE_OOM(); + goto error; + } + + if (bt_value_array_set_element_by_index(non_opt_loglevels, idx, + log_level_str_value)) { + bt_value_put_ref(log_level_str_value); + BT_CLI_LOGE_APPEND_CAUSE_OOM(); + goto error; + } + } else { + BT_CLI_LOGE_APPEND_CAUSE( + "No current component (--component option) or non-option argument to assign a log level to:\n %s", + arg); goto error; } @@ -3730,18 +3783,24 @@ struct bt_config *bt_config_convert_from_args(int argc, const char *argv[], struct bt_argpar_item_non_opt *argpar_item_non_opt; bt_value_array_append_element_status append_status; - current_item_type = CONVERT_CURRENT_ITEM_TYPE_LEFTOVER; + current_item_type = CONVERT_CURRENT_ITEM_TYPE_NON_OPT; argpar_item_non_opt = (struct bt_argpar_item_non_opt *) argpar_item; - append_status = bt_value_array_append_string_element(leftovers, + append_status = bt_value_array_append_string_element(non_opts, argpar_item_non_opt->arg); if (append_status != BT_VALUE_ARRAY_APPEND_ELEMENT_STATUS_OK) { BT_CLI_LOGE_APPEND_CAUSE_OOM(); goto error; } - append_status = bt_value_array_append_empty_array_element(leftover_params); + append_status = bt_value_array_append_empty_array_element(non_opt_params); + if (append_status != BT_VALUE_ARRAY_APPEND_ELEMENT_STATUS_OK) { + BT_CLI_LOGE_APPEND_CAUSE_OOM(); + goto error; + } + + append_status = bt_value_array_append_element(non_opt_loglevels, bt_value_null); if (append_status != BT_VALUE_ARRAY_APPEND_ELEMENT_STATUS_OK) { BT_CLI_LOGE_APPEND_CAUSE_OOM(); goto error; @@ -4070,14 +4129,14 @@ struct bt_config *bt_config_convert_from_args(int argc, const char *argv[], /* Print CTF metadata or print LTTng live sessions */ if (print_ctf_metadata) { - const bt_value *bt_val_leftover; + const bt_value *bt_val_non_opt; - if (bt_value_array_is_empty(leftovers)) { + if (bt_value_array_is_empty(non_opts)) { BT_CLI_LOGE_APPEND_CAUSE("--output-format=ctf-metadata specified without a path."); goto error; } - if (bt_value_array_get_size(leftovers) > 1) { + if (bt_value_array_get_length(non_opts) > 1) { BT_CLI_LOGE_APPEND_CAUSE("Too many paths specified for --output-format=ctf-metadata."); goto error; } @@ -4087,9 +4146,9 @@ struct bt_config *bt_config_convert_from_args(int argc, const char *argv[], goto error; } - bt_val_leftover = bt_value_array_borrow_element_by_index_const(leftovers, 0); + bt_val_non_opt = bt_value_array_borrow_element_by_index_const(non_opts, 0); g_string_assign(cfg->cmd_data.print_ctf_metadata.path, - bt_value_string_get(bt_val_leftover)); + bt_value_string_get(bt_val_non_opt)); if (output) { g_string_assign( @@ -4154,19 +4213,19 @@ struct bt_config *bt_config_convert_from_args(int argc, const char *argv[], } } - /* Decide where the leftover argument(s) go */ - if (bt_value_array_get_size(leftovers) > 0) { + /* Decide where the non-option argument(s) go */ + if (bt_value_array_get_length(non_opts) > 0) { if (implicit_lttng_live_args.exists) { - const bt_value *bt_val_leftover; + const bt_value *bt_val_non_opt; - if (bt_value_array_get_size(leftovers) > 1) { + if (bt_value_array_get_length(non_opts) > 1) { BT_CLI_LOGE_APPEND_CAUSE("Too many URLs specified for --input-format=lttng-live."); goto error; } - bt_val_leftover = bt_value_array_borrow_element_by_index_const(leftovers, 0); + bt_val_non_opt = bt_value_array_borrow_element_by_index_const(non_opts, 0); lttng_live_url_parts = - bt_common_parse_lttng_live_url(bt_value_string_get(bt_val_leftover), + bt_common_parse_lttng_live_url(bt_value_string_get(bt_val_non_opt), error_buf, sizeof(error_buf)); if (!lttng_live_url_parts.proto) { BT_CLI_LOGE_APPEND_CAUSE("Invalid LTTng live URL format: %s.", @@ -4183,7 +4242,7 @@ struct bt_config *bt_config_convert_from_args(int argc, const char *argv[], } g_string_assign(cfg->cmd_data.print_lttng_live_sessions.url, - bt_value_string_get(bt_val_leftover)); + bt_value_string_get(bt_val_non_opt)); if (output) { g_string_assign( @@ -4196,7 +4255,7 @@ struct bt_config *bt_config_convert_from_args(int argc, const char *argv[], ret = append_implicit_component_extra_param( &implicit_lttng_live_args, "url", - bt_value_string_get(bt_val_leftover)); + bt_value_string_get(bt_val_non_opt)); if (ret) { goto error; } @@ -4209,9 +4268,25 @@ struct bt_config *bt_config_convert_from_args(int argc, const char *argv[], } } else { int status; + size_t plugin_count; + const bt_plugin **plugins; + const bt_plugin *plugin; + + status = require_loaded_plugins(plugin_paths); + if (status != 0) { + goto error; + } + + if (auto_source_discovery_restrict_plugin_name) { + plugin_count = 1; + plugin = find_loaded_plugin(auto_source_discovery_restrict_plugin_name); + plugins = &plugin; + } else { + plugin_count = get_loaded_plugins_count(); + plugins = borrow_loaded_plugins(); + } - status = auto_discover_source_components(plugin_paths, leftovers, - auto_source_discovery_restrict_plugin_name, + status = auto_discover_source_components(non_opts, plugins, plugin_count, auto_source_discovery_restrict_component_class_name, *default_log_level >= 0 ? *default_log_level : cli_default_log_level, &auto_disc); @@ -4221,7 +4296,8 @@ struct bt_config *bt_config_convert_from_args(int argc, const char *argv[], } status = create_implicit_component_args_from_auto_discovered_sources( - &auto_disc, leftover_params, discovered_source_args); + &auto_disc, non_opt_params, non_opt_loglevels, + discovered_source_args); if (status != 0) { goto error; } @@ -4257,10 +4333,11 @@ struct bt_config *bt_config_convert_from_args(int argc, const char *argv[], } /* - * If the implicit `source.ctf.lttng-live` component exists, make sure - * there's at least one leftover (which is the URL). + * If the implicit `source.ctf.lttng-live` component exists, + * make sure there's at least one non-option argument (which is + * the URL). */ - if (implicit_lttng_live_args.exists && bt_value_array_is_empty(leftovers)) { + if (implicit_lttng_live_args.exists && bt_value_array_is_empty(non_opts)) { BT_CLI_LOGE_APPEND_CAUSE("Missing URL for implicit `%s` component.", implicit_lttng_live_args.comp_arg->str); goto error; @@ -4443,7 +4520,7 @@ struct bt_config *bt_config_convert_from_args(int argc, const char *argv[], goto error; } - for (i = 0; i < bt_value_array_get_size(run_args); i++) { + for (i = 0; i < bt_value_array_get_length(run_args); i++) { const bt_value *arg_value = bt_value_array_borrow_element_by_index(run_args, i); @@ -4471,7 +4548,7 @@ struct bt_config *bt_config_convert_from_args(int argc, const char *argv[], g_string_free(quoted, TRUE); } - if (i < bt_value_array_get_size(run_args) - 1) { + if (i < bt_value_array_get_length(run_args) - 1) { if (print_run_args) { putchar(' '); } else { @@ -4534,7 +4611,9 @@ end: destroy_glist_of_gstring(source_names); destroy_glist_of_gstring(filter_names); destroy_glist_of_gstring(sink_names); - bt_value_put_ref(leftovers); + bt_value_put_ref(non_opt_params); + bt_value_put_ref(non_opt_loglevels); + bt_value_put_ref(non_opts); finalize_implicit_component_args(&implicit_ctf_output_args); finalize_implicit_component_args(&implicit_lttng_live_args); finalize_implicit_component_args(&implicit_dummy_args);