diff options
| author | Denis Vlasenko <vda.linux@googlemail.com> | 2006-10-11 22:16:56 +0000 |
|---|---|---|
| committer | Denis Vlasenko <vda.linux@googlemail.com> | 2006-10-11 22:16:56 +0000 |
| commit | f6f43df60bbd69ae5ea83b9012beb953a2baf116 (patch) | |
| tree | 80c51cd39201fcffaa9537c5abd1b10da3811ad0 | |
| parent | 8de82bf84f7311bd74b08d9f4b4d4a6fef4649b9 (diff) | |
| download | busybox-w32-f6f43df60bbd69ae5ea83b9012beb953a2baf116.tar.gz busybox-w32-f6f43df60bbd69ae5ea83b9012beb953a2baf116.tar.bz2 busybox-w32-f6f43df60bbd69ae5ea83b9012beb953a2baf116.zip | |
ifupdown: stop emitting annoying/misleading error messages.
Patch by Gabriel Somlo <somlo at cmu.edu>
| -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 583d94613..e83c752a1 100644 --- a/debianutils/which.c +++ b/debianutils/which.c | |||
| @@ -3,6 +3,7 @@ | |||
| 3 | * Which implementation for busybox | 3 | * Which implementation for busybox |
| 4 | * | 4 | * |
| 5 | * Copyright (C) 1999-2004 by Erik Andersen <andersen@codepoet.org> | 5 | * Copyright (C) 1999-2004 by Erik Andersen <andersen@codepoet.org> |
| 6 | * Copyright (C) 2006 Gabriel Somlo <somlo at cmu.edu> | ||
| 6 | * | 7 | * |
| 7 | * Licensed under the GPL v2 or later, see the file LICENSE in this tarball. | 8 | * Licensed under the GPL v2 or later, see the file LICENSE in this tarball. |
| 8 | * | 9 | * |
| @@ -10,74 +11,33 @@ | |||
| 10 | */ | 11 | */ |
| 11 | 12 | ||
| 12 | #include "busybox.h" | 13 | #include "busybox.h" |
| 13 | #include <string.h> | ||
| 14 | #include <stdio.h> | ||
| 15 | #include <stdlib.h> | ||
| 16 | #include <unistd.h> | ||
| 17 | #include <sys/stat.h> | ||
| 18 | |||
| 19 | |||
| 20 | static int is_executable_file(char *a, struct stat *b) | ||
| 21 | { | ||
| 22 | return (!access(a,X_OK) && !stat(a, b) && S_ISREG(b->st_mode)); | ||
| 23 | } | ||
| 24 | 14 | ||
| 25 | int which_main(int argc, char **argv) | 15 | int which_main(int argc, char **argv) |
| 26 | { | 16 | { |
| 27 | int status; | 17 | int status = EXIT_SUCCESS; |
| 28 | size_t i, count; | 18 | char *p; |
| 29 | char *path_list, *p; | ||
| 30 | 19 | ||
| 31 | if (argc <= 1 || argv[1][0] == '-') { | 20 | if (argc <= 1 || argv[1][0] == '-') { |
| 32 | bb_show_usage(); | 21 | bb_show_usage(); |
| 33 | } | 22 | } |
| 34 | argc--; | ||
| 35 | |||
| 36 | path_list = getenv("PATH"); | ||
| 37 | if (path_list != NULL) { | ||
| 38 | count = 1; | ||
| 39 | p = path_list; | ||
| 40 | while ((p = strchr(p, ':')) != NULL) { | ||
| 41 | *p++ = 0; | ||
| 42 | count++; | ||
| 43 | } | ||
| 44 | } else { | ||
| 45 | path_list = "/bin\0/sbin\0/usr/bin\0/usr/sbin\0/usr/local/bin"; | ||
| 46 | count = 5; | ||
| 47 | } | ||
| 48 | |||
| 49 | status = EXIT_SUCCESS; | ||
| 50 | while (argc-- > 0) { | ||
| 51 | struct stat stat_b; | ||
| 52 | char *buf; | ||
| 53 | 23 | ||
| 24 | while (--argc > 0) { | ||
| 54 | argv++; | 25 | argv++; |
| 55 | buf = argv[0]; | 26 | if (strchr(*argv, '/')) { |
| 56 | 27 | if (execable_file(*argv)) { | |
| 57 | /* If filename is either absolute or contains slashes, | 28 | puts(*argv); |
| 58 | * stat it */ | 29 | continue; |
| 59 | if (strchr(buf, '/')) { | ||
| 60 | if (is_executable_file(buf, &stat_b)) { | ||
| 61 | puts(buf); | ||
| 62 | goto next; | ||
| 63 | } | 30 | } |
| 64 | } else { | 31 | } else { |
| 65 | /* File doesn't contain slashes */ | 32 | p = find_execable(*argv); |
| 66 | p = path_list; | 33 | if (p) { |
| 67 | for (i = 0; i < count; i++) { | 34 | puts(p); |
| 68 | /* Empty component in PATH is treated as . */ | 35 | free(p); |
| 69 | buf = concat_path_file(p[0] ? p : ".", argv[0]); | 36 | continue; |
| 70 | if (is_executable_file(buf, &stat_b)) { | ||
| 71 | puts(buf); | ||
| 72 | free(buf); | ||
| 73 | goto next; | ||
| 74 | } | ||
| 75 | free(buf); | ||
| 76 | p += strlen(p) + 1; | ||
| 77 | } | 37 | } |
| 78 | } | 38 | } |
| 79 | status = EXIT_FAILURE; | 39 | status = EXIT_FAILURE; |
| 80 | next: /* nothing */; | ||
| 81 | } | 40 | } |
| 41 | |||
| 82 | bb_fflush_stdout_and_exit(status); | 42 | bb_fflush_stdout_and_exit(status); |
| 83 | } | 43 | } |
diff --git a/include/libbb.h b/include/libbb.h index 1d26b0367..ac48411c0 100644 --- a/include/libbb.h +++ b/include/libbb.h | |||
| @@ -430,6 +430,10 @@ char *last_char_is(const char *s, int c); | |||
| 430 | 430 | ||
| 431 | char *fgets_str(FILE *file, const char *terminating_string); | 431 | char *fgets_str(FILE *file, const char *terminating_string); |
| 432 | 432 | ||
| 433 | int execable_file(const char *name); | ||
| 434 | char *find_execable(const char *filename); | ||
| 435 | int exists_execable(const char *filename); | ||
| 436 | |||
| 433 | extern USE_DESKTOP(long long) int uncompress(int fd_in, int fd_out); | 437 | extern USE_DESKTOP(long long) int uncompress(int fd_in, int fd_out); |
| 434 | extern int inflate(int in, int out); | 438 | extern int inflate(int in, int out); |
| 435 | 439 | ||
diff --git a/libbb/Kbuild b/libbb/Kbuild index 4e992ef5b..27ed68c2c 100644 --- a/libbb/Kbuild +++ b/libbb/Kbuild | |||
| @@ -28,7 +28,7 @@ lib-y:= \ | |||
| 28 | getopt32.o default_error_retval.o wfopen_input.o speed_table.o \ | 28 | getopt32.o default_error_retval.o wfopen_input.o speed_table.o \ |
| 29 | perror_nomsg_and_die.o perror_nomsg.o skip_whitespace.o bb_askpass.o \ | 29 | perror_nomsg_and_die.o perror_nomsg.o skip_whitespace.o bb_askpass.o \ |
| 30 | warn_ignoring_args.o concat_subpath_file.o vfork_daemon_rexec.o \ | 30 | warn_ignoring_args.o concat_subpath_file.o vfork_daemon_rexec.o \ |
| 31 | bb_do_delay.o uuencode.o info_msg.o vinfo_msg.o | 31 | bb_do_delay.o uuencode.o info_msg.o vinfo_msg.o execable.o |
| 32 | 32 | ||
| 33 | # conditionally compiled objects: | 33 | # conditionally compiled objects: |
| 34 | lib-$(CONFIG_FEATURE_MOUNT_LOOP) += loop.o | 34 | lib-$(CONFIG_FEATURE_MOUNT_LOOP) += loop.o |
diff --git a/networking/ifupdown.c b/networking/ifupdown.c index f572b487d..c1dc1d35d 100644 --- a/networking/ifupdown.c +++ b/networking/ifupdown.c | |||
| @@ -133,7 +133,7 @@ static int count_netmask_bits(char *dotted_quad) | |||
| 133 | } | 133 | } |
| 134 | #endif | 134 | #endif |
| 135 | 135 | ||
| 136 | static void addstr(char **buf, size_t *len, size_t *pos, char *str, size_t str_length) | 136 | static void addstr(char **buf, size_t *len, size_t *pos, const char *str, size_t str_length) |
| 137 | { | 137 | { |
| 138 | if (*pos + str_length >= *len) { | 138 | if (*pos + str_length >= *len) { |
| 139 | char *newbuf; | 139 | char *newbuf; |
| @@ -150,7 +150,7 @@ static void addstr(char **buf, size_t *len, size_t *pos, char *str, size_t str_l | |||
| 150 | (*buf)[*pos] = '\0'; | 150 | (*buf)[*pos] = '\0'; |
| 151 | } | 151 | } |
| 152 | 152 | ||
| 153 | static int strncmpz(char *l, char *r, size_t llen) | 153 | static int strncmpz(const char *l, const char *r, size_t llen) |
| 154 | { | 154 | { |
| 155 | int i = strncmp(l, r, llen); | 155 | int i = strncmp(l, r, llen); |
| 156 | 156 | ||
| @@ -161,7 +161,7 @@ static int strncmpz(char *l, char *r, size_t llen) | |||
| 161 | } | 161 | } |
| 162 | } | 162 | } |
| 163 | 163 | ||
| 164 | static char *get_var(char *id, size_t idlen, struct interface_defn_t *ifd) | 164 | static char *get_var(const char *id, size_t idlen, struct interface_defn_t *ifd) |
| 165 | { | 165 | { |
| 166 | int i; | 166 | int i; |
| 167 | 167 | ||
| @@ -188,7 +188,7 @@ static char *get_var(char *id, size_t idlen, struct interface_defn_t *ifd) | |||
| 188 | return NULL; | 188 | return NULL; |
| 189 | } | 189 | } |
| 190 | 190 | ||
| 191 | static char *parse(char *command, struct interface_defn_t *ifd) | 191 | static char *parse(const char *command, struct interface_defn_t *ifd) |
| 192 | { | 192 | { |
| 193 | 193 | ||
| 194 | char *result = NULL; | 194 | char *result = NULL; |
| @@ -294,7 +294,7 @@ static char *parse(char *command, struct interface_defn_t *ifd) | |||
| 294 | } | 294 | } |
| 295 | 295 | ||
| 296 | /* execute() returns 1 for success and 0 for failure */ | 296 | /* execute() returns 1 for success and 0 for failure */ |
| 297 | static int execute(char *command, struct interface_defn_t *ifd, execfn *exec) | 297 | static int execute(const char *command, struct interface_defn_t *ifd, execfn *exec) |
| 298 | { | 298 | { |
| 299 | char *out; | 299 | char *out; |
| 300 | int ret; | 300 | int ret; |
| @@ -449,43 +449,65 @@ static int static_down(struct interface_defn_t *ifd, execfn *exec) | |||
| 449 | return ((result == 2) ? 2 : 0); | 449 | return ((result == 2) ? 2 : 0); |
| 450 | } | 450 | } |
| 451 | 451 | ||
| 452 | static int dhcp_up(struct interface_defn_t *ifd, execfn *exec) | 452 | #ifndef CONFIG_APP_UDHCPC |
| 453 | struct dhcp_client_t | ||
| 453 | { | 454 | { |
| 454 | if (execute("udhcpc -R -n -p /var/run/udhcpc.%iface%.pid -i %iface% " | 455 | const char *name; |
| 455 | "[[-H %hostname%]] [[-c %clientid%]] [[-s %script%]]", ifd, exec)) | 456 | const char *startcmd; |
| 456 | return 1; | 457 | const char *stopcmd; |
| 457 | 458 | }; | |
| 458 | /* 2006-09-30: The following are deprecated, and should eventually be | ||
| 459 | * removed. For non-busybox (i.e., other than udhcpc) clients, use | ||
| 460 | * 'iface foo inet manual' in /etc/network/interfaces, and supply | ||
| 461 | * start/stop commands explicitly via up/down. */ | ||
| 462 | 459 | ||
| 463 | if (execute("pump -i %iface% [[-h %hostname%]] [[-l %leasehours%]]", | 460 | static const struct dhcp_client_t ext_dhcp_clients[] = { |
| 464 | ifd, exec)) return 1; | 461 | { "udhcpc", |
| 465 | if (execute("dhclient -pf /var/run/dhclient.%iface%.pid %iface%", | 462 | "udhcpc -R -n -p /var/run/udhcpc.%iface%.pid -i %iface% [[-H %hostname%]] [[-c %clientid%]] [[-s %script%]]", |
| 466 | ifd, exec)) return 1; | 463 | "kill -TERM `cat /var/run/udhcpc.%iface%.pid` 2>/dev/null", |
| 467 | if (execute("dhcpcd [[-h %hostname%]] [[-i %vendor%]] [[-I %clientid%]] " | 464 | }, |
| 468 | "[[-l %leasetime%]] %iface%", ifd, exec)) return 1; | 465 | { "pump", |
| 466 | "pump -i %iface% [[-h %hostname%]] [[-l %leasehours%]]", | ||
| 467 | "pump -i %iface% -k", | ||
| 468 | }, | ||
| 469 | { "dhclient", | ||
| 470 | "dhclient -pf /var/run/dhclient.%iface%.pid %iface%", | ||
| 471 | "kill -9 `cat /var/run/dhclient.%iface%.pid` 2>/dev/null", | ||
| 472 | }, | ||
| 473 | { "dhcpcd", | ||
| 474 | "dhcpcd [[-h %hostname%]] [[-i %vendor%]] [[-I %clientid%]] [[-l %leasetime%]] %iface%", | ||
| 475 | "dhcpcd -k %iface%", | ||
| 476 | }, | ||
| 477 | }; | ||
| 478 | #endif | ||
| 469 | 479 | ||
| 480 | static int dhcp_up(struct interface_defn_t *ifd, execfn *exec) | ||
| 481 | { | ||
| 482 | #ifdef CONFIG_APP_UDHCPC | ||
| 483 | return execute("udhcpc -R -n -p /var/run/udhcpc.%iface%.pid " | ||
| 484 | "-i %iface% [[-H %hostname%]] [[-c %clientid%]] [[-s %script%]]", | ||
| 485 | ifd, exec); | ||
| 486 | #else | ||
| 487 | int i, nclients = sizeof(ext_dhcp_clients) / sizeof(ext_dhcp_clients[0]); | ||
| 488 | for (i = 0; i < nclients; i++) { | ||
| 489 | if (exists_execable(ext_dhcp_clients[i].name)) | ||
| 490 | return execute(ext_dhcp_clients[i].startcmd, ifd, exec); | ||
| 491 | } | ||
| 492 | bb_error_msg("no dhcp clients found"); | ||
| 470 | return 0; | 493 | return 0; |
| 494 | #endif | ||
| 471 | } | 495 | } |
| 472 | 496 | ||
| 473 | static int dhcp_down(struct interface_defn_t *ifd, execfn *exec) | 497 | static int dhcp_down(struct interface_defn_t *ifd, execfn *exec) |
| 474 | { | 498 | { |
| 475 | if (execute("kill -TERM `cat /var/run/udhcpc.%iface%.pid` 2>/dev/null", | 499 | #ifdef CONFIG_APP_UDHCPC |
| 476 | ifd, exec)) return 1; | 500 | return execute("kill -TERM " |
| 477 | 501 | "`cat /var/run/udhcpc.%iface%.pid` 2>/dev/null", ifd, exec); | |
| 478 | /* 2006-09-30: The following are deprecated, and should eventually be | 502 | #else |
| 479 | * removed. For non-busybox (i.e., other than udhcpc) clients, use | 503 | int i, nclients = sizeof(ext_dhcp_clients) / sizeof(ext_dhcp_clients[0]); |
| 480 | * 'iface foo inet manual' in /etc/network/interfaces, and supply | 504 | for (i = 0; i < nclients; i++) { |
| 481 | * start/stop commands explicitly via up/down. */ | 505 | if (exists_execable(ext_dhcp_clients[i].name)) |
| 482 | 506 | return execute(ext_dhcp_clients[i].stopcmd, ifd, exec); | |
| 483 | if (execute("pump -i %iface% -k", ifd, exec)) return 1; | 507 | } |
| 484 | if (execute("kill -9 `cat /var/run/dhclient.%iface%.pid` 2>/dev/null", | 508 | bb_error_msg("no dhcp clients found, using static interface shutdown"); |
| 485 | ifd, exec)) return 1; | ||
| 486 | if (execute("dhcpcd -k %iface%", ifd, exec)) return 1; | ||
| 487 | |||
| 488 | return static_down(ifd, exec); | 509 | return static_down(ifd, exec); |
| 510 | #endif | ||
| 489 | } | 511 | } |
| 490 | 512 | ||
| 491 | static int manual_up_down(struct interface_defn_t *ifd, execfn *exec) | 513 | static int manual_up_down(struct interface_defn_t *ifd, execfn *exec) |
