which: rewrite
authorTito Ragusa <farmatito@tiscali.it>
Sat, 3 May 2014 14:34:36 +0000 (16:34 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Sun, 4 May 2014 15:35:31 +0000 (17:35 +0200)
function                                             old     new   delta
which_main                                           237     212     -25

Signed-off-by: Tito Ragusa <farmatito@tiscali.it>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
debianutils/which.c

index 760bcdcadf152af7529ecd98515838d2eba1c5b4..d50e7a0d31ea60e5d17dfc1c02293645a0562659 100644 (file)
@@ -1,13 +1,9 @@
 /* vi: set sw=4 ts=4: */
 /*
- * Which implementation for busybox
- *
  * Copyright (C) 1999-2004 by Erik Andersen <andersen@codepoet.org>
  * Copyright (C) 2006 Gabriel Somlo <somlo at cmu.edu>
  *
  * Licensed under GPLv2 or later, see file LICENSE in this source tree.
- *
- * Based on which from debianutils
  */
 
 //usage:#define which_trivial_usage
 int which_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
 int which_main(int argc UNUSED_PARAM, char **argv)
 {
-       IF_DESKTOP(int opt;)
-       int status = EXIT_SUCCESS;
-       char *path;
-       char *p;
+       const char *env_path;
+       int status = 0;
+
+       env_path = getenv("PATH");
+       if (!env_path)
+               env_path = bb_default_root_path;
 
        opt_complementary = "-1"; /* at least one argument */
-       IF_DESKTOP(opt =) getopt32(argv, "a");
+       getopt32(argv, "a");
        argv += optind;
 
-       /* This matches what is seen on e.g. ubuntu.
-        * "which" there is a shell script. */
-       path = getenv("PATH");
-       if (!path) {
-               path = (char*)bb_PATH_root_path;
-               putenv(path);
-               path += 5; /* skip "PATH=" */
-       }
-
        do {
-#if ENABLE_DESKTOP
-/* Much bloat just to support -a */
-               if (strchr(*argv, '/')) {
-                       if (file_is_executable(*argv)) {
-                               puts(*argv);
-                               continue;
-                       }
-                       status = EXIT_FAILURE;
-               } else {
-                       char *path2 = xstrdup(path);
-                       char *tmp = path2;
+               int missing = 1;
 
-                       p = find_executable(*argv, &tmp);
-                       if (!p)
-                               status = EXIT_FAILURE;
-                       else {
- print:
-                               puts(p);
-                               free(p);
-                               if (opt) {
-                                       /* -a: show matches in all PATH components */
-                                       if (tmp) {
-                                               p = find_executable(*argv, &tmp);
-                                               if (p)
-                                                       goto print;
-                                       }
-                               }
-                       }
-                       free(path2);
-               }
-#else
-/* Just ignoring -a */
+               /* If file contains a slash don't use PATH */
                if (strchr(*argv, '/')) {
                        if (file_is_executable(*argv)) {
+                               missing = 0;
                                puts(*argv);
-                               continue;
                        }
                } else {
-                       char *path2 = xstrdup(path);
-                       char *tmp = path2;
-                       p = find_executable(*argv, &tmp);
-                       free(path2);
-                       if (p) {
+                       char *path;
+                       char *tmp;
+                       char *p;
+
+                       path = tmp = xstrdup(env_path);
+                       while ((p = find_executable(*argv, &tmp)) != NULL) {
+                               missing = 0;
                                puts(p);
                                free(p);
-                               continue;
+                               if (!option_mask32) /* -a not set */
+                                       break;
                        }
+                       free(path);
                }
-               status = EXIT_FAILURE;
-#endif
-       } while (*(++argv) != NULL);
+               status |= missing;
+       } while (*++argv);
 
-       fflush_stdout_and_exit(status);
+       return status;
 }