Fix: print usage even if omit arguments are received
[babeltrace.git] / converter / babeltrace-cfg.c
index d3072488e0643f414c2cfe6014542919e2ec1fb0..6beaf383bfdfef77c2f69f0be9020986699a9891 100644 (file)
@@ -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"
 
@@ -2011,14 +2012,12 @@ bool validate_cfg(struct bt_config *cfg,
 
        /* 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;
        }
@@ -2324,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
@@ -2352,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();
@@ -2455,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) {
@@ -2529,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;
                        }
@@ -2591,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;
                        }
@@ -2839,26 +2859,9 @@ struct bt_config *bt_config_from_args(int argc, const char *argv[], int *exit_co
                arg = NULL;
        }
 
-       if (add_internal_plugin_paths(cfg)) {
-               goto error;
-       }
-
-       /* Append current component configuration, if any */
-       if (cur_cfg_comp && !cur_is_implicit_source) {
-               add_cfg_comp(cfg, cur_cfg_comp, cur_cfg_comp_dest);
-       }
-       cur_cfg_comp = NULL;
-
-       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 (argc - nr_omit_opt <= 1) {
+               print_usage(stdout);
+               goto put_cfg;
        }
 
        /* Check for option parsing error */
@@ -2883,6 +2886,16 @@ struct bt_config *bt_config_from_args(int argc, const char *argv[], int *exit_co
                }
        }
 
+       if (add_internal_plugin_paths(cfg)) {
+               goto error;
+       }
+
+       /* Append current component configuration, if any */
+       if (cur_cfg_comp && !cur_is_implicit_source) {
+               add_cfg_comp(cfg, cur_cfg_comp, cur_cfg_comp_dest);
+       }
+       cur_cfg_comp = NULL;
+
        /* Validate legacy/non-legacy options */
        if (!validate_cfg(cfg, &legacy_input_format, &legacy_output_format,
                        legacy_input_paths, &ctf_legacy_opts,
@@ -2902,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;
+                       }
+               }
        }
 
        /*
@@ -2916,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);
This page took 0.026728 seconds and 4 git commands to generate.