diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2017-08-08 16:38:18 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2017-08-08 17:09:40 +0200 |
commit | 036585a911a5fe6c2cd77b808dd9150500f37272 (patch) | |
tree | aa7c65b4d09c74642f622a1ef5da982d6ed4940a /networking | |
parent | 00677b5e35dd97f415f0b0bef25b55865f55ab33 (diff) | |
download | busybox-w32-036585a911a5fe6c2cd77b808dd9150500f37272.tar.gz busybox-w32-036585a911a5fe6c2cd77b808dd9150500f37272.tar.bz2 busybox-w32-036585a911a5fe6c2cd77b808dd9150500f37272.zip |
getopt32: remove applet_long_options
FEATURE_GETOPT_LONG made dependent on LONG_OPTS.
The folloving options are removed, now LONG_OPTS enables long options
for affected applets:
FEATURE_ENV_LONG_OPTIONS FEATURE_EXPAND_LONG_OPTIONS
FEATURE_UNEXPAND_LONG_OPTIONS FEATURE_MKDIR_LONG_OPTIONS
FEATURE_MV_LONG_OPTIONS FEATURE_RMDIR_LONG_OPTIONS
FEATURE_ADDGROUP_LONG_OPTIONS FEATURE_ADDUSER_LONG_OPTIONS
FEATURE_HWCLOCK_LONG_OPTIONS FEATURE_NSENTER_LONG_OPTS
FEATURE_CHCON_LONG_OPTIONS FEATURE_RUNCON_LONG_OPTIONS
They either had a small number of long options, or their long options are
essential.
Example: upstream addgroup and adduser have ONLY longopts,
we should probably go further and get rid
of non-standard short options.
To this end, make addgroup and adduser "select LONG_OPTS".
We had this breakage caused by us even in our own package!
#if ENABLE_LONG_OPTS || !ENABLE_ADDGROUP
/* We try to use --gid, not -g, because "standard" addgroup
* has no short option -g, it has only long --gid.
*/
argv[1] = (char*)"--gid";
#else
/* Breaks if system in fact does NOT use busybox addgroup */
argv[1] = (char*)"-g";
#endif
xargs: its lone longopt no longer depends on DESKTOP, only on LONG_OPTS.
hwclock TODO: get rid of incompatible -t, -l aliases to --systz, --localtime
Shorten help texts by omitting long option when short opt alternative exists.
Reduction of size comes from the fact that store of an immediate
(an address of longopts) to a fixed address (global variable)
is a longer insn than pushing that immediate or passing it in a register.
This effect is CPU-agnostic.
function old new delta
getopt32 1350 22 -1328
vgetopt32 - 1318 +1318
getopt32long - 24 +24
tftpd_main 562 567 +5
scan_recursive 376 380 +4
collect_cpu 545 546 +1
date_main 1096 1095 -1
hostname_main 262 259 -3
uname_main 259 255 -4
setpriv_main 362 358 -4
rmdir_main 191 187 -4
mv_main 562 558 -4
ipcalc_main 548 544 -4
ifenslave_main 641 637 -4
gzip_main 192 188 -4
gunzip_main 77 73 -4
fsfreeze_main 81 77 -4
flock_main 318 314 -4
deluser_main 337 333 -4
cp_main 374 370 -4
chown_main 175 171 -4
applet_long_options 4 - -4
xargs_main 894 889 -5
wget_main 2540 2535 -5
udhcpc_main 2767 2762 -5
touch_main 436 431 -5
tar_main 1014 1009 -5
start_stop_daemon_main 1033 1028 -5
sed_main 682 677 -5
script_main 1082 1077 -5
run_parts_main 330 325 -5
rtcwake_main 459 454 -5
od_main 2169 2164 -5
nl_main 201 196 -5
modprobe_main 773 768 -5
mkdir_main 160 155 -5
ls_main 568 563 -5
install_main 773 768 -5
hwclock_main 411 406 -5
getopt_main 622 617 -5
fstrim_main 256 251 -5
env_main 198 193 -5
dumpleases_main 635 630 -5
dpkg_main 3991 3986 -5
diff_main 1355 1350 -5
cryptpw_main 233 228 -5
cpio_main 593 588 -5
conspy_main 1135 1130 -5
chpasswd_main 313 308 -5
adduser_main 887 882 -5
addgroup_main 416 411 -5
ftpgetput_main 351 345 -6
get_terminal_width_height 242 234 -8
expand_main 690 680 -10
static.expand_longopts 18 - -18
static.unexpand_longopts 27 - -27
mkdir_longopts 28 - -28
env_longopts 30 - -30
static.ifenslave_longopts 34 - -34
mv_longopts 46 - -46
static.rmdir_longopts 48 - -48
packed_usage 31739 31687 -52
------------------------------------------------------------------------------
(add/remove: 2/8 grow/shrink: 3/49 up/down: 1352/-1840) Total: -488 bytes
text data bss dec hex filename
915681 485 6880 923046 e15a6 busybox_old
915428 485 6876 922789 e14a5 busybox_unstripped
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'networking')
-rw-r--r-- | networking/ftpgetput.c | 10 | ||||
-rw-r--r-- | networking/hostname.c | 12 | ||||
-rw-r--r-- | networking/ifenslave.c | 14 | ||||
-rw-r--r-- | networking/ipcalc.c | 10 | ||||
-rw-r--r-- | networking/udhcp/d6_dhcpc.c | 4 | ||||
-rw-r--r-- | networking/udhcp/dhcpc.c | 4 | ||||
-rw-r--r-- | networking/udhcp/dumpleases.c | 3 | ||||
-rw-r--r-- | networking/wget.c | 9 |
8 files changed, 33 insertions, 33 deletions
diff --git a/networking/ftpgetput.c b/networking/ftpgetput.c index d70f4ca77..1fc20364f 100644 --- a/networking/ftpgetput.c +++ b/networking/ftpgetput.c | |||
@@ -361,12 +361,14 @@ int ftpgetput_main(int argc UNUSED_PARAM, char **argv) | |||
361 | /* | 361 | /* |
362 | * Decipher the command line | 362 | * Decipher the command line |
363 | */ | 363 | */ |
364 | opt_complementary = "-2:vv:cc"; /* must have 2 to 3 params; -v and -c count */ | ||
364 | #if ENABLE_FEATURE_FTPGETPUT_LONG_OPTIONS | 365 | #if ENABLE_FEATURE_FTPGETPUT_LONG_OPTIONS |
365 | applet_long_options = ftpgetput_longopts; | 366 | getopt32long(argv, "cvu:p:P:", ftpgetput_longopts, |
367 | #else | ||
368 | getopt32(argv, "cvu:p:P:", | ||
366 | #endif | 369 | #endif |
367 | opt_complementary = "-2:vv:cc"; /* must have 2 to 3 params; -v and -c count */ | 370 | &user, &password, &port, &verbose_flag, &do_continue |
368 | getopt32(argv, "cvu:p:P:", &user, &password, &port, | 371 | ); |
369 | &verbose_flag, &do_continue); | ||
370 | argv += optind; | 372 | argv += optind; |
371 | 373 | ||
372 | /* We want to do exactly _one_ DNS lookup, since some | 374 | /* We want to do exactly _one_ DNS lookup, since some |
diff --git a/networking/hostname.c b/networking/hostname.c index ea0ff95b7..d87f6562f 100644 --- a/networking/hostname.c +++ b/networking/hostname.c | |||
@@ -132,8 +132,9 @@ int hostname_main(int argc UNUSED_PARAM, char **argv) | |||
132 | char *buf; | 132 | char *buf; |
133 | char *hostname_str; | 133 | char *hostname_str; |
134 | 134 | ||
135 | #if ENABLE_LONG_OPTS | 135 | /* dnsdomainname from net-tools 1.60, hostname 1.100 (2001-04-14), |
136 | applet_long_options = | 136 | * supports hostname's options too (not just -v as manpage says) */ |
137 | opts = getopt32(argv, "dfisF:v", &hostname_str, | ||
137 | "domain\0" No_argument "d" | 138 | "domain\0" No_argument "d" |
138 | "fqdn\0" No_argument "f" | 139 | "fqdn\0" No_argument "f" |
139 | //Enable if seen in active use in some distro: | 140 | //Enable if seen in active use in some distro: |
@@ -142,12 +143,7 @@ int hostname_main(int argc UNUSED_PARAM, char **argv) | |||
142 | // "short\0" No_argument "s" | 143 | // "short\0" No_argument "s" |
143 | // "verbose\0" No_argument "v" | 144 | // "verbose\0" No_argument "v" |
144 | "file\0" No_argument "F" | 145 | "file\0" No_argument "F" |
145 | ; | 146 | ); |
146 | |||
147 | #endif | ||
148 | /* dnsdomainname from net-tools 1.60, hostname 1.100 (2001-04-14), | ||
149 | * supports hostname's options too (not just -v as manpage says) */ | ||
150 | opts = getopt32(argv, "dfisF:v", &hostname_str); | ||
151 | argv += optind; | 147 | argv += optind; |
152 | buf = safe_gethostname(); | 148 | buf = safe_gethostname(); |
153 | if (ENABLE_DNSDOMAINNAME) { | 149 | if (ENABLE_DNSDOMAINNAME) { |
diff --git a/networking/ifenslave.c b/networking/ifenslave.c index a845c4e7e..5e769b61d 100644 --- a/networking/ifenslave.c +++ b/networking/ifenslave.c | |||
@@ -493,19 +493,15 @@ int ifenslave_main(int argc UNUSED_PARAM, char **argv) | |||
493 | OPT_d = (1 << 1), | 493 | OPT_d = (1 << 1), |
494 | OPT_f = (1 << 2), | 494 | OPT_f = (1 << 2), |
495 | }; | 495 | }; |
496 | #if ENABLE_LONG_OPTS | 496 | |
497 | static const char ifenslave_longopts[] ALIGN1 = | 497 | INIT_G(); |
498 | |||
499 | opt = getopt32long(argv, "cdfa", | ||
498 | "change-active\0" No_argument "c" | 500 | "change-active\0" No_argument "c" |
499 | "detach\0" No_argument "d" | 501 | "detach\0" No_argument "d" |
500 | "force\0" No_argument "f" | 502 | "force\0" No_argument "f" |
501 | /* "all-interfaces\0" No_argument "a" */ | 503 | /* "all-interfaces\0" No_argument "a" */ |
502 | ; | 504 | ); |
503 | |||
504 | applet_long_options = ifenslave_longopts; | ||
505 | #endif | ||
506 | INIT_G(); | ||
507 | |||
508 | opt = getopt32(argv, "cdfa"); | ||
509 | argv += optind; | 505 | argv += optind; |
510 | if (opt & (opt-1)) /* Only one option can be given */ | 506 | if (opt & (opt-1)) /* Only one option can be given */ |
511 | bb_show_usage(); | 507 | bb_show_usage(); |
diff --git a/networking/ipcalc.c b/networking/ipcalc.c index 83937828f..1d5db969c 100644 --- a/networking/ipcalc.c +++ b/networking/ipcalc.c | |||
@@ -108,6 +108,11 @@ int get_prefix(unsigned long netmask); | |||
108 | "silent\0" No_argument "s" // don’t ever display error messages | 108 | "silent\0" No_argument "s" // don’t ever display error messages |
109 | # endif | 109 | # endif |
110 | ; | 110 | ; |
111 | # define GETOPT32 getopt32long | ||
112 | # define LONGOPTS ,ipcalc_longopts | ||
113 | #else | ||
114 | # define GETOPT32 getopt32 | ||
115 | # define LONGOPTS | ||
111 | #endif | 116 | #endif |
112 | 117 | ||
113 | int ipcalc_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; | 118 | int ipcalc_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; |
@@ -125,11 +130,8 @@ int ipcalc_main(int argc UNUSED_PARAM, char **argv) | |||
125 | #define ipaddr (s_ipaddr.s_addr) | 130 | #define ipaddr (s_ipaddr.s_addr) |
126 | char *ipstr; | 131 | char *ipstr; |
127 | 132 | ||
128 | #if ENABLE_FEATURE_IPCALC_LONG_OPTIONS | ||
129 | applet_long_options = ipcalc_longopts; | ||
130 | #endif | ||
131 | opt_complementary = "-1:?2"; /* minimum 1 arg, maximum 2 args */ | 133 | opt_complementary = "-1:?2"; /* minimum 1 arg, maximum 2 args */ |
132 | opt = getopt32(argv, "mbn" IF_FEATURE_IPCALC_FANCY("phs")); | 134 | opt = GETOPT32(argv, "mbn" IF_FEATURE_IPCALC_FANCY("phs") LONGOPTS); |
133 | argv += optind; | 135 | argv += optind; |
134 | if (opt & SILENT) | 136 | if (opt & SILENT) |
135 | logmode = LOGMODE_NONE; /* suppress error_msg() output */ | 137 | logmode = LOGMODE_NONE; /* suppress error_msg() output */ |
diff --git a/networking/udhcp/d6_dhcpc.c b/networking/udhcp/d6_dhcpc.c index 43081efca..84969aa81 100644 --- a/networking/udhcp/d6_dhcpc.c +++ b/networking/udhcp/d6_dhcpc.c | |||
@@ -1103,12 +1103,12 @@ int udhcpc6_main(int argc UNUSED_PARAM, char **argv) | |||
1103 | /* Parse command line */ | 1103 | /* Parse command line */ |
1104 | /* O,x: list; -T,-t,-A take numeric param */ | 1104 | /* O,x: list; -T,-t,-A take numeric param */ |
1105 | IF_UDHCP_VERBOSE(opt_complementary = "vv";) | 1105 | IF_UDHCP_VERBOSE(opt_complementary = "vv";) |
1106 | IF_LONG_OPTS(applet_long_options = udhcpc6_longopts;) | 1106 | opt = getopt32long(argv, "i:np:qRr:s:T:+t:+SA:+O:*ox:*f" |
1107 | opt = getopt32(argv, "i:np:qRr:s:T:+t:+SA:+O:*ox:*f" | ||
1108 | USE_FOR_MMU("b") | 1107 | USE_FOR_MMU("b") |
1109 | ///IF_FEATURE_UDHCPC_ARPING("a") | 1108 | ///IF_FEATURE_UDHCPC_ARPING("a") |
1110 | IF_FEATURE_UDHCP_PORT("P:") | 1109 | IF_FEATURE_UDHCP_PORT("P:") |
1111 | "v" | 1110 | "v" |
1111 | , udhcpc6_longopts | ||
1112 | , &client_config.interface, &client_config.pidfile, &str_r /* i,p */ | 1112 | , &client_config.interface, &client_config.pidfile, &str_r /* i,p */ |
1113 | , &client_config.script /* s */ | 1113 | , &client_config.script /* s */ |
1114 | , &discover_timeout, &discover_retries, &tryagain_timeout /* T,t,A */ | 1114 | , &discover_timeout, &discover_retries, &tryagain_timeout /* T,t,A */ |
diff --git a/networking/udhcp/dhcpc.c b/networking/udhcp/dhcpc.c index ccf04993d..5f87f8586 100644 --- a/networking/udhcp/dhcpc.c +++ b/networking/udhcp/dhcpc.c | |||
@@ -1297,12 +1297,12 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv) | |||
1297 | /* Parse command line */ | 1297 | /* Parse command line */ |
1298 | /* O,x: list; -T,-t,-A take numeric param */ | 1298 | /* O,x: list; -T,-t,-A take numeric param */ |
1299 | IF_UDHCP_VERBOSE(opt_complementary = "vv";) | 1299 | IF_UDHCP_VERBOSE(opt_complementary = "vv";) |
1300 | IF_LONG_OPTS(applet_long_options = udhcpc_longopts;) | 1300 | opt = getopt32long(argv, "CV:H:h:F:i:np:qRr:s:T:+t:+SA:+O:*ox:*fB" |
1301 | opt = getopt32(argv, "CV:H:h:F:i:np:qRr:s:T:+t:+SA:+O:*ox:*fB" | ||
1302 | USE_FOR_MMU("b") | 1301 | USE_FOR_MMU("b") |
1303 | IF_FEATURE_UDHCPC_ARPING("a::") | 1302 | IF_FEATURE_UDHCPC_ARPING("a::") |
1304 | IF_FEATURE_UDHCP_PORT("P:") | 1303 | IF_FEATURE_UDHCP_PORT("P:") |
1305 | "v" | 1304 | "v" |
1305 | , udhcpc_longopts | ||
1306 | , &str_V, &str_h, &str_h, &str_F | 1306 | , &str_V, &str_h, &str_h, &str_F |
1307 | , &client_config.interface, &client_config.pidfile, &str_r /* i,p */ | 1307 | , &client_config.interface, &client_config.pidfile, &str_r /* i,p */ |
1308 | , &client_config.script /* s */ | 1308 | , &client_config.script /* s */ |
diff --git a/networking/udhcp/dumpleases.c b/networking/udhcp/dumpleases.c index 8aafc0d57..fb1860ff6 100644 --- a/networking/udhcp/dumpleases.c +++ b/networking/udhcp/dumpleases.c | |||
@@ -51,12 +51,11 @@ int dumpleases_main(int argc UNUSED_PARAM, char **argv) | |||
51 | "decimal\0" No_argument "d" | 51 | "decimal\0" No_argument "d" |
52 | ; | 52 | ; |
53 | 53 | ||
54 | applet_long_options = dumpleases_longopts; | ||
55 | #endif | 54 | #endif |
56 | init_unicode(); | 55 | init_unicode(); |
57 | 56 | ||
58 | opt_complementary = "=0:a--r:r--a"; | 57 | opt_complementary = "=0:a--r:r--a"; |
59 | opt = getopt32(argv, "arf:d", &file); | 58 | opt = getopt32long(argv, "arf:d", dumpleases_longopts, &file); |
60 | 59 | ||
61 | fd = xopen(file, O_RDONLY); | 60 | fd = xopen(file, O_RDONLY); |
62 | 61 | ||
diff --git a/networking/wget.c b/networking/wget.c index e47c9a51b..b661f727b 100644 --- a/networking/wget.c +++ b/networking/wget.c | |||
@@ -1365,6 +1365,11 @@ IF_DESKTOP( "no-clobber\0" No_argument "\xf0") | |||
1365 | IF_DESKTOP( "no-host-directories\0" No_argument "\xf0") | 1365 | IF_DESKTOP( "no-host-directories\0" No_argument "\xf0") |
1366 | IF_DESKTOP( "no-parent\0" No_argument "\xf0") | 1366 | IF_DESKTOP( "no-parent\0" No_argument "\xf0") |
1367 | ; | 1367 | ; |
1368 | # define GETOPT32 getopt32long | ||
1369 | # define LONGOPTS ,wget_longopts | ||
1370 | #else | ||
1371 | # define GETOPT32 getopt32 | ||
1372 | # define LONGOPTS | ||
1368 | #endif | 1373 | #endif |
1369 | 1374 | ||
1370 | #if ENABLE_FEATURE_WGET_LONG_OPTIONS | 1375 | #if ENABLE_FEATURE_WGET_LONG_OPTIONS |
@@ -1381,11 +1386,10 @@ IF_DESKTOP( "no-parent\0" No_argument "\xf0") | |||
1381 | G.user_agent = "Wget"; /* "User-Agent" header field */ | 1386 | G.user_agent = "Wget"; /* "User-Agent" header field */ |
1382 | 1387 | ||
1383 | #if ENABLE_FEATURE_WGET_LONG_OPTIONS | 1388 | #if ENABLE_FEATURE_WGET_LONG_OPTIONS |
1384 | applet_long_options = wget_longopts; | ||
1385 | #endif | 1389 | #endif |
1386 | opt_complementary = "-1" /* at least one URL */ | 1390 | opt_complementary = "-1" /* at least one URL */ |
1387 | IF_FEATURE_WGET_LONG_OPTIONS(":\xff::"); /* --header is a list */ | 1391 | IF_FEATURE_WGET_LONG_OPTIONS(":\xff::"); /* --header is a list */ |
1388 | getopt32(argv, "cqSO:P:Y:U:T:+" | 1392 | GETOPT32(argv, "cqSO:P:Y:U:T:+" |
1389 | /*ignored:*/ "t:" | 1393 | /*ignored:*/ "t:" |
1390 | /*ignored:*/ "n::" | 1394 | /*ignored:*/ "n::" |
1391 | /* wget has exactly four -n<letter> opts, all of which we can ignore: | 1395 | /* wget has exactly four -n<letter> opts, all of which we can ignore: |
@@ -1396,6 +1400,7 @@ IF_DESKTOP( "no-parent\0" No_argument "\xf0") | |||
1396 | * "n::" above says that we accept -n[ARG]. | 1400 | * "n::" above says that we accept -n[ARG]. |
1397 | * Specifying "n:" would be a bug: "-n ARG" would eat ARG! | 1401 | * Specifying "n:" would be a bug: "-n ARG" would eat ARG! |
1398 | */ | 1402 | */ |
1403 | LONGOPTS | ||
1399 | , &G.fname_out, &G.dir_prefix, | 1404 | , &G.fname_out, &G.dir_prefix, |
1400 | &G.proxy_flag, &G.user_agent, | 1405 | &G.proxy_flag, &G.user_agent, |
1401 | IF_FEATURE_WGET_TIMEOUT(&G.timeout_seconds) IF_NOT_FEATURE_WGET_TIMEOUT(NULL), | 1406 | IF_FEATURE_WGET_TIMEOUT(&G.timeout_seconds) IF_NOT_FEATURE_WGET_TIMEOUT(NULL), |