From 7bc7971c0b876b2074ede82327edeaaffa56eb01 Mon Sep 17 00:00:00 2001 From: Rob Landley Date: Sat, 16 Feb 2008 19:41:20 -0600 Subject: Dirtree needs to use lstat(), not stat. And failure should probably be a 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 | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/lib/dirtree.c b/lib/dirtree.c index d56a5dcb..71f64493 100644 --- a/lib/dirtree.c +++ b/lib/dirtree.c @@ -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) -- cgit v1.2.3