Tomasz Motylewski reported that the 'which' applet does not find
authorEric Andersen <andersen@codepoet.org>
Wed, 22 Oct 2003 10:38:22 +0000 (10:38 -0000)
committerEric Andersen <andersen@codepoet.org>
Wed, 22 Oct 2003 10:38:22 +0000 (10:38 -0000)
files when the full file PATH is specified.

This patch from Arthur Othieno fixes it.

debianutils/which.c

index 79a89c4ebea2e3426535d6126be45f0df0e8a6cb..74b92253177b8e1e06ff45e3d0e665f8824b6968 100644 (file)
 #include <stdlib.h>
 #include "busybox.h"
 
+static int file_exists(char *file)
+{
+       struct stat filestat;
+
+       if (stat(file, &filestat) == 0 && filestat.st_mode & S_IXUSR)
+               return 1;
+       else
+               return 0;
+}
+       
 extern int which_main(int argc, char **argv)
 {
        char *path_list, *path_n;
-       struct stat filestat;
        int i, count=1, found, status = EXIT_SUCCESS;
 
        if (argc <= 1 || **(argv + 1) == '-')
@@ -52,18 +61,27 @@ extern int which_main(int argc, char **argv)
                path_n = path_list;
                argv++;
                found = 0;
-               for (i = 0; i < count; i++) {
-                       char *buf;
-                       buf = concat_path_file(path_n, *argv);
-                       if (stat (buf, &filestat) == 0
-                           && filestat.st_mode & S_IXUSR)
-                       {
-                               puts(buf);
-                               found = 1;
-                               break;
+               char *buf;
+
+               /*
+                * Check if we were given the full path, first.
+                * Otherwise see if the file exists in our $PATH.
+                */
+               buf = *argv;
+               if (file_exists(buf)) {
+                       puts(buf);
+                       found = 1;
+               } else {
+                       for (i = 0; i < count; i++) {
+                               buf = concat_path_file(path_n, *argv);
+                               if (file_exists(buf)) {
+                                       puts(buf);
+                                       found = 1;
+                                       break;
+                               }
+                               free(buf);
+                               path_n += (strlen(path_n) + 1);
                        }
-                       free(buf);
-                       path_n += (strlen(path_n) + 1);
                }
                if (!found)
                        status = EXIT_FAILURE;