From: Roy Marples Date: Sat, 18 Oct 2008 23:28:49 +0000 (+0000) Subject: Fix up address and netmask detection. This *should* align fine. X-Git-Tag: v5.0.0~211 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=159d2fcf4993252b99656febdead11b89b8701b7;p=thirdparty%2Fdhcpcd.git Fix up address and netmask detection. This *should* align fine. --- diff --git a/net.c b/net.c index 6d269056..4502a3a5 100644 --- a/net.c +++ b/net.c @@ -282,11 +282,7 @@ do_interface(const char *ifname, int retval = 0, found = 0; int len = 10 * sizeof(struct ifreq); int lastlen = 0; - char *p; - union { - char *buffer; - struct ifreq *ifr; - } ifreqs; + char *p, *e; in_addr_t address, netmask; struct ifreq *ifr; @@ -316,10 +312,9 @@ do_interface(const char *ifname, len *= 2; } - for (p = (char *)ifc.ifc_buf; p < (char *)ifc.ifc_buf + ifc.ifc_len;) { - /* Cast the ifc buffer to an ifreq cleanly */ - ifreqs.buffer = p; - ifr = ifreqs.ifr; + e = ifc.ifc_buf + ifc.ifc_len; + for (p = ifc.ifc_buf; p < e;) { + ifr = (struct ifreq *)p; #ifndef __linux__ if (ifr->ifr_addr.sa_len > sizeof(ifr->ifr_ifru)) @@ -341,10 +336,12 @@ do_interface(const char *ifname, } if (ifr->ifr_addr.sa_family == AF_INET && addr) { - memcpy(&address, &ifr->ifr_addr, sizeof(address)); + address = ((struct sockaddr_in *)&ifr->ifr_addr) + ->sin_addr.s_addr; if (ioctl(s, SIOCGIFNETMASK, ifr) == -1) continue; - memcpy(&netmask, &ifr->ifr_addr, sizeof(netmask)); + netmask = ((struct sockaddr_in *)&ifr->ifr_addr) + ->sin_addr.s_addr; if (act == 1) { addr->s_addr = address; net->s_addr = netmask;