libiwinfo: reuse existing temporary interface for scanning

This commit is contained in:
Jo-Philipp Wich 2010-10-12 06:43:46 +00:00
parent 62fe7c0e77
commit 1423d3556e

View file

@ -1138,7 +1138,7 @@ static void nl80211_get_scancrypto(const char *spec,
int nl80211_get_scanlist(const char *ifname, char *buf, int *len) int nl80211_get_scanlist(const char *ifname, char *buf, int *len)
{ {
int freq, rssi, qmax, count; int freq, rssi, qmax, count, is_tmp = 0;
char *res; char *res;
char cmd[256]; char cmd[256];
char ssid[128] = { 0 }; char ssid[128] = { 0 };
@ -1245,40 +1245,55 @@ int nl80211_get_scanlist(const char *ifname, char *buf, int *len)
{ {
if( (res = nl80211_ifname2phy(ifname)) != NULL ) if( (res = nl80211_ifname2phy(ifname)) != NULL )
{ {
/* /* Got a temp interface, don't create yet another one */
* This is a big ugly hack, just look away. if( !strncmp(ifname, "tmp.", 4) )
*/ {
sprintf(cmd, "ifconfig %s up 2>/dev/null", ifname);
if( WEXITSTATUS(system(cmd)) )
return -1;
sprintf(cmd, "ifconfig %s down 2>/dev/null", ifname); wext_get_scanlist(ifname, buf, len);
if( WEXITSTATUS(system(cmd)) )
goto out;
sprintf(cmd, "iw phy %s interface add scan.%s " sprintf(cmd, "ifconfig %s down 2>/dev/null", ifname);
"type station 2>/dev/null", res, ifname); (void) WEXITSTATUS(system(cmd));
if( WEXITSTATUS(system(cmd)) )
goto out;
sprintf(cmd, "ifconfig scan.%s up 2>/dev/null", ifname); return 0;
if( WEXITSTATUS(system(cmd)) ) }
goto out;
sprintf(cmd, "scan.%s", ifname); /* Spawn a new scan interface */
wext_get_scanlist(cmd, buf, len); else
{
sprintf(cmd, "ifconfig %s down 2>/dev/null", ifname);
if( WEXITSTATUS(system(cmd)) )
goto out;
out: sprintf(cmd, "iw phy %s interface add scan.%s "
sprintf(cmd, "ifconfig scan.%s down 2>/dev/null", ifname); "type station 2>/dev/null", res, ifname);
(void) WEXITSTATUS(system(cmd)); if( WEXITSTATUS(system(cmd)) )
goto out;
sprintf(cmd, "iw dev scan.%s del 2>/dev/null", ifname); sprintf(cmd, "ifconfig scan.%s up 2>/dev/null", ifname);
(void) WEXITSTATUS(system(cmd)); if( WEXITSTATUS(system(cmd)) )
goto out;
sprintf(cmd, "ifconfig %s up 2>/dev/null", ifname); sprintf(cmd, "scan.%s", ifname);
(void) WEXITSTATUS(system(cmd)); wext_get_scanlist(cmd, buf, len);
sprintf(cmd, "killall -HUP hostapd 2>/dev/null"); out:
(void) WEXITSTATUS(system(cmd)); sprintf(cmd, "ifconfig scan.%s down 2>/dev/null", ifname);
(void) WEXITSTATUS(system(cmd));
return 0; sprintf(cmd, "iw dev scan.%s del 2>/dev/null", ifname);
(void) WEXITSTATUS(system(cmd));
sprintf(cmd, "ifconfig %s up 2>/dev/null", ifname);
(void) WEXITSTATUS(system(cmd));
sprintf(cmd, "killall -HUP hostapd 2>/dev/null");
(void) WEXITSTATUS(system(cmd));
return 0;
}
} }
} }