remove some stray trailing space characters
[musl] / src / network / if_nameindex.c
1 #define _GNU_SOURCE
2 #include <net/if.h>
3 #include <stdlib.h>
4 #include <sys/socket.h>
5 #include <sys/ioctl.h>
6 #include <errno.h>
7 #include "syscall.h"
8
9 #include <stdio.h>
10
11 static void *do_nameindex(int s, size_t n)
12 {
13         size_t i, len;
14         struct ifconf conf;
15         struct if_nameindex *idx;
16
17         idx = malloc(n * (sizeof(struct if_nameindex)+sizeof(struct ifreq)));
18         if (!idx) return 0;
19
20         conf.ifc_buf = (void *)&idx[n];
21         conf.ifc_len = len = n * sizeof(struct ifreq);
22         if (ioctl(s, SIOCGIFCONF, &conf) < 0) {
23                 free(idx);
24                 return 0;
25         }
26         if (conf.ifc_len == len) {
27                 free(idx);
28                 return (void *)-1;
29         }
30
31         n = conf.ifc_len / sizeof(struct ifreq);
32         for (i=0; i<n; i++) {
33                 if (ioctl(s, SIOCGIFINDEX, &conf.ifc_req[i]) < 0) {
34                         i--;
35                         n--;
36                         continue;
37                 }
38                 idx[i].if_index = conf.ifc_req[i].ifr_ifindex;
39                 idx[i].if_name = conf.ifc_req[i].ifr_name;
40         }
41         idx[i].if_name = 0;
42         idx[i].if_index = 0;
43
44         return idx;
45 }
46
47 struct if_nameindex *if_nameindex()
48 {
49         size_t n;
50         void *p = 0;
51         int s = socket(AF_UNIX, SOCK_DGRAM, 0);
52         if (s>=0) {
53                 for (n=0; (p=do_nameindex(s, n)) == (void *)-1; n++);
54                 __syscall(SYS_close, s);
55         }
56         errno = ENOBUFS;
57         return p;
58 }