- head->ifa_flags = req.ifr_flags;
- if(head->ifa_addr) {
- /* or'ing flags with IFF_LOWER_UP on active interfaces to mimic glibc */
- head->ifa_flags |= IFF_LOWER_UP;
- if(-1 == ioctl(sock, SIOCGIFNETMASK, &req)) goto err;
- head->ifa_netmask = sockaddr_in_dup((struct sockaddr_in*) &req.ifr_netmask);
-
- if(head->ifa_flags & IFF_POINTOPOINT) {
- if(-1 == ioctl(sock, SIOCGIFDSTADDR, &req)) goto err;
- head->ifa_ifu.ifu_dstaddr = sockaddr_in_dup((struct sockaddr_in*) &req.ifr_dstaddr);
- } else {
- if(-1 == ioctl(sock, SIOCGIFBRDADDR, &req)) goto err;
- head->ifa_ifu.ifu_broadaddr = sockaddr_in_dup((struct sockaddr_in*) &req.ifr_broadaddr);
- }
+ head->ifa.ifa_flags = req.ifr_flags;
+ if(head->ifa.ifa_addr) {
+ /* or'ing flags with IFF_LOWER_UP on active interfaces to mimic glibc */
+ head->ifa.ifa_flags |= IFF_LOWER_UP;
+ if(-1 == ioctl(sock, SIOCGIFNETMASK, &req)) goto err;
+ head->netmask.v4 = *(struct sockaddr_in*)&req.ifr_netmask;
+ head->ifa.ifa_netmask = (struct sockaddr*) &head->netmask;
+
+ if(head->ifa.ifa_flags & IFF_POINTOPOINT) {
+ if(-1 == ioctl(sock, SIOCGIFDSTADDR, &req)) goto err;
+ head->dst.v4 = *(struct sockaddr_in*)&req.ifr_dstaddr;
+ } else {
+ if(-1 == ioctl(sock, SIOCGIFBRDADDR, &req)) goto err;
+ head->dst.v4 = *(struct sockaddr_in*)&req.ifr_broadaddr;