aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/dirtree.c12
-rw-r--r--lib/lib.h1
-rw-r--r--toys/chmod.c2
3 files changed, 9 insertions, 6 deletions
diff --git a/lib/dirtree.c b/lib/dirtree.c
index ff274275..53d51902 100644
--- a/lib/dirtree.c
+++ b/lib/dirtree.c
@@ -79,6 +79,11 @@ int dirtree_notdotdot(struct dirtree *catch)
return DIRTREE_SAVE|DIRTREE_RECURSE;
}
+int dirtree_parentfd(struct dirtree *node)
+{
+ return node->parent ? node->parent->data : AT_FDCWD;
+}
+
// get open filehandle for node in extra, giving caller the option of
// using DIRTREE_COMEAGAIN or not.
int dirtree_opennode(struct dirtree *try)
@@ -89,8 +94,7 @@ int dirtree_opennode(struct dirtree *try)
try->extra = xdup(try->data);
return DIRTREE_COMEAGAIN;
}
- } else try->extra = openat(try->parent ? try->parent->data : AT_FDCWD,
- try->name, 0);
+ } else try->extra = openat(dirtree_parentfd(try), try->name, 0);
return DIRTREE_SAVE|DIRTREE_RECURSE;
}
@@ -113,9 +117,7 @@ struct dirtree *handle_callback(struct dirtree *new,
// Directory always has filehandle for examining contents. Whether or
// not we'll recurse into it gets decided later.
- if (dir)
- new->data = openat(new->parent ? new->parent->data : AT_FDCWD,
- new->name, 0);
+ if (dir) new->data = openat(dirtree_parentfd(new), new->name, 0);
flags = callback(new);
diff --git a/lib/lib.h b/lib/lib.h
index c3aa15ce..a427640d 100644
--- a/lib/lib.h
+++ b/lib/lib.h
@@ -74,6 +74,7 @@ struct dirtree {
struct dirtree *dirtree_add_node(int dirfd, char *name, int symfollow);
char *dirtree_path(struct dirtree *node, int *plen);
int dirtree_notdotdot(struct dirtree *catch);
+int dirtree_parentfd(struct dirtree *node);
int dirtree_opennode(struct dirtree *try);
struct dirtree *handle_callback(struct dirtree *new,
int (*callback)(struct dirtree *node));
diff --git a/toys/chmod.c b/toys/chmod.c
index 2a4e5e3d..e41598c1 100644
--- a/toys/chmod.c
+++ b/toys/chmod.c
@@ -58,7 +58,7 @@ int do_chmod(struct dirtree *try)
printf("chmod '%s' to %04o\n", s, mode);
free(s);
}
- wfchmodat(try->parent ? try->parent->data : AT_FDCWD, try->name, mode);
+ wfchmodat(dirtree_parentfd(try), try->name, mode);
return (toys.optflags & FLAG_R) ? DIRTREE_RECURSE : 0;
}