#define _GNU_SOURCE #include #include #include #include #include #include "syscall.h" static void *do_nameindex(int s, size_t n) { size_t i, len, k; struct ifconf conf; struct if_nameindex *idx; idx = malloc(n * (sizeof(struct if_nameindex)+sizeof(struct ifreq))); if (!idx) return 0; conf.ifc_buf = (void *)&idx[n]; conf.ifc_len = len = n * sizeof(struct ifreq); if (ioctl(s, SIOCGIFCONF, &conf) < 0) { free(idx); return 0; } if (conf.ifc_len == len) { free(idx); return (void *)-1; } n = conf.ifc_len / sizeof(struct ifreq); for (i=k=0; i=0) { for (n=0; (p=do_nameindex(s, n)) == (void *)-1; n++); __syscall(SYS_close, s); } errno = ENOBUFS; return p; }