[klibc] [PATCH] ipconfig: Use memcpy to avoid strict aliasing warnings.
Mike Waychison
mikew at google.com
Mon Mar 22 11:50:31 PDT 2010
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 at google.com>
---
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 e0f7dad..6e3014f 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) {
--
1.7.0.1
More information about the klibc
mailing list