aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMike Waychison <mikew@google.com>2010-03-22 11:50:31 -0700
committermaximilian attems <max@stro.at>2010-03-22 20:16:01 +0100
commit7a6d1c10d85cf5606c577b80c257907c920e6674 (patch)
tree71c357d786300a973c50e0b7f320f9421536401c
parent4b0dde5473c52c65b8c94474632908171882908a (diff)
downloadklibc-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.c27
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) {