#include <babeltrace/context.h>
#include <babeltrace/ctf/types.h>
#include <babeltrace/ctf/events.h>
+/* TODO: fix object model for format-agnostic callbacks */
+#include <babeltrace/ctf/events-internal.h>
+#include <babeltrace/ctf/iterator.h>
#include <babeltrace/ctf-text/types.h>
#include <babeltrace/iterator.h>
#include <popt.h>
fprintf(fp, " --no-delta Do not print time delta between consecutive events\n");
fprintf(fp, " -n, --names name1<,name2,...> Print field names:\n");
fprintf(fp, " (payload OR args OR arg)\n");
- fprintf(fp, " all, scope, header, (context OR ctx)\n");
- fprintf(fp, " (payload active by default)\n");
+ fprintf(fp, " none, all, scope, header, (context OR ctx)\n");
+ fprintf(fp, " (default: payload,context)\n");
fprintf(fp, " -f, --fields name1<,name2,...> Print additional fields:\n");
fprintf(fp, " all, trace, trace:domain, trace:procname,\n");
fprintf(fp, " trace:vpid, loglevel.\n");
char *str, *strlist, *strctx;
opt_payload_field_names = 0;
+ opt_context_field_names = 0;
strlist = (char *) poptGetOptArg(*pc);
if (!strlist) {
return -EINVAL;
opt_header_field_names = 1;
else if (!strcmp(str, "payload") || !strcmp(str, "args") || !strcmp(str, "arg"))
opt_payload_field_names = 1;
- else {
+ else if (!strcmp(str, "none")) {
+ opt_all_field_names = 0;
+ opt_scope_field_names = 0;
+ opt_context_field_names = 0;
+ opt_header_field_names = 0;
+ opt_payload_field_names = 0;
+ } else {
fprintf(stderr, "[error] unknown field name type %s\n", str);
return -EINVAL;
}
poptReadDefaultConfig(pc, 0);
/* set default */
+ opt_context_field_names = 1;
opt_payload_field_names = 1;
while ((opt = poptGetNextOpt(pc)) != -1) {
GArray *trace_ids;
char lpath[PATH_MAX];
char * const paths[2] = { lpath, NULL };
- int ret;
+ int ret = -1;
/*
* Need to copy path, because fts_open can change it.
while ((node = fts_read(tree))) {
int dirfd, metafd;
+ int closeret;
if (!(node->fts_info & FTS_D))
continue;
}
metafd = openat(dirfd, "metadata", O_RDONLY);
if (metafd < 0) {
- ret = close(dirfd);
- if (ret < 0) {
+ closeret = close(dirfd);
+ if (closeret < 0) {
perror("close");
goto error;
}
+ ret = -1;
+ continue;
} else {
int trace_id;
trace_id = bt_context_add_trace(ctx,
node->fts_accpath, format_str,
- packet_seek);
+ packet_seek, NULL, NULL);
if (trace_id < 0) {
- fprintf(stderr, "[error] [Context] opening trace \"%s\" from %s "
+ fprintf(stderr, "[warning] [Context] opening trace \"%s\" from %s "
"for reading.\n", node->fts_accpath, path);
- ret = trace_id;
- goto error;
+ /* Allow to skip erroneous traces. */
+ continue;
}
g_array_append_val(trace_ids, trace_id);
}
}
- g_array_free(trace_ids, TRUE);
- return 0;
-
error:
+ /*
+ * Return an error if no trace can be opened.
+ */
+ if (ret == 0 && trace_ids->len == 0) {
+ fprintf(stderr, "[error] Cannot open any trace for reading.\n\n");
+ ret = -ENOENT;
+ }
+ g_array_free(trace_ids, TRUE);
return ret;
}
int convert_trace(struct trace_descriptor *td_write,
struct bt_context *ctx)
{
- struct bt_iter *iter;
+ struct bt_ctf_iter *iter;
struct ctf_text_stream_pos *sout;
struct bt_iter_pos begin_pos;
struct bt_ctf_event *ctf_event;
trace_descriptor);
begin_pos.type = BT_SEEK_BEGIN;
- iter = bt_iter_create(ctx, &begin_pos, NULL);
+ iter = bt_ctf_iter_create(ctx, &begin_pos, NULL);
if (!iter) {
ret = -1;
goto error_iter;
}
- while ((ctf_event = bt_iter_read_ctf_event(iter))) {
- ret = sout->parent.event_cb(&sout->parent, ctf_event->stream);
+ while ((ctf_event = bt_ctf_iter_read_event(iter))) {
+ ret = sout->parent.event_cb(&sout->parent, ctf_event->parent->stream);
if (ret) {
fprintf(stderr, "[error] Writing event failed.\n");
goto end;
}
- ret = bt_iter_next(iter);
+ ret = bt_iter_next(bt_ctf_get_iter(iter));
if (ret < 0)
goto end;
}
ret = 0;
end:
- bt_iter_destroy(iter);
+ bt_ctf_iter_destroy(iter);
error_iter:
return ret;
}