summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBernhard Rosenkraenzer <Bernhard.Rosenkranzer@linaro.org>2011-12-15 15:05:17 +0059
committerBernhard Rosenkraenzer <Bernhard.Rosenkranzer@linaro.org>2012-03-29 09:52:17 +0200
commit2e09580f8eba91dd4720622935587a72381a71e8 (patch)
tree273edb96e62f2487fdc7b0d44e79f3810621a9f7
parent34f64685b9a324347833001ed5214c934252e499 (diff)
downloadcore-2e09580f8eba91dd4720622935587a72381a71e8.tar.gz
ifconfig: Fix aliasing violations
Signed-off-by: Bernhard Rosenkraenzer <Bernhard.Rosenkranzer@linaro.org>
-rw-r--r--toolbox/ifconfig.c41
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);