diff options
author | Rob Landley <rob@landley.net> | 2012-06-16 15:16:08 -0500 |
---|---|---|
committer | Rob Landley <rob@landley.net> | 2012-06-16 15:16:08 -0500 |
commit | 6ec2178fafa44b2e9d710218db1e9827c1c81857 (patch) | |
tree | 5ab6d23527214f32a9b20adb0d7f63007e1dcaac | |
parent | 628eb9b22032fb0f2e343f43efa60ec52b01d345 (diff) | |
download | toybox-6ec2178fafa44b2e9d710218db1e9827c1c81857.tar.gz |
Add dirtree_parentfd()
-rw-r--r-- | lib/dirtree.c | 12 | ||||
-rw-r--r-- | lib/lib.h | 1 | ||||
-rw-r--r-- | 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); @@ -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; } |