iwinfo: nl80211: use new path lookup function for nl80211_phy_idx_from_uci_path
authorFelix Fietkau <nbd@nbd.name>
Wed, 9 Jun 2021 12:03:29 +0000 (14:03 +0200)
committerFelix Fietkau <nbd@nbd.name>
Wed, 9 Jun 2021 12:05:05 +0000 (14:05 +0200)
Fixes issues with multiple phy instances of one device

Signed-off-by: Felix Fietkau <nbd@nbd.name>
iwinfo_nl80211.c

index be90824832d8068d0043d6e0be40f16ed6d928a8..8decdb0ad9be06d528650d76bbcb5e3cef6f9d1c 100644 (file)
@@ -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;
 }