X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=cli%2Fbabeltrace-cfg-cli-args.c;h=80802fbedf022b6a04d009e2bae2048ec965fa92;hb=707b7d3548cc010d582f7faed43630aed26508fd;hp=e2608748b6e6381e8210acf132553dad25906566;hpb=173527614a7b73dd72b55830a983c80e865c6fe0;p=babeltrace.git diff --git a/cli/babeltrace-cfg-cli-args.c b/cli/babeltrace-cfg-cli-args.c index e2608748..80802fbe 100644 --- a/cli/babeltrace-cfg-cli-args.c +++ b/cli/babeltrace-cfg-cli-args.c @@ -22,25 +22,27 @@ * SOFTWARE. */ +#define BT_LOG_TAG "CLI-CFG-CLI-ARGS" +#include "logging.h" + #include #include #include -#include +#include #include #include #include #include #include #include +#include #include #include #include #include "babeltrace-cfg.h" #include "babeltrace-cfg-cli-args.h" #include "babeltrace-cfg-cli-args-connect.h" - -#define BT_LOG_TAG "CLI-CFG-ARGS" -#include "logging.h" +#include "version.h" /* * Error printf() macro which prepends "Error: " the first time it's @@ -83,7 +85,7 @@ struct ini_parsing_state { GScanner *scanner; /* Output map value object being filled (owned by this) */ - struct bt_value *params; + struct bt_private_value *params; /* Next expected FSM state */ enum ini_parsing_fsm_state expecting; @@ -240,7 +242,9 @@ int ini_handle_state(struct ini_parsing_state *state) goto error; } - if (bt_value_map_has_key(state->params, state->last_map_key)) { + if (bt_value_map_has_entry( + bt_private_value_as_value(state->params), + state->last_map_key)) { g_string_append_printf(state->ini_error, "Duplicate parameter key: `%s`\n", state->last_map_key); @@ -291,19 +295,22 @@ int ini_handle_state(struct ini_parsing_state *state) goto error; } - value = bt_value_integer_create_init( - (int64_t) int_val); + value = bt_private_value_as_value( + bt_private_value_integer_create_init( + (int64_t) int_val)); break; } case G_TOKEN_FLOAT: /* Positive floating point number */ - value = bt_value_float_create_init( - state->scanner->value.v_float); + value = bt_private_value_as_value( + bt_private_value_real_create_init( + state->scanner->value.v_float)); break; case G_TOKEN_STRING: /* Quoted string */ - value = bt_value_string_create_init( - state->scanner->value.v_string); + value = bt_private_value_as_value( + bt_private_value_string_create_init( + state->scanner->value.v_string)); break; case G_TOKEN_IDENTIFIER: { @@ -325,14 +332,17 @@ int ini_handle_state(struct ini_parsing_state *state) } else if (!strcmp(id, "true") || !strcmp(id, "TRUE") || !strcmp(id, "yes") || !strcmp(id, "YES")) { - value = bt_value_bool_create_init(true); + value = bt_private_value_as_value( + bt_private_value_bool_create_init(true)); } else if (!strcmp(id, "false") || !strcmp(id, "FALSE") || !strcmp(id, "no") || !strcmp(id, "NO")) { - value = bt_value_bool_create_init(false); + value = bt_private_value_as_value( + bt_private_value_bool_create_init(false)); } else { - value = bt_value_string_create_init(id); + value = bt_private_value_as_value( + bt_private_value_string_create_init(id)); } break; } @@ -365,14 +375,16 @@ int ini_handle_state(struct ini_parsing_state *state) goto error; } - value = bt_value_integer_create_init( - -((int64_t) int_val)); + value = bt_private_value_as_value( + bt_private_value_integer_create_init( + -((int64_t) int_val))); break; } case G_TOKEN_FLOAT: /* Negative floating point number */ - value = bt_value_float_create_init( - -state->scanner->value.v_float); + value = bt_private_value_as_value( + bt_private_value_real_create_init( + -state->scanner->value.v_float)); break; default: /* Unset value variable will trigger the error */ @@ -413,7 +425,7 @@ error: success: if (value) { - if (bt_value_map_insert(state->params, + if (bt_private_value_map_insert_entry(state->params, state->last_map_key, value)) { /* Only override return value on error */ ret = -1; @@ -421,7 +433,7 @@ success: } end: - BT_PUT(value); + BT_OBJECT_PUT_REF_AND_RESET(value); return ret; } @@ -431,7 +443,8 @@ end: * Return value is owned by the caller. */ static -struct bt_value *bt_value_from_ini(const char *arg, GString *ini_error) +struct bt_private_value *bt_private_value_from_ini(const char *arg, + GString *ini_error) { /* Lexical scanner configuration */ GScannerConfig scanner_config = { @@ -510,7 +523,7 @@ struct bt_value *bt_value_from_ini(const char *arg, GString *ini_error) .ini_error = ini_error, }; - state.params = bt_value_map_create(); + state.params = bt_private_value_map_create(); if (!state.params) { goto error; } @@ -538,7 +551,7 @@ struct bt_value *bt_value_from_ini(const char *arg, GString *ini_error) goto end; error: - BT_PUT(state.params); + BT_OBJECT_PUT_REF_AND_RESET(state.params); end: if (state.scanner) { @@ -556,9 +569,9 @@ end: * Return value is owned by the caller. */ static -struct bt_value *bt_value_from_arg(const char *arg) +struct bt_private_value *bt_private_value_from_arg(const char *arg) { - struct bt_value *params = NULL; + struct bt_private_value *params = NULL; GString *ini_error = NULL; ini_error = g_string_new(NULL); @@ -568,7 +581,7 @@ struct bt_value *bt_value_from_arg(const char *arg) } /* Try INI-style parsing */ - params = bt_value_from_ini(arg, ini_error); + params = bt_private_value_from_ini(arg, ini_error); if (!params) { printf_err("%s", ini_error->str); goto end; @@ -578,6 +591,7 @@ end: if (ini_error) { g_string_free(ini_error, TRUE); } + return params; } @@ -593,8 +607,8 @@ end: * component class name. * * On success, both *plugin and *component are not NULL. *plugin - * and *component are owned by the caller. On success, *name can be NULL - * if no component name was found, and *comp_cls_type is set. + * and *comp_cls are owned by the caller. On success, *name can be NULL + * if no component class name was found, and *comp_cls_type is set. */ static void plugin_comp_cls_names(const char *arg, char **name, char **plugin, @@ -607,10 +621,10 @@ void plugin_comp_cls_names(const char *arg, char **name, char **plugin, GString *gs_comp_cls = NULL; size_t end_pos; - assert(arg); - assert(plugin); - assert(comp_cls); - assert(comp_cls_type); + BT_ASSERT(arg); + BT_ASSERT(plugin); + BT_ASSERT(comp_cls); + BT_ASSERT(comp_cls_type); if (!bt_common_string_is_printable(arg)) { printf_err("Argument contains a non-printable character\n"); @@ -656,7 +670,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; } @@ -729,7 +743,11 @@ end: static void print_version(void) { - puts("Babeltrace " VERSION); + if (GIT_VERSION[0] == '\0') { + puts("Babeltrace " VERSION); + } else { + puts("Babeltrace " VERSION " - " GIT_VERSION); + } } /* @@ -757,7 +775,7 @@ void bt_config_component_destroy(struct bt_object *obj) g_string_free(bt_config_component->instance_name, TRUE); } - BT_PUT(bt_config_component->params); + BT_OBJECT_PUT_REF_AND_RESET(bt_config_component->params); g_free(bt_config_component); end: @@ -784,7 +802,8 @@ struct bt_config_component *bt_config_component_create( goto error; } - bt_object_init(cfg_component, bt_config_component_destroy); + bt_object_init_shared(&cfg_component->base, + bt_config_component_destroy); cfg_component->type = type; cfg_component->plugin_name = g_string_new(plugin_name); if (!cfg_component->plugin_name) { @@ -805,7 +824,7 @@ struct bt_config_component *bt_config_component_create( } /* Start with empty parameters */ - cfg_component->params = bt_value_map_create(); + cfg_component->params = bt_private_value_map_create(); if (!cfg_component->params) { print_err_oom(); goto error; @@ -814,7 +833,7 @@ struct bt_config_component *bt_config_component_create( goto end; error: - BT_PUT(cfg_component); + BT_OBJECT_PUT_REF_AND_RESET(cfg_component); end: return cfg_component; @@ -850,7 +869,7 @@ struct bt_config_component *bt_config_component_from_arg(const char *arg) goto end; error: - BT_PUT(cfg_comp); + BT_OBJECT_PUT_REF_AND_RESET(cfg_comp); end: g_free(name); @@ -872,7 +891,7 @@ void bt_config_destroy(struct bt_object *obj) goto end; } - BT_PUT(cfg->plugin_paths); + BT_OBJECT_PUT_REF_AND_RESET(cfg->plugin_paths); switch (cfg->command) { case BT_CONFIG_COMMAND_RUN: @@ -896,10 +915,10 @@ void bt_config_destroy(struct bt_object *obj) case BT_CONFIG_COMMAND_LIST_PLUGINS: break; case BT_CONFIG_COMMAND_HELP: - BT_PUT(cfg->cmd_data.help.cfg_component); + BT_OBJECT_PUT_REF_AND_RESET(cfg->cmd_data.help.cfg_component); break; case BT_CONFIG_COMMAND_QUERY: - BT_PUT(cfg->cmd_data.query.cfg_component); + BT_OBJECT_PUT_REF_AND_RESET(cfg->cmd_data.query.cfg_component); if (cfg->cmd_data.query.object) { g_string_free(cfg->cmd_data.query.object, TRUE); @@ -909,6 +928,9 @@ void bt_config_destroy(struct bt_object *obj) if (cfg->cmd_data.print_ctf_metadata.path) { g_string_free(cfg->cmd_data.print_ctf_metadata.path, TRUE); + g_string_free( + cfg->cmd_data.print_ctf_metadata.output_path, + TRUE); } break; case BT_CONFIG_COMMAND_PRINT_LTTNG_LIVE_SESSIONS: @@ -916,6 +938,9 @@ void bt_config_destroy(struct bt_object *obj) g_string_free( cfg->cmd_data.print_lttng_live_sessions.url, TRUE); + g_string_free( + cfg->cmd_data.print_lttng_live_sessions.output_path, + TRUE); } break; default: @@ -998,13 +1023,13 @@ GScanner *create_csv_identifiers_scanner(void) * Return value is owned by the caller. */ static -struct bt_value *names_from_arg(const char *arg) +struct bt_private_value *names_from_arg(const char *arg) { GScanner *scanner = NULL; - struct bt_value *names = NULL; + struct bt_private_value *names = NULL; bool found_all = false, found_none = false, found_item = false; - names = bt_value_array_create(); + names = bt_private_value_array_create(); if (!names) { print_err_oom(); goto error; @@ -1029,33 +1054,33 @@ struct bt_value *names_from_arg(const char *arg) !strcmp(identifier, "args") || !strcmp(identifier, "arg")) { found_item = true; - if (bt_value_array_append_string(names, + if (bt_private_value_array_append_string_element(names, "payload")) { goto error; } } else if (!strcmp(identifier, "context") || !strcmp(identifier, "ctx")) { found_item = true; - if (bt_value_array_append_string(names, + if (bt_private_value_array_append_string_element(names, "context")) { goto error; } } else if (!strcmp(identifier, "scope") || !strcmp(identifier, "header")) { found_item = true; - if (bt_value_array_append_string(names, + if (bt_private_value_array_append_string_element(names, identifier)) { goto error; } } else if (!strcmp(identifier, "all")) { found_all = true; - if (bt_value_array_append_string(names, + if (bt_private_value_array_append_string_element(names, identifier)) { goto error; } } else if (!strcmp(identifier, "none")) { found_none = true; - if (bt_value_array_append_string(names, + if (bt_private_value_array_append_string_element(names, identifier)) { goto error; } @@ -1085,7 +1110,7 @@ end: * least one item is specified. */ if (found_item && !found_none && !found_all) { - if (bt_value_array_append_string(names, "none")) { + if (bt_private_value_array_append_string_element(names, "none")) { goto error; } } @@ -1095,7 +1120,7 @@ end: return names; error: - BT_PUT(names); + BT_OBJECT_PUT_REF_AND_RESET(names); if (scanner) { g_scanner_destroy(scanner); } @@ -1110,12 +1135,12 @@ error: * Return value is owned by the caller. */ static -struct bt_value *fields_from_arg(const char *arg) +struct bt_private_value *fields_from_arg(const char *arg) { GScanner *scanner = NULL; - struct bt_value *fields; + struct bt_private_value *fields; - fields = bt_value_array_create(); + fields = bt_private_value_array_create(); if (!fields) { print_err_oom(); goto error; @@ -1145,7 +1170,7 @@ struct bt_value *fields_from_arg(const char *arg) !strcmp(identifier, "emf") || !strcmp(identifier, "callsite") || !strcmp(identifier, "all")) { - if (bt_value_array_append_string(fields, + if (bt_private_value_array_append_string_element(fields, identifier)) { goto error; } @@ -1168,7 +1193,7 @@ struct bt_value *fields_from_arg(const char *arg) goto end; error: - BT_PUT(fields); + BT_OBJECT_PUT_REF_AND_RESET(fields); end: if (scanner) { @@ -1180,9 +1205,9 @@ end: static void append_param_arg(GString *params_arg, const char *key, const char *value) { - assert(params_arg); - assert(key); - assert(value); + BT_ASSERT(params_arg); + BT_ASSERT(key); + BT_ASSERT(value); if (params_arg->len != 0) { g_string_append_c(params_arg, ','); @@ -1228,8 +1253,9 @@ int insert_flat_params_from_array(GString *params_arg, goto end; } - for (i = 0; i < bt_value_array_size(names_array); i++) { - struct bt_value *str_obj = bt_value_array_get(names_array, i); + for (i = 0; i < bt_value_array_get_size(names_array); i++) { + struct bt_value *str_obj = + bt_value_array_borrow_element_by_index(names_array, i); const char *suffix; bool is_default = false; @@ -1239,12 +1265,7 @@ int insert_flat_params_from_array(GString *params_arg, goto end; } - ret = bt_value_string_get(str_obj, &suffix); - BT_PUT(str_obj); - if (ret) { - printf_err("Unexpected error\n"); - goto end; - } + suffix = bt_value_string_get(str_obj); g_string_assign(tmpstr, prefix); g_string_append(tmpstr, "-"); @@ -1305,6 +1326,7 @@ enum { OPT_COMPONENT, OPT_CONNECT, OPT_DEBUG, + OPT_DEBUG_INFO, OPT_DEBUG_INFO_DIR, OPT_DEBUG_INFO_FULL_PATH, OPT_DEBUG_INFO_TARGET_PREFIX, @@ -1316,7 +1338,6 @@ enum { OPT_LIST, OPT_NAME, OPT_NAMES, - OPT_NO_DEBUG_INFO, OPT_NO_DELTA, OPT_OMIT_HOME_PLUGIN_PATH, OPT_OMIT_SYSTEM_PLUGIN_PATH, @@ -1352,7 +1373,7 @@ void add_run_cfg_comp(struct bt_config *cfg, struct bt_config_component *cfg_comp, enum bt_config_component_dest dest) { - bt_get(cfg_comp); + bt_object_get_ref(cfg_comp); switch (dest) { case BT_CONFIG_COMPONENT_DEST_SOURCE: @@ -1373,7 +1394,7 @@ static int add_run_cfg_comp_check_name(struct bt_config *cfg, struct bt_config_component *cfg_comp, enum bt_config_component_dest dest, - struct bt_value *instance_names) + struct bt_private_value *instance_names) { int ret = 0; @@ -1383,14 +1404,15 @@ int add_run_cfg_comp_check_name(struct bt_config *cfg, goto end; } - if (bt_value_map_has_key(instance_names, cfg_comp->instance_name->str)) { + if (bt_value_map_has_entry(bt_private_value_as_value(instance_names), + cfg_comp->instance_name->str)) { printf_err("Duplicate component instance name:\n %s\n", cfg_comp->instance_name->str); ret = -1; goto end; } - if (bt_value_map_insert(instance_names, + if (bt_private_value_map_insert_entry(instance_names, cfg_comp->instance_name->str, bt_value_null)) { print_err_oom(); ret = -1; @@ -1404,13 +1426,13 @@ end: } static -int append_env_var_plugin_paths(struct bt_value *plugin_paths) +int append_env_var_plugin_paths(struct bt_private_value *plugin_paths) { int ret = 0; 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; } @@ -1430,14 +1452,14 @@ end: } static -int append_home_and_system_plugin_paths(struct bt_value *plugin_paths, +int append_home_and_system_plugin_paths(struct bt_private_value *plugin_paths, bool omit_system_plugin_path, bool omit_home_plugin_path) { int ret; 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(); @@ -1477,7 +1499,8 @@ int append_home_and_system_plugin_paths_cfg(struct bt_config *cfg) static struct bt_config *bt_config_base_create(enum bt_config_command command, - struct bt_value *initial_plugin_paths, bool needs_plugins) + struct bt_private_value *initial_plugin_paths, + bool needs_plugins) { struct bt_config *cfg; @@ -1488,14 +1511,14 @@ struct bt_config *bt_config_base_create(enum bt_config_command command, goto error; } - bt_object_init(cfg, bt_config_destroy); + bt_object_init_shared(&cfg->base, bt_config_destroy); cfg->command = command; cfg->command_needs_plugins = needs_plugins; if (initial_plugin_paths) { - cfg->plugin_paths = bt_get(initial_plugin_paths); + cfg->plugin_paths = bt_object_get_ref(initial_plugin_paths); } else { - cfg->plugin_paths = bt_value_array_create(); + cfg->plugin_paths = bt_private_value_array_create(); if (!cfg->plugin_paths) { print_err_oom(); goto error; @@ -1505,7 +1528,7 @@ struct bt_config *bt_config_base_create(enum bt_config_command command, goto end; error: - BT_PUT(cfg); + BT_OBJECT_PUT_REF_AND_RESET(cfg); end: return cfg; @@ -1513,7 +1536,7 @@ end: static struct bt_config *bt_config_run_create( - struct bt_value *initial_plugin_paths) + struct bt_private_value *initial_plugin_paths) { struct bt_config *cfg; @@ -1525,21 +1548,21 @@ struct bt_config *bt_config_run_create( } cfg->cmd_data.run.sources = g_ptr_array_new_with_free_func( - (GDestroyNotify) bt_put); + (GDestroyNotify) bt_object_put_ref); if (!cfg->cmd_data.run.sources) { print_err_oom(); goto error; } cfg->cmd_data.run.filters = g_ptr_array_new_with_free_func( - (GDestroyNotify) bt_put); + (GDestroyNotify) bt_object_put_ref); if (!cfg->cmd_data.run.filters) { print_err_oom(); goto error; } cfg->cmd_data.run.sinks = g_ptr_array_new_with_free_func( - (GDestroyNotify) bt_put); + (GDestroyNotify) bt_object_put_ref); if (!cfg->cmd_data.run.sinks) { print_err_oom(); goto error; @@ -1555,7 +1578,7 @@ struct bt_config *bt_config_run_create( goto end; error: - BT_PUT(cfg); + BT_OBJECT_PUT_REF_AND_RESET(cfg); end: return cfg; @@ -1563,7 +1586,7 @@ end: static struct bt_config *bt_config_list_plugins_create( - struct bt_value *initial_plugin_paths) + struct bt_private_value *initial_plugin_paths) { struct bt_config *cfg; @@ -1577,7 +1600,7 @@ struct bt_config *bt_config_list_plugins_create( goto end; error: - BT_PUT(cfg); + BT_OBJECT_PUT_REF_AND_RESET(cfg); end: return cfg; @@ -1585,7 +1608,7 @@ end: static struct bt_config *bt_config_help_create( - struct bt_value *initial_plugin_paths) + struct bt_private_value *initial_plugin_paths) { struct bt_config *cfg; @@ -1597,8 +1620,7 @@ struct bt_config *bt_config_help_create( } cfg->cmd_data.help.cfg_component = - bt_config_component_create(BT_COMPONENT_CLASS_TYPE_UNKNOWN, - NULL, NULL); + bt_config_component_create(-1, NULL, NULL); if (!cfg->cmd_data.help.cfg_component) { goto error; } @@ -1606,7 +1628,7 @@ struct bt_config *bt_config_help_create( goto end; error: - BT_PUT(cfg); + BT_OBJECT_PUT_REF_AND_RESET(cfg); end: return cfg; @@ -1614,7 +1636,7 @@ end: static struct bt_config *bt_config_query_create( - struct bt_value *initial_plugin_paths) + struct bt_private_value *initial_plugin_paths) { struct bt_config *cfg; @@ -1634,7 +1656,7 @@ struct bt_config *bt_config_query_create( goto end; error: - BT_PUT(cfg); + BT_OBJECT_PUT_REF_AND_RESET(cfg); end: return cfg; @@ -1642,7 +1664,7 @@ end: static struct bt_config *bt_config_print_ctf_metadata_create( - struct bt_value *initial_plugin_paths) + struct bt_private_value *initial_plugin_paths) { struct bt_config *cfg; @@ -1659,10 +1681,16 @@ struct bt_config *bt_config_print_ctf_metadata_create( goto error; } + cfg->cmd_data.print_ctf_metadata.output_path = g_string_new(NULL); + if (!cfg->cmd_data.print_ctf_metadata.output_path) { + print_err_oom(); + goto error; + } + goto end; error: - BT_PUT(cfg); + BT_OBJECT_PUT_REF_AND_RESET(cfg); end: return cfg; @@ -1670,7 +1698,7 @@ end: static struct bt_config *bt_config_print_lttng_live_sessions_create( - struct bt_value *initial_plugin_paths) + struct bt_private_value *initial_plugin_paths) { struct bt_config *cfg; @@ -1687,10 +1715,17 @@ struct bt_config *bt_config_print_lttng_live_sessions_create( goto error; } + cfg->cmd_data.print_lttng_live_sessions.output_path = + g_string_new(NULL); + if (!cfg->cmd_data.print_lttng_live_sessions.output_path) { + print_err_oom(); + goto error; + } + goto end; error: - BT_PUT(cfg); + BT_OBJECT_PUT_REF_AND_RESET(cfg); end: return cfg; @@ -1698,12 +1733,12 @@ end: static int bt_config_append_plugin_paths_check_setuid_setgid( - struct bt_value *plugin_paths, const char *arg) + struct bt_private_value *plugin_paths, const char *arg) { 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; } @@ -1763,19 +1798,16 @@ static void print_help_usage(FILE *fp) { fprintf(fp, "Usage: babeltrace [GENERAL OPTIONS] help [OPTIONS] PLUGIN\n"); - fprintf(fp, " babeltrace [GENERAL OPTIONS] help [OPTIONS] --component=TYPE.PLUGIN.CLS\n"); + fprintf(fp, " babeltrace [GENERAL OPTIONS] help [OPTIONS] TYPE.PLUGIN.CLS\n"); fprintf(fp, "\n"); fprintf(fp, "Options:\n"); fprintf(fp, "\n"); - fprintf(fp, " -c, --component=TYPE.PLUGIN.CLS Get help for the component class CLS of\n"); - fprintf(fp, " type TYPE (`source`, `filter`, or `sink`)\n"); - fprintf(fp, " 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, " --plugin-path=PATH[:PATH]... Add PATH to the list of paths from which\n"); fprintf(fp, " dynamic plugins can be loaded\n"); - fprintf(fp, " -h --help Show this help and quit\n"); + fprintf(fp, " -h, --help Show this help and quit\n"); fprintf(fp, "\n"); fprintf(fp, "See `babeltrace --help` for the list of general options.\n"); fprintf(fp, "\n"); @@ -1785,7 +1817,6 @@ void print_help_usage(FILE *fp) static struct poptOption help_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 }, @@ -1803,7 +1834,7 @@ static struct bt_config *bt_config_help_from_args(int argc, const char *argv[], int *retcode, bool force_omit_system_plugin_path, bool force_omit_home_plugin_path, - struct bt_value *initial_plugin_paths) + struct bt_private_value *initial_plugin_paths) { poptContext pc = NULL; char *arg = NULL; @@ -1812,7 +1843,6 @@ struct bt_config *bt_config_help_from_args(int argc, const char *argv[], struct bt_config *cfg = NULL; const char *leftover; char *plugin_name = NULL, *comp_cls_name = NULL; - char *plug_comp_cls_names = NULL; *retcode = 0; cfg = bt_config_help_create(initial_plugin_paths); @@ -1853,23 +1883,10 @@ struct bt_config *bt_config_help_from_args(int argc, const char *argv[], case OPT_OMIT_HOME_PLUGIN_PATH: cfg->omit_home_plugin_path = true; break; - case OPT_COMPONENT: - if (plug_comp_cls_names) { - printf_err("Cannot specify more than one plugin and component class:\n %s\n", - arg); - goto error; - } - - plug_comp_cls_names = strdup(arg); - if (!plug_comp_cls_names) { - print_err_oom(); - goto error; - } - break; case OPT_HELP: print_help_usage(stdout); *retcode = -1; - BT_PUT(cfg); + BT_OBJECT_PUT_REF_AND_RESET(cfg); goto end; default: printf_err("Unknown command-line option specified (option code %d)\n", @@ -1890,35 +1907,28 @@ struct bt_config *bt_config_help_from_args(int argc, const char *argv[], leftover = poptGetArg(pc); if (leftover) { - if (!plug_comp_cls_names) { - printf_err("Cannot specify plugin name and --component component class:\n %s\n", - leftover); - goto error; - } - - g_string_assign(cfg->cmd_data.help.cfg_component->plugin_name, - leftover); - } else { - if (!plug_comp_cls_names) { - print_help_usage(stdout); - *retcode = -1; - BT_PUT(cfg); - goto end; - } - - plugin_comp_cls_names(plug_comp_cls_names, NULL, + plugin_comp_cls_names(leftover, NULL, &plugin_name, &comp_cls_name, &cfg->cmd_data.help.cfg_component->type); if (plugin_name && comp_cls_name) { - g_string_assign(cfg->cmd_data.help.cfg_component->plugin_name, + /* Component class help */ + g_string_assign( + cfg->cmd_data.help.cfg_component->plugin_name, plugin_name); - g_string_assign(cfg->cmd_data.help.cfg_component->comp_cls_name, + g_string_assign( + cfg->cmd_data.help.cfg_component->comp_cls_name, comp_cls_name); } else { - printf_err("Invalid --component option's argument:\n %s\n", - plug_comp_cls_names); - goto error; + /* Fall back to plugin help */ + g_string_assign( + cfg->cmd_data.help.cfg_component->plugin_name, + leftover); } + } else { + print_help_usage(stdout); + *retcode = -1; + BT_OBJECT_PUT_REF_AND_RESET(cfg); + goto end; } if (append_home_and_system_plugin_paths_cfg(cfg)) { @@ -1929,10 +1939,9 @@ struct bt_config *bt_config_help_from_args(int argc, const char *argv[], error: *retcode = 1; - BT_PUT(cfg); + BT_OBJECT_PUT_REF_AND_RESET(cfg); end: - free(plug_comp_cls_names); g_free(plugin_name); g_free(comp_cls_name); @@ -1950,13 +1959,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"); @@ -1964,7 +1970,7 @@ void print_query_usage(FILE *fp) 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, " -h --help Show this help and quit\n"); + fprintf(fp, " -h, --help Show this help and quit\n"); fprintf(fp, "\n\n"); print_expected_params_format(fp); } @@ -1972,7 +1978,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 }, @@ -1991,7 +1996,7 @@ static struct bt_config *bt_config_query_from_args(int argc, const char *argv[], int *retcode, bool force_omit_system_plugin_path, bool force_omit_home_plugin_path, - struct bt_value *initial_plugin_paths) + struct bt_private_value *initial_plugin_paths) { poptContext pc = NULL; char *arg = NULL; @@ -1999,7 +2004,7 @@ struct bt_config *bt_config_query_from_args(int argc, const char *argv[], int ret; struct bt_config *cfg = NULL; const char *leftover; - struct bt_value *params = bt_value_null; + struct bt_private_value *params = bt_private_value_null; *retcode = 0; cfg = bt_config_query_create(initial_plugin_paths); @@ -2040,29 +2045,10 @@ 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: { - params = bt_value_from_arg(arg); + bt_object_put_ref(params); + params = bt_private_value_from_arg(arg); if (!params) { printf_err("Invalid format for --params option's argument:\n %s\n", arg); @@ -2073,7 +2059,7 @@ struct bt_config *bt_config_query_from_args(int argc, const char *argv[], case OPT_HELP: print_query_usage(stdout); *retcode = -1; - BT_PUT(cfg); + BT_OBJECT_PUT_REF_AND_RESET(cfg); goto end; default: printf_err("Unknown command-line option specified (option code %d)\n", @@ -2085,14 +2071,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 +2079,29 @@ 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; + } + + BT_ASSERT(params); + BT_OBJECT_MOVE_REF(cfg->cmd_data.query.cfg_component->params, + params); + } else { + print_query_usage(stdout); + *retcode = -1; + BT_OBJECT_PUT_REF_AND_RESET(cfg); + goto end; + } + leftover = poptGetArg(pc); if (leftover) { if (strlen(leftover) == 0) { @@ -2115,7 +2113,7 @@ struct bt_config *bt_config_query_from_args(int argc, const char *argv[], } else { print_query_usage(stdout); *retcode = -1; - BT_PUT(cfg); + BT_OBJECT_PUT_REF_AND_RESET(cfg); goto end; } @@ -2133,14 +2131,14 @@ struct bt_config *bt_config_query_from_args(int argc, const char *argv[], error: *retcode = 1; - BT_PUT(cfg); + BT_OBJECT_PUT_REF_AND_RESET(cfg); end: if (pc) { poptFreeContext(pc); } - BT_PUT(params); + bt_object_put_ref(params); free(arg); return cfg; } @@ -2160,7 +2158,7 @@ void print_list_plugins_usage(FILE *fp) fprintf(fp, " --omit-system-plugin-path Omit system plugins from plugin search path\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, " -h --help Show this help and quit\n"); + fprintf(fp, " -h, --help Show this help and quit\n"); fprintf(fp, "\n"); fprintf(fp, "See `babeltrace --help` for the list of general options.\n"); fprintf(fp, "\n"); @@ -2187,7 +2185,7 @@ static struct bt_config *bt_config_list_plugins_from_args(int argc, const char *argv[], int *retcode, bool force_omit_system_plugin_path, bool force_omit_home_plugin_path, - struct bt_value *initial_plugin_paths) + struct bt_private_value *initial_plugin_paths) { poptContext pc = NULL; char *arg = NULL; @@ -2238,7 +2236,7 @@ struct bt_config *bt_config_list_plugins_from_args(int argc, const char *argv[], case OPT_HELP: print_list_plugins_usage(stdout); *retcode = -1; - BT_PUT(cfg); + BT_OBJECT_PUT_REF_AND_RESET(cfg); goto end; default: printf_err("Unknown command-line option specified (option code %d)\n", @@ -2271,7 +2269,7 @@ struct bt_config *bt_config_list_plugins_from_args(int argc, const char *argv[], error: *retcode = 1; - BT_PUT(cfg); + BT_OBJECT_PUT_REF_AND_RESET(cfg); end: if (pc) { @@ -2326,7 +2324,7 @@ void print_run_usage(FILE *fp) fprintf(fp, " the current component with a name given by\n"); fprintf(fp, " the last argument of the --key option and a\n"); fprintf(fp, " value set to VAL\n"); - fprintf(fp, " -h --help Show this help and quit\n"); + fprintf(fp, " -h, --help Show this help and quit\n"); fprintf(fp, "\n"); fprintf(fp, "See `babeltrace --help` for the list of general options.\n"); fprintf(fp, "\n\n"); @@ -2377,21 +2375,22 @@ static struct bt_config *bt_config_run_from_args(int argc, const char *argv[], int *retcode, bool force_omit_system_plugin_path, bool force_omit_home_plugin_path, - struct bt_value *initial_plugin_paths) + struct bt_private_value *initial_plugin_paths) { poptContext pc = NULL; char *arg = NULL; struct bt_config_component *cur_cfg_comp = NULL; enum bt_config_component_dest cur_cfg_comp_dest = BT_CONFIG_COMPONENT_DEST_UNKNOWN; - struct bt_value *cur_base_params = NULL; + struct bt_private_value *cur_base_params = NULL; int opt, ret = 0; struct bt_config *cfg = NULL; - struct bt_value *instance_names = NULL; - struct bt_value *connection_args = NULL; + struct bt_private_value *instance_names = NULL; + struct bt_private_value *connection_args = NULL; GString *cur_param_key = NULL; char error_buf[256] = { 0 }; - long long retry_duration = -1; + long retry_duration = -1; + enum bt_value_status status; struct poptOption run_long_options[] = { { "base-params", 'b', POPT_ARG_STRING, NULL, OPT_BASE_PARAMS, NULL, NULL }, { "component", 'c', POPT_ARG_STRING, NULL, OPT_COMPONENT, NULL, NULL }, @@ -2404,7 +2403,7 @@ struct bt_config *bt_config_run_from_args(int argc, const char *argv[], { "params", 'p', POPT_ARG_STRING, NULL, OPT_PARAMS, NULL, NULL }, { "plugin-path", '\0', POPT_ARG_STRING, NULL, OPT_PLUGIN_PATH, NULL, NULL }, { "reset-base-params", 'r', POPT_ARG_NONE, NULL, OPT_RESET_BASE_PARAMS, NULL, NULL }, - { "retry-duration", '\0', POPT_ARG_LONGLONG, &retry_duration, OPT_RETRY_DURATION, NULL, NULL }, + { "retry-duration", '\0', POPT_ARG_LONG, &retry_duration, OPT_RETRY_DURATION, NULL, NULL }, { "value", '\0', POPT_ARG_STRING, NULL, OPT_VALUE, NULL, NULL }, { NULL, 0, '\0', NULL, 0, NULL, NULL }, }; @@ -2430,19 +2429,19 @@ struct bt_config *bt_config_run_from_args(int argc, const char *argv[], cfg->cmd_data.run.retry_duration_us = 100000; cfg->omit_system_plugin_path = force_omit_system_plugin_path; cfg->omit_home_plugin_path = force_omit_home_plugin_path; - cur_base_params = bt_value_map_create(); + cur_base_params = bt_private_value_map_create(); if (!cur_base_params) { print_err_oom(); goto error; } - instance_names = bt_value_map_create(); + instance_names = bt_private_value_map_create(); if (!instance_names) { print_err_oom(); goto error; } - connection_args = bt_value_array_create(); + connection_args = bt_private_value_array_create(); if (!connection_args) { print_err_oom(); goto error; @@ -2487,7 +2486,7 @@ struct bt_config *bt_config_run_from_args(int argc, const char *argv[], ret = add_run_cfg_comp_check_name(cfg, cur_cfg_comp, cur_cfg_comp_dest, instance_names); - BT_PUT(cur_cfg_comp); + BT_OBJECT_PUT_REF_AND_RESET(cur_cfg_comp); if (ret) { goto error; } @@ -2514,10 +2513,12 @@ struct bt_config *bt_config_run_from_args(int argc, const char *argv[], abort(); } - assert(cur_base_params); - bt_put(cur_cfg_comp->params); - cur_cfg_comp->params = bt_value_copy(cur_base_params); - if (!cur_cfg_comp->params) { + BT_ASSERT(cur_base_params); + bt_object_put_ref(cur_cfg_comp->params); + status = bt_value_copy( + &cur_cfg_comp->params, + bt_private_value_as_value(cur_base_params)); + if (status != BT_VALUE_STATUS_OK) { print_err_oom(); goto error; } @@ -2527,8 +2528,8 @@ struct bt_config *bt_config_run_from_args(int argc, const char *argv[], } case OPT_PARAMS: { - struct bt_value *params; - struct bt_value *params_to_set; + struct bt_private_value *params; + struct bt_private_value *params_to_set; if (!cur_cfg_comp) { printf_err("Cannot add parameters to unavailable component:\n %s\n", @@ -2536,23 +2537,24 @@ struct bt_config *bt_config_run_from_args(int argc, const char *argv[], goto error; } - params = bt_value_from_arg(arg); + params = bt_private_value_from_arg(arg); if (!params) { printf_err("Invalid format for --params option's argument:\n %s\n", arg); goto error; } - params_to_set = bt_value_map_extend(cur_cfg_comp->params, - params); - BT_PUT(params); - if (!params_to_set) { + status = bt_value_map_extend(¶ms_to_set, + bt_private_value_as_value(cur_cfg_comp->params), + bt_private_value_as_value(params)); + BT_OBJECT_PUT_REF_AND_RESET(params); + if (status != BT_VALUE_STATUS_OK) { printf_err("Cannot extend current component parameters with --params option's argument:\n %s\n", arg); goto error; } - BT_MOVE(cur_cfg_comp->params, params_to_set); + BT_OBJECT_MOVE_REF(cur_cfg_comp->params, params_to_set); break; } case OPT_KEY: @@ -2576,7 +2578,7 @@ struct bt_config *bt_config_run_from_args(int argc, const char *argv[], goto error; } - if (bt_value_map_insert_string(cur_cfg_comp->params, + if (bt_private_value_map_insert_string_entry(cur_cfg_comp->params, cur_param_key->str, arg)) { print_err_oom(); goto error; @@ -2593,7 +2595,8 @@ struct bt_config *bt_config_run_from_args(int argc, const char *argv[], break; case OPT_BASE_PARAMS: { - struct bt_value *params = bt_value_from_arg(arg); + struct bt_private_value *params = + bt_private_value_from_arg(arg); if (!params) { printf_err("Invalid format for --base-params option's argument:\n %s\n", @@ -2601,27 +2604,27 @@ struct bt_config *bt_config_run_from_args(int argc, const char *argv[], goto error; } - BT_MOVE(cur_base_params, params); + BT_OBJECT_MOVE_REF(cur_base_params, params); break; } case OPT_RESET_BASE_PARAMS: - BT_PUT(cur_base_params); - cur_base_params = bt_value_map_create(); + BT_OBJECT_PUT_REF_AND_RESET(cur_base_params); + cur_base_params = bt_private_value_map_create(); if (!cur_base_params) { print_err_oom(); goto error; } break; case OPT_CONNECT: - if (bt_value_array_append_string(connection_args, - arg)) { + if (bt_private_value_array_append_string_element( + connection_args, arg)) { print_err_oom(); goto error; } break; case OPT_RETRY_DURATION: if (retry_duration < 0) { - printf_err("--retry-duration option's argument must be positive or 0: %lld\n", + printf_err("--retry-duration option's argument must be positive or 0: %ld\n", retry_duration); goto error; } @@ -2632,7 +2635,7 @@ struct bt_config *bt_config_run_from_args(int argc, const char *argv[], case OPT_HELP: print_run_usage(stdout); *retcode = -1; - BT_PUT(cfg); + BT_OBJECT_PUT_REF_AND_RESET(cfg); goto end; default: printf_err("Unknown command-line option specified (option code %d)\n", @@ -2661,7 +2664,7 @@ struct bt_config *bt_config_run_from_args(int argc, const char *argv[], if (cur_cfg_comp) { ret = add_run_cfg_comp_check_name(cfg, cur_cfg_comp, cur_cfg_comp_dest, instance_names); - BT_PUT(cur_cfg_comp); + BT_OBJECT_PUT_REF_AND_RESET(cur_cfg_comp); if (ret) { goto error; } @@ -2681,7 +2684,8 @@ struct bt_config *bt_config_run_from_args(int argc, const char *argv[], goto error; } - ret = bt_config_cli_args_create_connections(cfg, connection_args, + ret = bt_config_cli_args_create_connections(cfg, + bt_private_value_as_value(connection_args), error_buf, 256); if (ret) { printf_err("Cannot creation connections:\n%s", error_buf); @@ -2692,7 +2696,7 @@ struct bt_config *bt_config_run_from_args(int argc, const char *argv[], error: *retcode = 1; - BT_PUT(cfg); + BT_OBJECT_PUT_REF_AND_RESET(cfg); end: if (pc) { @@ -2704,10 +2708,10 @@ end: } free(arg); - BT_PUT(cur_cfg_comp); - BT_PUT(cur_base_params); - BT_PUT(instance_names); - BT_PUT(connection_args); + BT_OBJECT_PUT_REF_AND_RESET(cur_cfg_comp); + BT_OBJECT_PUT_REF_AND_RESET(cur_base_params); + BT_OBJECT_PUT_REF_AND_RESET(instance_names); + BT_OBJECT_PUT_REF_AND_RESET(connection_args); return cfg; } @@ -2715,12 +2719,12 @@ static struct bt_config *bt_config_run_from_args_array(struct bt_value *run_args, int *retcode, bool force_omit_system_plugin_path, bool force_omit_home_plugin_path, - struct bt_value *initial_plugin_paths) + struct bt_private_value *initial_plugin_paths) { struct bt_config *cfg = NULL; const char **argv; - size_t i; - const size_t argc = bt_value_array_size(run_args) + 1; + int64_t i, len; + const size_t argc = bt_value_array_get_size(run_args) + 1; argv = calloc(argc, sizeof(*argv)); if (!argv) { @@ -2730,17 +2734,20 @@ 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++) { - int ret; - struct bt_value *arg_value = bt_value_array_get(run_args, i); + len = bt_value_array_get_size(run_args); + if (len < 0) { + printf_err("Invalid executable arguments\n"); + goto end; + } + for (i = 0; i < len; i++) { + struct bt_value *arg_value = + bt_value_array_borrow_element_by_index(run_args, i); const char *arg; - assert(arg_value); - ret = bt_value_string_get(arg_value, &arg); - assert(ret == 0); - assert(arg); + BT_ASSERT(arg_value); + arg = bt_value_string_get(arg_value); + BT_ASSERT(arg); argv[i + 1] = arg; - bt_put(arg_value); } cfg = bt_config_run_from_args(argc, argv, retcode, @@ -2791,16 +2798,16 @@ void print_convert_usage(FILE *fp) fprintf(fp, " --run-args-0 Print the equivalent arguments for the\n"); fprintf(fp, " `run` command to the standard output,\n"); fprintf(fp, " formatted for `xargs -0`, and quit\n"); + fprintf(fp, " --stream-intersection Only process events when all streams\n"); + fprintf(fp, " are active\n"); fprintf(fp, " -u, --url=URL Set the `url` string parameter of the\n"); fprintf(fp, " current component to URL\n"); - fprintf(fp, " -h --help Show this help and quit\n"); + fprintf(fp, " -h, --help Show this help and quit\n"); fprintf(fp, "\n"); fprintf(fp, "Implicit `source.ctf.fs` component options:\n"); fprintf(fp, "\n"); fprintf(fp, " --clock-offset=SEC Set clock offset to SEC seconds\n"); fprintf(fp, " --clock-offset-ns=NS Set clock offset to NS ns\n"); - fprintf(fp, " --stream-intersection Only process events when all streams\n"); - fprintf(fp, " are active\n"); fprintf(fp, "\n"); fprintf(fp, "Implicit `sink.text.pretty` component options:\n"); fprintf(fp, "\n"); @@ -2844,6 +2851,8 @@ void print_convert_usage(FILE *fp) fprintf(fp, "\n"); fprintf(fp, "Implicit `filter.lttng-utils.debug-info` component options:\n"); fprintf(fp, "\n"); + fprintf(fp, " --debug-info Create an implicit\n"); + fprintf(fp, " `filter.lttng-utils.debug-info` component\n"); fprintf(fp, " --debug-info-dir=DIR Search for debug info in directory DIR\n"); fprintf(fp, " instead of `/usr/lib/debug`\n"); fprintf(fp, " --debug-info-full-path Show full debug info source and\n"); @@ -2852,8 +2861,6 @@ void print_convert_usage(FILE *fp) fprintf(fp, " Use directory DIR as a prefix when\n"); fprintf(fp, " looking up executables during debug\n"); fprintf(fp, " info analysis\n"); - fprintf(fp, " --no-debug-info Do not create an implicit\n"); - fprintf(fp, " `lttng-utils.debug-info` filter component\n"); fprintf(fp, "\n"); fprintf(fp, "Legacy options that still work:\n"); fprintf(fp, "\n"); @@ -2868,7 +2875,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"); @@ -2911,7 +2918,7 @@ struct poptOption convert_long_options[] = { { "input-format", 'i', POPT_ARG_STRING, NULL, OPT_INPUT_FORMAT, NULL, NULL }, { "name", '\0', POPT_ARG_STRING, NULL, OPT_NAME, NULL, NULL }, { "names", 'n', POPT_ARG_STRING, NULL, OPT_NAMES, NULL, NULL }, - { "no-debug-info", '\0', POPT_ARG_NONE, NULL, OPT_NO_DEBUG_INFO, NULL, NULL }, + { "debug-info", '\0', POPT_ARG_NONE, NULL, OPT_DEBUG_INFO, NULL, NULL }, { "no-delta", '\0', POPT_ARG_NONE, NULL, OPT_NO_DELTA, 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 }, @@ -2942,7 +2949,7 @@ GString *get_component_auto_name(const char *prefix, goto end; } - if (!bt_value_map_has_key(existing_names, prefix)) { + if (!bt_value_map_has_entry(existing_names, prefix)) { g_string_assign(auto_name, prefix); goto end; } @@ -2950,7 +2957,7 @@ GString *get_component_auto_name(const char *prefix, do { g_string_printf(auto_name, "%s-%d", prefix, i); i++; - } while (bt_value_map_has_key(existing_names, auto_name->str)); + } while (bt_value_map_has_entry(existing_names, auto_name->str)); end: return auto_name; @@ -2961,12 +2968,12 @@ struct implicit_component_args { GString *comp_arg; GString *name_arg; GString *params_arg; - struct bt_value *extra_params; + struct bt_private_value *extra_params; }; static int assign_name_to_implicit_component(struct implicit_component_args *args, - const char *prefix, struct bt_value *existing_names, + const char *prefix, struct bt_private_value *existing_names, GList **comp_names, bool append_to_comp_names) { int ret = 0; @@ -2976,7 +2983,8 @@ int assign_name_to_implicit_component(struct implicit_component_args *args, goto end; } - name = get_component_auto_name(prefix, existing_names); + name = get_component_auto_name(prefix, + bt_private_value_as_value(existing_names)); if (!name) { ret = -1; @@ -2985,7 +2993,7 @@ int assign_name_to_implicit_component(struct implicit_component_args *args, g_string_assign(args->name_arg, name->str); - if (bt_value_map_insert(existing_names, name->str, + if (bt_private_value_map_insert_entry(existing_names, name->str, bt_value_null)) { print_err_oom(); ret = -1; @@ -3008,7 +3016,7 @@ end: static int append_run_args_for_implicit_component( struct implicit_component_args *impl_args, - struct bt_value *run_args) + struct bt_private_value *run_args) { int ret = 0; size_t i; @@ -3017,55 +3025,55 @@ int append_run_args_for_implicit_component( goto end; } - if (bt_value_array_append_string(run_args, "--component")) { + if (bt_private_value_array_append_string_element(run_args, "--component")) { print_err_oom(); goto error; } - if (bt_value_array_append_string(run_args, impl_args->comp_arg->str)) { + if (bt_private_value_array_append_string_element(run_args, impl_args->comp_arg->str)) { print_err_oom(); goto error; } - if (bt_value_array_append_string(run_args, "--name")) { + if (bt_private_value_array_append_string_element(run_args, "--name")) { print_err_oom(); goto error; } - if (bt_value_array_append_string(run_args, impl_args->name_arg->str)) { + if (bt_private_value_array_append_string_element(run_args, impl_args->name_arg->str)) { print_err_oom(); goto error; } if (impl_args->params_arg->len > 0) { - if (bt_value_array_append_string(run_args, "--params")) { + if (bt_private_value_array_append_string_element(run_args, "--params")) { print_err_oom(); goto error; } - if (bt_value_array_append_string(run_args, + if (bt_private_value_array_append_string_element(run_args, impl_args->params_arg->str)) { print_err_oom(); goto error; } } - for (i = 0; i < bt_value_array_size(impl_args->extra_params); i++) { + for (i = 0; i < bt_value_array_get_size( + bt_private_value_as_value(impl_args->extra_params)); + i++) { struct bt_value *elem; const char *arg; - elem = bt_value_array_get(impl_args->extra_params, i); + elem = bt_value_array_borrow_element_by_index( + bt_private_value_as_value(impl_args->extra_params), + i); if (!elem) { goto error; } - assert(bt_value_is_string(elem)); - if (bt_value_string_get(elem, &arg)) { - goto error; - } - - ret = bt_value_array_append_string(run_args, arg); - bt_put(elem); + BT_ASSERT(bt_value_is_string(elem)); + arg = bt_value_string_get(elem); + ret = bt_private_value_array_append_string_element(run_args, arg); if (ret) { print_err_oom(); goto error; @@ -3084,7 +3092,7 @@ end: static void finalize_implicit_component_args(struct implicit_component_args *args) { - assert(args); + BT_ASSERT(args); if (args->comp_arg) { g_string_free(args->comp_arg, TRUE); @@ -3098,7 +3106,7 @@ void finalize_implicit_component_args(struct implicit_component_args *args) g_string_free(args->params_arg, TRUE); } - bt_put(args->extra_params); + bt_object_put_ref(args->extra_params); } static @@ -3122,7 +3130,7 @@ int init_implicit_component_args(struct implicit_component_args *args, args->comp_arg = g_string_new(comp_arg); args->name_arg = g_string_new(NULL); args->params_arg = g_string_new(NULL); - args->extra_params = bt_value_array_create(); + args->extra_params = bt_private_value_array_create(); if (!args->comp_arg || !args->name_arg || !args->params_arg || !args->extra_params) { @@ -3140,9 +3148,9 @@ static void append_implicit_component_param(struct implicit_component_args *args, const char *key, const char *value) { - assert(args); - assert(key); - assert(value); + BT_ASSERT(args); + BT_ASSERT(key); + BT_ASSERT(value); append_param_arg(args->params_arg, key, value); } @@ -3152,29 +3160,29 @@ int append_implicit_component_extra_param(struct implicit_component_args *args, { int ret = 0; - assert(args); - assert(key); - assert(value); + BT_ASSERT(args); + BT_ASSERT(key); + BT_ASSERT(value); - if (bt_value_array_append_string(args->extra_params, "--key")) { + if (bt_private_value_array_append_string_element(args->extra_params, "--key")) { print_err_oom(); ret = -1; goto end; } - if (bt_value_array_append_string(args->extra_params, key)) { + if (bt_private_value_array_append_string_element(args->extra_params, key)) { print_err_oom(); ret = -1; goto end; } - if (bt_value_array_append_string(args->extra_params, "--value")) { + if (bt_private_value_array_append_string_element(args->extra_params, "--value")) { print_err_oom(); ret = -1; goto end; } - if (bt_value_array_append_string(args->extra_params, value)) { + if (bt_private_value_array_append_string_element(args->extra_params, value)) { print_err_oom(); ret = -1; goto end; @@ -3187,7 +3195,8 @@ end: static int convert_append_name_param(enum bt_config_component_dest dest, GString *cur_name, GString *cur_name_prefix, - struct bt_value *run_args, struct bt_value *all_names, + struct bt_private_value *run_args, + struct bt_private_value *all_names, GList **source_names, GList **filter_names, GList **sink_names) { @@ -3204,14 +3213,15 @@ int convert_append_name_param(enum bt_config_component_dest dest, * component. */ name = get_component_auto_name(cur_name_prefix->str, - all_names); + bt_private_value_as_value(all_names)); append_name_opt = true; } else { /* * An explicit name was provided for the user * component. */ - if (bt_value_map_has_key(all_names, + if (bt_value_map_has_entry( + bt_private_value_as_value(all_names), cur_name->str)) { printf_err("Duplicate component instance name:\n %s\n", cur_name->str); @@ -3230,7 +3240,7 @@ int convert_append_name_param(enum bt_config_component_dest dest, * Remember this name globally, for the uniqueness of * all component names. */ - if (bt_value_map_insert(all_names, name->str, bt_value_null)) { + if (bt_private_value_map_insert_entry(all_names, name->str, bt_value_null)) { print_err_oom(); goto error; } @@ -3239,12 +3249,12 @@ int convert_append_name_param(enum bt_config_component_dest dest, * Append the --name option if necessary. */ if (append_name_opt) { - if (bt_value_array_append_string(run_args, "--name")) { + if (bt_private_value_array_append_string_element(run_args, "--name")) { print_err_oom(); goto error; } - if (bt_value_array_append_string(run_args, name->str)) { + if (bt_private_value_array_append_string_element(run_args, name->str)) { print_err_oom(); goto error; } @@ -3312,7 +3322,7 @@ end: * function. */ static -int append_connect_arg(struct bt_value *run_args, +int append_connect_arg(struct bt_private_value *run_args, const char *upstream_name, const char *downstream_name) { int ret = 0; @@ -3326,7 +3336,7 @@ int append_connect_arg(struct bt_value *run_args, goto end; } - ret = bt_value_array_append_string(run_args, "--connect"); + ret = bt_private_value_array_append_string_element(run_args, "--connect"); if (ret) { print_err_oom(); ret = -1; @@ -3336,7 +3346,7 @@ int append_connect_arg(struct bt_value *run_args, g_string_append(arg, e_upstream_name->str); g_string_append_c(arg, ':'); g_string_append(arg, e_downstream_name->str); - ret = bt_value_array_append_string(run_args, arg->str); + ret = bt_private_value_array_append_string_element(run_args, arg->str); if (ret) { print_err_oom(); ret = -1; @@ -3363,7 +3373,7 @@ end: * Appends the run command's --connect options for the convert command. */ static -int convert_auto_connect(struct bt_value *run_args, +int convert_auto_connect(struct bt_private_value *run_args, GList *source_names, GList *filter_names, GList *sink_names) { @@ -3373,9 +3383,9 @@ int convert_auto_connect(struct bt_value *run_args, GList *filter_prev; GList *sink_at = sink_names; - assert(source_names); - assert(filter_names); - assert(sink_names); + BT_ASSERT(source_names); + BT_ASSERT(filter_names); + BT_ASSERT(sink_names); /* Connect all sources to the first filter */ for (source_at = source_names; source_at != NULL; source_at = g_list_next(source_at)) { @@ -3434,7 +3444,7 @@ int split_timerange(const char *arg, char **begin, char **end) GString *g_begin = NULL; GString *g_end = NULL; - assert(arg); + BT_ASSERT(arg); if (*ch == '[') { ch++; @@ -3452,8 +3462,8 @@ int split_timerange(const char *arg, char **begin, char **end) goto error; } - assert(begin); - assert(end); + BT_ASSERT(begin); + BT_ASSERT(end); *begin = g_begin->str; *end = g_end->str; g_string_free(g_begin, FALSE); @@ -3483,7 +3493,7 @@ int g_list_prepend_gstring(GList **list, const char *string) int ret = 0; GString *gs = g_string_new(string); - assert(list); + BT_ASSERT(list); if (!gs) { print_err_oom(); @@ -3523,6 +3533,7 @@ int fill_implicit_ctf_inputs_args(GPtrArray *implicit_ctf_inputs_args, { int ret = 0; GList *leftover; + enum bt_value_status status; for (leftover = leftovers; leftover != NULL; leftover = g_list_next(leftover)) { @@ -3545,10 +3556,11 @@ int fill_implicit_ctf_inputs_args(GPtrArray *implicit_ctf_inputs_args, * We need our own copy of the extra parameters because * this is where the unique path goes. */ - BT_PUT(impl_args->extra_params); - impl_args->extra_params = - bt_value_copy(base_implicit_ctf_input_args->extra_params); - if (!impl_args) { + BT_OBJECT_PUT_REF_AND_RESET(impl_args->extra_params); + status = bt_value_copy(&impl_args->extra_params, + bt_private_value_as_value( + base_implicit_ctf_input_args->extra_params)); + if (status != BT_VALUE_STATUS_OK) { print_err_oom(); destroy_implicit_component_args(impl_args); goto error; @@ -3583,8 +3595,8 @@ end: static struct bt_config *bt_config_convert_from_args(int argc, const char *argv[], int *retcode, bool force_omit_system_plugin_path, - bool force_omit_home_plugin_path, bool force_no_debug_info, - struct bt_value *initial_plugin_paths) + bool force_omit_home_plugin_path, + struct bt_private_value *initial_plugin_paths, char *log_level) { poptContext pc = NULL; char *arg = NULL; @@ -3592,20 +3604,19 @@ struct bt_config *bt_config_convert_from_args(int argc, const char *argv[], BT_CONFIG_COMPONENT_DEST_UNKNOWN; int opt, ret = 0; struct bt_config *cfg = NULL; - bool got_verbose_opt = false; - bool got_debug_opt = false; bool got_input_format_opt = false; 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; bool print_run_args = false; bool print_run_args_0 = false; bool print_ctf_metadata = false; - struct bt_value *run_args = NULL; - struct bt_value *all_names = NULL; + struct bt_private_value *run_args = NULL; + struct bt_private_value *all_names = NULL; GList *source_names = NULL; GList *filter_names = NULL; GList *sink_names = NULL; @@ -3619,7 +3630,8 @@ struct bt_config *bt_config_convert_from_args(int argc, const char *argv[], struct implicit_component_args implicit_debug_info_args = { 0 }; struct implicit_component_args implicit_muxer_args = { 0 }; struct implicit_component_args implicit_trimmer_args = { 0 }; - struct bt_value *plugin_paths = bt_get(initial_plugin_paths); + struct bt_private_value *plugin_paths = + bt_object_get_ref(initial_plugin_paths); char error_buf[256] = { 0 }; size_t i; struct bt_common_lttng_live_url_parts lttng_live_url_parts = { 0 }; @@ -3659,7 +3671,7 @@ struct bt_config *bt_config_convert_from_args(int argc, const char *argv[], } if (init_implicit_component_args(&implicit_debug_info_args, - "filter.lttng-utils.debug-info", !force_no_debug_info)) { + "filter.lttng-utils.debug-info", false)) { goto error; } @@ -3680,13 +3692,13 @@ struct bt_config *bt_config_convert_from_args(int argc, const char *argv[], goto error; } - all_names = bt_value_map_create(); + all_names = bt_private_value_map_create(); if (!all_names) { print_err_oom(); goto error; } - run_args = bt_value_array_create(); + run_args = bt_private_value_array_create(); if (!run_args) { print_err_oom(); goto error; @@ -3783,13 +3795,13 @@ struct bt_config *bt_config_convert_from_args(int argc, const char *argv[], abort(); } - if (bt_value_array_append_string(run_args, + if (bt_private_value_array_append_string_element(run_args, "--component")) { print_err_oom(); goto error; } - if (bt_value_array_append_string(run_args, arg)) { + if (bt_private_value_array_append_string_element(run_args, arg)) { print_err_oom(); goto error; } @@ -3812,13 +3824,13 @@ struct bt_config *bt_config_convert_from_args(int argc, const char *argv[], goto error; } - if (bt_value_array_append_string(run_args, + if (bt_private_value_array_append_string_element(run_args, "--params")) { print_err_oom(); goto error; } - if (bt_value_array_append_string(run_args, arg)) { + if (bt_private_value_array_append_string_element(run_args, arg)) { print_err_oom(); goto error; } @@ -3830,22 +3842,22 @@ struct bt_config *bt_config_convert_from_args(int argc, const char *argv[], goto error; } - if (bt_value_array_append_string(run_args, "--key")) { + if (bt_private_value_array_append_string_element(run_args, "--key")) { print_err_oom(); goto error; } - if (bt_value_array_append_string(run_args, "path")) { + if (bt_private_value_array_append_string_element(run_args, "path")) { print_err_oom(); goto error; } - if (bt_value_array_append_string(run_args, "--value")) { + if (bt_private_value_array_append_string_element(run_args, "--value")) { print_err_oom(); goto error; } - if (bt_value_array_append_string(run_args, arg)) { + if (bt_private_value_array_append_string_element(run_args, arg)) { print_err_oom(); goto error; } @@ -3857,22 +3869,22 @@ struct bt_config *bt_config_convert_from_args(int argc, const char *argv[], goto error; } - if (bt_value_array_append_string(run_args, "--key")) { + if (bt_private_value_array_append_string_element(run_args, "--key")) { print_err_oom(); goto error; } - if (bt_value_array_append_string(run_args, "url")) { + if (bt_private_value_array_append_string_element(run_args, "url")) { print_err_oom(); goto error; } - if (bt_value_array_append_string(run_args, "--value")) { + if (bt_private_value_array_append_string_element(run_args, "--value")) { print_err_oom(); goto error; } - if (bt_value_array_append_string(run_args, arg)) { + if (bt_private_value_array_append_string_element(run_args, arg)) { print_err_oom(); goto error; } @@ -3884,12 +3896,12 @@ struct bt_config *bt_config_convert_from_args(int argc, const char *argv[], goto error; } - if (bt_value_array_append_string(run_args, "--name")) { + if (bt_private_value_array_append_string_element(run_args, "--name")) { print_err_oom(); goto error; } - if (bt_value_array_append_string(run_args, arg)) { + if (bt_private_value_array_append_string_element(run_args, arg)) { print_err_oom(); goto error; } @@ -3899,20 +3911,20 @@ struct bt_config *bt_config_convert_from_args(int argc, const char *argv[], case OPT_OMIT_HOME_PLUGIN_PATH: force_omit_home_plugin_path = true; - if (bt_value_array_append_string(run_args, + if (bt_private_value_array_append_string_element(run_args, "--omit-home-plugin-path")) { print_err_oom(); goto error; } break; case OPT_RETRY_DURATION: - if (bt_value_array_append_string(run_args, + if (bt_private_value_array_append_string_element(run_args, "--retry-duration")) { print_err_oom(); goto error; } - if (bt_value_array_append_string(run_args, arg)) { + if (bt_private_value_array_append_string_element(run_args, arg)) { print_err_oom(); goto error; } @@ -3920,7 +3932,7 @@ struct bt_config *bt_config_convert_from_args(int argc, const char *argv[], case OPT_OMIT_SYSTEM_PLUGIN_PATH: force_omit_system_plugin_path = true; - if (bt_value_array_append_string(run_args, + if (bt_private_value_array_append_string_element(run_args, "--omit-system-plugin-path")) { print_err_oom(); goto error; @@ -3932,13 +3944,13 @@ struct bt_config *bt_config_convert_from_args(int argc, const char *argv[], goto error; } - if (bt_value_array_append_string(run_args, + if (bt_private_value_array_append_string_element(run_args, "--plugin-path")) { print_err_oom(); goto error; } - if (bt_value_array_append_string(run_args, arg)) { + if (bt_private_value_array_append_string_element(run_args, arg)) { print_err_oom(); goto error; } @@ -3946,7 +3958,7 @@ struct bt_config *bt_config_convert_from_args(int argc, const char *argv[], case OPT_HELP: print_convert_usage(stdout); *retcode = -1; - BT_PUT(cfg); + BT_OBJECT_PUT_REF_AND_RESET(cfg); goto end; case OPT_BEGIN: case OPT_CLOCK_CYCLES: @@ -3958,6 +3970,7 @@ struct bt_config *bt_config_convert_from_args(int argc, const char *argv[], case OPT_CLOCK_SECONDS: case OPT_COLOR: case OPT_DEBUG: + case OPT_DEBUG_INFO: case OPT_DEBUG_INFO_DIR: case OPT_DEBUG_INFO_FULL_PATH: case OPT_DEBUG_INFO_TARGET_PREFIX: @@ -3965,7 +3978,6 @@ struct bt_config *bt_config_convert_from_args(int argc, const char *argv[], case OPT_FIELDS: case OPT_INPUT_FORMAT: case OPT_NAMES: - case OPT_NO_DEBUG_INFO: case OPT_NO_DELTA: case OPT_OUTPUT_FORMAT: case OPT_OUTPUT: @@ -4095,29 +4107,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( @@ -4132,13 +4142,13 @@ struct bt_config *bt_config_convert_from_args(int argc, const char *argv[], goto error; } break; - case OPT_NO_DEBUG_INFO: - implicit_debug_info_args.exists = false; + case OPT_DEBUG_INFO: + implicit_debug_info_args.exists = true; break; case OPT_DEBUG_INFO_DIR: implicit_debug_info_args.exists = true; ret = append_implicit_component_extra_param( - &implicit_debug_info_args, "dir", arg); + &implicit_debug_info_args, "debug-info-dir", arg); if (ret) { goto error; } @@ -4159,7 +4169,7 @@ struct bt_config *bt_config_convert_from_args(int argc, const char *argv[], break; case OPT_FIELDS: { - struct bt_value *fields = fields_from_arg(arg); + struct bt_private_value *fields = fields_from_arg(arg); if (!fields) { goto error; @@ -4168,8 +4178,8 @@ struct bt_config *bt_config_convert_from_args(int argc, const char *argv[], implicit_text_args.exists = true; ret = insert_flat_params_from_array( implicit_text_args.params_arg, - fields, "field"); - bt_put(fields); + bt_private_value_as_value(fields), "field"); + bt_object_put_ref(fields); if (ret) { goto error; } @@ -4177,7 +4187,7 @@ struct bt_config *bt_config_convert_from_args(int argc, const char *argv[], } case OPT_NAMES: { - struct bt_value *names = names_from_arg(arg); + struct bt_private_value *names = names_from_arg(arg); if (!names) { goto error; @@ -4186,8 +4196,8 @@ struct bt_config *bt_config_convert_from_args(int argc, const char *argv[], implicit_text_args.exists = true; ret = insert_flat_params_from_array( implicit_text_args.params_arg, - names, "name"); - bt_put(names); + bt_private_value_as_value(names), "name"); + bt_object_put_ref(names); if (ret) { goto error; } @@ -4267,24 +4277,19 @@ 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 (got_verbose_opt) { - printf_err("Duplicate -v/--verbose option\n"); - goto error; + if (*log_level != 'V' && *log_level != 'D') { + *log_level = 'I'; } - - append_implicit_component_param(&implicit_text_args, - "verbose", "yes"); - implicit_text_args.exists = true; - got_verbose_opt = true; break; case OPT_DEBUG: - got_debug_opt = true; + *log_level = 'V'; break; } @@ -4299,6 +4304,16 @@ struct bt_config *bt_config_convert_from_args(int argc, const char *argv[], goto error; } + /* + * Legacy behaviour: --verbose used to make the `text` output + * format print more information. --verbose is now equivalent to + * the INFO log level, which is why we compare to 'I' here. + */ + if (*log_level == 'I') { + append_implicit_component_param(&implicit_text_args, + "verbose", "yes"); + } + /* * Append home and system plugin paths now that we possibly got * --plugin-path. @@ -4345,11 +4360,16 @@ struct bt_config *bt_config_convert_from_args(int argc, const char *argv[], goto error; } - cfg->debug = got_debug_opt; - cfg->verbose = got_verbose_opt; gs_leftover = leftovers->data; g_string_assign(cfg->cmd_data.print_ctf_metadata.path, gs_leftover->str); + + if (output) { + g_string_assign( + cfg->cmd_data.print_ctf_metadata.output_path, + output); + } + goto end; } @@ -4435,10 +4455,15 @@ struct bt_config *bt_config_convert_from_args(int argc, const char *argv[], goto error; } - cfg->debug = got_debug_opt; - cfg->verbose = got_verbose_opt; g_string_assign(cfg->cmd_data.print_lttng_live_sessions.url, gs_leftover->str); + + if (output) { + g_string_assign( + cfg->cmd_data.print_lttng_live_sessions.output_path, + output); + } + goto end; } @@ -4656,17 +4681,23 @@ struct bt_config *bt_config_convert_from_args(int argc, const char *argv[], * here. */ if (print_run_args || print_run_args_0) { - for (i = 0; i < bt_value_array_size(run_args); i++) { + 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_get_size( + bt_private_value_as_value(run_args)); i++) { struct bt_value *arg_value = - bt_value_array_get(run_args, i); + bt_value_array_borrow_element_by_index( + bt_private_value_as_value(run_args), + i); const char *arg; GString *quoted = NULL; const char *arg_to_print; - assert(arg_value); - ret = bt_value_string_get(arg_value, &arg); - assert(ret == 0); - BT_PUT(arg_value); + BT_ASSERT(arg_value); + arg = bt_value_string_get(arg_value); if (print_run_args) { quoted = bt_common_shell_quote(arg, true); @@ -4685,7 +4716,8 @@ struct bt_config *bt_config_convert_from_args(int argc, const char *argv[], g_string_free(quoted, TRUE); } - if (i < bt_value_array_size(run_args) - 1) { + if (i < bt_value_array_get_size( + bt_private_value_as_value(run_args)) - 1) { if (print_run_args) { putchar(' '); } else { @@ -4695,24 +4727,24 @@ struct bt_config *bt_config_convert_from_args(int argc, const char *argv[], } *retcode = -1; - BT_PUT(cfg); + BT_OBJECT_PUT_REF_AND_RESET(cfg); goto end; } - cfg = bt_config_run_from_args_array(run_args, retcode, + cfg = bt_config_run_from_args_array( + bt_private_value_as_value(run_args), retcode, force_omit_system_plugin_path, force_omit_home_plugin_path, initial_plugin_paths); if (!cfg) { goto error; } - cfg->debug = got_debug_opt; - cfg->verbose = got_verbose_opt; + cfg->cmd_data.run.stream_intersection_mode = stream_intersection_mode; goto end; error: *retcode = 1; - BT_PUT(cfg); + BT_OBJECT_PUT_REF_AND_RESET(cfg); end: if (pc) { @@ -4734,8 +4766,8 @@ end: g_ptr_array_free(implicit_ctf_inputs_args, TRUE); } - bt_put(run_args); - bt_put(all_names); + bt_object_put_ref(run_args); + bt_object_put_ref(all_names); destroy_glist_of_gstring(source_names); destroy_glist_of_gstring(filter_names); destroy_glist_of_gstring(sink_names); @@ -4748,7 +4780,7 @@ end: finalize_implicit_component_args(&implicit_debug_info_args); finalize_implicit_component_args(&implicit_muxer_args); finalize_implicit_component_args(&implicit_trimmer_args); - bt_put(plugin_paths); + bt_object_put_ref(plugin_paths); bt_common_destroy_lttng_live_url_parts(<tng_live_url_parts); return cfg; } @@ -4763,10 +4795,12 @@ void print_gen_usage(FILE *fp) fprintf(fp, "\n"); fprintf(fp, "General options:\n"); fprintf(fp, "\n"); - fprintf(fp, " -d, --debug Turn on debug mode\n"); - fprintf(fp, " -h --help Show this help and quit\n"); - fprintf(fp, " -v, --verbose Turn on verbose mode\n"); - fprintf(fp, " -V, --version Show version and quit\n"); + fprintf(fp, " -d, --debug Enable debug mode (same as --log-level=V)\n"); + fprintf(fp, " -h, --help Show this help and quit\n"); + fprintf(fp, " -l, --log-level=LVL Set all log levels to LVL (`N`, `V`, `D`,\n"); + fprintf(fp, " `I`, `W` (default), `E`, or `F`)\n"); + fprintf(fp, " -v, --verbose Enable verbose mode (same as --log-level=I)\n"); + fprintf(fp, " -V, --version Show version and quit\n"); fprintf(fp, "\n"); fprintf(fp, "Available commands:\n"); fprintf(fp, "\n"); @@ -4779,18 +4813,49 @@ void print_gen_usage(FILE *fp) fprintf(fp, "Use `babeltrace COMMAND --help` to show the help of COMMAND.\n"); } +static +char log_level_from_arg(const char *arg) +{ + char level = 'U'; + + if (strcmp(arg, "VERBOSE") == 0 || + strcmp(arg, "V") == 0) { + level = 'V'; + } else if (strcmp(arg, "DEBUG") == 0 || + strcmp(arg, "D") == 0) { + level = 'D'; + } else if (strcmp(arg, "INFO") == 0 || + strcmp(arg, "I") == 0) { + level = 'I'; + } else if (strcmp(arg, "WARN") == 0 || + strcmp(arg, "WARNING") == 0 || + strcmp(arg, "W") == 0) { + level = 'W'; + } else if (strcmp(arg, "ERROR") == 0 || + strcmp(arg, "E") == 0) { + level = 'E'; + } else if (strcmp(arg, "FATAL") == 0 || + strcmp(arg, "F") == 0) { + level = 'F'; + } else if (strcmp(arg, "NONE") == 0 || + strcmp(arg, "N") == 0) { + level = 'N'; + } + + return level; +} + struct bt_config *bt_config_cli_args_create(int argc, const char *argv[], int *retcode, bool force_omit_system_plugin_path, - bool force_omit_home_plugin_path, bool force_no_debug_info, - struct bt_value *initial_plugin_paths) + bool force_omit_home_plugin_path, + struct bt_private_value *initial_plugin_paths) { struct bt_config *config = NULL; - bool verbose = false; - bool debug = false; int i; const char **command_argv = NULL; int command_argc = -1; const char *command_name = NULL; + char log_level = 'U'; enum command_type { COMMAND_TYPE_NONE = -1, @@ -4804,29 +4869,78 @@ struct bt_config *bt_config_cli_args_create(int argc, const char *argv[], *retcode = -1; if (!initial_plugin_paths) { - initial_plugin_paths = bt_value_array_create(); + initial_plugin_paths = bt_private_value_array_create(); if (!initial_plugin_paths) { *retcode = 1; goto end; } } else { - bt_get(initial_plugin_paths); + bt_object_get_ref(initial_plugin_paths); } if (argc <= 1) { + print_version(); + puts(""); print_gen_usage(stdout); goto end; } for (i = 1; i < argc; i++) { const char *cur_arg = argv[i]; + const char *next_arg = i == (argc - 1) ? NULL : argv[i + 1]; if (strcmp(cur_arg, "-d") == 0 || strcmp(cur_arg, "--debug") == 0) { - debug = true; + log_level = 'V'; } else if (strcmp(cur_arg, "-v") == 0 || strcmp(cur_arg, "--verbose") == 0) { - verbose = true; + if (log_level != 'V' && log_level != 'D') { + /* + * Legacy: do not override a previous + * --debug because --verbose and --debug + * can be specified together (in this + * case we want the lowest log level to + * apply, VERBOSE). + */ + log_level = 'I'; + } + } else if (strcmp(cur_arg, "--log-level") == 0 || + strcmp(cur_arg, "-l") == 0) { + if (!next_arg) { + printf_err("Missing log level value for --log-level option\n"); + *retcode = 1; + goto end; + } + + log_level = log_level_from_arg(next_arg); + if (log_level == 'U') { + printf_err("Invalid argument for --log-level option:\n %s\n", + next_arg); + *retcode = 1; + goto end; + } + + i++; + } else if (strncmp(cur_arg, "--log-level=", 12) == 0) { + const char *arg = &cur_arg[12]; + + log_level = log_level_from_arg(arg); + if (log_level == 'U') { + printf_err("Invalid argument for --log-level option:\n %s\n", + arg); + *retcode = 1; + goto end; + } + } else if (strncmp(cur_arg, "-l", 2) == 0) { + const char *arg = &cur_arg[2]; + + log_level = log_level_from_arg(arg); + if (log_level == 'U') { + printf_err("Invalid argument for --log-level option:\n %s\n", + arg); + *retcode = 1; + goto end; + } } else if (strcmp(cur_arg, "-V") == 0 || strcmp(cur_arg, "--version") == 0) { print_version(); @@ -4836,12 +4950,13 @@ struct bt_config *bt_config_cli_args_create(int argc, const char *argv[], print_gen_usage(stdout); goto end; } else { - bool has_command = true; - /* * First unknown argument: is it a known command * name? */ + command_argv = &argv[i]; + command_argc = argc - i; + if (strcmp(cur_arg, "convert") == 0) { command_type = COMMAND_TYPE_CONVERT; } else if (strcmp(cur_arg, "list-plugins") == 0) { @@ -4855,20 +4970,13 @@ struct bt_config *bt_config_cli_args_create(int argc, const char *argv[], } else { /* * Unknown argument, but not a known - * command name: assume the whole - * arguments are for the default convert - * command. + * command name: assume the default + * `convert` command. */ command_type = COMMAND_TYPE_CONVERT; - command_argv = argv; - command_argc = argc; - has_command = false; - } - - if (has_command) { - command_argv = &argv[i]; - command_argc = argc - i; - command_name = cur_arg; + command_name = "convert"; + command_argv = &argv[i - 1]; + command_argc = argc - i + 1; } break; } @@ -4885,8 +4993,8 @@ struct bt_config *bt_config_cli_args_create(int argc, const char *argv[], goto end; } - assert(command_argv); - assert(command_argc >= 0); + BT_ASSERT(command_argv); + BT_ASSERT(command_argc >= 0); switch (command_type) { case COMMAND_TYPE_RUN: @@ -4897,8 +5005,8 @@ struct bt_config *bt_config_cli_args_create(int argc, const char *argv[], case COMMAND_TYPE_CONVERT: config = bt_config_convert_from_args(command_argc, command_argv, retcode, force_omit_system_plugin_path, - force_omit_home_plugin_path, force_no_debug_info, - initial_plugin_paths); + force_omit_home_plugin_path, + initial_plugin_paths, &log_level); break; case COMMAND_TYPE_LIST_PLUGINS: config = bt_config_list_plugins_from_args(command_argc, @@ -4920,18 +5028,15 @@ struct bt_config *bt_config_cli_args_create(int argc, const char *argv[], } if (config) { - if (verbose) { - config->verbose = true; - } - - if (debug) { - config->debug = true; + if (log_level == 'U') { + log_level = 'W'; } + config->log_level = log_level; config->command_name = command_name; } end: - bt_put(initial_plugin_paths); + bt_object_put_ref(initial_plugin_paths); return config; }