diff options
| author | Denis Vlasenko <vda.linux@googlemail.com> | 2008-03-17 09:09:09 +0000 |
|---|---|---|
| committer | Denis Vlasenko <vda.linux@googlemail.com> | 2008-03-17 09:09:09 +0000 |
| commit | 1d42665b6b0571b9fa5d3b10fbf2dd03382f0ba2 (patch) | |
| tree | 7ec8969fc2b07a2b7dc37f96435e5eddf7daf7fd | |
| parent | 62a90cdd7435f09f4bb8673e8b7b213067f9d5cc (diff) | |
| download | busybox-w32-1d42665b6b0571b9fa5d3b10fbf2dd03382f0ba2.tar.gz busybox-w32-1d42665b6b0571b9fa5d3b10fbf2dd03382f0ba2.tar.bz2 busybox-w32-1d42665b6b0571b9fa5d3b10fbf2dd03382f0ba2.zip | |
*: shrink: use Vladimir's "o+" specifier instead of xatou(opt_param)
function old new delta
getopt32 1370 1385 +15
sulogin_main 490 494 +4
realpath_main 84 86 +2
sleep_main 76 77 +1
mt_main 256 257 +1
printenv_main 75 74 -1
fdformat_main 546 545 -1
usleep_main 44 42 -2
setlogcons_main 77 75 -2
ed_main 2654 2649 -5
deallocvt_main 69 64 -5
addgroup_main 373 368 -5
mkfs_minix_main 2989 2982 -7
tail_main 1221 1213 -8
sv_main 1254 1241 -13
du_main 348 328 -20
tftp_main 325 302 -23
split_main 581 558 -23
nc_main 1000 977 -23
diff_main 891 868 -23
arping_main 1797 1770 -27
ls_main 893 847 -46
od_main 2797 2750 -47
readprofile_main 1944 1895 -49
tcpudpsvd_main 1973 1922 -51
udhcpc_main 2590 2513 -77
grep_main 824 722 -102
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 5/22 up/down: 23/-560) Total: -537 bytes
text data bss dec hex filename
796973 658 7428 805059 c48c3 busybox_old
796479 662 7420 804561 c46d1 busybox_unstripped
34 files changed, 172 insertions, 209 deletions
diff --git a/console-tools/deallocvt.c b/console-tools/deallocvt.c index 117224560..1200cae1d 100644 --- a/console-tools/deallocvt.c +++ b/console-tools/deallocvt.c | |||
| @@ -16,19 +16,15 @@ | |||
| 16 | enum { VT_DISALLOCATE = 0x5608 }; /* free memory associated to vt */ | 16 | enum { VT_DISALLOCATE = 0x5608 }; /* free memory associated to vt */ |
| 17 | 17 | ||
| 18 | int deallocvt_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; | 18 | int deallocvt_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; |
| 19 | int deallocvt_main(int argc, char **argv) | 19 | int deallocvt_main(int argc ATTRIBUTE_UNUSED, char **argv) |
| 20 | { | 20 | { |
| 21 | /* num = 0 deallocate all unused consoles */ | 21 | /* num = 0 deallocate all unused consoles */ |
| 22 | int num = 0; | 22 | int num = 0; |
| 23 | 23 | ||
| 24 | switch (argc) { | 24 | if (argv[1]) { |
| 25 | case 2: | 25 | if (argv[2]) |
| 26 | bb_show_usage(); | ||
| 26 | num = xatou_range(argv[1], 1, 63); | 27 | num = xatou_range(argv[1], 1, 63); |
| 27 | /* Fallthrough */ | ||
| 28 | case 1: | ||
| 29 | break; | ||
| 30 | default: | ||
| 31 | bb_show_usage(); | ||
| 32 | } | 28 | } |
| 33 | 29 | ||
| 34 | /* double cast suppresses "cast to ptr from int of different size" */ | 30 | /* double cast suppresses "cast to ptr from int of different size" */ |
diff --git a/console-tools/openvt.c b/console-tools/openvt.c index ff169530d..39b985995 100644 --- a/console-tools/openvt.c +++ b/console-tools/openvt.c | |||
| @@ -27,9 +27,10 @@ int openvt_main(int argc, char **argv) | |||
| 27 | /* grab new one */ | 27 | /* grab new one */ |
| 28 | close(0); | 28 | close(0); |
| 29 | xopen(vtname, O_RDWR); | 29 | xopen(vtname, O_RDWR); |
| 30 | dup2(0, STDOUT_FILENO); | 30 | xdup2(0, STDOUT_FILENO); |
| 31 | dup2(0, STDERR_FILENO); | 31 | xdup2(0, STDERR_FILENO); |
| 32 | 32 | ||
| 33 | BB_EXECVP(argv[2], &argv[2]); | 33 | argv += 2; |
| 34 | BB_EXECVP(argv[0], argv); | ||
| 34 | _exit(1); | 35 | _exit(1); |
| 35 | } | 36 | } |
diff --git a/console-tools/setkeycodes.c b/console-tools/setkeycodes.c index ba3d2e44e..e9a050862 100644 --- a/console-tools/setkeycodes.c +++ b/console-tools/setkeycodes.c | |||
| @@ -14,7 +14,7 @@ | |||
| 14 | 14 | ||
| 15 | /* From <linux/kd.h> */ | 15 | /* From <linux/kd.h> */ |
| 16 | struct kbkeycode { | 16 | struct kbkeycode { |
| 17 | unsigned int scancode, keycode; | 17 | unsigned scancode, keycode; |
| 18 | }; | 18 | }; |
| 19 | enum { | 19 | enum { |
| 20 | KDSETKEYCODE = 0x4B4D /* write kernel keycode table entry */ | 20 | KDSETKEYCODE = 0x4B4D /* write kernel keycode table entry */ |
| @@ -33,7 +33,7 @@ int setkeycodes_main(int argc, char **argv) | |||
| 33 | fd = get_console_fd(); | 33 | fd = get_console_fd(); |
| 34 | 34 | ||
| 35 | while (argc > 2) { | 35 | while (argc > 2) { |
| 36 | a.keycode = xatoul_range(argv[2], 0, 127); | 36 | a.keycode = xatou_range(argv[2], 0, 127); |
| 37 | a.scancode = sc = xstrtoul_range(argv[1], 16, 0, 255); | 37 | a.scancode = sc = xstrtoul_range(argv[1], 16, 0, 255); |
| 38 | if (a.scancode > 127) { | 38 | if (a.scancode > 127) { |
| 39 | a.scancode -= 0xe000; | 39 | a.scancode -= 0xe000; |
diff --git a/console-tools/setlogcons.c b/console-tools/setlogcons.c index 0f6491c72..b312fa76e 100644 --- a/console-tools/setlogcons.c +++ b/console-tools/setlogcons.c | |||
| @@ -12,7 +12,7 @@ | |||
| 12 | #include "libbb.h" | 12 | #include "libbb.h" |
| 13 | 13 | ||
| 14 | int setlogcons_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; | 14 | int setlogcons_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; |
| 15 | int setlogcons_main(int argc, char **argv) | 15 | int setlogcons_main(int argc ATTRIBUTE_UNUSED, char **argv) |
| 16 | { | 16 | { |
| 17 | struct { | 17 | struct { |
| 18 | char fn; | 18 | char fn; |
| @@ -22,8 +22,8 @@ int setlogcons_main(int argc, char **argv) | |||
| 22 | arg.fn = 11; /* redirect kernel messages */ | 22 | arg.fn = 11; /* redirect kernel messages */ |
| 23 | arg.subarg = 0; /* to specified console (current as default) */ | 23 | arg.subarg = 0; /* to specified console (current as default) */ |
| 24 | 24 | ||
| 25 | if (argc == 2) | 25 | if (argv[1]) |
| 26 | arg.subarg = xatoul_range(argv[1], 0, 63); | 26 | arg.subarg = xatou_range(argv[1], 0, 63); |
| 27 | 27 | ||
| 28 | xioctl(xopen(VC_1, O_RDONLY), TIOCLINUX, &arg); | 28 | xioctl(xopen(VC_1, O_RDONLY), TIOCLINUX, &arg); |
| 29 | 29 | ||
diff --git a/coreutils/du.c b/coreutils/du.c index 7495f7a7b..b469824ea 100644 --- a/coreutils/du.c +++ b/coreutils/du.c | |||
| @@ -146,7 +146,6 @@ int du_main(int argc ATTRIBUTE_UNUSED, char **argv) | |||
| 146 | unsigned long total; | 146 | unsigned long total; |
| 147 | int slink_depth_save; | 147 | int slink_depth_save; |
| 148 | bool print_final_total; | 148 | bool print_final_total; |
| 149 | char *smax_print_depth; | ||
| 150 | unsigned opt; | 149 | unsigned opt; |
| 151 | 150 | ||
| 152 | #if ENABLE_FEATURE_HUMAN_READABLE | 151 | #if ENABLE_FEATURE_HUMAN_READABLE |
| @@ -168,8 +167,8 @@ int du_main(int argc ATTRIBUTE_UNUSED, char **argv) | |||
| 168 | * ignore -a. This is consistent with -s being equivalent to -d 0. | 167 | * ignore -a. This is consistent with -s being equivalent to -d 0. |
| 169 | */ | 168 | */ |
| 170 | #if ENABLE_FEATURE_HUMAN_READABLE | 169 | #if ENABLE_FEATURE_HUMAN_READABLE |
| 171 | opt_complementary = "h-km:k-hm:m-hk:H-L:L-H:s-d:d-s"; | 170 | opt_complementary = "h-km:k-hm:m-hk:H-L:L-H:s-d:d-s:d+"; |
| 172 | opt = getopt32(argv, "aHkLsx" "d:" "lc" "hm", &smax_print_depth); | 171 | opt = getopt32(argv, "aHkLsx" "d:" "lc" "hm", &G.max_print_depth); |
| 173 | argv += optind; | 172 | argv += optind; |
| 174 | if (opt & (1 << 9)) { | 173 | if (opt & (1 << 9)) { |
| 175 | /* -h opt */ | 174 | /* -h opt */ |
| @@ -184,8 +183,8 @@ int du_main(int argc ATTRIBUTE_UNUSED, char **argv) | |||
| 184 | G.disp_hr = 1024; | 183 | G.disp_hr = 1024; |
| 185 | } | 184 | } |
| 186 | #else | 185 | #else |
| 187 | opt_complementary = "H-L:L-H:s-d:d-s"; | 186 | opt_complementary = "H-L:L-H:s-d:d-s:d+"; |
| 188 | opt = getopt32(argv, "aHkLsx" "d:" "lc", &smax_print_depth); | 187 | opt = getopt32(argv, "aHkLsx" "d:" "lc", &G.max_print_depth); |
| 189 | argv += optind; | 188 | argv += optind; |
| 190 | #if !ENABLE_FEATURE_DU_DEFAULT_BLOCKSIZE_1K | 189 | #if !ENABLE_FEATURE_DU_DEFAULT_BLOCKSIZE_1K |
| 191 | if (opt & (1 << 2)) { | 190 | if (opt & (1 << 2)) { |
| @@ -211,10 +210,6 @@ int du_main(int argc ATTRIBUTE_UNUSED, char **argv) | |||
| 211 | G.max_print_depth = 0; | 210 | G.max_print_depth = 0; |
| 212 | } | 211 | } |
| 213 | G.one_file_system = opt & (1 << 5); /* -x opt */ | 212 | G.one_file_system = opt & (1 << 5); /* -x opt */ |
| 214 | if (opt & (1 << 6)) { | ||
| 215 | /* -d opt */ | ||
| 216 | G.max_print_depth = xatoi_u(smax_print_depth); | ||
| 217 | } | ||
| 218 | if (opt & (1 << 7)) { | 213 | if (opt & (1 << 7)) { |
| 219 | /* -l opt */ | 214 | /* -l opt */ |
| 220 | G.count_hardlinks = MAXINT(nlink_t); | 215 | G.count_hardlinks = MAXINT(nlink_t); |
diff --git a/coreutils/ls.c b/coreutils/ls.c index dbf1c5ba6..9e5c6dee9 100644 --- a/coreutils/ls.c +++ b/coreutils/ls.c | |||
| @@ -799,8 +799,6 @@ int ls_main(int argc, char **argv) | |||
| 799 | int ac; | 799 | int ac; |
| 800 | int i; | 800 | int i; |
| 801 | char **av; | 801 | char **av; |
| 802 | USE_FEATURE_AUTOWIDTH(char *tabstops_str = NULL;) | ||
| 803 | USE_FEATURE_AUTOWIDTH(char *terminal_width_str = NULL;) | ||
| 804 | USE_FEATURE_LS_COLOR(char *color_opt;) | 802 | USE_FEATURE_LS_COLOR(char *color_opt;) |
| 805 | 803 | ||
| 806 | #if ENABLE_FEATURE_LS_TIMESTAMPS | 804 | #if ENABLE_FEATURE_LS_TIMESTAMPS |
| @@ -820,12 +818,9 @@ int ls_main(int argc, char **argv) | |||
| 820 | /* process options */ | 818 | /* process options */ |
| 821 | USE_FEATURE_LS_COLOR(applet_long_options = ls_color_opt;) | 819 | USE_FEATURE_LS_COLOR(applet_long_options = ls_color_opt;) |
| 822 | #if ENABLE_FEATURE_AUTOWIDTH | 820 | #if ENABLE_FEATURE_AUTOWIDTH |
| 823 | opt = getopt32(argv, ls_options, &tabstops_str, &terminal_width_str | 821 | opt_complementary = "T+:w+"; /* -T N, -w N */ |
| 822 | opt = getopt32(argv, ls_options, &tabstops, &terminal_width | ||
| 824 | USE_FEATURE_LS_COLOR(, &color_opt)); | 823 | USE_FEATURE_LS_COLOR(, &color_opt)); |
| 825 | if (tabstops_str) | ||
| 826 | tabstops = xatou(tabstops_str); | ||
| 827 | if (terminal_width_str) | ||
| 828 | terminal_width = xatou(terminal_width_str); | ||
| 829 | #else | 824 | #else |
| 830 | opt = getopt32(argv, ls_options USE_FEATURE_LS_COLOR(, &color_opt)); | 825 | opt = getopt32(argv, ls_options USE_FEATURE_LS_COLOR(, &color_opt)); |
| 831 | #endif | 826 | #endif |
diff --git a/coreutils/od_bloaty.c b/coreutils/od_bloaty.c index a083114c9..4526f0ede 100644 --- a/coreutils/od_bloaty.c +++ b/coreutils/od_bloaty.c | |||
| @@ -188,7 +188,7 @@ static off_t pseudo_offset; | |||
| 188 | a multiple of the least common multiple of the sizes associated with | 188 | a multiple of the least common multiple of the sizes associated with |
| 189 | the specified output types. It should be as large as possible, but | 189 | the specified output types. It should be as large as possible, but |
| 190 | no larger than 16 -- unless specified with the -w option. */ | 190 | no larger than 16 -- unless specified with the -w option. */ |
| 191 | static size_t bytes_per_block; | 191 | static unsigned bytes_per_block = 32; /* have to use unsigned, not size_t */ |
| 192 | 192 | ||
| 193 | /* A NULL-terminated list of the file-arguments from the command line. */ | 193 | /* A NULL-terminated list of the file-arguments from the command line. */ |
| 194 | static const char *const *file_list; | 194 | static const char *const *file_list; |
| @@ -1218,7 +1218,6 @@ int od_main(int argc, char **argv) | |||
| 1218 | ; | 1218 | ; |
| 1219 | #endif | 1219 | #endif |
| 1220 | char *str_A, *str_N, *str_j, *str_S; | 1220 | char *str_A, *str_N, *str_j, *str_S; |
| 1221 | char *str_w = NULL; | ||
| 1222 | llist_t *lst_t = NULL; | 1221 | llist_t *lst_t = NULL; |
| 1223 | unsigned opt; | 1222 | unsigned opt; |
| 1224 | int l_c_m; | 1223 | int l_c_m; |
| @@ -1239,7 +1238,7 @@ int od_main(int argc, char **argv) | |||
| 1239 | /* flag_dump_strings = 0; - already is */ | 1238 | /* flag_dump_strings = 0; - already is */ |
| 1240 | 1239 | ||
| 1241 | /* Parse command line */ | 1240 | /* Parse command line */ |
| 1242 | opt_complementary = "t::"; // list | 1241 | opt_complementary = "w+:t::"; /* -w N, -t is a list */ |
| 1243 | #if ENABLE_GETOPT_LONG | 1242 | #if ENABLE_GETOPT_LONG |
| 1244 | applet_long_options = od_longopts; | 1243 | applet_long_options = od_longopts; |
| 1245 | #endif | 1244 | #endif |
| @@ -1248,7 +1247,7 @@ int od_main(int argc, char **argv) | |||
| 1248 | // -S was -s and also had optional parameter | 1247 | // -S was -s and also had optional parameter |
| 1249 | // but in coreutils 6.3 it was renamed and now has | 1248 | // but in coreutils 6.3 it was renamed and now has |
| 1250 | // _mandatory_ parameter | 1249 | // _mandatory_ parameter |
| 1251 | &str_A, &str_N, &str_j, &lst_t, &str_S, &str_w); | 1250 | &str_A, &str_N, &str_j, &lst_t, &str_S, &bytes_per_block); |
| 1252 | argc -= optind; | 1251 | argc -= optind; |
| 1253 | argv += optind; | 1252 | argv += optind; |
| 1254 | if (opt & OPT_A) { | 1253 | if (opt & OPT_A) { |
| @@ -1404,9 +1403,6 @@ int od_main(int argc, char **argv) | |||
| 1404 | l_c_m = get_lcm(); | 1403 | l_c_m = get_lcm(); |
| 1405 | 1404 | ||
| 1406 | if (opt & OPT_w) { /* -w: width */ | 1405 | if (opt & OPT_w) { /* -w: width */ |
| 1407 | bytes_per_block = 32; | ||
| 1408 | if (str_w) | ||
| 1409 | bytes_per_block = xatou(str_w); | ||
| 1410 | if (!bytes_per_block || bytes_per_block % l_c_m != 0) { | 1406 | if (!bytes_per_block || bytes_per_block % l_c_m != 0) { |
| 1411 | bb_error_msg("warning: invalid width %u; using %d instead", | 1407 | bb_error_msg("warning: invalid width %u; using %d instead", |
| 1412 | (unsigned)bytes_per_block, l_c_m); | 1408 | (unsigned)bytes_per_block, l_c_m); |
diff --git a/coreutils/printenv.c b/coreutils/printenv.c index 06d68d0ef..31d76d712 100644 --- a/coreutils/printenv.c +++ b/coreutils/printenv.c | |||
| @@ -11,10 +11,10 @@ | |||
| 11 | #include "libbb.h" | 11 | #include "libbb.h" |
| 12 | 12 | ||
| 13 | int printenv_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; | 13 | int printenv_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; |
| 14 | int printenv_main(int argc, char **argv) | 14 | int printenv_main(int argc ATTRIBUTE_UNUSED, char **argv) |
| 15 | { | 15 | { |
| 16 | /* no variables specified, show whole env */ | 16 | /* no variables specified, show whole env */ |
| 17 | if (argc == 1) { | 17 | if (!argv[1]) { |
| 18 | int e = 0; | 18 | int e = 0; |
| 19 | while (environ[e]) | 19 | while (environ[e]) |
| 20 | puts(environ[e++]); | 20 | puts(environ[e++]); |
diff --git a/coreutils/realpath.c b/coreutils/realpath.c index bcb73a8dc..6766524a7 100644 --- a/coreutils/realpath.c +++ b/coreutils/realpath.c | |||
| @@ -13,7 +13,7 @@ | |||
| 13 | #include "libbb.h" | 13 | #include "libbb.h" |
| 14 | 14 | ||
| 15 | int realpath_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; | 15 | int realpath_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; |
| 16 | int realpath_main(int argc, char **argv) | 16 | int realpath_main(int argc ATTRIBUTE_UNUSED, char **argv) |
| 17 | { | 17 | { |
| 18 | int retval = EXIT_SUCCESS; | 18 | int retval = EXIT_SUCCESS; |
| 19 | 19 | ||
| @@ -25,19 +25,18 @@ int realpath_main(int argc, char **argv) | |||
| 25 | # define resolved_path_MUST_FREE 0 | 25 | # define resolved_path_MUST_FREE 0 |
| 26 | #endif | 26 | #endif |
| 27 | 27 | ||
| 28 | if (--argc == 0) { | 28 | if (!*++argv) { |
| 29 | bb_show_usage(); | 29 | bb_show_usage(); |
| 30 | } | 30 | } |
| 31 | 31 | ||
| 32 | do { | 32 | do { |
| 33 | argv++; | ||
| 34 | if (realpath(*argv, resolved_path) != NULL) { | 33 | if (realpath(*argv, resolved_path) != NULL) { |
| 35 | puts(resolved_path); | 34 | puts(resolved_path); |
| 36 | } else { | 35 | } else { |
| 37 | retval = EXIT_FAILURE; | 36 | retval = EXIT_FAILURE; |
| 38 | bb_simple_perror_msg(*argv); | 37 | bb_simple_perror_msg(*argv); |
| 39 | } | 38 | } |
| 40 | } while (--argc); | 39 | } while (*++argv); |
| 41 | 40 | ||
| 42 | #if ENABLE_FEATURE_CLEAN_UP && resolved_path_MUST_FREE | 41 | #if ENABLE_FEATURE_CLEAN_UP && resolved_path_MUST_FREE |
| 43 | RELEASE_CONFIG_BUFFER(resolved_path); | 42 | RELEASE_CONFIG_BUFFER(resolved_path); |
diff --git a/coreutils/sleep.c b/coreutils/sleep.c index 6890e35c1..78f9a8ebf 100644 --- a/coreutils/sleep.c +++ b/coreutils/sleep.c | |||
| @@ -34,17 +34,16 @@ static const struct suffix_mult sfx[] = { | |||
| 34 | #endif | 34 | #endif |
| 35 | 35 | ||
| 36 | int sleep_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; | 36 | int sleep_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; |
| 37 | int sleep_main(int argc, char **argv) | 37 | int sleep_main(int argc ATTRIBUTE_UNUSED, char **argv) |
| 38 | { | 38 | { |
| 39 | unsigned duration; | 39 | unsigned duration; |
| 40 | 40 | ||
| 41 | #if ENABLE_FEATURE_FANCY_SLEEP | 41 | ++argv; |
| 42 | 42 | if (!*argv) | |
| 43 | if (argc < 2) { | ||
| 44 | bb_show_usage(); | 43 | bb_show_usage(); |
| 45 | } | ||
| 46 | 44 | ||
| 47 | ++argv; | 45 | #if ENABLE_FEATURE_FANCY_SLEEP |
| 46 | |||
| 48 | duration = 0; | 47 | duration = 0; |
| 49 | do { | 48 | do { |
| 50 | duration += xatoul_range_sfx(*argv, 0, UINT_MAX-duration, sfx); | 49 | duration += xatoul_range_sfx(*argv, 0, UINT_MAX-duration, sfx); |
| @@ -52,11 +51,7 @@ int sleep_main(int argc, char **argv) | |||
| 52 | 51 | ||
| 53 | #else /* FEATURE_FANCY_SLEEP */ | 52 | #else /* FEATURE_FANCY_SLEEP */ |
| 54 | 53 | ||
| 55 | if (argc != 2) { | 54 | duration = xatou(*argv); |
| 56 | bb_show_usage(); | ||
| 57 | } | ||
| 58 | |||
| 59 | duration = xatou(argv[1]); | ||
| 60 | 55 | ||
| 61 | #endif /* FEATURE_FANCY_SLEEP */ | 56 | #endif /* FEATURE_FANCY_SLEEP */ |
| 62 | 57 | ||
diff --git a/coreutils/split.c b/coreutils/split.c index cf26a9322..2306789f0 100644 --- a/coreutils/split.c +++ b/coreutils/split.c | |||
| @@ -68,15 +68,13 @@ int split_main(int argc ATTRIBUTE_UNUSED, char **argv) | |||
| 68 | ssize_t bytes_read, to_write; | 68 | ssize_t bytes_read, to_write; |
| 69 | char *src; | 69 | char *src; |
| 70 | 70 | ||
| 71 | opt_complementary = "?2"; | 71 | opt_complementary = "?2:a+"; /* max 2 args; -a N */ |
| 72 | opt = getopt32(argv, "l:b:a:", &count_p, &count_p, &sfx); | 72 | opt = getopt32(argv, "l:b:a:", &count_p, &count_p, &suffix_len); |
| 73 | 73 | ||
| 74 | if (opt & SPLIT_OPT_l) | 74 | if (opt & SPLIT_OPT_l) |
| 75 | cnt = xatoul(count_p); | 75 | cnt = XATOOFF(count_p); |
| 76 | if (opt & SPLIT_OPT_b) | 76 | if (opt & SPLIT_OPT_b) // FIXME: also needs XATOOFF |
| 77 | cnt = xatoul_sfx(count_p, split_suffices); | 77 | cnt = xatoull_sfx(count_p, split_suffices); |
| 78 | if (opt & SPLIT_OPT_a) | ||
| 79 | suffix_len = xatou(sfx); | ||
| 80 | sfx = "x"; | 78 | sfx = "x"; |
| 81 | 79 | ||
| 82 | argv += optind; | 80 | argv += optind; |
diff --git a/coreutils/tail.c b/coreutils/tail.c index 52aa8f69e..35b25a416 100644 --- a/coreutils/tail.c +++ b/coreutils/tail.c | |||
| @@ -87,7 +87,6 @@ int tail_main(int argc, char **argv) | |||
| 87 | bool from_top; | 87 | bool from_top; |
| 88 | int header_threshhold = 1; | 88 | int header_threshhold = 1; |
| 89 | const char *str_c, *str_n; | 89 | const char *str_c, *str_n; |
| 90 | USE_FEATURE_FANCY_TAIL(const char *str_s;) | ||
| 91 | 90 | ||
| 92 | char *tailbuf; | 91 | char *tailbuf; |
| 93 | size_t tailbufsize; | 92 | size_t tailbufsize; |
| @@ -110,8 +109,9 @@ int tail_main(int argc, char **argv) | |||
| 110 | } | 109 | } |
| 111 | #endif | 110 | #endif |
| 112 | 111 | ||
| 112 | USE_FEATURE_FANCY_TAIL(opt_complementary = "s+";) /* -s N */ | ||
| 113 | opt = getopt32(argv, "fc:n:" USE_FEATURE_FANCY_TAIL("qs:v"), | 113 | opt = getopt32(argv, "fc:n:" USE_FEATURE_FANCY_TAIL("qs:v"), |
| 114 | &str_c, &str_n USE_FEATURE_FANCY_TAIL(,&str_s)); | 114 | &str_c, &str_n USE_FEATURE_FANCY_TAIL(,&sleep_period)); |
| 115 | #define FOLLOW (opt & 0x1) | 115 | #define FOLLOW (opt & 0x1) |
| 116 | #define COUNT_BYTES (opt & 0x2) | 116 | #define COUNT_BYTES (opt & 0x2) |
| 117 | //if (opt & 0x1) // -f | 117 | //if (opt & 0x1) // -f |
| @@ -119,7 +119,6 @@ int tail_main(int argc, char **argv) | |||
| 119 | if (opt & 0x4) count = eat_num(str_n); // -n | 119 | if (opt & 0x4) count = eat_num(str_n); // -n |
| 120 | #if ENABLE_FEATURE_FANCY_TAIL | 120 | #if ENABLE_FEATURE_FANCY_TAIL |
| 121 | if (opt & 0x8) header_threshhold = INT_MAX; // -q | 121 | if (opt & 0x8) header_threshhold = INT_MAX; // -q |
| 122 | if (opt & 0x10) sleep_period = xatou(str_s); // -s | ||
| 123 | if (opt & 0x20) header_threshhold = 0; // -v | 122 | if (opt & 0x20) header_threshhold = 0; // -v |
| 124 | #endif | 123 | #endif |
| 125 | argc -= optind; | 124 | argc -= optind; |
diff --git a/coreutils/usleep.c b/coreutils/usleep.c index 1c9022325..d34880d3a 100644 --- a/coreutils/usleep.c +++ b/coreutils/usleep.c | |||
| @@ -14,9 +14,9 @@ | |||
| 14 | /* This is a NOFORK applet. Be very careful! */ | 14 | /* This is a NOFORK applet. Be very careful! */ |
| 15 | 15 | ||
| 16 | int usleep_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; | 16 | int usleep_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; |
| 17 | int usleep_main(int argc, char **argv) | 17 | int usleep_main(int argc ATTRIBUTE_UNUSED, char **argv) |
| 18 | { | 18 | { |
| 19 | if (argc != 2) { | 19 | if (!argv[1]) { |
| 20 | bb_show_usage(); | 20 | bb_show_usage(); |
| 21 | } | 21 | } |
| 22 | 22 | ||
diff --git a/editors/diff.c b/editors/diff.c index f9e82ba02..486077847 100644 --- a/editors/diff.c +++ b/editors/diff.c | |||
| @@ -1208,17 +1208,16 @@ int diff_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; | |||
| 1208 | int diff_main(int argc ATTRIBUTE_UNUSED, char **argv) | 1208 | int diff_main(int argc ATTRIBUTE_UNUSED, char **argv) |
| 1209 | { | 1209 | { |
| 1210 | bool gotstdin = 0; | 1210 | bool gotstdin = 0; |
| 1211 | char *U_opt; | ||
| 1212 | char *f1, *f2; | 1211 | char *f1, *f2; |
| 1213 | llist_t *L_arg = NULL; | 1212 | llist_t *L_arg = NULL; |
| 1214 | 1213 | ||
| 1215 | INIT_G(); | 1214 | INIT_G(); |
| 1216 | 1215 | ||
| 1217 | /* exactly 2 params; collect multiple -L <label> */ | 1216 | /* exactly 2 params; collect multiple -L <label>; -U N */ |
| 1218 | opt_complementary = "=2:L::"; | 1217 | opt_complementary = "=2:L::U+"; |
| 1219 | getopt32(argv, "abdiL:NqrsS:tTU:wu" | 1218 | getopt32(argv, "abdiL:NqrsS:tTU:wu" |
| 1220 | "p" /* ignored (for compatibility) */, | 1219 | "p" /* ignored (for compatibility) */, |
| 1221 | &L_arg, &start, &U_opt); | 1220 | &L_arg, &start, &context); |
| 1222 | /*argc -= optind;*/ | 1221 | /*argc -= optind;*/ |
| 1223 | argv += optind; | 1222 | argv += optind; |
| 1224 | while (L_arg) { | 1223 | while (L_arg) { |
| @@ -1233,8 +1232,6 @@ int diff_main(int argc ATTRIBUTE_UNUSED, char **argv) | |||
| 1233 | /* we leak L_arg here... */ | 1232 | /* we leak L_arg here... */ |
| 1234 | L_arg = L_arg->link; | 1233 | L_arg = L_arg->link; |
| 1235 | } | 1234 | } |
| 1236 | if (option_mask32 & FLAG_U) | ||
| 1237 | context = xatoi_u(U_opt); | ||
| 1238 | 1235 | ||
| 1239 | /* | 1236 | /* |
| 1240 | * Do sanity checks, fill in stb1 and stb2 and call the appropriate | 1237 | * Do sanity checks, fill in stb1 and stb2 and call the appropriate |
diff --git a/editors/ed.c b/editors/ed.c index 15f0147be..9606cfdde 100644 --- a/editors/ed.c +++ b/editors/ed.c | |||
| @@ -89,7 +89,7 @@ static char *skip_blank(const char *cp) | |||
| 89 | 89 | ||
| 90 | 90 | ||
| 91 | int ed_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; | 91 | int ed_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; |
| 92 | int ed_main(int argc, char **argv) | 92 | int ed_main(int argc ATTRIBUTE_UNUSED, char **argv) |
| 93 | { | 93 | { |
| 94 | INIT_G(); | 94 | INIT_G(); |
| 95 | 95 | ||
| @@ -99,7 +99,7 @@ int ed_main(int argc, char **argv) | |||
| 99 | lines.next = &lines; | 99 | lines.next = &lines; |
| 100 | lines.prev = &lines; | 100 | lines.prev = &lines; |
| 101 | 101 | ||
| 102 | if (argc > 1) { | 102 | if (argv[1]) { |
| 103 | fileName = xstrdup(argv[1]); | 103 | fileName = xstrdup(argv[1]); |
| 104 | if (!readLines(fileName, 1)) { | 104 | if (!readLines(fileName, 1)) { |
| 105 | return EXIT_SUCCESS; | 105 | return EXIT_SUCCESS; |
diff --git a/findutils/grep.c b/findutils/grep.c index c4cfcb852..259026ee5 100644 --- a/findutils/grep.c +++ b/findutils/grep.c | |||
| @@ -7,7 +7,7 @@ | |||
| 7 | * | 7 | * |
| 8 | * 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. |
| 9 | */ | 9 | */ |
| 10 | /* BB_AUDIT SUSv3 defects - unsupported option -x. */ | 10 | /* BB_AUDIT SUSv3 defects - unsupported option -x "match whole line only". */ |
| 11 | /* BB_AUDIT GNU defects - always acts as -a. */ | 11 | /* BB_AUDIT GNU defects - always acts as -a. */ |
| 12 | /* http://www.opengroup.org/onlinepubs/007904975/utilities/grep.html */ | 12 | /* http://www.opengroup.org/onlinepubs/007904975/utilities/grep.html */ |
| 13 | /* | 13 | /* |
| @@ -299,7 +299,7 @@ static int grep_file(FILE *file) | |||
| 299 | free(before_buf[curpos]); | 299 | free(before_buf[curpos]); |
| 300 | before_buf[curpos] = line; | 300 | before_buf[curpos] = line; |
| 301 | curpos = (curpos + 1) % lines_before; | 301 | curpos = (curpos + 1) % lines_before; |
| 302 | /* avoid free(line) - we took line */ | 302 | /* avoid free(line) - we took the line */ |
| 303 | line = NULL; | 303 | line = NULL; |
| 304 | } | 304 | } |
| 305 | } | 305 | } |
| @@ -371,7 +371,10 @@ static void load_regexes_from_file(llist_t *fopt) | |||
| 371 | } | 371 | } |
| 372 | } | 372 | } |
| 373 | 373 | ||
| 374 | static int file_action_grep(const char *filename, struct stat *statbuf ATTRIBUTE_UNUSED, void* matched, int depth ATTRIBUTE_UNUSED) | 374 | static int file_action_grep(const char *filename, |
| 375 | struct stat *statbuf ATTRIBUTE_UNUSED, | ||
| 376 | void* matched, | ||
| 377 | int depth ATTRIBUTE_UNUSED) | ||
| 375 | { | 378 | { |
| 376 | FILE *file = fopen(filename, "r"); | 379 | FILE *file = fopen(filename, "r"); |
| 377 | if (file == NULL) { | 380 | if (file == NULL) { |
| @@ -405,35 +408,28 @@ int grep_main(int argc, char **argv) | |||
| 405 | { | 408 | { |
| 406 | FILE *file; | 409 | FILE *file; |
| 407 | int matched; | 410 | int matched; |
| 408 | char *mopt; | ||
| 409 | llist_t *fopt = NULL; | 411 | llist_t *fopt = NULL; |
| 410 | 412 | ||
| 411 | /* do normal option parsing */ | 413 | /* do normal option parsing */ |
| 412 | #if ENABLE_FEATURE_GREP_CONTEXT | 414 | #if ENABLE_FEATURE_GREP_CONTEXT |
| 413 | char *slines_after; | 415 | int Copt; |
| 414 | char *slines_before; | ||
| 415 | char *Copt; | ||
| 416 | 416 | ||
| 417 | opt_complementary = "H-h:e::f::C-AB"; | 417 | /* -H unsets -h; -C unsets -A,-B; -e,-f are lists; |
| 418 | * -m,-A,-B,-C have numeric param */ | ||
| 419 | opt_complementary = "H-h:C-AB:e::f::m+:A+:B+:C+"; | ||
| 418 | getopt32(argv, | 420 | getopt32(argv, |
| 419 | OPTSTR_GREP, | 421 | OPTSTR_GREP, |
| 420 | &pattern_head, &fopt, &mopt, | 422 | &pattern_head, &fopt, &max_matches, |
| 421 | &slines_after, &slines_before, &Copt); | 423 | &lines_after, &lines_before, &Copt); |
| 422 | 424 | ||
| 423 | if (option_mask32 & OPT_C) { | 425 | if (option_mask32 & OPT_C) { |
| 424 | /* -C unsets prev -A and -B, but following -A or -B | 426 | /* -C unsets prev -A and -B, but following -A or -B |
| 425 | may override it */ | 427 | may override it */ |
| 426 | if (!(option_mask32 & OPT_A)) /* not overridden */ | 428 | if (!(option_mask32 & OPT_A)) /* not overridden */ |
| 427 | slines_after = Copt; | 429 | lines_after = Copt; |
| 428 | if (!(option_mask32 & OPT_B)) /* not overridden */ | 430 | if (!(option_mask32 & OPT_B)) /* not overridden */ |
| 429 | slines_before = Copt; | 431 | lines_before = Copt; |
| 430 | option_mask32 |= OPT_A|OPT_B; /* for parser */ | 432 | //option_mask32 |= OPT_A|OPT_B; /* for parser */ |
| 431 | } | ||
| 432 | if (option_mask32 & OPT_A) { | ||
| 433 | lines_after = xatoi_u(slines_after); | ||
| 434 | } | ||
| 435 | if (option_mask32 & OPT_B) { | ||
| 436 | lines_before = xatoi_u(slines_before); | ||
| 437 | } | 433 | } |
| 438 | /* sanity checks */ | 434 | /* sanity checks */ |
| 439 | if (option_mask32 & (OPT_c|OPT_q|OPT_l|OPT_L)) { | 435 | if (option_mask32 & (OPT_c|OPT_q|OPT_l|OPT_L)) { |
| @@ -444,13 +440,11 @@ int grep_main(int argc, char **argv) | |||
| 444 | before_buf = xzalloc(lines_before * sizeof(char *)); | 440 | before_buf = xzalloc(lines_before * sizeof(char *)); |
| 445 | #else | 441 | #else |
| 446 | /* with auto sanity checks */ | 442 | /* with auto sanity checks */ |
| 447 | opt_complementary = "H-h:e::f::c-n:q-n:l-n"; | 443 | /* -H unsets -h; -c,-q or -l unset -n; -e,-f are lists; -m N */ |
| 444 | opt_complementary = "H-h:c-n:q-n:l-n:e::f::m+"; | ||
| 448 | getopt32(argv, OPTSTR_GREP, | 445 | getopt32(argv, OPTSTR_GREP, |
| 449 | &pattern_head, &fopt, &mopt); | 446 | &pattern_head, &fopt, &max_matches); |
| 450 | #endif | 447 | #endif |
| 451 | if (option_mask32 & OPT_m) { | ||
| 452 | max_matches = xatoi_u(mopt); | ||
| 453 | } | ||
| 454 | invert_search = ((option_mask32 & OPT_v) != 0); /* 0 | 1 */ | 448 | invert_search = ((option_mask32 & OPT_v) != 0); /* 0 | 1 */ |
| 455 | 449 | ||
| 456 | if (pattern_head != NULL) { | 450 | if (pattern_head != NULL) { |
| @@ -481,8 +475,8 @@ int grep_main(int argc, char **argv) | |||
| 481 | argv += optind; | 475 | argv += optind; |
| 482 | argc -= optind; | 476 | argc -= optind; |
| 483 | 477 | ||
| 484 | /* if we didn't get a pattern from a -e and no command file was specified, | 478 | /* if we didn't get a pattern from -e and no command file was specified, |
| 485 | * argv[optind] should be the pattern. no pattern, no worky */ | 479 | * first parameter should be the pattern. no pattern, no worky */ |
| 486 | if (pattern_head == NULL) { | 480 | if (pattern_head == NULL) { |
| 487 | char *pattern; | 481 | char *pattern; |
| 488 | if (*argv == NULL) | 482 | if (*argv == NULL) |
| @@ -508,7 +502,7 @@ int grep_main(int argc, char **argv) | |||
| 508 | do { | 502 | do { |
| 509 | cur_file = *argv++; | 503 | cur_file = *argv++; |
| 510 | file = stdin; | 504 | file = stdin; |
| 511 | if (!cur_file || (*cur_file == '-' && !cur_file[1])) { | 505 | if (!cur_file || LONE_DASH(cur_file)) { |
| 512 | cur_file = "(standard input)"; | 506 | cur_file = "(standard input)"; |
| 513 | } else { | 507 | } else { |
| 514 | if (option_mask32 & OPT_r) { | 508 | if (option_mask32 & OPT_r) { |
diff --git a/init/halt.c b/init/halt.c index 1f0fae302..c14f0f221 100644 --- a/init/halt.c +++ b/init/halt.c | |||
| @@ -33,7 +33,7 @@ RB_AUTOBOOT | |||
| 33 | }; | 33 | }; |
| 34 | static const smallint signals[] = { SIGUSR1, SIGUSR2, SIGTERM }; | 34 | static const smallint signals[] = { SIGUSR1, SIGUSR2, SIGTERM }; |
| 35 | 35 | ||
| 36 | char *delay; | 36 | int delay = 0; |
| 37 | int which, flags, rc = 1; | 37 | int which, flags, rc = 1; |
| 38 | #if ENABLE_FEATURE_WTMP | 38 | #if ENABLE_FEATURE_WTMP |
| 39 | struct utmp utmp; | 39 | struct utmp utmp; |
| @@ -46,9 +46,10 @@ RB_AUTOBOOT | |||
| 46 | continue; | 46 | continue; |
| 47 | 47 | ||
| 48 | /* Parse and handle arguments */ | 48 | /* Parse and handle arguments */ |
| 49 | opt_complementary = "d+"; /* -d N */ | ||
| 49 | flags = getopt32(argv, "d:nfw", &delay); | 50 | flags = getopt32(argv, "d:nfw", &delay); |
| 50 | if (flags & 1) | 51 | |
| 51 | sleep(xatou(delay)); | 52 | sleep(delay); |
| 52 | 53 | ||
| 53 | #if ENABLE_FEATURE_WTMP | 54 | #if ENABLE_FEATURE_WTMP |
| 54 | if (access(bb_path_wtmp_file, R_OK|W_OK) == -1) { | 55 | if (access(bb_path_wtmp_file, R_OK|W_OK) == -1) { |
diff --git a/init/init.c b/init/init.c index 1145c0490..6d4969c4b 100644 --- a/init/init.c +++ b/init/init.c | |||
| @@ -818,14 +818,14 @@ static void reload_signal(int sig ATTRIBUTE_UNUSED) | |||
| 818 | } | 818 | } |
| 819 | 819 | ||
| 820 | int init_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; | 820 | int init_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; |
| 821 | int init_main(int argc, char **argv) | 821 | int init_main(int argc ATTRIBUTE_UNUSED, char **argv) |
| 822 | { | 822 | { |
| 823 | struct init_action *a; | 823 | struct init_action *a; |
| 824 | pid_t wpid; | 824 | pid_t wpid; |
| 825 | 825 | ||
| 826 | die_sleep = 30 * 24*60*60; /* if xmalloc will ever die... */ | 826 | die_sleep = 30 * 24*60*60; /* if xmalloc will ever die... */ |
| 827 | 827 | ||
| 828 | if (argc > 1 && !strcmp(argv[1], "-q")) { | 828 | if (argv[1] && !strcmp(argv[1], "-q")) { |
| 829 | return kill(1, SIGHUP); | 829 | return kill(1, SIGHUP); |
| 830 | } | 830 | } |
| 831 | 831 | ||
| @@ -868,7 +868,7 @@ int init_main(int argc, char **argv) | |||
| 868 | putenv((char *) *e); | 868 | putenv((char *) *e); |
| 869 | } | 869 | } |
| 870 | 870 | ||
| 871 | if (argc > 1) setenv("RUNLEVEL", argv[1], 1); | 871 | if (argv[1]) setenv("RUNLEVEL", argv[1], 1); |
| 872 | 872 | ||
| 873 | /* Hello world */ | 873 | /* Hello world */ |
| 874 | message(MAYBE_CONSOLE | L_LOG, "init started: %s", bb_banner); | 874 | message(MAYBE_CONSOLE | L_LOG, "init started: %s", bb_banner); |
| @@ -890,7 +890,7 @@ int init_main(int argc, char **argv) | |||
| 890 | } | 890 | } |
| 891 | 891 | ||
| 892 | /* Check if we are supposed to be in single user mode */ | 892 | /* Check if we are supposed to be in single user mode */ |
| 893 | if (argc > 1 | 893 | if (argv[1] |
| 894 | && (!strcmp(argv[1], "single") || !strcmp(argv[1], "-s") || LONE_CHAR(argv[1], '1')) | 894 | && (!strcmp(argv[1], "single") || !strcmp(argv[1], "-s") || LONE_CHAR(argv[1], '1')) |
| 895 | ) { | 895 | ) { |
| 896 | /* Start a shell on console */ | 896 | /* Start a shell on console */ |
diff --git a/ipsvd/tcpudp.c b/ipsvd/tcpudp.c index 8f23ca640..8f6616fe0 100644 --- a/ipsvd/tcpudp.c +++ b/ipsvd/tcpudp.c | |||
| @@ -163,7 +163,7 @@ static void sig_child_handler(int sig ATTRIBUTE_UNUSED) | |||
| 163 | int tcpudpsvd_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; | 163 | int tcpudpsvd_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; |
| 164 | int tcpudpsvd_main(int argc ATTRIBUTE_UNUSED, char **argv) | 164 | int tcpudpsvd_main(int argc ATTRIBUTE_UNUSED, char **argv) |
| 165 | { | 165 | { |
| 166 | char *str_c, *str_C, *str_b, *str_t; | 166 | char *str_C, *str_t; |
| 167 | char *user; | 167 | char *user; |
| 168 | struct hcc *hccp; | 168 | struct hcc *hccp; |
| 169 | const char *instructs; | 169 | const char *instructs; |
| @@ -189,21 +189,20 @@ int tcpudpsvd_main(int argc ATTRIBUTE_UNUSED, char **argv) | |||
| 189 | 189 | ||
| 190 | tcp = (applet_name[0] == 't'); | 190 | tcp = (applet_name[0] == 't'); |
| 191 | 191 | ||
| 192 | /* 3+ args, -i at most once, -p implies -h, -v is counter */ | 192 | /* 3+ args, -i at most once, -p implies -h, -v is counter, -b N, -c N */ |
| 193 | opt_complementary = "-3:i--i:ph:vv"; | 193 | opt_complementary = "-3:i--i:ph:vv:b+:c+"; |
| 194 | #ifdef SSLSVD | 194 | #ifdef SSLSVD |
| 195 | getopt32(argv, "+c:C:i:x:u:l:Eb:hpt:vU:/:Z:K:", | 195 | getopt32(argv, "+c:C:i:x:u:l:Eb:hpt:vU:/:Z:K:", |
| 196 | &str_c, &str_C, &instructs, &instructs, &user, &preset_local_hostname, | 196 | &cmax, &str_C, &instructs, &instructs, &user, &preset_local_hostname, |
| 197 | &str_b, &str_t, &ssluser, &root, &cert, &key, &verbose | 197 | &backlog, &str_t, &ssluser, &root, &cert, &key, &verbose |
| 198 | ); | 198 | ); |
| 199 | #else | 199 | #else |
| 200 | /* "+": stop on first non-option */ | ||
| 200 | getopt32(argv, "+c:C:i:x:u:l:Eb:hpt:v", | 201 | getopt32(argv, "+c:C:i:x:u:l:Eb:hpt:v", |
| 201 | &str_c, &str_C, &instructs, &instructs, &user, &preset_local_hostname, | 202 | &cmax, &str_C, &instructs, &instructs, &user, &preset_local_hostname, |
| 202 | &str_b, &str_t, &verbose | 203 | &backlog, &str_t, &verbose |
| 203 | ); | 204 | ); |
| 204 | #endif | 205 | #endif |
| 205 | if (option_mask32 & OPT_c) | ||
| 206 | cmax = xatou_range(str_c, 1, INT_MAX); | ||
| 207 | if (option_mask32 & OPT_C) { /* -C n[:message] */ | 206 | if (option_mask32 & OPT_C) { /* -C n[:message] */ |
| 208 | max_per_host = bb_strtou(str_C, &str_C, 10); | 207 | max_per_host = bb_strtou(str_C, &str_C, 10); |
| 209 | if (str_C[0]) { | 208 | if (str_C[0]) { |
| @@ -219,8 +218,6 @@ int tcpudpsvd_main(int argc ATTRIBUTE_UNUSED, char **argv) | |||
| 219 | if (!get_uidgid(&ugid, user, 1)) | 218 | if (!get_uidgid(&ugid, user, 1)) |
| 220 | bb_error_msg_and_die("unknown user/group: %s", user); | 219 | bb_error_msg_and_die("unknown user/group: %s", user); |
| 221 | } | 220 | } |
| 222 | if (option_mask32 & OPT_b) | ||
| 223 | backlog = xatou(str_b); | ||
| 224 | #ifdef SSLSVD | 221 | #ifdef SSLSVD |
| 225 | if (option_mask32 & OPT_U) ssluser = optarg; | 222 | if (option_mask32 & OPT_U) ssluser = optarg; |
| 226 | if (option_mask32 & OPT_slash) root = optarg; | 223 | if (option_mask32 & OPT_slash) root = optarg; |
diff --git a/libbb/getopt32.c b/libbb/getopt32.c index 9e53dfd08..51e030653 100644 --- a/libbb/getopt32.c +++ b/libbb/getopt32.c | |||
| @@ -117,7 +117,7 @@ const char *opt_complementary | |||
| 117 | if w is given once, GNU ps sets the width to 132, | 117 | if w is given once, GNU ps sets the width to 132, |
| 118 | if w is given more than once, it is "unlimited" | 118 | if w is given more than once, it is "unlimited" |
| 119 | 119 | ||
| 120 | int w_counter = 0; | 120 | int w_counter = 0; // must be initialized! |
| 121 | opt_complementary = "ww"; | 121 | opt_complementary = "ww"; |
| 122 | getopt32(argv, "w", &w_counter); | 122 | getopt32(argv, "w", &w_counter); |
| 123 | if (w_counter) | 123 | if (w_counter) |
| @@ -220,7 +220,7 @@ Special characters: | |||
| 220 | "x--x" Variation of the above, it means that -x option should occur | 220 | "x--x" Variation of the above, it means that -x option should occur |
| 221 | at most once. | 221 | at most once. |
| 222 | 222 | ||
| 223 | "a+:" A plus after a char in opt_complementary means that the parameter | 223 | "a+" A plus after a char in opt_complementary means that the parameter |
| 224 | for this option is a nonnegative integer. It will be processed | 224 | for this option is a nonnegative integer. It will be processed |
| 225 | with xatoi_u() - allowed range is 0..INT_MAX. | 225 | with xatoi_u() - allowed range is 0..INT_MAX. |
| 226 | 226 | ||
| @@ -255,7 +255,7 @@ Special characters: | |||
| 255 | For example from "id" applet: | 255 | For example from "id" applet: |
| 256 | 256 | ||
| 257 | // Don't allow -n -r -rn -ug -rug -nug -rnug | 257 | // Don't allow -n -r -rn -ug -rug -nug -rnug |
| 258 | opt_complementary = "r?ug:n?ug:?u--g:g--u"; | 258 | opt_complementary = "r?ug:n?ug:u--g:g--u"; |
| 259 | flags = getopt32(argv, "rnug"); | 259 | flags = getopt32(argv, "rnug"); |
| 260 | 260 | ||
| 261 | This example allowed only: | 261 | This example allowed only: |
| @@ -545,11 +545,14 @@ getopt32(char **argv, const char *applet_opts, ...) | |||
| 545 | if (on_off->counter) | 545 | if (on_off->counter) |
| 546 | (*(on_off->counter))++; | 546 | (*(on_off->counter))++; |
| 547 | if (on_off->param_type == PARAM_LIST) { | 547 | if (on_off->param_type == PARAM_LIST) { |
| 548 | llist_add_to_end((llist_t **)(on_off->optarg), optarg); | 548 | if (optarg) |
| 549 | llist_add_to_end((llist_t **)(on_off->optarg), optarg); | ||
| 549 | } else if (on_off->param_type == PARAM_INT) { | 550 | } else if (on_off->param_type == PARAM_INT) { |
| 550 | *(unsigned*)(on_off->optarg) = xatoi_u(optarg); | 551 | if (optarg) |
| 552 | *(unsigned*)(on_off->optarg) = xatoi_u(optarg); | ||
| 551 | } else if (on_off->optarg) { | 553 | } else if (on_off->optarg) { |
| 552 | *(char **)(on_off->optarg) = optarg; | 554 | if (optarg) |
| 555 | *(char **)(on_off->optarg) = optarg; | ||
| 553 | } | 556 | } |
| 554 | if (pargv != NULL) | 557 | if (pargv != NULL) |
| 555 | break; | 558 | break; |
diff --git a/loginutils/addgroup.c b/loginutils/addgroup.c index 31e507045..b25f8171d 100644 --- a/loginutils/addgroup.c +++ b/loginutils/addgroup.c | |||
| @@ -123,7 +123,7 @@ static void add_user_to_group(char **args, | |||
| 123 | * will add an existing user to an existing group. | 123 | * will add an existing user to an existing group. |
| 124 | */ | 124 | */ |
| 125 | int addgroup_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; | 125 | int addgroup_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; |
| 126 | int addgroup_main(int argc, char **argv) | 126 | int addgroup_main(int argc ATTRIBUTE_UNUSED, char **argv) |
| 127 | { | 127 | { |
| 128 | char *group; | 128 | char *group; |
| 129 | gid_t gid = 0; | 129 | gid_t gid = 0; |
| @@ -144,10 +144,10 @@ int addgroup_main(int argc, char **argv) | |||
| 144 | } | 144 | } |
| 145 | /* move past the commandline options */ | 145 | /* move past the commandline options */ |
| 146 | argv += optind; | 146 | argv += optind; |
| 147 | argc -= optind; | 147 | //argc -= optind; |
| 148 | 148 | ||
| 149 | #if ENABLE_FEATURE_ADDUSER_TO_GROUP | 149 | #if ENABLE_FEATURE_ADDUSER_TO_GROUP |
| 150 | if (argc == 2) { | 150 | if (argv[1]) { |
| 151 | struct group *gr; | 151 | struct group *gr; |
| 152 | 152 | ||
| 153 | if (option_mask32) { | 153 | if (option_mask32) { |
| @@ -170,7 +170,7 @@ int addgroup_main(int argc, char **argv) | |||
| 170 | add_user_to_group(argv, bb_path_group_file, xfopen); | 170 | add_user_to_group(argv, bb_path_group_file, xfopen); |
| 171 | #if ENABLE_FEATURE_SHADOWPASSWDS | 171 | #if ENABLE_FEATURE_SHADOWPASSWDS |
| 172 | add_user_to_group(argv, bb_path_gshadow_file, fopen_or_warn); | 172 | add_user_to_group(argv, bb_path_gshadow_file, fopen_or_warn); |
| 173 | #endif /* ENABLE_FEATURE_SHADOWPASSWDS */ | 173 | #endif |
| 174 | } else | 174 | } else |
| 175 | #endif /* ENABLE_FEATURE_ADDUSER_TO_GROUP */ | 175 | #endif /* ENABLE_FEATURE_ADDUSER_TO_GROUP */ |
| 176 | new_group(argv[0], gid); | 176 | new_group(argv[0], gid); |
diff --git a/loginutils/login.c b/loginutils/login.c index d7eb8d35b..e8fe74e16 100644 --- a/loginutils/login.c +++ b/loginutils/login.c | |||
| @@ -221,7 +221,7 @@ static void alarm_handler(int sig ATTRIBUTE_UNUSED) | |||
| 221 | } | 221 | } |
| 222 | 222 | ||
| 223 | int login_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; | 223 | int login_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; |
| 224 | int login_main(int argc, char **argv) | 224 | int login_main(int argc ATTRIBUTE_UNUSED, char **argv) |
| 225 | { | 225 | { |
| 226 | enum { | 226 | enum { |
| 227 | LOGIN_OPT_f = (1<<0), | 227 | LOGIN_OPT_f = (1<<0), |
| @@ -269,8 +269,9 @@ int login_main(int argc, char **argv) | |||
| 269 | bb_error_msg_and_die("-f is for root only"); | 269 | bb_error_msg_and_die("-f is for root only"); |
| 270 | safe_strncpy(username, opt_user, sizeof(username)); | 270 | safe_strncpy(username, opt_user, sizeof(username)); |
| 271 | } | 271 | } |
| 272 | if (optind < argc) /* user from command line (getty) */ | 272 | argv += optind; |
| 273 | safe_strncpy(username, argv[optind], sizeof(username)); | 273 | if (argv[0]) /* user from command line (getty) */ |
| 274 | safe_strncpy(username, argv[0], sizeof(username)); | ||
| 274 | 275 | ||
| 275 | /* Let's find out and memorize our tty */ | 276 | /* Let's find out and memorize our tty */ |
| 276 | if (!isatty(0) || !isatty(1) || !isatty(2)) | 277 | if (!isatty(0) || !isatty(1) || !isatty(2)) |
diff --git a/loginutils/sulogin.c b/loginutils/sulogin.c index caa1a8335..17bb15efa 100644 --- a/loginutils/sulogin.c +++ b/loginutils/sulogin.c | |||
| @@ -19,7 +19,6 @@ int sulogin_main(int argc ATTRIBUTE_UNUSED, char **argv) | |||
| 19 | { | 19 | { |
| 20 | char *cp; | 20 | char *cp; |
| 21 | int timeout = 0; | 21 | int timeout = 0; |
| 22 | char *timeout_arg; | ||
| 23 | struct passwd *pwd; | 22 | struct passwd *pwd; |
| 24 | const char *shell; | 23 | const char *shell; |
| 25 | #if ENABLE_FEATURE_SHADOWPASSWDS | 24 | #if ENABLE_FEATURE_SHADOWPASSWDS |
| @@ -31,9 +30,8 @@ int sulogin_main(int argc ATTRIBUTE_UNUSED, char **argv) | |||
| 31 | logmode = LOGMODE_BOTH; | 30 | logmode = LOGMODE_BOTH; |
| 32 | openlog(applet_name, 0, LOG_AUTH); | 31 | openlog(applet_name, 0, LOG_AUTH); |
| 33 | 32 | ||
| 34 | if (getopt32(argv, "t:", &timeout_arg)) { | 33 | opt_complementary = "t+"; /* -t N */ |
| 35 | timeout = xatoi_u(timeout_arg); | 34 | getopt32(argv, "t:", &timeout); |
| 36 | } | ||
| 37 | 35 | ||
| 38 | if (argv[optind]) { | 36 | if (argv[optind]) { |
| 39 | close(0); | 37 | close(0); |
| @@ -43,6 +41,7 @@ int sulogin_main(int argc ATTRIBUTE_UNUSED, char **argv) | |||
| 43 | dup(0); | 41 | dup(0); |
| 44 | } | 42 | } |
| 45 | 43 | ||
| 44 | /* Malicious use like "sulogin /dev/sda"? */ | ||
| 46 | if (!isatty(0) || !isatty(1) || !isatty(2)) { | 45 | if (!isatty(0) || !isatty(1) || !isatty(2)) { |
| 47 | logmode = LOGMODE_SYSLOG; | 46 | logmode = LOGMODE_SYSLOG; |
| 48 | bb_error_msg_and_die("not a tty"); | 47 | bb_error_msg_and_die("not a tty"); |
diff --git a/miscutils/mt.c b/miscutils/mt.c index c16073c61..c56a8e0ca 100644 --- a/miscutils/mt.c +++ b/miscutils/mt.c | |||
| @@ -81,24 +81,22 @@ static const char opcode_name[] ALIGN1 = | |||
| 81 | "weof" "\0"; | 81 | "weof" "\0"; |
| 82 | 82 | ||
| 83 | int mt_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; | 83 | int mt_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; |
| 84 | int mt_main(int argc, char **argv) | 84 | int mt_main(int argc ATTRIBUTE_UNUSED, char **argv) |
| 85 | { | 85 | { |
| 86 | const char *file = "/dev/tape"; | 86 | const char *file = "/dev/tape"; |
| 87 | struct mtop op; | 87 | struct mtop op; |
| 88 | struct mtpos position; | 88 | struct mtpos position; |
| 89 | int fd, mode, idx; | 89 | int fd, mode, idx; |
| 90 | 90 | ||
| 91 | if (argc < 2) { | 91 | if (!argv[1]) { |
| 92 | bb_show_usage(); | 92 | bb_show_usage(); |
| 93 | } | 93 | } |
| 94 | 94 | ||
| 95 | if (strcmp(argv[1], "-f") == 0) { | 95 | if (strcmp(argv[1], "-f") == 0) { |
| 96 | if (argc < 4) { | 96 | if (!argv[2] || !argv[3]) |
| 97 | bb_show_usage(); | 97 | bb_show_usage(); |
| 98 | } | ||
| 99 | file = argv[2]; | 98 | file = argv[2]; |
| 100 | argv += 2; | 99 | argv += 2; |
| 101 | argc -= 2; | ||
| 102 | } | 100 | } |
| 103 | 101 | ||
| 104 | idx = index_in_strings(opcode_name, argv[1]); | 102 | idx = index_in_strings(opcode_name, argv[1]); |
| @@ -107,7 +105,7 @@ int mt_main(int argc, char **argv) | |||
| 107 | bb_error_msg_and_die("unrecognized opcode %s", argv[1]); | 105 | bb_error_msg_and_die("unrecognized opcode %s", argv[1]); |
| 108 | 106 | ||
| 109 | op.mt_op = opcode_value[idx]; | 107 | op.mt_op = opcode_value[idx]; |
| 110 | if (argc >= 3) | 108 | if (argv[2]) |
| 111 | op.mt_count = xatoi_u(argv[2]); | 109 | op.mt_count = xatoi_u(argv[2]); |
| 112 | else | 110 | else |
| 113 | op.mt_count = 1; /* One, not zero, right? */ | 111 | op.mt_count = 1; /* One, not zero, right? */ |
diff --git a/networking/arping.c b/networking/arping.c index 6a17b18ee..39dcb7cc2 100644 --- a/networking/arping.c +++ b/networking/arping.c | |||
| @@ -264,16 +264,14 @@ int arping_main(int argc ATTRIBUTE_UNUSED, char **argv) | |||
| 264 | err_str = xasprintf("interface %s %%s", device); | 264 | err_str = xasprintf("interface %s %%s", device); |
| 265 | { | 265 | { |
| 266 | unsigned opt; | 266 | unsigned opt; |
| 267 | char *str_count, *str_timeout; | 267 | char *str_timeout; |
| 268 | 268 | ||
| 269 | /* Dad also sets quit_on_reply. | 269 | /* Dad also sets quit_on_reply. |
| 270 | * Advert also sets unsolicited. | 270 | * Advert also sets unsolicited. |
| 271 | */ | 271 | */ |
| 272 | opt_complementary = "=1:Df:AU"; | 272 | opt_complementary = "=1:Df:AU:c+"; |
| 273 | opt = getopt32(argv, "DUAqfbc:w:I:s:", | 273 | opt = getopt32(argv, "DUAqfbc:w:I:s:", |
| 274 | &str_count, &str_timeout, &device, &source); | 274 | &count, &str_timeout, &device, &source); |
| 275 | if (opt & 0x40) /* -c: count */ | ||
| 276 | count = xatoi_u(str_count); | ||
| 277 | if (opt & 0x80) /* -w: timeout */ | 275 | if (opt & 0x80) /* -w: timeout */ |
| 278 | timeout_us = xatou_range(str_timeout, 0, INT_MAX/2000000) * 1000000 + 500000; | 276 | timeout_us = xatou_range(str_timeout, 0, INT_MAX/2000000) * 1000000 + 500000; |
| 279 | //if (opt & 0x200) /* -s: source */ | 277 | //if (opt & 0x200) /* -s: source */ |
diff --git a/networking/nc_bloaty.c b/networking/nc_bloaty.c index 34f715fc5..dd94a1460 100644 --- a/networking/nc_bloaty.c +++ b/networking/nc_bloaty.c | |||
| @@ -674,7 +674,7 @@ Debug("wrote %d to net, errno %d", rr, errno); | |||
| 674 | int nc_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; | 674 | int nc_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; |
| 675 | int nc_main(int argc, char **argv) | 675 | int nc_main(int argc, char **argv) |
| 676 | { | 676 | { |
| 677 | char *str_p, *str_s, *str_w; | 677 | char *str_p, *str_s; |
| 678 | USE_NC_EXTRA(char *str_i, *str_o;) | 678 | USE_NC_EXTRA(char *str_i, *str_o;) |
| 679 | char *themdotted = themdotted; /* gcc */ | 679 | char *themdotted = themdotted; /* gcc */ |
| 680 | char **proggie; | 680 | char **proggie; |
| @@ -710,10 +710,10 @@ int nc_main(int argc, char **argv) | |||
| 710 | e_found: | 710 | e_found: |
| 711 | 711 | ||
| 712 | // -g -G -t -r deleted, unimplemented -a deleted too | 712 | // -g -G -t -r deleted, unimplemented -a deleted too |
| 713 | opt_complementary = "?2:vv"; /* max 2 params, -v is a counter */ | 713 | opt_complementary = "?2:vv:w+"; /* max 2 params; -v is a counter; -w N */ |
| 714 | getopt32(argv, "hnp:s:uvw:" USE_NC_SERVER("l") | 714 | getopt32(argv, "hnp:s:uvw:" USE_NC_SERVER("l") |
| 715 | USE_NC_EXTRA("i:o:z"), | 715 | USE_NC_EXTRA("i:o:z"), |
| 716 | &str_p, &str_s, &str_w | 716 | &str_p, &str_s, &o_wait |
| 717 | USE_NC_EXTRA(, &str_i, &str_o, &o_verbose)); | 717 | USE_NC_EXTRA(, &str_i, &str_o, &o_verbose)); |
| 718 | argv += optind; | 718 | argv += optind; |
| 719 | #if ENABLE_NC_EXTRA | 719 | #if ENABLE_NC_EXTRA |
| @@ -731,9 +731,7 @@ int nc_main(int argc, char **argv) | |||
| 731 | //if (option_mask32 & OPT_r) /* randomize various things */ | 731 | //if (option_mask32 & OPT_r) /* randomize various things */ |
| 732 | //if (option_mask32 & OPT_u) /* use UDP */ | 732 | //if (option_mask32 & OPT_u) /* use UDP */ |
| 733 | //if (option_mask32 & OPT_v) /* verbose */ | 733 | //if (option_mask32 & OPT_v) /* verbose */ |
| 734 | if (option_mask32 & OPT_w) { /* wait time */ | 734 | //if (option_mask32 & OPT_w) /* wait time */ |
| 735 | o_wait = xatoi_u(str_w); | ||
| 736 | } | ||
| 737 | //if (option_mask32 & OPT_z) /* little or no data xfer */ | 735 | //if (option_mask32 & OPT_z) /* little or no data xfer */ |
| 738 | 736 | ||
| 739 | /* We manage our fd's so that they are never 0,1,2 */ | 737 | /* We manage our fd's so that they are never 0,1,2 */ |
diff --git a/networking/tftp.c b/networking/tftp.c index 14c340b22..187261568 100644 --- a/networking/tftp.c +++ b/networking/tftp.c | |||
| @@ -397,9 +397,6 @@ int tftp_main(int argc ATTRIBUTE_UNUSED, char **argv) | |||
| 397 | len_and_sockaddr *peer_lsa; | 397 | len_and_sockaddr *peer_lsa; |
| 398 | const char *localfile = NULL; | 398 | const char *localfile = NULL; |
| 399 | const char *remotefile = NULL; | 399 | const char *remotefile = NULL; |
| 400 | #if ENABLE_FEATURE_TFTP_BLOCKSIZE | ||
| 401 | const char *sblocksize = NULL; | ||
| 402 | #endif | ||
| 403 | int port; | 400 | int port; |
| 404 | USE_GETPUT(int cmd;) | 401 | USE_GETPUT(int cmd;) |
| 405 | int fd = -1; | 402 | int fd = -1; |
| @@ -409,13 +406,14 @@ int tftp_main(int argc ATTRIBUTE_UNUSED, char **argv) | |||
| 409 | 406 | ||
| 410 | /* -p or -g is mandatory, and they are mutually exclusive */ | 407 | /* -p or -g is mandatory, and they are mutually exclusive */ |
| 411 | opt_complementary = "" USE_FEATURE_TFTP_GET("g:") USE_FEATURE_TFTP_PUT("p:") | 408 | opt_complementary = "" USE_FEATURE_TFTP_GET("g:") USE_FEATURE_TFTP_PUT("p:") |
| 412 | USE_GETPUT("?g--p:p--g"); | 409 | USE_GETPUT("g--p:p--g:") |
| 410 | USE_FEATURE_TFTP_BLOCKSIZE("b+"); | ||
| 413 | 411 | ||
| 414 | USE_GETPUT(cmd =) getopt32(argv, | 412 | USE_GETPUT(cmd =) getopt32(argv, |
| 415 | USE_FEATURE_TFTP_GET("g") USE_FEATURE_TFTP_PUT("p") | 413 | USE_FEATURE_TFTP_GET("g") USE_FEATURE_TFTP_PUT("p") |
| 416 | "l:r:" USE_FEATURE_TFTP_BLOCKSIZE("b:"), | 414 | "l:r:" USE_FEATURE_TFTP_BLOCKSIZE("b:"), |
| 417 | &localfile, &remotefile | 415 | &localfile, &remotefile |
| 418 | USE_FEATURE_TFTP_BLOCKSIZE(, &sblocksize)); | 416 | USE_FEATURE_TFTP_BLOCKSIZE(, &blocksize)); |
| 419 | argv += optind; | 417 | argv += optind; |
| 420 | 418 | ||
| 421 | flags = O_RDONLY; | 419 | flags = O_RDONLY; |
| @@ -423,12 +421,8 @@ int tftp_main(int argc ATTRIBUTE_UNUSED, char **argv) | |||
| 423 | flags = O_WRONLY | O_CREAT | O_TRUNC; | 421 | flags = O_WRONLY | O_CREAT | O_TRUNC; |
| 424 | 422 | ||
| 425 | #if ENABLE_FEATURE_TFTP_BLOCKSIZE | 423 | #if ENABLE_FEATURE_TFTP_BLOCKSIZE |
| 426 | if (sblocksize) { | 424 | if (!tftp_blocksize_check(blocksize, 0)) |
| 427 | blocksize = xatoi_u(sblocksize); | 425 | return EXIT_FAILURE; |
| 428 | if (!tftp_blocksize_check(blocksize, 0)) { | ||
| 429 | return EXIT_FAILURE; | ||
| 430 | } | ||
| 431 | } | ||
| 432 | #endif | 426 | #endif |
| 433 | 427 | ||
| 434 | if (!localfile) | 428 | if (!localfile) |
diff --git a/networking/udhcp/dhcpc.c b/networking/udhcp/dhcpc.c index 576b1cbb8..fe8f4c8fa 100644 --- a/networking/udhcp/dhcpc.c +++ b/networking/udhcp/dhcpc.c | |||
| @@ -132,7 +132,7 @@ int udhcpc_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; | |||
| 132 | int udhcpc_main(int argc ATTRIBUTE_UNUSED, char **argv) | 132 | int udhcpc_main(int argc ATTRIBUTE_UNUSED, char **argv) |
| 133 | { | 133 | { |
| 134 | uint8_t *temp, *message; | 134 | uint8_t *temp, *message; |
| 135 | char *str_c, *str_V, *str_h, *str_F, *str_r, *str_T, *str_A, *str_t; | 135 | char *str_c, *str_V, *str_h, *str_F, *str_r; |
| 136 | USE_FEATURE_UDHCP_PORT(char *str_P;) | 136 | USE_FEATURE_UDHCP_PORT(char *str_P;) |
| 137 | llist_t *list_O = NULL; | 137 | llist_t *list_O = NULL; |
| 138 | #if ENABLE_FEATURE_UDHCPC_ARPING | 138 | #if ENABLE_FEATURE_UDHCPC_ARPING |
| @@ -223,7 +223,8 @@ int udhcpc_main(int argc ATTRIBUTE_UNUSED, char **argv) | |||
| 223 | client_config.script = DEFAULT_SCRIPT; | 223 | client_config.script = DEFAULT_SCRIPT; |
| 224 | 224 | ||
| 225 | /* Parse command line */ | 225 | /* Parse command line */ |
| 226 | opt_complementary = "c--C:C--c:O::"; // Cc: mutually exclusive; O: list | 226 | /* Cc: mutually exclusive; O: list; -T,-t,-A take numeric param */ |
| 227 | opt_complementary = "c--C:C--c:O::T+:t+:A+"; | ||
| 227 | #if ENABLE_GETOPT_LONG | 228 | #if ENABLE_GETOPT_LONG |
| 228 | applet_long_options = udhcpc_longopts; | 229 | applet_long_options = udhcpc_longopts; |
| 229 | #endif | 230 | #endif |
| @@ -233,7 +234,8 @@ int udhcpc_main(int argc ATTRIBUTE_UNUSED, char **argv) | |||
| 233 | "O:" | 234 | "O:" |
| 234 | , &str_c, &str_V, &str_h, &str_h, &str_F | 235 | , &str_c, &str_V, &str_h, &str_h, &str_F |
| 235 | , &client_config.interface, &client_config.pidfile, &str_r | 236 | , &client_config.interface, &client_config.pidfile, &str_r |
| 236 | , &client_config.script, &str_T, &str_t, &str_A | 237 | , &client_config.script |
| 238 | , &discover_timeout, &discover_retries, &tryagain_timeout | ||
| 237 | USE_FEATURE_UDHCPC_ARPING(, &str_W) | 239 | USE_FEATURE_UDHCPC_ARPING(, &str_W) |
| 238 | USE_FEATURE_UDHCP_PORT(, &str_P) | 240 | USE_FEATURE_UDHCP_PORT(, &str_P) |
| 239 | , &list_O | 241 | , &list_O |
| @@ -273,12 +275,9 @@ int udhcpc_main(int argc ATTRIBUTE_UNUSED, char **argv) | |||
| 273 | if (opt & OPT_r) | 275 | if (opt & OPT_r) |
| 274 | requested_ip = inet_addr(str_r); | 276 | requested_ip = inet_addr(str_r); |
| 275 | // if (opt & OPT_s) client_config.script = ... | 277 | // if (opt & OPT_s) client_config.script = ... |
| 276 | if (opt & OPT_T) | 278 | // if (opt & OPT_T) discover_timeout = xatoi_u(str_T); |
| 277 | discover_timeout = xatoi_u(str_T); | 279 | // if (opt & OPT_t) discover_retries = xatoi_u(str_t); |
| 278 | if (opt & OPT_t) | 280 | // if (opt & OPT_A) tryagain_timeout = xatoi_u(str_A); |
| 279 | discover_retries = xatoi_u(str_t); | ||
| 280 | if (opt & OPT_A) | ||
| 281 | tryagain_timeout = xatoi_u(str_A); | ||
| 282 | if (opt & OPT_v) { | 281 | if (opt & OPT_v) { |
| 283 | puts("version "BB_VER); | 282 | puts("version "BB_VER); |
| 284 | return 0; | 283 | return 0; |
diff --git a/runit/sv.c b/runit/sv.c index 45d5572f8..d5a9bd9cf 100644 --- a/runit/sv.c +++ b/runit/sv.c | |||
| @@ -422,7 +422,7 @@ int sv_main(int argc, char **argv) | |||
| 422 | char **servicex; | 422 | char **servicex; |
| 423 | unsigned waitsec = 7; | 423 | unsigned waitsec = 7; |
| 424 | smallint kll = 0; | 424 | smallint kll = 0; |
| 425 | smallint verbose = 0; | 425 | int verbose = 0; |
| 426 | int (*act)(const char*); | 426 | int (*act)(const char*); |
| 427 | int (*cbk)(const char*); | 427 | int (*cbk)(const char*); |
| 428 | int curdir; | 428 | int curdir; |
| @@ -436,9 +436,8 @@ int sv_main(int argc, char **argv) | |||
| 436 | x = getenv("SVWAIT"); | 436 | x = getenv("SVWAIT"); |
| 437 | if (x) waitsec = xatou(x); | 437 | if (x) waitsec = xatou(x); |
| 438 | 438 | ||
| 439 | opt = getopt32(argv, "w:v", &x); | 439 | opt_complementary = "w+:vv"; /* -w N, -v is a counter */ |
| 440 | if (opt & 1) waitsec = xatou(x); // -w | 440 | opt = getopt32(argv, "w:v", &waitsec, &verbose); |
| 441 | if (opt & 2) verbose = 1; // -v | ||
| 442 | argc -= optind; | 441 | argc -= optind; |
| 443 | argv += optind; | 442 | argv += optind; |
| 444 | action = *argv++; | 443 | action = *argv++; |
diff --git a/util-linux/fdformat.c b/util-linux/fdformat.c index c4f97ae34..eac7b15e9 100644 --- a/util-linux/fdformat.c +++ b/util-linux/fdformat.c | |||
| @@ -41,7 +41,7 @@ struct format_descr { | |||
| 41 | #define FD_FILL_BYTE 0xF6 /* format fill byte. */ | 41 | #define FD_FILL_BYTE 0xF6 /* format fill byte. */ |
| 42 | 42 | ||
| 43 | int fdformat_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; | 43 | int fdformat_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; |
| 44 | int fdformat_main(int argc, char **argv) | 44 | int fdformat_main(int argc ATTRIBUTE_UNUSED, char **argv) |
| 45 | { | 45 | { |
| 46 | int fd, n, cyl, read_bytes, verify; | 46 | int fd, n, cyl, read_bytes, verify; |
| 47 | unsigned char *data; | 47 | unsigned char *data; |
| @@ -49,9 +49,7 @@ int fdformat_main(int argc, char **argv) | |||
| 49 | struct floppy_struct param; | 49 | struct floppy_struct param; |
| 50 | struct format_descr descr; | 50 | struct format_descr descr; |
| 51 | 51 | ||
| 52 | if (argc < 2) { | 52 | opt_complementary = "=1"; /* must have 1 param */ |
| 53 | bb_show_usage(); | ||
| 54 | } | ||
| 55 | verify = !getopt32(argv, "n"); | 53 | verify = !getopt32(argv, "n"); |
| 56 | argv += optind; | 54 | argv += optind; |
| 57 | 55 | ||
diff --git a/util-linux/mkfs_minix.c b/util-linux/mkfs_minix.c index 3fbdc2020..60031a5c3 100644 --- a/util-linux/mkfs_minix.c +++ b/util-linux/mkfs_minix.c | |||
| @@ -627,7 +627,7 @@ int mkfs_minix_main(int argc ATTRIBUTE_UNUSED, char **argv) | |||
| 627 | unsigned opt; | 627 | unsigned opt; |
| 628 | char *tmp; | 628 | char *tmp; |
| 629 | struct stat statbuf; | 629 | struct stat statbuf; |
| 630 | char *str_i, *str_n; | 630 | char *str_i; |
| 631 | char *listfile = NULL; | 631 | char *listfile = NULL; |
| 632 | 632 | ||
| 633 | INIT_G(); | 633 | INIT_G(); |
| @@ -643,13 +643,13 @@ int mkfs_minix_main(int argc ATTRIBUTE_UNUSED, char **argv) | |||
| 643 | bb_error_msg_and_die("bad inode size"); | 643 | bb_error_msg_and_die("bad inode size"); |
| 644 | #endif | 644 | #endif |
| 645 | 645 | ||
| 646 | opt = getopt32(argv, "ci:l:n:v", &str_i, &listfile, &str_n); | 646 | opt_complementary = "n+"; /* -n N */ |
| 647 | opt = getopt32(argv, "ci:l:n:v", &str_i, &listfile, &G.namelen); | ||
| 647 | argv += optind; | 648 | argv += optind; |
| 648 | //if (opt & 1) -c | 649 | //if (opt & 1) -c |
| 649 | if (opt & 2) G.req_nr_inodes = xatoul(str_i); // -i | 650 | if (opt & 2) G.req_nr_inodes = xatoul(str_i); // -i |
| 650 | //if (opt & 4) -l | 651 | //if (opt & 4) -l |
| 651 | if (opt & 8) { // -n | 652 | if (opt & 8) { // -n |
| 652 | G.namelen = xatoi_u(str_n); | ||
| 653 | if (G.namelen == 14) G.magic = MINIX1_SUPER_MAGIC; | 653 | if (G.namelen == 14) G.magic = MINIX1_SUPER_MAGIC; |
| 654 | else if (G.namelen == 30) G.magic = MINIX1_SUPER_MAGIC2; | 654 | else if (G.namelen == 30) G.magic = MINIX1_SUPER_MAGIC2; |
| 655 | else bb_show_usage(); | 655 | else bb_show_usage(); |
diff --git a/util-linux/readprofile.c b/util-linux/readprofile.c index ef7865951..e25d07d2b 100644 --- a/util-linux/readprofile.c +++ b/util-linux/readprofile.c | |||
| @@ -8,7 +8,7 @@ | |||
| 8 | */ | 8 | */ |
| 9 | 9 | ||
| 10 | /* | 10 | /* |
| 11 | * 1999-02-22 Arkadiusz Mi¶kiewicz <misiek@pld.ORG.PL> | 11 | * 1999-02-22 Arkadiusz Mickiewicz <misiek@pld.ORG.PL> |
| 12 | * - added Native Language Support | 12 | * - added Native Language Support |
| 13 | * 1999-09-01 Stephane Eranian <eranian@cello.hpl.hp.com> | 13 | * 1999-09-01 Stephane Eranian <eranian@cello.hpl.hp.com> |
| 14 | * - 64bit clean patch | 14 | * - 64bit clean patch |
| @@ -45,7 +45,7 @@ int readprofile_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; | |||
| 45 | int readprofile_main(int argc ATTRIBUTE_UNUSED, char **argv) | 45 | int readprofile_main(int argc ATTRIBUTE_UNUSED, char **argv) |
| 46 | { | 46 | { |
| 47 | FILE *map; | 47 | FILE *map; |
| 48 | const char *mapFile, *proFile, *mult = 0; | 48 | const char *mapFile, *proFile; |
| 49 | unsigned long indx = 1; | 49 | unsigned long indx = 1; |
| 50 | size_t len; | 50 | size_t len; |
| 51 | uint64_t add0 = 0; | 51 | uint64_t add0 = 0; |
| @@ -55,37 +55,49 @@ int readprofile_main(int argc ATTRIBUTE_UNUSED, char **argv) | |||
| 55 | char fn_name[S_LEN], next_name[S_LEN]; /* current and next name */ | 55 | char fn_name[S_LEN], next_name[S_LEN]; /* current and next name */ |
| 56 | char mapline[S_LEN]; | 56 | char mapline[S_LEN]; |
| 57 | char mode[8]; | 57 | char mode[8]; |
| 58 | int optAll = 0, optInfo = 0, optReset = 0; | ||
| 59 | int optVerbose = 0, optNative = 0; | ||
| 60 | int optBins = 0, optSub = 0; | ||
| 61 | int maplineno = 1; | 58 | int maplineno = 1; |
| 62 | int header_printed; | 59 | int header_printed; |
| 60 | int multiplier = 0; | ||
| 61 | unsigned opt; | ||
| 62 | enum { | ||
| 63 | OPT_M = (1 << 0), | ||
| 64 | OPT_m = (1 << 1), | ||
| 65 | OPT_p = (1 << 2), | ||
| 66 | OPT_n = (1 << 3), | ||
| 67 | OPT_a = (1 << 4), | ||
| 68 | OPT_b = (1 << 5), | ||
| 69 | OPT_s = (1 << 6), | ||
| 70 | OPT_i = (1 << 7), | ||
| 71 | OPT_r = (1 << 8), | ||
| 72 | OPT_v = (1 << 9), | ||
| 73 | }; | ||
| 74 | #define optMult (opt & OPT_M) | ||
| 75 | #define optNative (opt & OPT_n) | ||
| 76 | #define optAll (opt & OPT_a) | ||
| 77 | #define optBins (opt & OPT_b) | ||
| 78 | #define optSub (opt & OPT_s) | ||
| 79 | #define optInfo (opt & OPT_i) | ||
| 80 | #define optReset (opt & OPT_r) | ||
| 81 | #define optVerbose (opt & OPT_v) | ||
| 63 | 82 | ||
| 64 | #define next (current^1) | 83 | #define next (current^1) |
| 65 | 84 | ||
| 66 | proFile = defaultpro; | 85 | proFile = defaultpro; |
| 67 | mapFile = defaultmap; | 86 | mapFile = defaultmap; |
| 68 | 87 | ||
| 69 | opt_complementary = "nn:aa:bb:ss:ii:rr:vv"; | 88 | opt_complementary = "M+"; /* -M N */ |
| 70 | getopt32(argv, "M:m:p:nabsirv", | 89 | opt = getopt32(argv, "M:m:p:nabsirv", &multiplier, &mapFile, &proFile); |
| 71 | &mult, &mapFile, &proFile, | ||
| 72 | &optNative, &optAll, &optBins, &optSub, | ||
| 73 | &optInfo, &optReset, &optVerbose); | ||
| 74 | 90 | ||
| 75 | if (optReset || mult) { | 91 | if (opt & (OPT_M|OPT_r)) { /* mult or reset, or both */ |
| 76 | int multiplier, fd, to_write; | 92 | int fd, to_write; |
| 77 | 93 | ||
| 78 | /* | 94 | /* |
| 79 | * When writing the multiplier, if the length of the write is | 95 | * When writing the multiplier, if the length of the write is |
| 80 | * not sizeof(int), the multiplier is not changed | 96 | * not sizeof(int), the multiplier is not changed |
| 81 | */ | 97 | */ |
| 82 | if (mult) { | 98 | to_write = sizeof(int); |
| 83 | multiplier = xatoi_u(mult); | 99 | if (!optMult) |
| 84 | to_write = sizeof(int); | ||
| 85 | } else { | ||
| 86 | multiplier = 0; | ||
| 87 | to_write = 1; /* sth different from sizeof(int) */ | 100 | to_write = 1; /* sth different from sizeof(int) */ |
| 88 | } | ||
| 89 | 101 | ||
| 90 | fd = xopen(defaultpro, O_WRONLY); | 102 | fd = xopen(defaultpro, O_WRONLY); |
| 91 | xwrite(fd, &multiplier, to_write); | 103 | xwrite(fd, &multiplier, to_write); |
| @@ -187,8 +199,9 @@ int readprofile_main(int argc ATTRIBUTE_UNUSED, char **argv) | |||
| 187 | if (optBins) { | 199 | if (optBins) { |
| 188 | if (optVerbose || this > 0) | 200 | if (optVerbose || this > 0) |
| 189 | printf(" total\t\t\t\t%u\n", this); | 201 | printf(" total\t\t\t\t%u\n", this); |
| 190 | } else if ((this || optAll) && | 202 | } else if ((this || optAll) |
| 191 | (fn_len = next_add-fn_add) != 0) { | 203 | && (fn_len = next_add-fn_add) != 0 |
| 204 | ) { | ||
| 192 | if (optVerbose) | 205 | if (optVerbose) |
| 193 | printf("%016llx %-40s %6i %8.4f\n", fn_add, | 206 | printf("%016llx %-40s %6i %8.4f\n", fn_add, |
| 194 | fn_name, this, this/(double)fn_len); | 207 | fn_name, this, this/(double)fn_len); |
diff --git a/util-linux/setarch.c b/util-linux/setarch.c index dbc02de5e..1f979a73c 100644 --- a/util-linux/setarch.c +++ b/util-linux/setarch.c | |||
| @@ -12,7 +12,7 @@ | |||
| 12 | #include "libbb.h" | 12 | #include "libbb.h" |
| 13 | 13 | ||
| 14 | int setarch_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; | 14 | int setarch_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; |
| 15 | int setarch_main(int ATTRIBUTE_UNUSED argc, char **argv) | 15 | int setarch_main(int argc ATTRIBUTE_UNUSED, char **argv) |
| 16 | { | 16 | { |
| 17 | int pers = -1; | 17 | int pers = -1; |
| 18 | 18 | ||
diff --git a/util-linux/swaponoff.c b/util-linux/swaponoff.c index 48f6f4e0b..beefac030 100644 --- a/util-linux/swaponoff.c +++ b/util-linux/swaponoff.c | |||
| @@ -59,11 +59,11 @@ static int do_em_all(void) | |||
| 59 | } | 59 | } |
| 60 | 60 | ||
| 61 | int swap_on_off_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; | 61 | int swap_on_off_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; |
| 62 | int swap_on_off_main(int argc, char **argv) | 62 | int swap_on_off_main(int argc ATTRIBUTE_UNUSED, char **argv) |
| 63 | { | 63 | { |
| 64 | int ret; | 64 | int ret; |
| 65 | 65 | ||
| 66 | if (argc == 1) | 66 | if (!argv[1]) |
| 67 | bb_show_usage(); | 67 | bb_show_usage(); |
| 68 | 68 | ||
| 69 | ret = getopt32(argv, "a"); | 69 | ret = getopt32(argv, "a"); |
