aboutsummaryrefslogtreecommitdiff
path: root/lib/dirtree.c
diff options
context:
space:
mode:
authorRob Landley <rob@landley.net>2012-06-01 20:04:39 -0500
committerRob Landley <rob@landley.net>2012-06-01 20:04:39 -0500
commit4fa1b32871f661a7e11898b274ec162d52c23ee9 (patch)
tree9e31649d13c0959df24bb8a960a7086c4a891e7a /lib/dirtree.c
parent124786aeeb3edec3f9b39f2251c8b732198fea93 (diff)
downloadtoybox-4fa1b32871f661a7e11898b274ec162d52c23ee9.tar.gz
Factor out dirtree_comeagain() callback, setting up depth-first search with open filehandle in node->extra.
Diffstat (limited to 'lib/dirtree.c')
-rw-r--r--lib/dirtree.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/lib/dirtree.c b/lib/dirtree.c
index 418e8eb1..01e0ea8c 100644
--- a/lib/dirtree.c
+++ b/lib/dirtree.c
@@ -78,6 +78,23 @@ int dirtree_notdotdot(struct dirtree *catch)
return DIRTREE_SAVE|DIRTREE_RECURSE;
}
+// depth first recursion
+int dirtree_comeagain(struct dirtree *try, int recurse)
+{
+ int ret = dirtree_notdotdot(try);
+ if (ret) {
+ if (S_ISDIR(try->st.st_mode)) {
+ if (!try->extra) {
+ try->extra = xdup(try->data);
+ if (recurse) return DIRTREE_COMEAGAIN;
+ }
+ } else try->extra = openat(try->parent ? try->parent->data : AT_FDCWD,
+ try->name, 0);
+ }
+
+ return ret;
+}
+
// Handle callback for a node in the tree. Returns saved node(s) or NULL.
//
// By default, allocates a tree of struct dirtree, not following symlinks