diff options
author | Bernhard Rosenkraenzer <Bernhard.Rosenkranzer@linaro.org> | 2011-12-15 15:05:17 +0059 |
---|---|---|
committer | Bernhard Rosenkraenzer <Bernhard.Rosenkranzer@linaro.org> | 2012-03-29 09:52:17 +0200 |
commit | 2e09580f8eba91dd4720622935587a72381a71e8 (patch) | |
tree | 273edb96e62f2487fdc7b0d44e79f3810621a9f7 | |
parent | 34f64685b9a324347833001ed5214c934252e499 (diff) | |
download | core-2e09580f8eba91dd4720622935587a72381a71e8.tar.gz |
ifconfig: Fix aliasing violations
Signed-off-by: Bernhard Rosenkraenzer <Bernhard.Rosenkranzer@linaro.org>
-rw-r--r-- | toolbox/ifconfig.c | 41 |
1 files changed, 34 insertions, 7 deletions
diff --git a/toolbox/ifconfig.c b/toolbox/ifconfig.c index 80c0e5ce0..ebaf13978 100644 --- a/toolbox/ifconfig.c +++ b/toolbox/ifconfig.c @@ -41,19 +41,34 @@ static void setmtu(int s, struct ifreq *ifr, const char *mtu) } static void setdstaddr(int s, struct ifreq *ifr, const char *addr) { - init_sockaddr_in((struct sockaddr_in *) &ifr->ifr_dstaddr, addr); + union { + struct sockaddr_in *in; + struct sockaddr *sa; + } inaddr; + inaddr.sa = &ifr->ifr_dstaddr; + init_sockaddr_in(inaddr.in, addr); if(ioctl(s, SIOCSIFDSTADDR, ifr) < 0) die("SIOCSIFDSTADDR"); } static void setnetmask(int s, struct ifreq *ifr, const char *addr) { - init_sockaddr_in((struct sockaddr_in *) &ifr->ifr_netmask, addr); + union { + struct sockaddr_in *in; + struct sockaddr *sa; + } inaddr; + inaddr.sa = &ifr->ifr_netmask; + init_sockaddr_in(inaddr.in, addr); if(ioctl(s, SIOCSIFNETMASK, ifr) < 0) die("SIOCSIFNETMASK"); } static void setaddr(int s, struct ifreq *ifr, const char *addr) { - init_sockaddr_in((struct sockaddr_in *) &ifr->ifr_addr, addr); + union { + struct sockaddr_in *in; + struct sockaddr *sa; + } inaddr; + inaddr.sa = &ifr->ifr_addr; + init_sockaddr_in(inaddr.in, addr); if(ioctl(s, SIOCSIFADDR, ifr) < 0) die("SIOCSIFADDR"); } @@ -84,14 +99,26 @@ int ifconfig_main(int argc, char *argv[]) if (ioctl(s, SIOCGIFADDR, &ifr) < 0) { perror(ifr.ifr_name); return -1; - } else - addr = ((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr.s_addr; + } else { + union { + struct sockaddr_in *in; + struct sockaddr *sa; + } ad; + ad.sa = &ifr.ifr_addr; + addr = ad.in->sin_addr.s_addr; + } if (ioctl(s, SIOCGIFNETMASK, &ifr) < 0) { perror(ifr.ifr_name); return -1; - } else - mask = ((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr.s_addr; + } else { + union { + struct sockaddr_in *in; + struct sockaddr *sa; + } ad; + ad.sa = &ifr.ifr_addr; + mask = ad.in->sin_addr.s_addr; + } if (ioctl(s, SIOCGIFFLAGS, &ifr) < 0) { perror(ifr.ifr_name); |