From 20d24215ef299a387abac4850f82359de8a86f4d Mon Sep 17 00:00:00 2001 From: Yannick Brosseau Date: Tue, 14 Feb 2012 14:11:45 -0500 Subject: [PATCH] Move the add_traces_recursive out of the library The exact API for this function is hard to define, so we move back the function directly to the converter code where it can serve as an example for applications who want to use this functionnality. Signed-off-by: Yannick Brosseau Signed-off-by: Mathieu Desnoyers --- converter/babeltrace.c | 93 ++++++++++++++++++++++++++++++++++-- include/babeltrace/context.h | 11 ----- lib/context.c | 83 -------------------------------- 3 files changed, 90 insertions(+), 97 deletions(-) diff --git a/converter/babeltrace.c b/converter/babeltrace.c index f83e1e62..539734ee 100644 --- a/converter/babeltrace.c +++ b/converter/babeltrace.c @@ -18,7 +18,7 @@ * all copies or substantial portions of the Software. */ -#define _XOPEN_SOURCE 700 +#define _GNU_SOURCE #include #include #include @@ -33,10 +33,9 @@ #include #include #include -#include -#include #include #include +#include #include /* for clocks */ @@ -303,6 +302,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; +} diff --git a/include/babeltrace/context.h b/include/babeltrace/context.h index 99e03480..32282cf4 100644 --- a/include/babeltrace/context.h +++ b/include/babeltrace/context.h @@ -46,17 +46,6 @@ struct bt_context *bt_context_create(void); int bt_context_add_trace(struct bt_context *ctx, const char *path, const char *format); -/* - * 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. - */ -int bt_context_add_traces_recursive(struct bt_context *ctx, const char *path, - const char *format); - /* * bt_context_remove_trace: Remove a trace from the context. * diff --git a/lib/context.c b/lib/context.c index 3cbafa07..5408bc81 100644 --- a/lib/context.c +++ b/lib/context.c @@ -91,89 +91,6 @@ int bt_context_add_trace(struct bt_context *ctx, const char *path, return trace_collection_add(ctx->tc, td); } -/* - * 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; -} - void bt_context_remove_trace(struct bt_context *ctx, int handle_id) { struct bt_trace_handle *handle; -- 2.34.1