]> git.ipfire.org Git - thirdparty/dhcpcd.git/commitdiff
Fix up address and netmask detection. This *should* align fine.
authorRoy Marples <roy@marples.name>
Sat, 18 Oct 2008 23:28:49 +0000 (23:28 +0000)
committerRoy Marples <roy@marples.name>
Sat, 18 Oct 2008 23:28:49 +0000 (23:28 +0000)
net.c

diff --git a/net.c b/net.c
index 6d269056d65eaad18489c4056b5e47e4bb1d1c50..4502a3a5629c4af18caa910886484236649c9c7d 100644 (file)
--- 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;