[hackers] [sbase] [PATCH 1/2] [libutil/recurse] only opendir if recursing

From: David Phillips <david_AT_sighup.nz>
Date: Sun, 1 Oct 2017 21:39:27 +1300

Previous behaviour was to call opendir regardless of if we are actually going
to be recursing into the directory. Additionally, some utilities that use
DIRFIRST benefit from running the function pointed to by fn before the call
to opendir. One such example is `chmod [-R] 777 dir` on a directory with mode
000, where it will be expected for chmod to first give itself rwx before
optionally listing the directory to traverse it.
---
 libutil/recurse.c | 15 +++++++--------
 1 file changed, 7 insertions(+), 8 deletions(-)
diff --git a/libutil/recurse.c b/libutil/recurse.c
index e2b8a6e..38bee42 100644
--- a/libutil/recurse.c
+++ b/libutil/recurse.c
_AT_@ -54,18 +54,17 @@ recurse(const char *path, void *data, struct recursor *r)
 		if (h->ino == st.st_ino && h->dev == st.st_dev)
 			return;
 
-	if (!(dp = opendir(path))) {
-		if (!(r->flags & SILENT)) {
-			weprintf("opendir %s:", path);
-			recurse_status = 1;
-		}
-		return;
-	}
-
 	if (!r->depth && (r->flags & DIRFIRST))
 		(r->fn)(path, &st, data, r);
 
 	if (!r->maxdepth || r->depth + 1 < r->maxdepth) {
+		if (!(dp = opendir(path))) {
+			if (!(r->flags & SILENT)) {
+				weprintf("opendir %s:", path);
+				recurse_status = 1;
+			}
+			return;
+		}
 		while ((d = readdir(dp))) {
 			if (r->follow == 'H') {
 				statf_name = "lstat";
-- 
2.14.1
Received on Sun Oct 01 2017 - 10:39:27 CEST

This archive was generated by hypermail 2.3.0 : Sun Oct 01 2017 - 10:48:21 CEST