Dirtree needs to use lstat(), not stat. And failure should probably be a
authorRob Landley <rob@landley.net>
Sun, 17 Feb 2008 01:41:20 +0000 (19:41 -0600)
committerRob Landley <rob@landley.net>
Sun, 17 Feb 2008 01:41:20 +0000 (19:41 -0600)
warning rather than an error (it means the directory tree is changing out
from under it, but only the user knows if that's fatal).

lib/dirtree.c

index d56a5dc..71f6449 100644 (file)
@@ -6,6 +6,8 @@
 
 #include "toys.h"
 
+// NOTE: This uses toybuf.  Possibly it shouldn't do that.
+
 // Create a dirtree node from a path.
 
 struct dirtree *dirtree_add_node(char *path)
@@ -30,7 +32,11 @@ struct dirtree *dirtree_add_node(char *path)
        }
 
        dt = xzalloc(sizeof(struct dirtree)+strlen(name)+1);
-       xstat(path, &(dt->st));
+       if (lstat(path, &(dt->st))) {
+               error_msg("Skipped '%s'",name);
+               free(dt);
+               return 0;
+       }
        strcpy(dt->name, name);
 
        return dt;
@@ -64,6 +70,7 @@ struct dirtree *dirtree_read(char *path, struct dirtree *parent,
 
                snprintf(path+len, sizeof(toybuf)-len, "/%s", entry->d_name);
                *ddt = dirtree_add_node(path);
+               if (!*ddt) continue;
                (*ddt)->parent = parent;
                if (callback) callback(*ddt);
                if (entry->d_type == DT_DIR)