Move the add_traces_recursive out of the library
[babeltrace.git] / converter / babeltrace.c
index f83e1e62ba0f656323398467057e13ebeb29a9e8..539734eeaa55df4e3ba23019f8cbe5d9560fef51 100644 (file)
@@ -18,7 +18,7 @@
  * all copies or substantial portions of the Software.
  */
 
-#define _XOPEN_SOURCE 700
+#define _GNU_SOURCE
 #include <config.h>
 #include <babeltrace/babeltrace.h>
 #include <babeltrace/format.h>
 #include <sys/stat.h>
 #include <sys/types.h>
 #include <fcntl.h>
-#include <ftw.h>
-#include <dirent.h>
 #include <unistd.h>
 #include <inttypes.h>
+#include <fts.h>
 
 #include <babeltrace/ctf-ir/metadata.h>        /* 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;
+}
 
 
 
This page took 0.023479 seconds and 4 git commands to generate.