From fec3fd1f8ac1db9ed87b79bd3eb5e38aa835e881 Mon Sep 17 00:00:00 2001 From: Rob Landley Date: Sat, 26 Jul 2014 13:30:40 -0500 Subject: Move DIRTREE_COMEAGAIN second callback up to when the filehandle is still open, and add dir->again variable to distinguish second call instead of checking for -1 filehandle. --- toys/posix/chgrp.c | 2 +- toys/posix/cp.c | 2 +- toys/posix/du.c | 4 ++-- toys/posix/rm.c | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) (limited to 'toys/posix') diff --git a/toys/posix/chgrp.c b/toys/posix/chgrp.c index c53ea21d..24af46ac 100644 --- a/toys/posix/chgrp.c +++ b/toys/posix/chgrp.c @@ -44,7 +44,7 @@ static int do_chgrp(struct dirtree *node) // Depth first search if (!dirtree_notdotdot(node)) return 0; - if ((flags & FLAG_R) && node->data != -1 && S_ISDIR(node->st.st_mode)) + if ((flags & FLAG_R) && !node->again && S_ISDIR(node->st.st_mode)) return DIRTREE_COMEAGAIN|((flags&FLAG_L) ? DIRTREE_SYMFOLLOW : 0); fd = dirtree_parentfd(node); diff --git a/toys/posix/cp.c b/toys/posix/cp.c index 283ee978..aecd1870 100644 --- a/toys/posix/cp.c +++ b/toys/posix/cp.c @@ -84,7 +84,7 @@ int cp_node(struct dirtree *try) if (!dirtree_notdotdot(try)) return 0; // If returning from COMEAGAIN, jump straight to -p logic at end. - if (S_ISDIR(try->st.st_mode) && try->data == -1) { + if (S_ISDIR(try->st.st_mode) && try->again) { fdout = try->extra; err = 0; } else { diff --git a/toys/posix/du.c b/toys/posix/du.c index 2bfa7e41..22a26d3a 100644 --- a/toys/posix/du.c +++ b/toys/posix/du.c @@ -111,12 +111,12 @@ static int do_du(struct dirtree *node) return 0; // Don't count hard links twice - if (!(toys.optflags & FLAG_l) && node->data != -1) + if (!(toys.optflags & FLAG_l) && !node->again) if (seen_inode(&TT.inodes, &node->st)) return 0; // Collect child info before printing directory size if (S_ISDIR(node->st.st_mode)) { - if (node->data != -1) { + if (!node->again) { TT.depth++; return DIRTREE_COMEAGAIN | (DIRTREE_SYMFOLLOW*!!(toys.optflags & FLAG_L)); } else TT.depth--; diff --git a/toys/posix/rm.c b/toys/posix/rm.c index 15359cb1..2f40106f 100644 --- a/toys/posix/rm.c +++ b/toys/posix/rm.c @@ -37,7 +37,7 @@ static int do_rm(struct dirtree *try) // This is either the posix section 2(b) prompt or the section 3 prompt. if (!(flags & FLAG_f) && (!S_ISLNK(try->st.st_mode) && faccessat(fd, try->name, W_OK, 0))) or++; - if (!(dir && try->data == -1) && ((or && isatty(0)) || (flags & FLAG_i))) { + if (!(dir && try->again) && ((or && isatty(0)) || (flags & FLAG_i))) { char *s = dirtree_path(try, 0); fprintf(stderr, "rm %s%s", or ? "ro " : "", dir ? "dir " : ""); or = yesno(s, 0); @@ -52,7 +52,7 @@ static int do_rm(struct dirtree *try) if (toys.optflags & FLAG_f) wfchmodat(fd, try->name, 0600); else goto skip; } - if (try->data != -1) return DIRTREE_COMEAGAIN; + if (!try->again) return DIRTREE_COMEAGAIN; using = AT_REMOVEDIR; if (try->symlink) goto skip; if (flags & FLAG_i) { -- cgit v1.2.3