Browse Source

iwinfo: nl80211: use new path lookup function for nl80211_phy_idx_from_uci_path

Fixes issues with multiple phy instances of one device

Signed-off-by: Felix Fietkau <nbd@nbd.name>
Felix Fietkau 2 years ago
parent
commit
dd6d6d2dec
1 changed files with 17 additions and 30 deletions
  1. 17 30
      iwinfo_nl80211.c

+ 17 - 30
iwinfo_nl80211.c

@@ -295,10 +295,9 @@ static const char *nl80211_phy_path_str(const char *phyname)
 
 static int nl80211_phy_idx_from_uci_path(struct uci_section *s)
 {
-	size_t linklen, pathlen;
-	char buf[128], *link;
+	char buf[128];
 	struct dirent *e;
-	const char *path;
+	const char *path, *cur_path;
 	int idx = -1;
 	DIR *d;
 
@@ -306,39 +305,27 @@ static int nl80211_phy_idx_from_uci_path(struct uci_section *s)
 	if (!path)
 		return -1;
 
-	if ((d = opendir("/sys/class/ieee80211")) != NULL)
-	{
-		while ((e = readdir(d)) != NULL)
-		{
-			snprintf(buf, sizeof(buf), "/sys/class/ieee80211/%s/device", e->d_name);
-
-			link = realpath(buf, NULL);
-
-			if (link == NULL)
-				continue;
-
-			linklen = strlen(link);
-			pathlen = strlen(path);
-
-			if (pathlen >= linklen || strcmp(link + (linklen - pathlen), path))
-				linklen = 0;
-
-			free(link);
-
-			if (linklen == 0)
-				continue;
+	d = opendir("/sys/class/ieee80211");
+	if (!d)
+		return -1;
 
-			snprintf(buf, sizeof(buf), "/sys/class/ieee80211/%s/index", e->d_name);
+	while ((e = readdir(d)) != NULL) {
+		cur_path = nl80211_phy_path_str(e->d_name);
+		if (!cur_path)
+			continue;
 
-			idx = nl80211_readint(buf);
+		if (strcmp(cur_path, path) != 0)
+			continue;
 
-			if (idx >= 0)
-				break;
-		}
+		snprintf(buf, sizeof(buf), "/sys/class/ieee80211/%s/index", e->d_name);
+		idx = nl80211_readint(buf);
 
-		closedir(d);
+		if (idx >= 0)
+			break;
 	}
 
+	closedir(d);
+
 	return idx;
 }