diff options
author | Eric Andersen | 2003-07-05 07:59:30 +0000 |
---|---|---|
committer | Eric Andersen | 2003-07-05 07:59:30 +0000 |
commit | 7207b88d062ca3fe58370ef9976388c0023ff746 (patch) | |
tree | e9164acc8a39daebf9bd66d589faa3f1d1a2c071 /networking/ipcalc.c | |
parent | 65e20a33c20314da5dd33d6e9e2ec529d835bbfb (diff) | |
download | busybox-7207b88d062ca3fe58370ef9976388c0023ff746.zip busybox-7207b88d062ca3fe58370ef9976388c0023ff746.tar.gz |
Patch from Lars Kellogg-Stedman:
This patch fixes endian problems with get_netmask(). I don't know if
this is the cleanest solution, but it makes 'ipcalc -n' work on both
an i386 system and a ppc system.
Diffstat (limited to 'networking/ipcalc.c')
-rw-r--r-- | networking/ipcalc.c | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/networking/ipcalc.c b/networking/ipcalc.c index af4eed4..94b747e 100644 --- a/networking/ipcalc.c +++ b/networking/ipcalc.c @@ -22,15 +22,22 @@ #define IPCALC_MSG(CMD,ALTCMD) if (mode & SILENT) {ALTCMD;} else {CMD;} +#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) { - if (ipaddr & 0xC0) { - return 0x00FFFFFF; /* Class C */ - } - if (ipaddr & 0x10) { - return 0x0000FFFF; /* Class B */ - } - return 0x000000FF; /* Class A */ + ipaddr = htonl(ipaddr); + + if ((ipaddr & 0xC0000000) == 0xC0000000) + return CLASS_C_NETMASK; + else if ((ipaddr & 0x80000000) == 0x80000000) + return CLASS_B_NETMASK; + else if ((ipaddr & 0x80000000) == 0) + return CLASS_A_NETMASK; + else + return 0; } #define NETMASK 0x01 |