4 #include <sys/socket.h>
9 static void *do_nameindex(int s, size_t n)
13 struct if_nameindex *idx;
15 idx = malloc(n * (sizeof(struct if_nameindex)+sizeof(struct ifreq)));
18 conf.ifc_buf = (void *)&idx[n];
19 conf.ifc_len = len = n * sizeof(struct ifreq);
20 if (ioctl(s, SIOCGIFCONF, &conf) < 0) {
24 if (conf.ifc_len == len) {
29 n = conf.ifc_len / sizeof(struct ifreq);
30 for (i=k=0; i<n; i++) {
31 if (ioctl(s, SIOCGIFINDEX, &conf.ifc_req[i]) < 0) {
35 idx[i-k].if_index = conf.ifc_req[i].ifr_ifindex;
36 idx[i-k].if_name = conf.ifc_req[i].ifr_name;
39 idx[i-k].if_index = 0;
44 struct if_nameindex *if_nameindex()
48 int s = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC, 0);
50 for (n=0; (p=do_nameindex(s, n)) == (void *)-1; n++);
51 __syscall(SYS_close, s);