X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=converter%2Fbabeltrace-cfg.c;h=5b9c838f599b78a6e4f868b29db115a7b2c01f58;hb=9a8a7bae967c8bbb45e98cc88024bc40231ded63;hp=3aa24f763e9c5b8f9033e4ccdd22caf43a5512c9;hpb=6cf24c610dcc852ee1b84d7d19725dc0c3bef117;p=babeltrace.git diff --git a/converter/babeltrace-cfg.c b/converter/babeltrace-cfg.c index 3aa24f76..5b9c838f 100644 --- a/converter/babeltrace-cfg.c +++ b/converter/babeltrace-cfg.c @@ -39,6 +39,7 @@ #define SYSTEM_PLUGIN_PATH INSTALL_LIBDIR "/babeltrace/plugins" #define DEFAULT_SOURCE_COMPONENT_NAME "ctf.fs" +#define DEFAULT_SINK_COMPONENT_NAME "text.text" #define HOME_ENV_VAR "HOME" #define HOME_SUBPATH "/.babeltrace/plugins" @@ -2004,28 +2005,24 @@ bool validate_cfg(struct bt_config *cfg, enum legacy_output_format *legacy_output_format, struct bt_value *legacy_input_paths, struct ctf_legacy_opts *ctf_legacy_opts, - struct text_legacy_opts *text_legacy_opts, - bool *use_implicit_source) + struct text_legacy_opts *text_legacy_opts) { bool legacy_input = false; bool legacy_output = false; /* Determine if the input and output should be legacy-style */ if (*legacy_input_format != LEGACY_INPUT_FORMAT_NONE || - cfg->sources->len == 0 || !bt_value_array_is_empty(legacy_input_paths) || ctf_legacy_opts_is_any_set(ctf_legacy_opts)) { legacy_input = true; } if (*legacy_output_format != LEGACY_OUTPUT_FORMAT_NONE || - cfg->sinks->len == 0 || text_legacy_opts_is_any_set(text_legacy_opts)) { legacy_output = true; } if (legacy_input) { - *use_implicit_source = false; /* If no legacy input format was specified, default to CTF */ if (*legacy_input_format == LEGACY_INPUT_FORMAT_NONE) { *legacy_input_format = LEGACY_INPUT_FORMAT_CTF; @@ -2055,7 +2052,6 @@ bool validate_cfg(struct bt_config *cfg, } if (legacy_output) { - *use_implicit_source = false; /* * If no legacy output format was specified, default to * "text". @@ -2327,6 +2323,30 @@ error: return -1; } +static int append_sources_from_implicit_params(GPtrArray *sources, + struct bt_config_component *implicit_source_comp) +{ + size_t i; + size_t len = sources->len; + + for (i = 0; i < len; i++) { + struct bt_config_component *comp; + struct bt_value *params_to_set; + + comp = g_ptr_array_index(sources, i); + params_to_set = bt_value_map_extend(comp->params, + implicit_source_comp->params); + if (!params_to_set) { + printf_err("Cannot extend legacy component parameters with non-legacy parameters\n"); + goto error; + } + BT_MOVE(comp->params, params_to_set); + } + return 0; +error: + return -1; +} + /* * Returns a Babeltrace configuration, out of command-line arguments, * containing everything that is needed to instanciate specific @@ -2346,7 +2366,7 @@ struct bt_config *bt_config_from_args(int argc, const char *argv[], int *exit_co struct text_legacy_opts text_legacy_opts; enum legacy_input_format legacy_input_format = LEGACY_INPUT_FORMAT_NONE; enum legacy_output_format legacy_output_format = - LEGACY_OUTPUT_FORMAT_NONE; + LEGACY_OUTPUT_FORMAT_NONE; struct bt_value *legacy_input_paths = NULL; struct bt_config_component *implicit_source_comp = NULL; struct bt_config_component *cur_cfg_comp = NULL; @@ -2355,17 +2375,12 @@ struct bt_config *bt_config_from_args(int argc, const char *argv[], int *exit_co enum bt_config_component_dest cur_cfg_comp_dest = BT_CONFIG_COMPONENT_DEST_SOURCE; struct bt_value *cur_base_params = NULL; - int opt; + int opt, nr_omit_opt = 0; memset(&ctf_legacy_opts, 0, sizeof(ctf_legacy_opts)); memset(&text_legacy_opts, 0, sizeof(text_legacy_opts)); *exit_code = 0; - if (argc <= 1) { - print_usage(stdout); - goto end; - } - text_legacy_opts.output = g_string_new(NULL); if (!text_legacy_opts.output) { print_err_oom(); @@ -2458,9 +2473,11 @@ struct bt_config *bt_config_from_args(int argc, const char *argv[], int *exit_co break; case OPT_OMIT_SYSTEM_PLUGIN_PATH: omit_system_plugin_path = true; + nr_omit_opt += 2; break; case OPT_OMIT_HOME_PLUGIN_PATH: omit_home_plugin_path = true; + nr_omit_opt += 2; break; case OPT_OUTPUT_PATH: if (text_legacy_opts.output->len > 0) { @@ -2532,7 +2549,7 @@ struct bt_config *bt_config_from_args(int argc, const char *argv[], int *exit_co assert(cur_base_params); bt_put(cur_cfg_comp->params); cur_cfg_comp->params = bt_value_copy(cur_base_params); - if (!cur_cfg_comp) { + if (!cur_cfg_comp->params) { print_err_oom(); goto end; } @@ -2594,7 +2611,7 @@ struct bt_config *bt_config_from_args(int argc, const char *argv[], int *exit_co assert(cur_base_params); bt_put(cur_cfg_comp->params); cur_cfg_comp->params = bt_value_copy(cur_base_params); - if (!cur_cfg_comp) { + if (!cur_cfg_comp->params) { print_err_oom(); goto end; } @@ -2842,6 +2859,11 @@ struct bt_config *bt_config_from_args(int argc, const char *argv[], int *exit_co arg = NULL; } + if (argc - nr_omit_opt <= 1) { + print_usage(stdout); + goto put_cfg; + } + /* Check for option parsing error */ if (opt < -1) { printf_err("While parsing command-line options, at option %s: %s\n", @@ -2877,23 +2899,11 @@ struct bt_config *bt_config_from_args(int argc, const char *argv[], int *exit_co /* Validate legacy/non-legacy options */ if (!validate_cfg(cfg, &legacy_input_format, &legacy_output_format, legacy_input_paths, &ctf_legacy_opts, - &text_legacy_opts, &use_implicit_source)) { + &text_legacy_opts)) { printf_err("Command-line options form an invalid configuration\n"); goto error; } - if (use_implicit_source) { - add_cfg_comp(cfg, implicit_source_comp, - BT_CONFIG_COMPONENT_DEST_SOURCE); - implicit_source_comp = NULL; - } else { - if (implicit_source_comp - && !bt_value_map_is_empty(implicit_source_comp->params)) { - printf_err("Arguments specified for implicit source, but an explicit source has been specified, overriding it\n"); - goto error; - } - } - /* * If there's a legacy input format, convert it to source * component configurations. @@ -2905,6 +2915,24 @@ struct bt_config *bt_config_from_args(int argc, const char *argv[], int *exit_co printf_err("Cannot convert legacy input format options to source component instance(s)\n"); goto error; } + if (append_sources_from_implicit_params(cfg->sources, + implicit_source_comp)) { + printf_err("Cannot initialize legacy component parameters\n"); + goto error; + } + use_implicit_source = false; + } else { + if (use_implicit_source) { + add_cfg_comp(cfg, implicit_source_comp, + BT_CONFIG_COMPONENT_DEST_SOURCE); + implicit_source_comp = NULL; + } else { + if (implicit_source_comp + && !bt_value_map_is_empty(implicit_source_comp->params)) { + printf_err("Arguments specified for implicit source, but an explicit source has been specified, overriding it\n"); + goto error; + } + } } /* @@ -2919,13 +2947,25 @@ struct bt_config *bt_config_from_args(int argc, const char *argv[], int *exit_co } } + if (cfg->sinks->len == 0) { + /* Use implicit sink as default. */ + cur_cfg_comp = bt_config_component_from_arg(DEFAULT_SINK_COMPONENT_NAME); + if (!cur_cfg_comp) { + printf_error("Cannot find implicit sink plugin \"%s\"\n", + DEFAULT_SINK_COMPONENT_NAME); + } + add_cfg_comp(cfg, cur_cfg_comp, + BT_CONFIG_COMPONENT_DEST_SINK); + cur_cfg_comp = NULL; + } + goto end; error: + *exit_code = 1; +put_cfg: BT_PUT(cfg); cfg = NULL; - *exit_code = 1; - end: if (pc) { poptFreeContext(pc);