bool clock_date;
bool clock_gmt;
bool dbg_info_full_path;
+ bool verbose;
};
/* Legacy input format format */
enum legacy_output_format {
LEGACY_OUTPUT_FORMAT_NONE = 0,
LEGACY_OUTPUT_FORMAT_TEXT,
- LEGACY_OUTPUT_FORMAT_CTF_METADATA,
LEGACY_OUTPUT_FORMAT_DUMMY,
};
bt_value_array_size(opts->names) > 0 ||
bt_value_array_size(opts->fields) > 0 ||
opts->no_delta || opts->clock_cycles || opts->clock_seconds ||
- opts->clock_date || opts->clock_gmt ||
+ opts->clock_date || opts->clock_gmt || opts->verbose ||
opts->dbg_info_full_path;
}
BT_PUT(cfg->cmd_data.help.plugin_paths);
BT_PUT(cfg->cmd_data.help.cfg_component);
break;
- case BT_CONFIG_COMMAND_QUERY_INFO:
- BT_PUT(cfg->cmd_data.query_info.plugin_paths);
- BT_PUT(cfg->cmd_data.query_info.cfg_component);
+ case BT_CONFIG_COMMAND_QUERY:
+ BT_PUT(cfg->cmd_data.query.plugin_paths);
+ BT_PUT(cfg->cmd_data.query.cfg_component);
- if (cfg->cmd_data.query_info.action) {
- g_string_free(cfg->cmd_data.query_info.action, TRUE);
+ if (cfg->cmd_data.query.object) {
+ g_string_free(cfg->cmd_data.query.object, TRUE);
}
break;
default:
goto error;
}
+ if (bt_value_map_insert_bool(params, "verbose",
+ text_legacy_opts->verbose)) {
+ print_err_oom();
+ goto error;
+ }
+
if (insert_flat_names_fields_from_array(params,
text_legacy_opts->names, "name")) {
goto error;
plugin_name = "text";
component_name = "text";
break;
- case LEGACY_OUTPUT_FORMAT_CTF_METADATA:
- plugin_name = "ctf";
- component_name = "metadata-text";
- break;
case LEGACY_OUTPUT_FORMAT_DUMMY:
plugin_name = "utils";
component_name = "dummy";
case LEGACY_OUTPUT_FORMAT_TEXT:
output_format = "text";
break;
- case LEGACY_OUTPUT_FORMAT_CTF_METADATA:
- output_format = "ctf-metadata";
- break;
case LEGACY_OUTPUT_FORMAT_DUMMY:
output_format = "dummy";
break;
case LEGACY_OUTPUT_FORMAT_TEXT:
g_string_append(str, "text.text");
break;
- case LEGACY_OUTPUT_FORMAT_CTF_METADATA:
- g_string_append(str, "ctf.metadata-text");
- break;
case LEGACY_OUTPUT_FORMAT_DUMMY:
g_string_append(str, "utils.dummy");
break;
text_legacy_opts->clock_date);
g_string_append_bool_param(str, "clock-gmt",
text_legacy_opts->clock_gmt);
+ g_string_append_bool_param(str, "verbose",
+ text_legacy_opts->verbose);
ret = append_prefixed_flag_params(str, text_legacy_opts->names,
"name");
if (ret) {
bool legacy_output = false;
/* Determine if the input and output should be legacy-style */
- if (*legacy_input_format != LEGACY_INPUT_FORMAT_NONE ||
+ if (cfg->cmd_data.convert.print_ctf_metadata ||
+ *legacy_input_format != LEGACY_INPUT_FORMAT_NONE ||
!bt_value_array_is_empty(legacy_input_paths) ||
ctf_legacy_opts_is_any_set(ctf_legacy_opts)) {
legacy_input = true;
/* Make sure no non-legacy sources are specified */
if (cfg->cmd_data.convert.sources->len != 0) {
- print_input_legacy_to_sources(*legacy_input_format,
- legacy_input_paths, ctf_legacy_opts);
+ if (cfg->cmd_data.convert.print_ctf_metadata) {
+ printf_err("You cannot instantiate a source component with the `ctf-metadata` output format\n");
+ } else {
+ print_input_legacy_to_sources(
+ *legacy_input_format,
+ legacy_input_paths, ctf_legacy_opts);
+ }
+
goto error;
}
}
- if (legacy_output) {
+ /*
+ * Strict rule: if we need to print the CTF metadata, the input
+ * format must be legacy and CTF. Also there should be no
+ * other sinks, and no legacy output format.
+ */
+ if (cfg->cmd_data.convert.print_ctf_metadata) {
+ if (*legacy_input_format != LEGACY_INPUT_FORMAT_CTF) {
+ printf_err("The `ctf-metadata` output format requires legacy `ctf` input format\n");
+ goto error;
+ }
+
+ if (bt_value_array_size(legacy_input_paths) != 1) {
+ printf_err("You need to specify exactly one path with the `ctf-metadata` output format\n");
+ goto error;
+ }
+
+ if (legacy_output) {
+ printf_err("You cannot use another legacy output format with the `ctf-metadata` output format\n");
+ goto error;
+ }
+
+ if (cfg->cmd_data.convert.sinks->len != 0) {
+ printf_err("You cannot instantiate a sink component with the `ctf-metadata` output format\n");
+ goto error;
+ goto error;
+ }
+ } else if (legacy_output) {
/*
* If no legacy output format was specified, default to
* "text".
}
}
- /*
- * If the output is the legacy "ctf-metadata" format, then the
- * input should be the legacy "ctf" input format.
- */
- if (*legacy_output_format == LEGACY_OUTPUT_FORMAT_CTF_METADATA &&
- *legacy_input_format != LEGACY_INPUT_FORMAT_CTF) {
- printf_err("Legacy `ctf-metadata` output format requires using legacy `ctf` input format\n");
- goto error;
- }
-
return true;
error:
return cfg;
}
-static struct bt_config *bt_config_query_info_create(
+static struct bt_config *bt_config_query_create(
struct bt_value *initial_plugin_paths)
{
struct bt_config *cfg;
/* Create config */
- cfg = bt_config_base_create(BT_CONFIG_COMMAND_QUERY_INFO);
+ cfg = bt_config_base_create(BT_CONFIG_COMMAND_QUERY);
if (!cfg) {
print_err_oom();
goto error;
}
if (initial_plugin_paths) {
- cfg->cmd_data.query_info.plugin_paths =
+ cfg->cmd_data.query.plugin_paths =
bt_get(initial_plugin_paths);
} else {
- cfg->cmd_data.query_info.plugin_paths =
+ cfg->cmd_data.query.plugin_paths =
bt_value_array_create();
- if (!cfg->cmd_data.query_info.plugin_paths) {
+ if (!cfg->cmd_data.query.plugin_paths) {
print_err_oom();
goto error;
}
}
- cfg->cmd_data.query_info.action = g_string_new(NULL);
- if (!cfg->cmd_data.query_info.action) {
+ cfg->cmd_data.query.object = g_string_new(NULL);
+ if (!cfg->cmd_data.query.object) {
print_err_oom();
goto error;
}
* Prints the help command usage.
*/
static
-void print_query_info_usage(FILE *fp)
+void print_query_usage(FILE *fp)
{
- fprintf(fp, "Usage: babeltrace [GEN OPTS] query-info [OPTS] ACTION --source=PLUGIN.COMPCLS\n");
- fprintf(fp, " babeltrace [GEN OPTS] query-info [OPTS] ACTION --filter=PLUGIN.COMPCLS\n");
- fprintf(fp, " babeltrace [GEN OPTS] query-info [OPTS] ACTION --sink=PLUGIN.COMPCLS\n");
+ fprintf(fp, "Usage: babeltrace [GEN OPTS] query [OPTS] OBJECT --source=PLUGIN.COMPCLS\n");
+ fprintf(fp, " babeltrace [GEN OPTS] query [OPTS] OBJECT --filter=PLUGIN.COMPCLS\n");
+ fprintf(fp, " babeltrace [GEN OPTS] query [OPTS] OBJECT --sink=PLUGIN.COMPCLS\n");
fprintf(fp, "\n");
fprintf(fp, "Options:\n");
fprintf(fp, "\n");
- fprintf(fp, " --filter=PLUGIN.COMPCLS Query info from the filter component class\n");
- fprintf(fp, " COMPCLS found in the plugin PLUGIN\n");
+ fprintf(fp, " --filter=PLUGIN.COMPCLS Query object from the filter component\n");
+ fprintf(fp, " class COMPCLS found in 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");
fprintf(fp, " (see the expected format of PARAMS below)\n");
fprintf(fp, " --plugin-path=PATH[:PATH]... Add PATH to the list of paths from which\n");
fprintf(fp, " dynamic plugins can be loaded\n");
- fprintf(fp, " --sink=PLUGIN.COMPCLS Query info from the sink component class\n");
- fprintf(fp, " COMPCLS found in the plugin PLUGIN\n");
- fprintf(fp, " --source=PLUGIN.COMPCLS Query info from the source component class\n");
+ fprintf(fp, " --sink=PLUGIN.COMPCLS Query object from the sink component class\n");
fprintf(fp, " COMPCLS found in the plugin PLUGIN\n");
+ fprintf(fp, " --source=PLUGIN.COMPCLS Query object from the source component\n");
+ fprintf(fp, " class COMPCLS found in the plugin PLUGIN\n");
fprintf(fp, " -h --help Show this help and quit\n");
fprintf(fp, "\n\n");
print_expected_params_format(fp);
}
-static struct poptOption query_info_long_options[] = {
+static struct poptOption query_long_options[] = {
/* longName, shortName, argInfo, argPtr, value, descrip, argDesc */
{ "filter", '\0', POPT_ARG_STRING, NULL, OPT_FILTER, NULL, NULL },
{ "help", 'h', POPT_ARG_NONE, NULL, OPT_HELP, NULL, NULL },
};
/*
- * Creates a Babeltrace config object from the arguments of a query-info
+ * Creates a Babeltrace config object from the arguments of a query
* command.
*
* *retcode is set to the appropriate exit code to use.
*/
-struct bt_config *bt_config_query_info_from_args(int argc, const char *argv[],
+struct bt_config *bt_config_query_from_args(int argc, const char *argv[],
int *retcode, bool omit_system_plugin_path,
bool omit_home_plugin_path,
struct bt_value *initial_plugin_paths)
struct bt_value *params = bt_value_null;
*retcode = 0;
- cfg = bt_config_query_info_create(initial_plugin_paths);
+ cfg = bt_config_query_create(initial_plugin_paths);
if (!cfg) {
print_err_oom();
goto error;
}
- cfg->cmd_data.query_info.omit_system_plugin_path =
+ cfg->cmd_data.query.omit_system_plugin_path =
omit_system_plugin_path;
- cfg->cmd_data.query_info.omit_home_plugin_path = omit_home_plugin_path;
- ret = append_env_var_plugin_paths(cfg->cmd_data.query_info.plugin_paths);
+ cfg->cmd_data.query.omit_home_plugin_path = omit_home_plugin_path;
+ ret = append_env_var_plugin_paths(cfg->cmd_data.query.plugin_paths);
if (ret) {
printf_err("Cannot append plugin paths from BABELTRACE_PLUGIN_PATH\n");
goto error;
/* Parse options */
pc = poptGetContext(NULL, argc, (const char **) argv,
- query_info_long_options, 0);
+ query_long_options, 0);
if (!pc) {
printf_err("Cannot get popt context\n");
goto error;
printf_debug("Skipping non-system plugin paths for setuid/setgid binary\n");
} else {
if (bt_config_append_plugin_paths(
- cfg->cmd_data.query_info.plugin_paths,
+ cfg->cmd_data.query.plugin_paths,
arg)) {
printf_err("Invalid --plugin-path option's argument:\n %s\n",
arg);
}
break;
case OPT_OMIT_SYSTEM_PLUGIN_PATH:
- cfg->cmd_data.query_info.omit_system_plugin_path = true;
+ cfg->cmd_data.query.omit_system_plugin_path = true;
break;
case OPT_OMIT_HOME_PLUGIN_PATH:
- cfg->cmd_data.query_info.omit_home_plugin_path = true;
+ cfg->cmd_data.query.omit_home_plugin_path = true;
break;
case OPT_SOURCE:
case OPT_FILTER:
{
enum bt_component_class_type type;
- if (cfg->cmd_data.query_info.cfg_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;
assert(false);
}
- cfg->cmd_data.query_info.cfg_component =
+ cfg->cmd_data.query.cfg_component =
bt_config_component_from_arg(type, arg);
- if (!cfg->cmd_data.query_info.cfg_component) {
+ if (!cfg->cmd_data.query.cfg_component) {
printf_err("Invalid format for --source/--filter/--sink option's argument:\n %s\n",
arg);
goto error;
}
/* Default parameters: null */
- bt_put(cfg->cmd_data.query_info.cfg_component->params);
- cfg->cmd_data.query_info.cfg_component->params =
+ bt_put(cfg->cmd_data.query.cfg_component->params);
+ cfg->cmd_data.query.cfg_component->params =
bt_value_null;
break;
}
break;
}
case OPT_HELP:
- print_query_info_usage(stdout);
+ print_query_usage(stdout);
*retcode = -1;
BT_PUT(cfg);
goto end;
arg = NULL;
}
- if (!cfg->cmd_data.query_info.cfg_component) {
+ if (!cfg->cmd_data.query.cfg_component) {
printf_err("No target component class specified with --source/--filter/--sink option\n");
goto error;
}
assert(params);
- BT_MOVE(cfg->cmd_data.query_info.cfg_component->params, params);
+ BT_MOVE(cfg->cmd_data.query.cfg_component->params, params);
/* Check for option parsing error */
if (opt < -1) {
/*
* We need exactly one leftover argument which is the
- * mandatory action.
+ * mandatory object.
*/
leftover = poptGetArg(pc);
if (leftover) {
if (strlen(leftover) == 0) {
- printf_err("Invalid empty action\n");
+ printf_err("Invalid empty object\n");
goto error;
}
- g_string_assign(cfg->cmd_data.query_info.action, leftover);
+ g_string_assign(cfg->cmd_data.query.object, leftover);
} else {
- print_query_info_usage(stdout);
+ print_query_usage(stdout);
*retcode = -1;
BT_PUT(cfg);
goto end;
}
if (append_home_and_system_plugin_paths(
- cfg->cmd_data.query_info.plugin_paths,
- cfg->cmd_data.query_info.omit_system_plugin_path,
- cfg->cmd_data.query_info.omit_home_plugin_path)) {
+ cfg->cmd_data.query.plugin_paths,
+ cfg->cmd_data.query.omit_system_plugin_path,
+ cfg->cmd_data.query.omit_home_plugin_path)) {
printf_err("Cannot append home and system plugin paths\n");
goto error;
}
LEGACY_OUTPUT_FORMAT_DUMMY;
break;
} else if (!strcmp(arg, "ctf-metadata")) {
- /* Legacy CTF-metadata output format */
- if (legacy_output_format) {
- print_err_dup_legacy_output();
- goto error;
- }
-
- legacy_output_format =
- LEGACY_OUTPUT_FORMAT_CTF_METADATA;
+ cfg->cmd_data.convert.print_ctf_metadata = true;
break;
}
}
BT_PUT(cfg);
goto end;
case OPT_VERBOSE:
+ text_legacy_opts.verbose = true;
cfg->verbose = true;
break;
case OPT_DEBUG:
} 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");
+ printf_err("Arguments specified for implicit input format, but an explicit source component instance has been specified: overriding it\n");
goto error;
}
}
}
+ /*
+ * At this point if we need to print the CTF metadata text, we
+ * don't care about the legacy/implicit sinks and component
+ * connections.
+ */
+ if (cfg->cmd_data.convert.print_ctf_metadata) {
+ goto end;
+ }
+
/*
* If there's a legacy output format, convert it to sink
* component configurations.
fprintf(fp, " convert Build a trace conversion graph and run it (default)\n");
fprintf(fp, " help Get help for a plugin or a component class\n");
fprintf(fp, " list-plugins List available plugins and their content\n");
- fprintf(fp, " query-info Query information from a component class\n");
+ fprintf(fp, " query Query objects from a component class\n");
fprintf(fp, "\n");
fprintf(fp, "Use `babeltrace COMMAND --help` to show the help of COMMAND.\n");
}
command = BT_CONFIG_COMMAND_LIST_PLUGINS;
} else if (strcmp(cur_arg, "help") == 0) {
command = BT_CONFIG_COMMAND_HELP;
- } else if (strcmp(cur_arg, "query-info") == 0) {
- command = BT_CONFIG_COMMAND_QUERY_INFO;
+ } else if (strcmp(cur_arg, "query") == 0) {
+ command = BT_CONFIG_COMMAND_QUERY;
} else {
/*
* Unknown argument, but not a known
command_argv, retcode, omit_system_plugin_path,
omit_home_plugin_path, initial_plugin_paths);
break;
- case BT_CONFIG_COMMAND_QUERY_INFO:
- config = bt_config_query_info_from_args(command_argc,
+ case BT_CONFIG_COMMAND_QUERY:
+ config = bt_config_query_from_args(command_argc,
command_argv, retcode, omit_system_plugin_path,
omit_home_plugin_path, initial_plugin_paths);
break;