Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.busybox.net/busybox.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Andersen <andersen@codepoet.org>2003-10-22 14:38:22 +0400
committerEric Andersen <andersen@codepoet.org>2003-10-22 14:38:22 +0400
commit514633bf3f4f941d3ba1bb47cc46c31734574cf6 (patch)
tree0b88ae3bde763d8e1ead53c018c6b1cf16a2bc4b /debianutils
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')
-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;