From 14092a1ed2369eead23fa9d642fd126b19564a27 Mon Sep 17 00:00:00 2001 From: Glenn L McGrath Date: Fri, 12 Sep 2003 00:44:50 +0000 Subject: Busybox CVS version ipcalc have problems: - Can`t use 255.255.255.255 address - typo: double check for valid ip address and uncheck for valid mask httpd unseted SERVER_PORT (my bug from last_patch111). last_patch_112 from Vladimir N. Oleynik --- networking/ipcalc.c | 53 +++++++++++++++++++++++++++++------------------------ 1 file changed, 29 insertions(+), 24 deletions(-) (limited to 'networking/ipcalc.c') diff --git a/networking/ipcalc.c b/networking/ipcalc.c index 171c49a26..2f1c02b7b 100644 --- a/networking/ipcalc.c +++ b/networking/ipcalc.c @@ -43,15 +43,14 @@ static unsigned long get_netmask(unsigned long ipaddr) #ifdef CONFIG_FEATURE_IPCALC_FANCY static int get_prefix(unsigned long netmask) { - unsigned long t; + unsigned long msk = 0x80000000; int ret = 0; - for (t = 0; t < 32; t++) { - if (htonl(netmask) & (0x80000000 >> t)) { - ret ++; - } else { - break; - } + netmask = htonl(netmask); + while(msk) { + if (netmask & msk) + ret++; + msk >>= 1; } return ret; } @@ -64,14 +63,16 @@ static int get_prefix(unsigned long netmask) #define HOSTNAME 0x10 #define SILENT 0x20 + int ipcalc_main(int argc, char **argv) { unsigned long mode; - unsigned long netmask = 0; + unsigned long netmask; unsigned long broadcast; unsigned long network; unsigned long ipaddr; + struct in_addr a; #ifdef CONFIG_FEATURE_IPCALC_FANCY unsigned long netprefix = 0; @@ -116,20 +117,21 @@ int ipcalc_main(int argc, char **argv) *prefixstr = (char)0; prefixstr++; if (*prefixstr) { + unsigned int msk; + 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); + 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; @@ -138,34 +140,37 @@ int ipcalc_main(int argc, char **argv) } prefixstr++; } - ipaddr = inet_addr(ipstr); + ipaddr = inet_aton(ipstr, &a); #else - ipaddr = inet_addr(argv[optind]); + ipaddr = inet_aton(argv[optind], &a); #endif - if (ipaddr == INADDR_NONE) { + if (ipaddr == 0) { IPCALC_MSG(bb_error_msg_and_die("bad IP address: %s", argv[optind]), exit(EXIT_FAILURE)); } + ipaddr = a.s_addr; if (argc - optind == 2) { #ifdef CONFIG_FEATURE_IPCALC_FANCY - if (have_netmask == 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)); } - have_netmask = 1; -#endif - netmask = inet_addr(argv[optind + 1]); - } - if (ipaddr == INADDR_NONE) { +#endif + netmask = inet_aton(argv[optind + 1], &a); + if (netmask == 0) { IPCALC_MSG(bb_error_msg_and_die("bad netmask: %s", argv[optind + 1]), exit(EXIT_FAILURE)); } + netmask = a.s_addr; + } else { +#ifdef CONFIG_FEATURE_IPCALC_FANCY + if (!have_netmask) +#endif /* JHC - If the netmask wasn't provided then calculate it */ - if (!netmask) { netmask = get_netmask(ipaddr); } -- cgit v1.2.3