diff options
author | Mike Waychison <mikew@google.com> | 2010-03-22 11:50:31 -0700 |
---|---|---|
committer | maximilian attems <max@stro.at> | 2010-03-22 20:16:01 +0100 |
commit | 7a6d1c10d85cf5606c577b80c257907c920e6674 (patch) | |
tree | 71c357d786300a973c50e0b7f320f9421536401c | |
parent | 4b0dde5473c52c65b8c94474632908171882908a (diff) | |
download | klibc-7a6d1c10d85cf5606c577b80c257907c920e6674.tar.gz |
[klibc] ipconfig: Use memcpy to avoid strict aliasing warnings.
Newer compilers will complain about strict aliasing when casting struct
sockaddr to sockaddr_in. Even though these are legitimate type casts, changing
them to use memcpy is easy enough and silences the warnings.
Signed-off-by: Mike Waychison <mikew@google.com>
Signed-off-by: maximilian attems <max@stro.at>
-rw-r--r-- | usr/kinit/ipconfig/netdev.c | 27 |
1 files changed, 17 insertions, 10 deletions
diff --git a/usr/kinit/ipconfig/netdev.c b/usr/kinit/ipconfig/netdev.c index e0f7dad36463b..6e3014f78793c 100644 --- a/usr/kinit/ipconfig/netdev.c +++ b/usr/kinit/ipconfig/netdev.c @@ -41,10 +41,12 @@ int netdev_getflags(struct netdev *dev, short *flags) static int netdev_sif_addr(struct ifreq *ifr, int cmd, uint32_t addr) { - struct sockaddr_in *sin = (struct sockaddr_in *)&ifr->ifr_addr; + struct sockaddr_in sin; + + sin.sin_family = AF_INET; + sin.sin_addr.s_addr = addr; - sin->sin_family = AF_INET; - sin->sin_addr.s_addr = addr; + memcpy(&ifr->ifr_addr, &sin, sizeof sin); return ioctl(cfd, cmd, ifr); } @@ -76,6 +78,15 @@ int netdev_setaddress(struct netdev *dev) return 0; } +static void set_s_addr(struct sockaddr *saddr, uint32_t ipaddr) +{ + struct sockaddr_in sin = { + .sin_family = AF_INET, + .sin_addr.s_addr = ipaddr, + }; + memcpy(saddr, &sin, sizeof sin); +} + int netdev_setdefaultroute(struct netdev *dev) { struct rtentry r; @@ -85,13 +96,9 @@ int netdev_setdefaultroute(struct netdev *dev) memset(&r, 0, sizeof(r)); - ((struct sockaddr_in *)&r.rt_dst)->sin_family = AF_INET; - ((struct sockaddr_in *)&r.rt_dst)->sin_addr.s_addr = INADDR_ANY; - ((struct sockaddr_in *)&r.rt_gateway)->sin_family = AF_INET; - ((struct sockaddr_in *)&r.rt_gateway)->sin_addr.s_addr = - dev->ip_gateway; - ((struct sockaddr_in *)&r.rt_genmask)->sin_family = AF_INET; - ((struct sockaddr_in *)&r.rt_genmask)->sin_addr.s_addr = INADDR_ANY; + set_s_addr(&r.rt_dst, INADDR_ANY); + set_s_addr(&r.rt_gateway, dev->ip_gateway); + set_s_addr(&r.rt_genmask, INADDR_ANY); r.rt_flags = RTF_UP | RTF_GATEWAY; if (ioctl(cfd, SIOCADDRT, &r) == -1 && errno != EEXIST) { |