1 /* vi: set sw=4 ts=4: */
3 * Which implementation for busybox
5 * Copyright (C) 1999-2004 by Erik Andersen <andersen@codepoet.org>
7 * Licensed under the GPL v2, see the file LICENSE in this tarball.
9 * Based on which from debianutils
19 int which_main(int argc, char **argv)
21 int status = EXIT_SUCCESS;
25 if (argc <= 1 || **(argv + 1) == '-') {
30 path_list = getenv("PATH");
31 if (path_list != NULL) {
32 size_t path_len = strlen(path_list);
33 char *new_list = NULL;
36 for (i = 0; i <= path_len; i++) {
37 char *this_i = &path_list[i];
40 if (!i && (*(this_i + 1) == ':')) {
46 /* ^:[^:] == \.0 and [^:]::[^:] == 0\.0 and [^:]:$ == 0\.0 */
47 if (!i || (*(this_i + 1) == ':') || (i == path_len-1)) {
48 new_list = xrealloc(new_list, path_len += 1);
50 memmove(&new_list[i+2], &path_list[i+1], path_len-i);
52 memmove(new_list, path_list, i);
54 memmove(&new_list[i+1], &path_list[i], path_len-i);
62 path_list = "/bin\0/sbin\0/usr/bin\0/usr/sbin\0/usr/local/bin";
71 #define is_executable_file(a, b) (!access(a,X_OK) && !stat(a, &b) && \
78 /* if filename is either absolute or contains slashes,
80 if (strchr(buf, '/') != NULL && is_executable_file(buf, stat_b)) {
83 /* Couldn't access file and file doesn't contain slashes */
84 for (i = 0; i < count; i++) {
85 buf = concat_path_file(path_n, *argv);
86 if (is_executable_file(buf, stat_b)) {
91 path_n += (strlen(path_n) + 1);
97 status = EXIT_FAILURE;
100 bb_fflush_stdout_and_exit(status);
105 c-file-style: "linux"