about summary refs log tree commit diff
diff options
context:
space:
mode:
authorrofl0r <retnyg@gmx.net>2013-04-05 22:47:30 +0200
committerrofl0r <retnyg@gmx.net>2013-04-05 22:47:30 +0200
commit4af3ea789ac466493634a32235c77bb11f078fe6 (patch)
treede5a7359d75ee72e2bc244ad8bbb2785e6248493
parent69a1983872c819b8c63b9cebfa07fe7d1726e91f (diff)
downloadmusl-4af3ea789ac466493634a32235c77bb11f078fe6.tar.gz
musl-4af3ea789ac466493634a32235c77bb11f078fe6.tar.xz
musl-4af3ea789ac466493634a32235c77bb11f078fe6.zip
getifaddrs: use if_nameindex to enumerate interfaces
-rw-r--r--src/network/getifaddrs.c32
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)) {