X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=networking%2Fipcalc.c;h=3c8b8bfc910026c270161fd829178d61f7c623f6;hb=71045cc819cc2a3c7e20bf7aba5cfeb8acfd9dad;hp=78558495ece4d48f85ecf7544504be7e39475578;hpb=12ca080a1ca8dfd0aeac54485451b906a7e61b16;p=oweals%2Fbusybox.git diff --git a/networking/ipcalc.c b/networking/ipcalc.c index 78558495e..3c8b8bfc9 100644 --- a/networking/ipcalc.c +++ b/networking/ipcalc.c @@ -9,17 +9,41 @@ * from Red Hat. I didn't look at their source code, but there * is no denying that this is a loving reimplementation * - * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. + * Licensed under GPLv2 or later, see file LICENSE in this source tree. */ -#include -#include +//usage:#define ipcalc_trivial_usage +//usage: "[OPTIONS] ADDRESS[[/]NETMASK] [NETMASK]" +//usage:#define ipcalc_full_usage "\n\n" +//usage: "Calculate IP network settings from a IP address\n" +//usage: IF_FEATURE_IPCALC_LONG_OPTIONS( +//usage: "\n -b,--broadcast Display calculated broadcast address" +//usage: "\n -n,--network Display calculated network address" +//usage: "\n -m,--netmask Display default netmask for IP" +//usage: IF_FEATURE_IPCALC_FANCY( +//usage: "\n -p,--prefix Display the prefix for IP/NETMASK" +//usage: "\n -h,--hostname Display first resolved host name" +//usage: "\n -s,--silent Don't ever display error messages" +//usage: ) +//usage: ) +//usage: IF_NOT_FEATURE_IPCALC_LONG_OPTIONS( +//usage: "\n -b Display calculated broadcast address" +//usage: "\n -n Display calculated network address" +//usage: "\n -m Display default netmask for IP" +//usage: IF_FEATURE_IPCALC_FANCY( +//usage: "\n -p Display the prefix for IP/NETMASK" +//usage: "\n -h Display first resolved host name" +//usage: "\n -s Don't ever display error messages" +//usage: ) +//usage: ) #include "libbb.h" +/* After libbb.h, because on some systems it needs other includes */ +#include -#define CLASS_A_NETMASK ntohl(0xFF000000) -#define CLASS_B_NETMASK ntohl(0xFFFF0000) -#define CLASS_C_NETMASK ntohl(0xFFFFFF00) +#define CLASS_A_NETMASK ntohl(0xFF000000) +#define CLASS_B_NETMASK ntohl(0xFFFF0000) +#define CLASS_C_NETMASK ntohl(0xFFFFFF00) static unsigned long get_netmask(unsigned long ipaddr) { @@ -63,13 +87,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 +116,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(); }