- fold recurse, depthFirst and dereference params into one param flags.
authorBernhard Reutner-Fischer <rep.dot.nop@gmail.com>
Thu, 29 Mar 2007 10:30:50 +0000 (10:30 -0000)
committerBernhard Reutner-Fischer <rep.dot.nop@gmail.com>
Thu, 29 Mar 2007 10:30:50 +0000 (10:30 -0000)
  Minor size improvement (-16b for size, -24b according to bloat-o-meter).

archival/tar.c
coreutils/chmod.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
selinux/chcon.c

index 176a7e22da436c4e5d7c2df50a6e4e52a0bc816c..5a6ef60db487c1bf4c523e2d4508bf76155ad3af 100644 (file)
@@ -562,8 +562,9 @@ 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, TRUE, dereferenceFlag,
-                               FALSE, writeFileToTarball, writeFileToTarball, &tbInfo, 0))
+               if (!recursive_action(include->data, (action_recurse |
+                                dereferenceFlag ? action_followLinks : 0),
+                               writeFileToTarball, writeFileToTarball, &tbInfo, 0))
                {
                        errorFlag = TRUE;
                }
index 11c6731a190fce41375f308039813e4e423ba350..9a73218a1a324daa9c71fd0526da9c104a445a0c 100644 (file)
@@ -101,8 +101,6 @@ int chmod_main(int argc, char **argv)
        do {
                if (!recursive_action(*argv,
                        OPT_RECURSE,    // recurse
-                       FALSE,          // follow links: coreutils doesn't
-                       FALSE,          // depth first
                        fileAction,     // file action
                        fileAction,     // dir action
                        smode,          // user data
index f92299e362acfdf717f6f0985f2fec4d01c64a52..09b1a595b641a9b315d42942e00700641d25ca32 100644 (file)
@@ -92,13 +92,12 @@ int chown_main(int argc, char **argv)
                }
 
                if (!recursive_action(arg,
-                               OPT_RECURSE,    // recurse
-                               OPT_TRAVERSE,   // follow links if -L
-                               FALSE,          // depth first
-                               fileAction,     // file action
-                               fileAction,     // dir action
-                               chown_func,     // user data
-                               0)              // depth
+                               (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 */
+                               0)              /* depth */
                ) {
                        retval = EXIT_FAILURE;
                }
index 911bfcf4d6f18554935df176cd81b2d5570f86f9..1903bb1511c99f94e9cce9a8ceaab3933a85a048 100644 (file)
@@ -1079,7 +1079,8 @@ static char **get_dir(char *path)
         * add_to_dirlist then removes root dir prefix. */
 
        if (option_mask32 & FLAG_r) {
-               recursive_action(path, TRUE, TRUE, FALSE, add_to_dirlist, NULL,
+               recursive_action(path, action_recurse|action_followLinks,
+                                       add_to_dirlist, NULL,
                                        (void*)(strlen(path)+1), 0);
        } else {
                DIR *dp;
index b41045a36dbb724a46fd725c6864d5d4596480f3..c670727302bf360991293713cea54b687dc1a16f 100644 (file)
@@ -138,9 +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],
-                       TRUE,           /* recurse */
-                       TRUE,           /* follow links */
-                       FALSE,          /* depth first */
+                       action_recurse|action_followLinks,
                        act,            /* file action */
                        act,            /* dir action */
                        NULL,           /* user data */
index e98d995a401244bb6ff6904081b83e2bbd529a3a..c043fbc7dbfdc364c8305283ea79240280faea69 100644 (file)
@@ -574,7 +574,7 @@ static action*** parse_params(char **argv)
 int find_main(int argc, char **argv);
 int find_main(int argc, char **argv)
 {
-       int dereference = FALSE;
+       bool dereference = FALSE;
        char *arg;
        char **argp;
        int i, firstopt, status = EXIT_SUCCESS;
@@ -632,13 +632,11 @@ int find_main(int argc, char **argv)
 
        for (i = 1; i < firstopt; i++) {
                if (!recursive_action(argv[i],
-                               TRUE,           // recurse
-                               dereference,    // follow links
-                               FALSE,          // depth first
-                               fileAction,     // file action
-                               fileAction,     // dir action
-                               NULL,           // user data
-                               0))             // depth
+                               action_recurse|(1<<dereference), /* flags */
+                               fileAction,     /* file action */
+                               fileAction,     /* dir action */
+                               NULL,           /* user data */
+                               0))             /* depth */
                        status = EXIT_FAILURE;
        }
        return status;
index f6ea54ed207cf91680c5ea2be2839d8a5a8025d1..43810ea847637bc1d4ee0342dfc8361f29f8c423 100644 (file)
@@ -336,9 +336,9 @@ static int grep_dir(const char *dir)
 {
        int matched = 0;
        recursive_action(dir,
-               /* recurse= */ 1,
-               /* followLinks= */ 0,
-               /* depthFirst= */ 1,
+               /* recurse= */ action_recurse |
+               /* followLinks= */ /* no. 0 | */
+               /* depthFirst= */ action_depthFirst,
                /* fileAction= */ file_action_grep,
                /* dirAction= */ NULL,
                /* userData= */ &matched,
index d734abed67a72e4ecf835d6de4e7abc3b449713a..7f0ad2c259d1214b73a032a0101744599c7acb1f 100644 (file)
@@ -231,11 +231,14 @@ 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);
-extern int recursive_action(const char *fileName, int recurse,
-       int followLinks, int depthFirst,
+#define action_recurse         (1<<0)
+#define action_followLinks     (1<<1)
+#define action_depthFirst      (1<<2)
+#define action_reverse         (1<<3)
+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),
-       void* userData, int depth);
+       void* userData, const unsigned depth);
 extern int device_open(const char *device, int mode);
 extern int get_console_fd(void);
 extern char *find_block_device(const char *path);
index 25a87b88e451a48b560d2d01d1c7c6bbf96188b8..0c05315754eb10f32f8a52b9ad2058373f425ad2 100644 (file)
@@ -22,7 +22,8 @@
  * is so stinking huge.
  */
 
-static int true_action(const char *fileName, struct stat *statbuf, void* userData, int depth)
+static int true_action(const char *fileName, struct stat *statbuf,
+                                               void* userData, int depth)
 {
        return TRUE;
 }
@@ -41,11 +42,11 @@ static int true_action(const char *fileName, struct stat *statbuf, void* userDat
  */
 
 int recursive_action(const char *fileName,
-               int recurse, int followLinks, int depthFirst,
+               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),
                void* userData,
-               int depth)
+               const unsigned depth)
 {
        struct stat statbuf;
        int status;
@@ -54,22 +55,20 @@ int recursive_action(const char *fileName,
 
        if (!fileAction) fileAction = true_action;
        if (!dirAction) dirAction = true_action;
-
-       status = (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, followLinks, TRUE);
+                               status, flags & action_followLinks, TRUE);
 #endif
-               bb_perror_msg("%s", fileName);
-               return FALSE;
+               goto done_nak_warn;
        }
 
        /* 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 ( /* (!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);
@@ -77,15 +76,14 @@ int recursive_action(const char *fileName,
 
        /* It's a directory (or a link to one, and followLinks is set) */
 
