From 6ec2178fafa44b2e9d710218db1e9827c1c81857 Mon Sep 17 00:00:00 2001 From: Rob Landley Date: Sat, 16 Jun 2012 15:16:08 -0500 Subject: Add dirtree_parentfd() --- lib/dirtree.c | 12 +++++++----- lib/lib.h | 1 + toys/chmod.c | 2 +- 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; } -- cgit v1.2.3