ipcalc: more correct checking for proper number of arguments
authorSteve Bennett <steveb@workware.net.au>
Wed, 7 Apr 2010 17:16:12 +0000 (19:16 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Wed, 7 Apr 2010 17:16:12 +0000 (19:16 +0200)
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>
networking/ipcalc.c

index 78558495ece4d48f85ecf7544504be7e39475578..17b21635460117d8946586f314fcaa13e9f2bf1f 100644 (file)
@@ -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();
        }