-       if (!recurse) {
+       if (!(flags & action_recurse)) {
                return dirAction(fileName, &statbuf, userData, depth);
        }
 
-       if (!depthFirst) {
+       if (!(flags & action_depthFirst)) {
                status = dirAction(fileName, &statbuf, userData, depth);
                if (!status) {
-                       bb_perror_msg("%s", fileName);
-                       return FALSE;
+                       goto done_nak_warn;
                }
                if (status == SKIP)
                        return TRUE;
@@ -96,8 +94,7 @@ int recursive_action(const char *fileName,
                /* findutils-4.1.20 reports this */
                /* (i.e. it doesn't silently return with exit code 1) */
                /* To trigger: "find -exec rm -rf {} \;" */
-               bb_perror_msg("%s", fileName);
-               return FALSE;
+               goto done_nak_warn;
        }
        status = TRUE;
        while ((next = readdir(dir)) != NULL) {
@@ -106,21 +103,23 @@ int recursive_action(const char *fileName,
                nextFile = concat_subpath_file(fileName, next->d_name);
                if (nextFile == NULL)
                        continue;
-               if (!recursive_action(nextFile, TRUE, followLinks, depthFirst,
+               /* now descend into it, forcing recursion. */
+               if (!recursive_action(nextFile, flags | action_recurse,
                                fileAction, dirAction, userData, depth+1)) {
                        status = FALSE;
                }
                free(nextFile);
        }
        closedir(dir);
-       if (depthFirst) {
-               if (!dirAction(fileName, &statbuf, userData, depth)) {
-                       bb_perror_msg("%s", fileName);
-                       return FALSE;
-               }
+       if (flags & action_depthFirst &&
+               !dirAction(fileName, &statbuf, userData, depth)) {
+                       goto done_nak_warn;
        }
 
        if (!status)
                return FALSE;
        return TRUE;
+done_nak_warn:
+       bb_perror_msg("%s", fileName);
+       return FALSE;
 }
index 57092f79a84248d382badc9bc6beb563995bb558..075969dcb5369b6e220474df6ea67eabffc2c18d 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, TRUE, FALSE, FALSE,
+                       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, TRUE, FALSE, FALSE,
+                       if (!recursive_action(module_dir, action_recurse,
                                                    check_module_name_match, 0, m_fullName, 0)
                        ) {
                                if (m_filename == 0
index 72cfa93c3fadd2fb5387af7c11bcb08070c4b722..0eab6864ea867103581abf6a7aad5121a523a7bd 100644 (file)
@@ -163,9 +163,7 @@ int chcon_main(int argc, char *argv[])
                fname[fname_len] = '\0';
 
                if (recursive_action(fname,
-                                    option_mask32 & OPT_RECURSIVE,
-                                    FALSE,     /* followLinks */
-                                    FALSE,     /* depthFirst */
+                                    1<<option_mask32 & OPT_RECURSIVE,
                                     change_filedir_context,
                                     change_filedir_context,
                                     NULL, 0) != TRUE)