aboutsummaryrefslogtreecommitdiff
path: root/networking
diff options
context:
space:
mode:
Diffstat (limited to 'networking')
-rw-r--r--networking/arping.c6
-rw-r--r--networking/ether-wake.c3
-rw-r--r--networking/ftpd.c17
-rw-r--r--networking/ftpgetput.c7
-rw-r--r--networking/httpd.c10
-rw-r--r--networking/ipcalc.c7
-rw-r--r--networking/nc_bloaty.c14
-rw-r--r--networking/ntpd.c9
-rw-r--r--networking/ping.c12
-rw-r--r--networking/pscan.c7
-rw-r--r--networking/slattach.c5
-rw-r--r--networking/tcpudp.c7
-rw-r--r--networking/telnetd.c10
-rw-r--r--networking/tftp.c15
-rw-r--r--networking/traceroute.c6
-rw-r--r--networking/tunctl.c18
-rw-r--r--networking/udhcp/d6_dhcpc.c7
-rw-r--r--networking/udhcp/dhcpc.c10
-rw-r--r--networking/udhcp/dhcpd.c7
-rw-r--r--networking/udhcp/dumpleases.c8
-rw-r--r--networking/wget.c8
-rw-r--r--networking/whois.c3
-rw-r--r--networking/zcip.c5
23 files changed, 121 insertions, 80 deletions
diff --git a/networking/arping.c b/networking/arping.c
index 3fd54a287..f9967d81e 100644
--- a/networking/arping.c
+++ b/networking/arping.c
@@ -306,9 +306,9 @@ int arping_main(int argc UNUSED_PARAM, char **argv)
306 /* Dad also sets quit_on_reply. 306 /* Dad also sets quit_on_reply.
307 * Advert also sets unsolicited. 307 * Advert also sets unsolicited.
308 */ 308 */
309 opt_complementary = "=1:Df:AU"; 309 opt = getopt32(argv, "^" "DUAqfbc:+w:I:s:" "\0" "=1:Df:AU",
310 opt = getopt32(argv, "DUAqfbc:+w:I:s:", 310 &count, &str_timeout, &device, &source
311 &count, &str_timeout, &device, &source); 311 );
312 if (opt & 0x80) /* -w: timeout */ 312 if (opt & 0x80) /* -w: timeout */
313 timeout_us = xatou_range(str_timeout, 0, INT_MAX/2000000) * 1000000 + 500000; 313 timeout_us = xatou_range(str_timeout, 0, INT_MAX/2000000) * 1000000 + 500000;
314 //if (opt & 0x200) /* -s: source */ 314 //if (opt & 0x200) /* -s: source */
diff --git a/networking/ether-wake.c b/networking/ether-wake.c
index 52522e76d..6677f07d5 100644
--- a/networking/ether-wake.c
+++ b/networking/ether-wake.c
@@ -212,8 +212,7 @@ int ether_wake_main(int argc UNUSED_PARAM, char **argv)
212 struct whereto_t whereto; /* who to wake up */ 212 struct whereto_t whereto; /* who to wake up */
213 213
214 /* handle misc user options */ 214 /* handle misc user options */
215 opt_complementary = "=1"; 215 flags = getopt32(argv, "^" "bi:p:" "\0" "=1", &ifname, &pass);
216 flags = getopt32(argv, "bi:p:", &ifname, &pass);
217 if (flags & 4) /* -p */ 216 if (flags & 4) /* -p */
218 wol_passwd_sz = get_wol_pw(pass, wol_passwd); 217 wol_passwd_sz = get_wol_pw(pass, wol_passwd);
219 flags &= 1; /* we further interested only in -b [bcast] flag */ 218 flags &= 1; /* we further interested only in -b [bcast] flag */
diff --git a/networking/ftpd.c b/networking/ftpd.c
index c562c2886..8af5acac2 100644
--- a/networking/ftpd.c
+++ b/networking/ftpd.c
@@ -1174,17 +1174,20 @@ int ftpd_main(int argc UNUSED_PARAM, char **argv)
1174 abs_timeout = 1 * 60 * 60; 1174 abs_timeout = 1 * 60 * 60;
1175 verbose_S = 0; 1175 verbose_S = 0;
1176 G.timeout = 2 * 60; 1176 G.timeout = 2 * 60;
1177 opt_complementary = "vv:SS";
1178#if BB_MMU 1177#if BB_MMU
1179 opts = getopt32(argv, "vS" 1178 opts = getopt32(argv, "^" "vS"
1180 IF_FEATURE_FTPD_WRITE("w") "t:+T:+" IF_FEATURE_FTPD_AUTHENTICATION("a:"), 1179 IF_FEATURE_FTPD_WRITE("w") "t:+T:+" IF_FEATURE_FTPD_AUTHENTICATION("a:")
1180 "\0" "vv:SS",
1181 &G.timeout, &abs_timeout, IF_FEATURE_FTPD_AUTHENTICATION(&anon_opt,) 1181 &G.timeout, &abs_timeout, IF_FEATURE_FTPD_AUTHENTICATION(&anon_opt,)
1182 &G.verbose, &verbose_S); 1182 &G.verbose, &verbose_S
1183 );
1183#else 1184#else
1184 opts = getopt32(argv, "l1AvS" 1185 opts = getopt32(argv, "^" "l1AvS"
1185 IF_FEATURE_FTPD_WRITE("w") "t:+T:+" IF_FEATURE_FTPD_AUTHENTICATION("a:"), 1186 IF_FEATURE_FTPD_WRITE("w") "t:+T:+" IF_FEATURE_FTPD_AUTHENTICATION("a:")
1187 "\0" "vv:SS",
1186 &G.timeout, &abs_timeout, IF_FEATURE_FTPD_AUTHENTICATION(&anon_opt,) 1188 &G.timeout, &abs_timeout, IF_FEATURE_FTPD_AUTHENTICATION(&anon_opt,)
1187 &G.verbose, &verbose_S); 1189 &G.verbose, &verbose_S
1190 );
1188 if (opts & (OPT_l|OPT_1)) { 1191 if (opts & (OPT_l|OPT_1)) {
1189 /* Our secret backdoor to ls */ 1192 /* Our secret backdoor to ls */
1190 if (fchdir(3) != 0) 1193 if (fchdir(3) != 0)
diff --git a/networking/ftpgetput.c b/networking/ftpgetput.c
index 1fc20364f..2cce07ac2 100644
--- a/networking/ftpgetput.c
+++ b/networking/ftpgetput.c
@@ -361,11 +361,12 @@ 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 /* must have 2 to 3 params; -v and -c count */
365#define OPTSTRING "^cvu:p:P:" "\0" "-2:?3:vv:cc"
365#if ENABLE_FEATURE_FTPGETPUT_LONG_OPTIONS 366#if ENABLE_FEATURE_FTPGETPUT_LONG_OPTIONS
366 getopt32long(argv, "cvu:p:P:", ftpgetput_longopts, 367 getopt32long(argv, OPTSTRING, ftpgetput_longopts,
367#else 368#else
368 getopt32(argv, "cvu:p:P:", 369 getopt32(argv, OPTSTRING,
369#endif 370#endif
370 &user, &password, &port, &verbose_flag, &do_continue 371 &user, &password, &port, &verbose_flag, &do_continue
371 ); 372 );
diff --git a/networking/httpd.c b/networking/httpd.c
index 079145757..9369de824 100644
--- a/networking/httpd.c
+++ b/networking/httpd.c
@@ -2636,17 +2636,19 @@ int httpd_main(int argc UNUSED_PARAM, char **argv)
2636#endif 2636#endif
2637 2637
2638 home_httpd = xrealloc_getcwd_or_warn(NULL); 2638 home_httpd = xrealloc_getcwd_or_warn(NULL);
2639 /* -v counts, -i implies -f */
2640 opt_complementary = "vv:if";
2641 /* We do not "absolutize" path given by -h (home) opt. 2639 /* We do not "absolutize" path given by -h (home) opt.
2642 * If user gives relative path in -h, 2640 * If user gives relative path in -h,
2643 * $SCRIPT_FILENAME will not be set. */ 2641 * $SCRIPT_FILENAME will not be set. */
2644 opt = getopt32(argv, "c:d:h:" 2642 opt = getopt32(argv, "^"
2643 "c:d:h:"
2645 IF_FEATURE_HTTPD_ENCODE_URL_STR("e:") 2644 IF_FEATURE_HTTPD_ENCODE_URL_STR("e:")
2646 IF_FEATURE_HTTPD_BASIC_AUTH("r:") 2645 IF_FEATURE_HTTPD_BASIC_AUTH("r:")
2647 IF_FEATURE_HTTPD_AUTH_MD5("m:") 2646 IF_FEATURE_HTTPD_AUTH_MD5("m:")
2648 IF_FEATURE_HTTPD_SETUID("u:") 2647 IF_FEATURE_HTTPD_SETUID("u:")
2649 "p:ifv", 2648 "p:ifv"
2649 "\0"
2650 /* -v counts, -i implies -f */
2651 "vv:if",
2650 &opt_c_configFile, &url_for_decode, &home_httpd 2652 &opt_c_configFile, &url_for_decode, &home_httpd
2651 IF_FEATURE_HTTPD_ENCODE_URL_STR(, &url_for_encode) 2653 IF_FEATURE_HTTPD_ENCODE_URL_STR(, &url_for_encode)
2652 IF_FEATURE_HTTPD_BASIC_AUTH(, &g_realm) 2654 IF_FEATURE_HTTPD_BASIC_AUTH(, &g_realm)
diff --git a/networking/ipcalc.c b/networking/ipcalc.c
index 1d5db969c..cdae8eea8 100644
--- a/networking/ipcalc.c
+++ b/networking/ipcalc.c
@@ -130,8 +130,11 @@ int ipcalc_main(int argc UNUSED_PARAM, char **argv)
130#define ipaddr (s_ipaddr.s_addr) 130#define ipaddr (s_ipaddr.s_addr)
131 char *ipstr; 131 char *ipstr;
132 132
133 opt_complementary = "-1:?2"; /* minimum 1 arg, maximum 2 args */ 133 opt = GETOPT32(argv, "^"
134 opt = GETOPT32(argv, "mbn" IF_FEATURE_IPCALC_FANCY("phs") LONGOPTS); 134 "mbn" IF_FEATURE_IPCALC_FANCY("phs")
135 "\0" "-1:?2"/*min 1, max 2 args*/
136 LONGOPTS
137 );
135 argv += optind; 138 argv += optind;
136 if (opt & SILENT) 139 if (opt & SILENT)
137 logmode = LOGMODE_NONE; /* suppress error_msg() output */ 140 logmode = LOGMODE_NONE; /* suppress error_msg() output */
diff --git a/networking/nc_bloaty.c b/networking/nc_bloaty.c
index 3db784982..64098648a 100644
--- a/networking/nc_bloaty.c
+++ b/networking/nc_bloaty.c
@@ -787,11 +787,15 @@ int nc_main(int argc UNUSED_PARAM, char **argv)
787 e_found: 787 e_found:
788 788
789 // -g -G -t -r deleted, unimplemented -a deleted too 789 // -g -G -t -r deleted, unimplemented -a deleted too
790 opt_complementary = "?2:vv:ll"; /* max 2 params; -v and -l are counters; -w N */ 790 getopt32(argv, "^"
791 getopt32(argv, "np:s:uvw:+" IF_NC_SERVER("lk") 791 "np:s:uvw:+"/* -w N */ IF_NC_SERVER("lk")
792 IF_NC_EXTRA("i:o:z"), 792 IF_NC_EXTRA("i:o:z")
793 &str_p, &str_s, &o_wait 793 "\0"
794 IF_NC_EXTRA(, &str_i, &str_o), &o_verbose IF_NC_SERVER(, &cnt_l)); 794 "?2:vv:ll", /* max 2 params; -v and -l are counters */
795 &str_p, &str_s, &o_wait
796 IF_NC_EXTRA(, &str_i, &str_o)
797 , &o_verbose IF_NC_SERVER(, &cnt_l)
798 );
795 argv += optind; 799 argv += optind;
796#if ENABLE_NC_EXTRA 800#if ENABLE_NC_EXTRA
797 if (option_mask32 & OPT_i) /* line-interval time */ 801 if (option_mask32 & OPT_i) /* line-interval time */
diff --git a/networking/ntpd.c b/networking/ntpd.c
index f21f9513d..25fa44389 100644
--- a/networking/ntpd.c
+++ b/networking/ntpd.c
@@ -2230,15 +2230,16 @@ static NOINLINE void ntp_init(char **argv)
2230 2230
2231 /* Parse options */ 2231 /* Parse options */
2232 peers = NULL; 2232 peers = NULL;
2233 opt_complementary = "dd:wn" /* -d: counter; -p: list; -w implies -n */ 2233 opts = getopt32(argv, "^"
2234 IF_FEATURE_NTPD_SERVER(":Il"); /* -I implies -l */
2235 opts = getopt32(argv,
2236 "nqNx" /* compat */ 2234 "nqNx" /* compat */
2237 "wp:*S:"IF_FEATURE_NTPD_SERVER("l") /* NOT compat */ 2235 "wp:*S:"IF_FEATURE_NTPD_SERVER("l") /* NOT compat */
2238 IF_FEATURE_NTPD_SERVER("I:") /* compat */ 2236 IF_FEATURE_NTPD_SERVER("I:") /* compat */
2239 "d" /* compat */ 2237 "d" /* compat */
2240 "46aAbgL", /* compat, ignored */ 2238 "46aAbgL", /* compat, ignored */
2241 &peers, &G.script_name, 2239 "\0"
2240 "dd:wn" /* -d: counter; -p: list; -w implies -n */
2241 IF_FEATURE_NTPD_SERVER(":Il") /* -I implies -l */
2242 , &peers, &G.script_name,
2242#if ENABLE_FEATURE_NTPD_SERVER 2243#if ENABLE_FEATURE_NTPD_SERVER
2243 &G.if_name, 2244 &G.if_name,
2244#endif 2245#endif
diff --git a/networking/ping.c b/networking/ping.c
index 2e8bef023..7460e4414 100644
--- a/networking/ping.c
+++ b/networking/ping.c
@@ -340,7 +340,8 @@ static int common_ping_main(sa_family_t af, char **argv)
340 340
341/* Full(er) version */ 341/* Full(er) version */
342 342
343#define OPT_STRING ("qvc:+s:t:+w:+W:+I:np:4" IF_PING6("6")) 343/* -c NUM, -t NUM, -w NUM, -W NUM */
344#define OPT_STRING "qvc:+s:t:+w:+W:+I:np:4"IF_PING6("6")
344enum { 345enum {
345 OPT_QUIET = 1 << 0, 346 OPT_QUIET = 1 << 0,
346 OPT_VERBOSE = 1 << 1, 347 OPT_VERBOSE = 1 << 1,
@@ -863,9 +864,12 @@ static int common_ping_main(int opt, char **argv)
863 864
864 INIT_G(); 865 INIT_G();
865 866
866 /* exactly one argument needed; -v and -q don't mix; -c NUM, -t NUM, -w NUM, -W NUM */ 867 opt |= getopt32(argv, "^"
867 opt_complementary = "=1:q--v:v--q"; 868 OPT_STRING
868 opt |= getopt32(argv, OPT_STRING, &pingcount, &str_s, &opt_ttl, &deadline, &timeout, &str_I, &str_p); 869 /* exactly one arg; -v and -q don't mix */
870 "\0" "=1:q--v:v--q",
871 &pingcount, &str_s, &opt_ttl, &deadline, &timeout, &str_I, &str_p
872 );
869 if (opt & OPT_s) 873 if (opt & OPT_s)
870 datalen = xatou16(str_s); // -s 874 datalen = xatou16(str_s); // -s
871 if (opt & OPT_I) { // -I 875 if (opt & OPT_I) { // -I
diff --git a/networking/pscan.c b/networking/pscan.c
index 17985d2c8..95b0a937d 100644
--- a/networking/pscan.c
+++ b/networking/pscan.c
@@ -75,8 +75,11 @@ int pscan_main(int argc UNUSED_PARAM, char **argv)
75 unsigned rtt_4; 75 unsigned rtt_4;
76 unsigned start, diff; 76 unsigned start, diff;
77 77
78 opt_complementary = "=1"; /* exactly one non-option */ 78 opt = getopt32(argv, "^"
79 opt = getopt32(argv, "cbp:P:t:T:", &opt_min_port, &opt_max_port, &opt_timeout, &opt_min_rtt); 79 "cbp:P:t:T:"
80 "\0" "=1", /* exactly one non-option */
81 &opt_min_port, &opt_max_port, &opt_timeout, &opt_min_rtt
82 );
80 argv += optind; 83 argv += optind;
81 max_port = xatou_range(opt_max_port, 1, 65535); 84 max_port = xatou_range(opt_max_port, 1, 65535);
82 port = xatou_range(opt_min_port, 1, max_port); 85 port = xatou_range(opt_min_port, 1, max_port);
diff --git a/networking/slattach.c b/networking/slattach.c
index d4659a314..e0a388926 100644
--- a/networking/slattach.c
+++ b/networking/slattach.c
@@ -128,8 +128,9 @@ int slattach_main(int argc UNUSED_PARAM, char **argv)
128 INIT_G(); 128 INIT_G();
129 129
130 /* Parse command line options */ 130 /* Parse command line options */
131 opt_complementary = "=1"; 131 opt = getopt32(argv, "^" "p:s:c:ehmLF" "\0" "=1",
132 opt = getopt32(argv, "p:s:c:ehmLF", &proto, &baud_str, &extcmd); 132 &proto, &baud_str, &extcmd
133 );
133 /*argc -= optind;*/ 134 /*argc -= optind;*/
134 argv += optind; 135 argv += optind;
135 136
diff --git a/networking/tcpudp.c b/networking/tcpudp.c
index 270325164..d4c69e0f7 100644
--- a/networking/tcpudp.c
+++ b/networking/tcpudp.c
@@ -269,10 +269,11 @@ int tcpudpsvd_main(int argc UNUSED_PARAM, char **argv)
269 269
270 tcp = (applet_name[0] == 't'); 270 tcp = (applet_name[0] == 't');
271 271
272 /* 3+ args, -i at most once, -p implies -h, -v is counter, -b N, -c N */
273 opt_complementary = "-3:i--i:ph:vv";
274#ifdef SSLSVD 272#ifdef SSLSVD
275 opts = getopt32(argv, "+c:+C:i:x:u:l:Eb:+hpt:vU:/:Z:K:", 273 opts = getopt32(argv, "^+"
274 "c:+C:i:x:u:l:Eb:+hpt:vU:/:Z:K:" /* -c NUM, -b NUM */
275 /* 3+ args, -i at most once, -p implies -h, -v is a counter */
276 "\0" "-3:i--i:ph:vv",
276 &cmax, &str_C, &instructs, &instructs, &user, &preset_local_hostname, 277 &cmax, &str_C, &instructs, &instructs, &user, &preset_local_hostname,
277 &backlog, &str_t, &ssluser, &root, &cert, &key, &verbose 278 &backlog, &str_t, &ssluser, &root, &cert, &key, &verbose
278 ); 279 );
diff --git a/networking/telnetd.c b/networking/telnetd.c
index 16c572e8d..a6bafa21d 100644
--- a/networking/telnetd.c
+++ b/networking/telnetd.c
@@ -659,13 +659,15 @@ int telnetd_main(int argc UNUSED_PARAM, char **argv)
659#endif 659#endif
660 INIT_G(); 660 INIT_G();
661 661
662 /* -w NUM, and implies -F. -w and -i don't mix */
663 IF_FEATURE_TELNETD_INETD_WAIT(opt_complementary = "wF:i--w:w--i";)
664 /* Even if !STANDALONE, we accept (and ignore) -i, thus people 662 /* Even if !STANDALONE, we accept (and ignore) -i, thus people
665 * don't need to guess whether it's ok to pass -i to us */ 663 * don't need to guess whether it's ok to pass -i to us */
666 opt = getopt32(argv, "f:l:Ki" 664 opt = getopt32(argv, "^"
665 "f:l:Ki"
667 IF_FEATURE_TELNETD_STANDALONE("p:b:F") 666 IF_FEATURE_TELNETD_STANDALONE("p:b:F")
668 IF_FEATURE_TELNETD_INETD_WAIT("Sw:+"), 667 IF_FEATURE_TELNETD_INETD_WAIT("Sw:+") /* -w NUM */
668 "\0"
669 /* -w implies -F. -w and -i don't mix */
670 IF_FEATURE_TELNETD_INETD_WAIT("wF:i--w:w--i"),
669 &G.issuefile, &G.loginpath 671 &G.issuefile, &G.loginpath
670 IF_FEATURE_TELNETD_STANDALONE(, &opt_portnbr, &opt_bindaddr) 672 IF_FEATURE_TELNETD_STANDALONE(, &opt_portnbr, &opt_bindaddr)
671 IF_FEATURE_TELNETD_INETD_WAIT(, &sec_linger) 673 IF_FEATURE_TELNETD_INETD_WAIT(, &sec_linger)
diff --git a/networking/tftp.c b/networking/tftp.c
index 5baa80448..73a9829aa 100644
--- a/networking/tftp.c
+++ b/networking/tftp.c
@@ -761,15 +761,16 @@ int tftp_main(int argc UNUSED_PARAM, char **argv)
761 761
762 INIT_G(); 762 INIT_G();
763 763
764 /* -p or -g is mandatory, and they are mutually exclusive */ 764 IF_GETPUT(opt =) getopt32(argv, "^"
765 opt_complementary = "" IF_FEATURE_TFTP_GET("g:") IF_FEATURE_TFTP_PUT("p:")
766 IF_GETPUT("g--p:p--g:");
767
768 IF_GETPUT(opt =) getopt32(argv,
769 IF_FEATURE_TFTP_GET("g") IF_FEATURE_TFTP_PUT("p") 765 IF_FEATURE_TFTP_GET("g") IF_FEATURE_TFTP_PUT("p")
770 "l:r:" IF_FEATURE_TFTP_BLOCKSIZE("b:"), 766 "l:r:" IF_FEATURE_TFTP_BLOCKSIZE("b:")
767 "\0"
768 /* -p or -g is mandatory, and they are mutually exclusive */
769 IF_FEATURE_TFTP_GET("g:") IF_FEATURE_TFTP_PUT("p:")
770 IF_GETPUT("g--p:p--g:"),
771 &local_file, &remote_file 771 &local_file, &remote_file
772 IF_FEATURE_TFTP_BLOCKSIZE(, &blksize_str)); 772 IF_FEATURE_TFTP_BLOCKSIZE(, &blksize_str)
773 );
773 argv += optind; 774 argv += optind;
774 775
775# if ENABLE_FEATURE_TFTP_BLOCKSIZE 776# if ENABLE_FEATURE_TFTP_BLOCKSIZE
diff --git a/networking/traceroute.c b/networking/traceroute.c
index d9c62f7f9..8b6247482 100644
--- a/networking/traceroute.c
+++ b/networking/traceroute.c
@@ -833,9 +833,9 @@ common_traceroute_main(int op, char **argv)
833 833
834 INIT_G(); 834 INIT_G();
835 835
836 /* minimum 1 arg */ 836 op |= getopt32(argv, "^"
837 opt_complementary = "-1:x-x"; 837 OPT_STRING
838 op |= getopt32(argv, OPT_STRING 838 "\0" "-1:x-x" /* minimum 1 arg */
839 , &tos_str, &device, &max_ttl_str, &port_str, &nprobes_str 839 , &tos_str, &device, &max_ttl_str, &port_str, &nprobes_str
840 , &source, &waittime_str, &pausemsecs_str, &first_ttl_str 840 , &source, &waittime_str, &pausemsecs_str, &first_ttl_str
841 ); 841 );
diff --git a/networking/tunctl.c b/networking/tunctl.c
index 4c3220025..f2dc645a1 100644
--- a/networking/tunctl.c
+++ b/networking/tunctl.c
@@ -83,10 +83,13 @@ int tunctl_main(int argc UNUSED_PARAM, char **argv)
83#endif 83#endif
84 }; 84 };
85 85
86 opt_complementary = "=0:t--d:d--t"; // no arguments; t ^ d 86 opts = getopt32(argv, "^"
87 opts = getopt32(argv, "f:t:d:" IF_FEATURE_TUNCTL_UG("u:g:b"), 87 "f:t:d:" IF_FEATURE_TUNCTL_UG("u:g:b")
88 "\0"
89 "=0:t--d:d--t", // no arguments; t ^ d
88 &opt_device, &opt_name, &opt_name 90 &opt_device, &opt_name, &opt_name
89 IF_FEATURE_TUNCTL_UG(, &opt_user, &opt_group)); 91 IF_FEATURE_TUNCTL_UG(, &opt_user, &opt_group)
92 );
90 93
91 // select device 94 // select device
92 memset(&ifr, 0, sizeof(ifr)); 95 memset(&ifr, 0, sizeof(ifr));
@@ -153,9 +156,12 @@ int tunctl_main(int argc UNUSED_PARAM, char **argv)
153 OPT_d = 1 << 2, // delete named interface 156 OPT_d = 1 << 2, // delete named interface
154 }; 157 };
155 158
156 opt_complementary = "=0:t--d:d--t"; // no arguments; t ^ d 159 opts = getopt32(argv, "^"
157 opts = getopt32(argv, "f:t:d:u:g:b", // u, g, b accepted and ignored 160 "f:t:d:u:g:b" // u, g, b accepted and ignored
158 &opt_device, &opt_name, &opt_name, NULL, NULL); 161 "\0"
162 "=0:t--d:d--t", // no arguments; t ^ d
163 &opt_device, &opt_name, &opt_name, NULL, NULL
164 );
159 165
160 // set interface name 166 // set interface name
161 memset(&ifr, 0, sizeof(ifr)); 167 memset(&ifr, 0, sizeof(ifr));
diff --git a/networking/udhcp/d6_dhcpc.c b/networking/udhcp/d6_dhcpc.c
index 84969aa81..849ca1388 100644
--- a/networking/udhcp/d6_dhcpc.c
+++ b/networking/udhcp/d6_dhcpc.c
@@ -1101,13 +1101,14 @@ int udhcpc6_main(int argc UNUSED_PARAM, char **argv)
1101 client_config.script = CONFIG_UDHCPC_DEFAULT_SCRIPT; 1101 client_config.script = CONFIG_UDHCPC_DEFAULT_SCRIPT;
1102 1102
1103 /* Parse command line */ 1103 /* Parse command line */
1104 /* O,x: list; -T,-t,-A take numeric param */ 1104 opt = getopt32long(argv, "^"
1105 IF_UDHCP_VERBOSE(opt_complementary = "vv";) 1105 /* O,x: list; -T,-t,-A take numeric param */
1106 opt = getopt32long(argv, "i:np:qRr:s:T:+t:+SA:+O:*ox:*f" 1106 "i:np:qRr:s:T:+t:+SA:+O:*ox:*f"
1107 USE_FOR_MMU("b") 1107 USE_FOR_MMU("b")
1108 ///IF_FEATURE_UDHCPC_ARPING("a") 1108 ///IF_FEATURE_UDHCPC_ARPING("a")
1109 IF_FEATURE_UDHCP_PORT("P:") 1109 IF_FEATURE_UDHCP_PORT("P:")
1110 "v" 1110 "v"
1111 "\0" IF_UDHCP_VERBOSE("vv") /* -v is a counter */
1111 , udhcpc6_longopts 1112 , udhcpc6_longopts
1112 , &client_config.interface, &client_config.pidfile, &str_r /* i,p */ 1113 , &client_config.interface, &client_config.pidfile, &str_r /* i,p */
1113 , &client_config.script /* s */ 1114 , &client_config.script /* s */
diff --git a/networking/udhcp/dhcpc.c b/networking/udhcp/dhcpc.c
index 5f87f8586..55e0400b9 100644
--- a/networking/udhcp/dhcpc.c
+++ b/networking/udhcp/dhcpc.c
@@ -1295,16 +1295,18 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
1295 str_V = "udhcp "BB_VER; 1295 str_V = "udhcp "BB_VER;
1296 1296
1297 /* Parse command line */ 1297 /* Parse command line */
1298 /* O,x: list; -T,-t,-A take numeric param */ 1298 opt = getopt32long(argv, "^"
1299 IF_UDHCP_VERBOSE(opt_complementary = "vv";) 1299 /* O,x: list; -T,-t,-A take numeric param */
1300 opt = getopt32long(argv, "CV:H:h:F:i:np:qRr:s:T:+t:+SA:+O:*ox:*fB" 1300 "CV:H:h:F:i:np:qRr:s:T:+t:+SA:+O:*ox:*fB"
1301 USE_FOR_MMU("b") 1301 USE_FOR_MMU("b")
1302 IF_FEATURE_UDHCPC_ARPING("a::") 1302 IF_FEATURE_UDHCPC_ARPING("a::")
1303 IF_FEATURE_UDHCP_PORT("P:") 1303 IF_FEATURE_UDHCP_PORT("P:")
1304 "v" 1304 "v"
1305 "\0" IF_UDHCP_VERBOSE("vv") /* -v is a counter */
1305 , udhcpc_longopts 1306 , udhcpc_longopts
1306 , &str_V, &str_h, &str_h, &str_F 1307 , &str_V, &str_h, &str_h, &str_F
1307 , &client_config.interface, &client_config.pidfile, &str_r /* i,p */ 1308 , &client_config.interface, &client_config.pidfile /* i,p */
1309 , &str_r /* r */
1308 , &client_config.script /* s */ 1310 , &client_config.script /* s */
1309 , &discover_timeout, &discover_retries, &tryagain_timeout /* T,t,A */ 1311 , &discover_timeout, &discover_retries, &tryagain_timeout /* T,t,A */
1310 , &list_O 1312 , &list_O
diff --git a/networking/udhcp/dhcpd.c b/networking/udhcp/dhcpd.c
index 3a5fc2db7..05ddc8649 100644
--- a/networking/udhcp/dhcpd.c
+++ b/networking/udhcp/dhcpd.c
@@ -814,11 +814,12 @@ int udhcpd_main(int argc UNUSED_PARAM, char **argv)
814 IF_FEATURE_UDHCP_PORT(SERVER_PORT = 67;) 814 IF_FEATURE_UDHCP_PORT(SERVER_PORT = 67;)
815 IF_FEATURE_UDHCP_PORT(CLIENT_PORT = 68;) 815 IF_FEATURE_UDHCP_PORT(CLIENT_PORT = 68;)
816 816
817 opt = getopt32(argv, "^"
818 "fSI:va:"IF_FEATURE_UDHCP_PORT("P:")
819 "\0"
817#if defined CONFIG_UDHCP_DEBUG && CONFIG_UDHCP_DEBUG >= 1 820#if defined CONFIG_UDHCP_DEBUG && CONFIG_UDHCP_DEBUG >= 1
818 opt_complementary = "vv"; 821 "vv"
819#endif 822#endif
820 opt = getopt32(argv, "fSI:va:"
821 IF_FEATURE_UDHCP_PORT("P:")
822 , &str_I 823 , &str_I
823 , &str_a 824 , &str_a
824 IF_FEATURE_UDHCP_PORT(, &str_P) 825 IF_FEATURE_UDHCP_PORT(, &str_P)
diff --git a/networking/udhcp/dumpleases.c b/networking/udhcp/dumpleases.c
index fb1860ff6..70d2d1434 100644
--- a/networking/udhcp/dumpleases.c
+++ b/networking/udhcp/dumpleases.c
@@ -54,8 +54,12 @@ int dumpleases_main(int argc UNUSED_PARAM, char **argv)
54#endif 54#endif
55 init_unicode(); 55 init_unicode();
56 56
57 opt_complementary = "=0:a--r:r--a"; 57 opt = getopt32long(argv, "^"
58 opt = getopt32long(argv, "arf:d", dumpleases_longopts, &file); 58 "arf:d"
59 "\0" "=0:a--r:r--a",
60 dumpleases_longopts,
61 &file
62 );
59 63
60 fd = xopen(file, O_RDONLY); 64 fd = xopen(file, O_RDONLY);
61 65
diff --git a/networking/wget.c b/networking/wget.c
index b661f727b..e1b40d3fd 100644
--- a/networking/wget.c
+++ b/networking/wget.c
@@ -1387,9 +1387,8 @@ IF_DESKTOP( "no-parent\0" No_argument "\xf0")
1387 1387
1388#if ENABLE_FEATURE_WGET_LONG_OPTIONS 1388#if ENABLE_FEATURE_WGET_LONG_OPTIONS
1389#endif 1389#endif
1390 opt_complementary = "-1" /* at least one URL */ 1390 GETOPT32(argv, "^"
1391 IF_FEATURE_WGET_LONG_OPTIONS(":\xff::"); /* --header is a list */ 1391 "cqSO:P:Y:U:T:+"
1392 GETOPT32(argv, "cqSO:P:Y:U:T:+"
1393 /*ignored:*/ "t:" 1392 /*ignored:*/ "t:"
1394 /*ignored:*/ "n::" 1393 /*ignored:*/ "n::"
1395 /* wget has exactly four -n<letter> opts, all of which we can ignore: 1394 /* wget has exactly four -n<letter> opts, all of which we can ignore:
@@ -1400,6 +1399,9 @@ IF_DESKTOP( "no-parent\0" No_argument "\xf0")
1400 * "n::" above says that we accept -n[ARG]. 1399 * "n::" above says that we accept -n[ARG].
1401 * Specifying "n:" would be a bug: "-n ARG" would eat ARG! 1400 * Specifying "n:" would be a bug: "-n ARG" would eat ARG!
1402 */ 1401 */
1402 "\0"
1403 "-1" /* at least one URL */
1404 IF_FEATURE_WGET_LONG_OPTIONS(":\xff::") /* --header is a list */
1403 LONGOPTS 1405 LONGOPTS
1404 , &G.fname_out, &G.dir_prefix, 1406 , &G.fname_out, &G.dir_prefix,
1405 &G.proxy_flag, &G.user_agent, 1407 &G.proxy_flag, &G.user_agent,
diff --git a/networking/whois.c b/networking/whois.c
index 0cb7e5411..fd1cdf43e 100644
--- a/networking/whois.c
+++ b/networking/whois.c
@@ -167,8 +167,7 @@ int whois_main(int argc UNUSED_PARAM, char **argv)
167 int port = 43; 167 int port = 43;
168 const char *host = "whois.iana.org"; 168 const char *host = "whois.iana.org";
169 169
170 opt_complementary = "-1"; 170 getopt32(argv, "^" "ih:p:+" "\0" "-1", &host, &port);
171 getopt32(argv, "ih:p:+", &host, &port);
172 argv += optind; 171 argv += optind;
173 172
174 do { 173 do {
diff --git a/networking/zcip.c b/networking/zcip.c
index 94174a165..55440285f 100644
--- a/networking/zcip.c
+++ b/networking/zcip.c
@@ -253,8 +253,9 @@ int zcip_main(int argc UNUSED_PARAM, char **argv)
253#define QUIT (opts & 2) 253#define QUIT (opts & 2)
254 // Parse commandline: prog [options] ifname script 254 // Parse commandline: prog [options] ifname script
255 // exactly 2 args; -v accumulates and implies -f 255 // exactly 2 args; -v accumulates and implies -f
256 opt_complementary = "=2:vv:vf"; 256 opts = getopt32(argv, "^" "fqr:l:v" "\0" "=2:vv:vf",
257 opts = getopt32(argv, "fqr:l:v", &r_opt, &l_opt, &verbose); 257 &r_opt, &l_opt, &verbose
258 );
258#if !BB_MMU 259#if !BB_MMU
259 // on NOMMU reexec early (or else we will rerun things twice) 260 // on NOMMU reexec early (or else we will rerun things twice)
260 if (!FOREGROUND) 261 if (!FOREGROUND)