diff options
author | rofl0r <retnyg@gmx.net> | 2013-04-05 22:47:30 +0200 |
---|---|---|
committer | rofl0r <retnyg@gmx.net> | 2013-04-05 22:47:30 +0200 |
commit | 4af3ea789ac466493634a32235c77bb11f078fe6 (patch) | |
tree | de5a7359d75ee72e2bc244ad8bbb2785e6248493 /src/network/getifaddrs.c | |
parent | 69a1983872c819b8c63b9cebfa07fe7d1726e91f (diff) | |
download | musl-4af3ea789ac466493634a32235c77bb11f078fe6.tar.gz musl-4af3ea789ac466493634a32235c77bb11f078fe6.tar.xz musl-4af3ea789ac466493634a32235c77bb11f078fe6.zip |
getifaddrs: use if_nameindex to enumerate interfaces
Diffstat (limited to 'src/network/getifaddrs.c')
-rw-r--r-- | src/network/getifaddrs.c | 32 |
1 files changed, 9 insertions, 23 deletions
diff --git a/src/network/getifaddrs.c b/src/network/getifaddrs.c index c7362639..730ce8d1 100644 --- a/src/network/getifaddrs.c +++ b/src/network/getifaddrs.c @@ -106,31 +106,18 @@ static void dealwithipv6(stor **list, stor** head) int getifaddrs(struct ifaddrs **ifap) { - FILE* f = fopen("/proc/net/dev", "r"); - if(!f) return -1; - - /* the alternative to parsing /proc.. seems to be iterating - through the interfaces using an index number in ifreq.ifr_ifindex - until we get some error code back. the kernel will fill ifr_name field - for valid ifindices (SIOCGIFINDEX) */ stor *list = 0, *head = 0; - - char* line; char linebuf[512]; - while((line = fgets(linebuf, sizeof linebuf, f))) { - while(isspace(*line) && *line) line++; - char* start = line; - while(*line && isalnum(*line)) line++; - if(line > start && *line == ':') { - // found interface - *line = 0; - stor* curr = list_add(&list, &head, start); - if(!curr) { - fclose(f); - goto err2; - } + struct if_nameindex* ii = if_nameindex(); + if(!ii) return -1; + size_t i; + for(i = 0; ii[i].if_index || ii[i].if_name; i++) { + stor* curr = list_add(&list, &head, ii[i].if_name); + if(!curr) { + if_freenameindex(ii); + goto err2; } } - fclose(f); + if_freenameindex(ii); int sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP); if(sock == -1) goto err2; @@ -139,7 +126,6 @@ int getifaddrs(struct ifaddrs **ifap) if(-1 == ioctl(sock, SIOCGIFCONF, &conf)) goto err; size_t reqitems = conf.ifc_len / sizeof(struct ifreq); for(head = list; head; head = (stor*)head->next) { - size_t i; for(i = 0; i < reqitems; i++) { // get SIOCGIFADDR of active interfaces. if(!strcmp(reqs[i].ifr_name, head->name)) { |