@ -235,6 +235,94 @@ static char * wpa_config_write_int(const struct parse_data *data,
# endif /* NO_CONFIG_WRITE */
static int wpa_config_parse_addr_list ( const struct parse_data * data ,
int line , const char * value ,
u8 * * list , size_t * num , char * name ,
u8 abort_on_error )
{
const char * pos ;
u8 * buf , * n , addr [ ETH_ALEN ] ;
size_t count ;
buf = NULL ;
count = 0 ;
pos = value ;
while ( pos & & * pos ) {
while ( * pos = = ' ' )
pos + + ;
if ( hwaddr_aton ( pos , addr ) ) {
if ( abort_on_error | | count = = 0 ) {
wpa_printf ( MSG_ERROR ,
" Line %d: Invalid %s address '%s' " ,
line , name , value ) ;
os_free ( buf ) ;
return - 1 ;
}
/* continue anyway since this could have been from a
* truncated configuration file line */
wpa_printf ( MSG_INFO ,
" Line %d: Ignore likely truncated %s address '%s' " ,
line , name , pos ) ;
} else {
n = os_realloc_array ( buf , count + 1 , ETH_ALEN ) ;
if ( n = = NULL ) {
os_free ( buf ) ;
return - 1 ;
}
buf = n ;
os_memmove ( buf + ETH_ALEN , buf , count * ETH_ALEN ) ;
os_memcpy ( buf , addr , ETH_ALEN ) ;
count + + ;
wpa_hexdump ( MSG_MSGDUMP , name , addr , ETH_ALEN ) ;
}
pos = os_strchr ( pos , ' ' ) ;
}
os_free ( * list ) ;
* list = buf ;
* num = count ;
return 0 ;
}
# ifndef NO_CONFIG_WRITE
static char * wpa_config_write_addr_list ( const struct parse_data * data ,
const u8 * list , size_t num , char * name )
{
char * value , * end , * pos ;
int res ;
size_t i ;
if ( list = = NULL | | num = = 0 )
return NULL ;
value = os_malloc ( 20 * num ) ;
if ( value = = NULL )
return NULL ;
pos = value ;
end = value + 20 * num ;
for ( i = num ; i > 0 ; i - - ) {
res = os_snprintf ( pos , end - pos , MACSTR " " ,
MAC2STR ( list + ( i - 1 ) * ETH_ALEN ) ) ;
if ( os_snprintf_error ( end - pos , res ) ) {
os_free ( value ) ;
return NULL ;
}
pos + = res ;
}
if ( pos > value )
pos [ - 1 ] = ' \0 ' ;
return value ;
}
# endif /* NO_CONFIG_WRITE */
static int wpa_config_parse_bssid ( const struct parse_data * data ,
struct wpa_ssid * ssid , int line ,
const char * value )
@ -1453,53 +1541,10 @@ static int wpa_config_parse_p2p_client_list(const struct parse_data *data,
struct wpa_ssid * ssid , int line ,
const char * value )
{
const char * pos ;
u8 * buf , * n , addr [ ETH_ALEN ] ;
size_t count ;
buf = NULL ;
count = 0 ;
pos = value ;
while ( pos & & * pos ) {
while ( * pos = = ' ' )
pos + + ;
if ( hwaddr_aton ( pos , addr ) ) {
if ( count = = 0 ) {
wpa_printf ( MSG_ERROR , " Line %d: Invalid "
" p2p_client_list address '%s'. " ,
line , value ) ;
os_free ( buf ) ;
return - 1 ;
}
/* continue anyway since this could have been from a
* truncated configuration file line */
wpa_printf ( MSG_INFO , " Line %d: Ignore likely "
" truncated p2p_client_list address '%s' " ,
line , pos ) ;
} else {
n = os_realloc_array ( buf , count + 1 , ETH_ALEN ) ;
if ( n = = NULL ) {
os_free ( buf ) ;
return - 1 ;
}
buf = n ;
os_memmove ( buf + ETH_ALEN , buf , count * ETH_ALEN ) ;
os_memcpy ( buf , addr , ETH_ALEN ) ;
count + + ;
wpa_hexdump ( MSG_MSGDUMP , " p2p_client_list " ,
addr , ETH_ALEN ) ;
}
pos = os_strchr ( pos , ' ' ) ;
}
os_free ( ssid - > p2p_client_list ) ;
ssid - > p2p_client_list = buf ;
ssid - > num_p2p_clients = count ;
return 0 ;
return wpa_config_parse_addr_list ( data , line , value ,
& ssid - > p2p_client_list ,
& ssid - > num_p2p_clients ,
" p2p_client_list " , 0 ) ;
}
@ -1507,34 +1552,9 @@ static int wpa_config_parse_p2p_client_list(const struct parse_data *data,
static char * wpa_config_write_p2p_client_list ( const struct parse_data * data ,
struct wpa_ssid * ssid )
{
char * value , * end , * pos ;
int res ;
size_t i ;
if ( ssid - > p2p_client_list = = NULL | | ssid - > num_p2p_clients = = 0 )
return NULL ;
value = os_malloc ( 20 * ssid - > num_p2p_clients ) ;
if ( value = = NULL )
return NULL ;
pos = value ;
end = value + 20 * ssid - > num_p2p_clients ;
for ( i = ssid - > num_p2p_clients ; i > 0 ; i - - ) {
res = os_snprintf ( pos , end - pos , MACSTR " " ,
MAC2STR ( ssid - > p2p_client_list +
( i - 1 ) * ETH_ALEN ) ) ;
if ( os_snprintf_error ( end - pos , res ) ) {
os_free ( value ) ;
return NULL ;
}
pos + = res ;
}
if ( pos > value )
pos [ - 1 ] = ' \0 ' ;
return value ;
return wpa_config_write_addr_list ( data , ssid - > p2p_client_list ,
ssid - > num_p2p_clients ,
" p2p_client_list " ) ;
}
# endif /* NO_CONFIG_WRITE */