#include <arpa/inet.h> /* inet_pton */
#include <unistd.h>
#include <sys/ioctl.h>
+#include <sys/socket.h>
typedef union {
struct sockaddr_in6 v6;
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)
{
- FILE* f = fopen("/proc/net/if_inet6", "r");
+ FILE* f = fopen("/proc/net/if_inet6", "rbe");
/* 00000000000000000000000000000001 01 80 10 80 lo
A B C D E F
all numbers in hex
}
if_freenameindex(ii);
- int sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP);
+ int sock = socket(PF_INET, SOCK_DGRAM|SOCK_CLOEXEC, IPPROTO_IP);
if(sock == -1) goto err2;
struct ifreq reqs[32]; /* arbitrary chosen boundary */
struct ifconf conf = {.ifc_len = sizeof reqs, .ifc_req = reqs};