X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;ds=sidebyside;f=networking%2Fipcalc.c;h=c5f2ba121ec4520b5f90d380c30dfc5cc2d4c9cc;hb=1b751c894b520846af8575d09187ce342e88778c;hp=9578c8266ab2ab2cb86180741366215e8742ea15;hpb=530ea42abc7512bcd9738a4fcef7d97c2039f82a;p=oweals%2Fbusybox.git diff --git a/networking/ipcalc.c b/networking/ipcalc.c index 9578c8266..c5f2ba121 100644 --- a/networking/ipcalc.c +++ b/networking/ipcalc.c @@ -5,8 +5,8 @@ * By Jordan Crouse * Stephan Linz * - * This is a complete reimplentation of the ipcalc program - * from Redhat. I didn't look at their source code, but there + * This is a complete reimplementation of the ipcalc program + * from Red Hat. I didn't look at their source code, but there * is no denying that this is a loving reimplementation */ @@ -43,17 +43,16 @@ static unsigned long get_netmask(unsigned long ipaddr) #ifdef CONFIG_FEATURE_IPCALC_FANCY static int get_prefix(unsigned long netmask) { - unsigned long t; - int ret = 0; - - for (t = 0; t < 32; t++) { - if (htonl(netmask) & (0x80000000 >> t)) { - ret ++; - } else { - break; - } - } - return ret; + unsigned long msk = 0x80000000; + int ret = 0; + + netmask = htonl(netmask); + while(msk) { + if (netmask & msk) + ret++; + msk >>= 1; + } + return ret; } #endif @@ -62,16 +61,18 @@ static int get_prefix(unsigned long netmask) #define NETWORK 0x04 #define NETPREFIX 0x08 #define HOSTNAME 0x10 -#define SILENT 0x80 +#define SILENT 0x20 + int ipcalc_main(int argc, char **argv) { unsigned long mode; - unsigned long netmask = 0; - unsigned long broadcast; - unsigned long network; - unsigned long ipaddr; + in_addr_t netmask; + in_addr_t broadcast; + in_addr_t network; + in_addr_t ipaddr; + struct in_addr a; #ifdef CONFIG_FEATURE_IPCALC_FANCY unsigned long netprefix = 0; @@ -80,13 +81,13 @@ int ipcalc_main(int argc, char **argv) #endif static const struct option long_options[] = { - {"netmask", no_argument, NULL, 'm'}, - {"broadcast", no_argument, NULL, 'b'}, - {"network", no_argument, NULL, 'n'}, + {"netmask", no_argument, NULL, 'm'}, + {"broadcast", no_argument, NULL, 'b'}, + {"network", no_argument, NULL, 'n'}, #ifdef CONFIG_FEATURE_IPCALC_FANCY - {"prefix", no_argument, NULL, 'p'}, - {"hostname", no_argument, NULL, 'h'}, - {"silent", no_argument, NULL, 's'}, + {"prefix", no_argument, NULL, 'p'}, + {"hostname", no_argument, NULL, 'h'}, + {"silent", no_argument, NULL, 's'}, #endif {NULL, 0, NULL, 0} }; @@ -94,79 +95,84 @@ int ipcalc_main(int argc, char **argv) bb_applet_long_options = long_options; mode = bb_getopt_ulflags(argc, argv, #ifdef CONFIG_FEATURE_IPCALC_FANCY - "mbnphs"); + "mbnphs" #else - "mbn"); + "mbn" #endif + ); + + argc -= optind; + argv += optind; if (mode & (BROADCAST | NETWORK | NETPREFIX)) { - if (argc - optind > 2) { + if (argc > 2 || argc <= 0) bb_show_usage(); - } } else { - if (argc - optind != 1) { + if (argc != 1) bb_show_usage(); - } } #ifdef CONFIG_FEATURE_IPCALC_FANCY - prefixstr = ipstr = argv[optind]; - - while(*prefixstr) { - if (*prefixstr == '/') { - *prefixstr = (char)0; - prefixstr++; - if (*prefixstr) { - netprefix = atol(prefixstr); - if (netprefix > 32) { - IPCALC_MSG(bb_error_msg_and_die("bad IP prefix: %s\n", prefixstr), - exit(EXIT_FAILURE)); - } - if (netprefix) { - netmask = 0x80000000; - netprefix--; - while(netprefix) { - netmask = 0x80000000 | (netmask >> 1); - netprefix--; - } - netmask = htonl(netmask); - } - /* Even if it was 0, we will signify that we have a netmask. This allows */ - /* for specification of default routes, etc which have a 0 netmask/prefix */ - have_netmask = 1; - } - break; - } - prefixstr++; - } - ipaddr = inet_addr(ipstr); + prefixstr = ipstr = argv[0]; + + while(*prefixstr) { + if (*prefixstr == '/') { + *prefixstr = (char)0; + prefixstr++; + if (*prefixstr) { + unsigned int msk; + + if (safe_strtoul(prefixstr, &netprefix) || netprefix > 32) { + IPCALC_MSG(bb_error_msg_and_die("bad IP prefix: %s\n", prefixstr), + exit(EXIT_FAILURE)); + } + netmask = 0; + msk = 0x80000000; + while (netprefix > 0) { + netmask |= msk; + msk >>= 1; + netprefix--; + } + netmask = htonl(netmask); + /* Even if it was 0, we will signify that we have a netmask. This allows */ + /* for specification of default routes, etc which have a 0 netmask/prefix */ + have_netmask = 1; + } + break; + } + prefixstr++; + } + ipaddr = inet_aton(ipstr, &a); #else - ipaddr = inet_addr(argv[optind]); + ipaddr = inet_aton(argv[0], &a); #endif - if (ipaddr == INADDR_NONE) { - IPCALC_MSG(bb_error_msg_and_die("bad IP address: %s", argv[optind]), - exit(EXIT_FAILURE)); + if (ipaddr == 0) { + IPCALC_MSG(bb_error_msg_and_die("bad IP address: %s", argv[0]), + exit(EXIT_FAILURE)); } + ipaddr = a.s_addr; - if (argc - optind == 2) { + if (argc == 2) { #ifdef CONFIG_FEATURE_IPCALC_FANCY - if (have_netmask == 1) { - IPCALC_MSG(bb_error_msg_and_die("Both prefix and netmask were specified, use one or the other.\n"), - exit(EXIT_FAILURE)); - } - have_netmask = 1; -#endif - netmask = inet_addr(argv[optind + 1]); - } + if (have_netmask) { + IPCALC_MSG(bb_error_msg_and_die("Both prefix and netmask were specified, use one or the other.\n"), + exit(EXIT_FAILURE)); + } - if (ipaddr == INADDR_NONE) { - IPCALC_MSG(bb_error_msg_and_die("bad netmask: %s", argv[optind + 1]), - exit(EXIT_FAILURE)); - } +#endif + netmask = inet_aton(argv[1], &a); + if (netmask == 0) { + IPCALC_MSG(bb_error_msg_and_die("bad netmask: %s", argv[1]), + exit(EXIT_FAILURE)); + } + netmask = a.s_addr; + } else { +#ifdef CONFIG_FEATURE_IPCALC_FANCY - /* JHC - If the netmask wasn't provided then calculate it */ - if (!netmask) { - netmask = get_netmask(ipaddr); + if (!have_netmask) +#endif + /* JHC - If the netmask wasn't provided then calculate it */ + netmask = get_netmask(ipaddr); } if (mode & NETMASK) { @@ -184,9 +190,9 @@ int ipcalc_main(int argc, char **argv) } #ifdef CONFIG_FEATURE_IPCALC_FANCY - if (mode & NETPREFIX) { - printf("PREFIX=%i\n", get_prefix(netmask)); - } + if (mode & NETPREFIX) { + printf("PREFIX=%i\n", get_prefix(netmask)); + } if (mode & HOSTNAME) { struct hostent *hostinfo; @@ -195,7 +201,7 @@ int ipcalc_main(int argc, char **argv) hostinfo = gethostbyaddr((char *) &ipaddr, sizeof(ipaddr), AF_INET); if (!hostinfo) { IPCALC_MSG(bb_herror_msg_and_die( - "cannot find hostname for %s", argv[optind]),); + "cannot find hostname for %s", argv[0]),); exit(EXIT_FAILURE); } for (x = 0; hostinfo->h_name[x]; x++) {