diff options
author | Steve Bennett <steveb@workware.net.au> | 2010-04-07 19:16:12 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2010-04-07 19:16:12 +0200 |
commit | 823b636cd14d337ebb8766c5c181737fb3860b42 (patch) | |
tree | 0b7d3e55e5e84f5f3edce42d3cb9e03cec12c763 | |
parent | 39601843d70247a4c40f3810157a331fb8a7193b (diff) |
ipcalc: more correct checking for proper number of arguments
function old new delta
ipcalc_main 581 569 -12
Signed-off-by: Steve Bennett <steveb@workware.net.au>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r-- | networking/ipcalc.c | 23 |
1 files changed, 12 insertions, 11 deletions
diff --git a/networking/ipcalc.c b/networking/ipcalc.c index 78558495e..17b216354 100644 --- a/networking/ipcalc.c +++ b/networking/ipcalc.c @@ -63,13 +63,13 @@ int get_prefix(unsigned long netmask); #if ENABLE_FEATURE_IPCALC_LONG_OPTIONS static const char ipcalc_longopts[] ALIGN1 = - "netmask\0" No_argument "m" - "broadcast\0" No_argument "b" - "network\0" No_argument "n" + "netmask\0" No_argument "m" // netmask from IP (assuming complete class A, B, or C network) + "broadcast\0" No_argument "b" // broadcast from IP [netmask] + "network\0" No_argument "n" // network from IP [netmask] # if ENABLE_FEATURE_IPCALC_FANCY - "prefix\0" No_argument "p" - "hostname\0" No_argument "h" - "silent\0" No_argument "s" + "prefix\0" No_argument "p" // prefix from IP[/prefix] [netmask] + "hostname\0" No_argument "h" // hostname from IP + "silent\0" No_argument "s" // don’t ever display error messages # endif ; #endif @@ -92,15 +92,16 @@ int ipcalc_main(int argc UNUSED_PARAM, char **argv) #if ENABLE_FEATURE_IPCALC_LONG_OPTIONS applet_long_options = ipcalc_longopts; #endif + opt_complementary = "-1:?2"; /* minimum 1 arg, maximum 2 args */ opt = getopt32(argv, "mbn" IF_FEATURE_IPCALC_FANCY("phs")); argv += optind; if (opt & SILENT) logmode = LOGMODE_NONE; /* suppress error_msg() output */ - if (opt & (BROADCAST | NETWORK | NETPREFIX)) { - if (!argv[0] || !argv[1] || argv[2]) - bb_show_usage(); - } else { - if (!argv[0] || argv[1]) + opt &= ~SILENT; + if (!(opt & (BROADCAST | NETWORK | NETPREFIX))) { + /* if no options at all or + * (no broadcast,network,prefix) and (two args)... */ + if (!opt || argv[1]) bb_show_usage(); } |