summaryrefslogtreecommitdiffhomepage
path: root/debianutils/which.c
diff options
context:
space:
mode:
authorEric Andersen <andersen@codepoet.org>2003-10-22 10:38:22 +0000
committerEric Andersen <andersen@codepoet.org>2003-10-22 10:38:22 +0000
commit514633bf3f4f941d3ba1bb47cc46c31734574cf6 (patch)
tree0b88ae3bde763d8e1ead53c018c6b1cf16a2bc4b /debianutils/which.c
parent7f6295f51604a97a61958909b652dcf1e0e49485 (diff)
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/which.c')
-rw-r--r--debianutils/which.c42
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;