--- trunk/mkinitrd-magellan/klibc/usr/kinit/ipconfig/netdev.c 2007/09/01 22:45:15 532 +++ trunk/mkinitrd-magellan/klibc/usr/kinit/ipconfig/netdev.c 2010/08/18 21:11:40 1122 @@ -12,6 +12,7 @@ #include #include #include +#include #include "netdev.h" @@ -40,10 +41,13 @@ 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; + memset(&sin, 0, sizeof(sin)); + sin.sin_family = AF_INET; + sin.sin_addr.s_addr = addr; + + memcpy(&ifr->ifr_addr, &sin, sizeof sin); return ioctl(cfd, cmd, ifr); } @@ -75,6 +79,15 @@ 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; @@ -84,13 +97,9 @@ 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) {