libiwinfo: move duplicated coded into iwinfo_utils.[ch]

This commit is contained in:
Jo-Philipp Wich 2010-10-24 17:21:54 +00:00
parent 6ef55ba327
commit eecec8b0f2
15 changed files with 216 additions and 234 deletions

View file

@ -7,7 +7,7 @@
include $(TOPDIR)/rules.mk include $(TOPDIR)/rules.mk
PKG_NAME:=libiwinfo PKG_NAME:=libiwinfo
PKG_RELEASE:=8 PKG_RELEASE:=9
PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)

View file

@ -2,7 +2,7 @@ IWINFO_BACKENDS = $(if $(BACKENDS),$(BACKENDS),madwifi nl80211)
IWINFO_LDFLAGS = $(LDFLAGS) -shared -llua IWINFO_LDFLAGS = $(LDFLAGS) -shared -llua
IWINFO_CFLAGS = $(CFLAGS) -std=gnu99 -fstrict-aliasing IWINFO_CFLAGS = $(CFLAGS) -std=gnu99 -fstrict-aliasing
IWINFO_SO = iwinfo.so 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)),) ifneq ($(filter wl,$(IWINFO_BACKENDS)),)
IWINFO_CFLAGS += -DUSE_WL IWINFO_CFLAGS += -DUSE_WL
@ -29,4 +29,3 @@ compile: clean $(IWINFO_OBJ)
clean: clean:
rm -f *.o $(IWINFO_SO) rm -f *.o $(IWINFO_SO)

View file

@ -321,6 +321,7 @@ static int iwinfo_L__gc(lua_State *L)
nl80211_close(); nl80211_close();
#endif #endif
wext_close(); wext_close();
iwinfo_close();
} }
/* /*

View 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 * 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 * 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) static int madwifi_wrq(struct iwreq *wrq, const char *ifname, int cmd, void *data, size_t len)
{ {
strncpy(wrq->ifr_name, ifname, IFNAMSIZ); 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); strncpy(ifr.ifr_name, wifidev, IFNAMSIZ);
ifr.ifr_data = (void *)&cp; 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 }; struct ifreq ifr = { 0 };
strncpy(ifr.ifr_name, ifname, IFNAMSIZ); strncpy(ifr.ifr_name, ifname, IFNAMSIZ);
madwifi_ioctl(SIOC80211IFDESTROY, &ifr); iwinfo_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);
} }
@ -369,8 +321,7 @@ int madwifi_probe(const char *ifname)
void madwifi_close(void) void madwifi_close(void)
{ {
if( ioctl_socket > -1 ) /* Nop */
close(ioctl_socket);
} }
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); ret = wext_get_scanlist(e->d_name, buf, len);
break; 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); madwifi_ifdel(nif);
return 0; return 0;

View file

@ -22,6 +22,7 @@
#include <fcntl.h> #include <fcntl.h>
#include "iwinfo.h" #include "iwinfo.h"
#include "iwinfo_utils.h"
#include "include/madwifi.h" #include "include/madwifi.h"
int madwifi_probe(const char *ifname); int madwifi_probe(const char *ifname);

View file

@ -29,7 +29,6 @@
extern struct iwinfo_iso3166_label ISO3166_Names[]; extern struct iwinfo_iso3166_label ISO3166_Names[];
static struct nl80211_state *nls = NULL; 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)); nls = malloc(sizeof(struct nl80211_state));
if( !nls ) { if( !nls ) {
err = -ENOMEM; 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) static void nl80211_hostapd_hup(const char *ifname)
{ {
int fd, pid = 0; 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 )
{ {
if( nls->nl_sock ) if( nls->nl_sock )
@ -1169,13 +1107,13 @@ int nl80211_get_txpwrlist(const char *ifname, char *buf, int *len)
dbm_cur += 2, dbm_cnt++ ) dbm_cur += 2, dbm_cnt++ )
{ {
entry.dbm = dbm_cur; 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)); memcpy(&buf[dbm_cnt * sizeof(entry)], &entry, sizeof(entry));
} }
entry.dbm = dbm_max; 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)); memcpy(&buf[dbm_cnt * sizeof(entry)], &entry, sizeof(entry));
dbm_cnt++; 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; struct iwinfo_scanlist_entry *e = (struct iwinfo_scanlist_entry *)buf;
/* WPA supplicant */ /* WPA supplicant */
if( (res = nl80211_wpasupp_info(ifname, "SCAN")) && if( (res = nl80211_wpasupp_info(ifname, "SCAN")) && !strcmp(res, "OK\n") )
!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 */ /* Got a temp interface, don't create yet another one */
if( !strncmp(ifname, "tmp.", 4) ) if( !strncmp(ifname, "tmp.", 4) )
{ {
if( !nl80211_ifup(ifname) ) if( !iwinfo_ifup(ifname) )
return -1; return -1;
wext_get_scanlist(ifname, buf, len); 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)) ) if( !(res = nl80211_ifadd(ifname)) )
goto out; goto out;
if( !nl80211_ifmac(res) ) if( !iwinfo_ifmac(res) )
goto out; goto out;
/* if we can take the new interface up, the driver supports an /* if we can take the new interface up, the driver supports an
* additional interface and there's no need to tear down the ap */ * 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 /* driver cannot create secondary interface, take down ap
* during scan */ * 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); iwinfo_ifdown(res);
nl80211_ifup(ifname); 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); nl80211_ifdel(nif);
return 0; return 0;

