X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=cli%2Fbabeltrace-cfg-cli-args.c;h=ad83e4c3254592e96d180648300192508c912950;hb=0b5139375eb31822909dc178ee5cbd7fe8982471;hp=cd8fb1892d831656017865e400f0918c941c715a;hpb=42ca00b101cd9f784660d1495aca23fa3dd1fe6e;p=babeltrace.git diff --git a/cli/babeltrace-cfg-cli-args.c b/cli/babeltrace-cfg-cli-args.c index cd8fb189..ad83e4c3 100644 --- a/cli/babeltrace-cfg-cli-args.c +++ b/cli/babeltrace-cfg-cli-args.c @@ -22,6 +22,9 @@ * SOFTWARE. */ +#define BT_LOG_TAG "CLI-CFG-CLI-ARGS" +#include "logging.h" + #include #include #include @@ -39,9 +42,6 @@ #include "babeltrace-cfg-cli-args.h" #include "babeltrace-cfg-cli-args-connect.h" -#define BT_LOG_TAG "CLI-CFG-ARGS" -#include "logging.h" - /* * Error printf() macro which prepends "Error: " the first time it's * called. This gives a nicer feel than having a bunch of error prefixes @@ -656,7 +656,7 @@ void plugin_comp_cls_names(const char *arg, char **name, char **plugin, /* Parse the plugin name */ gs_plugin = bt_common_string_until(at, ".:\\", ".", &end_pos); if (!gs_plugin || gs_plugin->len == 0 || at[end_pos] == '\0') { - printf_err("Missing plugin name\n"); + printf_err("Missing plugin or component class name\n"); goto error; } @@ -1410,7 +1410,7 @@ int append_env_var_plugin_paths(struct bt_value *plugin_paths) const char *envvar; if (bt_common_is_setuid_setgid()) { - printf_debug("Skipping non-system plugin paths for setuid/setgid binary\n"); + BT_LOGI_STR("Skipping non-system plugin paths for setuid/setgid binary."); goto end; } @@ -1437,7 +1437,7 @@ int append_home_and_system_plugin_paths(struct bt_value *plugin_paths, if (!omit_home_plugin_path) { if (bt_common_is_setuid_setgid()) { - printf_debug("Skipping non-system plugin paths for setuid/setgid binary\n"); + BT_LOGI_STR("Skipping non-system plugin paths for setuid/setgid binary."); } else { char *home_plugin_dir = bt_common_get_home_plugin_path(); @@ -1703,7 +1703,7 @@ int bt_config_append_plugin_paths_check_setuid_setgid( int ret = 0; if (bt_common_is_setuid_setgid()) { - printf_debug("Skipping non-system plugin paths for setuid/setgid binary\n"); + BT_LOGI_STR("Skipping non-system plugin paths for setuid/setgid binary."); goto end; } @@ -1950,13 +1950,10 @@ end: static void print_query_usage(FILE *fp) { - fprintf(fp, "Usage: babeltrace [GEN OPTS] query [OPTS] OBJECT --component=TYPE.PLUGIN.CLS\n"); + fprintf(fp, "Usage: babeltrace [GEN OPTS] query [OPTS] TYPE.PLUGIN.CLS OBJECT\n"); fprintf(fp, "\n"); fprintf(fp, "Options:\n"); fprintf(fp, "\n"); - fprintf(fp, " -c, --component=TYPE.PLUGIN.CLS Query the component class CLS of type TYPE\n"); - fprintf(fp, " (`source`, `filter`, or `sink`) found in\n"); - fprintf(fp, " the plugin PLUGIN\n"); fprintf(fp, " --omit-home-plugin-path Omit home plugins from plugin search path\n"); fprintf(fp, " (~/.local/lib/babeltrace/plugins)\n"); fprintf(fp, " --omit-system-plugin-path Omit system plugins from plugin search path\n"); @@ -1972,7 +1969,6 @@ void print_query_usage(FILE *fp) static struct poptOption query_long_options[] = { /* longName, shortName, argInfo, argPtr, value, descrip, argDesc */ - { "component", 'c', POPT_ARG_STRING, NULL, OPT_COMPONENT, NULL, NULL }, { "help", 'h', POPT_ARG_NONE, NULL, OPT_HELP, NULL, NULL }, { "omit-home-plugin-path", '\0', POPT_ARG_NONE, NULL, OPT_OMIT_HOME_PLUGIN_PATH, NULL, NULL }, { "omit-system-plugin-path", '\0', POPT_ARG_NONE, NULL, OPT_OMIT_SYSTEM_PLUGIN_PATH, NULL, NULL }, @@ -2040,28 +2036,9 @@ struct bt_config *bt_config_query_from_args(int argc, const char *argv[], case OPT_OMIT_HOME_PLUGIN_PATH: cfg->omit_home_plugin_path = true; break; - case OPT_COMPONENT: - if (cfg->cmd_data.query.cfg_component) { - printf_err("Cannot specify more than one plugin and component class:\n %s\n", - arg); - goto error; - } - - cfg->cmd_data.query.cfg_component = - bt_config_component_from_arg(arg); - if (!cfg->cmd_data.query.cfg_component) { - printf_err("Invalid format for --component option's argument:\n %s\n", - arg); - goto error; - } - - /* Default parameters: null */ - bt_put(cfg->cmd_data.query.cfg_component->params); - cfg->cmd_data.query.cfg_component->params = - bt_value_null; - break; case OPT_PARAMS: { + bt_put(params); params = bt_value_from_arg(arg); if (!params) { printf_err("Invalid format for --params option's argument:\n %s\n", @@ -2085,14 +2062,6 @@ struct bt_config *bt_config_query_from_args(int argc, const char *argv[], arg = NULL; } - if (!cfg->cmd_data.query.cfg_component) { - printf_err("No target component class specified with --component option\n"); - goto error; - } - - assert(params); - BT_MOVE(cfg->cmd_data.query.cfg_component->params, params); - /* Check for option parsing error */ if (opt < -1) { printf_err("While parsing command-line options, at option %s: %s\n", @@ -2101,9 +2070,28 @@ struct bt_config *bt_config_query_from_args(int argc, const char *argv[], } /* - * We need exactly one leftover argument which is the - * mandatory object. + * We need exactly two leftover arguments which are the + * mandatory component class specification and query object. */ + leftover = poptGetArg(pc); + if (leftover) { + cfg->cmd_data.query.cfg_component = + bt_config_component_from_arg(leftover); + if (!cfg->cmd_data.query.cfg_component) { + printf_err("Invalid format for component class specification:\n %s\n", + leftover); + goto error; + } + + assert(params); + BT_MOVE(cfg->cmd_data.query.cfg_component->params, params); + } else { + print_query_usage(stdout); + *retcode = -1; + BT_PUT(cfg); + goto end; + } + leftover = poptGetArg(pc); if (leftover) { if (strlen(leftover) == 0) { @@ -2140,7 +2128,7 @@ end: poptFreeContext(pc); } - BT_PUT(params); + bt_put(params); free(arg); return cfg; } @@ -2719,7 +2707,7 @@ struct bt_config *bt_config_run_from_args_array(struct bt_value *run_args, { struct bt_config *cfg = NULL; const char **argv; - size_t i; + int64_t i, len; const size_t argc = bt_value_array_size(run_args) + 1; argv = calloc(argc, sizeof(*argv)); @@ -2730,7 +2718,12 @@ struct bt_config *bt_config_run_from_args_array(struct bt_value *run_args, argv[0] = "run"; - for (i = 0; i < bt_value_array_size(run_args); i++) { + len = bt_value_array_size(run_args); + if (len < 0) { + printf_err("Invalid executable arguments\n"); + goto end; + } + for (i = 0; i < len; i++) { int ret; struct bt_value *arg_value = bt_value_array_get(run_args, i); const char *arg; @@ -2868,7 +2861,7 @@ void print_convert_usage(FILE *fp) fprintf(fp, " `text`:\n"); fprintf(fp, " Create an implicit `sink.text.pretty`\n"); fprintf(fp, " component\n"); - fprintf(fp, " `text`:\n"); + fprintf(fp, " `ctf`:\n"); fprintf(fp, " Create an implicit `sink.ctf.fs`\n"); fprintf(fp, " component\n"); fprintf(fp, " `dummy`:\n"); @@ -3548,7 +3541,7 @@ int fill_implicit_ctf_inputs_args(GPtrArray *implicit_ctf_inputs_args, BT_PUT(impl_args->extra_params); impl_args->extra_params = bt_value_copy(base_implicit_ctf_input_args->extra_params); - if (!impl_args) { + if (!impl_args->extra_params) { print_err_oom(); destroy_implicit_component_args(impl_args); goto error; @@ -3596,6 +3589,7 @@ struct bt_config *bt_config_convert_from_args(int argc, const char *argv[], bool got_output_format_opt = false; bool trimmer_has_begin = false; bool trimmer_has_end = false; + bool stream_intersection_mode = false; GString *cur_name = NULL; GString *cur_name_prefix = NULL; const char *leftover = NULL; @@ -4093,29 +4087,27 @@ struct bt_config *bt_config_convert_from_args(int argc, const char *argv[], break; case OPT_CLOCK_FORCE_CORRELATE: append_implicit_component_param( - &implicit_muxer_args, "assume-absolute-clock-classes", "yes"); + &implicit_muxer_args, + "assume-absolute-clock-classes", "yes"); break; case OPT_CLOCK_GMT: append_implicit_component_param( &implicit_text_args, "clock-gmt", "yes"); + append_implicit_component_param( + &implicit_trimmer_args, "clock-gmt", "yes"); implicit_text_args.exists = true; break; case OPT_CLOCK_OFFSET: base_implicit_ctf_input_args.exists = true; - ret = append_implicit_component_extra_param( - &base_implicit_ctf_input_args, "clock-offset-cycles", arg); - if (ret) { - goto error; - } + append_implicit_component_param( + &base_implicit_ctf_input_args, + "clock-class-offset-s", arg); break; case OPT_CLOCK_OFFSET_NS: base_implicit_ctf_input_args.exists = true; - ret = append_implicit_component_extra_param( - &base_implicit_ctf_input_args, - "clock-offset-ns", arg); - if (ret) { - goto error; - } + append_implicit_component_param( + &base_implicit_ctf_input_args, + "clock-class-offset-ns", arg); break; case OPT_CLOCK_SECONDS: append_implicit_component_param( @@ -4265,10 +4257,11 @@ struct bt_config *bt_config_convert_from_args(int argc, const char *argv[], print_run_args_0 = true; break; case OPT_STREAM_INTERSECTION: - append_implicit_component_param( - &base_implicit_ctf_input_args, - "stream-intersection", "yes"); - base_implicit_ctf_input_args.exists = true; + /* + * Applies to all traces implementing the trace-info + * query. + */ + stream_intersection_mode = true; break; case OPT_VERBOSE: if (*log_level != 'V' && *log_level != 'D') { @@ -4654,6 +4647,11 @@ struct bt_config *bt_config_convert_from_args(int argc, const char *argv[], * here. */ if (print_run_args || print_run_args_0) { + if (stream_intersection_mode) { + printf_err("Cannot specify --stream-intersection with --run-args or --run-args-0\n"); + goto error; + } + for (i = 0; i < bt_value_array_size(run_args); i++) { struct bt_value *arg_value = bt_value_array_get(run_args, i); @@ -4704,6 +4702,7 @@ struct bt_config *bt_config_convert_from_args(int argc, const char *argv[], goto error; } + cfg->cmd_data.run.stream_intersection_mode = stream_intersection_mode; goto end; error: