@ -30,7 +30,10 @@
# include "wps_supplicant.h"
# include "wps/wps.h"
extern struct wpa_driver_ops * wpa_supplicant_drivers [ ] ;
static int wpa_supplicant_global_iface_list ( struct wpa_global * global ,
char * buf , int len ) ;
static int wpa_supplicant_global_iface_interfaces ( struct wpa_global * global ,
char * buf , int len ) ;
@ -1624,6 +1627,9 @@ char * wpa_supplicant_ctrl_iface_process(struct wpa_supplicant *wpa_s,
} else if ( os_strncmp ( buf , " AP_SCAN " , 8 ) = = 0 ) {
if ( wpa_supplicant_ctrl_iface_ap_scan ( wpa_s , buf + 8 ) )
reply_len = - 1 ;
} else if ( os_strcmp ( buf , " INTERFACE_LIST " ) = = 0 ) {
reply_len = wpa_supplicant_global_iface_list (
wpa_s - > global , reply , reply_size ) ;
} else if ( os_strcmp ( buf , " INTERFACES " ) = = 0 ) {
reply_len = wpa_supplicant_global_iface_interfaces (
wpa_s - > global , reply , reply_size ) ;
@ -1739,6 +1745,63 @@ static int wpa_supplicant_global_iface_remove(struct wpa_global *global,
}
static void wpa_free_iface_info ( struct wpa_interface_info * iface )
{
struct wpa_interface_info * prev ;
while ( iface ) {
prev = iface ;
iface = iface - > next ;
os_free ( prev - > ifname ) ;
os_free ( prev - > desc ) ;
os_free ( prev ) ;
}
}
static int wpa_supplicant_global_iface_list ( struct wpa_global * global ,
char * buf , int len )
{
int i , res ;
struct wpa_interface_info * iface = NULL , * last = NULL , * tmp ;
char * pos , * end ;
for ( i = 0 ; wpa_supplicant_drivers [ i ] ; i + + ) {
struct wpa_driver_ops * drv = wpa_supplicant_drivers [ i ] ;
if ( drv - > get_interfaces = = NULL )
continue ;
tmp = drv - > get_interfaces ( global - > drv_priv ) ;
if ( tmp = = NULL )
continue ;
if ( last = = NULL )
iface = last = tmp ;
else
last - > next = tmp ;
while ( last - > next )
last = last - > next ;
}
pos = buf ;
end = buf + len ;
for ( tmp = iface ; tmp ; tmp = tmp - > next ) {
res = os_snprintf ( pos , end - pos , " %s \t %s \t %s \n " ,
tmp - > drv_name , tmp - > ifname ,
tmp - > desc ? tmp - > desc : " " ) ;
if ( res < 0 | | res > = end - pos ) {
* pos = ' \0 ' ;
break ;
}
pos + = res ;
}
wpa_free_iface_info ( iface ) ;
return pos - buf ;
}
static int wpa_supplicant_global_iface_interfaces ( struct wpa_global * global ,
char * buf , int len )
{
@ -1791,6 +1854,9 @@ char * wpa_supplicant_global_ctrl_iface_process(struct wpa_global *global,
} else if ( os_strncmp ( buf , " INTERFACE_REMOVE " , 17 ) = = 0 ) {
if ( wpa_supplicant_global_iface_remove ( global , buf + 17 ) )
reply_len = - 1 ;
} else if ( os_strcmp ( buf , " INTERFACE_LIST " ) = = 0 ) {
reply_len = wpa_supplicant_global_iface_list (
global , reply , reply_size ) ;
} else if ( os_strcmp ( buf , " INTERFACES " ) = = 0 ) {
reply_len = wpa_supplicant_global_iface_interfaces (
global , reply , reply_size ) ;