1845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project/*
2845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project * WPA Supplicant - command line interface for wpa_supplicant daemon
3845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project * Copyright (c) 2004-2008, Jouni Malinen <j@w1.fi>
4845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project *
5845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project * This program is free software; you can redistribute it and/or modify
6845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project * it under the terms of the GNU General Public License version 2 as
7845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project * published by the Free Software Foundation.
8845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project *
9845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project * Alternatively, this software may be distributed under the terms of BSD
10845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project * license.
11845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project *
12845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project * See README and COPYING for more details.
13845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project */
14845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
15845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#include "includes.h"
16845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
17845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#ifdef CONFIG_CTRL_IFACE
18845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
19845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#ifdef CONFIG_CTRL_IFACE_UNIX
20845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#include <dirent.h>
21845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#endif /* CONFIG_CTRL_IFACE_UNIX */
22845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#ifdef CONFIG_READLINE
23845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#include <readline/readline.h>
24845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#include <readline/history.h>
25845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#endif /* CONFIG_READLINE */
26845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
27845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#define CTRL_INTERFACE_2_SOCKETS
28845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
29845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#include "wpa_ctrl.h"
30845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#include "common.h"
31845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#include "version.h"
32845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#ifdef ANDROID
33845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#include <cutils/properties.h>
34845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#endif
35845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
36845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic const char *wpa_cli_version =
37845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"wpa_cli v" VERSION_STR "\n"
38845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"Copyright (c) 2004-2008, Jouni Malinen <j@w1.fi> and contributors";
39845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
40845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
41845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic const char *wpa_cli_license =
42845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"This program is free software. You can distribute it and/or modify it\n"
43845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"under the terms of the GNU General Public License version 2.\n"
44845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"\n"
45845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"Alternatively, this software may be distributed under the terms of the\n"
46845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"BSD license. See README and COPYING for more details.\n";
47845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
48845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic const char *wpa_cli_full_license =
49845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"This program is free software; you can redistribute it and/or modify\n"
50845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"it under the terms of the GNU General Public License version 2 as\n"
51845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"published by the Free Software Foundation.\n"
52845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"\n"
53845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"This program is distributed in the hope that it will be useful,\n"
54845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
55845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
56845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"GNU General Public License for more details.\n"
57845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"\n"
58845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"You should have received a copy of the GNU General Public License\n"
59845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"along with this program; if not, write to the Free Software\n"
60845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\n"
61845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"\n"
62845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"Alternatively, this software may be distributed under the terms of the\n"
63845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"BSD license.\n"
64845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"\n"
65845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"Redistribution and use in source and binary forms, with or without\n"
66845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"modification, are permitted provided that the following conditions are\n"
67845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"met:\n"
68845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"\n"
69845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"1. Redistributions of source code must retain the above copyright\n"
70845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"   notice, this list of conditions and the following disclaimer.\n"
71845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"\n"
72845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"2. Redistributions in binary form must reproduce the above copyright\n"
73845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"   notice, this list of conditions and the following disclaimer in the\n"
74845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"   documentation and/or other materials provided with the distribution.\n"
75845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"\n"
76845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"3. Neither the name(s) of the above-listed copyright holder(s) nor the\n"
77845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"   names of its contributors may be used to endorse or promote products\n"
78845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"   derived from this software without specific prior written permission.\n"
79845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"\n"
80845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n"
81845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n"
82845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n"
83845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n"
84845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n"
85845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n"
86845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n"
87845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n"
88845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n"
89845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n"
90845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
91845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"\n";
92845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
93845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic const char *commands_help =
94845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"commands:\n"
95845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"  status [verbose] = get current WPA/EAPOL/EAP status\n"
96845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"  mib = get MIB variables (dot1x, dot11)\n"
97845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"  help = show this usage help\n"
98845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"  interface [ifname] = show interfaces/select interface\n"
99845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"  level <debug level> = change debug level\n"
100845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"  license = show full wpa_cli license\n"
101845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"  logoff = IEEE 802.1X EAPOL state machine logoff\n"
102845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"  logon = IEEE 802.1X EAPOL state machine logon\n"
103845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"  set = set variables (shows list of variables when run without arguments)\n"
104845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"  pmksa = show PMKSA cache\n"
105845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"  reassociate = force reassociation\n"
106845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"  reconfigure = force wpa_supplicant to re-read its configuration file\n"
107845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"  preauthenticate <BSSID> = force preauthentication\n"
108845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"  identity <network id> <identity> = configure identity for an SSID\n"
109845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"  password <network id> <password> = configure password for an SSID\n"
110845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"  new_password <network id> <password> = change password for an SSID\n"
111845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"  pin <network id> <pin> = configure pin for an SSID\n"
112845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"  otp <network id> <password> = configure one-time-password for an SSID\n"
113845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"  passphrase <network id> <passphrase> = configure private key passphrase\n"
114845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"    for an SSID\n"
115845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"  bssid <network id> <BSSID> = set preferred BSSID for an SSID\n"
116845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"  blacklist [<BSSID>] = add a BSSID to the blacklist\n"
117845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"  blacklist clear = clear the blacklist\n"
118845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"  blacklist = display the blacklist\n"
119845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"  list_networks = list configured networks\n"
120845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"  select_network <network id> = select a network (disable others)\n"
121845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"  enable_network <network id> = enable a network\n"
122845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"  disable_network <network id> = disable a network\n"
123845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"  add_network = add a network\n"
124845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"  remove_network <network id> = remove a network\n"
125845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"  set_network <network id> <variable> <value> = set network variables "
126845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"(shows\n"
127845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"    list of variables when run without arguments)\n"
128845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"  get_network <network id> <variable> = get network variables\n"
129845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"  save_config = save the current configuration\n"
130845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"  disconnect = disconnect and wait for reassociate/reconnect command before\n "
131845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"    connecting\n"
132845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"  reconnect = like reassociate, but only takes effect if already "
133845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"disconnected\n"
134845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"  scan = request new BSS scan\n"
135845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"  scan_results = get latest scan results\n"
136845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"  get_capability <eap/pairwise/group/key_mgmt/proto/auth_alg> = "
137845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"get capabilies\n"
138845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"  ap_scan <value> = set ap_scan parameter\n"
139845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"  stkstart <addr> = request STK negotiation with <addr>\n"
140845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"  terminate = terminate wpa_supplicant\n"
141845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project"  quit = exit wpa_cli\n";
142845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
143845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic struct wpa_ctrl *ctrl_conn;
144845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic struct wpa_ctrl *monitor_conn;
145845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic int wpa_cli_quit = 0;
146845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic int wpa_cli_attached = 0;
147845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic int wpa_cli_connected = 0;
148845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic int wpa_cli_last_id = 0;
149845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#ifdef ANDROID
150845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic const char *ctrl_iface_dir = "/data/misc/wifi/wpa_supplicant";
151845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#else
152845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic const char *ctrl_iface_dir = "/tmp/run/wpa_supplicant";
153845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#endif
154845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic char *ctrl_ifname = NULL;
155845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic const char *pid_file = NULL;
156845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic const char *action_file = NULL;
157845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
158845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
159845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic void usage(void)
160845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{
161845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	printf("wpa_cli [-p<path to ctrl sockets>] [-i<ifname>] [-hvB] "
162845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	       "[-a<action file>] \\\n"
163845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	       "        [-P<pid file>] [-g<global ctrl>]  [command..]\n"
164845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	       "  -h = help (show this usage text)\n"
165845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	       "  -v = shown version information\n"
166845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	       "  -a = run in daemon mode executing the action file based on "
167845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	       "events from\n"
168845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	       "       wpa_supplicant\n"
169845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	       "  -B = run a daemon in the background\n"
170845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	       "  default path: /var/run/wpa_supplicant\n"
171845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	       "  default interface: first interface found in socket path\n"
172845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	       "%s",
173845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	       commands_help);
174845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project}
175845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
176845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
177845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic struct wpa_ctrl * wpa_cli_open_connection(const char *ifname)
178845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{
179845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project    struct wpa_ctrl *cur_conn;
180845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#if defined(CONFIG_CTRL_IFACE_UDP) || defined(CONFIG_CTRL_IFACE_NAMED_PIPE)
181845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	cur_conn = wpa_ctrl_open(ifname);
182845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	return cur_conn;
183845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#else /* CONFIG_CTRL_IFACE_UDP || CONFIG_CTRL_IFACE_NAMED_PIPE */
184845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	char *cfile;
185845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	int flen;
186845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
187845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	if (ifname == NULL)
188845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		return NULL;
189845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
190845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#ifdef ANDROID
191845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	if (access(ctrl_iface_dir, F_OK) < 0)
192845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		cfile = (char *)ifname;
193845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	else {
194845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#endif
195845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	flen = os_strlen(ctrl_iface_dir) + os_strlen(ifname) + 2;
196845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	cfile = os_malloc(flen);
197845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	if (cfile == NULL)
198845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		return NULL;
199845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	os_snprintf(cfile, flen, "%s/%s", ctrl_iface_dir, ifname);
200845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#ifdef ANDROID
201845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project        }
202845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#endif
203845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
204845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	cur_conn = wpa_ctrl_open(cfile); /* Dm: */
205845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#ifdef CTRL_INTERFACE_2_SOCKETS
206845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	monitor_conn = wpa_ctrl_open(cfile);
207845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#else
208845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	monitor_conn = cur_conn;
209845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#endif
210845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#ifdef ANDROID
211845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	if (cfile != ifname)
212845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#endif
213845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		os_free(cfile);
214845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	return cur_conn;
215845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#endif /* CONFIG_CTRL_IFACE_UDP || CONFIG_CTRL_IFACE_NAMED_PIPE */
216845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project}
217845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
218845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
219845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic void wpa_cli_close_connection(void)
220845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{
221845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	if (ctrl_conn == NULL)
222845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		return;
223845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
224845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	if (wpa_cli_attached) {
225845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		wpa_ctrl_detach(monitor_conn);
226845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		wpa_cli_attached = 0;
227845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	}
228845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#ifdef CTRL_INTERFACE_2_SOCKETS
229845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	wpa_ctrl_close(monitor_conn);
230845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#endif
231845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	wpa_ctrl_close(ctrl_conn);
232845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	ctrl_conn = monitor_conn = NULL;
233845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project}
234845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
235845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
236845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic void wpa_cli_msg_cb(char *msg, size_t len)
237845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{
238845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	printf("%s\n", msg);
239845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project}
240845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
241845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
242845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic int _wpa_ctrl_command(struct wpa_ctrl *ctrl, char *cmd, int print)
243845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{
244845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	char buf[4096];
245845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	size_t len;
246845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	int ret;
247845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
248845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	if (ctrl_conn == NULL) {
249845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		printf("Not connected to wpa_supplicant - command dropped.\n");
250845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		return -1;
251845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	}
252845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	len = sizeof(buf) - 1;
253845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	ret = wpa_ctrl_request(ctrl, cmd, os_strlen(cmd), buf, &len,
254845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			       wpa_cli_msg_cb);
255845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	if (ret == -2) {
256845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		printf("'%s' command timed out.\n", cmd);
257845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		return -2;
258845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	} else if (ret < 0) {
259845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		printf("'%s' command failed.\n", cmd);
260845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		return -1;
261845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	}
262845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	if (print) {
263845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		buf[len] = '\0';
264845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		printf("%s", buf);
265845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	}
266845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	return 0;
267845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project}
268845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
269845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
270845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic int wpa_ctrl_command(struct wpa_ctrl *ctrl, char *cmd)
271845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{
272845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	return _wpa_ctrl_command(ctrl, cmd, 1);
273845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project}
274845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
275845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
276845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic int wpa_cli_cmd_status(struct wpa_ctrl *ctrl, int argc, char *argv[])
277845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{
278845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	int verbose = argc > 0 && os_strcmp(argv[0], "verbose") == 0;
279845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	return wpa_ctrl_command(ctrl, verbose ? "STATUS-VERBOSE" : "STATUS");
280845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project}
281845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
282845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
283845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic int wpa_cli_cmd_ping(struct wpa_ctrl *ctrl, int argc, char *argv[])
284845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{
285845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	return wpa_ctrl_command(ctrl, "PING");
286845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project}
287845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
288845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
289845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic int wpa_cli_cmd_mib(struct wpa_ctrl *ctrl, int argc, char *argv[])
290845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{
291845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	return wpa_ctrl_command(ctrl, "MIB");
292845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project}
293845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
294845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
295845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic int wpa_cli_cmd_pmksa(struct wpa_ctrl *ctrl, int argc, char *argv[])
296845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{
297845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	return wpa_ctrl_command(ctrl, "PMKSA");
298845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project}
299845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
300845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
301845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic int wpa_cli_cmd_help(struct wpa_ctrl *ctrl, int argc, char *argv[])
302845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{
303845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	printf("%s", commands_help);
304845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	return 0;
305845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project}
306845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
307845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
308845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic int wpa_cli_cmd_license(struct wpa_ctrl *ctrl, int argc, char *argv[])
309845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{
310845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	printf("%s\n\n%s\n", wpa_cli_version, wpa_cli_full_license);
311845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	return 0;
312845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project}
313845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
314845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
315845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic int wpa_cli_cmd_quit(struct wpa_ctrl *ctrl, int argc, char *argv[])
316845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{
317845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	wpa_cli_quit = 1;
318845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	return 0;
319845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project}
320845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
321845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
322845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic void wpa_cli_show_variables(void)
323845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{
324845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	printf("set variables:\n"
325845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	       "  EAPOL::heldPeriod (EAPOL state machine held period, "
326845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	       "in seconds)\n"
327845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	       "  EAPOL::authPeriod (EAPOL state machine authentication "
328845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	       "period, in seconds)\n"
329845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	       "  EAPOL::startPeriod (EAPOL state machine start period, in "
330845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	       "seconds)\n"
331845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	       "  EAPOL::maxStart (EAPOL state machine maximum start "
332845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	       "attempts)\n");
333845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	printf("  dot11RSNAConfigPMKLifetime (WPA/WPA2 PMK lifetime in "
334845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	       "seconds)\n"
335845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	       "  dot11RSNAConfigPMKReauthThreshold (WPA/WPA2 reauthentication"
336845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	       " threshold\n\tpercentage)\n"
337845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	       "  dot11RSNAConfigSATimeout (WPA/WPA2 timeout for completing "
338845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	       "security\n\tassociation in seconds)\n");
339845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project}
340845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
341845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
342845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic int wpa_cli_cmd_set(struct wpa_ctrl *ctrl, int argc, char *argv[])
343845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{
344845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	char cmd[256];
345845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	int res;
346845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
347845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	if (argc == 0) {
348845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		wpa_cli_show_variables();
349845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		return 0;
350845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	}
351845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
352845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	if (argc != 2) {
353845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		printf("Invalid SET command: needs two arguments (variable "
354845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		       "name and value)\n");
355845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		return -1;
356845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	}
357845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
358845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	res = os_snprintf(cmd, sizeof(cmd), "SET %s %s", argv[0], argv[1]);
359845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
360845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		printf("Too long SET command.\n");
361845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		return -1;
362845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	}
363845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	return wpa_ctrl_command(ctrl, cmd);
364845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project}
365845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
366845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
367845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic int wpa_cli_cmd_logoff(struct wpa_ctrl *ctrl, int argc, char *argv[])
368845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{
369845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	return wpa_ctrl_command(ctrl, "LOGOFF");
370845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project}
371845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
372845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
373845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic int wpa_cli_cmd_logon(struct wpa_ctrl *ctrl, int argc, char *argv[])
374845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{
375845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	return wpa_ctrl_command(ctrl, "LOGON");
376845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project}
377845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
378845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
379845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic int wpa_cli_cmd_reassociate(struct wpa_ctrl *ctrl, int argc,
380845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project				   char *argv[])
381845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{
382845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	return wpa_ctrl_command(ctrl, "REASSOCIATE");
383845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project}
384845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
385845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
386845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic int wpa_cli_cmd_preauthenticate(struct wpa_ctrl *ctrl, int argc,
387845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project				       char *argv[])
388845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{
389845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	char cmd[256];
390845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	int res;
391845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
392845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	if (argc != 1) {
393845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		printf("Invalid PREAUTH command: needs one argument "
394845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		       "(BSSID)\n");
395845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		return -1;
396845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	}
397845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
398845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	res = os_snprintf(cmd, sizeof(cmd), "PREAUTH %s", argv[0]);
399845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
400845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		printf("Too long PREAUTH command.\n");
401845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		return -1;
402845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	}
403845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	return wpa_ctrl_command(ctrl, cmd);
404845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project}
405845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
406845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
407845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic int wpa_cli_cmd_ap_scan(struct wpa_ctrl *ctrl, int argc, char *argv[])
408845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{
409845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	char cmd[256];
410845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	int res;
411845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
412845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	if (argc != 1) {
413845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		printf("Invalid AP_SCAN command: needs one argument (ap_scan "
414845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		       "value)\n");
415845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		return -1;
416845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	}
417845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	res = os_snprintf(cmd, sizeof(cmd), "AP_SCAN %s", argv[0]);
418845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
419845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		printf("Too long AP_SCAN command.\n");
420845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		return -1;
421845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	}
422845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	return wpa_ctrl_command(ctrl, cmd);
423845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project}
424845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
425845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
426845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic int wpa_cli_cmd_stkstart(struct wpa_ctrl *ctrl, int argc,
427845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project				char *argv[])
428845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{
429845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	char cmd[256];
430845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	int res;
431845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
432845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	if (argc != 1) {
433845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		printf("Invalid STKSTART command: needs one argument "
434845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		       "(Peer STA MAC address)\n");
435845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		return -1;
436845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	}
437845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
438845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	res = os_snprintf(cmd, sizeof(cmd), "STKSTART %s", argv[0]);
439845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
440845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		printf("Too long STKSTART command.\n");
441845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		return -1;
442845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	}
443845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	return wpa_ctrl_command(ctrl, cmd);
444845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project}
445845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
446845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
447845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic int wpa_cli_cmd_level(struct wpa_ctrl *ctrl, int argc, char *argv[])
448845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{
449845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	char cmd[256];
450845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	int res;
451845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
452845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	if (argc != 1) {
453845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		printf("Invalid LEVEL command: needs one argument (debug "
454845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		       "level)\n");
455845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		return -1;
456845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	}
457845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	res = os_snprintf(cmd, sizeof(cmd), "LEVEL %s", argv[0]);
458845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
459845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		printf("Too long LEVEL command.\n");
460845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		return -1;
461845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	}
462845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	return wpa_ctrl_command(ctrl, cmd);
463845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project}
464845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
465845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
466845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic int wpa_cli_cmd_identity(struct wpa_ctrl *ctrl, int argc, char *argv[])
467845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{
468845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	char cmd[256], *pos, *end;
469845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	int i, ret;
470845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
471845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	if (argc < 2) {
472845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		printf("Invalid IDENTITY command: needs two arguments "
473845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		       "(network id and identity)\n");
474845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		return -1;
475845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	}
476845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
477845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	end = cmd + sizeof(cmd);
478845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	pos = cmd;
479845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	ret = os_snprintf(pos, end - pos, WPA_CTRL_RSP "IDENTITY-%s:%s",
480845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			  argv[0], argv[1]);
481845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	if (ret < 0 || ret >= end - pos) {
482845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		printf("Too long IDENTITY command.\n");
483845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		return -1;
484845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	}
485845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	pos += ret;
486845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	for (i = 2; i < argc; i++) {
487845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		ret = os_snprintf(pos, end - pos, " %s", argv[i]);
488845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		if (ret < 0 || ret >= end - pos) {
489845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			printf("Too long IDENTITY command.\n");
490845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			return -1;
491845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		}
492845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		pos += ret;
493845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	}
494845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
495845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	return wpa_ctrl_command(ctrl, cmd);
496845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project}
497845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
498845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
499845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic int wpa_cli_cmd_password(struct wpa_ctrl *ctrl, int argc, char *argv[])
500845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{
501845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	char cmd[256], *pos, *end;
502845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	int i, ret;
503845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
504845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	if (argc < 2) {
505845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		printf("Invalid PASSWORD command: needs two arguments "
506845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		       "(network id and password)\n");
507845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		return -1;
508845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	}
509845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
510845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	end = cmd + sizeof(cmd);
511845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	pos = cmd;
512845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	ret = os_snprintf(pos, end - pos, WPA_CTRL_RSP "PASSWORD-%s:%s",
513845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			  argv[0], argv[1]);
514845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	if (ret < 0 || ret >= end - pos) {
515845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		printf("Too long PASSWORD command.\n");
516845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		return -1;
517845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	}
518845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	pos += ret;
519845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	for (i = 2; i < argc; i++) {
520845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		ret = os_snprintf(pos, end - pos, " %s", argv[i]);
521845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		if (ret < 0 || ret >= end - pos) {
522845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			printf("Too long PASSWORD command.\n");
523845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			return -1;
524845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		}
525845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		pos += ret;
526845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	}
527845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
528845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	return wpa_ctrl_command(ctrl, cmd);
529845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project}
530845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
531845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
532845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic int wpa_cli_cmd_new_password(struct wpa_ctrl *ctrl, int argc,
533845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project				    char *argv[])
534845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{
535845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	char cmd[256], *pos, *end;
536845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	int i, ret;
537845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
538845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	if (argc < 2) {
539845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		printf("Invalid NEW_PASSWORD command: needs two arguments "
540845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		       "(network id and password)\n");
541845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		return -1;
542845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	}
543845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
544845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	end = cmd + sizeof(cmd);
545845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	pos = cmd;
546845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	ret = os_snprintf(pos, end - pos, WPA_CTRL_RSP "NEW_PASSWORD-%s:%s",
547845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			  argv[0], argv[1]);
548845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	if (ret < 0 || ret >= end - pos) {
549845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		printf("Too long NEW_PASSWORD command.\n");
550845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		return -1;
551845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	}
552845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	pos += ret;
553845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	for (i = 2; i < argc; i++) {
554845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		ret = os_snprintf(pos, end - pos, " %s", argv[i]);
555845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		if (ret < 0 || ret >= end - pos) {
556845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			printf("Too long NEW_PASSWORD command.\n");
557845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			return -1;
558845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		}
559845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		pos += ret;
560845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	}
561845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
562845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	return wpa_ctrl_command(ctrl, cmd);
563845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project}
564845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
565845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
566845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic int wpa_cli_cmd_pin(struct wpa_ctrl *ctrl, int argc, char *argv[])
567845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{
568845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	char cmd[256], *pos, *end;
569845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	int i, ret;
570845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
571845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	if (argc < 2) {
572845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		printf("Invalid PIN command: needs two arguments "
573845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		       "(network id and pin)\n");
574845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		return -1;
575845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	}
576845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
577845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	end = cmd + sizeof(cmd);
578845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	pos = cmd;
579845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	ret = os_snprintf(pos, end - pos, WPA_CTRL_RSP "PIN-%s:%s",
580845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			  argv[0], argv[1]);
581845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	if (ret < 0 || ret >= end - pos) {
582845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		printf("Too long PIN command.\n");
583845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		return -1;
584845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	}
585845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	pos += ret;
586845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	for (i = 2; i < argc; i++) {
587845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		ret = os_snprintf(pos, end - pos, " %s", argv[i]);
588845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		if (ret < 0 || ret >= end - pos) {
589845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			printf("Too long PIN command.\n");
590845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			return -1;
591845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		}
592845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		pos += ret;
593845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	}
594845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	return wpa_ctrl_command(ctrl, cmd);
595845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project}
596845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
597845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
598845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic int wpa_cli_cmd_otp(struct wpa_ctrl *ctrl, int argc, char *argv[])
599845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{
600845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	char cmd[256], *pos, *end;
601845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	int i, ret;
602845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
603845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	if (argc < 2) {
604845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		printf("Invalid OTP command: needs two arguments (network "
605845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		       "id and password)\n");
606845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		return -1;
607845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	}
608845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
609845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	end = cmd + sizeof(cmd);
610845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	pos = cmd;
611845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	ret = os_snprintf(pos, end - pos, WPA_CTRL_RSP "OTP-%s:%s",
612845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			  argv[0], argv[1]);
613845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	if (ret < 0 || ret >= end - pos) {
614845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		printf("Too long OTP command.\n");
615845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		return -1;
616845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	}
617845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	pos += ret;
618845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	for (i = 2; i < argc; i++) {
619845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		ret = os_snprintf(pos, end - pos, " %s", argv[i]);
620845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		if (ret < 0 || ret >= end - pos) {
621845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			printf("Too long OTP command.\n");
622845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			return -1;
623845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		}
624845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		pos += ret;
625845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	}
626845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
627845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	return wpa_ctrl_command(ctrl, cmd);
628845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project}
629845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
630845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
631845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic int wpa_cli_cmd_passphrase(struct wpa_ctrl *ctrl, int argc,
632845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project				  char *argv[])
633845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{
634845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	char cmd[256], *pos, *end;
635845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	int i, ret;
636845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
637845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	if (argc < 2) {
638845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		printf("Invalid PASSPHRASE command: needs two arguments "
639845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		       "(network id and passphrase)\n");
640845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		return -1;
641845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	}
642845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
643845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	end = cmd + sizeof(cmd);
644845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	pos = cmd;
645845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	ret = os_snprintf(pos, end - pos, WPA_CTRL_RSP "PASSPHRASE-%s:%s",
646845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			  argv[0], argv[1]);
647845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	if (ret < 0 || ret >= end - pos) {
648845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		printf("Too long PASSPHRASE command.\n");
649845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		return -1;
650845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	}
651845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	pos += ret;
652845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	for (i = 2; i < argc; i++) {
653845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		ret = os_snprintf(pos, end - pos, " %s", argv[i]);
654845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		if (ret < 0 || ret >= end - pos) {
655845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			printf("Too long PASSPHRASE command.\n");
656845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			return -1;
657845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		}
658845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		pos += ret;
659845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	}
660845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
661845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	return wpa_ctrl_command(ctrl, cmd);
662845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project}
663845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
664845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
665845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic int wpa_cli_cmd_bssid(struct wpa_ctrl *ctrl, int argc, char *argv[])
666845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{
667845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	char cmd[256], *pos, *end;
668845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	int i, ret;
669845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
670845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	if (argc < 2) {
671845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		printf("Invalid BSSID command: needs two arguments (network "
672845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		       "id and BSSID)\n");
673845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		return -1;
674845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	}
675845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
676845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	end = cmd + sizeof(cmd);
677845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	pos = cmd;
678845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	ret = os_snprintf(pos, end - pos, "BSSID");
679845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	if (ret < 0 || ret >= end - pos) {
680845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		printf("Too long BSSID command.\n");
681845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		return -1;
682845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	}
683845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	pos += ret;
684845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	for (i = 0; i < argc; i++) {
685845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		ret = os_snprintf(pos, end - pos, " %s", argv[i]);
686845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		if (ret < 0 || ret >= end - pos) {
687845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			printf("Too long BSSID command.\n");
688845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			return -1;
689845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		}
690845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		pos += ret;
691845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	}
692845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
693845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	return wpa_ctrl_command(ctrl, cmd);
694845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project}
695845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
696845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#ifdef ANDROID
697845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic int wpa_cli_cmd_blacklist(struct wpa_ctrl *ctrl, int argc, char *argv[])
698845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{
699845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	char cmd[256], *pos, *end;
700845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	int i, ret;
701845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
702845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	end = cmd + sizeof(cmd);
703845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	pos = cmd;
704845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	ret = os_snprintf(pos, end - pos, "BLACKLIST");
705845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	if (ret < 0 || ret >= end - pos) {
706845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		printf("Too long BLACKLIST command.\n");
707845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		return -1;
708845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	}
709845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	pos += ret;
710845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	for (i = 0; i < argc; i++) {
711845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		ret = os_snprintf(pos, end - pos, " %s", argv[i]);
712845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		if (ret < 0 || ret >= end - pos) {
713845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			printf("Too long BLACKLIST command.\n");
714845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			return -1;
715845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		}
716845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		pos += ret;
717845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	}
718845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
719845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	return wpa_ctrl_command(ctrl, cmd);
720845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project}
721845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#endif
722845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
723845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic int wpa_cli_cmd_list_networks(struct wpa_ctrl *ctrl, int argc,
724845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project				     char *argv[])
725845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{
726845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	return wpa_ctrl_command(ctrl, "LIST_NETWORKS");
727845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project}
728845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
729845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
730845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic int wpa_cli_cmd_select_network(struct wpa_ctrl *ctrl, int argc,
731845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project				      char *argv[])
732845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{
733845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	char cmd[32];
734845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
735845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	if (argc < 1) {
736845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		printf("Invalid SELECT_NETWORK command: needs one argument "
737845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		       "(network id)\n");
738845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		return -1;
739845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	}
740845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
741845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	os_snprintf(cmd, sizeof(cmd), "SELECT_NETWORK %s", argv[0]);
742845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	cmd[sizeof(cmd) - 1] = '\0';
743845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
744845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	return wpa_ctrl_command(ctrl, cmd);
745845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project}
746845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
747845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
748845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic int wpa_cli_cmd_enable_network(struct wpa_ctrl *ctrl, int argc,
749845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project				      char *argv[])
750845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{
751845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	char cmd[32];
752845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
753845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	if (argc < 1) {
754845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		printf("Invalid ENABLE_NETWORK command: needs one argument "
755845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		       "(network id)\n");
756845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		return -1;
757845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	}
758845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
759845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	os_snprintf(cmd, sizeof(cmd), "ENABLE_NETWORK %s", argv[0]);
760845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	cmd[sizeof(cmd) - 1] = '\0';
761845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
762845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	return wpa_ctrl_command(ctrl, cmd);
763845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project}
764845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
765845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
766845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic int wpa_cli_cmd_disable_network(struct wpa_ctrl *ctrl, int argc,
767845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project				       char *argv[])
768845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{
769845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	char cmd[32];
770845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
771845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	if (argc < 1) {
772845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		printf("Invalid DISABLE_NETWORK command: needs one argument "
773845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		       "(network id)\n");
774845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		return -1;
775845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	}
776845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
777845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	os_snprintf(cmd, sizeof(cmd), "DISABLE_NETWORK %s", argv[0]);
778845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	cmd[sizeof(cmd) - 1] = '\0';
779845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
780845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	return wpa_ctrl_command(ctrl, cmd);
781845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project}
782845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
783845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
784845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic int wpa_cli_cmd_add_network(struct wpa_ctrl *ctrl, int argc,
785845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project				   char *argv[])
786845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{
787845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	return wpa_ctrl_command(ctrl, "ADD_NETWORK");
788845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project}
789845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
790845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
791845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic int wpa_cli_cmd_remove_network(struct wpa_ctrl *ctrl, int argc,
792845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project				      char *argv[])
793845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{
794845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	char cmd[32];
795845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
796845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	if (argc < 1) {
797845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		printf("Invalid REMOVE_NETWORK command: needs one argument "
798845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		       "(network id)\n");
799845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		return -1;
800845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	}
801845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
802845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	os_snprintf(cmd, sizeof(cmd), "REMOVE_NETWORK %s", argv[0]);
803845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	cmd[sizeof(cmd) - 1] = '\0';
804845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
805845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	return wpa_ctrl_command(ctrl, cmd);
806845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project}
807845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
808845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
809845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic void wpa_cli_show_network_variables(void)
810845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{
811845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	printf("set_network variables:\n"
812845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	       "  ssid (network name, SSID)\n"
813845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	       "  psk (WPA passphrase or pre-shared key)\n"
814845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	       "  key_mgmt (key management protocol)\n"
815845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	       "  identity (EAP identity)\n"
816845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	       "  password (EAP password)\n"
817845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	       "  ...\n"
818845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	       "\n"
819845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	       "Note: Values are entered in the same format as the "
820845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	       "configuration file is using,\n"
821845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	       "i.e., strings values need to be inside double quotation "
822845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	       "marks.\n"
823845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	       "For example: set_network 1 ssid \"network name\"\n"
824845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	       "\n"
825845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	       "Please see wpa_supplicant.conf documentation for full list "
826845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	       "of\navailable variables.\n");
827845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project}
828845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
829845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
830845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic int wpa_cli_cmd_set_network(struct wpa_ctrl *ctrl, int argc,
831845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project				   char *argv[])
832845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{
833845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	char cmd[256];
834845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	int res;
835845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
836845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	if (argc == 0) {
837845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		wpa_cli_show_network_variables();
838845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		return 0;
839845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	}
840845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
841845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	if (argc != 3) {
842845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		printf("Invalid SET_NETWORK command: needs three arguments\n"
843845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		       "(network id, variable name, and value)\n");
844845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		return -1;
845845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	}
846845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
847845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	res = os_snprintf(cmd, sizeof(cmd), "SET_NETWORK %s %s %s",
848845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			  argv[0], argv[1], argv[2]);
849845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
850845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		printf("Too long SET_NETWORK command.\n");
851845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		return -1;
852845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	}
853845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	return wpa_ctrl_command(ctrl, cmd);
854845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project}
855845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
856845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
857845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic int wpa_cli_cmd_get_network(struct wpa_ctrl *ctrl, int argc,
858845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project				   char *argv[])
859845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{
860845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	char cmd[256];
861845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	int res;
862845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
863845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	if (argc == 0) {
864845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		wpa_cli_show_network_variables();
865845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		return 0;
866845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	}
867845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
868845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	if (argc != 2) {
869845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		printf("Invalid GET_NETWORK command: needs two arguments\n"
870845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		       "(network id and variable name)\n");
871845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		return -1;
872845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	}
873845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
874845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	res = os_snprintf(cmd, sizeof(cmd), "GET_NETWORK %s %s",
875845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			  argv[0], argv[1]);
876845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
877845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		printf("Too long GET_NETWORK command.\n");
878845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		return -1;
879845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	}
880845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	return wpa_ctrl_command(ctrl, cmd);
881845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project}
882845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
883845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
884845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic int wpa_cli_cmd_disconnect(struct wpa_ctrl *ctrl, int argc,
885845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project				  char *argv[])
886845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{
887845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	return wpa_ctrl_command(ctrl, "DISCONNECT");
888845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project}
889845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
890845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
891845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic int wpa_cli_cmd_reconnect(struct wpa_ctrl *ctrl, int argc,
892845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project				  char *argv[])
893845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{
894845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	return wpa_ctrl_command(ctrl, "RECONNECT");
895845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project}
896845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
897845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
898845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic int wpa_cli_cmd_save_config(struct wpa_ctrl *ctrl, int argc,
899845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project				   char *argv[])
900845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{
901845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	return wpa_ctrl_command(ctrl, "SAVE_CONFIG");
902845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project}
903845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
904845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
905845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic int wpa_cli_cmd_scan(struct wpa_ctrl *ctrl, int argc, char *argv[])
906845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{
907845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	return wpa_ctrl_command(ctrl, "SCAN");
908845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project}
909845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
910845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
911845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic int wpa_cli_cmd_scan_results(struct wpa_ctrl *ctrl, int argc,
912845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project				    char *argv[])
913845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{
914845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	return wpa_ctrl_command(ctrl, "SCAN_RESULTS");
915845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project}
916845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
917845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
918845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic int wpa_cli_cmd_get_capability(struct wpa_ctrl *ctrl, int argc,
919845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project				      char *argv[])
920845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{
921845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	char cmd[64];
922845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
923845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	if (argc < 1 || argc > 2) {
924845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		printf("Invalid GET_CAPABILITY command: need either one or "
925845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		       "two arguments\n");
926845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		return -1;
927845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	}
928845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
929845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	if ((argc == 2) && os_strcmp(argv[1], "strict") != 0) {
930845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		printf("Invalid GET_CAPABILITY command: second argument, "
931845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		       "if any, must be 'strict'\n");
932845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		return -1;
933845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	}
934845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
935845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	os_snprintf(cmd, sizeof(cmd), "GET_CAPABILITY %s%s", argv[0],
936845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		    (argc == 2) ? " strict" : "");
937845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	cmd[sizeof(cmd) - 1] = '\0';
938845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
939845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	return wpa_ctrl_command(ctrl, cmd);
940845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project}
941845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
942845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
943845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic int wpa_cli_list_interfaces(struct wpa_ctrl *ctrl)
944845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{
945845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	printf("Available interfaces:\n");
946845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	return wpa_ctrl_command(ctrl, "INTERFACES");
947845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project}
948845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
949845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
950845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic int wpa_cli_cmd_interface(struct wpa_ctrl *ctrl, int argc, char *argv[])
951845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{
952845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	if (argc < 1) {
953845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		wpa_cli_list_interfaces(ctrl);
954845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		return 0;
955845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	}
956845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
957845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	wpa_cli_close_connection();
958845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	os_free(ctrl_ifname);
959845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	ctrl_ifname = os_strdup(argv[0]);
960845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
961845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	if ((ctrl_conn = wpa_cli_open_connection(ctrl_ifname)) != NULL) {
962845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		printf("Connected to interface '%s.\n", ctrl_ifname);
963845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		if (wpa_ctrl_attach(monitor_conn) == 0) {
964845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			wpa_cli_attached = 1;
965845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		} else {
966845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			printf("Warning: Failed to attach to "
967845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			       "wpa_supplicant.\n");
968845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		}
969845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	} else {
970845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		printf("Could not connect to interface '%s' - re-trying\n",
971845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			ctrl_ifname);
972845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	}
973845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	return 0;
974845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project}
975845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
976845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
977845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic int wpa_cli_cmd_reconfigure(struct wpa_ctrl *ctrl, int argc,
978845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project				   char *argv[])
979845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{
980845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	return wpa_ctrl_command(ctrl, "RECONFIGURE");
981845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project}
982845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
983845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
984845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic int wpa_cli_cmd_terminate(struct wpa_ctrl *ctrl, int argc,
985845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project				 char *argv[])
986845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{
987845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	return wpa_ctrl_command(ctrl, "TERMINATE");
988845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project}
989845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
990845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
991845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic int wpa_cli_cmd_interface_add(struct wpa_ctrl *ctrl, int argc,
992845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project				     char *argv[])
993845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{
994845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	char cmd[256];
995845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
996845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	if (argc < 1) {
997845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		printf("Invalid INTERFACE_ADD command: needs at least one "
998845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		       "argument (interface name)\n"
999845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		       "All arguments: ifname confname driver ctrl_interface "
1000845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		       "driver_param bridge_name\n");
1001845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		return -1;
1002845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	}
1003845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1004845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	/*
1005845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	 * INTERFACE_ADD <ifname>TAB<confname>TAB<driver>TAB<ctrl_interface>TAB
1006845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	 * <driver_param>TAB<bridge_name>
1007845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	 */
1008845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	os_snprintf(cmd, sizeof(cmd), "INTERFACE_ADD %s\t%s\t%s\t%s\t%s\t%s",
1009845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		    argv[0],
1010845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		    argc > 1 ? argv[1] : "", argc > 2 ? argv[2] : "",
1011845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		    argc > 3 ? argv[3] : "", argc > 4 ? argv[4] : "",
1012845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		    argc > 5 ? argv[5] : "");
1013845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	cmd[sizeof(cmd) - 1] = '\0';
1014845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	return wpa_ctrl_command(ctrl, cmd);
1015845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project}
1016845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1017845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1018845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic int wpa_cli_cmd_interface_remove(struct wpa_ctrl *ctrl, int argc,
1019845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project					char *argv[])
1020845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{
1021845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	char cmd[128];
1022845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1023845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	if (argc != 1) {
1024845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		printf("Invalid INTERFACE_REMOVE command: needs one argument "
1025845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		       "(interface name)\n");
1026845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		return -1;
1027845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	}
1028845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1029845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	os_snprintf(cmd, sizeof(cmd), "INTERFACE_REMOVE %s", argv[0]);
1030845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	cmd[sizeof(cmd) - 1] = '\0';
1031845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	return wpa_ctrl_command(ctrl, cmd);
1032845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project}
1033845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1034845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic int wpa_cli_cmd_driver(struct wpa_ctrl *ctrl, int argc,
1035845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project				      char *argv[])
1036845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{
1037845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	char cmd[32];
1038845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1039845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	if (argc < 1) {
1040845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		printf("Invalid DRIVER command: needs one argument (cmd)\n");
1041845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		return -1;
1042845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	}
1043845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1044845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	if (argc > 1)
1045845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		os_snprintf(cmd, sizeof(cmd), "DRIVER %s %s", argv[0], argv[1]);
1046845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	else
1047845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		os_snprintf(cmd, sizeof(cmd), "DRIVER %s", argv[0]);
1048845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	cmd[sizeof(cmd) - 1] = '\0';
1049845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1050845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	return wpa_ctrl_command(ctrl, cmd);
1051845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project}
1052845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1053845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstruct wpa_cli_cmd {
1054845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	const char *cmd;
1055845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	int (*handler)(struct wpa_ctrl *ctrl, int argc, char *argv[]);
1056845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project};
1057845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1058845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic struct wpa_cli_cmd wpa_cli_commands[] = {
1059845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	{ "status", wpa_cli_cmd_status },
1060845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	{ "ping", wpa_cli_cmd_ping },
1061845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	{ "mib", wpa_cli_cmd_mib },
1062845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	{ "help", wpa_cli_cmd_help },
1063845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	{ "interface", wpa_cli_cmd_interface },
1064845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	{ "level", wpa_cli_cmd_level },
1065845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	{ "license", wpa_cli_cmd_license },
1066845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	{ "quit", wpa_cli_cmd_quit },
1067845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	{ "set", wpa_cli_cmd_set },
1068845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	{ "logon", wpa_cli_cmd_logon },
1069845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	{ "logoff", wpa_cli_cmd_logoff },
1070845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	{ "pmksa", wpa_cli_cmd_pmksa },
1071845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	{ "reassociate", wpa_cli_cmd_reassociate },
1072845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	{ "preauthenticate", wpa_cli_cmd_preauthenticate },
1073845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	{ "identity", wpa_cli_cmd_identity },
1074845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	{ "password", wpa_cli_cmd_password },
1075845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	{ "new_password", wpa_cli_cmd_new_password },
1076845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	{ "pin", wpa_cli_cmd_pin },
1077845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	{ "otp", wpa_cli_cmd_otp },
1078845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	{ "passphrase", wpa_cli_cmd_passphrase },
1079845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	{ "bssid", wpa_cli_cmd_bssid },
1080845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#ifdef ANDROID
1081845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	{ "blacklist", wpa_cli_cmd_blacklist },
1082845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#endif
1083845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	{ "list_networks", wpa_cli_cmd_list_networks },
1084845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	{ "select_network", wpa_cli_cmd_select_network },
1085845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	{ "enable_network", wpa_cli_cmd_enable_network },
1086845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	{ "disable_network", wpa_cli_cmd_disable_network },
1087845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	{ "add_network", wpa_cli_cmd_add_network },
1088845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	{ "remove_network", wpa_cli_cmd_remove_network },
1089845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	{ "set_network", wpa_cli_cmd_set_network },
1090845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	{ "get_network", wpa_cli_cmd_get_network },
1091845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	{ "save_config", wpa_cli_cmd_save_config },
1092845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	{ "disconnect", wpa_cli_cmd_disconnect },
1093845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	{ "reconnect", wpa_cli_cmd_reconnect },
1094845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	{ "scan", wpa_cli_cmd_scan },
1095845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	{ "scan_results", wpa_cli_cmd_scan_results },
1096845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	{ "get_capability", wpa_cli_cmd_get_capability },
1097845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	{ "reconfigure", wpa_cli_cmd_reconfigure },
1098845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	{ "terminate", wpa_cli_cmd_terminate },
1099845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	{ "interface_add", wpa_cli_cmd_interface_add },
1100845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	{ "interface_remove", wpa_cli_cmd_interface_remove },
1101845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	{ "ap_scan", wpa_cli_cmd_ap_scan },
1102845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	{ "stkstart", wpa_cli_cmd_stkstart },
1103845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	{ "driver", wpa_cli_cmd_driver },
1104845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	{ NULL, NULL }
1105845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project};
1106845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1107845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1108845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic int wpa_request(struct wpa_ctrl *ctrl, int argc, char *argv[])
1109845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{
1110845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	struct wpa_cli_cmd *cmd, *match = NULL;
1111845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	int count;
1112845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	int ret = 0;
1113845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1114845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	count = 0;
1115845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	cmd = wpa_cli_commands;
1116845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	while (cmd->cmd) {
1117845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		if (os_strncasecmp(cmd->cmd, argv[0], os_strlen(argv[0])) == 0)
1118845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		{
1119845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			match = cmd;
1120845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			if (os_strcasecmp(cmd->cmd, argv[0]) == 0) {
1121845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project				/* we have an exact match */
1122845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project				count = 1;
1123845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project				break;
1124845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			}
1125845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			count++;
1126845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		}
1127845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		cmd++;
1128845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	}
1129845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1130845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	if (count > 1) {
1131845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		printf("Ambiguous command '%s'; possible commands:", argv[0]);
1132845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		cmd = wpa_cli_commands;
1133845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		while (cmd->cmd) {
1134845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			if (os_strncasecmp(cmd->cmd, argv[0],
1135845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project					   os_strlen(argv[0])) == 0) {
1136845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project				printf(" %s", cmd->cmd);
1137845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			}
1138845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			cmd++;
1139845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		}
1140845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		printf("\n");
1141845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		ret = 1;
1142845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	} else if (count == 0) {
1143845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		printf("Unknown command '%s'\n", argv[0]);
1144845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		ret = 1;
1145845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	} else {
1146845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project        if( os_strncasecmp( "level", argv[0], os_strlen(argv[0]) ) == 0 )  {
1147845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project            ctrl = monitor_conn;
1148845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project        }
1149845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		ret = match->handler(ctrl, argc - 1, &argv[1]);
1150845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	}
1151845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1152845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	return ret;
1153845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project}
1154845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1155845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1156845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic int str_match(const char *a, const char *b)
1157845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{
1158845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	return os_strncmp(a, b, os_strlen(b)) == 0;
1159845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project}
1160845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1161845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1162845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic int wpa_cli_exec(const char *program, const char *arg1,
1163845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			const char *arg2)
1164845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{
1165845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	char *cmd;
1166845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	size_t len;
1167845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1168845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	len = os_strlen(program) + os_strlen(arg1) + os_strlen(arg2) + 3;
1169845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	cmd = os_malloc(len);
1170845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	if (cmd == NULL)
1171845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		return -1;
1172845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	os_snprintf(cmd, len, "%s %s %s", program, arg1, arg2);
1173845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	cmd[len - 1] = '\0';
1174845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#ifndef _WIN32_WCE
1175845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	system(cmd);
1176845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#endif /* _WIN32_WCE */
1177845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	os_free(cmd);
1178845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1179845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	return 0;
1180845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project}
1181845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1182845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1183845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic void wpa_cli_action_process(const char *msg)
1184845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{
1185845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	const char *pos;
1186845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	char *copy = NULL, *id, *pos2;
1187845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1188845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	pos = msg;
1189845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	if (*pos == '<') {
1190845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		/* skip priority */
1191845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		pos = os_strchr(pos, '>');
1192845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		if (pos)
1193845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			pos++;
1194845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		else
1195845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			pos = msg;
1196845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	}
1197845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1198845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	if (str_match(pos, WPA_EVENT_CONNECTED)) {
1199845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		int new_id = -1;
1200845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		os_unsetenv("WPA_ID");
1201845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		os_unsetenv("WPA_ID_STR");
1202845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		os_unsetenv("WPA_CTRL_DIR");
1203845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1204845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		pos = os_strstr(pos, "[id=");
1205845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		if (pos)
1206845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			copy = os_strdup(pos + 4);
1207845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1208845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		if (copy) {
1209845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			pos2 = id = copy;
1210845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			while (*pos2 && *pos2 != ' ')
1211845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project				pos2++;
1212845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			*pos2++ = '\0';
1213845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			new_id = atoi(id);
1214845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			os_setenv("WPA_ID", id, 1);
1215845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			while (*pos2 && *pos2 != '=')
1216845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project				pos2++;
1217845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			if (*pos2 == '=')
1218845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project				pos2++;
1219845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			id = pos2;
1220845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			while (*pos2 && *pos2 != ']')
1221845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project				pos2++;
1222845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			*pos2 = '\0';
1223845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			os_setenv("WPA_ID_STR", id, 1);
1224845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			os_free(copy);
1225845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		}
1226845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1227845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		os_setenv("WPA_CTRL_DIR", ctrl_iface_dir, 1);
1228845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1229845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		if (!wpa_cli_connected || new_id != wpa_cli_last_id) {
1230845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			wpa_cli_connected = 1;
1231845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			wpa_cli_last_id = new_id;
1232845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			wpa_cli_exec(action_file, ctrl_ifname, "CONNECTED");
1233845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		}
1234845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	} else if (str_match(pos, WPA_EVENT_DISCONNECTED)) {
1235845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		if (wpa_cli_connected) {
1236845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			wpa_cli_connected = 0;
1237845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			wpa_cli_exec(action_file, ctrl_ifname, "DISCONNECTED");
1238845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		}
1239845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	} else if (str_match(pos, WPA_EVENT_TERMINATING)) {
1240845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		printf("wpa_supplicant is terminating - stop monitoring\n");
1241845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		wpa_cli_quit = 1;
1242845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	}
1243845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project}
1244845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1245845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1246845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#ifndef CONFIG_ANSI_C_EXTRA
1247845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic void wpa_cli_action_cb(char *msg, size_t len)
1248845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{
1249845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	wpa_cli_action_process(msg);
1250845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project}
1251845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#endif /* CONFIG_ANSI_C_EXTRA */
1252845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1253845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1254845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic void wpa_cli_reconnect(void)
1255845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{
1256845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	wpa_cli_close_connection();
1257845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	ctrl_conn = wpa_cli_open_connection(ctrl_ifname);
1258845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	if (ctrl_conn) {
1259845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		printf("Connection to wpa_supplicant re-established\n");
1260845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		if (wpa_ctrl_attach(monitor_conn) == 0) {
1261845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			wpa_cli_attached = 1;
1262845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		} else {
1263845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			printf("Warning: Failed to attach to "
1264845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			       "wpa_supplicant.\n");
1265845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		}
1266845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	}
1267845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project}
1268845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1269845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1270845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic void wpa_cli_recv_pending(struct wpa_ctrl *ctrl, int in_read,
1271845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project				 int action_monitor)
1272845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{
1273845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	int first = 1;
1274845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	if (ctrl == NULL) {
1275845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		wpa_cli_reconnect();
1276845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		return;
1277845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	}
1278845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	while (wpa_ctrl_pending(ctrl) > 0) {
1279845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		char buf[256];
1280845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		size_t len = sizeof(buf) - 1;
1281845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		if (wpa_ctrl_recv(ctrl, buf, &len) == 0) {
1282845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			buf[len] = '\0';
1283845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			if (action_monitor)
1284845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project				wpa_cli_action_process(buf);
1285845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			else {
1286845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project				if (in_read && first)
1287845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project					printf("\n");
1288845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project				first = 0;
1289845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project				printf("%s\n", buf);
1290845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			}
1291845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		} else {
1292845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			printf("Could not read pending message.\n");
1293845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			break;
1294845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		}
1295845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	}
1296845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1297845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	if (wpa_ctrl_pending(ctrl) < 0) {
1298845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		printf("Connection to wpa_supplicant lost - trying to "
1299845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		       "reconnect\n");
1300845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		wpa_cli_reconnect();
1301845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	}
1302845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project}
1303845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1304845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1305845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#ifdef CONFIG_READLINE
1306845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic char * wpa_cli_cmd_gen(const char *text, int state)
1307845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{
1308845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	static int i, len;
1309845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	const char *cmd;
1310845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1311845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	if (state == 0) {
1312845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		i = 0;
1313845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		len = os_strlen(text);
1314845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	}
1315845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1316845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	while ((cmd = wpa_cli_commands[i].cmd)) {
1317845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		i++;
1318845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		if (os_strncasecmp(cmd, text, len) == 0)
1319845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			return os_strdup(cmd);
1320845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	}
1321845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1322845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	return NULL;
1323845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project}
1324845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1325845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1326845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic char * wpa_cli_dummy_gen(const char *text, int state)
1327845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{
1328845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	return NULL;
1329845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project}
1330845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1331845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1332845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic char ** wpa_cli_completion(const char *text, int start, int end)
1333845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{
1334845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	return rl_completion_matches(text, start == 0 ?
1335845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project				     wpa_cli_cmd_gen : wpa_cli_dummy_gen);
1336845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project}
1337845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#endif /* CONFIG_READLINE */
1338845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1339845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1340845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic void wpa_cli_interactive(void)
1341845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{
1342845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#define max_args 10
1343845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	char cmdbuf[256], *cmd, *argv[max_args], *pos;
1344845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	int argc;
1345845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#ifdef CONFIG_READLINE
1346845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	char *home, *hfile = NULL;
1347845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#endif /* CONFIG_READLINE */
1348845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1349845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	printf("\nInteractive mode\n\n");
1350845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1351845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#ifdef CONFIG_READLINE
1352845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	rl_attempted_completion_function = wpa_cli_completion;
1353845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	home = getenv("HOME");
1354845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	if (home) {
1355845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		const char *fname = ".wpa_cli_history";
1356845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		int hfile_len = os_strlen(home) + 1 + os_strlen(fname) + 1;
1357845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		hfile = os_malloc(hfile_len);
1358845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		if (hfile) {
1359845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			os_snprintf(hfile, hfile_len, "%s/%s", home, fname);
1360845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			hfile[hfile_len - 1] = '\0';
1361845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			read_history(hfile);
1362845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			stifle_history(100);
1363845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		}
1364845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	}
1365845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#endif /* CONFIG_READLINE */
1366845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1367845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	do {
1368845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		wpa_cli_recv_pending(monitor_conn, 0, 0);
1369845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#ifndef CONFIG_NATIVE_WINDOWS
1370845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		alarm(1);
1371845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#endif /* CONFIG_NATIVE_WINDOWS */
1372845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#ifdef CONFIG_READLINE
1373845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		cmd = readline("> ");
1374845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		if (cmd && *cmd) {
1375845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			HIST_ENTRY *h;
1376845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			while (next_history())
1377845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project				;
1378845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			h = previous_history();
1379845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			if (h == NULL || os_strcmp(cmd, h->line) != 0)
1380845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project				add_history(cmd);
1381845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			next_history();
1382845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		}
1383845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#else /* CONFIG_READLINE */
1384845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		printf("> ");
1385845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		cmd = fgets(cmdbuf, sizeof(cmdbuf), stdin);
1386845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#endif /* CONFIG_READLINE */
1387845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#ifndef CONFIG_NATIVE_WINDOWS
1388845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		alarm(0);
1389845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#endif /* CONFIG_NATIVE_WINDOWS */
1390845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		if (cmd == NULL)
1391845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			break;
1392845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		wpa_cli_recv_pending(monitor_conn, 0, 0);
1393845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		pos = cmd;
1394845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		while (*pos != '\0') {
1395845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			if (*pos == '\n') {
1396845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project				*pos = '\0';
1397845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project				break;
1398845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			}
1399845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			pos++;
1400845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		}
1401845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		argc = 0;
1402845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		pos = cmd;
1403845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		for (;;) {
1404845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			while (*pos == ' ')
1405845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project				pos++;
1406845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			if (*pos == '\0')
1407845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project				break;
1408845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			argv[argc] = pos;
1409845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			argc++;
1410845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			if (argc == max_args)
1411845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project				break;
1412845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			if (*pos == '"') {
1413845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project				char *pos2 = os_strrchr(pos, '"');
1414845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project				if (pos2)
1415845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project					pos = pos2 + 1;
1416845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			}
1417845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			while (*pos != '\0' && *pos != ' ')
1418845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project				pos++;
1419845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			if (*pos == ' ')
1420845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project				*pos++ = '\0';
1421845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		}
1422845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		if (argc)
1423845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			wpa_request(ctrl_conn, argc, argv);
1424845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1425845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		if (cmd != cmdbuf)
1426845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			os_free(cmd);
1427845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	} while (!wpa_cli_quit);
1428845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1429845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#ifdef CONFIG_READLINE
1430845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	if (hfile) {
1431845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		/* Save command history, excluding lines that may contain
1432845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		 * passwords. */
1433845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		HIST_ENTRY *h;
1434845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		history_set_pos(0);
1435845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		h = next_history();
1436845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		while (h) {
1437845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			char *p = h->line;
1438845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			while (*p == ' ' || *p == '\t')
1439845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project				p++;
1440845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			if (os_strncasecmp(p, "pa", 2) == 0 ||
1441845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			    os_strncasecmp(p, "o", 1) == 0 ||
1442845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			    os_strncasecmp(p, "n", 1)) {
1443845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project				h = remove_history(where_history());
1444845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project				if (h) {
1445845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project					os_free(h->line);
1446845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project					os_free(h->data);
1447845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project					os_free(h);
1448845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project				}
1449845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project				h = current_history();
1450845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			} else {
1451845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project				h = next_history();
1452845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			}
1453845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		}
1454845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		write_history(hfile);
1455845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		os_free(hfile);
1456845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	}
1457845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#endif /* CONFIG_READLINE */
1458845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project}
1459845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1460845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1461845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic void wpa_cli_action(struct wpa_ctrl *ctrl)
1462845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{
1463845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#ifdef CONFIG_ANSI_C_EXTRA
1464845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	/* TODO: ANSI C version(?) */
1465845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	printf("Action processing not supported in ANSI C build.\n");
1466845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#else /* CONFIG_ANSI_C_EXTRA */
1467845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	fd_set rfds;
1468845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	int fd, res;
1469845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	struct timeval tv;
1470845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	char buf[256]; /* note: large enough to fit in unsolicited messages */
1471845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	size_t len;
1472845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1473845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	fd = wpa_ctrl_get_fd(ctrl);
1474845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1475845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	while (!wpa_cli_quit) {
1476845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		FD_ZERO(&rfds);
1477845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		FD_SET(fd, &rfds);
1478845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		tv.tv_sec = 2;
1479845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		tv.tv_usec = 0;
1480845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		res = select(fd + 1, &rfds, NULL, NULL, &tv);
1481845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		if (res < 0 && errno != EINTR) {
1482845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			perror("select");
1483845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			break;
1484845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		}
1485845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1486845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		if (FD_ISSET(fd, &rfds))
1487845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			wpa_cli_recv_pending(ctrl, 0, 1);
1488845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		else {
1489845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			/* verify that connection is still working */
1490845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			len = sizeof(buf) - 1;
1491845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			if (wpa_ctrl_request(ctrl, "PING", 4, buf, &len,
1492845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project					     wpa_cli_action_cb) < 0 ||
1493845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			    len < 4 || os_memcmp(buf, "PONG", 4) != 0) {
1494845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project				printf("wpa_supplicant did not reply to PING "
1495845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project				       "command - exiting\n");
1496845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project				break;
1497845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			}
1498845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		}
1499845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	}
1500845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#endif /* CONFIG_ANSI_C_EXTRA */
1501845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project}
1502845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1503845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1504845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic void wpa_cli_cleanup(void)
1505845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{
1506845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	wpa_cli_close_connection();
1507845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	if (pid_file)
1508845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		os_daemonize_terminate(pid_file);
1509845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1510845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	os_program_deinit();
1511845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project}
1512845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1513845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic void wpa_cli_terminate(int sig)
1514845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{
1515845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	wpa_cli_cleanup();
1516845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	exit(0);
1517845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project}
1518845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1519845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1520845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#ifndef CONFIG_NATIVE_WINDOWS
1521845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic void wpa_cli_alarm(int sig)
1522845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{
1523845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	if (ctrl_conn && _wpa_ctrl_command(ctrl_conn, "PING", 0)) {
1524845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		printf("Connection to wpa_supplicant lost - trying to "
1525845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		       "reconnect\n");
1526845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		wpa_cli_close_connection();
1527845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	}
1528845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	if (!monitor_conn)
1529845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		wpa_cli_reconnect();
1530845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	if (monitor_conn)
1531845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		wpa_cli_recv_pending(monitor_conn, 1, 0);
1532845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	alarm(1);
1533845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project}
1534845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#endif /* CONFIG_NATIVE_WINDOWS */
1535845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1536845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1537845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic char * wpa_cli_get_default_ifname(void)
1538845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{
1539845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	char *ifname = NULL;
1540845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1541845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#ifdef CONFIG_CTRL_IFACE_UNIX
1542845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	struct dirent *dent;
1543845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	DIR *dir = opendir(ctrl_iface_dir);
1544845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	if (!dir) {
1545845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#ifdef ANDROID
1546845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		char ifprop[PROPERTY_VALUE_MAX];
1547845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		if (property_get("wifi.interface", ifprop, NULL) != 0) {
1548845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			ifname = os_strdup(ifprop);
1549845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			printf("Using interface '%s'\n", ifname);
1550845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			return ifname;
1551845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		}
1552845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#endif
1553845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		return NULL;
1554845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	}
1555845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	while ((dent = readdir(dir))) {
1556845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#ifdef _DIRENT_HAVE_D_TYPE
1557845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		/*
1558845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		 * Skip the file if it is not a socket. Also accept
1559845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		 * DT_UNKNOWN (0) in case the C library or underlying
1560845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		 * file system does not support d_type.
1561845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		 */
1562845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		if (dent->d_type != DT_SOCK && dent->d_type != DT_UNKNOWN)
1563845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			continue;
1564845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#endif /* _DIRENT_HAVE_D_TYPE */
1565845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		if (os_strcmp(dent->d_name, ".") == 0 ||
1566845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		    os_strcmp(dent->d_name, "..") == 0)
1567845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			continue;
1568845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		printf("Selected interface '%s'\n", dent->d_name);
1569845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		ifname = os_strdup(dent->d_name);
1570845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		break;
1571845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	}
1572845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	closedir(dir);
1573845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#endif /* CONFIG_CTRL_IFACE_UNIX */
1574845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1575845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#ifdef CONFIG_CTRL_IFACE_NAMED_PIPE
1576845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	char buf[4096], *pos;
1577845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	size_t len;
1578845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	struct wpa_ctrl *ctrl;
1579845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	int ret;
1580845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1581845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	ctrl = wpa_ctrl_open(NULL);
1582845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	if (ctrl == NULL)
1583845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		return NULL;
1584845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1585845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	len = sizeof(buf) - 1;
1586845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	ret = wpa_ctrl_request(ctrl, "INTERFACES", 10, buf, &len, NULL);
1587845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	if (ret >= 0) {
1588845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		buf[len] = '\0';
1589845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		pos = os_strchr(buf, '\n');
1590845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		if (pos)
1591845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			*pos = '\0';
1592845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		ifname = os_strdup(buf);
1593845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	}
1594845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	wpa_ctrl_close(ctrl);
1595845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#endif /* CONFIG_CTRL_IFACE_NAMED_PIPE */
1596845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1597845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	return ifname;
1598845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project}
1599845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1600845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1601845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectint main(int argc, char *argv[])
1602845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{
1603845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	int interactive;
1604845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	int warning_displayed = 0;
1605845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	int c;
1606845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	int daemonize = 0;
1607845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	int ret = 0;
1608845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	const char *global = NULL;
1609845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1610845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	if (os_program_init())
1611845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		return -1;
1612845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1613845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	for (;;) {
1614845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		c = getopt(argc, argv, "a:Bg:hi:p:P:v");
1615845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		if (c < 0)
1616845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			break;
1617845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		switch (c) {
1618845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		case 'a':
1619845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			action_file = optarg;
1620845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			break;
1621845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		case 'B':
1622845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			daemonize = 1;
1623845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			break;
1624845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		case 'g':
1625845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			global = optarg;
1626845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			break;
1627845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		case 'h':
1628845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			usage();
1629845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			return 0;
1630845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		case 'v':
1631845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			printf("%s\n", wpa_cli_version);
1632845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			return 0;
1633845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		case 'i':
1634845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			os_free(ctrl_ifname);
1635845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			ctrl_ifname = os_strdup(optarg);
1636845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			break;
1637845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		case 'p':
1638845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			ctrl_iface_dir = optarg;
1639845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			break;
1640845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		case 'P':
1641845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			pid_file = optarg;
1642845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			break;
1643845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		default:
1644845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			usage();
1645845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			return -1;
1646845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		}
1647845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	}
1648845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1649845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	interactive = (argc == optind) && (action_file == NULL);
1650845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1651845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	if (interactive)
1652845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		printf("%s\n\n%s\n\n", wpa_cli_version, wpa_cli_license);
1653845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1654845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	if (global) {
1655845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#ifdef CONFIG_CTRL_IFACE_NAMED_PIPE
1656845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		ctrl_conn = wpa_ctrl_open(NULL);
1657845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#else /* CONFIG_CTRL_IFACE_NAMED_PIPE */
1658845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		ctrl_conn = wpa_ctrl_open(global);
1659845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#endif /* CONFIG_CTRL_IFACE_NAMED_PIPE */
1660845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		if (ctrl_conn == NULL) {
1661845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			perror("Failed to connect to wpa_supplicant - "
1662845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			       "wpa_ctrl_open");
1663845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			return -1;
1664845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		}
1665845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	}
1666845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1667845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	for (; !global;) {
1668845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		if (ctrl_ifname == NULL)
1669845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			ctrl_ifname = wpa_cli_get_default_ifname();
1670845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		ctrl_conn = wpa_cli_open_connection(ctrl_ifname);
1671845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		if (ctrl_conn) {
1672845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			if (warning_displayed)
1673845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project				printf("Connection established.\n");
1674845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			break;
1675845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		}
1676845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1677845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		if (!interactive) {
1678845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			perror("Failed to connect to wpa_supplicant - "
1679845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			       "wpa_ctrl_open");
1680845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			return -1;
1681845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		}
1682845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1683845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		if (!warning_displayed) {
1684845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			printf("Could not connect to wpa_supplicant - "
1685845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			       "re-trying\n");
1686845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			warning_displayed = 1;
1687845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		}
1688845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		os_sleep(1, 0);
1689845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		continue;
1690845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	}
1691845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1692845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#ifndef _WIN32_WCE
1693845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	signal(SIGINT, wpa_cli_terminate);
1694845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	signal(SIGTERM, wpa_cli_terminate);
1695845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#endif /* _WIN32_WCE */
1696845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#ifndef CONFIG_NATIVE_WINDOWS
1697845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	signal(SIGALRM, wpa_cli_alarm);
1698845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#endif /* CONFIG_NATIVE_WINDOWS */
1699845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1700845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	if (interactive || action_file) {
1701845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		if (wpa_ctrl_attach(monitor_conn) == 0) {
1702845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			wpa_cli_attached = 1;
1703845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		} else {
1704845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			printf("Warning: Failed to attach to "
1705845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			       "wpa_supplicant.\n");
1706845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			if (!interactive)
1707845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project				return -1;
1708845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		}
1709845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	}
1710845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1711845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	if (daemonize && os_daemonize(pid_file))
1712845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		return -1;
1713845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1714845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	if (interactive)
1715845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		wpa_cli_interactive();
1716845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	else if (action_file)
1717845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		wpa_cli_action(ctrl_conn);
1718845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	else
1719845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		ret = wpa_request(ctrl_conn, argc - optind, &argv[optind]);
1720845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1721845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	os_free(ctrl_ifname);
1722845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	wpa_cli_cleanup();
1723845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1724845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	return ret;
1725845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project}
1726845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
1727845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#else /* CONFIG_CTRL_IFACE */
1728845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectint main(int argc, char *argv[])
1729845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{
1730845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	printf("CONFIG_CTRL_IFACE not defined - wpa_cli disabled\n");
1731845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	return -1;
1732845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project}
1733845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#endif /* CONFIG_CTRL_IFACE */
1734