#define ENV_BABELTRACE_WARN_COMMAND_NAME_DIRECTORY_CLASH "BABELTRACE_CLI_WARN_COMMAND_NAME_DIRECTORY_CLASH"
#define NSEC_PER_SEC 1000000000LL
+enum bt_cmd_status {
+ BT_CMD_STATUS_OK = 0,
+ BT_CMD_STATUS_ERROR = -1,
+ BT_CMD_STATUS_INTERRUPTED = -2,
+};
+
+static
+const char *bt_cmd_status_string(enum bt_cmd_status cmd_status)
+{
+ switch (cmd_status) {
+ case BT_CMD_STATUS_OK:
+ return "OK";
+ case BT_CMD_STATUS_ERROR:
+ return "ERROR";
+ case BT_CMD_STATUS_INTERRUPTED:
+ return "INTERRUPTED";
+ default:
+ bt_common_abort();
+ }
+}
+
/* Application's interrupter (owned by this) */
static bt_interrupter *the_interrupter;
comp_cls = bt_component_class_sink_as_component_class_const(find_sink_component_class(plugin_name, comp_class_name));
break;
default:
- abort();
+ bt_common_abort();
}
return comp_cls;
fprintf(fh, "'%s%s%s%s",
bt_common_color_bold(),
- bt_common_color_fg_cyan(),
+ bt_common_color_fg_bright_cyan(),
component_type_str(type),
bt_common_color_fg_default());
}
static
-bt_bool collect_map_keys(const char *key, const bt_value *object, void *data)
+bt_value_map_foreach_entry_const_func_status collect_map_keys(
+ const char *key, const bt_value *object, void *data)
{
GPtrArray *map_keys = data;
g_ptr_array_add(map_keys, (gpointer *) key);
- return BT_TRUE;
+ return BT_VALUE_MAP_FOREACH_ENTRY_CONST_FUNC_STATUS_OK;
}
static
uint64_t uint_val;
double dbl_val;
const char *str_val;
- int size;
GPtrArray *map_keys = NULL;
- if (!value) {
- goto end;
- }
+ BT_ASSERT(value);
switch (bt_value_get_type(value)) {
case BT_VALUE_TYPE_NULL:
case BT_VALUE_TYPE_BOOL:
bool_val = bt_value_bool_get(value);
fprintf(fp, "%s%s%s%s\n", bt_common_color_bold(),
- bt_common_color_fg_cyan(), bool_val ? "yes" : "no",
+ bt_common_color_fg_bright_cyan(), bool_val ? "yes" : "no",
bt_common_color_reset());
break;
case BT_VALUE_TYPE_UNSIGNED_INTEGER:
uint_val = bt_value_integer_unsigned_get(value);
fprintf(fp, "%s%s%" PRIu64 "%s\n", bt_common_color_bold(),
- bt_common_color_fg_red(), uint_val,
+ bt_common_color_fg_bright_red(), uint_val,
bt_common_color_reset());
break;
case BT_VALUE_TYPE_SIGNED_INTEGER:
int_val = bt_value_integer_signed_get(value);
fprintf(fp, "%s%s%" PRId64 "%s\n", bt_common_color_bold(),
- bt_common_color_fg_red(), int_val,
+ bt_common_color_fg_bright_red(), int_val,
bt_common_color_reset());
break;
case BT_VALUE_TYPE_REAL:
dbl_val = bt_value_real_get(value);
fprintf(fp, "%s%s%lf%s\n", bt_common_color_bold(),
- bt_common_color_fg_red(), dbl_val,
+ bt_common_color_fg_bright_red(), dbl_val,
bt_common_color_reset());
break;
case BT_VALUE_TYPE_STRING:
str_val = bt_value_string_get(value);
fprintf(fp, "%s%s%s%s\n", bt_common_color_bold(),
- bt_common_color_fg_green(), str_val,
+ bt_common_color_fg_bright_green(), str_val,
bt_common_color_reset());
break;
case BT_VALUE_TYPE_ARRAY:
{
- guint i;
+ uint64_t i, size;
size = bt_value_array_get_length(value);
- if (size < 0) {
- goto error;
- }
-
if (size == 0) {
print_indent(fp, indent);
fprintf(fp, "[ ]\n");
bt_value_array_borrow_element_by_index_const(
value, i);
- if (!element) {
- goto error;
- }
print_indent(fp, indent);
fprintf(fp, "- ");
break;
}
default:
- abort();
+ bt_common_abort();
}
goto end;
-error:
- BT_LOGE("Error printing value of type %s.",
- bt_common_value_type_string(bt_value_get_type(value)));
-
end:
if (map_keys) {
g_ptr_array_free(map_keys, TRUE);
print_cfg_print_lttng_live_sessions(cfg);
break;
default:
- abort();
+ bt_common_abort();
}
}
version_avail = bt_plugin_get_version(plugin, &major, &minor,
&patch, &extra);
printf("%s%s%s%s:\n", bt_common_color_bold(),
- bt_common_color_fg_blue(), plugin_name,
+ bt_common_color_fg_bright_blue(), plugin_name,
bt_common_color_reset());
if (path) {
printf(" %sPath%s: %s\n", bt_common_color_bold(),
}
static
-int cmd_query(struct bt_config *cfg)
+enum bt_cmd_status cmd_query(struct bt_config *cfg)
{
int ret = 0;
+ enum bt_cmd_status cmd_status;
const bt_component_class *comp_cls = NULL;
const bt_value *results = NULL;
const char *fail_reason = NULL;
cfg->cmd_data.query.cfg_component->plugin_name->str,
cfg->cmd_data.query.cfg_component->comp_cls_name->str,
cfg->cmd_data.query.cfg_component->type);
- ret = -1;
- goto end;
+ goto error;
}
ret = query(cfg, comp_cls, cfg->cmd_data.query.object->str,
cfg->cmd_data.query.cfg_component->params,
&results, &fail_reason);
if (ret) {
- goto failed;
+ BT_CLI_LOGE_APPEND_CAUSE(
+ "Failed to query component class: %s: plugin-name=\"%s\", "
+ "comp-cls-name=\"%s\", comp-cls-type=%d "
+ "object=\"%s\"", fail_reason,
+ cfg->cmd_data.query.cfg_component->plugin_name->str,
+ cfg->cmd_data.query.cfg_component->comp_cls_name->str,
+ cfg->cmd_data.query.cfg_component->type,
+ cfg->cmd_data.query.object->str);
+ goto error;
}
print_value(stdout, results, 0);
+ cmd_status = BT_CMD_STATUS_OK;
goto end;
-failed:
- BT_CLI_LOGE_APPEND_CAUSE(
- "Failed to query component class: %s: plugin-name=\"%s\", "
- "comp-cls-name=\"%s\", comp-cls-type=%d "
- "object=\"%s\"", fail_reason,
- cfg->cmd_data.query.cfg_component->plugin_name->str,
- cfg->cmd_data.query.cfg_component->comp_cls_name->str,
- cfg->cmd_data.query.cfg_component->type,
- cfg->cmd_data.query.object->str);
- ret = -1;
+error:
+ cmd_status = BT_CMD_STATUS_ERROR;
end:
bt_component_class_put_ref(comp_cls);
bt_value_put_ref(results);
- return ret;
+ return cmd_status;
}
static
}
static
-int cmd_help(struct bt_config *cfg)
+enum bt_cmd_status cmd_help(struct bt_config *cfg)
{
- int ret = 0;
+ enum bt_cmd_status cmd_status;
const bt_plugin *plugin = NULL;
const bt_component_class *needed_comp_cls = NULL;
BT_CLI_LOGE_APPEND_CAUSE(
"Cannot find plugin: plugin-name=\"%s\"",
cfg->cmd_data.help.cfg_component->plugin_name->str);
- ret = -1;
- goto end;
+ goto error;
}
print_plugin_info(plugin);
if (strlen(cfg->cmd_data.help.cfg_component->comp_cls_name->str) == 0) {
/* Plugin help only */
+ cmd_status = BT_CMD_STATUS_OK;
goto end;
}
cfg->cmd_data.help.cfg_component->plugin_name->str,
cfg->cmd_data.help.cfg_component->comp_cls_name->str,
cfg->cmd_data.help.cfg_component->type);
- ret = -1;
- goto end;
+ goto error;
}
printf("\n");
print_component_class_help(
cfg->cmd_data.help.cfg_component->plugin_name->str,
needed_comp_cls);
+ cmd_status = BT_CMD_STATUS_OK;
+ goto end;
+
+error:
+ cmd_status = BT_CMD_STATUS_ERROR;
end:
bt_component_class_put_ref(needed_comp_cls);
bt_plugin_put_ref(plugin);
- return ret;
+ return cmd_status;
}
typedef void *(* plugin_borrow_comp_cls_by_index_func_t)(const bt_plugin *,
typedef const bt_component_class *(* spec_comp_cls_borrow_comp_cls_func_t)(
void *);
+static
void cmd_list_plugins_print_component_classes(const bt_plugin *plugin,
const char *cc_type_name, uint64_t count,
plugin_borrow_comp_cls_by_index_func_t borrow_comp_cls_by_index_func,
}
static
-int cmd_list_plugins(struct bt_config *cfg)
+enum bt_cmd_status cmd_list_plugins(struct bt_config *cfg)
{
- int ret = 0;
int plugins_count, component_classes_count = 0, i;
printf("From the following plugin paths:\n\n");
}
end:
- return ret;
+ return BT_CMD_STATUS_OK;
}
static
-int cmd_print_lttng_live_sessions(struct bt_config *cfg)
+enum bt_cmd_status cmd_print_lttng_live_sessions(struct bt_config *cfg)
{
int ret = 0;
+ enum bt_cmd_status cmd_status;
const bt_component_class *comp_cls = NULL;
const bt_value *results = NULL;
bt_value *params = NULL;
static const char * const comp_cls_name = "lttng-live";
static const bt_component_class_type comp_cls_type =
BT_COMPONENT_CLASS_TYPE_SOURCE;
- int64_t array_size, i;
+ uint64_t array_size, i;
const char *fail_reason = NULL;
FILE *out_stream = stdout;
ret = query(cfg, comp_cls, "sessions", params,
&results, &fail_reason);
if (ret) {
- goto failed;
+ BT_CLI_LOGE_APPEND_CAUSE("Failed to query `sessions` object: %s",
+ fail_reason);
+ goto error;
}
BT_ASSERT(results);
fopen(cfg->cmd_data.print_lttng_live_sessions.output_path->str,
"w");
if (!out_stream) {
- ret = -1;
BT_LOGE_ERRNO("Cannot open file for writing",
": path=\"%s\"",
cfg->cmd_data.print_lttng_live_sessions.output_path->str);
"Babeltrace CLI",
"Cannot open file for writing: path=\"%s\"",
cfg->cmd_data.print_lttng_live_sessions.output_path->str);
- goto end;
+ goto error;
}
}
int64_t timer_us, streams, clients;
map = bt_value_array_borrow_element_by_index_const(results, i);
- if (!map) {
- BT_CLI_LOGE_APPEND_CAUSE("Unexpected empty array entry.");
- goto error;
- }
if (!bt_value_is_map(map)) {
BT_CLI_LOGE_APPEND_CAUSE("Unexpected entry type.");
goto error;
fprintf(out_stream, "%" PRIu64 " client(s) connected)\n", clients);
}
+ cmd_status = BT_CMD_STATUS_OK;
goto end;
-failed:
- BT_CLI_LOGE_APPEND_CAUSE("Failed to query `sessions` object: %s",
- fail_reason);
-
error:
- ret = -1;
+ cmd_status = BT_CMD_STATUS_ERROR;
end:
bt_value_put_ref(results);
}
}
- return ret;
+ return cmd_status;
}
static
-int cmd_print_ctf_metadata(struct bt_config *cfg)
+enum bt_cmd_status cmd_print_ctf_metadata(struct bt_config *cfg)
{
int ret = 0;
+ enum bt_cmd_status cmd_status;
const bt_component_class *comp_cls = NULL;
const bt_value *results = NULL;
bt_value *params = NULL;
"comp-cls-name=\"%s\", comp-cls-type=%d",
plugin_name, comp_cls_name,
BT_COMPONENT_CLASS_TYPE_SOURCE);
- ret = -1;
- goto end;
+ goto error;
}
params = bt_value_map_create();
if (!params) {
- ret = -1;
- goto end;
+ goto error;
}
ret = bt_value_map_insert_string_entry(params, "path",
cfg->cmd_data.print_ctf_metadata.path->str);
if (ret) {
- ret = -1;
- goto end;
+ goto error;
}
ret = query(cfg, comp_cls, "metadata-info",
params, &results, &fail_reason);
if (ret) {
- goto failed;
+ BT_CLI_LOGE_APPEND_CAUSE(
+ "Failed to query `metadata-info` object: %s", fail_reason);
+ goto error;
}
metadata_text_value = bt_value_map_borrow_entry_value_const(results,
if (!metadata_text_value) {
BT_CLI_LOGE_APPEND_CAUSE(
"Cannot find `text` string value in the resulting metadata info object.");
- ret = -1;
- goto end;
+ goto error;
}
metadata_text = bt_value_string_get(metadata_text_value);
"Babeltrace CLI",
"Cannot open file for writing: path=\"%s\"",
cfg->cmd_data.print_ctf_metadata.output_path->str);
- ret = -1;
- goto end;
+ goto error;
}
}
BT_CLI_LOGE_APPEND_CAUSE(
"Cannot write whole metadata text to output stream: "
"ret=%d", ret);
- goto end;
+ goto error;
}
- ret = 0;
+ cmd_status = BT_CMD_STATUS_OK;
goto end;
-failed:
- ret = -1;
- BT_CLI_LOGE_APPEND_CAUSE(
- "Failed to query `metadata-info` object: %s", fail_reason);
+error:
+ cmd_status = BT_CMD_STATUS_ERROR;
end:
bt_value_put_ref(results);
}
}
- return ret;
+ return cmd_status;
}
struct port_id {
int compute_stream_intersection(const bt_value *streams,
struct trace_range *range)
{
- unsigned int i;
- unsigned int stream_count;
+ uint64_t i, stream_count;
int ret;
BT_ASSERT(bt_value_get_type(streams) == BT_VALUE_TYPE_ARRAY);
{
int ret = 0;
uint64_t trace_idx;
- int64_t trace_count;
+ uint64_t trace_count;
const bt_value *query_result = NULL;
const bt_value *trace_info = NULL;
const bt_value *stream_infos = NULL;
}
trace_count = bt_value_array_get_length(query_result);
- if (trace_count < 0) {
+ if (trace_count == 0) {
BT_CLI_LOGE_APPEND_CAUSE("`babeltrace.trace-infos` query: result is empty: "
"component-class-name=%s", bt_component_class_get_name(comp_cls));
ret = -1;
trace_info = bt_value_array_borrow_element_by_index_const(
query_result, trace_idx);
- BT_ASSERT(trace_info);
if (!bt_value_is_map(trace_info)) {
ret = -1;
BT_CLI_LOGE_APPEND_CAUSE("`babeltrace.trace-infos` query: expecting element to be a map: "
}
stream_count = bt_value_array_get_length(stream_infos);
- if (stream_count < 0) {
+ if (stream_count == 0) {
ret = -1;
BT_CLI_LOGE_APPEND_CAUSE("`babeltrace.trace-infos` query: list of streams is empty: "
"component-class-name=%s",
stream_info = bt_value_array_borrow_element_by_index_const(
stream_infos, stream_idx);
- BT_ASSERT(stream_info);
if (!bt_value_is_map(stream_info)) {
ret = -1;
BT_CLI_LOGE_APPEND_CAUSE("`babeltrace.trace-infos` query: "
cfg_comp->comp_cls_name->str);
break;
default:
- abort();
+ bt_common_abort();
}
if (!comp_cls) {
(void *) &comp);
break;
default:
- abort();
+ bt_common_abort();
}
if (ret) {
GUINT_TO_POINTER(quark), (void *) comp);
break;
default:
- abort();
+ bt_common_abort();
}
comp = NULL;
}
static
-int cmd_run(struct bt_config *cfg)
+enum bt_cmd_status cmd_run(struct bt_config *cfg)
{
- int ret = 0;
+ enum bt_cmd_status cmd_status;
struct cmd_run_ctx ctx = { 0 };
/* Initialize the command's context and the graph object */
switch (run_status) {
case BT_GRAPH_RUN_STATUS_OK:
- break;
+ cmd_status = BT_CMD_STATUS_OK;
+ goto end;
case BT_GRAPH_RUN_STATUS_AGAIN:
if (bt_interrupter_is_set(the_interrupter)) {
- BT_CLI_LOGW_APPEND_CAUSE(
- "Graph was interrupted by user.");
- goto error;
+ /*
+ * The graph was interrupted by a SIGINT.
+ */
+ cmd_status = BT_CMD_STATUS_INTERRUPTED;
+ goto end;
}
if (cfg->cmd_data.run.retry_duration_us > 0) {
if (usleep(cfg->cmd_data.run.retry_duration_us)) {
if (bt_interrupter_is_set(the_interrupter)) {
- BT_CLI_LOGW_APPEND_CAUSE(
- "Graph was interrupted by user.");
- goto error;
+ cmd_status = BT_CMD_STATUS_INTERRUPTED;
+ goto end;
}
}
}
break;
- case BT_GRAPH_RUN_STATUS_END:
- goto end;
default:
if (bt_interrupter_is_set(the_interrupter)) {
- BT_CLI_LOGW_APPEND_CAUSE(
- "Graph was interrupted by user and failed: "
- "status=%s",
- bt_common_func_status_string(run_status));
- goto error;
+ cmd_status = BT_CMD_STATUS_INTERRUPTED;
+ goto end;
}
BT_CLI_LOGE_APPEND_CAUSE(
goto error;
}
}
-
- goto end;
-
error:
- if (ret == 0) {
- ret = -1;
- }
+ cmd_status = BT_CMD_STATUS_ERROR;
end:
cmd_run_ctx_destroy(&ctx);
- return ret;
+ return cmd_status;
}
static
if (!error || bt_error_get_cause_count(error) == 0) {
fprintf(stderr, "%s%sUnknown command-line error.%s\n",
- bt_common_color_bold(), bt_common_color_fg_red(),
+ bt_common_color_bold(), bt_common_color_fg_bright_red(),
bt_common_color_reset());
goto end;
}
/* Print prefix */
fprintf(stderr, prefix_fmt,
- bt_common_color_bold(), bt_common_color_fg_red(),
+ bt_common_color_bold(), bt_common_color_fg_bright_red(),
bt_common_color_reset());
/* Print actor name */
bt_error_cause_message_iterator_actor_get_component_class_type(cause));
break;
default:
- abort();
+ bt_common_abort();
}
/* Print file name and line number */
fprintf(stderr, "] (%s%s%s%s:%s%" PRIu64 "%s)\n",
bt_common_color_bold(),
- bt_common_color_fg_magenta(),
+ bt_common_color_fg_bright_magenta(),
bt_error_cause_get_file_name(cause),
bt_common_color_reset(),
bt_common_color_fg_green(),
int main(int argc, const char **argv)
{
- int ret;
- int retcode;
+ int ret, retcode;
+ enum bt_cmd_status cmd_status;
struct bt_config *cfg = NULL;
init_log_level();
switch (cfg->command) {
case BT_CONFIG_COMMAND_RUN:
- ret = cmd_run(cfg);
+ cmd_status = cmd_run(cfg);
break;
case BT_CONFIG_COMMAND_LIST_PLUGINS:
- ret = cmd_list_plugins(cfg);
+ cmd_status = cmd_list_plugins(cfg);
break;
case BT_CONFIG_COMMAND_HELP:
- ret = cmd_help(cfg);
+ cmd_status = cmd_help(cfg);
break;
case BT_CONFIG_COMMAND_QUERY:
- ret = cmd_query(cfg);
+ cmd_status = cmd_query(cfg);
break;
case BT_CONFIG_COMMAND_PRINT_CTF_METADATA:
- ret = cmd_print_ctf_metadata(cfg);
+ cmd_status = cmd_print_ctf_metadata(cfg);
break;
case BT_CONFIG_COMMAND_PRINT_LTTNG_LIVE_SESSIONS:
- ret = cmd_print_lttng_live_sessions(cfg);
+ cmd_status = cmd_print_lttng_live_sessions(cfg);
break;
default:
BT_LOGF("Invalid/unknown command: cmd=%d", cfg->command);
- abort();
+ bt_common_abort();
}
- BT_LOGI("Command completed: cmd=%d, command-name=\"%s\", ret=%d",
- cfg->command, cfg->command_name, ret);
+ BT_LOGI("Command completed: cmd=%d, command-name=\"%s\", command-status=\"%s\"",
+ cfg->command, cfg->command_name, bt_cmd_status_string(cmd_status));
warn_command_name_and_directory_clash(cfg);
- retcode = ret ? 1 : 0;
+
+ switch (cmd_status) {
+ case BT_CMD_STATUS_OK:
+ retcode = 0;
+ break;
+ case BT_CMD_STATUS_ERROR:
+ retcode = 1;
+ print_error_causes();
+ break;
+ case BT_CMD_STATUS_INTERRUPTED:
+ retcode = 2;
+ break;
+ default:
+ BT_LOGF("Invalid command status: cmd-status=%d", cmd_status);
+ bt_common_abort();
+ }
end:
BT_OBJECT_PUT_REF_AND_RESET(cfg);
fini_loaded_plugins();
bt_interrupter_put_ref(the_interrupter);
- if (retcode != 0) {
- print_error_causes();
- }
-
/*
* Clear current thread's error in case there is one to avoid a
* memory leak.