diff options
author | Denis Vlasenko <vda.linux@googlemail.com> | 2008-06-05 13:33:59 +0000 |
---|---|---|
committer | Denis Vlasenko <vda.linux@googlemail.com> | 2008-06-05 13:33:59 +0000 |
commit | f592aa36f33430b866e9d7c975c6b9c356100d4b (patch) | |
tree | f7a8c565817ce331c6e18a2a399074c6c615cd79 /debianutils | |
parent | f0d6068086b701522b92a7dd941739cf4fbb71e8 (diff) | |
download | busybox-w32-f592aa36f33430b866e9d7c975c6b9c356100d4b.tar.gz busybox-w32-f592aa36f33430b866e9d7c975c6b9c356100d4b.tar.bz2 busybox-w32-f592aa36f33430b866e9d7c975c6b9c356100d4b.zip |
which: -a support (needed for bfin uclibc build script)
real support (with CONFIG_DESKTOP=y): 120+ bytes:
text data bss dec hex filename
807958 624 7036 815618 c7202 busybox_old
808085 624 7036 815745 c7281 busybox_unstripped
"fake" support (with CONFIG_DESKTOP unset): ~45 bytes:
text data bss dec hex filename
797790 611 6996 805397 c4a15 busybox_old
797834 611 6996 805441 c4a41 busybox_unstripped
Diffstat (limited to 'debianutils')
-rw-r--r-- | debianutils/which.c | 64 |
1 files changed, 52 insertions, 12 deletions
diff --git a/debianutils/which.c b/debianutils/which.c index 5ab67194d..41a864cfa 100644 --- a/debianutils/which.c +++ b/debianutils/which.c | |||
@@ -13,30 +13,69 @@ | |||
13 | #include "libbb.h" | 13 | #include "libbb.h" |
14 | 14 | ||
15 | int which_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; | 15 | int which_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; |
16 | int which_main(int argc, char **argv) | 16 | int which_main(int argc ATTRIBUTE_UNUSED, char **argv) |
17 | { | 17 | { |
18 | USE_DESKTOP(int opt;) | ||
18 | int status = EXIT_SUCCESS; | 19 | int status = EXIT_SUCCESS; |
20 | char *path; | ||
19 | char *p; | 21 | char *p; |
20 | 22 | ||
21 | if (argc <= 1 || argv[1][0] == '-') { | 23 | opt_complementary = "-1"; /* at least one argument */ |
22 | bb_show_usage(); | 24 | USE_DESKTOP(opt =) getopt32(argv, "a"); |
23 | } | 25 | argv += optind; |
24 | 26 | ||
25 | /* This matches what is seen on e.g. ubuntu | 27 | /* This matches what is seen on e.g. ubuntu. |
26 | * "which" there is a shell script */ | 28 | * "which" there is a shell script. */ |
27 | if (!getenv("PATH")) { | 29 | path = getenv("PATH"); |
28 | putenv((char*)bb_PATH_root_path); | 30 | if (!path) { |
31 | path = (char*)bb_PATH_root_path; | ||
32 | putenv(path); | ||
33 | path += 5; /* skip "PATH=" */ | ||
29 | } | 34 | } |
30 | 35 | ||
31 | while (--argc > 0) { | 36 | do { |
32 | argv++; | 37 | #if ENABLE_DESKTOP |
38 | /* Much bloat just to support -a */ | ||
33 | if (strchr(*argv, '/')) { | 39 | if (strchr(*argv, '/')) { |
34 | if (execable_file(*argv)) { | 40 | if (execable_file(*argv)) { |
35 | puts(*argv); | 41 | puts(*argv); |
36 | continue; | 42 | continue; |
37 | } | 43 | } |
44 | status = EXIT_FAILURE; | ||
38 | } else { | 45 | } else { |
39 | p = find_execable(*argv); | 46 | char *path2 = xstrdup(path); |
47 | char *tmp = path2; | ||
48 | |||
49 | p = find_execable(*argv, &tmp); | ||
50 | if (!p) | ||
51 | status = EXIT_FAILURE; | ||
52 | else { | ||
53 | print: | ||
54 | puts(p); | ||
55 | free(p); | ||
56 | if (opt) { | ||
57 | /* -a: show matches in all PATH components */ | ||
58 | if (tmp) { | ||
59 | p = find_execable(*argv, &tmp); | ||
60 | if (p) | ||
61 | goto print; | ||
62 | } | ||
63 | } | ||
64 | } | ||
65 | free(path2); | ||
66 | } | ||
67 | #else | ||
68 | /* Just ignoring -a */ | ||
69 | if (strchr(*argv, '/')) { | ||
70 | if (execable_file(*argv)) { | ||
71 | puts(*argv); | ||
72 | continue; | ||
73 | } | ||
74 | } else { | ||
75 | char *path2 = xstrdup(path); | ||
76 | char *tmp = path2; | ||
77 | p = find_execable(*argv, &tmp); | ||
78 | free(path2); | ||
40 | if (p) { | 79 | if (p) { |
41 | puts(p); | 80 | puts(p); |
42 | free(p); | 81 | free(p); |
@@ -44,7 +83,8 @@ int which_main(int argc, char **argv) | |||
44 | } | 83 | } |
45 | } | 84 | } |
46 | status = EXIT_FAILURE; | 85 | status = EXIT_FAILURE; |
47 | } | 86 | #endif |
87 | } while (*(++argv) != NULL); | ||
48 | 88 | ||
49 | fflush_stdout_and_exit(status); | 89 | fflush_stdout_and_exit(status); |
50 | } | 90 | } |