diff options
author | Eric Andersen <andersen@codepoet.org> | 2003-10-22 10:38:22 +0000 |
---|---|---|
committer | Eric Andersen <andersen@codepoet.org> | 2003-10-22 10:38:22 +0000 |
commit | 514633bf3f4f941d3ba1bb47cc46c31734574cf6 (patch) | |
tree | 0b88ae3bde763d8e1ead53c018c6b1cf16a2bc4b /debianutils | |
parent | 7f6295f51604a97a61958909b652dcf1e0e49485 (diff) | |
download | busybox-514633bf3f4f941d3ba1bb47cc46c31734574cf6.tar.gz |
Tomasz Motylewski reported that the 'which' applet does not find
files when the full file PATH is specified.
This patch from Arthur Othieno fixes it.
Diffstat (limited to 'debianutils')
-rw-r--r-- | debianutils/which.c | 42 |
1 files changed, 30 insertions, 12 deletions
diff --git a/debianutils/which.c b/debianutils/which.c index 79a89c4eb..74b922531 100644 --- a/debianutils/which.c +++ b/debianutils/which.c @@ -26,10 +26,19 @@ #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; |