find: fix handling of -prune
authorDenis Vlasenko <vda.linux@googlemail.com>
Sun, 8 Apr 2007 10:52:28 +0000 (10:52 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Sun, 8 Apr 2007 10:52:28 +0000 (10:52 -0000)
recursive_actions: uppercase flag constants

archival/tar.c
coreutils/chown.c
coreutils/diff.c
debianutils/run_parts.c
findutils/find.c
findutils/grep.c
include/libbb.h
libbb/recursive_action.c
modutils/insmod.c

index 5a6ef60db487c1bf4c523e2d4508bf76155ad3af..6552d6c5769171e672bea4f552ec2db71f063721 100644 (file)
@@ -562,8 +562,8 @@ static int writeTarFile(const int tar_fd, const int verboseFlag,
 
        /* Read the directory/files and iterate over them one at a time */
        while (include) {
-               if (!recursive_action(include->data, (action_recurse |
-                                dereferenceFlag ? action_followLinks : 0),
+               if (!recursive_action(include->data, ACTION_RECURSE |
+                               (dereferenceFlag ? ACTION_FOLLOWLINKS : 0),
                                writeFileToTarball, writeFileToTarball, &tbInfo, 0))
                {
                        errorFlag = TRUE;
index 09b1a595b641a9b315d42942e00700641d25ca32..e64a39c3e8ce6f9dc1c8a8610cd817fbfc14ecc2 100644 (file)
@@ -92,8 +92,8 @@ int chown_main(int argc, char **argv)
                }
 
                if (!recursive_action(arg,
-                               (OPT_RECURSE ? action_recurse : 0 | /* recurse */
-                                OPT_TRAVERSE ? action_followLinks : 0),/* follow links if -L */
+                               (OPT_RECURSE ? ACTION_RECURSE : 0) | /* recurse */
+                               (OPT_TRAVERSE ? ACTION_FOLLOWLINKS : 0),/* follow links if -L */
                                fileAction,     /* file action */
                                fileAction,     /* dir action */
                                chown_func,     /* user data */
index 75557187c981b8b469ad316a7627a2da93d6892c..09cacbde689f9198c03844126c324fe93708fe88 100644 (file)
@@ -1079,7 +1079,7 @@ static char **get_dir(char *path)
         * add_to_dirlist then removes root dir prefix. */
 
        if (option_mask32 & FLAG_r) {
-               recursive_action(path, action_recurse|action_followLinks,
+               recursive_action(path, ACTION_RECURSE|ACTION_FOLLOWLINKS,
                                        add_to_dirlist, NULL,
                                        (void*)(strlen(path)+1), 0);
        } else {
index c670727302bf360991293713cea54b687dc1a16f..873263a22f37b48d623c89ca33f555255e38f062 100644 (file)
@@ -138,7 +138,7 @@ int run_parts_main(int argc, char **argv)
                G.cmd[tmp] = arg_list->data;
        /* G.cmd[tmp] = NULL; - G is already zeroed out */
        if (!recursive_action(argv[argc - 1],
-                       action_recurse|action_followLinks,
+                       ACTION_RECURSE|ACTION_FOLLOWLINKS,
                        act,            /* file action */
                        act,            /* dir action */
                        NULL,           /* user data */
index 43120250b3b7f9e9abf7ffdcdfd0edcef62d20a9..3eea53db0504399dcccabd2a399810f629c477ea 100644 (file)
@@ -70,7 +70,7 @@ USE_FEATURE_FIND_MTIME( ACTS(mtime, char mtime_char; unsigned mtime_days;))
 USE_FEATURE_FIND_MMIN(  ACTS(mmin,  char mmin_char; unsigned mmin_mins;))
 USE_FEATURE_FIND_NEWER( ACTS(newer, time_t newer_mtime;))
 USE_FEATURE_FIND_INUM(  ACTS(inum,  ino_t inode_num;))
-USE_FEATURE_FIND_EXEC(  ACTS(exec,  char **exec_argv; unsigned int *subst_count; int exec_argc;))
+USE_FEATURE_FIND_EXEC(  ACTS(exec,  char **exec_argv; unsigned *subst_count; int exec_argc;))
 USE_FEATURE_FIND_USER(  ACTS(user,  uid_t uid;))
 USE_FEATURE_FIND_GROUP( ACTS(group, gid_t gid;))
 USE_FEATURE_FIND_PAREN( ACTS(paren, action ***subexpr;))
@@ -79,12 +79,12 @@ USE_FEATURE_FIND_PRUNE( ACTS(prune))
 
 static action ***actions;
 static bool need_print = 1;
-static int recurse_flags = action_recurse;
+static int recurse_flags = ACTION_RECURSE;
 
 #if ENABLE_FEATURE_FIND_EXEC
-static unsigned int count_subst(const char *str)
+static unsigned count_subst(const char *str)
 {
-       unsigned int count = 0;
+       unsigned count = 0;
        while ((str = strstr(str, "{}"))) {
                count++;
                str++;
@@ -93,7 +93,7 @@ static unsigned int count_subst(const char *str)
 }
 
 
-static char* subst(const char *src, unsigned int count, const char* filename)
+static char* subst(const char *src, unsigned count, const char* filename)
 {
        char *buf, *dst, *end;
        size_t flen = strlen(filename);
@@ -111,6 +111,10 @@ static char* subst(const char *src, unsigned int count, const char* filename)
 }
 #endif
 
+/* Return values of ACTFs ('action functions') are a bit mask:
+ * bit 1=1: prune (use SKIP constant for setting it)
+ * bit 0=1: matched successfully (TRUE)
+ */
 
 static int exec_actions(action ***appp, const char *fileName, struct stat *statbuf)
 {
@@ -121,24 +125,24 @@ static int exec_actions(action ***appp, const char *fileName, struct stat *statb
 
        cur_group = -1;
        while ((app = appp[++cur_group])) {
+               /* We invert TRUE bit (bit 0). Now 1 there means 'failure'.
+                * and bitwise OR in "rc |= TRUE ^ ap->f()" will:
+                * (1) make SKIP bit stick; and (2) detect 'failure' */
+               rc = 0; /* 'success' so far */
                cur_action = -1;
                while (1) {
                        ap = app[++cur_action];
-                       if (!ap) {
-                               /* all actions in group were successful */
-                               return rc;
-                       }
-                       rc = ap->f(fileName, statbuf, ap);
+                       if (!ap) /* all actions in group were successful */
+                               return rc ^ TRUE;
+                       rc |= TRUE ^ ap->f(fileName, statbuf, ap);
 #if ENABLE_FEATURE_FIND_NOT
-                       if (ap->invert) rc = !rc;
+                       if (ap->invert) rc ^= TRUE;
 #endif
-                       if (!rc) {
-                               /* current group failed, try next */
+                       if (rc & TRUE) /* current group failed, try next */
                                break;
-                       }
                }
        }
-       return rc;
+       return rc ^ TRUE; /* straighten things out */
 }
 
 
@@ -147,8 +151,16 @@ ACTF(name)
        const char *tmp = strrchr(fileName, '/');
        if (tmp == NULL)
                tmp = fileName;
-       else
+       else {
                tmp++;
+               if (!*tmp) { /* "foo/bar/". Oh no... go back to 'b' */
+                       tmp--;
+                       while (tmp != fileName && *--tmp != '/')
+                               continue;
+                       if (*tmp == '/')
+                               tmp++;
+               }
+       }
        return fnmatch(ap->pattern, tmp, FNM_PERIOD) == 0;
 }
 #if ENABLE_FEATURE_FIND_TYPE
@@ -269,7 +281,7 @@ ACTF(paren)
  */
 ACTF(prune)
 {
-       return SKIP;
+       return SKIP + TRUE;
 }
 #endif
 
@@ -284,7 +296,7 @@ ACTF(size)
 static int fileAction(const char *fileName, struct stat *statbuf, void* junk, int depth)
 {
        int i;
-#ifdef CONFIG_FEATURE_FIND_XDEV
+#if ENABLE_FEATURE_FIND_XDEV
        if (S_ISDIR(statbuf->st_mode) && xdev_count) {
                for (i = 0; i < xdev_count; i++) {
                        if (xdev_dev[i] != statbuf->st_dev)
@@ -294,11 +306,11 @@ static int fileAction(const char *fileName, struct stat *statbuf, void* junk, in
 #endif
        i = exec_actions(actions, fileName, statbuf);
        /* Had no explicit -print[0] or -exec? then print */
-       if (i && need_print)
+       if ((i & TRUE) && need_print)
                puts(fileName);
        /* Cannot return 0: our caller, recursive_action(),
         * will perror() and skip dirs (if called on dir) */
-       return i == 0 ? TRUE : i;
+       return (i & SKIP) ? SKIP : TRUE;
 }
 
 
@@ -386,8 +398,8 @@ static action*** parse_params(char **argv)
        USE_FEATURE_FIND_GROUP( "-group" ,)
        USE_FEATURE_FIND_DEPTH( "-depth" ,)
        USE_FEATURE_FIND_PAREN( "("      ,)
-       USE_FEATURE_FIND_SIZE(  "-size" ,)
-       USE_FEATURE_FIND_PRUNE( "-prune"  ,)
+       USE_FEATURE_FIND_SIZE(  "-size"  ,)
+       USE_FEATURE_FIND_PRUNE( "-prune" ,)
 #if ENABLE_DESKTOP
                                "-and"   ,
                                "-or"    ,
@@ -486,8 +498,7 @@ static action*** parse_params(char **argv)
                }
 #endif
 #if ENABLE_FEATURE_FIND_PERM
-/* TODO:
- * -perm mode   File's permission bits are exactly mode (octal or symbolic).
+/* -perm mode   File's permission bits are exactly mode (octal or symbolic).
  *              Symbolic modes use mode 0 as a point of departure.
  * -perm -mode  All of the permission bits mode are set for the file.
  * -perm +mode  Any of the permission bits mode are set for the file.
@@ -554,7 +565,7 @@ static action*** parse_params(char **argv)
                        ap->exec_argv = ++argv; /* first arg after -exec */
                        ap->exec_argc = 0;
                        while (1) {
-                               if (!*argv) /* did not see ';' util end */
+                               if (!*argv) /* did not see ';' until end */
                                        bb_error_msg_and_die(bb_msg_requires_arg, arg);
                                if (LONE_CHAR(argv[0], ';'))
                                        break;
@@ -593,7 +604,7 @@ static action*** parse_params(char **argv)
 #endif
 #if ENABLE_FEATURE_FIND_DEPTH
                else if (parm == PARM_depth) {
-                       recurse_flags |= action_depthFirst;
+                       recurse_flags |= ACTION_DEPTHFIRST;
                }
 #endif
 #if ENABLE_FEATURE_FIND_PAREN
@@ -652,7 +663,6 @@ USE_FEATURE_FIND_XDEV( "-xdev", )
                NULL
        };
 
-       bool dereference = FALSE;
        char *arg;
        char **argp;
        int i, firstopt, status = EXIT_SUCCESS;
@@ -684,7 +694,7 @@ USE_FEATURE_FIND_XDEV( "-xdev", )
        while ((arg = argp[0])) {
                i = index_in_str_array(options, arg);
                if (i == 0) { /* -follow */
-                       dereference = TRUE;
+                       recurse_flags |= ACTION_FOLLOWLINKS;
                        argp[0] = (char*)"-a";
                }
 #if ENABLE_FEATURE_FIND_XDEV
@@ -711,7 +721,7 @@ USE_FEATURE_FIND_XDEV( "-xdev", )
 
        for (i = 1; i < firstopt; i++) {
                if (!recursive_action(argv[i],
-                               recurse_flags|(1<<dereference), /* flags */
+                               recurse_flags /* flags */
                                fileAction,     /* file action */
                                fileAction,     /* dir action */
                                NULL,           /* user data */
index 370b753d734ed70e363e8cc566c9e4e0c73a8c4e..2ca4a3a0ada73a5b94a3cb3c3608d4d200859ed4 100644 (file)
@@ -336,9 +336,9 @@ static int grep_dir(const char *dir)
 {
        int matched = 0;
        recursive_action(dir,
-               /* recurse= */ action_recurse |
-               /* followLinks= */ /* no. 0 | */
-               /* depthFirst= */ action_depthFirst,
+               /* recurse=yes */ ACTION_RECURSE |
+               /* followLinks=no */
+               /* depthFirst=yes */ ACTION_DEPTHFIRST,
                /* fileAction= */ file_action_grep,
                /* dirAction= */ NULL,
                /* userData= */ &matched,
index 764d707b8af0be7be2a8ef655bef3df314afb130..6956aaf7b75000ba6f2008b009fa60f4bbaedeaf 100644 (file)
@@ -178,7 +178,7 @@ struct hwtype {
 
 /* buffer allocation schemes */
 #if ENABLE_FEATURE_BUFFERS_GO_ON_STACK
-#define RESERVE_CONFIG_BUFFER(buffer,len)           char buffer[len]
+#define RESERVE_CONFIG_BUFFER(buffer,len)  char buffer[len]
 #define RESERVE_CONFIG_UBUFFER(buffer,len) unsigned char buffer[len]
 #define RELEASE_CONFIG_BUFFER(buffer)      ((void)0)
 #else
@@ -187,9 +187,9 @@ struct hwtype {
 #define RESERVE_CONFIG_UBUFFER(buffer,len) static unsigned char buffer[len]
 #define RELEASE_CONFIG_BUFFER(buffer)      ((void)0)
 #else
-#define RESERVE_CONFIG_BUFFER(buffer,len)           char *buffer=xmalloc(len)
-#define RESERVE_CONFIG_UBUFFER(buffer,len) unsigned char *buffer=xmalloc(len)
-#define RELEASE_CONFIG_BUFFER(buffer)      free (buffer)
+#define RESERVE_CONFIG_BUFFER(buffer,len)  char *buffer = xmalloc(len)
+#define RESERVE_CONFIG_UBUFFER(buffer,len) unsigned char *buffer = xmalloc(len)
+#define RELEASE_CONFIG_BUFFER(buffer)      free(buffer)
 #endif
 #endif
 
@@ -219,7 +219,7 @@ struct sysinfo {
        unsigned int mem_unit;          /* Memory unit size in bytes */
        char _f[20-2*sizeof(long)-sizeof(int)]; /* Padding: libc5 uses this.. */
 };
-extern int sysinfo(struct sysinfo* info);
+int sysinfo(struct sysinfo* info);
 
 
 extern void chomp(char *s);
@@ -232,10 +232,12 @@ extern const char *bb_mode_string(mode_t mode);
 extern int is_directory(const char *name, int followLinks, struct stat *statBuf);
 extern int remove_file(const char *path, int flags);
 extern int copy_file(const char *source, const char *dest, int flags);
-#define action_recurse         (1<<0)
-#define action_followLinks     (1<<1)
-#define action_depthFirst      (1<<2)
-#define action_reverse         (1<<3)
+enum {
+       ACTION_RECURSE     = (1 << 0),
+       ACTION_FOLLOWLINKS = (1 << 1),
+       ACTION_DEPTHFIRST  = (1 << 2),
+       /*ACTION_REVERSE   = (1 << 3), - unused */
+};
 extern int recursive_action(const char *fileName, unsigned flags,
        int (*fileAction) (const char *fileName, struct stat* statbuf, void* userData, int depth),
        int (*dirAction) (const char *fileName, struct stat* statbuf, void* userData, int depth),
@@ -260,13 +262,12 @@ int ndelay_off(int fd);
 void xmove_fd(int, int);
 
 
-extern DIR *xopendir(const char *path);
-extern DIR *warn_opendir(const char *path);
+DIR *xopendir(const char *path);
+DIR *warn_opendir(const char *path);
 
 char *xrealloc_getcwd_or_warn(char *cwd);
 char *xmalloc_readlink_or_warn(const char *path);
 char *xmalloc_realpath(const char *path);
-extern void xstat(const char *filename, struct stat *buf);
 
 /* Unlike waitpid, waits ONLY for one process,
  * It's safe to pass negative 'pids' from failed [v]fork -
@@ -299,6 +300,7 @@ void xsetuid(uid_t uid);
 void xchdir(const char *path);
 void xsetenv(const char *key, const char *value);
 void xunlink(const char *pathname);
+void xstat(const char *pathname, struct stat *buf);
 int xopen(const char *pathname, int flags);
 int xopen3(const char *pathname, int flags, int mode);
 off_t xlseek(int fd, off_t offset, int whence);
index 0c05315754eb10f32f8a52b9ad2058373f425ad2..be2a700f57ef00a6d2d48d9374054841ffaf58a3 100644 (file)
@@ -55,12 +55,12 @@ int recursive_action(const char *fileName,
 
        if (!fileAction) fileAction = true_action;
        if (!dirAction) dirAction = true_action;
-       status = (flags & action_followLinks ? stat : lstat)(fileName, &statbuf);
+       status = (flags & ACTION_FOLLOWLINKS ? stat : lstat)(fileName, &statbuf);
 
        if (status < 0) {
 #ifdef DEBUG_RECURS_ACTION
                bb_error_msg("status=%d followLinks=%d TRUE=%d",
-                               status, flags & action_followLinks, TRUE);
+                               status, flags & ACTION_FOLLOWLINKS, TRUE);
 #endif
                goto done_nak_warn;
        }
@@ -68,7 +68,7 @@ int recursive_action(const char *fileName,
        /* If S_ISLNK(m), then we know that !S_ISDIR(m).
         * Then we can skip checking first part: if it is true, then
         * (!dir) is also true! */
-       if ( /* (!(flags & action_followLinks) && S_ISLNK(statbuf.st_mode)) || */
+       if ( /* (!(flags & ACTION_FOLLOWLINKS) && S_ISLNK(statbuf.st_mode)) || */
         !S_ISDIR(statbuf.st_mode)
        ) {
                return fileAction(fileName, &statbuf, userData, depth);
@@ -76,11 +76,11 @@ int recursive_action(const char *fileName,
 
        /* It's a directory (or a link to one, and followLinks is set) */
 
-       if (!(flags & action_recurse)) {
+       if (!(flags & ACTION_RECURSE)) {
                return dirAction(fileName, &statbuf, userData, depth);
        }
 
-       if (!(flags & action_depthFirst)) {
+       if (!(flags & ACTION_DEPTHFIRST)) {
                status = dirAction(fileName, &statbuf, userData, depth);
                if (!status) {
                        goto done_nak_warn;
@@ -104,14 +104,14 @@ int recursive_action(const char *fileName,
                if (nextFile == NULL)
                        continue;
                /* now descend into it, forcing recursion. */
-               if (!recursive_action(nextFile, flags | action_recurse,
+               if (!recursive_action(nextFile, flags | ACTION_RECURSE,
                                fileAction, dirAction, userData, depth+1)) {
                        status = FALSE;
                }
                free(nextFile);
        }
        closedir(dir);
-       if (flags & action_depthFirst &&
+       if ((flags & ACTION_DEPTHFIRST) &&
                !dirAction(fileName, &statbuf, userData, depth)) {
                        goto done_nak_warn;
        }
index 075969dcb5369b6e220474df6ea67eabffc2c18d..d4575e03b015bffdd36377dafd132c661d952deb 100644 (file)
@@ -4044,7 +4044,7 @@ int insmod_main( int argc, char **argv)
                                module_dir = tmdn;
                        else
                                module_dir = real_module_dir;
-                       recursive_action(module_dir, action_recurse,
+                       recursive_action(module_dir, ACTION_RECURSE,
                                        check_module_name_match, 0, m_fullName, 0);
                        free(tmdn);
                }
@@ -4059,7 +4059,7 @@ int insmod_main( int argc, char **argv)
                                strcpy(module_dir, _PATH_MODULES);
                        /* No module found under /lib/modules/`uname -r`, this
                         * time cast the net a bit wider.  Search /lib/modules/ */
-                       if (!recursive_action(module_dir, action_recurse,
+                       if (!recursive_action(module_dir, ACTION_RECURSE,
                                                    check_module_name_match, 0, m_fullName, 0)
                        ) {
                                if (m_filename == 0