changeset 589:7013fd450ff4

Changed my mind about the design again, now callback is dirtree_opennode() and recursion choice is how caller interprets flags.
author Rob Landley <rob@landley.net>
date Fri, 01 Jun 2012 20:27:51 -0500
parents 9c2277b92b86
children 7becb497c3c4
files lib/dirtree.c lib/lib.h toys/chgrp.c
diffstat 3 files changed, 15 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- a/lib/dirtree.c	Fri Jun 01 20:04:39 2012 -0500
+++ b/lib/dirtree.c	Fri Jun 01 20:27:51 2012 -0500
@@ -78,21 +78,20 @@
 	return DIRTREE_SAVE|DIRTREE_RECURSE;
 }
 
-// depth first recursion
-int dirtree_comeagain(struct dirtree *try, int recurse)
+// get open filehandle for node in extra, giving caller the option of
+// using DIRTREE_COMEAGAIN or not.
+int dirtree_opennode(struct dirtree *try)
 {
-	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);
-	}
+	if (!dirtree_notdotdot(try)) return 0;
+	if (S_ISDIR(try->st.st_mode)) {
+		if (!try->extra) {
+			try->extra = xdup(try->data);
+			return DIRTREE_COMEAGAIN;
+		}
+	} else try->extra = openat(try->parent ? try->parent->data : AT_FDCWD,
+		try->name, 0);
 
-	return ret;
+	return DIRTREE_SAVE|DIRTREE_RECURSE;
 }
 
 // Handle callback for a node in the tree. Returns saved node(s) or NULL.
--- a/lib/lib.h	Fri Jun 01 20:04:39 2012 -0500
+++ b/lib/lib.h	Fri Jun 01 20:27:51 2012 -0500
@@ -74,7 +74,7 @@
 struct dirtree *dirtree_add_node(int dirfd, char *name);
 char *dirtree_path(struct dirtree *node, int *plen);
 int dirtree_notdotdot(struct dirtree *catch);
-int dirtree_comeagain(struct dirtree *try, int recurse);
+int dirtree_opennode(struct dirtree *try);
 struct dirtree *handle_callback(struct dirtree *new,
 	int (*callback)(struct dirtree *node));
 void dirtree_recurse(struct dirtree *node,
--- a/toys/chgrp.c	Fri Jun 01 20:04:39 2012 -0500
+++ b/toys/chgrp.c	Fri Jun 01 20:27:51 2012 -0500
@@ -42,8 +42,8 @@
 {
 	int ret, flags = toys.optflags;
 
-	ret = dirtree_comeagain(node, flags & FLAG_R);
-	if (!ret || ret == DIRTREE_COMEAGAIN) return ret;
+	ret = dirtree_opennode(node);
+	if (!ret || ((flags & FLAG_R) && ret == DIRTREE_COMEAGAIN)) return ret;
 
 	if (node->extra != -1) ret = fchown(node->extra, -1, TT.group);