1 /* vi: set sw=4 ts=4: */
3 * Which implementation for busybox
5 * Copyright (C) 1999-2004 by Erik Andersen <andersen@codepoet.org>
6 * Copyright (C) 2006 Gabriel Somlo <somlo at cmu.edu>
8 * Licensed under GPLv2 or later, see file LICENSE in this source tree.
10 * Based on which from debianutils
13 //usage:#define which_trivial_usage
14 //usage: "[COMMAND]..."
15 //usage:#define which_full_usage "\n\n"
16 //usage: "Locate a COMMAND"
18 //usage:#define which_example_usage
19 //usage: "$ which login\n"
20 //usage: "/bin/login\n"
24 int which_main(int argc
, char **argv
) MAIN_EXTERNALLY_VISIBLE
;
25 int which_main(int argc UNUSED_PARAM
, char **argv
)
28 int status
= EXIT_SUCCESS
;
32 opt_complementary
= "-1"; /* at least one argument */
33 IF_DESKTOP(opt
=) getopt32(argv
, "a");
36 /* This matches what is seen on e.g. ubuntu.
37 * "which" there is a shell script. */
38 path
= getenv("PATH");
40 path
= (char*)bb_PATH_root_path
;
42 path
+= 5; /* skip "PATH=" */
47 /* Much bloat just to support -a */
48 if (strchr(*argv
, '/')) {
49 if (execable_file(*argv
)) {
53 status
= EXIT_FAILURE
;
55 char *path2
= xstrdup(path
);
58 p
= find_execable(*argv
, &tmp
);
60 status
= EXIT_FAILURE
;
66 /* -a: show matches in all PATH components */
68 p
= find_execable(*argv
, &tmp
);
77 /* Just ignoring -a */
78 if (strchr(*argv
, '/')) {
79 if (execable_file(*argv
)) {
84 char *path2
= xstrdup(path
);
86 p
= find_execable(*argv
, &tmp
);
94 status
= EXIT_FAILURE
;
96 } while (*(++argv
) != NULL
);
98 fflush_stdout_and_exit(status
);