libiwinfo: move duplicated coded into iwinfo_utils.[ch]
authorJo-Philipp Wich <jow@openwrt.org>
Sun, 24 Oct 2010 17:21:54 +0000 (17:21 +0000)
committerJo-Philipp Wich <jow@openwrt.org>
Sun, 24 Oct 2010 17:21:54 +0000 (17:21 +0000)
15 files changed:
contrib/package/iwinfo/Makefile
contrib/package/iwinfo/src/Makefile
contrib/package/iwinfo/src/iwinfo_lualib.c
contrib/package/iwinfo/src/iwinfo_madwifi.c
contrib/package/iwinfo/src/iwinfo_madwifi.h
contrib/package/iwinfo/src/iwinfo_nl80211.c
contrib/package/iwinfo/src/iwinfo_nl80211.h
contrib/package/iwinfo/src/iwinfo_utils.c [new file with mode: 0644]
contrib/package/iwinfo/src/iwinfo_utils.h [new file with mode: 0644]
contrib/package/iwinfo/src/iwinfo_wext.c
contrib/package/iwinfo/src/iwinfo_wext.h
contrib/package/iwinfo/src/iwinfo_wext_scan.c
contrib/package/iwinfo/src/iwinfo_wext_scan.h
contrib/package/iwinfo/src/iwinfo_wl.c
contrib/package/iwinfo/src/iwinfo_wl.h

index 0ef0814..7cad392 100644 (file)
@@ -7,7 +7,7 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=libiwinfo
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=libiwinfo
-PKG_RELEASE:=8
+PKG_RELEASE:=9
 
 PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
 
 
 PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
 
index 40b720a..024582b 100644 (file)
@@ -2,7 +2,7 @@ IWINFO_BACKENDS   = $(if $(BACKENDS),$(BACKENDS),madwifi nl80211)
 IWINFO_LDFLAGS    = $(LDFLAGS) -shared -llua
 IWINFO_CFLAGS     = $(CFLAGS) -std=gnu99 -fstrict-aliasing
 IWINFO_SO         = iwinfo.so
 IWINFO_LDFLAGS    = $(LDFLAGS) -shared -llua
 IWINFO_CFLAGS     = $(CFLAGS) -std=gnu99 -fstrict-aliasing
 IWINFO_SO         = iwinfo.so
-IWINFO_OBJ        = iwinfo_wext.o iwinfo_wext_scan.o iwinfo_lualib.o
+IWINFO_OBJ        = iwinfo_utils.o iwinfo_wext.o iwinfo_wext_scan.o iwinfo_lualib.o
 
 ifneq ($(filter wl,$(IWINFO_BACKENDS)),)
        IWINFO_CFLAGS  += -DUSE_WL
 
 ifneq ($(filter wl,$(IWINFO_BACKENDS)),)
        IWINFO_CFLAGS  += -DUSE_WL
@@ -22,11 +22,10 @@ endif
 
 
 %.o: %.c
 
 
 %.o: %.c
-       $(CC) $(IWINFO_CFLAGS) $(LUA_CFLAGS) $(FPIC) -c -o $@ $< 
+       $(CC) $(IWINFO_CFLAGS) $(LUA_CFLAGS) $(FPIC) -c -o $@ $<
 
 compile: clean $(IWINFO_OBJ)
        $(LD) $(IWINFO_LDFLAGS) -o $(IWINFO_SO) $(IWINFO_OBJ)
 
 clean:
        rm -f *.o $(IWINFO_SO)
 
 compile: clean $(IWINFO_OBJ)
        $(LD) $(IWINFO_LDFLAGS) -o $(IWINFO_SO) $(IWINFO_OBJ)
 
 clean:
        rm -f *.o $(IWINFO_SO)
-
index 4309aa1..b327d08 100644 (file)
@@ -321,6 +321,7 @@ static int iwinfo_L__gc(lua_State *L)
        nl80211_close();
 #endif
        wext_close();
        nl80211_close();
 #endif
        wext_close();
+       iwinfo_close();
 }
 
 /*
 }
 
 /*
index d779be5..cb21ac5 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * iwinfo - Wireless Information Library - Madwifi Backend
  *
 /*
  * iwinfo - Wireless Information Library - Madwifi Backend
  *
- *   Copyright (C) 2009 Jo-Philipp Wich <xm@subsignal.org>
+ *   Copyright (C) 2009-2010 Jo-Philipp Wich <xm@subsignal.org>
  *
  * The iwinfo library is free software: you can redistribute it and/or
  * modify it under the terms of the GNU General Public License version 2
  *
  * The iwinfo library is free software: you can redistribute it and/or
  * modify it under the terms of the GNU General Public License version 2
@@ -196,26 +196,6 @@ static struct ISO3166_to_CCode
 };
 
 
 };
 
 
-static int ioctl_socket = -1;
-
-static int madwifi_socket(void)
-{
-       /* Prepare socket */
-       if( ioctl_socket == -1 )
-       {
-               ioctl_socket = socket(AF_INET, SOCK_DGRAM, 0);
-               fcntl(ioctl_socket, F_SETFD, fcntl(ioctl_socket, F_GETFD) | FD_CLOEXEC);
-       }
-
-       return ioctl_socket;
-}
-
-static int madwifi_ioctl(int cmd, void *ifr)
-{
-       int s = madwifi_socket();
-       return ioctl(s, cmd, ifr);
-}
-
 static int madwifi_wrq(struct iwreq *wrq, const char *ifname, int cmd, void *data, size_t len)
 {
        strncpy(wrq->ifr_name, ifname, IFNAMSIZ);
 static int madwifi_wrq(struct iwreq *wrq, const char *ifname, int cmd, void *data, size_t len)
 {
        strncpy(wrq->ifr_name, ifname, IFNAMSIZ);
@@ -233,7 +213,7 @@ static int madwifi_wrq(struct iwreq *wrq, const char *ifname, int cmd, void *dat
                }
        }
 
                }
        }
 
-       return madwifi_ioctl(cmd, wrq);
+       return iwinfo_ioctl(cmd, wrq);
 }
 
 static int get80211priv(const char *ifname, int op, void *data, size_t len)
 }
 
 static int get80211priv(const char *ifname, int op, void *data, size_t len)
@@ -318,7 +298,7 @@ static char * madwifi_ifadd(const char *ifname)
                strncpy(ifr.ifr_name, wifidev, IFNAMSIZ);
                ifr.ifr_data  = (void *)&cp;
 
                strncpy(ifr.ifr_name, wifidev, IFNAMSIZ);
                ifr.ifr_data  = (void *)&cp;
 
-               if( !madwifi_ioctl(SIOC80211IFCREATE, &ifr) )
+               if( !iwinfo_ioctl(SIOC80211IFCREATE, &ifr) )
                        return nif;
        }
 
                        return nif;
        }
 
@@ -330,35 +310,7 @@ static void madwifi_ifdel(const char *ifname)
        struct ifreq ifr = { 0 };
 
        strncpy(ifr.ifr_name, ifname, IFNAMSIZ);
        struct ifreq ifr = { 0 };
 
        strncpy(ifr.ifr_name, ifname, IFNAMSIZ);
-       madwifi_ioctl(SIOC80211IFDESTROY, &ifr);
-}
-
-static int madwifi_ifup(const char *ifname)
-{
-       struct ifreq ifr;
-
-       strncpy(ifr.ifr_name, ifname, IFNAMSIZ);
-
-       if( madwifi_ioctl(SIOCGIFFLAGS, &ifr) )
-               return 0;
-
-       ifr.ifr_flags |= (IFF_UP | IFF_RUNNING);
-
-       return !madwifi_ioctl(SIOCSIFFLAGS, &ifr);
-}
-
-static int madwifi_ifdown(const char *ifname)
-{
-       struct ifreq ifr;
-
-       strncpy(ifr.ifr_name, ifname, IFNAMSIZ);
-
-       if( madwifi_ioctl(SIOCGIFFLAGS, &ifr) )
-               return 0;
-
-       ifr.ifr_flags &= ~(IFF_UP | IFF_RUNNING);
-
-       return !madwifi_ioctl(SIOCSIFFLAGS, &ifr);
+       iwinfo_ioctl(SIOC80211IFDESTROY, &ifr);
 }
 
 
 }
 
 
@@ -369,8 +321,7 @@ int madwifi_probe(const char *ifname)
 
 void madwifi_close(void)
 {
 
 void madwifi_close(void)
 {
-       if( ioctl_socket > -1 )
-               close(ioctl_socket);
+       /* Nop */
 }
 
 int madwifi_get_mode(const char *ifname, char *buf)
 }
 
 int madwifi_get_mode(const char *ifname, char *buf)
@@ -804,7 +755,7 @@ int madwifi_get_scanlist(const char *ifname, char *buf, int *len)
                        {
                                if( !!madwifi_isvap(e->d_name, ifname) )
                                {
                        {
                                if( !!madwifi_isvap(e->d_name, ifname) )
                                {
-                                       if( madwifi_ifup(e->d_name) )
+                                       if( iwinfo_ifup(e->d_name) )
                                        {
                                                ret = wext_get_scanlist(e->d_name, buf, len);
                                                break;
                                        {
                                                ret = wext_get_scanlist(e->d_name, buf, len);
                                                break;
@@ -820,10 +771,10 @@ int madwifi_get_scanlist(const char *ifname, char *buf, int *len)
                {
                        if( (res = madwifi_ifadd(ifname)) != NULL )
                        {
                {
                        if( (res = madwifi_ifadd(ifname)) != NULL )
                        {
-                               if( madwifi_ifup(res) )
+                               if( iwinfo_ifup(res) )
                                        ret = wext_get_scanlist(res, buf, len);
 
                                        ret = wext_get_scanlist(res, buf, len);
 
-                               madwifi_ifdown(res);
+                               iwinfo_ifdown(res);
                                madwifi_ifdel(res);
                        }
                }
                                madwifi_ifdel(res);
                        }
                }
@@ -988,9 +939,9 @@ int madwifi_get_mbssid_support(const char *ifname, int *buf)
 
        if( nif )
        {
 
        if( nif )
        {
-               *buf = madwifi_ifup(nif);
+               *buf = iwinfo_ifup(nif);
 
 
-               madwifi_ifdown(nif);
+               iwinfo_ifdown(nif);
                madwifi_ifdel(nif);
 
                return 0;
                madwifi_ifdel(nif);
 
                return 0;
index b16c36f..690177f 100644 (file)
@@ -22,6 +22,7 @@
 #include <fcntl.h>
 
 #include "iwinfo.h"
 #include <fcntl.h>
 
 #include "iwinfo.h"
+#include "iwinfo_utils.h"
 #include "include/madwifi.h"
 
 int madwifi_probe(const char *ifname);
 #include "include/madwifi.h"
 
 int madwifi_probe(const char *ifname);
index 91ede2e..b5ab5ba 100644 (file)
@@ -29,7 +29,6 @@
 
 extern struct iwinfo_iso3166_label ISO3166_Names[];
 static struct nl80211_state *nls = NULL;
 
 extern struct iwinfo_iso3166_label ISO3166_Names[];
 static struct nl80211_state *nls = NULL;
-static int nl80211_ioctlsock = -1;
 
 static int nl80211_init(void)
 {
 
 static int nl80211_init(void)
 {
@@ -37,19 +36,6 @@ static int nl80211_init(void)
 
        if( !nls )
        {
 
        if( !nls )
        {
-               nl80211_ioctlsock = socket(AF_INET, SOCK_DGRAM, 0);
-               if( nl80211_ioctlsock < 0 )
-               {
-                       err = -ENOLINK;
-                       goto err;
-               }
-               else if( fcntl(nl80211_ioctlsock, F_SETFD,
-                                          fcntl(nl80211_ioctlsock, F_GETFD) | FD_CLOEXEC) < 0 )
-               {
-                       err = -EINVAL;
-                       goto err;
-               }
-
                nls = malloc(sizeof(struct nl80211_state));
                if( !nls ) {
                        err = -ENOMEM;
                nls = malloc(sizeof(struct nl80211_state));
                if( !nls ) {
                        err = -ENOMEM;
@@ -504,49 +490,6 @@ static void nl80211_ifdel(const char *ifname)
        }
 }
 
        }
 }
 
-static int nl80211_ifup(const char *ifname)
-{
-       struct ifreq ifr;
-
-       strncpy(ifr.ifr_name, ifname, IFNAMSIZ);
-
-       if( ioctl(nl80211_ioctlsock, SIOCGIFFLAGS, &ifr) )
-               return 0;
-
-       ifr.ifr_flags |= (IFF_UP | IFF_RUNNING);
-
-       return !ioctl(nl80211_ioctlsock, SIOCSIFFLAGS, &ifr);
-}
-
-static int nl80211_ifdown(const char *ifname)
-{
-       struct ifreq ifr;
-
-       strncpy(ifr.ifr_name, ifname, IFNAMSIZ);
-
-       if( ioctl(nl80211_ioctlsock, SIOCGIFFLAGS, &ifr) )
-               return 0;
-
-       ifr.ifr_flags &= ~(IFF_UP | IFF_RUNNING);
-
-       return !ioctl(nl80211_ioctlsock, SIOCSIFFLAGS, &ifr);
-}
-
-static int nl80211_ifmac(const char *ifname)
-{
-       struct ifreq ifr;
-
-       strncpy(ifr.ifr_name, ifname, IFNAMSIZ);
-
-       if( ioctl(nl80211_ioctlsock, SIOCGIFHWADDR, &ifr) )
-               return 0;
-
-       ifr.ifr_hwaddr.sa_data[1]++;
-       ifr.ifr_hwaddr.sa_data[2]++;
-
-       return !ioctl(nl80211_ioctlsock, SIOCSIFHWADDR, &ifr);
-}
-
 static void nl80211_hostapd_hup(const char *ifname)
 {
        int fd, pid = 0;
 static void nl80211_hostapd_hup(const char *ifname)
 {
        int fd, pid = 0;
@@ -577,11 +520,6 @@ int nl80211_probe(const char *ifname)
 
 void nl80211_close(void)
 {
 
 void nl80211_close(void)
 {
-       if( nl80211_ioctlsock > -1 )
-       {
-               close(nl80211_ioctlsock);
-       }
-
        if( nls )
        {
                if( nls->nl_sock )
        if( nls )
        {
                if( nls->nl_sock )
@@ -1169,13 +1107,13 @@ int nl80211_get_txpwrlist(const char *ifname, char *buf, int *len)
                     dbm_cur += 2, dbm_cnt++ )
                {
                        entry.dbm = dbm_cur;
                     dbm_cur += 2, dbm_cnt++ )
                {
                        entry.dbm = dbm_cur;
-                       entry.mw  = wext_dbm2mw(dbm_cur);
+                       entry.mw  = iwinfo_dbm2mw(dbm_cur);
 
                        memcpy(&buf[dbm_cnt * sizeof(entry)], &entry, sizeof(entry));
                }
 
                entry.dbm = dbm_max;
 
                        memcpy(&buf[dbm_cnt * sizeof(entry)], &entry, sizeof(entry));
                }
 
                entry.dbm = dbm_max;
-               entry.mw  = wext_dbm2mw(dbm_max);
+               entry.mw  = iwinfo_dbm2mw(dbm_max);
 
                memcpy(&buf[dbm_cnt * sizeof(entry)], &entry, sizeof(entry));
                dbm_cnt++;
 
                memcpy(&buf[dbm_cnt * sizeof(entry)], &entry, sizeof(entry));
                dbm_cnt++;
@@ -1266,8 +1204,7 @@ int nl80211_get_scanlist(const char *ifname, char *buf, int *len)
        struct iwinfo_scanlist_entry *e = (struct iwinfo_scanlist_entry *)buf;
 
        /* WPA supplicant */
        struct iwinfo_scanlist_entry *e = (struct iwinfo_scanlist_entry *)buf;
 
        /* WPA supplicant */
-       if( (res = nl80211_wpasupp_info(ifname, "SCAN")) &&
-           !strcmp(res, "OK\n") )
+       if( (res = nl80211_wpasupp_info(ifname, "SCAN")) && !strcmp(res, "OK\n") )
        {
                sleep(2);
 
        {
                sleep(2);
 
@@ -1346,11 +1283,11 @@ int nl80211_get_scanlist(const char *ifname, char *buf, int *len)
                /* Got a temp interface, don't create yet another one */
                if( !strncmp(ifname, "tmp.", 4) )
                {
                /* Got a temp interface, don't create yet another one */
                if( !strncmp(ifname, "tmp.", 4) )
                {
-                       if( !nl80211_ifup(ifname) )
+                       if( !iwinfo_ifup(ifname) )
                                return -1;
 
                        wext_get_scanlist(ifname, buf, len);
                                return -1;
 
                        wext_get_scanlist(ifname, buf, len);
-                       nl80211_ifdown(ifname);
+                       iwinfo_ifdown(ifname);
                        return 0;
                }
 
                        return 0;
                }
 
@@ -1360,24 +1297,24 @@ int nl80211_get_scanlist(const char *ifname, char *buf, int *len)
                        if( !(res = nl80211_ifadd(ifname)) )
                                goto out;
 
                        if( !(res = nl80211_ifadd(ifname)) )
                                goto out;
 
-                       if( !nl80211_ifmac(res) )
+                       if( !iwinfo_ifmac(res) )
                                goto out;
 
                        /* if we can take the new interface up, the driver supports an
                         * additional interface and there's no need to tear down the ap */
                                goto out;
 
                        /* if we can take the new interface up, the driver supports an
                         * additional interface and there's no need to tear down the ap */
-                       if( nl80211_ifup(res) )
+                       if( iwinfo_ifup(res) )
                        {
                                wext_get_scanlist(res, buf, len);
                        {
                                wext_get_scanlist(res, buf, len);
-                               nl80211_ifdown(res);
+                               iwinfo_ifdown(res);
                        }
 
                        /* driver cannot create secondary interface, take down ap
                         * during scan */
                        }
 
                        /* driver cannot create secondary interface, take down ap
                         * during scan */
-                       else if( nl80211_ifdown(ifname) && nl80211_ifup(res) )
+                       else if( iwinfo_ifdown(ifname) && iwinfo_ifup(res) )
                        {
                                wext_get_scanlist(res, buf, len);
                        {
                                wext_get_scanlist(res, buf, len);
-                               nl80211_ifdown(res);
-                               nl80211_ifup(ifname);
+                               iwinfo_ifdown(res);
+                               iwinfo_ifup(ifname);
                                nl80211_hostapd_hup(ifname);
                        }
 
                                nl80211_hostapd_hup(ifname);
                        }
 
@@ -1552,9 +1489,9 @@ int nl80211_get_mbssid_support(const char *ifname, int *buf)
 
        if( nif )
        {
 
        if( nif )
        {
-               *buf = (nl80211_ifmac(nif) && nl80211_ifup(nif));
+               *buf = (iwinfo_ifmac(nif) && iwinfo_ifup(nif));
 
 
-               nl80211_ifdown(nif);
+               iwinfo_ifdown(nif);
                nl80211_ifdel(nif);
 
                return 0;
                nl80211_ifdel(nif);
 
                return 0;
index 5fc1d74..7f6ffea 100644 (file)
 #include <string.h>
 #include <dirent.h>
 #include <signal.h>
 #include <string.h>
 #include <dirent.h>
 #include <signal.h>
-#include <sys/socket.h>
 #include <sys/un.h>
 #include <sys/un.h>
-#include <net/if.h>
 #include <netlink/netlink.h>
 #include <netlink/genl/genl.h>
 #include <netlink/genl/family.h>
 #include <netlink/genl/ctrl.h>
 
 #include "iwinfo.h"
 #include <netlink/netlink.h>
 #include <netlink/genl/genl.h>
 #include <netlink/genl/family.h>
 #include <netlink/genl/ctrl.h>
 
 #include "iwinfo.h"
+#include "iwinfo_utils.h"
 #include "include/nl80211.h"
 
 struct nl80211_state {
 #include "include/nl80211.h"
 
 struct nl80211_state {
diff --git a/contrib/package/iwinfo/src/iwinfo_utils.c b/contrib/package/iwinfo/src/iwinfo_utils.c
new file mode 100644 (file)
index 0000000..edd431e
--- /dev/null
@@ -0,0 +1,126 @@
+/*
+ * iwinfo - Wireless Information Library - Shared utility routines
+ *
+ *   Copyright (C) 2010 Jo-Philipp Wich <xm@subsignal.org>
+ *
+ * The iwinfo library is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License version 2
+ * as published by the Free Software Foundation.
+ *
+ * The iwinfo library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with the iwinfo library. If not, see http://www.gnu.org/licenses/.
+ *
+ * The signal handling code is derived from the official madwifi tools,
+ * wlanconfig.c in particular. The encryption property handling was
+ * inspired by the hostapd madwifi driver.
+ */
+
+#include "iwinfo_utils.h"
+
+
+static int ioctl_socket = -1;
+
+static int iwinfo_ioctl_socket(void)
+{
+       /* Prepare socket */
+       if( ioctl_socket == -1 )
+       {
+               ioctl_socket = socket(AF_INET, SOCK_DGRAM, 0);
+               fcntl(ioctl_socket, F_SETFD, fcntl(ioctl_socket, F_GETFD) | FD_CLOEXEC);
+       }
+
+       return ioctl_socket;
+}
+
+int iwinfo_ioctl(int cmd, void *ifr)
+{
+       int s = iwinfo_ioctl_socket();
+       return ioctl(s, cmd, ifr);
+}
+
+int iwinfo_dbm2mw(int in)
+{
+       double res = 1.0;
+       int ip = in / 10;
+       int fp = in % 10;
+       int k;
+
+       for(k = 0; k < ip; k++) res *= 10;
+       for(k = 0; k < fp; k++) res *= LOG10_MAGIC;
+
+       return (int)res;
+}
+
+int iwinfo_mw2dbm(int in)
+{
+       double fin = (double) in;
+       int res = 0;
+
+       while(fin > 10.0)
+       {
+               res += 10;
+               fin /= 10.0;
+       }
+
+       while(fin > 1.000001)
+       {
+               res += 1;
+               fin /= LOG10_MAGIC;
+       }
+
+       return (int)res;
+}
+
+int iwinfo_ifup(const char *ifname)
+{
+       struct ifreq ifr;
+
+       strncpy(ifr.ifr_name, ifname, IFNAMSIZ);
+
+       if( iwinfo_ioctl(SIOCGIFFLAGS, &ifr) )
+               return 0;
+
+       ifr.ifr_flags |= (IFF_UP | IFF_RUNNING);
+
+       return !iwinfo_ioctl(SIOCSIFFLAGS, &ifr);
+}
+
+int iwinfo_ifdown(const char *ifname)
+{
+       struct ifreq ifr;
+
+       strncpy(ifr.ifr_name, ifname, IFNAMSIZ);
+
+       if( iwinfo_ioctl(SIOCGIFFLAGS, &ifr) )
+               return 0;
+
+       ifr.ifr_flags &= ~(IFF_UP | IFF_RUNNING);
+
+       return !iwinfo_ioctl(SIOCSIFFLAGS, &ifr);
+}
+
+int iwinfo_ifmac(const char *ifname)
+{
+       struct ifreq ifr;
+
+       strncpy(ifr.ifr_name, ifname, IFNAMSIZ);
+
+       if( iwinfo_ioctl(SIOCGIFHWADDR, &ifr) )
+               return 0;
+
+       ifr.ifr_hwaddr.sa_data[1]++;
+       ifr.ifr_hwaddr.sa_data[2]++;
+
+       return !iwinfo_ioctl(SIOCSIFHWADDR, &ifr);
+}
+
+void iwinfo_close(void)
+{
+       if( ioctl_socket > -1 )
+               close(ioctl_socket);
+}
diff --git a/contrib/package/iwinfo/src/iwinfo_utils.h b/contrib/package/iwinfo/src/iwinfo_utils.h
new file mode 100644 (file)
index 0000000..57958b1
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+ * iwinfo - Wireless Information Library - Utility Headers
+ *
+ *   Copyright (C) 2010 Jo-Philipp Wich <xm@subsignal.org>
+ *
+ * The iwinfo library is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License version 2
+ * as published by the Free Software Foundation.
+ *
+ * The iwinfo library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with the iwinfo library. If not, see http://www.gnu.org/licenses/.
+ */
+
+#ifndef __IWINFO_UTILS_H_
+#define __IWINFO_UTILS_H_
+
+#include <sys/socket.h>
+#include <net/if.h>
+
+#include "iwinfo.h"
+
+#define LOG10_MAGIC    1.25892541179
+
+int iwinfo_ioctl(int cmd, void *ifr);
+
+int iwinfo_dbm2mw(int in);
+int iwinfo_mw2dbm(int in);
+
+int iwinfo_ifup(const char *ifname);
+int iwinfo_ifdown(const char *ifname);
+int iwinfo_ifmac(const char *ifname);
+
+void iwinfo_close(void);
+
+#endif
index 5300f1b..518551f 100644 (file)
 #include "iwinfo.h"
 #include "iwinfo_wext.h"
 
 #include "iwinfo.h"
 #include "iwinfo_wext.h"
 
-#define LOG10_MAGIC    1.25892541179
-
-static int ioctl_socket = -1;
-
 static double wext_freq2float(const struct iw_freq *in)
 {
        int             i;
 static double wext_freq2float(const struct iw_freq *in)
 {
        int             i;
@@ -34,7 +30,7 @@ static double wext_freq2float(const struct iw_freq *in)
        return res;
 }
 
        return res;
 }
 
-static int wext_freq2mhz(const struct iw_freq *in)
+static inline int wext_freq2mhz(const struct iw_freq *in)
 {
        int i, mhz;
 
 {
        int i, mhz;
 
@@ -52,54 +48,14 @@ static int wext_freq2mhz(const struct iw_freq *in)
        }
 }
 
        }
 }
 
-int wext_dbm2mw(int in)
+static inline int wext_ioctl(const char *ifname, int cmd, struct iwreq *wrq)
 {
 {
-       double res = 1.0;
-       int ip = in / 10;
-       int fp = in % 10;
-       int k;
-
-       for(k = 0; k < ip; k++) res *= 10;
-       for(k = 0; k < fp; k++) res *= LOG10_MAGIC;
-
-       return (int)res;
-}
-
-int wext_mw2dbm(int in)
-{
-       double fin = (double) in;
-       int res = 0;
-
-       while(fin > 10.0)
-       {
-               res += 10;
-               fin /= 10.0;
-       }
-
-       while(fin > 1.000001)
-       {
-               res += 1;
-               fin /= LOG10_MAGIC;
-       }
-
-       return (int)res;
-}
-
-static int wext_ioctl(const char *ifname, int cmd, struct iwreq *wrq)
-{
-       /* prepare socket */
-       if( ioctl_socket == -1 )
-       {
-               ioctl_socket = socket(AF_INET, SOCK_DGRAM, 0);
-               fcntl(ioctl_socket, F_SETFD, fcntl(ioctl_socket, F_GETFD) | FD_CLOEXEC);
-       }
-
        if( !strncmp(ifname, "mon.", 4) )
                strncpy(wrq->ifr_name, &ifname[4], IFNAMSIZ);
        else
                strncpy(wrq->ifr_name, ifname, IFNAMSIZ);
 
        if( !strncmp(ifname, "mon.", 4) )
                strncpy(wrq->ifr_name, &ifname[4], IFNAMSIZ);
        else
                strncpy(wrq->ifr_name, ifname, IFNAMSIZ);
 
-       return ioctl(ioctl_socket, cmd, wrq);
+       return iwinfo_ioctl(cmd, wrq);
 }
 
 
 }
 
 
@@ -115,10 +71,7 @@ int wext_probe(const char *ifname)
 
 void wext_close(void)
 {
 
 void wext_close(void)
 {
-       wext_scan_close();
-
-       if( ioctl_socket > -1 )
-               close(ioctl_socket);
+       /* Nop */
 }
 
 int wext_get_mode(const char *ifname, char *buf)
 }
 
 int wext_get_mode(const char *ifname, char *buf)
@@ -296,7 +249,7 @@ int wext_get_txpower(const char *ifname, int *buf)
        if(wext_ioctl(ifname, SIOCGIWTXPOW, &wrq) >= 0)
        {
                if(wrq.u.txpower.flags & IW_TXPOW_MWATT)
        if(wext_ioctl(ifname, SIOCGIWTXPOW, &wrq) >= 0)
        {
                if(wrq.u.txpower.flags & IW_TXPOW_MWATT)
-                       *buf = wext_mw2dbm(wrq.u.txpower.value);
+                       *buf = iwinfo_mw2dbm(wrq.u.txpower.value);
                else
                        *buf = wrq.u.txpower.value;
 
                else
                        *buf = wrq.u.txpower.value;
 
@@ -407,7 +360,7 @@ int wext_get_txpwrlist(const char *ifname, char *buf, int *len)
                {
                        if( range.txpower_capa & IW_TXPOW_MWATT )
                        {
                {
                        if( range.txpower_capa & IW_TXPOW_MWATT )
                        {
-                               entry.dbm = wext_mw2dbm(range.txpower[i]);
+                               entry.dbm = iwinfo_mw2dbm(range.txpower[i]);
                                entry.mw  = range.txpower[i];
                        }
 
                                entry.mw  = range.txpower[i];
                        }
 
@@ -416,7 +369,7 @@ int wext_get_txpwrlist(const char *ifname, char *buf, int *len)
                        else /* if( range.txpower_capa & IW_TXPOW_DBM ) */
                        {
                                entry.dbm = range.txpower[i];
                        else /* if( range.txpower_capa & IW_TXPOW_DBM ) */
                        {
                                entry.dbm = range.txpower[i];
-                               entry.mw  = wext_dbm2mw(range.txpower[i]);
+                               entry.mw  = iwinfo_dbm2mw(range.txpower[i]);
                        }
 
                        memcpy(&buf[i*sizeof(entry)], &entry, sizeof(entry));
                        }
 
                        memcpy(&buf[i*sizeof(entry)], &entry, sizeof(entry));
index 03a5199..db213fc 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * iwinfo - Wireless Information Library - Linux Wireless Extension Headers
  *
 /*
  * iwinfo - Wireless Information Library - Linux Wireless Extension Headers
  *
- *   Copyright (C) 2009 Jo-Philipp Wich <xm@subsignal.org>
+ *   Copyright (C) 2009-2010 Jo-Philipp Wich <xm@subsignal.org>
  *
  * The iwinfo library is free software: you can redistribute it and/or
  * modify it under the terms of the GNU General Public License version 2
  *
  * The iwinfo library is free software: you can redistribute it and/or
  * modify it under the terms of the GNU General Public License version 2
 #include <fcntl.h>
 
 #include "iwinfo.h"
 #include <fcntl.h>
 
 #include "iwinfo.h"
+#include "iwinfo_utils.h"
 #include "include/wext.h"
 
 
 #include "include/wext.h"
 
 
-int wext_dbm2mw(int in);
-int wext_mw2dbm(int in);
-
 int wext_probe(const char *ifname);
 int wext_get_mode(const char *ifname, char *buf);
 int wext_get_ssid(const char *ifname, char *buf);
 int wext_probe(const char *ifname);
 int wext_get_mode(const char *ifname, char *buf);
 int wext_get_ssid(const char *ifname, char *buf);
@@ -49,7 +47,6 @@ int wext_get_freqlist(const char *ifname, char *buf, int *len);
 int wext_get_countrylist(const char *ifname, char *buf, int *len);
 int wext_get_hwmodelist(const char *ifname, int *buf);
 int wext_get_mbssid_support(const char *ifname, int *buf);
 int wext_get_countrylist(const char *ifname, char *buf, int *len);
 int wext_get_hwmodelist(const char *ifname, int *buf);
 int wext_get_mbssid_support(const char *ifname, int *buf);
-void wext_scan_close(void);
 void wext_close(void);
 
 #endif
 void wext_close(void);
 
 #endif
index d5b486b..93dd887 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * iwinfo - Wireless Information Library - Linux Wireless Extension Backend
  *
 /*
  * iwinfo - Wireless Information Library - Linux Wireless Extension Backend
  *
- *   Copyright (C) 2009 Jo-Philipp Wich <xm@subsignal.org>
+ *   Copyright (C) 2009-2010 Jo-Philipp Wich <xm@subsignal.org>
  *
  * The iwinfo library is free software: you can redistribute it and/or
  * modify it under the terms of the GNU General Public License version 2
  *
  * The iwinfo library is free software: you can redistribute it and/or
  * modify it under the terms of the GNU General Public License version 2
 #include "iwinfo_wext_scan.h"
 
 
 #include "iwinfo_wext_scan.h"
 
 
-static int ioctl_socket = -1;
-
 static int wext_ioctl(const char *ifname, int cmd, struct iwreq *wrq)
 {
 static int wext_ioctl(const char *ifname, int cmd, struct iwreq *wrq)
 {
-       /* prepare socket */
-       if( ioctl_socket == -1 )
-       {
-               ioctl_socket = socket(AF_INET, SOCK_DGRAM, 0);
-               fcntl(ioctl_socket, F_SETFD, fcntl(ioctl_socket, F_GETFD) | FD_CLOEXEC);
-       }
-
-       strncpy(wrq->ifr_name, ifname, IFNAMSIZ);
-       return ioctl(ioctl_socket, cmd, wrq);
+       strncpy(wrq->ifr_name, ifname, IFNAMSIZ);
+       return iwinfo_ioctl(cmd, wrq);
 }
 
 }
 
-static double wext_freq2float(const struct iw_freq *in)
+static inline double wext_freq2float(const struct iw_freq *in)
 {
        int             i;
        double  res = (double) in->m;
 {
        int             i;
        double  res = (double) in->m;
@@ -46,7 +37,7 @@ static double wext_freq2float(const struct iw_freq *in)
        return res;
 }
 
        return res;
 }
 
-static int wext_extract_event(struct stream_descr *stream, struct iw_event *iwe, int wev)
+static inline int wext_extract_event(struct stream_descr *stream, struct iw_event *iwe, int wev)
 {
        const struct iw_ioctl_description *descr = NULL;
        int event_type = 0;
 {
        const struct iw_ioctl_description *descr = NULL;
        int event_type = 0;
@@ -653,9 +644,3 @@ int wext_get_scanlist(const char *ifname, char *buf, int *len)
 
        return -1;
 }
 
        return -1;
 }
-
-void wext_scan_close(void)
-{
-       if( ioctl_socket > -1 )
-               close(ioctl_socket);
-}
index 6456c28..5193902 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * iwinfo - Wireless Information Library - Linux Wireless Extension Headers
  *
 /*
  * iwinfo - Wireless Information Library - Linux Wireless Extension Headers
  *
- *   Copyright (C) 2009 Jo-Philipp Wich <xm@subsignal.org>
+ *   Copyright (C) 2009-2010 Jo-Philipp Wich <xm@subsignal.org>
  *
  * The iwinfo library is free software: you can redistribute it and/or
  * modify it under the terms of the GNU General Public License version 2
  *
  * The iwinfo library is free software: you can redistribute it and/or
  * modify it under the terms of the GNU General Public License version 2
@@ -22,6 +22,7 @@
 #include <fcntl.h>
 
 #include "iwinfo.h"
 #include <fcntl.h>
 
 #include "iwinfo.h"
+#include "iwinfo_utils.h"
 #include "include/wext.h"
 
 
 #include "include/wext.h"
 
 
index a08dcd2..1691e4b 100644 (file)
 #include "iwinfo_wl.h"
 #include "iwinfo_wext.h"
 
 #include "iwinfo_wl.h"
 #include "iwinfo_wext.h"
 
-static int ioctl_socket = -1;
-
 static int wl_ioctl(const char *name, int cmd, void *buf, int len)
 {
        struct ifreq ifr;
        wl_ioctl_t ioc;
 
 static int wl_ioctl(const char *name, int cmd, void *buf, int len)
 {
        struct ifreq ifr;
        wl_ioctl_t ioc;
 
-       /* prepare socket */
-       if( ioctl_socket == -1 )
-       {
-               ioctl_socket = socket(AF_INET, SOCK_DGRAM, 0);
-               fcntl(ioctl_socket, F_SETFD, fcntl(ioctl_socket, F_GETFD) | FD_CLOEXEC);
-       }
-
        /* do it */
        ioc.cmd = cmd;
        ioc.buf = buf;
        ioc.len = len;
        /* do it */
        ioc.cmd = cmd;
        ioc.buf = buf;
        ioc.len = len;
+
        strncpy(ifr.ifr_name, name, IFNAMSIZ);
        ifr.ifr_data = (caddr_t) &ioc;
 
        strncpy(ifr.ifr_name, name, IFNAMSIZ);
        ifr.ifr_data = (caddr_t) &ioc;
 
-       return ioctl(ioctl_socket, SIOCDEVPRIVATE, &ifr);
+       return iwinfo_ioctl(SIOCDEVPRIVATE, &ifr);
 }
 
 static struct wl_maclist * wl_read_assoclist(const char *ifname)
 }
 
 static struct wl_maclist * wl_read_assoclist(const char *ifname)
@@ -77,8 +69,7 @@ int wl_probe(const char *ifname)
 
 void wl_close(void)
 {
 
 void wl_close(void)
 {
-       if( ioctl_socket > -1 )
-               close(ioctl_socket);
+       /* Nop */
 }
 
 int wl_get_mode(const char *ifname, char *buf)
 }
 
 int wl_get_mode(const char *ifname, char *buf)
index 97a8741..95d4961 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * iwinfo - Wireless Information Library - Broadcom wl.o Headers
  *
 /*
  * iwinfo - Wireless Information Library - Broadcom wl.o Headers
  *
- *   Copyright (C) 2009 Jo-Philipp Wich <xm@subsignal.org>
+ *   Copyright (C) 2009-2010 Jo-Philipp Wich <xm@subsignal.org>
  *
  * The iwinfo library is free software: you can redistribute it and/or
  * modify it under the terms of the GNU General Public License version 2
  *
  * The iwinfo library is free software: you can redistribute it and/or
  * modify it under the terms of the GNU General Public License version 2
@@ -22,6 +22,7 @@
 #include <fcntl.h>
 
 #include "iwinfo.h"
 #include <fcntl.h>
 
 #include "iwinfo.h"
+#include "iwinfo_utils.h"
 #include "include/broadcom.h"
 
 int wl_probe(const char *ifname);
 #include "include/broadcom.h"
 
 int wl_probe(const char *ifname);