From: Roy Marples Date: Sat, 18 Oct 2008 23:44:00 +0000 (+0000) Subject: Fix obtaining netmask on NetBSD. X-Git-Tag: v5.0.0~210 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=34bf905984347f0f73a3d237408a943ce50086b1;p=thirdparty%2Fdhcpcd.git Fix obtaining netmask on NetBSD. --- diff --git a/net.c b/net.c index 4502a3a5..1d8e1055 100644 --- a/net.c +++ b/net.c @@ -285,6 +285,7 @@ do_interface(const char *ifname, char *p, *e; in_addr_t address, netmask; struct ifreq *ifr; + struct sockaddr_in *sin; if ((s = socket(AF_INET, SOCK_DGRAM, 0)) == -1) return -1; @@ -312,7 +313,7 @@ do_interface(const char *ifname, len *= 2; } - e = ifc.ifc_buf + ifc.ifc_len; + e = (char *)ifc.ifc_buf + ifc.ifc_len; for (p = ifc.ifc_buf; p < e;) { ifr = (struct ifreq *)p; @@ -336,12 +337,14 @@ do_interface(const char *ifname, } if (ifr->ifr_addr.sa_family == AF_INET && addr) { - address = ((struct sockaddr_in *)&ifr->ifr_addr) - ->sin_addr.s_addr; + sin = (struct sockaddr_in *)&ifr->ifr_addr; + address = sin->sin_addr.s_addr; + /* Some platforms only partially fill the bits + * set by the netmask, so we need to zero it now. */ + sin->sin_addr.s_addr = 0; if (ioctl(s, SIOCGIFNETMASK, ifr) == -1) continue; - netmask = ((struct sockaddr_in *)&ifr->ifr_addr) - ->sin_addr.s_addr; + netmask = sin->sin_addr.s_addr; if (act == 1) { addr->s_addr = address; net->s_addr = netmask;