View file

@ -25,15 +25,14 @@
#include <string.h> #include <string.h>
#include <dirent.h> #include <dirent.h>
#include <signal.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/netlink.h>
#include <netlink/genl/genl.h> #include <netlink/genl/genl.h>
#include <netlink/genl/family.h> #include <netlink/genl/family.h>
#include <netlink/genl/ctrl.h> #include <netlink/genl/ctrl.h>
#include "iwinfo.h" #include "iwinfo.h"
#include "iwinfo_utils.h"
#include "include/nl80211.h" #include "include/nl80211.h"
struct nl80211_state { struct nl80211_state {

View file

@ -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);
}

View file

@ -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

View file

@ -22,10 +22,6 @@
#include "iwinfo.h" #include "iwinfo.h"
#include "iwinfo_wext.h" #include "iwinfo_wext.h"
#define LOG10_MAGIC 1.25892541179
static int ioctl_socket = -1;
static double wext_freq2float(const struct iw_freq *in) static double wext_freq2float(const struct iw_freq *in)
{ {
int i; 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) ) if( !strncmp(ifname, "mon.", 4) )
strncpy(wrq->ifr_name, &ifname[4], IFNAMSIZ); strncpy(wrq->ifr_name, &ifname[4], IFNAMSIZ);
else else
strncpy(wrq->ifr_name, ifname, IFNAMSIZ); 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(); /* Nop */
if( ioctl_socket > -1 )
close(ioctl_socket);
} }
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(wext_ioctl(ifname, SIOCGIWTXPOW, &wrq) >= 0)
{ {
if(wrq.u.txpower.flags & IW_TXPOW_MWATT) if(wrq.u.txpower.flags & IW_TXPOW_MWATT)
*buf = wext_mw2dbm(wrq.u.txpower.value); *buf = iwinfo_mw2dbm(wrq.u.txpower.value);
else else
*buf = wrq.u.txpower.value; *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 ) */ else /* if( range.txpower_capa & IW_TXPOW_DBM ) */
{ {
entry.dbm = range.txpower[i]; 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));

View 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 * 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 * modify it under the terms of the GNU General Public License version 2
@ -22,12 +22,10 @@
#include <fcntl.h> #include <fcntl.h>
#include "iwinfo.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_probe(const char *ifname);
int wext_get_mode(const char *ifname, char *buf); int wext_get_mode(const char *ifname, char *buf);
int wext_get_ssid(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_countrylist(const char *ifname, char *buf, int *len);
int wext_get_hwmodelist(const char *ifname, int *buf); int wext_get_hwmodelist(const char *ifname, int *buf);
int wext_get_mbssid_support(const char *ifname, int *buf); int wext_get_mbssid_support(const char *ifname, int *buf);
void wext_scan_close(void);
void wext_close(void); void wext_close(void);
#endif #endif

View 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 * 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 * modify it under the terms of the GNU General Public License version 2
@ -23,22 +23,13 @@
#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 */ strncpy(wrq->ifr_name, ifname, IFNAMSIZ);
if( ioctl_socket == -1 ) return iwinfo_ioctl(cmd, wrq);
{
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);
} }
static double wext_freq2float(const struct iw_freq *in) static inline double wext_freq2float(const struct iw_freq *in)
{ {
int i; int i;
double res = (double) in->m; 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; const struct iw_ioctl_description *descr = NULL;
int event_type = 0; 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);
}

View 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 * 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 * modify it under the terms of the GNU General Public License version 2
@ -22,6 +22,7 @@
#include <fcntl.h> #include <fcntl.h>
#include "iwinfo.h" #include "iwinfo.h"
#include "iwinfo_utils.h"
#include "include/wext.h" #include "include/wext.h"

View file

@ -21,28 +21,20 @@
#include "iwinfo_wl.h" #include "iwinfo_wl.h"
#include "iwinfo_wext.h" #include "iwinfo_wext.h"
static int ioctl_socket = -1;
static int wl_ioctl(const char *name, int cmd, void *buf, int len) static int wl_ioctl(const char *name, int cmd, void *buf, int len)
{ {
struct ifreq ifr; struct ifreq ifr;
wl_ioctl_t ioc; 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 */ /* do it */
ioc.cmd = cmd; ioc.cmd = cmd;
ioc.buf = buf; ioc.buf = buf;
ioc.len = len; ioc.len = len;
strncpy(ifr.ifr_name, name, IFNAMSIZ); strncpy(ifr.ifr_name, name, IFNAMSIZ);
ifr.ifr_data = (caddr_t) &ioc; 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 ) /* Nop */
close(ioctl_socket);
} }
int wl_get_mode(const char *ifname, char *buf) int wl_get_mode(const char *ifname, char *buf)

View 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 * 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 * modify it under the terms of the GNU General Public License version 2
@ -22,6 +22,7 @@
#include <fcntl.h> #include <fcntl.h>
#include "iwinfo.h" #include "iwinfo.h"
#include "iwinfo_utils.h"
#include "include/broadcom.h" #include "include/broadcom.h"
int wl_probe(const char *ifname); int wl_probe(const char *ifname);