X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=converter%2Fbabeltrace.c;h=65220183722fdabd91a68d9947f662041c43d829;hb=d6425aaf6026d168a695268c4aa7539956c0d0ca;hp=f83e1e62ba0f656323398467057e13ebeb29a9e8;hpb=82ace6d6d97ecb15d093232c76c5d4a3c31e6948;p=babeltrace.git diff --git a/converter/babeltrace.c b/converter/babeltrace.c index f83e1e62..65220183 100644 --- a/converter/babeltrace.c +++ b/converter/babeltrace.c @@ -18,12 +18,13 @@ * all copies or substantial portions of the Software. */ -#define _XOPEN_SOURCE 700 +#define _GNU_SOURCE #include #include #include #include #include +#include #include #include #include @@ -33,10 +34,9 @@ #include #include #include -#include -#include #include #include +#include #include /* for clocks */ @@ -303,6 +303,94 @@ end: } +/* + * bt_context_add_traces_recursive: Open a trace recursively + * + * Find each trace present in the subdirectory starting from the given + * path, and add them to the context. + * + * Return: 0 on success, nonzero on failure. + * Unable to open toplevel: failure. + * Unable to open some subdirectory or file: warn and continue; + */ +int bt_context_add_traces_recursive(struct bt_context *ctx, const char *path, + const char *format_str) +{ + FTS *tree; + FTSENT *node; + GArray *trace_ids; + char lpath[PATH_MAX]; + char * const paths[2] = { lpath, NULL }; + int ret; + + /* + * Need to copy path, because fts_open can change it. + * It is the pointer array, not the strings, that are constant. + */ + strncpy(lpath, path, PATH_MAX); + lpath[PATH_MAX - 1] = '\0'; + + tree = fts_open(paths, FTS_NOCHDIR | FTS_LOGICAL, 0); + if (tree == NULL) { + fprintf(stderr, "[error] [Context] Cannot traverse \"%s\" for reading.\n", + path); + return -EINVAL; + } + + trace_ids = g_array_new(FALSE, TRUE, sizeof(int)); + + while ((node = fts_read(tree))) { + int dirfd, metafd; + + if (!(node->fts_info & FTS_D)) + continue; + + dirfd = open(node->fts_accpath, 0); + if (dirfd < 0) { + fprintf(stderr, "[error] [Context] Unable to open trace " + "directory file descriptor.\n"); + ret = dirfd; + goto error; + } + metafd = openat(dirfd, "metadata", O_RDONLY); + if (metafd < 0) { + ret = close(dirfd); + if (ret < 0) { + perror("close"); + goto error; + } + } else { + int trace_id; + + ret = close(metafd); + if (ret < 0) { + perror("close"); + goto error; + } + ret = close(dirfd); + if (ret < 0) { + perror("close"); + goto error; + } + + trace_id = bt_context_add_trace(ctx, + node->fts_accpath, format_str); + if (trace_id < 0) { + fprintf(stderr, "[error] [Context] opening trace \"%s\" from %s " + "for reading.\n", node->fts_accpath, path); + ret = trace_id; + goto error; + } + g_array_append_val(trace_ids, trace_id); + } + } + + g_array_free(trace_ids, TRUE); + return 0; + +error: + return ret; +} @@ -310,10 +398,9 @@ int convert_trace(struct trace_descriptor *td_write, struct bt_context *ctx) { struct bt_iter *iter; - struct ctf_stream *stream; - struct ctf_stream_event *event; struct ctf_text_stream_pos *sout; struct bt_iter_pos begin_pos; + struct bt_ctf_event *ctf_event; int ret; sout = container_of(td_write, struct ctf_text_stream_pos, @@ -325,8 +412,8 @@ int convert_trace(struct trace_descriptor *td_write, ret = -1; goto error_iter; } - while (bt_iter_read_event(iter, &stream, &event) == 0) { - ret = sout->parent.event_cb(&sout->parent, stream); + while ((ctf_event = bt_iter_read_ctf_event(iter))) { + ret = sout->parent.event_cb(&sout->parent, ctf_event->stream); if (ret) { fprintf(stderr, "[error] Writing event failed.\n"); goto end;