Replace usage of FTS with custom directory traversal code
authorYannick Brosseau <yannick.brosseau@gmail.com>
Mon, 13 May 2013 19:40:42 +0000 (15:40 -0400)
committerYannick Brosseau <yannick.brosseau@gmail.com>
Mon, 13 May 2013 19:40:42 +0000 (15:40 -0400)
FTS does not support Large file, which is needed by babeltrace.

Signed-off-by: Yannick Brosseau <yannick.brosseau@gmail.com>
lttv/lttv/traceset.c

index 765e3cf5552243e90e6e0bec608d0c6f9c196ba2..370fa61b3f4bae152c0f0e808042466967a844cb 100644 (file)
 
 /* To traverse a tree recursively */
 #include <fcntl.h>
-#include <fts.h>
 /* For the use of realpath*/
 #include <limits.h>
 #include <stdlib.h>
 /* For strcpy*/
 #include <string.h>
-
+#include <errno.h>
+#include <dirent.h>
 /* A trace is a sequence of events gathered in the same tracing session. The
    events may be stored in several tracefiles in the same directory. 
    A trace set is defined when several traces are to be analyzed together,
@@ -280,80 +280,69 @@ void lttv_traceset_add(LttvTraceset *s, LttvTrace *t)
 
 int lttv_traceset_add_path(LttvTraceset *ts, char *trace_path)
 {
-       FTS *tree;
-       FTSENT *node;
-       char * const paths[2] = { trace_path, NULL };
        int ret = -1;
-       
+       DIR *curdir  = NULL;
        gboolean metaFileFound = FALSE;
-       
-       tree = fts_open(paths, FTS_NOCHDIR | FTS_LOGICAL, 0);
-       if (tree == NULL) {
-               g_warning("Cannot traverse \"%s\" for reading.\n",
-                               trace_path);
+
+       /* Open top level directory */
+       curdir = opendir(trace_path);
+       if (curdir == NULL) {
+               g_warning("Cannot open directory %s (%s)", trace_path, strerror(errno));
                return ret;
        }
 
-       int dirfd, metafd;
-       while ((node = fts_read(tree))) {
-
-               if (!(node->fts_info & FTS_D))
-                       continue;
-
-               dirfd = open(node->fts_accpath, 0);
-               if (dirfd < 0) {
-                       g_warning("Unable to open trace "
-                                       "directory file descriptor : %s.", node->fts_accpath);
-                       ret = dirfd;
+       // Check if a metadata file exists in the current directory
+       int metafd = openat(dirfd(curdir), "metadata", O_RDONLY);
+       if (metafd < 0) {
+               
+       } else {
+               ret = close(metafd);
+               if (ret < 0) {
+                       g_warning("Unable to close metadata "
+                               "file descriptor : %s.", trace_path);
                        goto error;
                }
+               
+               ret = lttv_traceset_create_trace(ts, trace_path);
+               if (ret < 0) {
+                       g_warning("Opening trace \"%s\" "
+                               "for reading.", trace_path);
+                       goto error;
+               }
+               metaFileFound = TRUE;
+       }
 
-               // Check if a metadata file exists in the current directory
-               metafd = openat(dirfd, "metadata", O_RDONLY);
-               if (metafd < 0) {
-                       ret = close(dirfd);
-                       if (ret < 0) {
-                               g_warning("Unable to open metadata "
-                                               "file descriptor : %s.", node->fts_accpath);
-                               goto error;
-                       }
-               } else {
-                       ret = close(metafd);
-                       if (ret < 0) {
-                               g_warning("Unable to close metadata "
-                                               "file descriptor : %s.", node->fts_accpath);
-                               goto error;
-                       }
-                       ret = close(dirfd);
-                       if (ret < 0) {
-                               g_warning("Unable to close trace "
-                                               "directory file descriptor : %s.", node->fts_accpath);
-                               goto error;
-                       }
-
-                       ret = lttv_traceset_create_trace(ts, node->fts_accpath);
-                       if (ret < 0) {
-                               g_warning("Opening trace \"%s\" from %s "
-                                               "for reading.", node->fts_accpath, trace_path);
-                               goto error;
+       struct dirent curentry;
+       struct dirent *resultentry;
+       while ((ret = readdir_r(curdir, &curentry, &resultentry)) == 0) {
+               if (resultentry == NULL) {
+                       /* No more entry*/
+                       break;
+               }
+               if (curentry.d_name[0] != '.') {
+                       if (curentry.d_type == DT_DIR) {
+
+                               char curpath[PATH_MAX];
+                               snprintf(curpath, PATH_MAX, "%s/%s", trace_path, curentry.d_name);
+                               ret = lttv_traceset_add_path(ts, curpath);
+                               if (ret >= 0) {
+                                       metaFileFound = TRUE;
+                               }
                        }
-                       metaFileFound = TRUE;
                }
        }
 
+       if (ret != 0) {
+               g_warning("Invalid readdir");
+       }       
+
 error:
-       ret = fts_close(tree);
-       if (ret < 0) {
-               g_warning("Unable to close tree  "
-                               "file descriptor : %s.", trace_path);
-       }
        if(metaFileFound)
          return ret;
        else
          return -1;
 }
 
-
 unsigned lttv_traceset_number(LttvTraceset *s) 
 {
        return s->traces->len;
This page took 0.025629 seconds and 4 git commands to generate.