summaryrefslogtreecommitdiff
path: root/debianutils/which.c
diff options
context:
space:
mode:
authorDenis Vlasenko2006-10-11 22:16:56 +0000
committerDenis Vlasenko2006-10-11 22:16:56 +0000
commitf6f43df60bbd69ae5ea83b9012beb953a2baf116 (patch)
tree80c51cd39201fcffaa9537c5abd1b10da3811ad0 /debianutils/which.c
parent8de82bf84f7311bd74b08d9f4b4d4a6fef4649b9 (diff)
downloadbusybox-f6f43df60bbd69ae5ea83b9012beb953a2baf116.zip
busybox-f6f43df60bbd69ae5ea83b9012beb953a2baf116.tar.gz
ifupdown: stop emitting annoying/misleading error messages.
Patch by Gabriel Somlo <somlo at cmu.edu>
Diffstat (limited to 'debianutils/which.c')
-rw-r--r--debianutils/which.c68
1 files changed, 14 insertions, 54 deletions
diff --git a/debianutils/which.c b/debianutils/which.c
index 583d946..e83c752 100644
--- a/debianutils/which.c
+++ b/debianutils/which.c
@@ -3,6 +3,7 @@
* 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 the GPL v2 or later, see the file LICENSE in this tarball.
*
@@ -10,74 +11,33 @@
*/
#include "busybox.h"
-#include <string.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <sys/stat.h>
-
-
-static int is_executable_file(char *a, struct stat *b)
-{
- return (!access(a,X_OK) && !stat(a, b) && S_ISREG(b->st_mode));
-}
int which_main(int argc, char **argv)
{
- int status;
- size_t i, count;
- char *path_list, *p;
+ int status = EXIT_SUCCESS;
+ char *p;
if (argc <= 1 || argv[1][0] == '-') {
bb_show_usage();
}
- argc--;
-
- path_list = getenv("PATH");
- if (path_list != NULL) {
- count = 1;
- p = path_list;
- while ((p = strchr(p, ':')) != NULL) {
- *p++ = 0;
- count++;
- }
- } else {
- path_list = "/bin\0/sbin\0/usr/bin\0/usr/sbin\0/usr/local/bin";
- count = 5;
- }
-
- status = EXIT_SUCCESS;
- while (argc-- > 0) {
- struct stat stat_b;
- char *buf;
+ while (--argc > 0) {
argv++;
- buf = argv[0];
-
- /* If filename is either absolute or contains slashes,
- * stat it */
- if (strchr(buf, '/')) {
- if (is_executable_file(buf, &stat_b)) {
- puts(buf);
- goto next;
+ if (strchr(*argv, '/')) {
+ if (execable_file(*argv)) {
+ puts(*argv);
+ continue;
}
} else {
- /* File doesn't contain slashes */
- p = path_list;
- for (i = 0; i < count; i++) {
- /* Empty component in PATH is treated as . */
- buf = concat_path_file(p[0] ? p : ".", argv[0]);
- if (is_executable_file(buf, &stat_b)) {
- puts(buf);
- free(buf);
- goto next;
- }
- free(buf);
- p += strlen(p) + 1;
+ p = find_execable(*argv);
+ if (p) {
+ puts(p);
+ free(p);
+ continue;
}
}
status = EXIT_FAILURE;
- next: /* nothing */;
}
+
bb_fflush_stdout_and_exit(status);
}