libiwinfo: reuse existing temporary interface for scanning

remotes/tags/0.10.0
Jo-Philipp Wich 2010-10-12 06:43:46 +00:00
parent 62fe7c0e77
commit 1423d3556e
1 changed files with 41 additions and 26 deletions

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 freq, rssi, qmax, count;
int freq, rssi, qmax, count, is_tmp = 0;
char *res;
char cmd[256];
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 )
{
/*
* This is a big ugly hack, just look away.
*/
/* Got a temp interface, don't create yet another one */
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);
if( WEXITSTATUS(system(cmd)) )
goto out;
wext_get_scanlist(ifname, buf, len);
sprintf(cmd, "iw phy %s interface add scan.%s "
"type station 2>/dev/null", res, ifname);
if( WEXITSTATUS(system(cmd)) )
goto out;
sprintf(cmd, "ifconfig %s down 2>/dev/null", ifname);
(void) WEXITSTATUS(system(cmd));
sprintf(cmd, "ifconfig scan.%s up 2>/dev/null", ifname);
if( WEXITSTATUS(system(cmd)) )
goto out;
return 0;
}
sprintf(cmd, "scan.%s", ifname);
wext_get_scanlist(cmd, buf, len);
/* Spawn a new scan interface */
else
{
sprintf(cmd, "ifconfig %s down 2>/dev/null", ifname);
if( WEXITSTATUS(system(cmd)) )
goto out;
out:
sprintf(cmd, "ifconfig scan.%s down 2>/dev/null", ifname);
(void) WEXITSTATUS(system(cmd));
sprintf(cmd, "iw phy %s interface add scan.%s "
"type station 2>/dev/null", res, ifname);
if( WEXITSTATUS(system(cmd)) )
goto out;
sprintf(cmd, "iw dev scan.%s del 2>/dev/null", ifname);
(void) WEXITSTATUS(system(cmd));
sprintf(cmd, "ifconfig scan.%s up 2>/dev/null", ifname);
if( WEXITSTATUS(system(cmd)) )
goto out;
sprintf(cmd, "ifconfig %s up 2>/dev/null", ifname);
(void) WEXITSTATUS(system(cmd));
sprintf(cmd, "scan.%s", ifname);
wext_get_scanlist(cmd, buf, len);
sprintf(cmd, "killall -HUP hostapd 2>/dev/null");
(void) WEXITSTATUS(system(cmd));
out:
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;
}
}
}