2008-02-28 02:34:43 +01:00
/*
* WPA Supplicant - command line interface for wpa_supplicant daemon
2017-01-03 00:32:09 +01:00
* Copyright ( c ) 2004 - 2017 , Jouni Malinen < j @ w1 . fi >
2008-02-28 02:34:43 +01:00
*
2012-02-11 15:46:35 +01:00
* This software may be distributed under the terms of the BSD license .
* See README for more details .
2008-02-28 02:34:43 +01:00
*/
# include "includes.h"
# ifdef CONFIG_CTRL_IFACE
# ifdef CONFIG_CTRL_IFACE_UNIX
# include <dirent.h>
# endif /* CONFIG_CTRL_IFACE_UNIX */
2016-07-07 14:04:34 +02:00
# include "common/cli.h"
2009-11-29 16:51:55 +01:00
# include "common/wpa_ctrl.h"
2010-11-14 12:16:51 +01:00
# include "utils/common.h"
# include "utils/eloop.h"
2010-11-14 19:59:29 +01:00
# include "utils/edit.h"
2011-10-28 22:37:34 +02:00
# include "utils/list.h"
2009-11-29 16:51:55 +01:00
# include "common/version.h"
2011-09-08 19:52:23 +02:00
# include "common/ieee802_11_defs.h"
2011-03-15 14:18:07 +01:00
# ifdef ANDROID
# include <cutils/properties.h>
# endif /* ANDROID */
2008-02-28 02:34:43 +01:00
2015-04-24 09:19:53 +02:00
static const char * const wpa_cli_version =
2008-02-28 02:34:43 +01:00
" wpa_cli v " VERSION_STR " \n "
2017-01-03 00:32:09 +01:00
" Copyright (c) 2004-2017, Jouni Malinen <j@w1.fi> and contributors " ;
2008-02-28 02:34:43 +01:00
2015-10-29 08:05:48 +01:00
# define VENDOR_ELEM_FRAME_ID \
" 0: Probe Req (P2P), 1: Probe Resp (P2P) , 2: Probe Resp (GO), " \
" 3: Beacon (GO), 4: PD Req, 5: PD Resp, 6: GO Neg Req, " \
" 7: GO Neg Resp, 8: GO Neg Conf, 9: Inv Req, 10: Inv Resp, " \
" 11: Assoc Req (P2P), 12: Assoc Resp (P2P) "
2008-02-28 02:34:43 +01:00
static struct wpa_ctrl * ctrl_conn ;
2010-02-13 20:37:35 +01:00
static struct wpa_ctrl * mon_conn ;
2008-02-28 02:34:43 +01:00
static int wpa_cli_quit = 0 ;
static int wpa_cli_attached = 0 ;
2013-08-31 16:27:20 +02:00
static int wpa_cli_connected = - 1 ;
2008-02-28 02:34:43 +01:00
static int wpa_cli_last_id = 0 ;
2011-03-15 14:26:27 +01:00
# ifndef CONFIG_CTRL_IFACE_DIR
# define CONFIG_CTRL_IFACE_DIR " / var / run / wpa_supplicant"
# endif /* CONFIG_CTRL_IFACE_DIR */
static const char * ctrl_iface_dir = CONFIG_CTRL_IFACE_DIR ;
2015-08-25 06:34:03 +02:00
static const char * client_socket_dir = NULL ;
2008-02-28 02:34:43 +01:00
static char * ctrl_ifname = NULL ;
static const char * pid_file = NULL ;
static const char * action_file = NULL ;
2009-01-20 20:12:00 +01:00
static int ping_interval = 5 ;
2010-02-13 20:37:35 +01:00
static int interactive = 0 ;
2013-05-23 19:04:17 +02:00
static char * ifname_prefix = NULL ;
2008-02-28 02:34:43 +01:00
2011-10-28 22:37:34 +02:00
static DEFINE_DL_LIST ( bsses ) ; /* struct cli_txt_entry */
static DEFINE_DL_LIST ( p2p_peers ) ; /* struct cli_txt_entry */
2011-10-28 22:59:13 +02:00
static DEFINE_DL_LIST ( p2p_groups ) ; /* struct cli_txt_entry */
2013-05-23 19:35:02 +02:00
static DEFINE_DL_LIST ( ifnames ) ; /* struct cli_txt_entry */
2015-03-24 17:10:37 +01:00
static DEFINE_DL_LIST ( networks ) ; /* struct cli_txt_entry */
2016-10-12 14:19:00 +02:00
# ifdef CONFIG_AP
static DEFINE_DL_LIST ( stations ) ; /* struct cli_txt_entry */
# endif /* CONFIG_AP */
2011-10-28 22:37:34 +02:00
2008-02-28 02:34:43 +01:00
2012-08-26 20:30:06 +02:00
static void print_help ( const char * cmd ) ;
2010-11-14 12:16:51 +01:00
static void wpa_cli_mon_receive ( int sock , void * eloop_ctx , void * sock_ctx ) ;
2012-08-05 19:58:44 +02:00
static void wpa_cli_close_connection ( void ) ;
2012-08-05 21:04:22 +02:00
static char * wpa_cli_get_default_ifname ( void ) ;
2012-08-26 20:30:06 +02:00
static char * * wpa_list_cmd_list ( void ) ;
2015-03-24 17:10:37 +01:00
static void update_networks ( struct wpa_ctrl * ctrl ) ;
2016-10-12 14:19:00 +02:00
static void update_stations ( struct wpa_ctrl * ctrl ) ;
2009-01-05 20:32:48 +01:00
2008-02-28 02:34:43 +01:00
static void usage ( void )
{
printf ( " wpa_cli [-p<path to ctrl sockets>] [-i<ifname>] [-hvB] "
" [-a<action file>] \\ \n "
2015-08-25 06:34:03 +02:00
" [-P<pid file>] [-g<global ctrl>] [-G<ping interval>] "
" \\ \n "
" [-s<wpa_client_socket_file_path>] "
2009-01-20 20:12:00 +01:00
" [command..] \n "
2008-02-28 02:34:43 +01:00
" -h = help (show this usage text) \n "
" -v = shown version information \n "
" -a = run in daemon mode executing the action file based on "
" events from \n "
" wpa_supplicant \n "
" -B = run a daemon in the background \n "
2011-03-15 14:26:27 +01:00
" default path: " CONFIG_CTRL_IFACE_DIR " \n "
2009-01-05 20:32:48 +01:00
" default interface: first interface found in socket path \n " ) ;
2012-08-26 20:30:06 +02:00
print_help ( NULL ) ;
2008-02-28 02:34:43 +01:00
}
2010-07-18 23:30:24 +02:00
static int wpa_cli_show_event ( const char * event )
{
const char * start ;
start = os_strchr ( event , ' > ' ) ;
if ( start = = NULL )
return 1 ;
start + + ;
/*
* Skip BSS added / removed events since they can be relatively frequent
* and are likely of not much use for an interactive user .
*/
if ( str_starts ( start , WPA_EVENT_BSS_ADDED ) | |
str_starts ( start , WPA_EVENT_BSS_REMOVED ) )
return 0 ;
return 1 ;
}
2010-02-13 20:37:35 +01:00
static int wpa_cli_open_connection ( const char * ifname , int attach )
2008-02-28 02:34:43 +01:00
{
# if defined(CONFIG_CTRL_IFACE_UDP) || defined(CONFIG_CTRL_IFACE_NAMED_PIPE)
ctrl_conn = wpa_ctrl_open ( ifname ) ;
2010-02-13 20:37:35 +01:00
if ( ctrl_conn = = NULL )
return - 1 ;
if ( attach & & interactive )
mon_conn = wpa_ctrl_open ( ifname ) ;
else
mon_conn = NULL ;
2008-02-28 02:34:43 +01:00
# else /* CONFIG_CTRL_IFACE_UDP || CONFIG_CTRL_IFACE_NAMED_PIPE */
2011-03-15 14:18:07 +01:00
char * cfile = NULL ;
2008-02-28 02:34:43 +01:00
int flen , res ;
if ( ifname = = NULL )
2010-02-13 20:37:35 +01:00
return - 1 ;
2008-02-28 02:34:43 +01:00
2011-03-15 14:18:07 +01:00
# ifdef ANDROID
if ( access ( ctrl_iface_dir , F_OK ) < 0 ) {
cfile = os_strdup ( ifname ) ;
if ( cfile = = NULL )
return - 1 ;
}
# endif /* ANDROID */
2015-08-25 06:34:03 +02:00
if ( client_socket_dir & & client_socket_dir [ 0 ] & &
access ( client_socket_dir , F_OK ) < 0 ) {
perror ( client_socket_dir ) ;
os_free ( cfile ) ;
return - 1 ;
}
2011-03-15 14:18:07 +01:00
if ( cfile = = NULL ) {
flen = os_strlen ( ctrl_iface_dir ) + os_strlen ( ifname ) + 2 ;
cfile = os_malloc ( flen ) ;
if ( cfile = = NULL )
return - 1 ;
res = os_snprintf ( cfile , flen , " %s/%s " , ctrl_iface_dir ,
ifname ) ;
Check os_snprintf() result more consistently - automatic 1
This converts os_snprintf() result validation cases to use
os_snprintf_error() where the exact rule used in os_snprintf_error() was
used. These changes were done automatically with spatch using the
following semantic patch:
@@
identifier E1;
expression E2,E3,E4,E5,E6;
statement S1;
@@
(
E1 = os_snprintf(E2, E3, ...);
|
int E1 = os_snprintf(E2, E3, ...);
|
if (E5)
E1 = os_snprintf(E2, E3, ...);
else
E1 = os_snprintf(E2, E3, ...);
|
if (E5)
E1 = os_snprintf(E2, E3, ...);
else if (E6)
E1 = os_snprintf(E2, E3, ...);
else
E1 = 0;
|
if (E5) {
...
E1 = os_snprintf(E2, E3, ...);
} else {
...
return -1;
}
|
if (E5) {
...
E1 = os_snprintf(E2, E3, ...);
} else if (E6) {
...
E1 = os_snprintf(E2, E3, ...);
} else {
...
return -1;
}
|
if (E5) {
...
E1 = os_snprintf(E2, E3, ...);
} else {
...
E1 = os_snprintf(E2, E3, ...);
}
)
? os_free(E4);
- if (E1 < 0 || \( E1 >= E3 \| (size_t) E1 >= E3 \| (unsigned int) E1 >= E3 \| E1 >= (int) E3 \))
+ if (os_snprintf_error(E3, E1))
(
S1
|
{ ... }
)
Signed-off-by: Jouni Malinen <j@w1.fi>
2014-12-08 10:15:51 +01:00
if ( os_snprintf_error ( flen , res ) ) {
2011-03-15 14:18:07 +01:00
os_free ( cfile ) ;
return - 1 ;
}
2008-02-28 02:34:43 +01:00
}
2015-08-25 06:34:03 +02:00
ctrl_conn = wpa_ctrl_open2 ( cfile , client_socket_dir ) ;
2010-02-13 20:37:35 +01:00
if ( ctrl_conn = = NULL ) {
os_free ( cfile ) ;
return - 1 ;
}
if ( attach & & interactive )
2015-08-25 06:34:03 +02:00
mon_conn = wpa_ctrl_open2 ( cfile , client_socket_dir ) ;
2010-02-13 20:37:35 +01:00
else
mon_conn = NULL ;
2008-02-28 02:34:43 +01:00
os_free ( cfile ) ;
# endif /* CONFIG_CTRL_IFACE_UDP || CONFIG_CTRL_IFACE_NAMED_PIPE */
2010-02-13 20:37:35 +01:00
if ( mon_conn ) {
if ( wpa_ctrl_attach ( mon_conn ) = = 0 ) {
wpa_cli_attached = 1 ;
2010-11-14 12:16:51 +01:00
if ( interactive )
eloop_register_read_sock (
wpa_ctrl_get_fd ( mon_conn ) ,
wpa_cli_mon_receive , NULL , NULL ) ;
2010-02-13 20:37:35 +01:00
} else {
printf ( " Warning: Failed to attach to "
" wpa_supplicant. \n " ) ;
2012-08-05 19:58:44 +02:00
wpa_cli_close_connection ( ) ;
2010-02-13 20:37:35 +01:00
return - 1 ;
}
}
return 0 ;
2008-02-28 02:34:43 +01:00
}
static void wpa_cli_close_connection ( void )
{
if ( ctrl_conn = = NULL )
return ;
if ( wpa_cli_attached ) {
2010-02-13 20:37:35 +01:00
wpa_ctrl_detach ( interactive ? mon_conn : ctrl_conn ) ;
2008-02-28 02:34:43 +01:00
wpa_cli_attached = 0 ;
}
wpa_ctrl_close ( ctrl_conn ) ;
ctrl_conn = NULL ;
2010-02-13 20:37:35 +01:00
if ( mon_conn ) {
2010-11-14 12:16:51 +01:00
eloop_unregister_read_sock ( wpa_ctrl_get_fd ( mon_conn ) ) ;
2010-02-13 20:37:35 +01:00
wpa_ctrl_close ( mon_conn ) ;
mon_conn = NULL ;
}
2008-02-28 02:34:43 +01:00
}
static void wpa_cli_msg_cb ( char * msg , size_t len )
{
printf ( " %s \n " , msg ) ;
}
2016-10-16 11:21:25 +02:00
static int _wpa_ctrl_command ( struct wpa_ctrl * ctrl , const char * cmd , int print )
2008-02-28 02:34:43 +01:00
{
2013-02-27 14:59:55 +01:00
char buf [ 4096 ] ;
2008-02-28 02:34:43 +01:00
size_t len ;
int ret ;
if ( ctrl_conn = = NULL ) {
printf ( " Not connected to wpa_supplicant - command dropped. \n " ) ;
return - 1 ;
}
2013-05-23 19:04:17 +02:00
if ( ifname_prefix ) {
os_snprintf ( buf , sizeof ( buf ) , " IFNAME=%s %s " ,
ifname_prefix , cmd ) ;
buf [ sizeof ( buf ) - 1 ] = ' \0 ' ;
cmd = buf ;
}
2008-02-28 02:34:43 +01:00
len = sizeof ( buf ) - 1 ;
ret = wpa_ctrl_request ( ctrl , cmd , os_strlen ( cmd ) , buf , & len ,
wpa_cli_msg_cb ) ;
if ( ret = = - 2 ) {
printf ( " '%s' command timed out. \n " , cmd ) ;
return - 2 ;
} else if ( ret < 0 ) {
printf ( " '%s' command failed. \n " , cmd ) ;
return - 1 ;
}
if ( print ) {
buf [ len ] = ' \0 ' ;
printf ( " %s " , buf ) ;
2011-02-21 21:50:11 +01:00
if ( interactive & & len > 0 & & buf [ len - 1 ] ! = ' \n ' )
printf ( " \n " ) ;
2008-02-28 02:34:43 +01:00
}
return 0 ;
}
2016-10-16 11:21:25 +02:00
static int wpa_ctrl_command ( struct wpa_ctrl * ctrl , const char * cmd )
2008-02-28 02:34:43 +01:00
{
return _wpa_ctrl_command ( ctrl , cmd , 1 ) ;
}
2012-08-15 21:08:21 +02:00
static int wpa_cli_cmd ( struct wpa_ctrl * ctrl , const char * cmd , int min_args ,
int argc , char * argv [ ] )
{
2013-02-15 16:07:28 +01:00
char buf [ 4096 ] ;
2012-08-15 21:08:21 +02:00
if ( argc < min_args ) {
printf ( " Invalid %s command - at least %d argument%s "
" required. \n " , cmd , min_args ,
min_args > 1 ? " s are " : " is " ) ;
return - 1 ;
}
if ( write_cmd ( buf , sizeof ( buf ) , cmd , argc , argv ) < 0 )
return - 1 ;
return wpa_ctrl_command ( ctrl , buf ) ;
}
2012-08-05 19:12:16 +02:00
static int wpa_cli_cmd_ifname ( struct wpa_ctrl * ctrl , int argc , char * argv [ ] )
{
return wpa_ctrl_command ( ctrl , " IFNAME " ) ;
}
2008-02-28 02:34:43 +01:00
static int wpa_cli_cmd_status ( struct wpa_ctrl * ctrl , int argc , char * argv [ ] )
{
2011-12-01 21:12:03 +01:00
if ( argc > 0 & & os_strcmp ( argv [ 0 ] , " verbose " ) = = 0 )
return wpa_ctrl_command ( ctrl , " STATUS-VERBOSE " ) ;
if ( argc > 0 & & os_strcmp ( argv [ 0 ] , " wps " ) = = 0 )
return wpa_ctrl_command ( ctrl , " STATUS-WPS " ) ;
2013-09-28 16:19:30 +02:00
if ( argc > 0 & & os_strcmp ( argv [ 0 ] , " driver " ) = = 0 )
return wpa_ctrl_command ( ctrl , " STATUS-DRIVER " ) ;
2015-07-13 17:31:22 +02:00
# ifdef ANDROID
if ( argc > 0 & & os_strcmp ( argv [ 0 ] , " no_events " ) = = 0 )
return wpa_ctrl_command ( ctrl , " STATUS-NO_EVENTS " ) ;
# endif /* ANDROID */
2011-12-01 21:12:03 +01:00
return wpa_ctrl_command ( ctrl , " STATUS " ) ;
2008-02-28 02:34:43 +01:00
}
static int wpa_cli_cmd_ping ( struct wpa_ctrl * ctrl , int argc , char * argv [ ] )
{
return wpa_ctrl_command ( ctrl , " PING " ) ;
}
2011-02-06 19:15:19 +01:00
static int wpa_cli_cmd_relog ( struct wpa_ctrl * ctrl , int argc , char * argv [ ] )
{
return wpa_ctrl_command ( ctrl , " RELOG " ) ;
}
2010-08-04 18:11:32 +02:00
static int wpa_cli_cmd_note ( struct wpa_ctrl * ctrl , int argc , char * argv [ ] )
{
2012-08-15 21:08:21 +02:00
return wpa_cli_cmd ( ctrl , " NOTE " , 1 , argc , argv ) ;
2010-08-04 18:11:32 +02:00
}
2008-02-28 02:34:43 +01:00
static int wpa_cli_cmd_mib ( struct wpa_ctrl * ctrl , int argc , char * argv [ ] )
{
return wpa_ctrl_command ( ctrl , " MIB " ) ;
}
static int wpa_cli_cmd_pmksa ( struct wpa_ctrl * ctrl , int argc , char * argv [ ] )
{
return wpa_ctrl_command ( ctrl , " PMKSA " ) ;
}
2014-09-26 19:20:21 +02:00
static int wpa_cli_cmd_pmksa_flush ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
return wpa_ctrl_command ( ctrl , " PMKSA_FLUSH " ) ;
}
2016-12-27 04:49:07 +01:00
# ifdef CONFIG_PMKSA_CACHE_EXTERNAL
static int wpa_cli_cmd_pmksa_get ( struct wpa_ctrl * ctrl , int argc , char * argv [ ] )
{
return wpa_cli_cmd ( ctrl , " PMKSA_GET " , 1 , argc , argv ) ;
}
static int wpa_cli_cmd_pmksa_add ( struct wpa_ctrl * ctrl , int argc , char * argv [ ] )
{
return wpa_cli_cmd ( ctrl , " PMKSA_ADD " , 8 , argc , argv ) ;
}
2017-01-02 11:32:07 +01:00
# ifdef CONFIG_MESH
static int wpa_cli_mesh_cmd_pmksa_get ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
return wpa_cli_cmd ( ctrl , " MESH_PMKSA_GET " , 1 , argc , argv ) ;
}
static int wpa_cli_mesh_cmd_pmksa_add ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
return wpa_cli_cmd ( ctrl , " MESH_PMKSA_ADD " , 4 , argc , argv ) ;
}
# endif /* CONFIG_MESH */
2016-12-27 04:49:07 +01:00
# endif /* CONFIG_PMKSA_CACHE_EXTERNAL */
2008-02-28 02:34:43 +01:00
static int wpa_cli_cmd_help ( struct wpa_ctrl * ctrl , int argc , char * argv [ ] )
{
2012-08-26 20:30:06 +02:00
print_help ( argc > 0 ? argv [ 0 ] : NULL ) ;
2008-02-28 02:34:43 +01:00
return 0 ;
}
2012-08-26 20:30:06 +02:00
static char * * wpa_cli_complete_help ( const char * str , int pos )
{
int arg = get_cmd_arg_num ( str , pos ) ;
char * * res = NULL ;
switch ( arg ) {
case 1 :
res = wpa_list_cmd_list ( ) ;
break ;
}
return res ;
}
2008-02-28 02:34:43 +01:00
static int wpa_cli_cmd_license ( struct wpa_ctrl * ctrl , int argc , char * argv [ ] )
{
2016-07-07 14:04:38 +02:00
printf ( " %s \n \n %s \n " , wpa_cli_version , cli_full_license ) ;
2008-02-28 02:34:43 +01:00
return 0 ;
}
static int wpa_cli_cmd_quit ( struct wpa_ctrl * ctrl , int argc , char * argv [ ] )
{
wpa_cli_quit = 1 ;
2010-11-14 12:16:51 +01:00
if ( interactive )
eloop_terminate ( ) ;
2008-02-28 02:34:43 +01:00
return 0 ;
}
static int wpa_cli_cmd_set ( struct wpa_ctrl * ctrl , int argc , char * argv [ ] )
{
char cmd [ 256 ] ;
int res ;
2013-05-05 10:53:20 +02:00
if ( argc = = 1 ) {
2011-10-05 16:29:51 +02:00
res = os_snprintf ( cmd , sizeof ( cmd ) , " SET %s " , argv [ 0 ] ) ;
Check os_snprintf() result more consistently - automatic 3
This converts os_snprintf() result validation cases to use
os_snprintf_error() where the comparison was 'res > size' instead of
'res >= size - 1'. These changes were done automatically with spatch
using the following semantic patch:
@@
identifier E1;
expression E2,E3,E4,E5,E6;
statement S1;
@@
(
E1 = os_snprintf(E2, E3, ...);
|
int E1 = os_snprintf(E2, E3, ...);
|
if (E5)
E1 = os_snprintf(E2, E3, ...);
else
E1 = os_snprintf(E2, E3, ...);
|
if (E5)
E1 = os_snprintf(E2, E3, ...);
else if (E6)
E1 = os_snprintf(E2, E3, ...);
else
E1 = 0;
|
if (E5) {
...
E1 = os_snprintf(E2, E3, ...);
} else {
...
return -1;
}
|
if (E5) {
...
E1 = os_snprintf(E2, E3, ...);
} else if (E6) {
...
E1 = os_snprintf(E2, E3, ...);
} else {
...
return -1;
}
|
if (E5) {
...
E1 = os_snprintf(E2, E3, ...);
} else {
...
E1 = os_snprintf(E2, E3, ...);
}
)
? os_free(E4);
- if (E1 < 0 || (size_t) E1 >= E3 - 1)
+ if (os_snprintf_error(E3, E1))
(
S1
|
{ ... }
)
Signed-off-by: Jouni Malinen <j@w1.fi>
2014-12-08 10:22:52 +01:00
if ( os_snprintf_error ( sizeof ( cmd ) , res ) ) {
2013-05-05 10:53:20 +02:00
printf ( " Too long SET command. \n " ) ;
return - 1 ;
}
return wpa_ctrl_command ( ctrl , cmd ) ;
2008-02-28 02:34:43 +01:00
}
2013-05-05 10:53:20 +02:00
return wpa_cli_cmd ( ctrl , " SET " , 2 , argc , argv ) ;
2008-02-28 02:34:43 +01:00
}
2013-05-05 11:12:31 +02:00
static char * * wpa_cli_complete_set ( const char * str , int pos )
{
int arg = get_cmd_arg_num ( str , pos ) ;
const char * fields [ ] = {
/* runtime values */
" EAPOL::heldPeriod " , " EAPOL::authPeriod " , " EAPOL::startPeriod " ,
" EAPOL::maxStart " , " dot11RSNAConfigPMKLifetime " ,
" dot11RSNAConfigPMKReauthThreshold " , " dot11RSNAConfigSATimeout " ,
" wps_fragment_size " , " wps_version_number " , " ampdu " ,
" tdls_testing " , " tdls_disabled " , " pno " , " radio_disabled " ,
" uapsd " , " ps " , " wifi_display " , " bssid_filter " , " disallow_aps " ,
" no_keep_alive " ,
/* global configuration parameters */
2015-03-15 00:37:08 +01:00
# ifdef CONFIG_CTRL_IFACE
" ctrl_interface " , " no_ctrl_interface " , " ctrl_interface_group " ,
# endif /* CONFIG_CTRL_IFACE */
" eapol_version " , " ap_scan " , " bgscan " ,
# ifdef CONFIG_MESH
" user_mpm " , " max_peer_links " , " mesh_max_inactivity " ,
2015-07-08 15:41:36 +02:00
" dot11RSNASAERetransPeriod " ,
2015-03-15 00:37:08 +01:00
# endif /* CONFIG_MESH */
" disable_scan_offload " , " fast_reauth " , " opensc_engine_path " ,
" pkcs11_engine_path " , " pkcs11_module_path " , " openssl_ciphers " ,
" pcsc_reader " , " pcsc_pin " , " external_sim " , " driver_param " ,
" dot11RSNAConfigPMKLifetime " ,
2013-05-05 11:12:31 +02:00
" dot11RSNAConfigPMKReauthThreshold " ,
" dot11RSNAConfigSATimeout " ,
2015-03-15 00:37:08 +01:00
# ifndef CONFIG_NO_CONFIG_WRITE
" update_config " ,
# endif /* CONFIG_NO_CONFIG_WRITE */
" load_dynamic_eap " ,
# ifdef CONFIG_WPS
" uuid " , " device_name " , " manufacturer " , " model_name " ,
" model_number " , " serial_number " , " device_type " , " os_version " ,
" config_methods " , " wps_cred_processing " , " wps_vendor_ext_m1 " ,
# endif /* CONFIG_WPS */
# ifdef CONFIG_P2P
" sec_device_type " ,
2013-05-05 11:12:31 +02:00
" p2p_listen_reg_class " , " p2p_listen_channel " ,
2015-03-15 00:37:08 +01:00
" p2p_oper_reg_class " , " p2p_oper_channel " , " p2p_go_intent " ,
" p2p_ssid_postfix " , " persistent_reconnect " , " p2p_intra_bss " ,
" p2p_group_idle " , " p2p_passphrase_len " , " p2p_pref_chan " ,
" p2p_no_go_freq " , " p2p_add_cli_chan " ,
" p2p_optimize_listen_chan " , " p2p_go_ht40 " , " p2p_go_vht " ,
" p2p_disabled " , " p2p_go_ctwindow " , " p2p_no_group_iface " ,
" p2p_ignore_shared_freq " , " ip_addr_go " , " ip_addr_mask " ,
" ip_addr_start " , " ip_addr_end " ,
# endif /* CONFIG_P2P */
" country " , " bss_max_count " , " bss_expiration_age " ,
" bss_expiration_scan_count " , " filter_ssids " , " filter_rssi " ,
" max_num_sta " , " disassoc_low_ack " ,
# ifdef CONFIG_HS20
" hs20 " ,
# endif /* CONFIG_HS20 */
" interworking " , " hessid " , " access_network_type " , " pbc_in_m1 " ,
" autoscan " , " wps_nfc_dev_pw_id " , " wps_nfc_dh_pubkey " ,
" wps_nfc_dh_privkey " , " wps_nfc_dev_pw " , " ext_password_backend " ,
2013-05-05 11:12:31 +02:00
" p2p_go_max_inactivity " , " auto_interworking " , " okc " , " pmf " ,
2015-03-15 00:37:08 +01:00
" sae_groups " , " dtim_period " , " beacon_int " ,
" ap_vendor_elements " , " ignore_old_scan_res " , " freq_list " ,
" scan_cur_freq " , " sched_scan_interval " ,
" tdls_external_control " , " osu_dir " , " wowlan_triggers " ,
" p2p_search_delay " , " mac_addr " , " rand_addr_lifetime " ,
" preassoc_mac_addr " , " key_mgmt_offload " , " passive_scan " ,
2016-09-20 08:40:04 +02:00
" reassoc_same_bss_optim " , " wps_priority " ,
# ifdef CONFIG_TESTING_OPTIONS
" ignore_auth_resp " ,
# endif /* CONFIG_TESTING_OPTIONS */
2016-11-15 10:42:44 +01:00
" relative_rssi " , " relative_band_adjust " ,
2013-05-05 11:12:31 +02:00
} ;
2013-10-26 16:00:57 +02:00
int i , num_fields = ARRAY_SIZE ( fields ) ;
2013-05-05 11:12:31 +02:00
if ( arg = = 1 ) {
char * * res = os_calloc ( num_fields + 1 , sizeof ( char * ) ) ;
if ( res = = NULL )
return NULL ;
for ( i = 0 ; i < num_fields ; i + + ) {
res [ i ] = os_strdup ( fields [ i ] ) ;
if ( res [ i ] = = NULL )
return res ;
}
return res ;
}
2013-05-05 11:20:35 +02:00
if ( arg > 1 & & os_strncasecmp ( str , " set bssid_filter " , 17 ) = = 0 )
return cli_txt_list_array ( & bsses ) ;
2013-05-05 11:12:31 +02:00
return NULL ;
}
2015-01-28 00:22:06 +01:00
static int wpa_cli_cmd_dump ( struct wpa_ctrl * ctrl , int argc , char * argv [ ] )
{
return wpa_ctrl_command ( ctrl , " DUMP " ) ;
}
2013-05-05 11:12:31 +02:00
2016-07-04 11:25:39 +02:00
static int wpa_cli_cmd_driver_flags ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
return wpa_ctrl_command ( ctrl , " DRIVER_FLAGS " ) ;
}
2010-10-31 16:07:31 +01:00
static int wpa_cli_cmd_get ( struct wpa_ctrl * ctrl , int argc , char * argv [ ] )
{
2012-08-15 21:40:07 +02:00
return wpa_cli_cmd ( ctrl , " GET " , 1 , argc , argv ) ;
2010-10-31 16:07:31 +01:00
}
2015-03-15 00:37:07 +01:00
static char * * wpa_cli_complete_get ( const char * str , int pos )
{
int arg = get_cmd_arg_num ( str , pos ) ;
const char * fields [ ] = {
# ifdef CONFIG_CTRL_IFACE
" ctrl_interface " , " ctrl_interface_group " ,
# endif /* CONFIG_CTRL_IFACE */
" eapol_version " , " ap_scan " ,
# ifdef CONFIG_MESH
" user_mpm " , " max_peer_links " , " mesh_max_inactivity " ,
# endif /* CONFIG_MESH */
" disable_scan_offload " , " fast_reauth " , " opensc_engine_path " ,
" pkcs11_engine_path " , " pkcs11_module_path " , " openssl_ciphers " ,
" pcsc_reader " , " pcsc_pin " , " external_sim " , " driver_param " ,
" dot11RSNAConfigPMKLifetime " ,
" dot11RSNAConfigPMKReauthThreshold " ,
" dot11RSNAConfigSATimeout " ,
# ifndef CONFIG_NO_CONFIG_WRITE
" update_config " ,
# endif /* CONFIG_NO_CONFIG_WRITE */
# ifdef CONFIG_WPS
" device_name " , " manufacturer " , " model_name " , " model_number " ,
" serial_number " , " config_methods " , " wps_cred_processing " ,
# endif /* CONFIG_WPS */
# ifdef CONFIG_P2P
" p2p_listen_reg_class " , " p2p_listen_channel " ,
" p2p_oper_reg_class " , " p2p_oper_channel " , " p2p_go_intent " ,
" p2p_ssid_postfix " , " persistent_reconnect " , " p2p_intra_bss " ,
" p2p_group_idle " , " p2p_passphrase_len " , " p2p_add_cli_chan " ,
" p2p_optimize_listen_chan " , " p2p_go_ht40 " , " p2p_go_vht " ,
" p2p_disabled " , " p2p_go_ctwindow " , " p2p_no_group_iface " ,
" p2p_ignore_shared_freq " , " ip_addr_go " , " ip_addr_mask " ,
" ip_addr_start " , " ip_addr_end " ,
# endif /* CONFIG_P2P */
" bss_max_count " , " bss_expiration_age " ,
" bss_expiration_scan_count " , " filter_ssids " , " filter_rssi " ,
" max_num_sta " , " disassoc_low_ack " ,
# ifdef CONFIG_HS20
" hs20 " ,
# endif /* CONFIG_HS20 */
" interworking " , " access_network_type " , " pbc_in_m1 " , " autoscan " ,
" wps_nfc_dev_pw_id " , " ext_password_backend " ,
" p2p_go_max_inactivity " , " auto_interworking " , " okc " , " pmf " ,
" dtim_period " , " beacon_int " , " ignore_old_scan_res " ,
" scan_cur_freq " , " sched_scan_interval " ,
" tdls_external_control " , " osu_dir " , " wowlan_triggers " ,
" p2p_search_delay " , " mac_addr " , " rand_addr_lifetime " ,
" preassoc_mac_addr " , " key_mgmt_offload " , " passive_scan " ,
" reassoc_same_bss_optim "
} ;
int i , num_fields = ARRAY_SIZE ( fields ) ;
if ( arg = = 1 ) {
char * * res = os_calloc ( num_fields + 1 , sizeof ( char * ) ) ;
if ( res = = NULL )
return NULL ;
for ( i = 0 ; i < num_fields ; i + + ) {
res [ i ] = os_strdup ( fields [ i ] ) ;
if ( res [ i ] = = NULL )
return res ;
}
return res ;
}
return NULL ;
}
2008-02-28 02:34:43 +01:00
static int wpa_cli_cmd_logoff ( struct wpa_ctrl * ctrl , int argc , char * argv [ ] )
{
return wpa_ctrl_command ( ctrl , " LOGOFF " ) ;
}
static int wpa_cli_cmd_logon ( struct wpa_ctrl * ctrl , int argc , char * argv [ ] )
{
return wpa_ctrl_command ( ctrl , " LOGON " ) ;
}
static int wpa_cli_cmd_reassociate ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
return wpa_ctrl_command ( ctrl , " REASSOCIATE " ) ;
}
2014-03-06 19:06:04 +01:00
static int wpa_cli_cmd_reattach ( struct wpa_ctrl * ctrl , int argc , char * argv [ ] )
{
return wpa_ctrl_command ( ctrl , " REATTACH " ) ;
}
2008-02-28 02:34:43 +01:00
static int wpa_cli_cmd_preauthenticate ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
2012-08-15 21:40:07 +02:00
return wpa_cli_cmd ( ctrl , " PREAUTH " , 1 , argc , argv ) ;
2008-02-28 02:34:43 +01:00
}
static int wpa_cli_cmd_ap_scan ( struct wpa_ctrl * ctrl , int argc , char * argv [ ] )
{
2012-08-15 21:40:07 +02:00
return wpa_cli_cmd ( ctrl , " AP_SCAN " , 1 , argc , argv ) ;
2008-02-28 02:34:43 +01:00
}
2011-04-11 22:14:38 +02:00
static int wpa_cli_cmd_scan_interval ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
2012-08-15 21:40:07 +02:00
return wpa_cli_cmd ( ctrl , " SCAN_INTERVAL " , 1 , argc , argv ) ;
2011-04-11 22:14:38 +02:00
}
2011-03-20 11:40:59 +01:00
static int wpa_cli_cmd_bss_expire_age ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
2012-08-15 21:40:07 +02:00
return wpa_cli_cmd ( ctrl , " BSS_EXPIRE_AGE " , 1 , argc , argv ) ;
2011-03-20 11:40:59 +01:00
}
static int wpa_cli_cmd_bss_expire_count ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
2012-08-15 21:40:07 +02:00
return wpa_cli_cmd ( ctrl , " BSS_EXPIRE_COUNT " , 1 , argc , argv ) ;
2011-03-20 11:40:59 +01:00
}
2012-08-25 09:23:22 +02:00
static int wpa_cli_cmd_bss_flush ( struct wpa_ctrl * ctrl , int argc , char * argv [ ] )
{
char cmd [ 256 ] ;
int res ;
if ( argc < 1 )
res = os_snprintf ( cmd , sizeof ( cmd ) , " BSS_FLUSH 0 " ) ;
else
res = os_snprintf ( cmd , sizeof ( cmd ) , " BSS_FLUSH %s " , argv [ 0 ] ) ;
Check os_snprintf() result more consistently - automatic 3
This converts os_snprintf() result validation cases to use
os_snprintf_error() where the comparison was 'res > size' instead of
'res >= size - 1'. These changes were done automatically with spatch
using the following semantic patch:
@@
identifier E1;
expression E2,E3,E4,E5,E6;
statement S1;
@@
(
E1 = os_snprintf(E2, E3, ...);
|
int E1 = os_snprintf(E2, E3, ...);
|
if (E5)
E1 = os_snprintf(E2, E3, ...);
else
E1 = os_snprintf(E2, E3, ...);
|
if (E5)
E1 = os_snprintf(E2, E3, ...);
else if (E6)
E1 = os_snprintf(E2, E3, ...);
else
E1 = 0;
|
if (E5) {
...
E1 = os_snprintf(E2, E3, ...);
} else {
...
return -1;
}
|
if (E5) {
...
E1 = os_snprintf(E2, E3, ...);
} else if (E6) {
...
E1 = os_snprintf(E2, E3, ...);
} else {
...
return -1;
}
|
if (E5) {
...
E1 = os_snprintf(E2, E3, ...);
} else {
...
E1 = os_snprintf(E2, E3, ...);
}
)
? os_free(E4);
- if (E1 < 0 || (size_t) E1 >= E3 - 1)
+ if (os_snprintf_error(E3, E1))
(
S1
|
{ ... }
)
Signed-off-by: Jouni Malinen <j@w1.fi>
2014-12-08 10:22:52 +01:00
if ( os_snprintf_error ( sizeof ( cmd ) , res ) ) {
2012-08-25 09:23:22 +02:00
printf ( " Too long BSS_FLUSH command. \n " ) ;
return - 1 ;
}
return wpa_ctrl_command ( ctrl , cmd ) ;
}
2008-02-28 02:34:43 +01:00
static int wpa_cli_cmd_stkstart ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
2012-08-15 21:40:07 +02:00
return wpa_cli_cmd ( ctrl , " STKSTART " , 1 , argc , argv ) ;
2008-02-28 02:34:43 +01:00
}
static int wpa_cli_cmd_ft_ds ( struct wpa_ctrl * ctrl , int argc , char * argv [ ] )
{
2012-08-15 21:40:07 +02:00
return wpa_cli_cmd ( ctrl , " FT_DS " , 1 , argc , argv ) ;
2008-02-28 02:34:43 +01:00
}
2008-11-29 19:59:45 +01:00
static int wpa_cli_cmd_wps_pbc ( struct wpa_ctrl * ctrl , int argc , char * argv [ ] )
{
2012-08-15 21:40:07 +02:00
return wpa_cli_cmd ( ctrl , " WPS_PBC " , 0 , argc , argv ) ;
2008-11-29 19:59:45 +01:00
}
static int wpa_cli_cmd_wps_pin ( struct wpa_ctrl * ctrl , int argc , char * argv [ ] )
{
if ( argc = = 0 ) {
printf ( " Invalid WPS_PIN command: need one or two arguments: \n "
" - BSSID: use 'any' to select any \n "
" - PIN: optional, used only with devices that have no "
" display \n " ) ;
return - 1 ;
}
2012-08-15 21:40:07 +02:00
return wpa_cli_cmd ( ctrl , " WPS_PIN " , 1 , argc , argv ) ;
2008-11-29 19:59:45 +01:00
}
2010-09-23 19:30:52 +02:00
static int wpa_cli_cmd_wps_check_pin ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
2012-08-15 21:40:07 +02:00
return wpa_cli_cmd ( ctrl , " WPS_CHECK_PIN " , 1 , argc , argv ) ;
2010-09-23 19:30:52 +02:00
}
2010-09-06 19:51:06 +02:00
static int wpa_cli_cmd_wps_cancel ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
return wpa_ctrl_command ( ctrl , " WPS_CANCEL " ) ;
}
2012-06-28 13:05:13 +02:00
# ifdef CONFIG_WPS_NFC
2012-06-27 17:56:41 +02:00
static int wpa_cli_cmd_wps_nfc ( struct wpa_ctrl * ctrl , int argc , char * argv [ ] )
{
2012-08-15 21:40:07 +02:00
return wpa_cli_cmd ( ctrl , " WPS_NFC " , 0 , argc , argv ) ;
2012-06-27 17:56:41 +02:00
}
2013-02-15 10:45:29 +01:00
static int wpa_cli_cmd_wps_nfc_config_token ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
return wpa_cli_cmd ( ctrl , " WPS_NFC_CONFIG_TOKEN " , 1 , argc , argv ) ;
}
2012-06-27 17:56:41 +02:00
static int wpa_cli_cmd_wps_nfc_token ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
2012-08-15 21:40:07 +02:00
return wpa_cli_cmd ( ctrl , " WPS_NFC_TOKEN " , 1 , argc , argv ) ;
2012-06-27 17:56:41 +02:00
}
2012-06-28 12:59:29 +02:00
static int wpa_cli_cmd_wps_nfc_tag_read ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
int ret ;
char * buf ;
size_t buflen ;
if ( argc ! = 1 ) {
printf ( " Invalid 'wps_nfc_tag_read' command - one argument "
" is required. \n " ) ;
return - 1 ;
}
buflen = 18 + os_strlen ( argv [ 0 ] ) ;
buf = os_malloc ( buflen ) ;
if ( buf = = NULL )
return - 1 ;
os_snprintf ( buf , buflen , " WPS_NFC_TAG_READ %s " , argv [ 0 ] ) ;
ret = wpa_ctrl_command ( ctrl , buf ) ;
os_free ( buf ) ;
return ret ;
}
2012-06-28 13:05:13 +02:00
2012-10-28 16:39:46 +01:00
static int wpa_cli_cmd_nfc_get_handover_req ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
return wpa_cli_cmd ( ctrl , " NFC_GET_HANDOVER_REQ " , 2 , argc , argv ) ;
}
static int wpa_cli_cmd_nfc_get_handover_sel ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
return wpa_cli_cmd ( ctrl , " NFC_GET_HANDOVER_SEL " , 2 , argc , argv ) ;
}
2013-02-11 17:43:46 +01:00
static int wpa_cli_cmd_nfc_report_handover ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
return wpa_cli_cmd ( ctrl , " NFC_REPORT_HANDOVER " , 4 , argc , argv ) ;
}
2012-06-28 13:05:13 +02:00
# endif /* CONFIG_WPS_NFC */
2009-02-26 20:57:38 +01:00
2008-11-29 19:59:45 +01:00
static int wpa_cli_cmd_wps_reg ( struct wpa_ctrl * ctrl , int argc , char * argv [ ] )
{
char cmd [ 256 ] ;
int res ;
2009-09-06 12:58:15 +02:00
if ( argc = = 2 )
res = os_snprintf ( cmd , sizeof ( cmd ) , " WPS_REG %s %s " ,
argv [ 0 ] , argv [ 1 ] ) ;
2010-05-27 23:01:48 +02:00
else if ( argc = = 5 | | argc = = 6 ) {
2015-04-07 11:00:13 +02:00
char ssid_hex [ 2 * SSID_MAX_LEN + 1 ] ;
2009-09-06 12:58:15 +02:00
char key_hex [ 2 * 64 + 1 ] ;
int i ;
ssid_hex [ 0 ] = ' \0 ' ;
2015-04-07 11:00:13 +02:00
for ( i = 0 ; i < SSID_MAX_LEN ; i + + ) {
2009-09-06 12:58:15 +02:00
if ( argv [ 2 ] [ i ] = = ' \0 ' )
break ;
os_snprintf ( & ssid_hex [ i * 2 ] , 3 , " %02x " , argv [ 2 ] [ i ] ) ;
}
key_hex [ 0 ] = ' \0 ' ;
2010-05-27 23:01:48 +02:00
if ( argc = = 6 ) {
for ( i = 0 ; i < 64 ; i + + ) {
if ( argv [ 5 ] [ i ] = = ' \0 ' )
break ;
os_snprintf ( & key_hex [ i * 2 ] , 3 , " %02x " ,
argv [ 5 ] [ i ] ) ;
}
2009-09-06 12:58:15 +02:00
}
res = os_snprintf ( cmd , sizeof ( cmd ) ,
" WPS_REG %s %s %s %s %s %s " ,
argv [ 0 ] , argv [ 1 ] , ssid_hex , argv [ 3 ] , argv [ 4 ] ,
key_hex ) ;
} else {
2008-11-29 19:59:45 +01:00
printf ( " Invalid WPS_REG command: need two arguments: \n "
2010-10-25 17:56:49 +02:00
" - BSSID of the target AP \n "
2008-11-29 19:59:45 +01:00
" - AP PIN \n " ) ;
2009-09-06 12:58:15 +02:00
printf ( " Alternatively, six arguments can be used to "
" reconfigure the AP: \n "
2010-10-25 17:56:49 +02:00
" - BSSID of the target AP \n "
2009-09-06 12:58:15 +02:00
" - AP PIN \n "
" - new SSID \n "
" - new auth (OPEN, WPAPSK, WPA2PSK) \n "
" - new encr (NONE, WEP, TKIP, CCMP) \n "
" - new key \n " ) ;
2008-11-29 19:59:45 +01:00
return - 1 ;
}
Check os_snprintf() result more consistently - automatic 3
This converts os_snprintf() result validation cases to use
os_snprintf_error() where the comparison was 'res > size' instead of
'res >= size - 1'. These changes were done automatically with spatch
using the following semantic patch:
@@
identifier E1;
expression E2,E3,E4,E5,E6;
statement S1;
@@
(
E1 = os_snprintf(E2, E3, ...);
|
int E1 = os_snprintf(E2, E3, ...);
|
if (E5)
E1 = os_snprintf(E2, E3, ...);
else
E1 = os_snprintf(E2, E3, ...);
|
if (E5)
E1 = os_snprintf(E2, E3, ...);
else if (E6)
E1 = os_snprintf(E2, E3, ...);
else
E1 = 0;
|
if (E5) {
...
E1 = os_snprintf(E2, E3, ...);
} else {
...
return -1;
}
|
if (E5) {
...
E1 = os_snprintf(E2, E3, ...);
} else if (E6) {
...
E1 = os_snprintf(E2, E3, ...);
} else {
...
return -1;
}
|
if (E5) {
...
E1 = os_snprintf(E2, E3, ...);
} else {
...
E1 = os_snprintf(E2, E3, ...);
}
)
? os_free(E4);
- if (E1 < 0 || (size_t) E1 >= E3 - 1)
+ if (os_snprintf_error(E3, E1))
(
S1
|
{ ... }
)
Signed-off-by: Jouni Malinen <j@w1.fi>
2014-12-08 10:22:52 +01:00
if ( os_snprintf_error ( sizeof ( cmd ) , res ) ) {
2008-11-29 19:59:45 +01:00
printf ( " Too long WPS_REG command. \n " ) ;
return - 1 ;
}
return wpa_ctrl_command ( ctrl , cmd ) ;
}
2010-11-17 15:46:55 +01:00
static int wpa_cli_cmd_wps_ap_pin ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
2012-08-15 21:40:07 +02:00
return wpa_cli_cmd ( ctrl , " WPS_AP_PIN " , 1 , argc , argv ) ;
2010-11-17 15:46:55 +01:00
}
2009-11-07 11:41:01 +01:00
static int wpa_cli_cmd_wps_er_start ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
2012-08-15 21:40:07 +02:00
return wpa_cli_cmd ( ctrl , " WPS_ER_START " , 0 , argc , argv ) ;
2009-11-07 11:41:01 +01:00
}
static int wpa_cli_cmd_wps_er_stop ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
return wpa_ctrl_command ( ctrl , " WPS_ER_STOP " ) ;
}
2009-11-13 21:07:11 +01:00
static int wpa_cli_cmd_wps_er_pin ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
2009-12-12 15:40:10 +01:00
if ( argc < 2 ) {
printf ( " Invalid WPS_ER_PIN command: need at least two "
" arguments: \n "
2009-11-13 21:07:11 +01:00
" - UUID: use 'any' to select any \n "
2009-12-12 15:40:10 +01:00
" - PIN: Enrollee PIN \n "
" optional: - Enrollee MAC address \n " ) ;
2009-11-13 21:07:11 +01:00
return - 1 ;
}
2012-08-15 21:40:07 +02:00
return wpa_cli_cmd ( ctrl , " WPS_ER_PIN " , 2 , argc , argv ) ;
2009-11-13 21:07:11 +01:00
}
2009-11-15 17:46:03 +01:00
static int wpa_cli_cmd_wps_er_pbc ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
2012-08-15 21:40:07 +02:00
return wpa_cli_cmd ( ctrl , " WPS_ER_PBC " , 1 , argc , argv ) ;
2009-11-15 17:46:03 +01:00
}
2009-11-15 21:27:06 +01:00
static int wpa_cli_cmd_wps_er_learn ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
if ( argc ! = 2 ) {
printf ( " Invalid WPS_ER_LEARN command: need two arguments: \n "
" - UUID: specify which AP to use \n "
" - PIN: AP PIN \n " ) ;
return - 1 ;
}
2012-08-15 21:40:07 +02:00
return wpa_cli_cmd ( ctrl , " WPS_ER_LEARN " , 2 , argc , argv ) ;
2009-11-15 21:27:06 +01:00
}
2010-10-20 12:37:01 +02:00
static int wpa_cli_cmd_wps_er_set_config ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
if ( argc ! = 2 ) {
printf ( " Invalid WPS_ER_SET_CONFIG command: need two "
" arguments: \n "
" - UUID: specify which AP to use \n "
" - Network configuration id \n " ) ;
return - 1 ;
}
2012-08-15 21:40:07 +02:00
return wpa_cli_cmd ( ctrl , " WPS_ER_SET_CONFIG " , 2 , argc , argv ) ;
2010-10-20 12:37:01 +02:00
}
2010-05-27 23:01:48 +02:00
static int wpa_cli_cmd_wps_er_config ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
char cmd [ 256 ] ;
int res ;
if ( argc = = 5 | | argc = = 6 ) {
2015-04-07 11:00:13 +02:00
char ssid_hex [ 2 * SSID_MAX_LEN + 1 ] ;
2010-05-27 23:01:48 +02:00
char key_hex [ 2 * 64 + 1 ] ;
int i ;
ssid_hex [ 0 ] = ' \0 ' ;
2015-04-07 11:00:13 +02:00
for ( i = 0 ; i < SSID_MAX_LEN ; i + + ) {
2010-05-27 23:01:48 +02:00
if ( argv [ 2 ] [ i ] = = ' \0 ' )
break ;
os_snprintf ( & ssid_hex [ i * 2 ] , 3 , " %02x " , argv [ 2 ] [ i ] ) ;
}
key_hex [ 0 ] = ' \0 ' ;
if ( argc = = 6 ) {
for ( i = 0 ; i < 64 ; i + + ) {
if ( argv [ 5 ] [ i ] = = ' \0 ' )
break ;
os_snprintf ( & key_hex [ i * 2 ] , 3 , " %02x " ,
argv [ 5 ] [ i ] ) ;
}
}
res = os_snprintf ( cmd , sizeof ( cmd ) ,
" WPS_ER_CONFIG %s %s %s %s %s %s " ,
argv [ 0 ] , argv [ 1 ] , ssid_hex , argv [ 3 ] , argv [ 4 ] ,
key_hex ) ;
} else {
printf ( " Invalid WPS_ER_CONFIG command: need six arguments: \n "
" - AP UUID \n "
" - AP PIN \n "
" - new SSID \n "
" - new auth (OPEN, WPAPSK, WPA2PSK) \n "
" - new encr (NONE, WEP, TKIP, CCMP) \n "
" - new key \n " ) ;
return - 1 ;
}
Check os_snprintf() result more consistently - automatic 3
This converts os_snprintf() result validation cases to use
os_snprintf_error() where the comparison was 'res > size' instead of
'res >= size - 1'. These changes were done automatically with spatch
using the following semantic patch:
@@
identifier E1;
expression E2,E3,E4,E5,E6;
statement S1;
@@
(
E1 = os_snprintf(E2, E3, ...);
|
int E1 = os_snprintf(E2, E3, ...);
|
if (E5)
E1 = os_snprintf(E2, E3, ...);
else
E1 = os_snprintf(E2, E3, ...);
|
if (E5)
E1 = os_snprintf(E2, E3, ...);
else if (E6)
E1 = os_snprintf(E2, E3, ...);
else
E1 = 0;
|
if (E5) {
...
E1 = os_snprintf(E2, E3, ...);
} else {
...
return -1;
}
|
if (E5) {
...
E1 = os_snprintf(E2, E3, ...);
} else if (E6) {
...
E1 = os_snprintf(E2, E3, ...);
} else {
...
return -1;
}
|
if (E5) {
...
E1 = os_snprintf(E2, E3, ...);
} else {
...
E1 = os_snprintf(E2, E3, ...);
}
)
? os_free(E4);
- if (E1 < 0 || (size_t) E1 >= E3 - 1)
+ if (os_snprintf_error(E3, E1))
(
S1
|
{ ... }
)
Signed-off-by: Jouni Malinen <j@w1.fi>
2014-12-08 10:22:52 +01:00
if ( os_snprintf_error ( sizeof ( cmd ) , res ) ) {
2010-05-27 23:01:48 +02:00
printf ( " Too long WPS_ER_CONFIG command. \n " ) ;
return - 1 ;
}
return wpa_ctrl_command ( ctrl , cmd ) ;
}
2012-06-28 15:35:51 +02:00
# ifdef CONFIG_WPS_NFC
static int wpa_cli_cmd_wps_er_nfc_config_token ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
if ( argc ! = 2 ) {
printf ( " Invalid WPS_ER_NFC_CONFIG_TOKEN command: need two "
" arguments: \n "
" - WPS/NDEF: token format \n "
" - UUID: specify which AP to use \n " ) ;
return - 1 ;
}
2012-08-15 21:40:07 +02:00
return wpa_cli_cmd ( ctrl , " WPS_ER_NFC_CONFIG_TOKEN " , 2 , argc , argv ) ;
2012-06-28 15:35:51 +02:00
}
# endif /* CONFIG_WPS_NFC */
2009-01-15 00:21:55 +01:00
static int wpa_cli_cmd_ibss_rsn ( struct wpa_ctrl * ctrl , int argc , char * argv [ ] )
{
2012-08-15 21:40:07 +02:00
return wpa_cli_cmd ( ctrl , " IBSS_RSN " , 1 , argc , argv ) ;
2009-01-15 00:21:55 +01:00
}
2008-02-28 02:34:43 +01:00
static int wpa_cli_cmd_level ( struct wpa_ctrl * ctrl , int argc , char * argv [ ] )
{
2012-08-15 21:40:07 +02:00
return wpa_cli_cmd ( ctrl , " LEVEL " , 1 , argc , argv ) ;
2008-02-28 02:34:43 +01:00
}
static int wpa_cli_cmd_identity ( struct wpa_ctrl * ctrl , int argc , char * argv [ ] )
{
char cmd [ 256 ] , * pos , * end ;
int i , ret ;
if ( argc < 2 ) {
printf ( " Invalid IDENTITY command: needs two arguments "
" (network id and identity) \n " ) ;
return - 1 ;
}
end = cmd + sizeof ( cmd ) ;
pos = cmd ;
ret = os_snprintf ( pos , end - pos , WPA_CTRL_RSP " IDENTITY-%s:%s " ,
argv [ 0 ] , argv [ 1 ] ) ;
Check os_snprintf() result more consistently - automatic 1
This converts os_snprintf() result validation cases to use
os_snprintf_error() where the exact rule used in os_snprintf_error() was
used. These changes were done automatically with spatch using the
following semantic patch:
@@
identifier E1;
expression E2,E3,E4,E5,E6;
statement S1;
@@
(
E1 = os_snprintf(E2, E3, ...);
|
int E1 = os_snprintf(E2, E3, ...);
|
if (E5)
E1 = os_snprintf(E2, E3, ...);
else
E1 = os_snprintf(E2, E3, ...);
|
if (E5)
E1 = os_snprintf(E2, E3, ...);
else if (E6)
E1 = os_snprintf(E2, E3, ...);
else
E1 = 0;
|
if (E5) {
...
E1 = os_snprintf(E2, E3, ...);
} else {
...
return -1;
}
|
if (E5) {
...
E1 = os_snprintf(E2, E3, ...);
} else if (E6) {
...
E1 = os_snprintf(E2, E3, ...);
} else {
...
return -1;
}
|
if (E5) {
...
E1 = os_snprintf(E2, E3, ...);
} else {
...
E1 = os_snprintf(E2, E3, ...);
}
)
? os_free(E4);
- if (E1 < 0 || \( E1 >= E3 \| (size_t) E1 >= E3 \| (unsigned int) E1 >= E3 \| E1 >= (int) E3 \))
+ if (os_snprintf_error(E3, E1))
(
S1
|
{ ... }
)
Signed-off-by: Jouni Malinen <j@w1.fi>
2014-12-08 10:15:51 +01:00
if ( os_snprintf_error ( end - pos , ret ) ) {
2008-02-28 02:34:43 +01:00
printf ( " Too long IDENTITY command. \n " ) ;
return - 1 ;
}
pos + = ret ;
for ( i = 2 ; i < argc ; i + + ) {
ret = os_snprintf ( pos , end - pos , " %s " , argv [ i ] ) ;
Check os_snprintf() result more consistently - automatic 1
This converts os_snprintf() result validation cases to use
os_snprintf_error() where the exact rule used in os_snprintf_error() was
used. These changes were done automatically with spatch using the
following semantic patch:
@@
identifier E1;
expression E2,E3,E4,E5,E6;
statement S1;
@@
(
E1 = os_snprintf(E2, E3, ...);
|
int E1 = os_snprintf(E2, E3, ...);
|
if (E5)
E1 = os_snprintf(E2, E3, ...);
else
E1 = os_snprintf(E2, E3, ...);
|
if (E5)
E1 = os_snprintf(E2, E3, ...);
else if (E6)
E1 = os_snprintf(E2, E3, ...);
else
E1 = 0;
|
if (E5) {
...
E1 = os_snprintf(E2, E3, ...);
} else {
...
return -1;
}
|
if (E5) {
...
E1 = os_snprintf(E2, E3, ...);
} else if (E6) {
...
E1 = os_snprintf(E2, E3, ...);
} else {
...
return -1;
}
|
if (E5) {
...
E1 = os_snprintf(E2, E3, ...);
} else {
...
E1 = os_snprintf(E2, E3, ...);
}
)
? os_free(E4);
- if (E1 < 0 || \( E1 >= E3 \| (size_t) E1 >= E3 \| (unsigned int) E1 >= E3 \| E1 >= (int) E3 \))
+ if (os_snprintf_error(E3, E1))
(
S1
|
{ ... }
)
Signed-off-by: Jouni Malinen <j@w1.fi>
2014-12-08 10:15:51 +01:00
if ( os_snprintf_error ( end - pos , ret ) ) {
2008-02-28 02:34:43 +01:00
printf ( " Too long IDENTITY command. \n " ) ;
return - 1 ;
}
pos + = ret ;
}
return wpa_ctrl_command ( ctrl , cmd ) ;
}
static int wpa_cli_cmd_password ( struct wpa_ctrl * ctrl , int argc , char * argv [ ] )
{
char cmd [ 256 ] , * pos , * end ;
int i , ret ;
if ( argc < 2 ) {
printf ( " Invalid PASSWORD command: needs two arguments "
" (network id and password) \n " ) ;
return - 1 ;
}
end = cmd + sizeof ( cmd ) ;
pos = cmd ;
ret = os_snprintf ( pos , end - pos , WPA_CTRL_RSP " PASSWORD-%s:%s " ,
argv [ 0 ] , argv [ 1 ] ) ;
Check os_snprintf() result more consistently - automatic 1
This converts os_snprintf() result validation cases to use
os_snprintf_error() where the exact rule used in os_snprintf_error() was
used. These changes were done automatically with spatch using the
following semantic patch:
@@
identifier E1;
expression E2,E3,E4,E5,E6;
statement S1;
@@
(
E1 = os_snprintf(E2, E3, ...);
|
int E1 = os_snprintf(E2, E3, ...);
|
if (E5)
E1 = os_snprintf(E2, E3, ...);
else
E1 = os_snprintf(E2, E3, ...);
|
if (E5)
E1 = os_snprintf(E2, E3, ...);
else if (E6)
E1 = os_snprintf(E2, E3, ...);
else
E1 = 0;
|
if (E5) {
...
E1 = os_snprintf(E2, E3, ...);
} else {
...
return -1;
}
|
if (E5) {
...
E1 = os_snprintf(E2, E3, ...);
} else if (E6) {
...
E1 = os_snprintf(E2, E3, ...);
} else {
...
return -1;
}
|
if (E5) {
...
E1 = os_snprintf(E2, E3, ...);
} else {
...
E1 = os_snprintf(E2, E3, ...);
}
)
? os_free(E4);
- if (E1 < 0 || \( E1 >= E3 \| (size_t) E1 >= E3 \| (unsigned int) E1 >= E3 \| E1 >= (int) E3 \))
+ if (os_snprintf_error(E3, E1))
(
S1
|
{ ... }
)
Signed-off-by: Jouni Malinen <j@w1.fi>
2014-12-08 10:15:51 +01:00
if ( os_snprintf_error ( end - pos , ret ) ) {
2008-02-28 02:34:43 +01:00
printf ( " Too long PASSWORD command. \n " ) ;
return - 1 ;
}
pos + = ret ;
for ( i = 2 ; i < argc ; i + + ) {
ret = os_snprintf ( pos , end - pos , " %s " , argv [ i ] ) ;
Check os_snprintf() result more consistently - automatic 1
This converts os_snprintf() result validation cases to use
os_snprintf_error() where the exact rule used in os_snprintf_error() was
used. These changes were done automatically with spatch using the
following semantic patch:
@@
identifier E1;
expression E2,E3,E4,E5,E6;
statement S1;
@@
(
E1 = os_snprintf(E2, E3, ...);
|
int E1 = os_snprintf(E2, E3, ...);
|
if (E5)
E1 = os_snprintf(E2, E3, ...);
else
E1 = os_snprintf(E2, E3, ...);
|
if (E5)
E1 = os_snprintf(E2, E3, ...);
else if (E6)
E1 = os_snprintf(E2, E3, ...);
else
E1 = 0;
|
if (E5) {
...
E1 = os_snprintf(E2, E3, ...);
} else {
...
return -1;
}
|
if (E5) {
...
E1 = os_snprintf(E2, E3, ...);
} else if (E6) {
...
E1 = os_snprintf(E2, E3, ...);
} else {
...
return -1;
}
|
if (E5) {
...
E1 = os_snprintf(E2, E3, ...);
} else {
...
E1 = os_snprintf(E2, E3, ...);
}
)
? os_free(E4);
- if (E1 < 0 || \( E1 >= E3 \| (size_t) E1 >= E3 \| (unsigned int) E1 >= E3 \| E1 >= (int) E3 \))
+ if (os_snprintf_error(E3, E1))
(
S1
|
{ ... }
)
Signed-off-by: Jouni Malinen <j@w1.fi>
2014-12-08 10:15:51 +01:00
if ( os_snprintf_error ( end - pos , ret ) ) {
2008-02-28 02:34:43 +01:00
printf ( " Too long PASSWORD command. \n " ) ;
return - 1 ;
}
pos + = ret ;
}
return wpa_ctrl_command ( ctrl , cmd ) ;
}
static int wpa_cli_cmd_new_password ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
char cmd [ 256 ] , * pos , * end ;
int i , ret ;
if ( argc < 2 ) {
printf ( " Invalid NEW_PASSWORD command: needs two arguments "
" (network id and password) \n " ) ;
return - 1 ;
}
end = cmd + sizeof ( cmd ) ;
pos = cmd ;
ret = os_snprintf ( pos , end - pos , WPA_CTRL_RSP " NEW_PASSWORD-%s:%s " ,
argv [ 0 ] , argv [ 1 ] ) ;
Check os_snprintf() result more consistently - automatic 1
This converts os_snprintf() result validation cases to use
os_snprintf_error() where the exact rule used in os_snprintf_error() was
used. These changes were done automatically with spatch using the
following semantic patch:
@@
identifier E1;
expression E2,E3,E4,E5,E6;
statement S1;
@@
(
E1 = os_snprintf(E2, E3, ...);
|
int E1 = os_snprintf(E2, E3, ...);
|
if (E5)
E1 = os_snprintf(E2, E3, ...);
else
E1 = os_snprintf(E2, E3, ...);
|
if (E5)
E1 = os_snprintf(E2, E3, ...);
else if (E6)
E1 = os_snprintf(E2, E3, ...);
else
E1 = 0;
|
if (E5) {
...
E1 = os_snprintf(E2, E3, ...);
} else {
...
return -1;
}
|
if (E5) {
...
E1 = os_snprintf(E2, E3, ...);
} else if (E6) {
...
E1 = os_snprintf(E2, E3, ...);
} else {
...
return -1;
}
|
if (E5) {
...
E1 = os_snprintf(E2, E3, ...);
} else {
...
E1 = os_snprintf(E2, E3, ...);
}
)
? os_free(E4);
- if (E1 < 0 || \( E1 >= E3 \| (size_t) E1 >= E3 \| (unsigned int) E1 >= E3 \| E1 >= (int) E3 \))
+ if (os_snprintf_error(E3, E1))
(
S1
|
{ ... }
)
Signed-off-by: Jouni Malinen <j@w1.fi>
2014-12-08 10:15:51 +01:00
if ( os_snprintf_error ( end - pos , ret ) ) {
2008-02-28 02:34:43 +01:00
printf ( " Too long NEW_PASSWORD command. \n " ) ;
return - 1 ;
}
pos + = ret ;
for ( i = 2 ; i < argc ; i + + ) {
ret = os_snprintf ( pos , end - pos , " %s " , argv [ i ] ) ;
Check os_snprintf() result more consistently - automatic 1
This converts os_snprintf() result validation cases to use
os_snprintf_error() where the exact rule used in os_snprintf_error() was
used. These changes were done automatically with spatch using the
following semantic patch:
@@
identifier E1;
expression E2,E3,E4,E5,E6;
statement S1;
@@
(
E1 = os_snprintf(E2, E3, ...);
|
int E1 = os_snprintf(E2, E3, ...);
|
if (E5)
E1 = os_snprintf(E2, E3, ...);
else
E1 = os_snprintf(E2, E3, ...);
|
if (E5)
E1 = os_snprintf(E2, E3, ...);
else if (E6)
E1 = os_snprintf(E2, E3, ...);
else
E1 = 0;
|
if (E5) {
...
E1 = os_snprintf(E2, E3, ...);
} else {
...
return -1;
}
|
if (E5) {
...
E1 = os_snprintf(E2, E3, ...);
} else if (E6) {
...
E1 = os_snprintf(E2, E3, ...);
} else {
...
return -1;
}
|
if (E5) {
...
E1 = os_snprintf(E2, E3, ...);
} else {
...
E1 = os_snprintf(E2, E3, ...);
}
)
? os_free(E4);
- if (E1 < 0 || \( E1 >= E3 \| (size_t) E1 >= E3 \| (unsigned int) E1 >= E3 \| E1 >= (int) E3 \))
+ if (os_snprintf_error(E3, E1))
(
S1
|
{ ... }
)
Signed-off-by: Jouni Malinen <j@w1.fi>
2014-12-08 10:15:51 +01:00
if ( os_snprintf_error ( end - pos , ret ) ) {
2008-02-28 02:34:43 +01:00
printf ( " Too long NEW_PASSWORD command. \n " ) ;
return - 1 ;
}
pos + = ret ;
}
return wpa_ctrl_command ( ctrl , cmd ) ;
}
static int wpa_cli_cmd_pin ( struct wpa_ctrl * ctrl , int argc , char * argv [ ] )
{
char cmd [ 256 ] , * pos , * end ;
int i , ret ;
if ( argc < 2 ) {
printf ( " Invalid PIN command: needs two arguments "
" (network id and pin) \n " ) ;
return - 1 ;
}
end = cmd + sizeof ( cmd ) ;
pos = cmd ;
ret = os_snprintf ( pos , end - pos , WPA_CTRL_RSP " PIN-%s:%s " ,
argv [ 0 ] , argv [ 1 ] ) ;
Check os_snprintf() result more consistently - automatic 1
This converts os_snprintf() result validation cases to use
os_snprintf_error() where the exact rule used in os_snprintf_error() was
used. These changes were done automatically with spatch using the
following semantic patch:
@@
identifier E1;
expression E2,E3,E4,E5,E6;
statement S1;
@@
(
E1 = os_snprintf(E2, E3, ...);
|
int E1 = os_snprintf(E2, E3, ...);
|
if (E5)
E1 = os_snprintf(E2, E3, ...);
else
E1 = os_snprintf(E2, E3, ...);
|
if (E5)
E1 = os_snprintf(E2, E3, ...);
else if (E6)
E1 = os_snprintf(E2, E3, ...);
else
E1 = 0;
|
if (E5) {
...
E1 = os_snprintf(E2, E3, ...);
} else {
...
return -1;
}
|
if (E5) {
...
E1 = os_snprintf(E2, E3, ...);
} else if (E6) {
...
E1 = os_snprintf(E2, E3, ...);
} else {
...
return -1;
}
|
if (E5) {
...
E1 = os_snprintf(E2, E3, ...);
} else {
...
E1 = os_snprintf(E2, E3, ...);
}
)
? os_free(E4);
- if (E1 < 0 || \( E1 >= E3 \| (size_t) E1 >= E3 \| (unsigned int) E1 >= E3 \| E1 >= (int) E3 \))
+ if (os_snprintf_error(E3, E1))
(
S1
|
{ ... }
)
Signed-off-by: Jouni Malinen <j@w1.fi>
2014-12-08 10:15:51 +01:00
if ( os_snprintf_error ( end - pos , ret ) ) {
2008-02-28 02:34:43 +01:00
printf ( " Too long PIN command. \n " ) ;
return - 1 ;
}
pos + = ret ;
for ( i = 2 ; i < argc ; i + + ) {
ret = os_snprintf ( pos , end - pos , " %s " , argv [ i ] ) ;
Check os_snprintf() result more consistently - automatic 1
This converts os_snprintf() result validation cases to use
os_snprintf_error() where the exact rule used in os_snprintf_error() was
used. These changes were done automatically with spatch using the
following semantic patch:
@@
identifier E1;
expression E2,E3,E4,E5,E6;
statement S1;
@@
(
E1 = os_snprintf(E2, E3, ...);
|
int E1 = os_snprintf(E2, E3, ...);
|
if (E5)
E1 = os_snprintf(E2, E3, ...);
else
E1 = os_snprintf(E2, E3, ...);
|
if (E5)
E1 = os_snprintf(E2, E3, ...);
else if (E6)
E1 = os_snprintf(E2, E3, ...);
else
E1 = 0;
|
if (E5) {
...
E1 = os_snprintf(E2, E3, ...);
} else {
...
return -1;
}
|
if (E5) {
...
E1 = os_snprintf(E2, E3, ...);
} else if (E6) {
...
E1 = os_snprintf(E2, E3, ...);
} else {
...
return -1;
}
|
if (E5) {
...
E1 = os_snprintf(E2, E3, ...);
} else {
...
E1 = os_snprintf(E2, E3, ...);
}
)
? os_free(E4);
- if (E1 < 0 || \( E1 >= E3 \| (size_t) E1 >= E3 \| (unsigned int) E1 >= E3 \| E1 >= (int) E3 \))
+ if (os_snprintf_error(E3, E1))
(
S1
|
{ ... }
)
Signed-off-by: Jouni Malinen <j@w1.fi>
2014-12-08 10:15:51 +01:00
if ( os_snprintf_error ( end - pos , ret ) ) {
2008-02-28 02:34:43 +01:00
printf ( " Too long PIN command. \n " ) ;
return - 1 ;
}
pos + = ret ;
}
return wpa_ctrl_command ( ctrl , cmd ) ;
}
static int wpa_cli_cmd_otp ( struct wpa_ctrl * ctrl , int argc , char * argv [ ] )
{
char cmd [ 256 ] , * pos , * end ;
int i , ret ;
if ( argc < 2 ) {
printf ( " Invalid OTP command: needs two arguments (network "
" id and password) \n " ) ;
return - 1 ;
}
end = cmd + sizeof ( cmd ) ;
pos = cmd ;
ret = os_snprintf ( pos , end - pos , WPA_CTRL_RSP " OTP-%s:%s " ,
argv [ 0 ] , argv [ 1 ] ) ;
Check os_snprintf() result more consistently - automatic 1
This converts os_snprintf() result validation cases to use
os_snprintf_error() where the exact rule used in os_snprintf_error() was
used. These changes were done automatically with spatch using the
following semantic patch:
@@
identifier E1;
expression E2,E3,E4,E5,E6;
statement S1;
@@
(
E1 = os_snprintf(E2, E3, ...);
|
int E1 = os_snprintf(E2, E3, ...);
|
if (E5)
E1 = os_snprintf(E2, E3, ...);
else
E1 = os_snprintf(E2, E3, ...);
|
if (E5)
E1 = os_snprintf(E2, E3, ...);
else if (E6)
E1 = os_snprintf(E2, E3, ...);
else
E1 = 0;
|
if (E5) {
...
E1 = os_snprintf(E2, E3, ...);
} else {
...
return -1;
}
|
if (E5) {
...
E1 = os_snprintf(E2, E3, ...);
} else if (E6) {
...
E1 = os_snprintf(E2, E3, ...);
} else {
...
return -1;
}
|
if (E5) {
...
E1 = os_snprintf(E2, E3, ...);
} else {
...
E1 = os_snprintf(E2, E3, ...);
}
)
? os_free(E4);
- if (E1 < 0 || \( E1 >= E3 \| (size_t) E1 >= E3 \| (unsigned int) E1 >= E3 \| E1 >= (int) E3 \))
+ if (os_snprintf_error(E3, E1))
(
S1
|
{ ... }
)
Signed-off-by: Jouni Malinen <j@w1.fi>
2014-12-08 10:15:51 +01:00
if ( os_snprintf_error ( end - pos , ret ) ) {
2008-02-28 02:34:43 +01:00
printf ( " Too long OTP command. \n " ) ;
return - 1 ;
}
pos + = ret ;
for ( i = 2 ; i < argc ; i + + ) {
ret = os_snprintf ( pos , end - pos , " %s " , argv [ i ] ) ;
Check os_snprintf() result more consistently - automatic 1
This converts os_snprintf() result validation cases to use
os_snprintf_error() where the exact rule used in os_snprintf_error() was
used. These changes were done automatically with spatch using the
following semantic patch:
@@
identifier E1;
expression E2,E3,E4,E5,E6;
statement S1;
@@
(
E1 = os_snprintf(E2, E3, ...);
|
int E1 = os_snprintf(E2, E3, ...);
|
if (E5)
E1 = os_snprintf(E2, E3, ...);
else
E1 = os_snprintf(E2, E3, ...);
|
if (E5)
E1 = os_snprintf(E2, E3, ...);
else if (E6)
E1 = os_snprintf(E2, E3, ...);
else
E1 = 0;
|
if (E5) {
...
E1 = os_snprintf(E2, E3, ...);
} else {
...
return -1;
}
|
if (E5) {
...
E1 = os_snprintf(E2, E3, ...);
} else if (E6) {
...
E1 = os_snprintf(E2, E3, ...);
} else {
...
return -1;
}
|
if (E5) {
...
E1 = os_snprintf(E2, E3, ...);
} else {
...
E1 = os_snprintf(E2, E3, ...);
}
)
? os_free(E4);
- if (E1 < 0 || \( E1 >= E3 \| (size_t) E1 >= E3 \| (unsigned int) E1 >= E3 \| E1 >= (int) E3 \))
+ if (os_snprintf_error(E3, E1))
(
S1
|
{ ... }
)
Signed-off-by: Jouni Malinen <j@w1.fi>
2014-12-08 10:15:51 +01:00
if ( os_snprintf_error ( end - pos , ret ) ) {
2008-02-28 02:34:43 +01:00
printf ( " Too long OTP command. \n " ) ;
return - 1 ;
}
pos + = ret ;
}
return wpa_ctrl_command ( ctrl , cmd ) ;
}
2013-10-19 16:32:05 +02:00
static int wpa_cli_cmd_sim ( struct wpa_ctrl * ctrl , int argc , char * argv [ ] )
{
char cmd [ 256 ] , * pos , * end ;
int i , ret ;
if ( argc < 2 ) {
printf ( " Invalid SIM command: needs two arguments "
" (network id and SIM operation response) \n " ) ;
return - 1 ;
}
end = cmd + sizeof ( cmd ) ;
pos = cmd ;
ret = os_snprintf ( pos , end - pos , WPA_CTRL_RSP " SIM-%s:%s " ,
argv [ 0 ] , argv [ 1 ] ) ;
Check os_snprintf() result more consistently - automatic 1
This converts os_snprintf() result validation cases to use
os_snprintf_error() where the exact rule used in os_snprintf_error() was
used. These changes were done automatically with spatch using the
following semantic patch:
@@
identifier E1;
expression E2,E3,E4,E5,E6;
statement S1;
@@
(
E1 = os_snprintf(E2, E3, ...);
|
int E1 = os_snprintf(E2, E3, ...);
|
if (E5)
E1 = os_snprintf(E2, E3, ...);
else
E1 = os_snprintf(E2, E3, ...);
|
if (E5)
E1 = os_snprintf(E2, E3, ...);
else if (E6)
E1 = os_snprintf(E2, E3, ...);
else
E1 = 0;
|
if (E5) {
...
E1 = os_snprintf(E2, E3, ...);
} else {
...
return -1;
}
|
if (E5) {
...
E1 = os_snprintf(E2, E3, ...);
} else if (E6) {
...
E1 = os_snprintf(E2, E3, ...);
} else {
...
return -1;
}
|
if (E5) {
...
E1 = os_snprintf(E2, E3, ...);
} else {
...
E1 = os_snprintf(E2, E3, ...);
}
)
? os_free(E4);
- if (E1 < 0 || \( E1 >= E3 \| (size_t) E1 >= E3 \| (unsigned int) E1 >= E3 \| E1 >= (int) E3 \))
+ if (os_snprintf_error(E3, E1))
(
S1
|
{ ... }
)
Signed-off-by: Jouni Malinen <j@w1.fi>
2014-12-08 10:15:51 +01:00
if ( os_snprintf_error ( end - pos , ret ) ) {
2013-10-19 16:32:05 +02:00
printf ( " Too long SIM command. \n " ) ;
return - 1 ;
}
pos + = ret ;
for ( i = 2 ; i < argc ; i + + ) {
ret = os_snprintf ( pos , end - pos , " %s " , argv [ i ] ) ;
Check os_snprintf() result more consistently - automatic 1
This converts os_snprintf() result validation cases to use
os_snprintf_error() where the exact rule used in os_snprintf_error() was
used. These changes were done automatically with spatch using the
following semantic patch:
@@
identifier E1;
expression E2,E3,E4,E5,E6;
statement S1;
@@
(
E1 = os_snprintf(E2, E3, ...);
|
int E1 = os_snprintf(E2, E3, ...);
|
if (E5)
E1 = os_snprintf(E2, E3, ...);
else
E1 = os_snprintf(E2, E3, ...);
|
if (E5)
E1 = os_snprintf(E2, E3, ...);
else if (E6)
E1 = os_snprintf(E2, E3, ...);
else
E1 = 0;
|
if (E5) {
...
E1 = os_snprintf(E2, E3, ...);
} else {
...
return -1;
}
|
if (E5) {
...
E1 = os_snprintf(E2, E3, ...);
} else if (E6) {
...
E1 = os_snprintf(E2, E3, ...);
} else {
...
return -1;
}
|
if (E5) {
...
E1 = os_snprintf(E2, E3, ...);
} else {
...
E1 = os_snprintf(E2, E3, ...);
}
)
? os_free(E4);
- if (E1 < 0 || \( E1 >= E3 \| (size_t) E1 >= E3 \| (unsigned int) E1 >= E3 \| E1 >= (int) E3 \))
+ if (os_snprintf_error(E3, E1))
(
S1
|
{ ... }
)
Signed-off-by: Jouni Malinen <j@w1.fi>
2014-12-08 10:15:51 +01:00
if ( os_snprintf_error ( end - pos , ret ) ) {
2013-10-19 16:32:05 +02:00
printf ( " Too long SIM command. \n " ) ;
return - 1 ;
}
pos + = ret ;
}
return wpa_ctrl_command ( ctrl , cmd ) ;
}
2008-02-28 02:34:43 +01:00
static int wpa_cli_cmd_passphrase ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
char cmd [ 256 ] , * pos , * end ;
int i , ret ;
if ( argc < 2 ) {
printf ( " Invalid PASSPHRASE command: needs two arguments "
" (network id and passphrase) \n " ) ;
return - 1 ;
}
end = cmd + sizeof ( cmd ) ;
pos = cmd ;
ret = os_snprintf ( pos , end - pos , WPA_CTRL_RSP " PASSPHRASE-%s:%s " ,
argv [ 0 ] , argv [ 1 ] ) ;
Check os_snprintf() result more consistently - automatic 1
This converts os_snprintf() result validation cases to use
os_snprintf_error() where the exact rule used in os_snprintf_error() was
used. These changes were done automatically with spatch using the
following semantic patch:
@@
identifier E1;
expression E2,E3,E4,E5,E6;
statement S1;
@@
(
E1 = os_snprintf(E2, E3, ...);
|
int E1 = os_snprintf(E2, E3, ...);
|
if (E5)
E1 = os_snprintf(E2, E3, ...);
else
E1 = os_snprintf(E2, E3, ...);
|
if (E5)
E1 = os_snprintf(E2, E3, ...);
else if (E6)
E1 = os_snprintf(E2, E3, ...);
else
E1 = 0;
|
if (E5) {
...
E1 = os_snprintf(E2, E3, ...);
} else {
...
return -1;
}
|
if (E5) {
...
E1 = os_snprintf(E2, E3, ...);
} else if (E6) {
...
E1 = os_snprintf(E2, E3, ...);
} else {
...
return -1;
}
|
if (E5) {
...
E1 = os_snprintf(E2, E3, ...);
} else {
...
E1 = os_snprintf(E2, E3, ...);
}
)
? os_free(E4);
- if (E1 < 0 || \( E1 >= E3 \| (size_t) E1 >= E3 \| (unsigned int) E1 >= E3 \| E1 >= (int) E3 \))
+ if (os_snprintf_error(E3, E1))
(
S1
|
{ ... }
)
Signed-off-by: Jouni Malinen <j@w1.fi>
2014-12-08 10:15:51 +01:00
if ( os_snprintf_error ( end - pos , ret ) ) {
2008-02-28 02:34:43 +01:00
printf ( " Too long PASSPHRASE command. \n " ) ;
return - 1 ;
}
pos + = ret ;
for ( i = 2 ; i < argc ; i + + ) {
ret = os_snprintf ( pos , end - pos , " %s " , argv [ i ] ) ;
Check os_snprintf() result more consistently - automatic 1
This converts os_snprintf() result validation cases to use
os_snprintf_error() where the exact rule used in os_snprintf_error() was
used. These changes were done automatically with spatch using the
following semantic patch:
@@
identifier E1;
expression E2,E3,E4,E5,E6;
statement S1;
@@
(
E1 = os_snprintf(E2, E3, ...);
|
int E1 = os_snprintf(E2, E3, ...);
|
if (E5)
E1 = os_snprintf(E2, E3, ...);
else
E1 = os_snprintf(E2, E3, ...);
|
if (E5)
E1 = os_snprintf(E2, E3, ...);
else if (E6)
E1 = os_snprintf(E2, E3, ...);
else
E1 = 0;
|
if (E5) {
...
E1 = os_snprintf(E2, E3, ...);
} else {
...
return -1;
}
|
if (E5) {
...
E1 = os_snprintf(E2, E3, ...);
} else if (E6) {
...
E1 = os_snprintf(E2, E3, ...);
} else {
...
return -1;
}
|
if (E5) {
...
E1 = os_snprintf(E2, E3, ...);
} else {
...
E1 = os_snprintf(E2, E3, ...);
}
)
? os_free(E4);
- if (E1 < 0 || \( E1 >= E3 \| (size_t) E1 >= E3 \| (unsigned int) E1 >= E3 \| E1 >= (int) E3 \))
+ if (os_snprintf_error(E3, E1))
(
S1
|
{ ... }
)
Signed-off-by: Jouni Malinen <j@w1.fi>
2014-12-08 10:15:51 +01:00
if ( os_snprintf_error ( end - pos , ret ) ) {
2008-02-28 02:34:43 +01:00
printf ( " Too long PASSPHRASE command. \n " ) ;
return - 1 ;
}
pos + = ret ;
}
return wpa_ctrl_command ( ctrl , cmd ) ;
}
static int wpa_cli_cmd_bssid ( struct wpa_ctrl * ctrl , int argc , char * argv [ ] )
{
if ( argc < 2 ) {
printf ( " Invalid BSSID command: needs two arguments (network "
" id and BSSID) \n " ) ;
return - 1 ;
}
2012-08-15 21:40:07 +02:00
return wpa_cli_cmd ( ctrl , " BSSID " , 2 , argc , argv ) ;
2008-02-28 02:34:43 +01:00
}
2011-10-18 19:11:52 +02:00
static int wpa_cli_cmd_blacklist ( struct wpa_ctrl * ctrl , int argc , char * argv [ ] )
{
2012-08-15 21:40:07 +02:00
return wpa_cli_cmd ( ctrl , " BLACKLIST " , 0 , argc , argv ) ;
}
2011-10-18 19:11:52 +02:00
2011-10-18 19:16:38 +02:00
static int wpa_cli_cmd_log_level ( struct wpa_ctrl * ctrl , int argc , char * argv [ ] )
{
2012-08-15 21:40:07 +02:00
return wpa_cli_cmd ( ctrl , " LOG_LEVEL " , 0 , argc , argv ) ;
2011-10-18 19:16:38 +02:00
}
2008-02-28 02:34:43 +01:00
static int wpa_cli_cmd_list_networks ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
return wpa_ctrl_command ( ctrl , " LIST_NETWORKS " ) ;
}
static int wpa_cli_cmd_select_network ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
2012-08-15 21:40:07 +02:00
return wpa_cli_cmd ( ctrl , " SELECT_NETWORK " , 1 , argc , argv ) ;
2008-02-28 02:34:43 +01:00
}
static int wpa_cli_cmd_enable_network ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
2012-08-15 21:40:07 +02:00
return wpa_cli_cmd ( ctrl , " ENABLE_NETWORK " , 1 , argc , argv ) ;
2008-02-28 02:34:43 +01:00
}
static int wpa_cli_cmd_disable_network ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
2012-08-15 21:40:07 +02:00
return wpa_cli_cmd ( ctrl , " DISABLE_NETWORK " , 1 , argc , argv ) ;
2008-02-28 02:34:43 +01:00
}
static int wpa_cli_cmd_add_network ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
2015-03-24 17:10:37 +01:00
int res = wpa_ctrl_command ( ctrl , " ADD_NETWORK " ) ;
2015-04-28 13:01:02 +02:00
if ( interactive )
update_networks ( ctrl ) ;
2015-03-24 17:10:37 +01:00
return res ;
2008-02-28 02:34:43 +01:00
}
static int wpa_cli_cmd_remove_network ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
2015-03-24 17:10:37 +01:00
int res = wpa_cli_cmd ( ctrl , " REMOVE_NETWORK " , 1 , argc , argv ) ;
2015-04-28 13:01:02 +02:00
if ( interactive )
update_networks ( ctrl ) ;
2015-03-24 17:10:37 +01:00
return res ;
2008-02-28 02:34:43 +01:00
}
static void wpa_cli_show_network_variables ( void )
{
printf ( " set_network variables: \n "
" ssid (network name, SSID) \n "
" psk (WPA passphrase or pre-shared key) \n "
" key_mgmt (key management protocol) \n "
" identity (EAP identity) \n "
" password (EAP password) \n "
" ... \n "
" \n "
" Note: Values are entered in the same format as the "
" configuration file is using, \n "
" i.e., strings values need to be inside double quotation "
" marks. \n "
" For example: set_network 1 ssid \" network name \" \n "
" \n "
" Please see wpa_supplicant.conf documentation for full list "
" of \n available variables. \n " ) ;
}
static int wpa_cli_cmd_set_network ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
if ( argc = = 0 ) {
wpa_cli_show_network_variables ( ) ;
return 0 ;
}
2012-11-19 13:04:42 +01:00
if ( argc < 3 ) {
2008-02-28 02:34:43 +01:00
printf ( " Invalid SET_NETWORK command: needs three arguments \n "
" (network id, variable name, and value) \n " ) ;
return - 1 ;
}
2012-08-15 21:40:07 +02:00
return wpa_cli_cmd ( ctrl , " SET_NETWORK " , 3 , argc , argv ) ;
2008-02-28 02:34:43 +01:00
}
static int wpa_cli_cmd_get_network ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
if ( argc = = 0 ) {
wpa_cli_show_network_variables ( ) ;
return 0 ;
}
if ( argc ! = 2 ) {
printf ( " Invalid GET_NETWORK command: needs two arguments \n "
" (network id and variable name) \n " ) ;
return - 1 ;
}
2012-08-15 21:40:07 +02:00
return wpa_cli_cmd ( ctrl , " GET_NETWORK " , 2 , argc , argv ) ;
2008-02-28 02:34:43 +01:00
}
2015-03-24 17:10:38 +01:00
static const char * network_fields [ ] = {
" ssid " , " scan_ssid " , " bssid " , " bssid_blacklist " ,
" bssid_whitelist " , " psk " , " proto " , " key_mgmt " ,
" bg_scan_period " , " pairwise " , " group " , " auth_alg " , " scan_freq " ,
2015-11-25 04:51:43 +01:00
" freq_list " , " max_oper_chwidth " ,
2015-03-24 17:10:38 +01:00
# ifdef IEEE8021X_EAPOL
" eap " , " identity " , " anonymous_identity " , " password " , " ca_cert " ,
" ca_path " , " client_cert " , " private_key " , " private_key_passwd " ,
" dh_file " , " subject_match " , " altsubject_match " ,
" domain_suffix_match " , " domain_match " , " ca_cert2 " , " ca_path2 " ,
" client_cert2 " , " private_key2 " , " private_key2_passwd " ,
" dh_file2 " , " subject_match2 " , " altsubject_match2 " ,
" domain_suffix_match2 " , " domain_match2 " , " phase1 " , " phase2 " ,
" pcsc " , " pin " , " engine_id " , " key_id " , " cert_id " , " ca_cert_id " ,
" pin2 " , " engine2_id " , " key2_id " , " cert2_id " , " ca_cert2_id " ,
" engine " , " engine2 " , " eapol_flags " , " sim_num " ,
" openssl_ciphers " , " erp " ,
# endif /* IEEE8021X_EAPOL */
" wep_key0 " , " wep_key1 " , " wep_key2 " , " wep_key3 " ,
" wep_tx_keyidx " , " priority " ,
# ifdef IEEE8021X_EAPOL
" eap_workaround " , " pac_file " , " fragment_size " , " ocsp " ,
# endif /* IEEE8021X_EAPOL */
# ifdef CONFIG_MESH
" mode " , " no_auto_peer " ,
# else /* CONFIG_MESH */
" mode " ,
# endif /* CONFIG_MESH */
" proactive_key_caching " , " disabled " , " id_str " ,
# ifdef CONFIG_IEEE80211W
" ieee80211w " ,
# endif /* CONFIG_IEEE80211W */
" peerkey " , " mixed_cell " , " frequency " , " fixed_freq " ,
# ifdef CONFIG_MESH
" mesh_basic_rates " , " dot11MeshMaxRetries " ,
" dot11MeshRetryTimeout " , " dot11MeshConfirmTimeout " ,
" dot11MeshHoldingTimeout " ,
# endif /* CONFIG_MESH */
" wpa_ptk_rekey " , " bgscan " , " ignore_broadcast_ssid " ,
# ifdef CONFIG_P2P
" go_p2p_dev_addr " , " p2p_client_list " , " psk_list " ,
# endif /* CONFIG_P2P */
# ifdef CONFIG_HT_OVERRIDES
" disable_ht " , " disable_ht40 " , " disable_sgi " , " disable_ldpc " ,
" ht40_intolerant " , " disable_max_amsdu " , " ampdu_factor " ,
" ampdu_density " , " ht_mcs " ,
# endif /* CONFIG_HT_OVERRIDES */
# ifdef CONFIG_VHT_OVERRIDES
" disable_vht " , " vht_capa " , " vht_capa_mask " , " vht_rx_mcs_nss_1 " ,
" vht_rx_mcs_nss_2 " , " vht_rx_mcs_nss_3 " , " vht_rx_mcs_nss_4 " ,
" vht_rx_mcs_nss_5 " , " vht_rx_mcs_nss_6 " , " vht_rx_mcs_nss_7 " ,
" vht_rx_mcs_nss_8 " , " vht_tx_mcs_nss_1 " , " vht_tx_mcs_nss_2 " ,
" vht_tx_mcs_nss_3 " , " vht_tx_mcs_nss_4 " , " vht_tx_mcs_nss_5 " ,
" vht_tx_mcs_nss_6 " , " vht_tx_mcs_nss_7 " , " vht_tx_mcs_nss_8 " ,
# endif /* CONFIG_VHT_OVERRIDES */
" ap_max_inactivity " , " dtim_period " , " beacon_int " ,
# ifdef CONFIG_MACSEC
" macsec_policy " ,
2016-11-02 16:38:37 +01:00
" macsec_integ_only " ,
2016-11-02 16:38:39 +01:00
" macsec_port " ,
2016-12-05 15:53:55 +01:00
" mka_priority " ,
2015-03-24 17:10:38 +01:00
# endif /* CONFIG_MACSEC */
# ifdef CONFIG_HS20
" update_identifier " ,
# endif /* CONFIG_HS20 */
2016-04-12 17:13:22 +02:00
" mac_addr " , " pbss " , " wps_disabled "
2015-03-24 17:10:38 +01:00
} ;
static char * * wpa_cli_complete_network ( const char * str , int pos )
{
int arg = get_cmd_arg_num ( str , pos ) ;
int i , num_fields = ARRAY_SIZE ( network_fields ) ;
char * * res = NULL ;
switch ( arg ) {
case 1 :
res = cli_txt_list_array ( & networks ) ;
break ;
case 2 :
res = os_calloc ( num_fields + 1 , sizeof ( char * ) ) ;
if ( res = = NULL )
return NULL ;
for ( i = 0 ; i < num_fields ; i + + ) {
res [ i ] = os_strdup ( network_fields [ i ] ) ;
if ( res [ i ] = = NULL )
break ;
}
}
return res ;
}
2015-03-24 17:10:39 +01:00
static char * * wpa_cli_complete_network_id ( const char * str , int pos )
{
int arg = get_cmd_arg_num ( str , pos ) ;
if ( arg = = 1 )
return cli_txt_list_array ( & networks ) ;
return NULL ;
}
2014-04-29 22:41:47 +02:00
static int wpa_cli_cmd_dup_network ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
if ( argc = = 0 ) {
wpa_cli_show_network_variables ( ) ;
return 0 ;
}
if ( argc < 3 ) {
printf ( " Invalid DUP_NETWORK command: needs three arguments \n "
" (src netid, dest netid, and variable name) \n " ) ;
return - 1 ;
}
return wpa_cli_cmd ( ctrl , " DUP_NETWORK " , 3 , argc , argv ) ;
}
2015-03-24 17:10:40 +01:00
static char * * wpa_cli_complete_dup_network ( const char * str , int pos )
{
int arg = get_cmd_arg_num ( str , pos ) ;
int i , num_fields = ARRAY_SIZE ( network_fields ) ;
char * * res = NULL ;
switch ( arg ) {
case 1 :
case 2 :
res = cli_txt_list_array ( & networks ) ;
break ;
case 3 :
res = os_calloc ( num_fields + 1 , sizeof ( char * ) ) ;
if ( res = = NULL )
return NULL ;
for ( i = 0 ; i < num_fields ; i + + ) {
res [ i ] = os_strdup ( network_fields [ i ] ) ;
if ( res [ i ] = = NULL )
break ;
}
}
return res ;
}
2012-02-16 15:36:00 +01:00
static int wpa_cli_cmd_list_creds ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
return wpa_ctrl_command ( ctrl , " LIST_CREDS " ) ;
}
static int wpa_cli_cmd_add_cred ( struct wpa_ctrl * ctrl , int argc , char * argv [ ] )
{
return wpa_ctrl_command ( ctrl , " ADD_CRED " ) ;
}
static int wpa_cli_cmd_remove_cred ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
2012-08-15 21:40:07 +02:00
return wpa_cli_cmd ( ctrl , " REMOVE_CRED " , 1 , argc , argv ) ;
2012-02-16 15:36:00 +01:00
}
static int wpa_cli_cmd_set_cred ( struct wpa_ctrl * ctrl , int argc , char * argv [ ] )
{
if ( argc ! = 3 ) {
printf ( " Invalid SET_CRED command: needs three arguments \n "
" (cred id, variable name, and value) \n " ) ;
return - 1 ;
}
2012-08-15 21:40:07 +02:00
return wpa_cli_cmd ( ctrl , " SET_CRED " , 3 , argc , argv ) ;
2012-02-16 15:36:00 +01:00
}
2014-04-04 19:10:49 +02:00
static int wpa_cli_cmd_get_cred ( struct wpa_ctrl * ctrl , int argc , char * argv [ ] )
{
if ( argc ! = 2 ) {
printf ( " Invalid GET_CRED command: needs two arguments \n "
" (cred id, variable name) \n " ) ;
return - 1 ;
}
return wpa_cli_cmd ( ctrl , " GET_CRED " , 2 , argc , argv ) ;
}
2008-02-28 02:34:43 +01:00
static int wpa_cli_cmd_disconnect ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
return wpa_ctrl_command ( ctrl , " DISCONNECT " ) ;
}
static int wpa_cli_cmd_reconnect ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
return wpa_ctrl_command ( ctrl , " RECONNECT " ) ;
}
static int wpa_cli_cmd_save_config ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
return wpa_ctrl_command ( ctrl , " SAVE_CONFIG " ) ;
}
static int wpa_cli_cmd_scan ( struct wpa_ctrl * ctrl , int argc , char * argv [ ] )
{
2013-02-07 17:06:51 +01:00
return wpa_cli_cmd ( ctrl , " SCAN " , 0 , argc , argv ) ;
2008-02-28 02:34:43 +01:00
}
static int wpa_cli_cmd_scan_results ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
return wpa_ctrl_command ( ctrl , " SCAN_RESULTS " ) ;
}
2015-10-27 09:58:52 +01:00
static int wpa_cli_cmd_abort_scan ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
return wpa_ctrl_command ( ctrl , " ABORT_SCAN " ) ;
}
2008-02-28 02:34:43 +01:00
static int wpa_cli_cmd_bss ( struct wpa_ctrl * ctrl , int argc , char * argv [ ] )
{
2012-08-15 21:40:07 +02:00
return wpa_cli_cmd ( ctrl , " BSS " , 1 , argc , argv ) ;
2008-02-28 02:34:43 +01:00
}
2011-10-28 22:37:34 +02:00
static char * * wpa_cli_complete_bss ( const char * str , int pos )
{
int arg = get_cmd_arg_num ( str , pos ) ;
char * * res = NULL ;
switch ( arg ) {
case 1 :
res = cli_txt_list_array ( & bsses ) ;
break ;
}
return res ;
}
2008-02-28 02:34:43 +01:00
static int wpa_cli_cmd_get_capability ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
if ( argc < 1 | | argc > 2 ) {
printf ( " Invalid GET_CAPABILITY command: need either one or "
" two arguments \n " ) ;
return - 1 ;
}
if ( ( argc = = 2 ) & & os_strcmp ( argv [ 1 ] , " strict " ) ! = 0 ) {
printf ( " Invalid GET_CAPABILITY command: second argument, "
" if any, must be 'strict' \n " ) ;
return - 1 ;
}
2012-08-15 21:40:07 +02:00
return wpa_cli_cmd ( ctrl , " GET_CAPABILITY " , 1 , argc , argv ) ;
2008-02-28 02:34:43 +01:00
}
2016-07-07 14:04:30 +02:00
static char * * wpa_cli_complete_get_capability ( const char * str , int pos )
{
int arg = get_cmd_arg_num ( str , pos ) ;
const char * fields [ ] = {
" eap " , " pairwise " , " group " , " group_mgmt " , " key_mgmt " ,
" proto " , " auth_alg " , " modes " , " channels " , " freq " ,
# ifdef CONFIG_TDLS
" tdls " ,
# endif /* CONFIG_TDLS */
# ifdef CONFIG_ERP
" erp " ,
# endif /* CONFIG_ERP */
# ifdef CONFIG_FIPS
" fips " ,
# endif /* CONFIG_FIPS */
# ifdef CONFIG_ACS
" acs " ,
# endif /* CONFIG_ACS */
} ;
int i , num_fields = ARRAY_SIZE ( fields ) ;
char * * res = NULL ;
if ( arg = = 1 ) {
res = os_calloc ( num_fields + 1 , sizeof ( char * ) ) ;
if ( res = = NULL )
return NULL ;
for ( i = 0 ; i < num_fields ; i + + ) {
res [ i ] = os_strdup ( fields [ i ] ) ;
if ( res [ i ] = = NULL )
return res ;
}
}
if ( arg = = 2 ) {
res = os_calloc ( 1 + 1 , sizeof ( char * ) ) ;
if ( res = = NULL )
return NULL ;
res [ 0 ] = os_strdup ( " strict " ) ;
}
return res ;
}
2008-02-28 02:34:43 +01:00
static int wpa_cli_list_interfaces ( struct wpa_ctrl * ctrl )
{
printf ( " Available interfaces: \n " ) ;
return wpa_ctrl_command ( ctrl , " INTERFACES " ) ;
}
static int wpa_cli_cmd_interface ( struct wpa_ctrl * ctrl , int argc , char * argv [ ] )
{
if ( argc < 1 ) {
wpa_cli_list_interfaces ( ctrl ) ;
return 0 ;
}
wpa_cli_close_connection ( ) ;
os_free ( ctrl_ifname ) ;
ctrl_ifname = os_strdup ( argv [ 0 ] ) ;
2015-01-19 05:57:30 +01:00
if ( ! ctrl_ifname ) {
printf ( " Failed to allocate memory \n " ) ;
return 0 ;
}
2008-02-28 02:34:43 +01:00
2014-04-06 09:35:12 +02:00
if ( wpa_cli_open_connection ( ctrl_ifname , 1 ) = = 0 ) {
2008-02-28 02:34:43 +01:00
printf ( " Connected to interface '%s. \n " , ctrl_ifname ) ;
} else {
printf ( " Could not connect to interface '%s' - re-trying \n " ,
ctrl_ifname ) ;
}
return 0 ;
}
static int wpa_cli_cmd_reconfigure ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
return wpa_ctrl_command ( ctrl , " RECONFIGURE " ) ;
}
static int wpa_cli_cmd_terminate ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
return wpa_ctrl_command ( ctrl , " TERMINATE " ) ;
}
static int wpa_cli_cmd_interface_add ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
char cmd [ 256 ] ;
int res ;
if ( argc < 1 ) {
printf ( " Invalid INTERFACE_ADD command: needs at least one "
" argument (interface name) \n "
" All arguments: ifname confname driver ctrl_interface "
2015-03-20 11:39:50 +01:00
" driver_param bridge_name [create] \n " ) ;
2008-02-28 02:34:43 +01:00
return - 1 ;
}
/*
* INTERFACE_ADD < ifname > TAB < confname > TAB < driver > TAB < ctrl_interface > TAB
2015-11-03 15:30:11 +01:00
* < driver_param > TAB < bridge_name > [ TAB < create > [ TAB < type > ] ]
2008-02-28 02:34:43 +01:00
*/
res = os_snprintf ( cmd , sizeof ( cmd ) ,
2015-11-03 15:30:11 +01:00
" INTERFACE_ADD %s \t %s \t %s \t %s \t %s \t %s \t %s \t %s " ,
2008-02-28 02:34:43 +01:00
argv [ 0 ] ,
argc > 1 ? argv [ 1 ] : " " , argc > 2 ? argv [ 2 ] : " " ,
argc > 3 ? argv [ 3 ] : " " , argc > 4 ? argv [ 4 ] : " " ,
2015-11-03 15:30:11 +01:00
argc > 5 ? argv [ 5 ] : " " , argc > 6 ? argv [ 6 ] : " " ,
argc > 7 ? argv [ 7 ] : " " ) ;
Check os_snprintf() result more consistently - automatic 1
This converts os_snprintf() result validation cases to use
os_snprintf_error() where the exact rule used in os_snprintf_error() was
used. These changes were done automatically with spatch using the
following semantic patch:
@@
identifier E1;
expression E2,E3,E4,E5,E6;
statement S1;
@@
(
E1 = os_snprintf(E2, E3, ...);
|
int E1 = os_snprintf(E2, E3, ...);
|
if (E5)
E1 = os_snprintf(E2, E3, ...);
else
E1 = os_snprintf(E2, E3, ...);
|
if (E5)
E1 = os_snprintf(E2, E3, ...);
else if (E6)
E1 = os_snprintf(E2, E3, ...);
else
E1 = 0;
|
if (E5) {
...
E1 = os_snprintf(E2, E3, ...);
} else {
...
return -1;
}
|
if (E5) {
...
E1 = os_snprintf(E2, E3, ...);
} else if (E6) {
...
E1 = os_snprintf(E2, E3, ...);
} else {
...
return -1;
}
|
if (E5) {
...
E1 = os_snprintf(E2, E3, ...);
} else {
...
E1 = os_snprintf(E2, E3, ...);
}
)
? os_free(E4);
- if (E1 < 0 || \( E1 >= E3 \| (size_t) E1 >= E3 \| (unsigned int) E1 >= E3 \| E1 >= (int) E3 \))
+ if (os_snprintf_error(E3, E1))
(
S1
|
{ ... }
)
Signed-off-by: Jouni Malinen <j@w1.fi>
2014-12-08 10:15:51 +01:00
if ( os_snprintf_error ( sizeof ( cmd ) , res ) )
2008-02-28 02:34:43 +01:00
return - 1 ;
cmd [ sizeof ( cmd ) - 1 ] = ' \0 ' ;
return wpa_ctrl_command ( ctrl , cmd ) ;
}
static int wpa_cli_cmd_interface_remove ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
2012-08-15 21:40:07 +02:00
return wpa_cli_cmd ( ctrl , " INTERFACE_REMOVE " , 1 , argc , argv ) ;
2008-02-28 02:34:43 +01:00
}
2008-12-24 19:25:19 +01:00
static int wpa_cli_cmd_interface_list ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
return wpa_ctrl_command ( ctrl , " INTERFACE_LIST " ) ;
}
2009-09-08 11:58:02 +02:00
# ifdef CONFIG_AP
static int wpa_cli_cmd_sta ( struct wpa_ctrl * ctrl , int argc , char * argv [ ] )
{
2012-08-15 21:40:07 +02:00
return wpa_cli_cmd ( ctrl , " STA " , 1 , argc , argv ) ;
2009-09-08 11:58:02 +02:00
}
2016-10-12 14:19:00 +02:00
static char * * wpa_cli_complete_sta ( const char * str , int pos )
{
int arg = get_cmd_arg_num ( str , pos ) ;
char * * res = NULL ;
switch ( arg ) {
case 1 :
res = cli_txt_list_array ( & stations ) ;
break ;
}
return res ;
}
2016-10-16 11:21:25 +02:00
static int wpa_ctrl_command_sta ( struct wpa_ctrl * ctrl , const char * cmd ,
2016-10-12 14:18:59 +02:00
char * addr , size_t addr_len , int print )
2009-09-08 11:58:02 +02:00
{
char buf [ 4096 ] , * pos ;
size_t len ;
int ret ;
if ( ctrl_conn = = NULL ) {
printf ( " Not connected to hostapd - command dropped. \n " ) ;
return - 1 ;
}
2015-12-10 11:56:06 +01:00
if ( ifname_prefix ) {
os_snprintf ( buf , sizeof ( buf ) , " IFNAME=%s %s " ,
ifname_prefix , cmd ) ;
buf [ sizeof ( buf ) - 1 ] = ' \0 ' ;
cmd = buf ;
}
2009-09-08 11:58:02 +02:00
len = sizeof ( buf ) - 1 ;
2012-03-31 20:13:53 +02:00
ret = wpa_ctrl_request ( ctrl , cmd , os_strlen ( cmd ) , buf , & len ,
2009-09-08 11:58:02 +02:00
wpa_cli_msg_cb ) ;
if ( ret = = - 2 ) {
printf ( " '%s' command timed out. \n " , cmd ) ;
return - 2 ;
} else if ( ret < 0 ) {
printf ( " '%s' command failed. \n " , cmd ) ;
return - 1 ;
}
buf [ len ] = ' \0 ' ;
2012-03-31 20:13:53 +02:00
if ( os_memcmp ( buf , " FAIL " , 4 ) = = 0 )
2009-09-08 11:58:02 +02:00
return - 1 ;
2016-10-12 14:18:59 +02:00
if ( print )
printf ( " %s " , buf ) ;
2009-09-08 11:58:02 +02:00
pos = buf ;
while ( * pos ! = ' \0 ' & & * pos ! = ' \n ' )
pos + + ;
* pos = ' \0 ' ;
os_strlcpy ( addr , buf , addr_len ) ;
return 0 ;
}
static int wpa_cli_cmd_all_sta ( struct wpa_ctrl * ctrl , int argc , char * argv [ ] )
{
char addr [ 32 ] , cmd [ 64 ] ;
2016-10-12 14:18:59 +02:00
if ( wpa_ctrl_command_sta ( ctrl , " STA-FIRST " , addr , sizeof ( addr ) , 1 ) )
2009-09-08 11:58:02 +02:00
return 0 ;
do {
2010-02-19 18:14:41 +01:00
os_snprintf ( cmd , sizeof ( cmd ) , " STA-NEXT %s " , addr ) ;
2016-10-12 14:18:59 +02:00
} while ( wpa_ctrl_command_sta ( ctrl , cmd , addr , sizeof ( addr ) , 1 ) = = 0 ) ;
2009-09-08 11:58:02 +02:00
return - 1 ;
}
2012-02-25 16:22:48 +01:00
2016-10-12 14:18:59 +02:00
static int wpa_cli_cmd_list_sta ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
char addr [ 32 ] , cmd [ 64 ] ;
if ( wpa_ctrl_command_sta ( ctrl , " STA-FIRST " , addr , sizeof ( addr ) , 0 ) )
return 0 ;
do {
if ( os_strcmp ( addr , " " ) ! = 0 )
printf ( " %s \n " , addr ) ;
os_snprintf ( cmd , sizeof ( cmd ) , " STA-NEXT %s " , addr ) ;
} while ( wpa_ctrl_command_sta ( ctrl , cmd , addr , sizeof ( addr ) , 0 ) = = 0 ) ;
return 0 ;
}
2012-02-25 16:22:48 +01:00
static int wpa_cli_cmd_deauthenticate ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
2012-08-15 21:40:07 +02:00
return wpa_cli_cmd ( ctrl , " DEAUTHENTICATE " , 1 , argc , argv ) ;
2012-02-25 16:22:48 +01:00
}
2016-10-12 14:19:00 +02:00
static char * * wpa_cli_complete_deauthenticate ( const char * str , int pos )
{
int arg = get_cmd_arg_num ( str , pos ) ;
char * * res = NULL ;
switch ( arg ) {
case 1 :
res = cli_txt_list_array ( & stations ) ;
break ;
}
return res ;
}
2012-02-25 16:22:48 +01:00
static int wpa_cli_cmd_disassociate ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
2012-08-15 21:40:07 +02:00
return wpa_cli_cmd ( ctrl , " DISASSOCIATE " , 1 , argc , argv ) ;
2012-02-25 16:22:48 +01:00
}
2013-11-14 11:28:32 +01:00
2016-10-12 14:19:00 +02:00
static char * * wpa_cli_complete_disassociate ( const char * str , int pos )
{
int arg = get_cmd_arg_num ( str , pos ) ;
char * * res = NULL ;
switch ( arg ) {
case 1 :
res = cli_txt_list_array ( & stations ) ;
break ;
}
return res ;
}
2013-11-14 11:28:32 +01:00
static int wpa_cli_cmd_chanswitch ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
return wpa_cli_cmd ( ctrl , " CHAN_SWITCH " , 2 , argc , argv ) ;
}
2009-09-08 11:58:02 +02:00
# endif /* CONFIG_AP */
2010-02-27 17:46:02 +01:00
static int wpa_cli_cmd_suspend ( struct wpa_ctrl * ctrl , int argc , char * argv [ ] )
{
return wpa_ctrl_command ( ctrl , " SUSPEND " ) ;
}
static int wpa_cli_cmd_resume ( struct wpa_ctrl * ctrl , int argc , char * argv [ ] )
{
return wpa_ctrl_command ( ctrl , " RESUME " ) ;
}
2014-04-05 22:59:31 +02:00
# ifdef CONFIG_TESTING_OPTIONS
2010-03-30 00:42:04 +02:00
static int wpa_cli_cmd_drop_sa ( struct wpa_ctrl * ctrl , int argc , char * argv [ ] )
{
return wpa_ctrl_command ( ctrl , " DROP_SA " ) ;
}
2014-04-05 22:59:31 +02:00
# endif /* CONFIG_TESTING_OPTIONS */
2010-03-30 00:42:04 +02:00
2010-04-10 21:56:55 +02:00
static int wpa_cli_cmd_roam ( struct wpa_ctrl * ctrl , int argc , char * argv [ ] )
{
2012-08-15 21:40:07 +02:00
return wpa_cli_cmd ( ctrl , " ROAM " , 1 , argc , argv ) ;
2010-04-10 21:56:55 +02:00
}
2014-09-01 06:23:33 +02:00
# ifdef CONFIG_MESH
2014-11-15 02:35:23 +01:00
static int wpa_cli_cmd_mesh_interface_add ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
return wpa_cli_cmd ( ctrl , " MESH_INTERFACE_ADD " , 0 , argc , argv ) ;
}
2014-09-01 06:23:33 +02:00
static int wpa_cli_cmd_mesh_group_add ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
return wpa_cli_cmd ( ctrl , " MESH_GROUP_ADD " , 1 , argc , argv ) ;
}
static int wpa_cli_cmd_mesh_group_remove ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
return wpa_cli_cmd ( ctrl , " MESH_GROUP_REMOVE " , 1 , argc , argv ) ;
}
2016-03-09 10:16:10 +01:00
static int wpa_cli_cmd_mesh_peer_remove ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
return wpa_cli_cmd ( ctrl , " MESH_PEER_REMOVE " , 1 , argc , argv ) ;
}
2016-03-09 10:16:11 +01:00
static int wpa_cli_cmd_mesh_peer_add ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
return wpa_cli_cmd ( ctrl , " MESH_PEER_ADD " , 1 , argc , argv ) ;
}
2014-09-01 06:23:33 +02:00
# endif /* CONFIG_MESH */
2010-07-18 23:30:26 +02:00
# ifdef CONFIG_P2P
static int wpa_cli_cmd_p2p_find ( struct wpa_ctrl * ctrl , int argc , char * argv [ ] )
{
2012-08-15 21:40:07 +02:00
return wpa_cli_cmd ( ctrl , " P2P_FIND " , 0 , argc , argv ) ;
2010-07-18 23:30:26 +02:00
}
2012-08-28 16:38:53 +02:00
static char * * wpa_cli_complete_p2p_find ( const char * str , int pos )
{
char * * res = NULL ;
int arg = get_cmd_arg_num ( str , pos ) ;
res = os_calloc ( 6 , sizeof ( char * ) ) ;
if ( res = = NULL )
return NULL ;
res [ 0 ] = os_strdup ( " type=social " ) ;
if ( res [ 0 ] = = NULL ) {
os_free ( res ) ;
return NULL ;
}
res [ 1 ] = os_strdup ( " type=progressive " ) ;
if ( res [ 1 ] = = NULL )
return res ;
res [ 2 ] = os_strdup ( " delay= " ) ;
if ( res [ 2 ] = = NULL )
return res ;
res [ 3 ] = os_strdup ( " dev_id= " ) ;
if ( res [ 3 ] = = NULL )
return res ;
if ( arg = = 1 )
res [ 4 ] = os_strdup ( " [timeout] " ) ;
return res ;
}
2010-07-18 23:30:26 +02:00
static int wpa_cli_cmd_p2p_stop_find ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
return wpa_ctrl_command ( ctrl , " P2P_STOP_FIND " ) ;
}
2014-12-10 10:34:32 +01:00
static int wpa_cli_cmd_p2p_asp_provision ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
return wpa_cli_cmd ( ctrl , " P2P_ASP_PROVISION " , 3 , argc , argv ) ;
}
static int wpa_cli_cmd_p2p_asp_provision_resp ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
return wpa_cli_cmd ( ctrl , " P2P_ASP_PROVISION_RESP " , 2 , argc , argv ) ;
}
2010-07-18 23:30:26 +02:00
static int wpa_cli_cmd_p2p_connect ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
2012-08-15 21:40:07 +02:00
return wpa_cli_cmd ( ctrl , " P2P_CONNECT " , 2 , argc , argv ) ;
2010-07-18 23:30:26 +02:00
}
2011-10-28 22:37:34 +02:00
static char * * wpa_cli_complete_p2p_connect ( const char * str , int pos )
{
int arg = get_cmd_arg_num ( str , pos ) ;
char * * res = NULL ;
switch ( arg ) {
case 1 :
res = cli_txt_list_array ( & p2p_peers ) ;
break ;
}
return res ;
}
2010-07-18 23:30:26 +02:00
static int wpa_cli_cmd_p2p_listen ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
2012-08-15 21:40:07 +02:00
return wpa_cli_cmd ( ctrl , " P2P_LISTEN " , 0 , argc , argv ) ;
2010-07-18 23:30:26 +02:00
}
static int wpa_cli_cmd_p2p_group_remove ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
2012-08-15 21:40:07 +02:00
return wpa_cli_cmd ( ctrl , " P2P_GROUP_REMOVE " , 1 , argc , argv ) ;
2010-07-18 23:30:26 +02:00
}
2011-10-28 22:59:13 +02:00
static char * * wpa_cli_complete_p2p_group_remove ( const char * str , int pos )
{
int arg = get_cmd_arg_num ( str , pos ) ;
char * * res = NULL ;
switch ( arg ) {
case 1 :
res = cli_txt_list_array ( & p2p_groups ) ;
break ;
}
return res ;
}
2010-07-18 23:30:26 +02:00
static int wpa_cli_cmd_p2p_group_add ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
2012-08-15 21:40:07 +02:00
return wpa_cli_cmd ( ctrl , " P2P_GROUP_ADD " , 0 , argc , argv ) ;
2010-07-18 23:30:26 +02:00
}
2016-04-13 07:30:08 +02:00
static int wpa_cli_cmd_p2p_group_member ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
return wpa_cli_cmd ( ctrl , " P2P_GROUP_MEMBER " , 1 , argc , argv ) ;
}
2010-07-18 23:30:26 +02:00
static int wpa_cli_cmd_p2p_prov_disc ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
2011-12-06 20:28:02 +01:00
if ( argc ! = 2 & & argc ! = 3 ) {
printf ( " Invalid P2P_PROV_DISC command: needs at least "
" two arguments, address and config method \n "
" (display, keypad, or pbc) and an optional join \n " ) ;
2010-07-18 23:30:26 +02:00
return - 1 ;
}
2012-08-15 21:40:07 +02:00
return wpa_cli_cmd ( ctrl , " P2P_PROV_DISC " , 2 , argc , argv ) ;
2010-07-18 23:30:26 +02:00
}
static int wpa_cli_cmd_p2p_get_passphrase ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
return wpa_ctrl_command ( ctrl , " P2P_GET_PASSPHRASE " ) ;
}
static int wpa_cli_cmd_p2p_serv_disc_req ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
char cmd [ 4096 ] ;
2014-12-09 16:12:27 +01:00
if ( argc < 2 ) {
2010-07-18 23:30:26 +02:00
printf ( " Invalid P2P_SERV_DISC_REQ command: needs two "
2014-12-09 16:12:27 +01:00
" or more arguments (address and TLVs) \n " ) ;
2010-07-18 23:30:26 +02:00
return - 1 ;
}
2012-08-15 21:40:07 +02:00
if ( write_cmd ( cmd , sizeof ( cmd ) , " P2P_SERV_DISC_REQ " , argc , argv ) < 0 )
2010-07-18 23:30:26 +02:00
return - 1 ;
return wpa_ctrl_command ( ctrl , cmd ) ;
}
static int wpa_cli_cmd_p2p_serv_disc_cancel_req ( struct wpa_ctrl * ctrl ,
int argc , char * argv [ ] )
{
2012-08-15 21:40:07 +02:00
return wpa_cli_cmd ( ctrl , " P2P_SERV_DISC_CANCEL_REQ " , 1 , argc , argv ) ;
2010-07-18 23:30:26 +02:00
}
static int wpa_cli_cmd_p2p_serv_disc_resp ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
char cmd [ 4096 ] ;
int res ;
if ( argc ! = 4 ) {
printf ( " Invalid P2P_SERV_DISC_RESP command: needs four "
" arguments (freq, address, dialog token, and TLVs) \n " ) ;
return - 1 ;
}
res = os_snprintf ( cmd , sizeof ( cmd ) , " P2P_SERV_DISC_RESP %s %s %s %s " ,
argv [ 0 ] , argv [ 1 ] , argv [ 2 ] , argv [ 3 ] ) ;
Check os_snprintf() result more consistently - automatic 1
This converts os_snprintf() result validation cases to use
os_snprintf_error() where the exact rule used in os_snprintf_error() was
used. These changes were done automatically with spatch using the
following semantic patch:
@@
identifier E1;
expression E2,E3,E4,E5,E6;
statement S1;
@@
(
E1 = os_snprintf(E2, E3, ...);
|
int E1 = os_snprintf(E2, E3, ...);
|
if (E5)
E1 = os_snprintf(E2, E3, ...);
else
E1 = os_snprintf(E2, E3, ...);
|
if (E5)
E1 = os_snprintf(E2, E3, ...);
else if (E6)
E1 = os_snprintf(E2, E3, ...);
else
E1 = 0;
|
if (E5) {
...
E1 = os_snprintf(E2, E3, ...);
} else {
...
return -1;
}
|
if (E5) {
...
E1 = os_snprintf(E2, E3, ...);
} else if (E6) {
...
E1 = os_snprintf(E2, E3, ...);
} else {
...
return -1;
}
|
if (E5) {
...
E1 = os_snprintf(E2, E3, ...);
} else {
...
E1 = os_snprintf(E2, E3, ...);
}
)
? os_free(E4);
- if (E1 < 0 || \( E1 >= E3 \| (size_t) E1 >= E3 \| (unsigned int) E1 >= E3 \| E1 >= (int) E3 \))
+ if (os_snprintf_error(E3, E1))
(
S1
|
{ ... }
)
Signed-off-by: Jouni Malinen <j@w1.fi>
2014-12-08 10:15:51 +01:00
if ( os_snprintf_error ( sizeof ( cmd ) , res ) )
2010-07-18 23:30:26 +02:00
return - 1 ;
cmd [ sizeof ( cmd ) - 1 ] = ' \0 ' ;
return wpa_ctrl_command ( ctrl , cmd ) ;
}
static int wpa_cli_cmd_p2p_service_update ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
return wpa_ctrl_command ( ctrl , " P2P_SERVICE_UPDATE " ) ;
}
static int wpa_cli_cmd_p2p_serv_disc_external ( struct wpa_ctrl * ctrl ,
int argc , char * argv [ ] )
{
2012-08-15 21:40:07 +02:00
return wpa_cli_cmd ( ctrl , " P2P_SERV_DISC_EXTERNAL " , 1 , argc , argv ) ;
2010-07-18 23:30:26 +02:00
}
static int wpa_cli_cmd_p2p_service_flush ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
return wpa_ctrl_command ( ctrl , " P2P_SERVICE_FLUSH " ) ;
}
static int wpa_cli_cmd_p2p_service_add ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
2014-12-09 15:02:50 +01:00
if ( argc < 3 ) {
printf ( " Invalid P2P_SERVICE_ADD command: needs 3-6 arguments \n " ) ;
return - 1 ;
}
2010-07-18 23:30:26 +02:00
2014-12-09 15:02:50 +01:00
return wpa_cli_cmd ( ctrl , " P2P_SERVICE_ADD " , 3 , argc , argv ) ;
}
static int wpa_cli_cmd_p2p_service_rep ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
if ( argc < 5 | | argc > 6 ) {
printf ( " Invalid P2P_SERVICE_REP command: needs 5-6 "
2010-07-18 23:30:26 +02:00
" arguments \n " ) ;
return - 1 ;
}
2014-12-09 15:02:50 +01:00
return wpa_cli_cmd ( ctrl , " P2P_SERVICE_REP " , 5 , argc , argv ) ;
2010-07-18 23:30:26 +02:00
}
static int wpa_cli_cmd_p2p_service_del ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
char cmd [ 4096 ] ;
int res ;
if ( argc ! = 2 & & argc ! = 3 ) {
printf ( " Invalid P2P_SERVICE_DEL command: needs two or three "
" arguments \n " ) ;
return - 1 ;
}
if ( argc = = 3 )
res = os_snprintf ( cmd , sizeof ( cmd ) ,
" P2P_SERVICE_DEL %s %s %s " ,
argv [ 0 ] , argv [ 1 ] , argv [ 2 ] ) ;
else
res = os_snprintf ( cmd , sizeof ( cmd ) ,
" P2P_SERVICE_DEL %s %s " ,
argv [ 0 ] , argv [ 1 ] ) ;
Check os_snprintf() result more consistently - automatic 1
This converts os_snprintf() result validation cases to use
os_snprintf_error() where the exact rule used in os_snprintf_error() was
used. These changes were done automatically with spatch using the
following semantic patch:
@@
identifier E1;
expression E2,E3,E4,E5,E6;
statement S1;
@@
(
E1 = os_snprintf(E2, E3, ...);
|
int E1 = os_snprintf(E2, E3, ...);
|
if (E5)
E1 = os_snprintf(E2, E3, ...);
else
E1 = os_snprintf(E2, E3, ...);
|
if (E5)
E1 = os_snprintf(E2, E3, ...);
else if (E6)
E1 = os_snprintf(E2, E3, ...);
else
E1 = 0;
|
if (E5) {
...
E1 = os_snprintf(E2, E3, ...);
} else {
...
return -1;
}
|
if (E5) {
...
E1 = os_snprintf(E2, E3, ...);
} else if (E6) {
...
E1 = os_snprintf(E2, E3, ...);
} else {
...
return -1;
}
|
if (E5) {
...
E1 = os_snprintf(E2, E3, ...);
} else {
...
E1 = os_snprintf(E2, E3, ...);
}
)
? os_free(E4);
- if (E1 < 0 || \( E1 >= E3 \| (size_t) E1 >= E3 \| (unsigned int) E1 >= E3 \| E1 >= (int) E3 \))
+ if (os_snprintf_error(E3, E1))
(
S1
|
{ ... }
)
Signed-off-by: Jouni Malinen <j@w1.fi>
2014-12-08 10:15:51 +01:00
if ( os_snprintf_error ( sizeof ( cmd ) , res ) )
2010-07-18 23:30:26 +02:00
return - 1 ;
cmd [ sizeof ( cmd ) - 1 ] = ' \0 ' ;
return wpa_ctrl_command ( ctrl , cmd ) ;
}
static int wpa_cli_cmd_p2p_reject ( struct wpa_ctrl * ctrl ,
int argc , char * argv [ ] )
{
2012-08-15 21:40:07 +02:00
return wpa_cli_cmd ( ctrl , " P2P_REJECT " , 1 , argc , argv ) ;
2010-07-18 23:30:26 +02:00
}
static int wpa_cli_cmd_p2p_invite ( struct wpa_ctrl * ctrl ,
int argc , char * argv [ ] )
{
2012-08-15 21:40:07 +02:00
return wpa_cli_cmd ( ctrl , " P2P_INVITE " , 1 , argc , argv ) ;
2010-07-18 23:30:26 +02:00
}
static int wpa_cli_cmd_p2p_peer ( struct wpa_ctrl * ctrl , int argc , char * argv [ ] )
{
2012-08-15 21:40:07 +02:00
return wpa_cli_cmd ( ctrl , " P2P_PEER " , 1 , argc , argv ) ;
2010-07-18 23:30:26 +02:00
}
2011-10-28 22:37:34 +02:00
static char * * wpa_cli_complete_p2p_peer ( const char * str , int pos )
{
int arg = get_cmd_arg_num ( str , pos ) ;
char * * res = NULL ;
switch ( arg ) {
case 1 :
res = cli_txt_list_array ( & p2p_peers ) ;
break ;
}
return res ;
}
2016-10-16 11:21:25 +02:00
static int wpa_ctrl_command_p2p_peer ( struct wpa_ctrl * ctrl , const char * cmd ,
2010-07-18 23:30:26 +02:00
char * addr , size_t addr_len ,
int discovered )
{
char buf [ 4096 ] , * pos ;
size_t len ;
int ret ;
if ( ctrl_conn = = NULL )
return - 1 ;
len = sizeof ( buf ) - 1 ;
2012-03-31 20:13:53 +02:00
ret = wpa_ctrl_request ( ctrl , cmd , os_strlen ( cmd ) , buf , & len ,
2010-07-18 23:30:26 +02:00
wpa_cli_msg_cb ) ;
if ( ret = = - 2 ) {
printf ( " '%s' command timed out. \n " , cmd ) ;
return - 2 ;
} else if ( ret < 0 ) {
printf ( " '%s' command failed. \n " , cmd ) ;
return - 1 ;
}
buf [ len ] = ' \0 ' ;
2012-03-31 20:13:53 +02:00
if ( os_memcmp ( buf , " FAIL " , 4 ) = = 0 )
2010-07-18 23:30:26 +02:00
return - 1 ;
pos = buf ;
while ( * pos ! = ' \0 ' & & * pos ! = ' \n ' )
pos + + ;
* pos + + = ' \0 ' ;
os_strlcpy ( addr , buf , addr_len ) ;
if ( ! discovered | | os_strstr ( pos , " [PROBE_REQ_ONLY] " ) = = NULL )
printf ( " %s \n " , addr ) ;
return 0 ;
}
static int wpa_cli_cmd_p2p_peers ( struct wpa_ctrl * ctrl , int argc , char * argv [ ] )
{
char addr [ 32 ] , cmd [ 64 ] ;
int discovered ;
discovered = argc > 0 & & os_strcmp ( argv [ 0 ] , " discovered " ) = = 0 ;
if ( wpa_ctrl_command_p2p_peer ( ctrl , " P2P_PEER FIRST " ,
addr , sizeof ( addr ) , discovered ) )
2011-11-24 20:19:52 +01:00
return - 1 ;
2010-07-18 23:30:26 +02:00
do {
os_snprintf ( cmd , sizeof ( cmd ) , " P2P_PEER NEXT-%s " , addr ) ;
} while ( wpa_ctrl_command_p2p_peer ( ctrl , cmd , addr , sizeof ( addr ) ,
discovered ) = = 0 ) ;
2011-11-24 20:19:52 +01:00
return 0 ;
2010-07-18 23:30:26 +02:00
}
static int wpa_cli_cmd_p2p_set ( struct wpa_ctrl * ctrl , int argc , char * argv [ ] )
{
2012-08-15 21:40:07 +02:00
return wpa_cli_cmd ( ctrl , " P2P_SET " , 2 , argc , argv ) ;
2010-07-18 23:30:26 +02:00
}
2013-08-31 19:58:35 +02:00
static char * * wpa_cli_complete_p2p_set ( const char * str , int pos )
{
int arg = get_cmd_arg_num ( str , pos ) ;
const char * fields [ ] = {
" discoverability " ,
" managed " ,
" listen_channel " ,
" ssid_postfix " ,
" noa " ,
" ps " ,
" oppps " ,
" ctwindow " ,
" disabled " ,
" conc_pref " ,
" force_long_sd " ,
" peer_filter " ,
" cross_connect " ,
" go_apsd " ,
" client_apsd " ,
" disallow_freq " ,
" disc_int " ,
2013-09-01 09:08:30 +02:00
" per_sta_psk " ,
2013-08-31 19:58:35 +02:00
} ;
2013-10-26 16:00:57 +02:00
int i , num_fields = ARRAY_SIZE ( fields ) ;
2013-08-31 19:58:35 +02:00
if ( arg = = 1 ) {
char * * res = os_calloc ( num_fields + 1 , sizeof ( char * ) ) ;
if ( res = = NULL )
return NULL ;
for ( i = 0 ; i < num_fields ; i + + ) {
res [ i ] = os_strdup ( fields [ i ] ) ;
if ( res [ i ] = = NULL )
return res ;
}
return res ;
}
if ( arg = = 2 & & os_strncasecmp ( str , " p2p_set peer_filter " , 20 ) = = 0 )
return cli_txt_list_array ( & p2p_peers ) ;
return NULL ;
}
2010-07-18 23:30:26 +02:00
static int wpa_cli_cmd_p2p_flush ( struct wpa_ctrl * ctrl , int argc , char * argv [ ] )
{
return wpa_ctrl_command ( ctrl , " P2P_FLUSH " ) ;
}
2010-10-19 14:53:28 +02:00
static int wpa_cli_cmd_p2p_cancel ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
return wpa_ctrl_command ( ctrl , " P2P_CANCEL " ) ;
}
2010-11-25 12:09:50 +01:00
static int wpa_cli_cmd_p2p_unauthorize ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
2012-08-15 21:40:07 +02:00
return wpa_cli_cmd ( ctrl , " P2P_UNAUTHORIZE " , 1 , argc , argv ) ;
2010-11-25 12:09:50 +01:00
}
2010-07-18 23:30:26 +02:00
static int wpa_cli_cmd_p2p_presence_req ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
if ( argc ! = 0 & & argc ! = 2 & & argc ! = 4 ) {
printf ( " Invalid P2P_PRESENCE_REQ command: needs two arguments "
" (preferred duration, interval; in microsecods). \n "
" Optional second pair can be used to provide "
" acceptable values. \n " ) ;
return - 1 ;
}
2012-08-15 21:40:07 +02:00
return wpa_cli_cmd ( ctrl , " P2P_PRESENCE_REQ " , 0 , argc , argv ) ;
2010-07-18 23:30:26 +02:00
}
static int wpa_cli_cmd_p2p_ext_listen ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
if ( argc ! = 0 & & argc ! = 2 ) {
printf ( " Invalid P2P_EXT_LISTEN command: needs two arguments "
" (availability period, availability interval; in "
" millisecods). \n "
" Extended Listen Timing can be cancelled with this "
" command when used without parameters. \n " ) ;
return - 1 ;
}
2012-08-15 21:40:07 +02:00
return wpa_cli_cmd ( ctrl , " P2P_EXT_LISTEN " , 0 , argc , argv ) ;
2010-07-18 23:30:26 +02:00
}
2013-09-01 16:37:22 +02:00
static int wpa_cli_cmd_p2p_remove_client ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
return wpa_cli_cmd ( ctrl , " P2P_REMOVE_CLIENT " , 1 , argc , argv ) ;
}
2015-10-29 08:05:48 +01:00
static int wpa_cli_cmd_vendor_elem_add ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
return wpa_cli_cmd ( ctrl , " VENDOR_ELEM_ADD " , 2 , argc , argv ) ;
}
static int wpa_cli_cmd_vendor_elem_get ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
return wpa_cli_cmd ( ctrl , " VENDOR_ELEM_GET " , 1 , argc , argv ) ;
}
static int wpa_cli_cmd_vendor_elem_remove ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
return wpa_cli_cmd ( ctrl , " VENDOR_ELEM_REMOVE " , 2 , argc , argv ) ;
}
2010-07-18 23:30:26 +02:00
# endif /* CONFIG_P2P */
2012-03-02 16:26:01 +01:00
# ifdef CONFIG_WIFI_DISPLAY
static int wpa_cli_cmd_wfd_subelem_set ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
char cmd [ 100 ] ;
int res ;
if ( argc ! = 1 & & argc ! = 2 ) {
printf ( " Invalid WFD_SUBELEM_SET command: needs one or two "
" arguments (subelem, hexdump) \n " ) ;
return - 1 ;
}
res = os_snprintf ( cmd , sizeof ( cmd ) , " WFD_SUBELEM_SET %s %s " ,
argv [ 0 ] , argc > 1 ? argv [ 1 ] : " " ) ;
Check os_snprintf() result more consistently - automatic 1
This converts os_snprintf() result validation cases to use
os_snprintf_error() where the exact rule used in os_snprintf_error() was
used. These changes were done automatically with spatch using the
following semantic patch:
@@
identifier E1;
expression E2,E3,E4,E5,E6;
statement S1;
@@
(
E1 = os_snprintf(E2, E3, ...);
|
int E1 = os_snprintf(E2, E3, ...);
|
if (E5)
E1 = os_snprintf(E2, E3, ...);
else
E1 = os_snprintf(E2, E3, ...);
|
if (E5)
E1 = os_snprintf(E2, E3, ...);
else if (E6)
E1 = os_snprintf(E2, E3, ...);
else
E1 = 0;
|
if (E5) {
...
E1 = os_snprintf(E2, E3, ...);
} else {
...
return -1;
}
|
if (E5) {
...
E1 = os_snprintf(E2, E3, ...);
} else if (E6) {
...
E1 = os_snprintf(E2, E3, ...);
} else {
...
return -1;
}
|
if (E5) {
...
E1 = os_snprintf(E2, E3, ...);
} else {
...
E1 = os_snprintf(E2, E3, ...);
}
)
? os_free(E4);
- if (E1 < 0 || \( E1 >= E3 \| (size_t) E1 >= E3 \| (unsigned int) E1 >= E3 \| E1 >= (int) E3 \))
+ if (os_snprintf_error(E3, E1))
(
S1
|
{ ... }
)
Signed-off-by: Jouni Malinen <j@w1.fi>
2014-12-08 10:15:51 +01:00
if ( os_snprintf_error ( sizeof ( cmd ) , res ) )
2012-03-02 16:26:01 +01:00
return - 1 ;
cmd [ sizeof ( cmd ) - 1 ] = ' \0 ' ;
return wpa_ctrl_command ( ctrl , cmd ) ;
}
static int wpa_cli_cmd_wfd_subelem_get ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
char cmd [ 100 ] ;
int res ;
if ( argc ! = 1 ) {
printf ( " Invalid WFD_SUBELEM_GET command: needs one "
" argument (subelem) \n " ) ;
return - 1 ;
}
res = os_snprintf ( cmd , sizeof ( cmd ) , " WFD_SUBELEM_GET %s " ,
argv [ 0 ] ) ;
Check os_snprintf() result more consistently - automatic 1
This converts os_snprintf() result validation cases to use
os_snprintf_error() where the exact rule used in os_snprintf_error() was
used. These changes were done automatically with spatch using the
following semantic patch:
@@
identifier E1;
expression E2,E3,E4,E5,E6;
statement S1;
@@
(
E1 = os_snprintf(E2, E3, ...);
|
int E1 = os_snprintf(E2, E3, ...);
|
if (E5)
E1 = os_snprintf(E2, E3, ...);
else
E1 = os_snprintf(E2, E3, ...);
|
if (E5)
E1 = os_snprintf(E2, E3, ...);
else if (E6)
E1 = os_snprintf(E2, E3, ...);
else
E1 = 0;
|
if (E5) {
...
E1 = os_snprintf(E2, E3, ...);
} else {
...
return -1;
}
|
if (E5) {
...
E1 = os_snprintf(E2, E3, ...);
} else if (E6) {
...
E1 = os_snprintf(E2, E3, ...);
} else {
...
return -1;
}
|
if (E5) {
...
E1 = os_snprintf(E2, E3, ...);
} else {
...
E1 = os_snprintf(E2, E3, ...);
}
)
? os_free(E4);
- if (E1 < 0 || \( E1 >= E3 \| (size_t) E1 >= E3 \| (unsigned int) E1 >= E3 \| E1 >= (int) E3 \))
+ if (os_snprintf_error(E3, E1))
(
S1
|
{ ... }
)
Signed-off-by: Jouni Malinen <j@w1.fi>
2014-12-08 10:15:51 +01:00
if ( os_snprintf_error ( sizeof ( cmd ) , res ) )
2012-03-02 16:26:01 +01:00
return - 1 ;
cmd [ sizeof ( cmd ) - 1 ] = ' \0 ' ;
return wpa_ctrl_command ( ctrl , cmd ) ;
}
# endif /* CONFIG_WIFI_DISPLAY */
2010-07-18 23:30:26 +02:00
2011-10-16 21:44:28 +02:00
# ifdef CONFIG_INTERWORKING
static int wpa_cli_cmd_fetch_anqp ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
return wpa_ctrl_command ( ctrl , " FETCH_ANQP " ) ;
}
static int wpa_cli_cmd_stop_fetch_anqp ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
return wpa_ctrl_command ( ctrl , " STOP_FETCH_ANQP " ) ;
}
2011-10-04 21:13:22 +02:00
static int wpa_cli_cmd_interworking_select ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
2012-08-15 21:40:07 +02:00
return wpa_cli_cmd ( ctrl , " INTERWORKING_SELECT " , 0 , argc , argv ) ;
2011-10-04 21:13:22 +02:00
}
static int wpa_cli_cmd_interworking_connect ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
2012-08-15 21:40:07 +02:00
return wpa_cli_cmd ( ctrl , " INTERWORKING_CONNECT " , 1 , argc , argv ) ;
2011-10-04 21:13:22 +02:00
}
2015-02-08 15:56:04 +01:00
static int wpa_cli_cmd_interworking_add_network ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
return wpa_cli_cmd ( ctrl , " INTERWORKING_ADD_NETWORK " , 1 , argc , argv ) ;
}
2011-10-16 21:44:28 +02:00
static int wpa_cli_cmd_anqp_get ( struct wpa_ctrl * ctrl , int argc , char * argv [ ] )
{
2012-08-15 21:40:07 +02:00
return wpa_cli_cmd ( ctrl , " ANQP_GET " , 2 , argc , argv ) ;
2011-10-16 21:44:28 +02:00
}
2012-08-27 17:13:10 +02:00
static int wpa_cli_cmd_gas_request ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
return wpa_cli_cmd ( ctrl , " GAS_REQUEST " , 2 , argc , argv ) ;
}
static int wpa_cli_cmd_gas_response_get ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
return wpa_cli_cmd ( ctrl , " GAS_RESPONSE_GET " , 2 , argc , argv ) ;
}
2011-10-16 21:44:28 +02:00
# endif /* CONFIG_INTERWORKING */
2011-09-08 19:52:23 +02:00
# ifdef CONFIG_HS20
static int wpa_cli_cmd_hs20_anqp_get ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
2012-08-15 21:40:07 +02:00
return wpa_cli_cmd ( ctrl , " HS20_ANQP_GET " , 2 , argc , argv ) ;
2011-09-08 19:52:23 +02:00
}
static int wpa_cli_cmd_get_nai_home_realm_list ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
char cmd [ 512 ] ;
if ( argc = = 0 ) {
printf ( " Command needs one or two arguments (dst mac addr and "
" optional home realm) \n " ) ;
return - 1 ;
}
2012-08-15 21:40:07 +02:00
if ( write_cmd ( cmd , sizeof ( cmd ) , " HS20_GET_NAI_HOME_REALM_LIST " ,
argc , argv ) < 0 )
2011-09-08 19:52:23 +02:00
return - 1 ;
return wpa_ctrl_command ( ctrl , cmd ) ;
}
2012-12-20 20:15:05 +01:00
static int wpa_cli_cmd_hs20_icon_request ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
char cmd [ 512 ] ;
if ( argc < 2 ) {
printf ( " Command needs two arguments (dst mac addr and "
" icon name) \n " ) ;
return - 1 ;
}
if ( write_cmd ( cmd , sizeof ( cmd ) , " HS20_ICON_REQUEST " , argc , argv ) < 0 )
return - 1 ;
return wpa_ctrl_command ( ctrl , cmd ) ;
}
2013-01-25 23:10:41 +01:00
static int wpa_cli_cmd_fetch_osu ( struct wpa_ctrl * ctrl , int argc , char * argv [ ] )
{
return wpa_ctrl_command ( ctrl , " FETCH_OSU " ) ;
}
static int wpa_cli_cmd_cancel_fetch_osu ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
return wpa_ctrl_command ( ctrl , " CANCEL_FETCH_OSU " ) ;
}
2011-09-08 19:52:23 +02:00
# endif /* CONFIG_HS20 */
2010-09-06 16:28:45 +02:00
static int wpa_cli_cmd_sta_autoconnect ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
2012-08-15 21:40:07 +02:00
return wpa_cli_cmd ( ctrl , " STA_AUTOCONNECT " , 1 , argc , argv ) ;
2010-09-06 16:28:45 +02:00
}
2010-10-07 09:26:56 +02:00
static int wpa_cli_cmd_tdls_discover ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
2012-08-15 21:40:07 +02:00
return wpa_cli_cmd ( ctrl , " TDLS_DISCOVER " , 1 , argc , argv ) ;
2010-10-07 09:26:56 +02:00
}
static int wpa_cli_cmd_tdls_setup ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
2012-08-15 21:40:07 +02:00
return wpa_cli_cmd ( ctrl , " TDLS_SETUP " , 1 , argc , argv ) ;
2010-10-07 09:26:56 +02:00
}
static int wpa_cli_cmd_tdls_teardown ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
2012-08-15 21:40:07 +02:00
return wpa_cli_cmd ( ctrl , " TDLS_TEARDOWN " , 1 , argc , argv ) ;
2010-10-07 09:26:56 +02:00
}
2015-04-28 13:00:50 +02:00
static int wpa_cli_cmd_tdls_link_status ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
return wpa_cli_cmd ( ctrl , " TDLS_LINK_STATUS " , 1 , argc , argv ) ;
}
2014-10-22 14:04:00 +02:00
static int wpa_cli_cmd_wmm_ac_addts ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
return wpa_cli_cmd ( ctrl , " WMM_AC_ADDTS " , 3 , argc , argv ) ;
}
static int wpa_cli_cmd_wmm_ac_delts ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
return wpa_cli_cmd ( ctrl , " WMM_AC_DELTS " , 1 , argc , argv ) ;
}
2014-10-22 14:04:02 +02:00
static int wpa_cli_cmd_wmm_ac_status ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
return wpa_ctrl_command ( ctrl , " WMM_AC_STATUS " ) ;
}
2014-12-29 04:35:21 +01:00
static int wpa_cli_cmd_tdls_chan_switch ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
return wpa_cli_cmd ( ctrl , " TDLS_CHAN_SWITCH " , 2 , argc , argv ) ;
}
static int wpa_cli_cmd_tdls_cancel_chan_switch ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
return wpa_cli_cmd ( ctrl , " TDLS_CANCEL_CHAN_SWITCH " , 1 , argc , argv ) ;
}
2011-04-15 17:52:01 +02:00
static int wpa_cli_cmd_signal_poll ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
return wpa_ctrl_command ( ctrl , " SIGNAL_POLL " ) ;
}
2015-12-16 23:18:18 +01:00
static int wpa_cli_cmd_signal_monitor ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
return wpa_cli_cmd ( ctrl , " SIGNAL_MONITOR " , 0 , argc , argv ) ;
}
2012-09-05 16:02:02 +02:00
static int wpa_cli_cmd_pktcnt_poll ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
return wpa_ctrl_command ( ctrl , " PKTCNT_POLL " ) ;
}
2011-11-13 18:47:51 +01:00
static int wpa_cli_cmd_reauthenticate ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
return wpa_ctrl_command ( ctrl , " REAUTHENTICATE " ) ;
}
2012-06-26 18:11:17 +02:00
# ifdef CONFIG_AUTOSCAN
static int wpa_cli_cmd_autoscan ( struct wpa_ctrl * ctrl , int argc , char * argv [ ] )
{
if ( argc = = 0 )
return wpa_ctrl_command ( ctrl , " AUTOSCAN " ) ;
2012-08-15 21:40:07 +02:00
return wpa_cli_cmd ( ctrl , " AUTOSCAN " , 0 , argc , argv ) ;
2012-06-26 18:11:17 +02:00
}
# endif /* CONFIG_AUTOSCAN */
2012-12-16 11:29:10 +01:00
# ifdef CONFIG_WNM
static int wpa_cli_cmd_wnm_sleep ( struct wpa_ctrl * ctrl , int argc , char * argv [ ] )
{
return wpa_cli_cmd ( ctrl , " WNM_SLEEP " , 0 , argc , argv ) ;
}
2013-05-16 16:50:31 +02:00
static int wpa_cli_cmd_wnm_bss_query ( struct wpa_ctrl * ctrl , int argc , char * argv [ ] )
{
return wpa_cli_cmd ( ctrl , " WNM_BSS_QUERY " , 1 , argc , argv ) ;
}
2012-12-16 11:29:10 +01:00
# endif /* CONFIG_WNM */
2012-08-25 12:33:29 +02:00
static int wpa_cli_cmd_raw ( struct wpa_ctrl * ctrl , int argc , char * argv [ ] )
{
if ( argc = = 0 )
return - 1 ;
return wpa_cli_cmd ( ctrl , argv [ 0 ] , 0 , argc - 1 , & argv [ 1 ] ) ;
}
2013-11-07 15:16:15 +01:00
# ifdef ANDROID
static int wpa_cli_cmd_driver ( struct wpa_ctrl * ctrl , int argc , char * argv [ ] )
{
return wpa_cli_cmd ( ctrl , " DRIVER " , 1 , argc , argv ) ;
}
# endif /* ANDROID */
2014-03-03 12:09:50 +01:00
static int wpa_cli_cmd_vendor ( struct wpa_ctrl * ctrl , int argc , char * argv [ ] )
{
return wpa_cli_cmd ( ctrl , " VENDOR " , 1 , argc , argv ) ;
}
2013-03-31 19:31:07 +02:00
static int wpa_cli_cmd_flush ( struct wpa_ctrl * ctrl , int argc , char * argv [ ] )
{
return wpa_ctrl_command ( ctrl , " FLUSH " ) ;
}
2014-01-04 12:10:41 +01:00
static int wpa_cli_cmd_radio_work ( struct wpa_ctrl * ctrl , int argc , char * argv [ ] )
{
return wpa_cli_cmd ( ctrl , " RADIO_WORK " , 1 , argc , argv ) ;
}
2014-11-05 09:42:52 +01:00
static int wpa_cli_cmd_neighbor_rep_request ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
return wpa_cli_cmd ( ctrl , " NEIGHBOR_REP_REQUEST " , 0 , argc , argv ) ;
}
2014-12-01 00:11:29 +01:00
static int wpa_cli_cmd_erp_flush ( struct wpa_ctrl * ctrl , int argc , char * argv [ ] )
{
return wpa_ctrl_command ( ctrl , " ERP_FLUSH " ) ;
}
2014-12-29 07:41:08 +01:00
static int wpa_cli_cmd_mac_rand_scan ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
return wpa_cli_cmd ( ctrl , " MAC_RAND_SCAN " , 1 , argc , argv ) ;
}
2015-07-24 01:32:58 +02:00
static int wpa_cli_cmd_get_pref_freq_list ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
return wpa_cli_cmd ( ctrl , " GET_PREF_FREQ_LIST " , 1 , argc , argv ) ;
}
2016-06-24 20:36:18 +02:00
static int wpa_cli_cmd_p2p_lo_start ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
return wpa_cli_cmd ( ctrl , " P2P_LO_START " , 4 , argc , argv ) ;
}
static int wpa_cli_cmd_p2p_lo_stop ( struct wpa_ctrl * ctrl , int argc ,
char * argv [ ] )
{
return wpa_cli_cmd ( ctrl , " P2P_LO_STOP " , 0 , argc , argv ) ;
}
2009-01-05 20:05:05 +01:00
enum wpa_cli_cmd_flags {
cli_cmd_flag_none = 0x00 ,
cli_cmd_flag_sensitive = 0x01
} ;
2008-02-28 02:34:43 +01:00
struct wpa_cli_cmd {
const char * cmd ;
int ( * handler ) ( struct wpa_ctrl * ctrl , int argc , char * argv [ ] ) ;
2012-08-26 20:20:15 +02:00
char * * ( * completion ) ( const char * str , int pos ) ;
2009-01-05 20:05:05 +01:00
enum wpa_cli_cmd_flags flags ;
2009-01-05 20:32:48 +01:00
const char * usage ;
2008-02-28 02:34:43 +01:00
} ;
2015-04-24 09:19:53 +02:00
static const struct wpa_cli_cmd wpa_cli_commands [ ] = {
2012-08-26 20:20:15 +02:00
{ " status " , wpa_cli_cmd_status , NULL ,
2009-01-05 20:32:48 +01:00
cli_cmd_flag_none ,
" [verbose] = get current WPA/EAPOL/EAP status " } ,
2012-08-26 20:20:15 +02:00
{ " ifname " , wpa_cli_cmd_ifname , NULL ,
2012-08-05 19:12:16 +02:00
cli_cmd_flag_none ,
" = get current interface name " } ,
2012-08-26 20:20:15 +02:00
{ " ping " , wpa_cli_cmd_ping , NULL ,
2009-01-05 20:32:48 +01:00
cli_cmd_flag_none ,
" = pings wpa_supplicant " } ,
2012-08-26 20:20:15 +02:00
{ " relog " , wpa_cli_cmd_relog , NULL ,
2011-02-06 19:15:19 +01:00
cli_cmd_flag_none ,
" = re-open log-file (allow rolling logs) " } ,
2012-08-26 20:20:15 +02:00
{ " note " , wpa_cli_cmd_note , NULL ,
2010-08-04 18:11:32 +02:00
cli_cmd_flag_none ,
" <text> = add a note to wpa_supplicant debug log " } ,
2012-08-26 20:20:15 +02:00
{ " mib " , wpa_cli_cmd_mib , NULL ,
2009-01-05 20:32:48 +01:00
cli_cmd_flag_none ,
" = get MIB variables (dot1x, dot11) " } ,
2012-08-26 20:30:06 +02:00
{ " help " , wpa_cli_cmd_help , wpa_cli_complete_help ,
2009-01-05 20:32:48 +01:00
cli_cmd_flag_none ,
2012-08-26 20:30:06 +02:00
" [command] = show usage help " } ,
2012-08-26 20:20:15 +02:00
{ " interface " , wpa_cli_cmd_interface , NULL ,
2009-01-05 20:32:48 +01:00
cli_cmd_flag_none ,
" [ifname] = show interfaces/select interface " } ,
2012-08-26 20:20:15 +02:00
{ " level " , wpa_cli_cmd_level , NULL ,
2009-01-05 20:32:48 +01:00
cli_cmd_flag_none ,
" <debug level> = change debug level " } ,
2012-08-26 20:20:15 +02:00
{ " license " , wpa_cli_cmd_license , NULL ,
2009-01-05 20:32:48 +01:00
cli_cmd_flag_none ,
" = show full wpa_cli license " } ,
2012-08-26 20:20:15 +02:00
{ " quit " , wpa_cli_cmd_quit , NULL ,
2009-01-05 20:32:48 +01:00
cli_cmd_flag_none ,
" = exit wpa_cli " } ,
2013-05-05 11:12:31 +02:00
{ " set " , wpa_cli_cmd_set , wpa_cli_complete_set ,
2009-01-05 20:32:48 +01:00
cli_cmd_flag_none ,
" = set variables (shows list of variables when run without "
" arguments) " } ,
2015-01-28 00:22:06 +01:00
{ " dump " , wpa_cli_cmd_dump , NULL ,
cli_cmd_flag_none ,
" = dump config variables " } ,
2015-03-15 00:37:07 +01:00
{ " get " , wpa_cli_cmd_get , wpa_cli_complete_get ,
2010-10-31 16:07:31 +01:00
cli_cmd_flag_none ,
" <name> = get information " } ,
2016-07-04 11:25:39 +02:00
{ " driver_flags " , wpa_cli_cmd_driver_flags , NULL ,
cli_cmd_flag_none ,
" = list driver flags " } ,
2012-08-26 20:20:15 +02:00
{ " logon " , wpa_cli_cmd_logon , NULL ,
2009-01-05 20:32:48 +01:00
cli_cmd_flag_none ,
" = IEEE 802.1X EAPOL state machine logon " } ,
2012-08-26 20:20:15 +02:00
{ " logoff " , wpa_cli_cmd_logoff , NULL ,
2009-01-05 20:32:48 +01:00
cli_cmd_flag_none ,
" = IEEE 802.1X EAPOL state machine logoff " } ,
2012-08-26 20:20:15 +02:00
{ " pmksa " , wpa_cli_cmd_pmksa , NULL ,
2009-01-05 20:32:48 +01:00
cli_cmd_flag_none ,
" = show PMKSA cache " } ,
2014-09-26 19:20:21 +02:00
{ " pmksa_flush " , wpa_cli_cmd_pmksa_flush , NULL ,
cli_cmd_flag_none ,
" = flush PMKSA cache entries " } ,
2016-12-27 04:49:07 +01:00
# ifdef CONFIG_PMKSA_CACHE_EXTERNAL
{ " pmksa_get " , wpa_cli_cmd_pmksa_get , NULL ,
cli_cmd_flag_none ,
" <network_id> = fetch all stored PMKSA cache entries " } ,
{ " pmksa_add " , wpa_cli_cmd_pmksa_add , NULL ,
cli_cmd_flag_sensitive ,
" <network_id> <BSSID> <PMKID> <PMK> <reauth_time in seconds> <expiration in seconds> <akmp> <opportunistic> = store PMKSA cache entry from external storage " } ,
2017-01-02 11:32:07 +01:00
# ifdef CONFIG_MESH
{ " mesh_pmksa_get " , wpa_cli_mesh_cmd_pmksa_get , NULL ,
cli_cmd_flag_none ,
" <peer MAC address | any> = fetch all stored mesh PMKSA cache entries " } ,
{ " mesh_pmksa_add " , wpa_cli_mesh_cmd_pmksa_add , NULL ,
cli_cmd_flag_sensitive ,
" <BSSID> <PMKID> <PMK> <expiration in seconds> = store mesh PMKSA cache entry from external storage " } ,
# endif /* CONFIG_MESH */
2016-12-27 04:49:07 +01:00
# endif /* CONFIG_PMKSA_CACHE_EXTERNAL */
2012-08-26 20:20:15 +02:00
{ " reassociate " , wpa_cli_cmd_reassociate , NULL ,
2009-01-05 20:32:48 +01:00
cli_cmd_flag_none ,
" = force reassociation " } ,
2014-03-06 19:06:04 +01:00
{ " reattach " , wpa_cli_cmd_reattach , NULL ,
cli_cmd_flag_none ,
" = force reassociation back to the same BSS " } ,
2012-08-26 20:20:15 +02:00
{ " preauthenticate " , wpa_cli_cmd_preauthenticate , wpa_cli_complete_bss ,
2009-01-05 20:32:48 +01:00
cli_cmd_flag_none ,
" <BSSID> = force preauthentication " } ,
2016-10-12 14:19:01 +02:00
{ " identity " , wpa_cli_cmd_identity , wpa_cli_complete_network_id ,
2009-01-05 20:32:48 +01:00
cli_cmd_flag_none ,
" <network id> <identity> = configure identity for an SSID " } ,
2016-10-12 14:19:01 +02:00
{ " password " , wpa_cli_cmd_password , wpa_cli_complete_network_id ,
2009-01-05 20:32:48 +01:00
cli_cmd_flag_sensitive ,
" <network id> <password> = configure password for an SSID " } ,
2016-10-12 14:19:01 +02:00
{ " new_password " , wpa_cli_cmd_new_password ,
wpa_cli_complete_network_id , cli_cmd_flag_sensitive ,
2009-01-05 20:32:48 +01:00
" <network id> <password> = change password for an SSID " } ,
2016-10-12 14:19:01 +02:00
{ " pin " , wpa_cli_cmd_pin , wpa_cli_complete_network_id ,
2009-01-05 20:32:48 +01:00
cli_cmd_flag_sensitive ,
" <network id> <pin> = configure pin for an SSID " } ,
2016-10-12 14:19:01 +02:00
{ " otp " , wpa_cli_cmd_otp , wpa_cli_complete_network_id ,
2009-01-05 20:32:48 +01:00
cli_cmd_flag_sensitive ,
" <network id> <password> = configure one-time-password for an SSID "
} ,
2016-10-12 14:19:01 +02:00
{ " passphrase " , wpa_cli_cmd_passphrase , wpa_cli_complete_network_id ,
2009-01-05 20:32:48 +01:00
cli_cmd_flag_sensitive ,
" <network id> <passphrase> = configure private key passphrase \n "
" for an SSID " } ,
2016-10-12 14:19:01 +02:00
{ " sim " , wpa_cli_cmd_sim , wpa_cli_complete_network_id ,
2013-10-19 16:32:05 +02:00
cli_cmd_flag_sensitive ,
" <network id> <pin> = report SIM operation result " } ,
2016-10-12 14:19:01 +02:00
{ " bssid " , wpa_cli_cmd_bssid , wpa_cli_complete_network_id ,
2009-01-05 20:32:48 +01:00
cli_cmd_flag_none ,
" <network id> <BSSID> = set preferred BSSID for an SSID " } ,
2012-08-26 20:20:15 +02:00
{ " blacklist " , wpa_cli_cmd_blacklist , wpa_cli_complete_bss ,
2011-10-18 19:11:52 +02:00
cli_cmd_flag_none ,
" <BSSID> = add a BSSID to the blacklist \n "
" blacklist clear = clear the blacklist \n "
" blacklist = display the blacklist " } ,
2012-08-26 20:20:15 +02:00
{ " log_level " , wpa_cli_cmd_log_level , NULL ,
2011-10-18 19:16:38 +02:00
cli_cmd_flag_none ,
" <level> [<timestamp>] = update the log level/timestamp \n "
" log_level = display the current log level and log options " } ,
2012-08-26 20:20:15 +02:00
{ " list_networks " , wpa_cli_cmd_list_networks , NULL ,
2009-01-05 20:32:48 +01:00
cli_cmd_flag_none ,
" = list configured networks " } ,
2015-03-24 17:10:39 +01:00
{ " select_network " , wpa_cli_cmd_select_network ,
wpa_cli_complete_network_id ,
2009-01-05 20:32:48 +01:00
cli_cmd_flag_none ,
" <network id> = select a network (disable others) " } ,
2015-03-24 17:10:39 +01:00
{ " enable_network " , wpa_cli_cmd_enable_network ,
wpa_cli_complete_network_id ,
2009-01-05 20:32:48 +01:00
cli_cmd_flag_none ,
" <network id> = enable a network " } ,
2015-03-24 17:10:39 +01:00
{ " disable_network " , wpa_cli_cmd_disable_network ,
wpa_cli_complete_network_id ,
2009-01-05 20:32:48 +01:00
cli_cmd_flag_none ,
" <network id> = disable a network " } ,
2012-08-26 20:20:15 +02:00
{ " add_network " , wpa_cli_cmd_add_network , NULL ,
2009-01-05 20:32:48 +01:00
cli_cmd_flag_none ,
" = add a network " } ,
2015-03-24 17:10:39 +01:00
{ " remove_network " , wpa_cli_cmd_remove_network ,
wpa_cli_complete_network_id ,
2009-01-05 20:32:48 +01:00
cli_cmd_flag_none ,
" <network id> = remove a network " } ,
2015-03-24 17:10:38 +01:00
{ " set_network " , wpa_cli_cmd_set_network , wpa_cli_complete_network ,
2009-01-05 20:32:48 +01:00
cli_cmd_flag_sensitive ,
" <network id> <variable> <value> = set network variables (shows \n "
" list of variables when run without arguments) " } ,
2015-03-24 17:10:38 +01:00
{ " get_network " , wpa_cli_cmd_get_network , wpa_cli_complete_network ,
2009-01-05 20:32:48 +01:00
cli_cmd_flag_none ,
" <network id> <variable> = get network variables " } ,
2015-03-24 17:10:40 +01:00
{ " dup_network " , wpa_cli_cmd_dup_network , wpa_cli_complete_dup_network ,
2014-04-29 22:41:47 +02:00
cli_cmd_flag_none ,
" <src network id> <dst network id> <variable> = duplicate network variables "
} ,
2012-08-26 20:20:15 +02:00
{ " list_creds " , wpa_cli_cmd_list_creds , NULL ,
2012-02-16 15:36:00 +01:00
cli_cmd_flag_none ,
" = list configured credentials " } ,
2012-08-26 20:20:15 +02:00
{ " add_cred " , wpa_cli_cmd_add_cred , NULL ,
2012-02-16 15:36:00 +01:00
cli_cmd_flag_none ,
" = add a credential " } ,
2012-08-26 20:20:15 +02:00
{ " remove_cred " , wpa_cli_cmd_remove_cred , NULL ,
2012-02-16 15:36:00 +01:00
cli_cmd_flag_none ,
" <cred id> = remove a credential " } ,
2012-08-26 20:20:15 +02:00
{ " set_cred " , wpa_cli_cmd_set_cred , NULL ,
2012-02-16 15:36:00 +01:00
cli_cmd_flag_sensitive ,
" <cred id> <variable> <value> = set credential variables " } ,
2014-04-04 19:10:49 +02:00
{ " get_cred " , wpa_cli_cmd_get_cred , NULL ,
cli_cmd_flag_none ,
" <cred id> <variable> = get credential variables " } ,
2012-08-26 20:20:15 +02:00
{ " save_config " , wpa_cli_cmd_save_config , NULL ,
2009-01-05 20:32:48 +01:00
cli_cmd_flag_none ,
" = save the current configuration " } ,
2012-08-26 20:20:15 +02:00
{ " disconnect " , wpa_cli_cmd_disconnect , NULL ,
2009-01-05 20:32:48 +01:00
cli_cmd_flag_none ,
" = disconnect and wait for reassociate/reconnect command before \n "
" connecting " } ,
2012-08-26 20:20:15 +02:00
{ " reconnect " , wpa_cli_cmd_reconnect , NULL ,
2009-01-05 20:32:48 +01:00
cli_cmd_flag_none ,
" = like reassociate, but only takes effect if already disconnected "
} ,
2012-08-26 20:20:15 +02:00
{ " scan " , wpa_cli_cmd_scan , NULL ,
2009-01-05 20:32:48 +01:00
cli_cmd_flag_none ,
" = request new BSS scan " } ,
2012-08-26 20:20:15 +02:00
{ " scan_results " , wpa_cli_cmd_scan_results , NULL ,
2009-01-05 20:32:48 +01:00
cli_cmd_flag_none ,
" = get latest scan results " } ,
2015-10-27 09:58:52 +01:00
{ " abort_scan " , wpa_cli_cmd_abort_scan , NULL ,
cli_cmd_flag_none ,
" = request ongoing scan to be aborted " } ,
2012-08-26 20:20:15 +02:00
{ " bss " , wpa_cli_cmd_bss , wpa_cli_complete_bss ,
2009-01-05 20:32:48 +01:00
cli_cmd_flag_none ,
" <<idx> | <bssid>> = get detailed scan result info " } ,
2016-07-07 14:04:30 +02:00
{ " get_capability " , wpa_cli_cmd_get_capability ,
wpa_cli_complete_get_capability , cli_cmd_flag_none ,
2013-04-23 15:55:54 +02:00
" <eap/pairwise/group/key_mgmt/proto/auth_alg/channels/freq/modes> "
2015-03-27 00:03:21 +01:00
" = get capabilities " } ,
2012-08-26 20:20:15 +02:00
{ " reconfigure " , wpa_cli_cmd_reconfigure , NULL ,
2009-01-05 20:32:48 +01:00
cli_cmd_flag_none ,
" = force wpa_supplicant to re-read its configuration file " } ,
2012-08-26 20:20:15 +02:00
{ " terminate " , wpa_cli_cmd_terminate , NULL ,
2009-01-05 20:32:48 +01:00
cli_cmd_flag_none ,
" = terminate wpa_supplicant " } ,
2012-08-26 20:20:15 +02:00
{ " interface_add " , wpa_cli_cmd_interface_add , NULL ,
2009-01-05 20:32:48 +01:00
cli_cmd_flag_none ,
" <ifname> <confname> <driver> <ctrl_interface> <driver_param> \n "
2015-11-03 15:30:11 +01:00
" <bridge_name> <create> <type> = adds new interface, all "
" parameters but \n "
" <ifname> are optional. Supported types are station ('sta') and "
" AP ('ap') " } ,
2012-08-26 20:20:15 +02:00
{ " interface_remove " , wpa_cli_cmd_interface_remove , NULL ,
2009-01-05 20:32:48 +01:00
cli_cmd_flag_none ,
" <ifname> = removes the interface " } ,
2012-08-26 20:20:15 +02:00
{ " interface_list " , wpa_cli_cmd_interface_list , NULL ,
2009-01-05 20:32:48 +01:00
cli_cmd_flag_none ,
" = list available interfaces " } ,
2012-08-26 20:20:15 +02:00
{ " ap_scan " , wpa_cli_cmd_ap_scan , NULL ,
2009-01-05 20:32:48 +01:00
cli_cmd_flag_none ,
" <value> = set ap_scan parameter " } ,
2012-08-26 20:20:15 +02:00
{ " scan_interval " , wpa_cli_cmd_scan_interval , NULL ,
2011-04-11 22:14:38 +02:00
cli_cmd_flag_none ,
" <value> = set scan_interval parameter (in seconds) " } ,
2012-08-26 20:20:15 +02:00
{ " bss_expire_age " , wpa_cli_cmd_bss_expire_age , NULL ,
2011-03-20 11:40:59 +01:00
cli_cmd_flag_none ,
" <value> = set BSS expiration age parameter " } ,
2012-08-26 20:20:15 +02:00
{ " bss_expire_count " , wpa_cli_cmd_bss_expire_count , NULL ,
2011-03-20 11:40:59 +01:00
cli_cmd_flag_none ,
" <value> = set BSS expiration scan count parameter " } ,
2012-08-26 20:20:15 +02:00
{ " bss_flush " , wpa_cli_cmd_bss_flush , NULL ,
2012-08-25 09:23:22 +02:00
cli_cmd_flag_none ,
" <value> = set BSS flush age (0 by default) " } ,
2012-08-26 20:20:15 +02:00
{ " stkstart " , wpa_cli_cmd_stkstart , NULL ,
2009-01-05 20:32:48 +01:00
cli_cmd_flag_none ,
" <addr> = request STK negotiation with <addr> " } ,
2012-08-26 20:20:15 +02:00
{ " ft_ds " , wpa_cli_cmd_ft_ds , wpa_cli_complete_bss ,
2009-01-05 20:32:48 +01:00
cli_cmd_flag_none ,
" <addr> = request over-the-DS FT with <addr> " } ,
2012-08-26 20:20:15 +02:00
{ " wps_pbc " , wpa_cli_cmd_wps_pbc , wpa_cli_complete_bss ,
2009-01-05 20:32:48 +01:00
cli_cmd_flag_none ,
" [BSSID] = start Wi-Fi Protected Setup: Push Button Configuration " } ,
2012-08-26 20:20:15 +02:00
{ " wps_pin " , wpa_cli_cmd_wps_pin , wpa_cli_complete_bss ,
2009-01-05 20:32:48 +01:00
cli_cmd_flag_sensitive ,
" <BSSID> [PIN] = start WPS PIN method (returns PIN, if not "
" hardcoded) " } ,
2012-08-26 20:20:15 +02:00
{ " wps_check_pin " , wpa_cli_cmd_wps_check_pin , NULL ,
2010-09-23 19:30:52 +02:00
cli_cmd_flag_sensitive ,
" <PIN> = verify PIN checksum " } ,
2012-08-26 20:20:15 +02:00
{ " wps_cancel " , wpa_cli_cmd_wps_cancel , NULL , cli_cmd_flag_none ,
2010-09-06 19:51:06 +02:00
" Cancels the pending WPS operation " } ,
2012-06-28 13:05:13 +02:00
# ifdef CONFIG_WPS_NFC
2012-08-26 20:20:15 +02:00
{ " wps_nfc " , wpa_cli_cmd_wps_nfc , wpa_cli_complete_bss ,
2012-06-27 17:56:41 +02:00
cli_cmd_flag_none ,
" [BSSID] = start Wi-Fi Protected Setup: NFC " } ,
2013-02-15 10:45:29 +01:00
{ " wps_nfc_config_token " , wpa_cli_cmd_wps_nfc_config_token , NULL ,
cli_cmd_flag_none ,
" <WPS|NDEF> = build configuration token " } ,
2012-08-26 20:20:15 +02:00
{ " wps_nfc_token " , wpa_cli_cmd_wps_nfc_token , NULL ,
2012-06-27 17:56:41 +02:00
cli_cmd_flag_none ,
" <WPS|NDEF> = create password token " } ,
2012-08-26 20:20:15 +02:00
{ " wps_nfc_tag_read " , wpa_cli_cmd_wps_nfc_tag_read , NULL ,
2012-06-28 12:59:29 +02:00
cli_cmd_flag_sensitive ,
" <hexdump of payload> = report read NFC tag with WPS data " } ,
2012-10-28 16:39:46 +01:00
{ " nfc_get_handover_req " , wpa_cli_cmd_nfc_get_handover_req , NULL ,
cli_cmd_flag_none ,
" <NDEF> <WPS> = create NFC handover request " } ,
{ " nfc_get_handover_sel " , wpa_cli_cmd_nfc_get_handover_sel , NULL ,
cli_cmd_flag_none ,
" <NDEF> <WPS> = create NFC handover select " } ,
2013-02-11 17:43:46 +01:00
{ " nfc_report_handover " , wpa_cli_cmd_nfc_report_handover , NULL ,
cli_cmd_flag_none ,
" <role> <type> <hexdump of req> <hexdump of sel> = report completed "
" NFC handover " } ,
2012-06-28 13:05:13 +02:00
# endif /* CONFIG_WPS_NFC */
2012-08-26 20:20:15 +02:00
{ " wps_reg " , wpa_cli_cmd_wps_reg , wpa_cli_complete_bss ,
2009-01-05 20:32:48 +01:00
cli_cmd_flag_sensitive ,
" <BSSID> <AP PIN> = start WPS Registrar to configure an AP " } ,
2012-08-26 20:20:15 +02:00
{ " wps_ap_pin " , wpa_cli_cmd_wps_ap_pin , NULL ,
2010-11-17 15:46:55 +01:00
cli_cmd_flag_sensitive ,
" [params..] = enable/disable AP PIN " } ,
2012-08-26 20:20:15 +02:00
{ " wps_er_start " , wpa_cli_cmd_wps_er_start , NULL ,
2009-11-07 11:41:01 +01:00
cli_cmd_flag_none ,
2010-05-27 14:23:55 +02:00
" [IP address] = start Wi-Fi Protected Setup External Registrar " } ,
2012-08-26 20:20:15 +02:00
{ " wps_er_stop " , wpa_cli_cmd_wps_er_stop , NULL ,
2009-11-07 11:41:01 +01:00
cli_cmd_flag_none ,
" = stop Wi-Fi Protected Setup External Registrar " } ,
2012-08-26 20:20:15 +02:00
{ " wps_er_pin " , wpa_cli_cmd_wps_er_pin , NULL ,
2009-11-13 21:07:11 +01:00
cli_cmd_flag_sensitive ,
" <UUID> <PIN> = add an Enrollee PIN to External Registrar " } ,
2012-08-26 20:20:15 +02:00
{ " wps_er_pbc " , wpa_cli_cmd_wps_er_pbc , NULL ,
2009-11-15 17:46:03 +01:00
cli_cmd_flag_none ,
" <UUID> = accept an Enrollee PBC using External Registrar " } ,
2012-08-26 20:20:15 +02:00
{ " wps_er_learn " , wpa_cli_cmd_wps_er_learn , NULL ,
2009-11-15 21:27:06 +01:00
cli_cmd_flag_sensitive ,
" <UUID> <PIN> = learn AP configuration " } ,
2012-08-26 20:20:15 +02:00
{ " wps_er_set_config " , wpa_cli_cmd_wps_er_set_config , NULL ,
2010-10-20 12:37:01 +02:00
cli_cmd_flag_none ,
" <UUID> <network id> = set AP configuration for enrolling " } ,
2012-08-26 20:20:15 +02:00
{ " wps_er_config " , wpa_cli_cmd_wps_er_config , NULL ,
2010-05-27 23:01:48 +02:00
cli_cmd_flag_sensitive ,
" <UUID> <PIN> <SSID> <auth> <encr> <key> = configure AP " } ,
2012-06-28 15:35:51 +02:00
# ifdef CONFIG_WPS_NFC
2012-08-26 20:20:15 +02:00
{ " wps_er_nfc_config_token " , wpa_cli_cmd_wps_er_nfc_config_token , NULL ,
2012-06-28 15:35:51 +02:00
cli_cmd_flag_none ,
" <WPS/NDEF> <UUID> = build NFC configuration token " } ,
# endif /* CONFIG_WPS_NFC */
2012-08-26 20:20:15 +02:00
{ " ibss_rsn " , wpa_cli_cmd_ibss_rsn , NULL ,
2009-01-15 00:21:55 +01:00
cli_cmd_flag_none ,
" <addr> = request RSN authentication with <addr> in IBSS " } ,
2009-09-08 11:58:02 +02:00
# ifdef CONFIG_AP
2016-10-12 14:19:00 +02:00
{ " sta " , wpa_cli_cmd_sta , wpa_cli_complete_sta ,
2009-09-08 11:58:02 +02:00
cli_cmd_flag_none ,
" <addr> = get information about an associated station (AP) " } ,
2012-08-26 20:20:15 +02:00
{ " all_sta " , wpa_cli_cmd_all_sta , NULL ,
2009-09-08 11:58:02 +02:00
cli_cmd_flag_none ,
" = get information about all associated stations (AP) " } ,
2016-10-12 14:18:59 +02:00
{ " list_sta " , wpa_cli_cmd_list_sta , NULL ,
cli_cmd_flag_none ,
" = list all stations (AP) " } ,
2016-10-12 14:19:00 +02:00
{ " deauthenticate " , wpa_cli_cmd_deauthenticate ,
wpa_cli_complete_deauthenticate , cli_cmd_flag_none ,
2012-02-25 16:22:48 +01:00
" <addr> = deauthenticate a station " } ,
2016-10-12 14:19:00 +02:00
{ " disassociate " , wpa_cli_cmd_disassociate ,
wpa_cli_complete_disassociate , cli_cmd_flag_none ,
2012-02-25 16:22:48 +01:00
" <addr> = disassociate a station " } ,
2013-11-14 11:28:32 +01:00
{ " chan_switch " , wpa_cli_cmd_chanswitch , NULL ,
cli_cmd_flag_none ,
" <cs_count> <freq> [sec_channel_offset=] [center_freq1=] "
" [center_freq2=] [bandwidth=] [blocktx] [ht|vht] "
" = CSA parameters " } ,
2009-09-08 11:58:02 +02:00
# endif /* CONFIG_AP */
2012-08-26 20:20:15 +02:00
{ " suspend " , wpa_cli_cmd_suspend , NULL , cli_cmd_flag_none ,
2010-02-27 17:46:02 +01:00
" = notification of suspend/hibernate " } ,
2012-08-26 20:20:15 +02:00
{ " resume " , wpa_cli_cmd_resume , NULL , cli_cmd_flag_none ,
2010-02-27 17:46:02 +01:00
" = notification of resume/thaw " } ,
2014-04-05 22:59:31 +02:00
# ifdef CONFIG_TESTING_OPTIONS
2012-08-26 20:20:15 +02:00
{ " drop_sa " , wpa_cli_cmd_drop_sa , NULL , cli_cmd_flag_none ,
2010-03-30 00:42:04 +02:00
" = drop SA without deauth/disassoc (test command) " } ,
2014-04-05 22:59:31 +02:00
# endif /* CONFIG_TESTING_OPTIONS */
2012-08-26 20:20:15 +02:00
{ " roam " , wpa_cli_cmd_roam , wpa_cli_complete_bss ,
2010-04-10 21:56:55 +02:00
cli_cmd_flag_none ,
" <addr> = roam to the specified BSS " } ,
2014-09-01 06:23:33 +02:00
# ifdef CONFIG_MESH
2014-11-15 02:35:23 +01:00
{ " mesh_interface_add " , wpa_cli_cmd_mesh_interface_add , NULL ,
cli_cmd_flag_none ,
" [ifname] = Create a new mesh interface " } ,
2014-09-01 06:23:33 +02:00
{ " mesh_group_add " , wpa_cli_cmd_mesh_group_add , NULL ,
cli_cmd_flag_none ,
" <network id> = join a mesh network (disable others) " } ,
{ " mesh_group_remove " , wpa_cli_cmd_mesh_group_remove , NULL ,
cli_cmd_flag_none ,
" <ifname> = Remove mesh group interface " } ,
2016-03-09 10:16:10 +01:00
{ " mesh_peer_remove " , wpa_cli_cmd_mesh_peer_remove , NULL ,
cli_cmd_flag_none ,
" <addr> = Remove a mesh peer " } ,
2016-03-09 10:16:11 +01:00
{ " mesh_peer_add " , wpa_cli_cmd_mesh_peer_add , NULL ,
cli_cmd_flag_none ,
2016-03-09 10:16:14 +01:00
" <addr> [duration=<seconds>] = Add a mesh peer " } ,
2014-09-01 06:23:33 +02:00
# endif /* CONFIG_MESH */
2010-07-18 23:30:26 +02:00
# ifdef CONFIG_P2P
2012-08-28 16:38:53 +02:00
{ " p2p_find " , wpa_cli_cmd_p2p_find , wpa_cli_complete_p2p_find ,
cli_cmd_flag_none ,
2010-07-18 23:30:26 +02:00
" [timeout] [type=*] = find P2P Devices for up-to timeout seconds " } ,
2012-08-26 20:20:15 +02:00
{ " p2p_stop_find " , wpa_cli_cmd_p2p_stop_find , NULL , cli_cmd_flag_none ,
2010-07-18 23:30:26 +02:00
" = stop P2P Devices search " } ,
2014-12-10 10:34:32 +01:00
{ " p2p_asp_provision " , wpa_cli_cmd_p2p_asp_provision , NULL ,
cli_cmd_flag_none ,
" <addr> adv_id=<adv_id> conncap=<conncap> [info=<infodata>] = provision with a P2P ASP Device " } ,
{ " p2p_asp_provision_resp " , wpa_cli_cmd_p2p_asp_provision_resp , NULL ,
cli_cmd_flag_none ,
" <addr> adv_id=<adv_id> [role<conncap>] [info=<infodata>] = provision with a P2P ASP Device " } ,
2012-08-26 20:20:15 +02:00
{ " p2p_connect " , wpa_cli_cmd_p2p_connect , wpa_cli_complete_p2p_connect ,
cli_cmd_flag_none ,
2012-08-15 22:07:44 +02:00
" <addr> < \" pbc \" |PIN> [ht40] = connect to a P2P Device " } ,
2012-08-26 20:20:15 +02:00
{ " p2p_listen " , wpa_cli_cmd_p2p_listen , NULL , cli_cmd_flag_none ,
2010-07-18 23:30:26 +02:00
" [timeout] = listen for P2P Devices for up-to timeout seconds " } ,
2012-08-26 20:20:15 +02:00
{ " p2p_group_remove " , wpa_cli_cmd_p2p_group_remove ,
wpa_cli_complete_p2p_group_remove , cli_cmd_flag_none ,
2010-12-17 14:01:28 +01:00
" <ifname> = remove P2P group interface (terminate group if GO) " } ,
2012-08-26 20:20:15 +02:00
{ " p2p_group_add " , wpa_cli_cmd_p2p_group_add , NULL , cli_cmd_flag_none ,
2012-08-15 21:53:01 +02:00
" [ht40] = add a new P2P group (local end as GO) " } ,
2016-04-13 07:30:08 +02:00
{ " p2p_group_member " , wpa_cli_cmd_p2p_group_member , NULL ,
cli_cmd_flag_none ,
" <dev_addr> = Get peer interface address on local GO using peer Device Address " } ,
2012-08-26 20:20:15 +02:00
{ " p2p_prov_disc " , wpa_cli_cmd_p2p_prov_disc ,
wpa_cli_complete_p2p_peer , cli_cmd_flag_none ,
2010-07-18 23:30:26 +02:00
" <addr> <method> = request provisioning discovery " } ,
2012-08-26 20:20:15 +02:00
{ " p2p_get_passphrase " , wpa_cli_cmd_p2p_get_passphrase , NULL ,
2010-07-18 23:30:26 +02:00
cli_cmd_flag_none ,
" = get the passphrase for a group (GO only) " } ,
{ " p2p_serv_disc_req " , wpa_cli_cmd_p2p_serv_disc_req ,
2012-08-26 20:20:15 +02:00
wpa_cli_complete_p2p_peer , cli_cmd_flag_none ,
2010-07-18 23:30:26 +02:00
" <addr> <TLVs> = schedule service discovery request " } ,
{ " p2p_serv_disc_cancel_req " , wpa_cli_cmd_p2p_serv_disc_cancel_req ,
2012-08-26 20:20:15 +02:00
NULL , cli_cmd_flag_none ,
2010-07-18 23:30:26 +02:00
" <id> = cancel pending service discovery request " } ,
2012-08-26 20:20:15 +02:00
{ " p2p_serv_disc_resp " , wpa_cli_cmd_p2p_serv_disc_resp , NULL ,
2010-07-18 23:30:26 +02:00
cli_cmd_flag_none ,
" <freq> <addr> <dialog token> <TLVs> = service discovery response " } ,
2012-08-26 20:20:15 +02:00
{ " p2p_service_update " , wpa_cli_cmd_p2p_service_update , NULL ,
2010-07-18 23:30:26 +02:00
cli_cmd_flag_none ,
" = indicate change in local services " } ,
2012-08-26 20:20:15 +02:00
{ " p2p_serv_disc_external " , wpa_cli_cmd_p2p_serv_disc_external , NULL ,
2010-07-18 23:30:26 +02:00
cli_cmd_flag_none ,
" <external> = set external processing of service discovery " } ,
2012-08-26 20:20:15 +02:00
{ " p2p_service_flush " , wpa_cli_cmd_p2p_service_flush , NULL ,
2010-07-18 23:30:26 +02:00
cli_cmd_flag_none ,
" = remove all stored service entries " } ,
2012-08-26 20:20:15 +02:00
{ " p2p_service_add " , wpa_cli_cmd_p2p_service_add , NULL ,
2010-07-18 23:30:26 +02:00
cli_cmd_flag_none ,
2014-12-09 15:02:50 +01:00
" <bonjour|upnp|asp> <query|version> <response|service> = add a local "
2010-07-18 23:30:26 +02:00
" service " } ,
2014-12-09 15:02:50 +01:00
{ " p2p_service_rep " , wpa_cli_cmd_p2p_service_rep , NULL ,
cli_cmd_flag_none ,
" asp <auto> <adv_id> <svc_state> <svc_string> [<svc_info>] = replace "
" local ASP service " } ,
2012-08-26 20:20:15 +02:00
{ " p2p_service_del " , wpa_cli_cmd_p2p_service_del , NULL ,
2010-07-18 23:30:26 +02:00
cli_cmd_flag_none ,
" <bonjour|upnp> <query|version> [|service] = remove a local "
" service " } ,
2012-08-26 20:20:15 +02:00
{ " p2p_reject " , wpa_cli_cmd_p2p_reject , wpa_cli_complete_p2p_peer ,
2010-07-18 23:30:26 +02:00
cli_cmd_flag_none ,
" <addr> = reject connection attempts from a specific peer " } ,
2012-08-26 20:20:15 +02:00
{ " p2p_invite " , wpa_cli_cmd_p2p_invite , NULL ,
2010-07-18 23:30:26 +02:00
cli_cmd_flag_none ,
" <cmd> [peer=addr] = invite peer " } ,
2012-08-26 20:20:15 +02:00
{ " p2p_peers " , wpa_cli_cmd_p2p_peers , NULL , cli_cmd_flag_none ,
2010-07-18 23:30:26 +02:00
" [discovered] = list known (optionally, only fully discovered) P2P "
" peers " } ,
2012-08-26 20:20:15 +02:00
{ " p2p_peer " , wpa_cli_cmd_p2p_peer , wpa_cli_complete_p2p_peer ,
cli_cmd_flag_none ,
2010-07-18 23:30:26 +02:00
" <address> = show information about known P2P peer " } ,
2013-08-31 19:58:35 +02:00
{ " p2p_set " , wpa_cli_cmd_p2p_set , wpa_cli_complete_p2p_set ,
cli_cmd_flag_none ,
2010-07-18 23:30:26 +02:00
" <field> <value> = set a P2P parameter " } ,
2012-08-26 20:20:15 +02:00
{ " p2p_flush " , wpa_cli_cmd_p2p_flush , NULL , cli_cmd_flag_none ,
2010-07-18 23:30:26 +02:00
" = flush P2P state " } ,
2012-08-26 20:20:15 +02:00
{ " p2p_cancel " , wpa_cli_cmd_p2p_cancel , NULL , cli_cmd_flag_none ,
2010-10-19 14:53:28 +02:00
" = cancel P2P group formation " } ,
2012-08-26 20:20:15 +02:00
{ " p2p_unauthorize " , wpa_cli_cmd_p2p_unauthorize ,
wpa_cli_complete_p2p_peer , cli_cmd_flag_none ,
2010-11-25 12:09:50 +01:00
" <address> = unauthorize a peer " } ,
2012-08-26 20:20:15 +02:00
{ " p2p_presence_req " , wpa_cli_cmd_p2p_presence_req , NULL ,
cli_cmd_flag_none ,
2010-07-18 23:30:26 +02:00
" [<duration> <interval>] [<duration> <interval>] = request GO "
" presence " } ,
2012-08-26 20:20:15 +02:00
{ " p2p_ext_listen " , wpa_cli_cmd_p2p_ext_listen , NULL ,
cli_cmd_flag_none ,
2010-07-18 23:30:26 +02:00
" [<period> <interval>] = set extended listen timing " } ,
2013-09-01 16:37:22 +02:00
{ " p2p_remove_client " , wpa_cli_cmd_p2p_remove_client ,
wpa_cli_complete_p2p_peer , cli_cmd_flag_none ,
" <address|iface=address> = remove a peer from all groups " } ,
2015-10-29 08:05:48 +01:00
{ " vendor_elem_add " , wpa_cli_cmd_vendor_elem_add , NULL ,
cli_cmd_flag_none ,
" <frame id> <hexdump of elem(s)> = add vendor specific IEs to frame(s) \n "
VENDOR_ELEM_FRAME_ID } ,
{ " vendor_elem_get " , wpa_cli_cmd_vendor_elem_get , NULL ,
cli_cmd_flag_none ,
" <frame id> = get vendor specific IE(s) to frame(s) \n "
VENDOR_ELEM_FRAME_ID } ,
{ " vendor_elem_remove " , wpa_cli_cmd_vendor_elem_remove , NULL ,
cli_cmd_flag_none ,
" <frame id> <hexdump of elem(s)> = remove vendor specific IE(s) in frame(s) \n "
VENDOR_ELEM_FRAME_ID } ,
2010-07-18 23:30:26 +02:00
# endif /* CONFIG_P2P */
2012-03-02 16:26:01 +01:00
# ifdef CONFIG_WIFI_DISPLAY
{ " wfd_subelem_set " , wpa_cli_cmd_wfd_subelem_set , NULL ,
cli_cmd_flag_none ,
" <subelem> [contents] = set Wi-Fi Display subelement " } ,
{ " wfd_subelem_get " , wpa_cli_cmd_wfd_subelem_get , NULL ,
cli_cmd_flag_none ,
" <subelem> = get Wi-Fi Display subelement " } ,
# endif /* CONFIG_WIFI_DISPLAY */
2011-10-16 21:44:28 +02:00
# ifdef CONFIG_INTERWORKING
2012-08-26 20:20:15 +02:00
{ " fetch_anqp " , wpa_cli_cmd_fetch_anqp , NULL , cli_cmd_flag_none ,
2011-10-16 21:44:28 +02:00
" = fetch ANQP information for all APs " } ,
2012-08-26 20:20:15 +02:00
{ " stop_fetch_anqp " , wpa_cli_cmd_stop_fetch_anqp , NULL ,
cli_cmd_flag_none ,
2011-10-16 21:44:28 +02:00
" = stop fetch_anqp operation " } ,
2012-08-26 20:20:15 +02:00
{ " interworking_select " , wpa_cli_cmd_interworking_select , NULL ,
2011-10-04 21:13:22 +02:00
cli_cmd_flag_none ,
" [auto] = perform Interworking network selection " } ,
{ " interworking_connect " , wpa_cli_cmd_interworking_connect ,
2012-08-26 20:20:15 +02:00
wpa_cli_complete_bss , cli_cmd_flag_none ,
2011-10-04 21:13:22 +02:00
" <BSSID> = connect using Interworking credentials " } ,
2015-02-08 15:56:04 +01:00
{ " interworking_add_network " , wpa_cli_cmd_interworking_add_network ,
wpa_cli_complete_bss , cli_cmd_flag_none ,
" <BSSID> = connect using Interworking credentials " } ,
2012-08-26 20:20:15 +02:00
{ " anqp_get " , wpa_cli_cmd_anqp_get , wpa_cli_complete_bss ,
cli_cmd_flag_none ,
2011-10-16 21:44:28 +02:00
" <addr> <info id>[,<info id>]... = request ANQP information " } ,
2012-08-27 17:13:10 +02:00
{ " gas_request " , wpa_cli_cmd_gas_request , wpa_cli_complete_bss ,
cli_cmd_flag_none ,
" <addr> <AdvProtoID> [QueryReq] = GAS request " } ,
{ " gas_response_get " , wpa_cli_cmd_gas_response_get ,
wpa_cli_complete_bss , cli_cmd_flag_none ,
" <addr> <dialog token> [start,len] = Fetch last GAS response " } ,
2011-10-16 21:44:28 +02:00
# endif /* CONFIG_INTERWORKING */
2011-09-08 19:52:23 +02:00
# ifdef CONFIG_HS20
2012-08-26 20:20:15 +02:00
{ " hs20_anqp_get " , wpa_cli_cmd_hs20_anqp_get , wpa_cli_complete_bss ,
cli_cmd_flag_none ,
2011-09-08 19:52:23 +02:00
" <addr> <subtype>[,<subtype>]... = request HS 2.0 ANQP information "
} ,
{ " nai_home_realm_list " , wpa_cli_cmd_get_nai_home_realm_list ,
2012-08-26 20:20:15 +02:00
wpa_cli_complete_bss , cli_cmd_flag_none ,
2011-09-08 19:52:23 +02:00
" <addr> <home realm> = get HS20 nai home realm list " } ,
2012-12-20 20:15:05 +01:00
{ " hs20_icon_request " , wpa_cli_cmd_hs20_icon_request ,
wpa_cli_complete_bss , cli_cmd_flag_none ,
" <addr> <icon name> = get Hotspot 2.0 OSU icon " } ,
2013-01-25 23:10:41 +01:00
{ " fetch_osu " , wpa_cli_cmd_fetch_osu , NULL , cli_cmd_flag_none ,
" = fetch OSU provider information from all APs " } ,
{ " cancel_fetch_osu " , wpa_cli_cmd_cancel_fetch_osu , NULL ,
cli_cmd_flag_none ,
" = cancel fetch_osu command " } ,
2011-09-08 19:52:23 +02:00
# endif /* CONFIG_HS20 */
2012-08-26 20:20:15 +02:00
{ " sta_autoconnect " , wpa_cli_cmd_sta_autoconnect , NULL ,
cli_cmd_flag_none ,
2010-09-06 16:28:45 +02:00
" <0/1> = disable/enable automatic reconnection " } ,
2012-08-26 20:20:15 +02:00
{ " tdls_discover " , wpa_cli_cmd_tdls_discover , NULL ,
2010-10-07 09:26:56 +02:00
cli_cmd_flag_none ,
" <addr> = request TDLS discovery with <addr> " } ,
2012-08-26 20:20:15 +02:00
{ " tdls_setup " , wpa_cli_cmd_tdls_setup , NULL ,
2010-10-07 09:26:56 +02:00
cli_cmd_flag_none ,
" <addr> = request TDLS setup with <addr> " } ,
2012-08-26 20:20:15 +02:00
{ " tdls_teardown " , wpa_cli_cmd_tdls_teardown , NULL ,
2010-10-07 09:26:56 +02:00
cli_cmd_flag_none ,
" <addr> = tear down TDLS with <addr> " } ,
2015-04-28 13:00:50 +02:00
{ " tdls_link_status " , wpa_cli_cmd_tdls_link_status , NULL ,
cli_cmd_flag_none ,
" <addr> = TDLS link status with <addr> " } ,
2014-10-22 14:04:00 +02:00
{ " wmm_ac_addts " , wpa_cli_cmd_wmm_ac_addts , NULL ,
cli_cmd_flag_none ,
" <uplink/downlink/bidi> <tsid=0..7> <up=0..7> [nominal_msdu_size=#] "
" [mean_data_rate=#] [min_phy_rate=#] [sba=#] [fixed_nominal_msdu] "
" = add WMM-AC traffic stream " } ,
{ " wmm_ac_delts " , wpa_cli_cmd_wmm_ac_delts , NULL ,
cli_cmd_flag_none ,
" <tsid> = delete WMM-AC traffic stream " } ,
2014-10-22 14:04:02 +02:00
{ " wmm_ac_status " , wpa_cli_cmd_wmm_ac_status , NULL ,
cli_cmd_flag_none ,
" = show status for Wireless Multi-Media Admission-Control " } ,
2014-12-29 04:35:21 +01:00
{ " tdls_chan_switch " , wpa_cli_cmd_tdls_chan_switch , NULL ,
cli_cmd_flag_none ,
" <addr> <oper class> <freq> [sec_channel_offset=] [center_freq1=] "
" [center_freq2=] [bandwidth=] [ht|vht] = enable channel switching "
" with TDLS peer " } ,
{ " tdls_cancel_chan_switch " , wpa_cli_cmd_tdls_cancel_chan_switch , NULL ,
cli_cmd_flag_none ,
" <addr> = disable channel switching with TDLS peer <addr> " } ,
2012-08-26 20:20:15 +02:00
{ " signal_poll " , wpa_cli_cmd_signal_poll , NULL ,
2011-04-15 17:52:01 +02:00
cli_cmd_flag_none ,
" = get signal parameters " } ,
2015-12-16 23:18:18 +01:00
{ " signal_monitor " , wpa_cli_cmd_signal_monitor , NULL ,
cli_cmd_flag_none ,
" = set signal monitor parameters " } ,
2012-09-05 16:02:02 +02:00
{ " pktcnt_poll " , wpa_cli_cmd_pktcnt_poll , NULL ,
cli_cmd_flag_none ,
" = get TX/RX packet counters " } ,
2012-08-26 20:20:15 +02:00
{ " reauthenticate " , wpa_cli_cmd_reauthenticate , NULL ,
cli_cmd_flag_none ,
2011-11-13 18:47:51 +01:00
" = trigger IEEE 802.1X/EAPOL reauthentication " } ,
2012-06-26 18:11:17 +02:00
# ifdef CONFIG_AUTOSCAN
2012-08-26 20:20:15 +02:00
{ " autoscan " , wpa_cli_cmd_autoscan , NULL , cli_cmd_flag_none ,
2012-06-26 18:11:17 +02:00
" [params] = Set or unset (if none) autoscan parameters " } ,
# endif /* CONFIG_AUTOSCAN */
2012-12-16 11:29:10 +01:00
# ifdef CONFIG_WNM
{ " wnm_sleep " , wpa_cli_cmd_wnm_sleep , NULL , cli_cmd_flag_none ,
" <enter/exit> [interval=#] = enter/exit WNM-Sleep mode " } ,
2013-05-16 16:50:31 +02:00
{ " wnm_bss_query " , wpa_cli_cmd_wnm_bss_query , NULL , cli_cmd_flag_none ,
2016-02-15 15:53:43 +01:00
" <query reason> [list] = Send BSS Transition Management Query " } ,
2012-12-16 11:29:10 +01:00
# endif /* CONFIG_WNM */
2012-08-26 20:20:15 +02:00
{ " raw " , wpa_cli_cmd_raw , NULL , cli_cmd_flag_sensitive ,
2012-08-25 12:33:29 +02:00
" <params..> = Sent unprocessed command " } ,
2013-03-31 19:31:07 +02:00
{ " flush " , wpa_cli_cmd_flush , NULL , cli_cmd_flag_none ,
" = flush wpa_supplicant state " } ,
2013-11-07 15:16:15 +01:00
# ifdef ANDROID
{ " driver " , wpa_cli_cmd_driver , NULL , cli_cmd_flag_none ,
" <command> = driver private commands " } ,
# endif /* ANDROID */
2014-01-04 12:10:41 +01:00
{ " radio_work " , wpa_cli_cmd_radio_work , NULL , cli_cmd_flag_none ,
" = radio_work <show/add/done> " } ,
2014-03-03 12:09:50 +01:00
{ " vendor " , wpa_cli_cmd_vendor , NULL , cli_cmd_flag_none ,
" <vendor id> <command id> [<hex formatted command argument>] = Send vendor command "
} ,
2014-11-05 09:42:54 +01:00
{ " neighbor_rep_request " ,
wpa_cli_cmd_neighbor_rep_request , NULL , cli_cmd_flag_none ,
2016-04-06 18:42:05 +02:00
" [ssid=<SSID>] [lci] [civic] = Trigger request to AP for neighboring AP report (with optional given SSID in hex or enclosed in double quotes, default: current SSID; with optional LCI and location civic request) "
2014-11-05 09:42:54 +01:00
} ,
2014-12-01 00:11:29 +01:00
{ " erp_flush " , wpa_cli_cmd_erp_flush , NULL , cli_cmd_flag_none ,
" = flush ERP keys " } ,
2014-12-29 07:41:08 +01:00
{ " mac_rand_scan " ,
wpa_cli_cmd_mac_rand_scan , NULL , cli_cmd_flag_none ,
" <scan|sched|pno|all> enable=<0/1> [addr=mac-address "
" mask=mac-address-mask] = scan MAC randomization "
} ,
2015-07-24 01:32:58 +02:00
{ " get_pref_freq_list " , wpa_cli_cmd_get_pref_freq_list , NULL ,
cli_cmd_flag_none ,
" <interface type> = retrieve preferred freq list for the specified interface type " } ,
2016-06-24 20:36:18 +02:00
{ " p2p_lo_start " , wpa_cli_cmd_p2p_lo_start , NULL ,
cli_cmd_flag_none ,
" <freq> <period> <interval> <count> = start P2P listen offload " } ,
{ " p2p_lo_stop " , wpa_cli_cmd_p2p_lo_stop , NULL ,
cli_cmd_flag_none ,
" = stop P2P listen offload " } ,
2012-08-26 20:20:15 +02:00
{ NULL , NULL , NULL , cli_cmd_flag_none , NULL }
2008-02-28 02:34:43 +01:00
} ;
2009-01-05 20:32:48 +01:00
/*
* Prints command usage , lines are padded with the specified string .
*/
2015-04-24 09:19:53 +02:00
static void print_cmd_help ( const struct wpa_cli_cmd * cmd , const char * pad )
2009-01-05 20:32:48 +01:00
{
char c ;
size_t n ;
printf ( " %s%s " , pad , cmd - > cmd ) ;
for ( n = 0 ; ( c = cmd - > usage [ n ] ) ; n + + ) {
printf ( " %c " , c ) ;
if ( c = = ' \n ' )
printf ( " %s " , pad ) ;
}
printf ( " \n " ) ;
}
2012-08-26 20:30:06 +02:00
static void print_help ( const char * cmd )
2009-01-05 20:32:48 +01:00
{
int n ;
printf ( " commands: \n " ) ;
2012-08-26 20:30:06 +02:00
for ( n = 0 ; wpa_cli_commands [ n ] . cmd ; n + + ) {
if ( cmd = = NULL | | str_starts ( wpa_cli_commands [ n ] . cmd , cmd ) )
print_cmd_help ( & wpa_cli_commands [ n ] , " " ) ;
}
2009-01-05 20:32:48 +01:00
}
2010-11-14 21:37:43 +01:00
static int wpa_cli_edit_filter_history_cb ( void * ctx , const char * cmd )
2009-01-05 20:05:05 +01:00
{
const char * c , * delim ;
int n ;
size_t len ;
delim = os_strchr ( cmd , ' ' ) ;
if ( delim )
len = delim - cmd ;
else
len = os_strlen ( cmd ) ;
for ( n = 0 ; ( c = wpa_cli_commands [ n ] . cmd ) ; n + + ) {
if ( os_strncasecmp ( cmd , c , len ) = = 0 & & len = = os_strlen ( c ) )
return ( wpa_cli_commands [ n ] . flags &
cli_cmd_flag_sensitive ) ;
}
return 0 ;
}
2010-11-14 21:37:43 +01:00
static char * * wpa_list_cmd_list ( void )
{
char * * res ;
int i , count ;
2013-05-23 19:35:02 +02:00
struct cli_txt_entry * e ;
2010-11-14 21:37:43 +01:00
2013-10-26 16:00:57 +02:00
count = ARRAY_SIZE ( wpa_cli_commands ) ;
2013-05-23 19:35:02 +02:00
count + = dl_list_len ( & p2p_groups ) ;
count + = dl_list_len ( & ifnames ) ;
res = os_calloc ( count + 1 , sizeof ( char * ) ) ;
2010-11-14 21:37:43 +01:00
if ( res = = NULL )
return NULL ;
for ( i = 0 ; wpa_cli_commands [ i ] . cmd ; i + + ) {
res [ i ] = os_strdup ( wpa_cli_commands [ i ] . cmd ) ;
if ( res [ i ] = = NULL )
break ;
}
2013-05-23 19:35:02 +02:00
dl_list_for_each ( e , & p2p_groups , struct cli_txt_entry , list ) {
size_t len = 8 + os_strlen ( e - > txt ) ;
res [ i ] = os_malloc ( len ) ;
if ( res [ i ] = = NULL )
break ;
os_snprintf ( res [ i ] , len , " ifname=%s " , e - > txt ) ;
i + + ;
}
dl_list_for_each ( e , & ifnames , struct cli_txt_entry , list ) {
res [ i ] = os_strdup ( e - > txt ) ;
if ( res [ i ] = = NULL )
break ;
i + + ;
}
2010-11-14 21:37:43 +01:00
return res ;
}
static char * * wpa_cli_cmd_completion ( const char * cmd , const char * str ,
int pos )
{
int i ;
for ( i = 0 ; wpa_cli_commands [ i ] . cmd ; i + + ) {
if ( os_strcasecmp ( wpa_cli_commands [ i ] . cmd , cmd ) = = 0 ) {
2012-08-28 16:25:09 +02:00
if ( wpa_cli_commands [ i ] . completion )
return wpa_cli_commands [ i ] . completion ( str ,
pos ) ;
2010-11-14 21:37:43 +01:00
edit_clear_line ( ) ;
printf ( " \r %s \n " , wpa_cli_commands [ i ] . usage ) ;
edit_redraw ( ) ;
break ;
}
}
return NULL ;
}
static char * * wpa_cli_edit_completion_cb ( void * ctx , const char * str , int pos )
{
char * * res ;
const char * end ;
char * cmd ;
2013-05-23 19:35:02 +02:00
if ( pos > 7 & & os_strncasecmp ( str , " IFNAME= " , 7 ) = = 0 ) {
end = os_strchr ( str , ' ' ) ;
if ( end & & pos > end - str ) {
pos - = end - str + 1 ;
str = end + 1 ;
}
}
2010-11-14 21:37:43 +01:00
end = os_strchr ( str , ' ' ) ;
if ( end = = NULL | | str + pos < end )
return wpa_list_cmd_list ( ) ;
cmd = os_malloc ( pos + 1 ) ;
if ( cmd = = NULL )
return NULL ;
os_memcpy ( cmd , str , pos ) ;
cmd [ end - str ] = ' \0 ' ;
res = wpa_cli_cmd_completion ( cmd , str , pos ) ;
os_free ( cmd ) ;
return res ;
}
2009-01-05 20:05:05 +01:00
2008-02-28 02:34:43 +01:00
static int wpa_request ( struct wpa_ctrl * ctrl , int argc , char * argv [ ] )
{
2015-04-24 09:19:53 +02:00
const struct wpa_cli_cmd * cmd , * match = NULL ;
2008-02-28 02:34:43 +01:00
int count ;
int ret = 0 ;
2013-05-23 19:04:17 +02:00
if ( argc > 1 & & os_strncasecmp ( argv [ 0 ] , " IFNAME= " , 7 ) = = 0 ) {
ifname_prefix = argv [ 0 ] + 7 ;
argv = & argv [ 1 ] ;
argc - - ;
} else
ifname_prefix = NULL ;
if ( argc = = 0 )
return - 1 ;
2008-02-28 02:34:43 +01:00
count = 0 ;
cmd = wpa_cli_commands ;
while ( cmd - > cmd ) {
if ( os_strncasecmp ( cmd - > cmd , argv [ 0 ] , os_strlen ( argv [ 0 ] ) ) = = 0 )
{
match = cmd ;
if ( os_strcasecmp ( cmd - > cmd , argv [ 0 ] ) = = 0 ) {
/* we have an exact match */
count = 1 ;
break ;
}
count + + ;
}
cmd + + ;
}
if ( count > 1 ) {
printf ( " Ambiguous command '%s'; possible commands: " , argv [ 0 ] ) ;
cmd = wpa_cli_commands ;
while ( cmd - > cmd ) {
if ( os_strncasecmp ( cmd - > cmd , argv [ 0 ] ,
os_strlen ( argv [ 0 ] ) ) = = 0 ) {
printf ( " %s " , cmd - > cmd ) ;
}
cmd + + ;
}
printf ( " \n " ) ;
ret = 1 ;
} else if ( count = = 0 ) {
printf ( " Unknown command '%s' \n " , argv [ 0 ] ) ;
ret = 1 ;
} else {
ret = match - > handler ( ctrl , argc - 1 , & argv [ 1 ] ) ;
}
return ret ;
}
static int wpa_cli_exec ( const char * program , const char * arg1 ,
const char * arg2 )
{
2014-10-06 16:25:52 +02:00
char * arg ;
2008-02-28 02:34:43 +01:00
size_t len ;
int res ;
2016-02-29 13:29:58 +01:00
/* If no interface is specified, set the global */
if ( ! arg1 )
arg1 = " global " ;
2014-10-06 16:25:52 +02:00
len = os_strlen ( arg1 ) + os_strlen ( arg2 ) + 2 ;
arg = os_malloc ( len ) ;
if ( arg = = NULL )
2008-02-28 02:34:43 +01:00
return - 1 ;
2014-10-06 16:25:52 +02:00
os_snprintf ( arg , len , " %s %s " , arg1 , arg2 ) ;
res = os_exec ( program , arg , 1 ) ;
os_free ( arg ) ;
2008-02-28 02:34:43 +01:00
2014-10-06 16:25:52 +02:00
return res ;
2008-02-28 02:34:43 +01:00
}
static void wpa_cli_action_process ( const char * msg )
{
const char * pos ;
char * copy = NULL , * id , * pos2 ;
2014-09-26 14:41:55 +02:00
const char * ifname = ctrl_ifname ;
char ifname_buf [ 100 ] ;
2008-02-28 02:34:43 +01:00
2015-07-22 16:10:32 +02:00
if ( eloop_terminated ( ) )
return ;
2008-02-28 02:34:43 +01:00
pos = msg ;
2014-09-26 14:41:55 +02:00
if ( os_strncmp ( pos , " IFNAME= " , 7 ) = = 0 ) {
const char * end ;
end = os_strchr ( pos + 7 , ' ' ) ;
if ( end & & ( unsigned int ) ( end - pos ) < sizeof ( ifname_buf ) ) {
pos + = 7 ;
os_memcpy ( ifname_buf , pos , end - pos ) ;
ifname_buf [ end - pos ] = ' \0 ' ;
ifname = ifname_buf ;
pos = end + 1 ;
}
}
2008-02-28 02:34:43 +01:00
if ( * pos = = ' < ' ) {
2014-09-26 14:41:55 +02:00
const char * prev = pos ;
2008-02-28 02:34:43 +01:00
/* skip priority */
pos = os_strchr ( pos , ' > ' ) ;
if ( pos )
pos + + ;
else
2014-09-26 14:41:55 +02:00
pos = prev ;
2008-02-28 02:34:43 +01:00
}
2016-08-06 11:44:51 +02:00
if ( str_starts ( pos , WPA_EVENT_CONNECTED ) ) {
2008-02-28 02:34:43 +01:00
int new_id = - 1 ;
os_unsetenv ( " WPA_ID " ) ;
os_unsetenv ( " WPA_ID_STR " ) ;
os_unsetenv ( " WPA_CTRL_DIR " ) ;
pos = os_strstr ( pos , " [id= " ) ;
if ( pos )
copy = os_strdup ( pos + 4 ) ;
if ( copy ) {
pos2 = id = copy ;
while ( * pos2 & & * pos2 ! = ' ' )
pos2 + + ;
* pos2 + + = ' \0 ' ;
new_id = atoi ( id ) ;
os_setenv ( " WPA_ID " , id , 1 ) ;
while ( * pos2 & & * pos2 ! = ' = ' )
pos2 + + ;
if ( * pos2 = = ' = ' )
pos2 + + ;
id = pos2 ;
while ( * pos2 & & * pos2 ! = ' ] ' )
pos2 + + ;
* pos2 = ' \0 ' ;
os_setenv ( " WPA_ID_STR " , id , 1 ) ;
os_free ( copy ) ;
}
os_setenv ( " WPA_CTRL_DIR " , ctrl_iface_dir , 1 ) ;
2013-08-31 16:27:20 +02:00
if ( wpa_cli_connected < = 0 | | new_id ! = wpa_cli_last_id ) {
2008-02-28 02:34:43 +01:00
wpa_cli_connected = 1 ;
wpa_cli_last_id = new_id ;
2014-09-26 14:41:55 +02:00
wpa_cli_exec ( action_file , ifname , " CONNECTED " ) ;
2008-02-28 02:34:43 +01:00
}
2016-08-06 11:44:51 +02:00
} else if ( str_starts ( pos , WPA_EVENT_DISCONNECTED ) ) {
2008-02-28 02:34:43 +01:00
if ( wpa_cli_connected ) {
wpa_cli_connected = 0 ;
2014-09-26 14:41:55 +02:00
wpa_cli_exec ( action_file , ifname , " DISCONNECTED " ) ;
2008-02-28 02:34:43 +01:00
}
2016-08-06 11:44:51 +02:00
} else if ( str_starts ( pos , AP_EVENT_ENABLED ) ) {
2016-05-23 17:11:47 +02:00
wpa_cli_exec ( action_file , ctrl_ifname , pos ) ;
2016-08-06 11:44:51 +02:00
} else if ( str_starts ( pos , AP_EVENT_DISABLED ) ) {
2016-05-23 17:11:47 +02:00
wpa_cli_exec ( action_file , ctrl_ifname , pos ) ;
2016-08-06 11:44:51 +02:00
} else if ( str_starts ( pos , MESH_GROUP_STARTED ) ) {
2014-11-15 02:35:24 +01:00
wpa_cli_exec ( action_file , ctrl_ifname , pos ) ;
2016-08-06 11:44:51 +02:00
} else if ( str_starts ( pos , MESH_GROUP_REMOVED ) ) {
2014-11-15 02:35:24 +01:00
wpa_cli_exec ( action_file , ctrl_ifname , pos ) ;
2016-08-06 11:44:51 +02:00
} else if ( str_starts ( pos , MESH_PEER_CONNECTED ) ) {
2014-11-15 02:35:24 +01:00
wpa_cli_exec ( action_file , ctrl_ifname , pos ) ;
2016-08-06 11:44:51 +02:00
} else if ( str_starts ( pos , MESH_PEER_DISCONNECTED ) ) {
2014-11-15 02:35:24 +01:00
wpa_cli_exec ( action_file , ctrl_ifname , pos ) ;
2016-08-06 11:44:51 +02:00
} else if ( str_starts ( pos , P2P_EVENT_GROUP_STARTED ) ) {
2014-09-26 14:41:55 +02:00
wpa_cli_exec ( action_file , ifname , pos ) ;
2016-08-06 11:44:51 +02:00
} else if ( str_starts ( pos , P2P_EVENT_GROUP_REMOVED ) ) {
2014-09-26 14:41:55 +02:00
wpa_cli_exec ( action_file , ifname , pos ) ;
2016-08-06 11:44:51 +02:00
} else if ( str_starts ( pos , P2P_EVENT_CROSS_CONNECT_ENABLE ) ) {
2014-09-26 14:41:55 +02:00
wpa_cli_exec ( action_file , ifname , pos ) ;
2016-08-06 11:44:51 +02:00
} else if ( str_starts ( pos , P2P_EVENT_CROSS_CONNECT_DISABLE ) ) {
2014-09-26 14:41:55 +02:00
wpa_cli_exec ( action_file , ifname , pos ) ;
2016-08-06 11:44:51 +02:00
} else if ( str_starts ( pos , P2P_EVENT_GO_NEG_FAILURE ) ) {
2014-09-26 14:41:55 +02:00
wpa_cli_exec ( action_file , ifname , pos ) ;
2016-08-06 11:44:51 +02:00
} else if ( str_starts ( pos , WPS_EVENT_SUCCESS ) ) {
2014-09-26 14:41:55 +02:00
wpa_cli_exec ( action_file , ifname , pos ) ;
2016-08-06 11:44:51 +02:00
} else if ( str_starts ( pos , WPS_EVENT_FAIL ) ) {
2014-09-26 14:41:55 +02:00
wpa_cli_exec ( action_file , ifname , pos ) ;
2016-08-06 11:44:51 +02:00
} else if ( str_starts ( pos , AP_STA_CONNECTED ) ) {
2014-09-26 14:41:55 +02:00
wpa_cli_exec ( action_file , ifname , pos ) ;
2016-08-06 11:44:51 +02:00
} else if ( str_starts ( pos , AP_STA_DISCONNECTED ) ) {
2014-09-26 14:41:55 +02:00
wpa_cli_exec ( action_file , ifname , pos ) ;
2016-08-06 11:44:51 +02:00
} else if ( str_starts ( pos , ESS_DISASSOC_IMMINENT ) ) {
2014-09-26 14:41:55 +02:00
wpa_cli_exec ( action_file , ifname , pos ) ;
2016-08-06 11:44:51 +02:00
} else if ( str_starts ( pos , HS20_SUBSCRIPTION_REMEDIATION ) ) {
2014-09-26 14:41:55 +02:00
wpa_cli_exec ( action_file , ifname , pos ) ;
2016-08-06 11:44:51 +02:00
} else if ( str_starts ( pos , HS20_DEAUTH_IMMINENT_NOTICE ) ) {
2014-09-26 14:41:55 +02:00
wpa_cli_exec ( action_file , ifname , pos ) ;
2016-08-06 11:44:51 +02:00
} else if ( str_starts ( pos , WPA_EVENT_TERMINATING ) ) {
2008-02-28 02:34:43 +01:00
printf ( " wpa_supplicant is terminating - stop monitoring \n " ) ;
wpa_cli_quit = 1 ;
}
}
# ifndef CONFIG_ANSI_C_EXTRA
static void wpa_cli_action_cb ( char * msg , size_t len )
{
wpa_cli_action_process ( msg ) ;
}
# endif /* CONFIG_ANSI_C_EXTRA */
static void wpa_cli_reconnect ( void )
{
wpa_cli_close_connection ( ) ;
2012-08-05 21:27:52 +02:00
if ( wpa_cli_open_connection ( ctrl_ifname , 1 ) < 0 )
return ;
if ( interactive ) {
edit_clear_line ( ) ;
printf ( " \r Connection to wpa_supplicant re-established \n " ) ;
edit_redraw ( ) ;
2016-10-12 14:19:00 +02:00
update_stations ( ctrl_conn ) ;
2012-08-05 21:27:52 +02:00
}
2008-02-28 02:34:43 +01:00
}
2011-10-28 22:37:34 +02:00
static void cli_event ( const char * str )
{
const char * start , * s ;
start = os_strchr ( str , ' > ' ) ;
if ( start = = NULL )
return ;
start + + ;
if ( str_starts ( start , WPA_EVENT_BSS_ADDED ) ) {
s = os_strchr ( start , ' ' ) ;
if ( s = = NULL )
return ;
s = os_strchr ( s + 1 , ' ' ) ;
if ( s = = NULL )
return ;
cli_txt_list_add ( & bsses , s + 1 ) ;
return ;
}
if ( str_starts ( start , WPA_EVENT_BSS_REMOVED ) ) {
s = os_strchr ( start , ' ' ) ;
if ( s = = NULL )
return ;
s = os_strchr ( s + 1 , ' ' ) ;
if ( s = = NULL )
return ;
cli_txt_list_del_addr ( & bsses , s + 1 ) ;
return ;
}
# ifdef CONFIG_P2P
if ( str_starts ( start , P2P_EVENT_DEVICE_FOUND ) ) {
s = os_strstr ( start , " p2p_dev_addr= " ) ;
if ( s = = NULL )
return ;
cli_txt_list_add_addr ( & p2p_peers , s + 14 ) ;
return ;
}
if ( str_starts ( start , P2P_EVENT_DEVICE_LOST ) ) {
s = os_strstr ( start , " p2p_dev_addr= " ) ;
if ( s = = NULL )
return ;
cli_txt_list_del_addr ( & p2p_peers , s + 14 ) ;
return ;
}
2011-10-28 22:59:13 +02:00
if ( str_starts ( start , P2P_EVENT_GROUP_STARTED ) ) {
s = os_strchr ( start , ' ' ) ;
if ( s = = NULL )
return ;
2015-03-27 11:03:28 +01:00
cli_txt_list_add_word ( & p2p_groups , s + 1 , ' ' ) ;
2011-10-28 22:59:13 +02:00
return ;
}
if ( str_starts ( start , P2P_EVENT_GROUP_REMOVED ) ) {
s = os_strchr ( start , ' ' ) ;
if ( s = = NULL )
return ;
2015-03-27 11:03:28 +01:00
cli_txt_list_del_word ( & p2p_groups , s + 1 , ' ' ) ;
2011-10-28 22:59:13 +02:00
return ;
}
2011-10-28 22:37:34 +02:00
# endif /* CONFIG_P2P */
}
2012-08-05 21:27:52 +02:00
static int check_terminating ( const char * msg )
{
const char * pos = msg ;
if ( * pos = = ' < ' ) {
/* skip priority */
pos = os_strchr ( pos , ' > ' ) ;
if ( pos )
pos + + ;
else
pos = msg ;
}
2016-08-06 11:44:51 +02:00
if ( str_starts ( pos , WPA_EVENT_TERMINATING ) & & ctrl_conn ) {
2012-08-05 21:27:52 +02:00
edit_clear_line ( ) ;
printf ( " \r Connection to wpa_supplicant lost - trying to "
" reconnect \n " ) ;
edit_redraw ( ) ;
wpa_cli_attached = 0 ;
wpa_cli_close_connection ( ) ;
return 1 ;
}
return 0 ;
}
2010-11-14 12:16:51 +01:00
static void wpa_cli_recv_pending ( struct wpa_ctrl * ctrl , int action_monitor )
2008-02-28 02:34:43 +01:00
{
if ( ctrl_conn = = NULL ) {
wpa_cli_reconnect ( ) ;
return ;
}
while ( wpa_ctrl_pending ( ctrl ) > 0 ) {
2014-09-26 14:26:43 +02:00
char buf [ 4096 ] ;
2008-02-28 02:34:43 +01:00
size_t len = sizeof ( buf ) - 1 ;
if ( wpa_ctrl_recv ( ctrl , buf , & len ) = = 0 ) {
buf [ len ] = ' \0 ' ;
if ( action_monitor )
wpa_cli_action_process ( buf ) ;
else {
2011-10-28 22:37:34 +02:00
cli_event ( buf ) ;
2010-07-18 23:30:24 +02:00
if ( wpa_cli_show_event ( buf ) ) {
2010-11-14 19:59:29 +01:00
edit_clear_line ( ) ;
2010-11-14 12:16:51 +01:00
printf ( " \r %s \n " , buf ) ;
2010-11-14 20:19:35 +01:00
edit_redraw ( ) ;
2010-07-18 23:30:24 +02:00
}
2012-08-05 21:27:52 +02:00
if ( interactive & & check_terminating ( buf ) > 0 )
return ;
2008-02-28 02:34:43 +01:00
}
} else {
printf ( " Could not read pending message. \n " ) ;
break ;
}
}
if ( wpa_ctrl_pending ( ctrl ) < 0 ) {
printf ( " Connection to wpa_supplicant lost - trying to "
" reconnect \n " ) ;
wpa_cli_reconnect ( ) ;
}
}
2010-11-14 10:30:19 +01:00
2010-11-14 12:16:51 +01:00
static void wpa_cli_ping ( void * eloop_ctx , void * timeout_ctx )
{
2014-09-26 14:23:00 +02:00
if ( ctrl_conn ) {
int res ;
char * prefix = ifname_prefix ;
ifname_prefix = NULL ;
res = _wpa_ctrl_command ( ctrl_conn , " PING " , 0 ) ;
ifname_prefix = prefix ;
if ( res ) {
printf ( " Connection to wpa_supplicant lost - trying to "
" reconnect \n " ) ;
wpa_cli_close_connection ( ) ;
}
2010-11-14 12:16:51 +01:00
}
if ( ! ctrl_conn )
wpa_cli_reconnect ( ) ;
eloop_register_timeout ( ping_interval , 0 , wpa_cli_ping , NULL , NULL ) ;
}
static void wpa_cli_mon_receive ( int sock , void * eloop_ctx , void * sock_ctx )
{
wpa_cli_recv_pending ( mon_conn , 0 ) ;
}
2010-11-14 19:59:29 +01:00
static void wpa_cli_edit_cmd_cb ( void * ctx , char * cmd )
2010-11-14 18:15:23 +01:00
{
char * argv [ max_args ] ;
int argc ;
2010-11-14 19:59:29 +01:00
argc = tokenize_cmd ( cmd , argv ) ;
2010-11-14 18:15:23 +01:00
if ( argc )
wpa_request ( ctrl_conn , argc , argv ) ;
}
2010-11-14 19:59:29 +01:00
static void wpa_cli_edit_eof_cb ( void * ctx )
2010-11-14 10:30:19 +01:00
{
2010-11-14 19:59:29 +01:00
eloop_terminate ( ) ;
2010-11-14 12:16:51 +01:00
}
2012-08-05 20:47:18 +02:00
static int warning_displayed = 0 ;
static char * hfile = NULL ;
static int edit_started = 0 ;
2010-11-14 18:15:23 +01:00
2012-08-05 20:47:18 +02:00
static void start_edit ( void )
{
char * home ;
2012-08-05 20:54:56 +02:00
char * ps = NULL ;
# ifdef CONFIG_CTRL_IFACE_UDP_REMOTE
ps = wpa_ctrl_get_remote_ifname ( ctrl_conn ) ;
# endif /* CONFIG_CTRL_IFACE_UDP_REMOTE */
2010-11-14 12:16:51 +01:00
2015-03-18 12:51:18 +01:00
# ifdef CONFIG_WPA_CLI_HISTORY_DIR
home = CONFIG_WPA_CLI_HISTORY_DIR ;
# else /* CONFIG_WPA_CLI_HISTORY_DIR */
2010-11-21 10:43:09 +01:00
home = getenv ( " HOME " ) ;
2015-03-18 12:51:18 +01:00
# endif /* CONFIG_WPA_CLI_HISTORY_DIR */
2010-11-21 10:43:09 +01:00
if ( home ) {
const char * fname = " .wpa_cli_history " ;
int hfile_len = os_strlen ( home ) + 1 + os_strlen ( fname ) + 1 ;
hfile = os_malloc ( hfile_len ) ;
if ( hfile )
os_snprintf ( hfile , hfile_len , " %s/%s " , home , fname ) ;
}
2012-08-05 20:47:18 +02:00
if ( edit_init ( wpa_cli_edit_cmd_cb , wpa_cli_edit_eof_cb ,
2012-08-05 20:54:56 +02:00
wpa_cli_edit_completion_cb , NULL , hfile , ps ) < 0 ) {
2012-08-05 20:47:18 +02:00
eloop_terminate ( ) ;
return ;
}
edit_started = 1 ;
2010-11-14 12:16:51 +01:00
eloop_register_timeout ( ping_interval , 0 , wpa_cli_ping , NULL , NULL ) ;
2012-08-05 20:47:18 +02:00
}
2013-05-05 11:38:55 +02:00
static void update_bssid_list ( struct wpa_ctrl * ctrl )
{
char buf [ 4096 ] ;
size_t len = sizeof ( buf ) ;
int ret ;
2016-10-16 11:21:25 +02:00
const char * cmd = " BSS RANGE=ALL MASK=0x2 " ;
2013-05-05 11:38:55 +02:00
char * pos , * end ;
if ( ctrl = = NULL )
return ;
ret = wpa_ctrl_request ( ctrl , cmd , os_strlen ( cmd ) , buf , & len , NULL ) ;
if ( ret < 0 )
return ;
buf [ len ] = ' \0 ' ;
pos = buf ;
while ( pos ) {
pos = os_strstr ( pos , " bssid= " ) ;
if ( pos = = NULL )
break ;
pos + = 6 ;
end = os_strchr ( pos , ' \n ' ) ;
if ( end = = NULL )
break ;
* end = ' \0 ' ;
cli_txt_list_add ( & bsses , pos ) ;
pos = end + 1 ;
}
}
2013-05-23 19:35:02 +02:00
static void update_ifnames ( struct wpa_ctrl * ctrl )
{
char buf [ 4096 ] ;
size_t len = sizeof ( buf ) ;
int ret ;
2016-10-16 11:21:25 +02:00
const char * cmd = " INTERFACES " ;
2013-05-23 19:35:02 +02:00
char * pos , * end ;
char txt [ 200 ] ;
cli_txt_list_flush ( & ifnames ) ;
if ( ctrl = = NULL )
return ;
ret = wpa_ctrl_request ( ctrl , cmd , os_strlen ( cmd ) , buf , & len , NULL ) ;
if ( ret < 0 )
return ;
buf [ len ] = ' \0 ' ;
pos = buf ;
while ( pos ) {
end = os_strchr ( pos , ' \n ' ) ;
if ( end = = NULL )
break ;
* end = ' \0 ' ;
ret = os_snprintf ( txt , sizeof ( txt ) , " ifname=%s " , pos ) ;
2014-12-07 11:15:34 +01:00
if ( ! os_snprintf_error ( sizeof ( txt ) , ret ) )
2013-05-23 19:35:02 +02:00
cli_txt_list_add ( & ifnames , txt ) ;
pos = end + 1 ;
}
}
2015-03-24 17:10:37 +01:00
static void update_networks ( struct wpa_ctrl * ctrl )
{
char buf [ 4096 ] ;
size_t len = sizeof ( buf ) ;
int ret ;
2016-10-16 11:21:25 +02:00
const char * cmd = " LIST_NETWORKS " ;
2015-03-24 17:10:37 +01:00
char * pos , * end ;
int header = 1 ;
cli_txt_list_flush ( & networks ) ;
if ( ctrl = = NULL )
return ;
ret = wpa_ctrl_request ( ctrl , cmd , os_strlen ( cmd ) , buf , & len , NULL ) ;
if ( ret < 0 )
return ;
buf [ len ] = ' \0 ' ;
pos = buf ;
while ( pos ) {
end = os_strchr ( pos , ' \n ' ) ;
if ( end = = NULL )
break ;
* end = ' \0 ' ;
if ( ! header )
2015-03-27 11:03:28 +01:00
cli_txt_list_add_word ( & networks , pos , ' \t ' ) ;
2015-03-24 17:10:37 +01:00
header = 0 ;
pos = end + 1 ;
}
}
2016-10-12 14:19:00 +02:00
static void update_stations ( struct wpa_ctrl * ctrl )
{
# ifdef CONFIG_AP
char addr [ 32 ] , cmd [ 64 ] ;
if ( ! ctrl | | ! interactive )
return ;
cli_txt_list_flush ( & stations ) ;
if ( wpa_ctrl_command_sta ( ctrl , " STA-FIRST " , addr , sizeof ( addr ) , 0 ) )
return ;
do {
if ( os_strcmp ( addr , " " ) ! = 0 )
cli_txt_list_add ( & stations , addr ) ;
os_snprintf ( cmd , sizeof ( cmd ) , " STA-NEXT %s " , addr ) ;
} while ( wpa_ctrl_command_sta ( ctrl , cmd , addr , sizeof ( addr ) , 0 ) = = 0 ) ;
# endif /* CONFIG_AP */
}
2012-08-05 20:47:18 +02:00
static void try_connection ( void * eloop_ctx , void * timeout_ctx )
{
2013-05-18 10:40:23 +02:00
if ( ctrl_conn )
goto done ;
2012-08-05 21:04:22 +02:00
if ( ctrl_ifname = = NULL )
ctrl_ifname = wpa_cli_get_default_ifname ( ) ;
2016-02-16 14:52:08 +01:00
if ( wpa_cli_open_connection ( ctrl_ifname , 1 ) ) {
2012-08-05 20:47:18 +02:00
if ( ! warning_displayed ) {
printf ( " Could not connect to wpa_supplicant: "
2015-01-19 05:57:30 +01:00
" %s - re-trying \n " ,
ctrl_ifname ? ctrl_ifname : " (nil) " ) ;
2012-08-05 20:47:18 +02:00
warning_displayed = 1 ;
}
eloop_register_timeout ( 1 , 0 , try_connection , NULL , NULL ) ;
return ;
}
2013-05-05 11:38:55 +02:00
update_bssid_list ( ctrl_conn ) ;
2015-03-24 17:10:37 +01:00
update_networks ( ctrl_conn ) ;
2016-10-12 14:19:00 +02:00
update_stations ( ctrl_conn ) ;
2013-05-05 11:38:55 +02:00
2012-08-05 20:47:18 +02:00
if ( warning_displayed )
printf ( " Connection established. \n " ) ;
2013-05-18 10:40:23 +02:00
done :
2012-08-05 20:47:18 +02:00
start_edit ( ) ;
}
2010-11-14 12:16:51 +01:00
2012-08-05 20:47:18 +02:00
static void wpa_cli_interactive ( void )
{
printf ( " \n Interactive mode \n \n " ) ;
eloop_register_timeout ( 0 , 0 , try_connection , NULL , NULL ) ;
2010-11-14 12:16:51 +01:00
eloop_run ( ) ;
2012-08-05 20:47:18 +02:00
eloop_cancel_timeout ( try_connection , NULL , NULL ) ;
2010-11-14 12:16:51 +01:00
2011-10-28 22:37:34 +02:00
cli_txt_list_flush ( & p2p_peers ) ;
2011-10-28 22:59:13 +02:00
cli_txt_list_flush ( & p2p_groups ) ;
2011-10-28 22:37:34 +02:00
cli_txt_list_flush ( & bsses ) ;
2013-05-23 19:35:02 +02:00
cli_txt_list_flush ( & ifnames ) ;
2015-03-24 17:10:37 +01:00
cli_txt_list_flush ( & networks ) ;
2012-08-05 20:47:18 +02:00
if ( edit_started )
edit_deinit ( hfile , wpa_cli_edit_filter_history_cb ) ;
2010-11-21 10:43:09 +01:00
os_free ( hfile ) ;
2010-11-14 12:16:51 +01:00
eloop_cancel_timeout ( wpa_cli_ping , NULL , NULL ) ;
wpa_cli_close_connection ( ) ;
2010-11-14 10:30:19 +01:00
}
2008-02-28 02:34:43 +01:00
2015-06-18 12:48:21 +02:00
static void wpa_cli_action_ping ( void * eloop_ctx , void * timeout_ctx )
{
struct wpa_ctrl * ctrl = eloop_ctx ;
char buf [ 256 ] ;
size_t len ;
/* verify that connection is still working */
len = sizeof ( buf ) - 1 ;
if ( wpa_ctrl_request ( ctrl , " PING " , 4 , buf , & len ,
wpa_cli_action_cb ) < 0 | |
len < 4 | | os_memcmp ( buf , " PONG " , 4 ) ! = 0 ) {
printf ( " wpa_supplicant did not reply to PING command - exiting \n " ) ;
eloop_terminate ( ) ;
return ;
}
eloop_register_timeout ( ping_interval , 0 , wpa_cli_action_ping ,
ctrl , NULL ) ;
}
static void wpa_cli_action_receive ( int sock , void * eloop_ctx , void * sock_ctx )
{
struct wpa_ctrl * ctrl = eloop_ctx ;
wpa_cli_recv_pending ( ctrl , 1 ) ;
}
2008-02-28 02:34:43 +01:00
static void wpa_cli_action ( struct wpa_ctrl * ctrl )
{
# ifdef CONFIG_ANSI_C_EXTRA
/* TODO: ANSI C version(?) */
printf ( " Action processing not supported in ANSI C build. \n " ) ;
# else /* CONFIG_ANSI_C_EXTRA */
2015-06-18 12:48:21 +02:00
int fd ;
2008-02-28 02:34:43 +01:00
fd = wpa_ctrl_get_fd ( ctrl ) ;
2015-06-18 12:48:21 +02:00
eloop_register_timeout ( ping_interval , 0 , wpa_cli_action_ping ,
ctrl , NULL ) ;
eloop_register_read_sock ( fd , wpa_cli_action_receive , ctrl , NULL ) ;
eloop_run ( ) ;
eloop_cancel_timeout ( wpa_cli_action_ping , ctrl , NULL ) ;
eloop_unregister_read_sock ( fd ) ;
2008-02-28 02:34:43 +01:00
# endif /* CONFIG_ANSI_C_EXTRA */
}
static void wpa_cli_cleanup ( void )
{
wpa_cli_close_connection ( ) ;
if ( pid_file )
os_daemonize_terminate ( pid_file ) ;
os_program_deinit ( ) ;
}
2012-08-05 20:47:18 +02:00
static void wpa_cli_terminate ( int sig , void * ctx )
2008-02-28 02:34:43 +01:00
{
2012-08-05 20:47:18 +02:00
eloop_terminate ( ) ;
2008-02-28 02:34:43 +01:00
}
static char * wpa_cli_get_default_ifname ( void )
{
char * ifname = NULL ;
2015-07-13 17:31:21 +02:00
# ifdef ANDROID
char ifprop [ PROPERTY_VALUE_MAX ] ;
if ( property_get ( " wifi.interface " , ifprop , NULL ) ! = 0 ) {
ifname = os_strdup ( ifprop ) ;
printf ( " Using interface '%s' \n " , ifname ? ifname : " N/A " ) ;
}
# else /* ANDROID */
2008-02-28 02:34:43 +01:00
# ifdef CONFIG_CTRL_IFACE_UNIX
struct dirent * dent ;
DIR * dir = opendir ( ctrl_iface_dir ) ;
2011-03-15 14:18:07 +01:00
if ( ! dir ) {
2008-02-28 02:34:43 +01:00
return NULL ;
2011-03-15 14:18:07 +01:00
}
2008-02-28 02:34:43 +01:00
while ( ( dent = readdir ( dir ) ) ) {
# ifdef _DIRENT_HAVE_D_TYPE
/*
* Skip the file if it is not a socket . Also accept
* DT_UNKNOWN ( 0 ) in case the C library or underlying
* file system does not support d_type .
*/
if ( dent - > d_type ! = DT_SOCK & & dent - > d_type ! = DT_UNKNOWN )
continue ;
# endif /* _DIRENT_HAVE_D_TYPE */
if ( os_strcmp ( dent - > d_name , " . " ) = = 0 | |
os_strcmp ( dent - > d_name , " .. " ) = = 0 )
continue ;
printf ( " Selected interface '%s' \n " , dent - > d_name ) ;
ifname = os_strdup ( dent - > d_name ) ;
break ;
}
closedir ( dir ) ;
# endif /* CONFIG_CTRL_IFACE_UNIX */
# ifdef CONFIG_CTRL_IFACE_NAMED_PIPE
2011-08-30 20:10:13 +02:00
char buf [ 4096 ] , * pos ;
2008-02-28 02:34:43 +01:00
size_t len ;
struct wpa_ctrl * ctrl ;
int ret ;
ctrl = wpa_ctrl_open ( NULL ) ;
if ( ctrl = = NULL )
return NULL ;
len = sizeof ( buf ) - 1 ;
ret = wpa_ctrl_request ( ctrl , " INTERFACES " , 10 , buf , & len , NULL ) ;
if ( ret > = 0 ) {
buf [ len ] = ' \0 ' ;
pos = os_strchr ( buf , ' \n ' ) ;
if ( pos )
* pos = ' \0 ' ;
ifname = os_strdup ( buf ) ;
}
wpa_ctrl_close ( ctrl ) ;
# endif /* CONFIG_CTRL_IFACE_NAMED_PIPE */
2015-07-13 17:31:21 +02:00
# endif /* ANDROID */
2008-02-28 02:34:43 +01:00
return ifname ;
}
int main ( int argc , char * argv [ ] )
{
int c ;
int daemonize = 0 ;
int ret = 0 ;
const char * global = NULL ;
if ( os_program_init ( ) )
return - 1 ;
for ( ; ; ) {
2015-08-25 06:34:03 +02:00
c = getopt ( argc , argv , " a:Bg:G:hi:p:P:s:v " ) ;
2008-02-28 02:34:43 +01:00
if ( c < 0 )
break ;
switch ( c ) {
case ' a ' :
action_file = optarg ;
break ;
case ' B ' :
daemonize = 1 ;
break ;
case ' g ' :
global = optarg ;
break ;
2009-01-20 20:12:00 +01:00
case ' G ' :
ping_interval = atoi ( optarg ) ;
break ;
2008-02-28 02:34:43 +01:00
case ' h ' :
usage ( ) ;
return 0 ;
case ' v ' :
printf ( " %s \n " , wpa_cli_version ) ;
return 0 ;
case ' i ' :
os_free ( ctrl_ifname ) ;
ctrl_ifname = os_strdup ( optarg ) ;
break ;
case ' p ' :
ctrl_iface_dir = optarg ;
break ;
case ' P ' :
pid_file = optarg ;
break ;
2015-08-25 06:34:03 +02:00
case ' s ' :
client_socket_dir = optarg ;
break ;
2008-02-28 02:34:43 +01:00
default :
usage ( ) ;
return - 1 ;
}
}
interactive = ( argc = = optind ) & & ( action_file = = NULL ) ;
if ( interactive )
2016-07-07 14:04:38 +02:00
printf ( " %s \n \n %s \n \n " , wpa_cli_version , cli_license ) ;
2008-02-28 02:34:43 +01:00
2010-11-14 12:16:51 +01:00
if ( eloop_init ( ) )
return - 1 ;
2008-02-28 02:34:43 +01:00
if ( global ) {
# ifdef CONFIG_CTRL_IFACE_NAMED_PIPE
ctrl_conn = wpa_ctrl_open ( NULL ) ;
# else /* CONFIG_CTRL_IFACE_NAMED_PIPE */
ctrl_conn = wpa_ctrl_open ( global ) ;
# endif /* CONFIG_CTRL_IFACE_NAMED_PIPE */
if ( ctrl_conn = = NULL ) {
2012-04-06 11:15:30 +02:00
fprintf ( stderr , " Failed to connect to wpa_supplicant "
" global interface: %s error: %s \n " ,
global , strerror ( errno ) ) ;
2008-02-28 02:34:43 +01:00
return - 1 ;
}
2013-05-18 13:07:28 +02:00
if ( interactive ) {
2013-05-23 19:35:02 +02:00
update_ifnames ( ctrl_conn ) ;
2013-05-18 13:07:28 +02:00
mon_conn = wpa_ctrl_open ( global ) ;
if ( mon_conn ) {
if ( wpa_ctrl_attach ( mon_conn ) = = 0 ) {
wpa_cli_attached = 1 ;
eloop_register_read_sock (
wpa_ctrl_get_fd ( mon_conn ) ,
wpa_cli_mon_receive ,
NULL , NULL ) ;
} else {
printf ( " Failed to open monitor "
" connection through global "
" control interface \n " ) ;
}
}
2016-10-12 14:19:00 +02:00
update_stations ( ctrl_conn ) ;
2013-05-18 13:07:28 +02:00
}
2008-02-28 02:34:43 +01:00
}
2012-08-05 20:47:18 +02:00
eloop_register_signal_terminate ( wpa_cli_terminate , NULL ) ;
2008-02-28 02:34:43 +01:00
2010-02-13 20:37:35 +01:00
if ( ctrl_ifname = = NULL )
ctrl_ifname = wpa_cli_get_default_ifname ( ) ;
if ( interactive ) {
2012-08-05 20:47:18 +02:00
wpa_cli_interactive ( ) ;
2010-02-13 20:37:35 +01:00
} else {
if ( ! global & &
wpa_cli_open_connection ( ctrl_ifname , 0 ) < 0 ) {
2012-04-06 11:15:30 +02:00
fprintf ( stderr , " Failed to connect to non-global "
" ctrl_ifname: %s error: %s \n " ,
2015-01-19 05:57:30 +01:00
ctrl_ifname ? ctrl_ifname : " (nil) " ,
strerror ( errno ) ) ;
2010-02-13 20:37:35 +01:00
return - 1 ;
}
if ( action_file ) {
if ( wpa_ctrl_attach ( ctrl_conn ) = = 0 ) {
wpa_cli_attached = 1 ;
} else {
printf ( " Warning: Failed to attach to "
" wpa_supplicant. \n " ) ;
2008-02-28 02:34:43 +01:00
return - 1 ;
2010-02-13 20:37:35 +01:00
}
2008-02-28 02:34:43 +01:00
}
2016-01-22 21:28:25 +01:00
if ( daemonize & & os_daemonize ( pid_file ) & & eloop_sock_requeue ( ) )
2012-08-05 20:47:18 +02:00
return - 1 ;
2008-02-28 02:34:43 +01:00
2012-08-05 20:47:18 +02:00
if ( action_file )
wpa_cli_action ( ctrl_conn ) ;
else
ret = wpa_request ( ctrl_conn , argc - optind ,
& argv [ optind ] ) ;
}
2008-02-28 02:34:43 +01:00
os_free ( ctrl_ifname ) ;
2010-11-14 12:16:51 +01:00
eloop_destroy ( ) ;
2008-02-28 02:34:43 +01:00
wpa_cli_cleanup ( ) ;
return ret ;
}
# else /* CONFIG_CTRL_IFACE */
int main ( int argc , char * argv [ ] )
{
printf ( " CONFIG_CTRL_IFACE not defined - wpa_cli disabled \n " ) ;
return - 1 ;
}
# endif /* CONFIG_CTRL_IFACE */