diff options
-rw-r--r-- | debianutils/which.c | 68 | ||||
-rw-r--r-- | include/libbb.h | 4 | ||||
-rw-r--r-- | libbb/Kbuild | 2 | ||||
-rw-r--r-- | networking/ifupdown.c | 88 |
4 files changed, 74 insertions, 88 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); } diff --git a/include/libbb.h b/include/libbb.h index 1d26b03..ac48411 100644 --- a/include/libbb.h +++ b/include/libbb.h @@ -430,6 +430,10 @@ char *last_char_is(const char *s, int c); char *fgets_str(FILE *file, const char *terminating_string); +int execable_file(const char *name); +char *find_execable(const char *filename); +int exists_execable(const char *filename); + extern USE_DESKTOP(long long) int uncompress(int fd_in, int fd_out); extern int inflate(int in, int out); diff --git a/libbb/Kbuild b/libbb/Kbuild index 4e992ef..27ed68c 100644 --- a/libbb/Kbuild +++ b/libbb/Kbuild @@ -28,7 +28,7 @@ lib-y:= \ getopt32.o default_error_retval.o wfopen_input.o speed_table.o \ perror_nomsg_and_die.o perror_nomsg.o skip_whitespace.o bb_askpass.o \ warn_ignoring_args.o concat_subpath_file.o vfork_daemon_rexec.o \ - bb_do_delay.o uuencode.o info_msg.o vinfo_msg.o + bb_do_delay.o uuencode.o info_msg.o vinfo_msg.o execable.o # conditionally compiled objects: lib-$(CONFIG_FEATURE_MOUNT_LOOP) += loop.o diff --git a/networking/ifupdown.c b/networking/ifupdown.c index f572b48..c1dc1d3 100644 --- a/networking/ifupdown.c +++ b/networking/ifupdown.c @@ -133,7 +133,7 @@ static int count_netmask_bits(char *dotted_quad) } #endif -static void addstr(char **buf, size_t *len, size_t *pos, char *str, size_t str_length) +static void addstr(char **buf, size_t *len, size_t *pos, const char *str, size_t str_length) { if (*pos + str_length >= *len) { char *newbuf; @@ -150,7 +150,7 @@ static void addstr(char **buf, size_t *len, size_t *pos, char *str, size_t str_l (*buf)[*pos] = '\0'; } -static int strncmpz(char *l, char *r, size_t llen) +static int strncmpz(const char *l, const char *r, size_t llen) { int i = strncmp(l, r, llen); @@ -161,7 +161,7 @@ static int strncmpz(char *l, char *r, size_t llen) } } -static char *get_var(char *id, size_t idlen, struct interface_defn_t *ifd) +static char *get_var(const char *id, size_t idlen, struct interface_defn_t *ifd) { int i; @@ -188,7 +188,7 @@ static char *get_var(char *id, size_t idlen, struct interface_defn_t *ifd) return NULL; } -static char *parse(char *command, struct interface_defn_t *ifd) +static char *parse(const char *command, struct interface_defn_t *ifd) { char *result = NULL; @@ -294,7 +294,7 @@ static char *parse(char *command, struct interface_defn_t *ifd) } /* execute() returns 1 for success and 0 for failure */ -static int execute(char *command, struct interface_defn_t *ifd, execfn *exec) +static int execute(const char *command, struct interface_defn_t *ifd, execfn *exec) { char *out; int ret; @@ -449,43 +449,65 @@ static int static_down(struct interface_defn_t *ifd, execfn *exec) return ((result == 2) ? 2 : 0); } -static int dhcp_up(struct interface_defn_t *ifd, execfn *exec) +#ifndef CONFIG_APP_UDHCPC +struct dhcp_client_t { - if (execute("udhcpc -R -n -p /var/run/udhcpc.%iface%.pid -i %iface% " - "[[-H %hostname%]] [[-c %clientid%]] [[-s %script%]]", ifd, exec)) - return 1; - - /* 2006-09-30: The following are deprecated, and should eventually be - * removed. For non-busybox (i.e., other than udhcpc) clients, use - * 'iface foo inet manual' in /etc/network/interfaces, and supply - * start/stop commands explicitly via up/down. */ + const char *name; + const char *startcmd; + const char *stopcmd; +}; - if (execute("pump -i %iface% [[-h %hostname%]] [[-l %leasehours%]]", - ifd, exec)) return 1; - if (execute("dhclient -pf /var/run/dhclient.%iface%.pid %iface%", - ifd, exec)) return 1; - if (execute("dhcpcd [[-h %hostname%]] [[-i %vendor%]] [[-I %clientid%]] " - "[[-l %leasetime%]] %iface%", ifd, exec)) return 1; +static const struct dhcp_client_t ext_dhcp_clients[] = { + { "udhcpc", + "udhcpc -R -n -p /var/run/udhcpc.%iface%.pid -i %iface% [[-H %hostname%]] [[-c %clientid%]] [[-s %script%]]", + "kill -TERM `cat /var/run/udhcpc.%iface%.pid` 2>/dev/null", + }, + { "pump", + "pump -i %iface% [[-h %hostname%]] [[-l %leasehours%]]", + "pump -i %iface% -k", + }, + { "dhclient", + "dhclient -pf /var/run/dhclient.%iface%.pid %iface%", + "kill -9 `cat /var/run/dhclient.%iface%.pid` 2>/dev/null", + }, + { "dhcpcd", + "dhcpcd [[-h %hostname%]] [[-i %vendor%]] [[-I %clientid%]] [[-l %leasetime%]] %iface%", + "dhcpcd -k %iface%", + }, +}; +#endif +static int dhcp_up(struct interface_defn_t *ifd, execfn *exec) +{ +#ifdef CONFIG_APP_UDHCPC + return execute("udhcpc -R -n -p /var/run/udhcpc.%iface%.pid " + "-i %iface% [[-H %hostname%]] [[-c %clientid%]] [[-s %script%]]", + ifd, exec); +#else + int i, nclients = sizeof(ext_dhcp_clients) / sizeof(ext_dhcp_clients[0]); + for (i = 0; i < nclients; i++) { + if (exists_execable(ext_dhcp_clients[i].name)) + return execute(ext_dhcp_clients[i].startcmd, ifd, exec); + } + bb_error_msg("no dhcp clients found"); return 0; +#endif } static int dhcp_down(struct interface_defn_t *ifd, execfn *exec) { - if (execute("kill -TERM `cat /var/run/udhcpc.%iface%.pid` 2>/dev/null", - ifd, exec)) return 1; - - /* 2006-09-30: The following are deprecated, and should eventually be - * removed. For non-busybox (i.e., other than udhcpc) clients, use - * 'iface foo inet manual' in /etc/network/interfaces, and supply - * start/stop commands explicitly via up/down. */ - - if (execute("pump -i %iface% -k", ifd, exec)) return 1; - if (execute("kill -9 `cat /var/run/dhclient.%iface%.pid` 2>/dev/null", - ifd, exec)) return 1; - if (execute("dhcpcd -k %iface%", ifd, exec)) return 1; - +#ifdef CONFIG_APP_UDHCPC + return execute("kill -TERM " + "`cat /var/run/udhcpc.%iface%.pid` 2>/dev/null", ifd, exec); +#else + int i, nclients = sizeof(ext_dhcp_clients) / sizeof(ext_dhcp_clients[0]); + for (i = 0; i < nclients; i++) { + if (exists_execable(ext_dhcp_clients[i].name)) + return execute(ext_dhcp_clients[i].stopcmd, ifd, exec); + } + bb_error_msg("no dhcp clients found, using static interface shutdown"); return static_down(ifd, exec); +#endif } static int manual_up_down(struct interface_defn_t *ifd, execfn *exec) |