iwinfo: keep an array of backends, reduce the number of ifdefs and hardcoded strcmp...
authorFelix Fietkau <nbd@openwrt.org>
Wed, 21 May 2014 12:33:10 +0000 (12:33 +0000)
committerFelix Fietkau <nbd@openwrt.org>
Wed, 21 May 2014 12:33:10 +0000 (12:33 +0000)
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
SVN-Revision: 40809

package/network/utils/iwinfo/src/include/iwinfo.h
package/network/utils/iwinfo/src/include/iwinfo/madwifi.h
package/network/utils/iwinfo/src/include/iwinfo/nl80211.h
package/network/utils/iwinfo/src/include/iwinfo/wext.h
package/network/utils/iwinfo/src/include/iwinfo/wl.h
package/network/utils/iwinfo/src/iwinfo_lib.c

index ebea319d107cf246cb5711bd48bbc73c999722a8..1302d159b9e1ed7f2c92b8ef1f2535772fb44723 100644 (file)
@@ -148,6 +148,9 @@ extern const struct iwinfo_iso3166_label IWINFO_ISO3166_NAMES[];
 
 
 struct iwinfo_ops {
+       const char *name;
+
+       int (*probe)(const char *ifname);
        int (*mode)(const char *, int *);
        int (*channel)(const char *, int *);
        int (*frequency)(const char *, int *);
index 3662d9f95f0af2fc49f41ece82fbdb9b48b1f480..0de9fea6e315dcd03f2a57cf4b019ee5469390f5 100644 (file)
@@ -54,6 +54,8 @@ int madwifi_get_hardware_name(const char *ifname, char *buf);
 void madwifi_close(void);
 
 static const struct iwinfo_ops madwifi_ops = {
+       .name             = "madwifi",
+       .probe            = madwifi_probe,
        .channel          = madwifi_get_channel,
        .frequency        = madwifi_get_frequency,
        .frequency_offset = madwifi_get_frequency_offset,
index 0611feed3c21a423f478dc00643f31961994bf76..97f8c7de634fa2827096e9d613224ea23fddfe21 100644 (file)
@@ -96,6 +96,8 @@ int nl80211_get_hardware_name(const char *ifname, char *buf);
 void nl80211_close(void);
 
 static const struct iwinfo_ops nl80211_ops = {
+       .name             = "nl80211",
+       .probe            = nl80211_probe,
        .channel          = nl80211_get_channel,
        .frequency        = nl80211_get_frequency,
        .frequency_offset = nl80211_get_frequency_offset,
index e84f6a6f9222423e6366468382d961cfa0afacfd..22016c69ac12ed32fae256651ce4d10980db1426 100644 (file)
@@ -55,6 +55,8 @@ int wext_get_hardware_name(const char *ifname, char *buf);
 void wext_close(void);
 
 static const struct iwinfo_ops wext_ops = {
+       .name             = "wext",
+       .probe            = wext_probe,
        .channel          = wext_get_channel,
        .frequency        = wext_get_frequency,
        .frequency_offset = wext_get_frequency_offset,
index 077a51bbd49650e960db54321e1aa5fe57ac0d0a..535a43dc37b357d0a8f40bfa10e2036891d2b4bb 100644 (file)
@@ -55,6 +55,8 @@ int wl_get_hardware_name(const char *ifname, char *buf);
 void wl_close(void);
 
 static const struct iwinfo_ops wl_ops = {
+       .name             = "wl",
+       .probe            = wl_probe,
        .channel          = wl_get_channel,
        .frequency        = wl_get_frequency,
        .frequency_offset = wl_get_frequency_offset,
index df1f450cc536b18a58116fd28a550c520c3d6a2e..4ae8f591c93a2a6141e8e0c2847737837733510d 100644 (file)
@@ -313,77 +313,49 @@ const struct iwinfo_iso3166_label IWINFO_ISO3166_NAMES[] = {
        { 0,               "" }
 };
 
+#ifndef ARRAY_SIZE
+#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
+#endif
 
-const char * iwinfo_type(const char *ifname)
-{
+static const struct iwinfo_ops *backends[] = {
 #ifdef USE_NL80211
-       if (nl80211_probe(ifname))
-               return "nl80211";
-       else
+       &nl80211_ops,
 #endif
-
 #ifdef USE_MADWIFI
-       if (madwifi_probe(ifname))
-               return "madwifi";
-       else
+       &madwifi_ops,
 #endif
-
 #ifdef USE_WL
-       if (wl_probe(ifname))
-               return "wl";
-       else
+       &wl_ops,
 #endif
+       &wext_ops,
+};
 
-       if (wext_probe(ifname))
-               return "wext";
+const char * iwinfo_type(const char *ifname)
+{
+       const struct iwinfo_ops *ops = iwinfo_backend(ifname);
+       if (!ops)
+               return NULL;
 
-       return NULL;
+       return ops->name;
 }
 
 const struct iwinfo_ops * iwinfo_backend(const char *ifname)
 {
-       const char *type;
-       struct iwinfo_ops *ops;
+       int i;
 
-       type = iwinfo_type(ifname);
-       if (!type)
-               return NULL;
-
-#ifdef USE_NL80211
-       if (!strcmp(type, "nl80211"))
-               return &nl80211_ops;
-       else
-#endif
-
-#ifdef USE_MADWIFI
-       if (!strcmp(type, "madwifi"))
-               return &madwifi_ops;
-       else
-#endif
-
-#ifdef USE_WL
-       if (!strcmp(type, "wl"))
-               return &wl_ops;
-       else
-#endif
-
-       if (!strcmp(type, "wext"))
-               return &wext_ops;
+       for (i = 0; i < ARRAY_SIZE(backends); i++)
+               if (backends[i]->probe(ifname))
+                       return backends[i];
 
        return NULL;
 }
 
 void iwinfo_finish(void)
 {
-#ifdef USE_WL
-       wl_close();
-#endif
-#ifdef USE_MADWIFI
-       madwifi_close();
-#endif
-#ifdef USE_NL80211
-       nl80211_close();
-#endif
-       wext_close();
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(backends); i++)
+               backends[i]->close();
+
        iwinfo_close();
 }