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
PKG_NAME:=libiwinfo
PKG_RELEASE:=8
PKG_RELEASE:=9
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_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
@ -22,11 +22,10 @@ endif
%.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)

View file

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

View file

@ -1,7 +1,7 @@
/*
* 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
@ -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);
@ -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)
@ -318,7 +298,7 @@ static char * madwifi_ifadd(const char *ifname)
strncpy(ifr.ifr_name, wifidev, IFNAMSIZ);
ifr.ifr_data = (void *)&cp;
if( !madwifi_ioctl(SIOC80211IFCREATE, &ifr) )
if( !iwinfo_ioctl(SIOC80211IFCREATE, &ifr) )
return nif;
}
@ -330,35 +310,7 @@ static void madwifi_ifdel(const char *ifname)
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)
{
if( ioctl_socket > -1 )
close(ioctl_socket);
/* Nop */
}
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_ifup(e->d_name) )
if( iwinfo_ifup(e->d_name) )
{
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( madwifi_ifup(res) )
if( iwinfo_ifup(res) )
ret = wext_get_scanlist(res, buf, len);
madwifi_ifdown(res);
iwinfo_ifdown(res);
madwifi_ifdel(res);
}
}
@ -988,9 +939,9 @@ int madwifi_get_mbssid_support(const char *ifname, int *buf)
if( nif )
{
*buf = madwifi_ifup(nif);
*buf = iwinfo_ifup(nif);
madwifi_ifdown(nif);
iwinfo_ifdown(nif);
madwifi_ifdel(nif);
return 0;

View file

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

View file

@ -29,7 +29,6 @@
extern struct iwinfo_iso3166_label ISO3166_Names[];
static struct nl80211_state *nls = NULL;
static int nl80211_ioctlsock = -1;
static int nl80211_init(void)
{
@ -37,19 +36,6 @@ static int nl80211_init(void)
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;
@ -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;
@ -577,11 +520,6 @@ int nl80211_probe(const char *ifname)
void nl80211_close(void)
{
if( nl80211_ioctlsock > -1 )
{
close(nl80211_ioctlsock);
}
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;
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;
entry.mw = wext_dbm2mw(dbm_max);
entry.mw = iwinfo_dbm2mw(dbm_max);
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 */
if( (res = nl80211_wpasupp_info(ifname, "SCAN")) &&
!strcmp(res, "OK\n") )
if( (res = nl80211_wpasupp_info(ifname, "SCAN")) && !strcmp(res, "OK\n") )
{
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) )
{
if( !nl80211_ifup(ifname) )
if( !iwinfo_ifup(ifname) )
return -1;
wext_get_scanlist(ifname, buf, len);
nl80211_ifdown(ifname);
iwinfo_ifdown(ifname);
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( !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 */
if( nl80211_ifup(res) )
if( iwinfo_ifup(res) )
{
wext_get_scanlist(res, buf, len);
nl80211_ifdown(res);
iwinfo_ifdown(res);
}
/* 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);
nl80211_ifdown(res);
nl80211_ifup(ifname);
iwinfo_ifdown(res);
iwinfo_ifup(ifname);
nl80211_hostapd_hup(ifname);
}
@ -1552,9 +1489,9 @@ int nl80211_get_mbssid_support(const char *ifname, int *buf)
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;

View file

@ -25,15 +25,14 @@
#include <string.h>
#include <dirent.h>
#include <signal.h>
#include <sys/socket.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 "iwinfo_utils.h"
#include "include/nl80211.h"
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_wext.h"
#define LOG10_MAGIC 1.25892541179
static int ioctl_socket = -1;
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;
}
static int wext_freq2mhz(const struct iw_freq *in)
static inline int wext_freq2mhz(const struct iw_freq *in)
{
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);
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)
{
wext_scan_close();
if( ioctl_socket > -1 )
close(ioctl_socket);
/* Nop */
}
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)
*buf = wext_mw2dbm(wrq.u.txpower.value);
*buf = iwinfo_mw2dbm(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 )
{
entry.dbm = wext_mw2dbm(range.txpower[i]);
entry.dbm = iwinfo_mw2dbm(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];
entry.mw = wext_dbm2mw(range.txpower[i]);
entry.mw = iwinfo_dbm2mw(range.txpower[i]);
}
memcpy(&buf[i*sizeof(entry)], &entry, sizeof(entry));

View file

@ -1,7 +1,7 @@
/*
* 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
@ -22,12 +22,10 @@
#include <fcntl.h>
#include "iwinfo.h"
#include "iwinfo_utils.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);
@ -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);
void wext_scan_close(void);
void wext_close(void);
#endif

View file

@ -1,7 +1,7 @@
/*
* 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
@ -23,22 +23,13 @@
#include "iwinfo_wext_scan.h"
static int ioctl_socket = -1;
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;
@ -46,7 +37,7 @@ static double wext_freq2float(const struct iw_freq *in)
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;
@ -653,9 +644,3 @@ int wext_get_scanlist(const char *ifname, char *buf, int *len)
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
*
* 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
@ -22,6 +22,7 @@
#include <fcntl.h>
#include "iwinfo.h"
#include "iwinfo_utils.h"
#include "include/wext.h"

View file

@ -21,28 +21,20 @@
#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;
/* 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;
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)
@ -77,8 +69,7 @@ int wl_probe(const char *ifname)
void wl_close(void)
{
if( ioctl_socket > -1 )
close(ioctl_socket);
/* Nop */
}
int wl_get_mode(const char *ifname, char *buf)

View file

@ -1,7 +1,7 @@
/*
* 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
@ -22,6 +22,7 @@
#include <fcntl.h>
#include "iwinfo.h"
#include "iwinfo_utils.h"
#include "include/broadcom.h"
int wl_probe(const char *ifname);