getifaddrs: implement proper ipv6 netmasks
authorrofl0r <retnyg@gmx.net>
Tue, 9 Apr 2013 09:00:52 +0000 (11:00 +0200)
committerrofl0r <retnyg@gmx.net>
Tue, 9 Apr 2013 14:52:13 +0000 (16:52 +0200)
src/network/getifaddrs.c

index 9ccf457..a4c3178 100644 (file)
@@ -51,8 +51,17 @@ void freeifaddrs(struct ifaddrs *ifp)
 
 static void ipv6netmask(unsigned prefix_length, struct sockaddr_in6 *sa)
 {
-       // FIXME: left for bit-wizard rich
-       memset(&sa->sin6_addr, -1, sizeof(sa->sin6_addr));
+       unsigned char* hb = sa->sin6_addr.s6_addr;
+       unsigned onebytes = prefix_length / 8;
+       unsigned bits = prefix_length % 8;
+       unsigned nullbytes = 16 - onebytes;
+       memset(hb, -1, onebytes);
+       memset(hb+onebytes, 0, nullbytes);
+       if(bits) {
+               unsigned char x = -1;
+               x <<= 8 - bits;
+               hb[onebytes] = x;
+       }
 }
 
 static void dealwithipv6(stor **list, stor** head)