summaryrefslogtreecommitdiffstats
path: root/net.c
diff options
context:
space:
mode:
authorRoy Marples <roy@marples.name>2008-10-18 23:28:49 +0000
committerRoy Marples <roy@marples.name>2008-10-18 23:28:49 +0000
commit159d2fcf4993252b99656febdead11b89b8701b7 (patch)
tree895d5ac191add8faa2da090d97988786d7908127 /net.c
parent9754dc73797d69cf999993af8f1f9f445d359ff4 (diff)
downloaddhcpcd-159d2fcf4993252b99656febdead11b89b8701b7.tar.xz
Fix up address and netmask detection. This *should* align fine.
Diffstat (limited to 'net.c')
-rw-r--r--net.c19
1 files changed, 8 insertions, 11 deletions
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;