1526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/*
2526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * WPA Supplicant - command line interface for wpa_supplicant daemon
3526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Copyright (c) 2004-2009, Jouni Malinen <j@w1.fi>
4526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt *
5526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * This program is free software; you can redistribute it and/or modify
6526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * it under the terms of the GNU General Public License version 2 as
7526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * published by the Free Software Foundation.
8526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt *
9526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Alternatively, this software may be distributed under the terms of BSD
10526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * license.
11526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt *
12526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * See README and COPYING for more details.
13526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */
14526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
15526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#include "includes.h"
16526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
17526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef CONFIG_CTRL_IFACE
18526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
19526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef CONFIG_CTRL_IFACE_UNIX
20526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#include <dirent.h>
21526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* CONFIG_CTRL_IFACE_UNIX */
22526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef CONFIG_READLINE
23526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#include <readline/readline.h>
24526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#include <readline/history.h>
25526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* CONFIG_READLINE */
26526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
272c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt#define CTRL_INTERFACE_2_SOCKETS
282c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt
29526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#include "wpa_ctrl.h"
30526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#include "common.h"
31526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#include "version.h"
322c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt#ifdef ANDROID
332c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt#include <cutils/properties.h>
342c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt#endif
35526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
36526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
37526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic const char *wpa_cli_version =
38526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt"wpa_cli v" VERSION_STR "\n"
39526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt"Copyright (c) 2004-2009, Jouni Malinen <j@w1.fi> and contributors";
40526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
41526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
42526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic const char *wpa_cli_license =
43526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt"This program is free software. You can distribute it and/or modify it\n"
44526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt"under the terms of the GNU General Public License version 2.\n"
45526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt"\n"
46526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt"Alternatively, this software may be distributed under the terms of the\n"
47526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt"BSD license. See README and COPYING for more details.\n";
48526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
49526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic const char *wpa_cli_full_license =
50526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt"This program is free software; you can redistribute it and/or modify\n"
51526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt"it under the terms of the GNU General Public License version 2 as\n"
52526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt"published by the Free Software Foundation.\n"
53526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt"\n"
54526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt"This program is distributed in the hope that it will be useful,\n"
55526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
56526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
57526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt"GNU General Public License for more details.\n"
58526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt"\n"
59526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt"You should have received a copy of the GNU General Public License\n"
60526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt"along with this program; if not, write to the Free Software\n"
61526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt"Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\n"
62526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt"\n"
63526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt"Alternatively, this software may be distributed under the terms of the\n"
64526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt"BSD license.\n"
65526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt"\n"
66526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt"Redistribution and use in source and binary forms, with or without\n"
67526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt"modification, are permitted provided that the following conditions are\n"
68526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt"met:\n"
69526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt"\n"
70526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt"1. Redistributions of source code must retain the above copyright\n"
71526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt"   notice, this list of conditions and the following disclaimer.\n"
72526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt"\n"
73526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt"2. Redistributions in binary form must reproduce the above copyright\n"
74526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt"   notice, this list of conditions and the following disclaimer in the\n"
75526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt"   documentation and/or other materials provided with the distribution.\n"
76526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt"\n"
77526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt"3. Neither the name(s) of the above-listed copyright holder(s) nor the\n"
78526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt"   names of its contributors may be used to endorse or promote products\n"
79526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt"   derived from this software without specific prior written permission.\n"
80526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt"\n"
81526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt"THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n"
82526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt"\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n"
83526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt"LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n"
84526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt"A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n"
85526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt"OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n"
86526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt"SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n"
87526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt"LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n"
88526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt"DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n"
89526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt"THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n"
90526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt"(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n"
91526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt"OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
92526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt"\n";
93526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
94526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic struct wpa_ctrl *ctrl_conn;
952c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidtstatic struct wpa_ctrl *monitor_conn;
96526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_cli_quit = 0;
97526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_cli_attached = 0;
98526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_cli_connected = 0;
99526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_cli_last_id = 0;
1002c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt#ifdef ANDROID
1019ea27a3eafafdf616e2aaa48a3789c8979ab2c09Dmitry Shmidtstatic const char *ctrl_iface_dir = "/data/system/wpa_supplicant";
1022c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt#else
103526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic const char *ctrl_iface_dir = "/var/run/wpa_supplicant";
1042c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt#endif
105526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic char *ctrl_ifname = NULL;
106526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic const char *pid_file = NULL;
107526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic const char *action_file = NULL;
108526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int ping_interval = 5;
109526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
110526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
111526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic void print_help();
112526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
113526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
114526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic void usage(void)
115526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
116526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	printf("wpa_cli [-p<path to ctrl sockets>] [-i<ifname>] [-hvB] "
117526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	       "[-a<action file>] \\\n"
118526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	       "        [-P<pid file>] [-g<global ctrl>] [-G<ping interval>]  "
119526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	       "[command..]\n"
120526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	       "  -h = help (show this usage text)\n"
121526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	       "  -v = shown version information\n"
122526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	       "  -a = run in daemon mode executing the action file based on "
123526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	       "events from\n"
124526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	       "       wpa_supplicant\n"
125526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	       "  -B = run a daemon in the background\n"
126526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	       "  default path: /var/run/wpa_supplicant\n"
127526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	       "  default interface: first interface found in socket path\n");
128526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	print_help();
129526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
130526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
131526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
132526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic struct wpa_ctrl * wpa_cli_open_connection(const char *ifname)
133526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
1342c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt    struct wpa_ctrl *cur_conn;
135526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#if defined(CONFIG_CTRL_IFACE_UDP) || defined(CONFIG_CTRL_IFACE_NAMED_PIPE)
1362c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt	cur_conn = wpa_ctrl_open(ifname);
1372c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt	return cur_conn;
138526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#else /* CONFIG_CTRL_IFACE_UDP || CONFIG_CTRL_IFACE_NAMED_PIPE */
139526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	char *cfile;
140526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	int flen, res;
141526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
142526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (ifname == NULL)
143526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return NULL;
144526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1452c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt#ifdef ANDROID
1462c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt	if (access(ctrl_iface_dir, F_OK) < 0)
1472c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt		cfile = (char *)ifname;
1482c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt	else {
1492c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt#endif
150526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	flen = os_strlen(ctrl_iface_dir) + os_strlen(ifname) + 2;
151526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	cfile = os_malloc(flen);
152526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (cfile == NULL)
153526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return NULL;
154526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	res = os_snprintf(cfile, flen, "%s/%s", ctrl_iface_dir, ifname);
155526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (res < 0 || res >= flen) {
156526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		os_free(cfile);
157526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return NULL;
158526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
1592c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt#ifdef ANDROID
1602c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt    }
1612c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt#endif
1622c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt
1632c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt	cur_conn = wpa_ctrl_open(cfile);
1642c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt#ifdef CTRL_INTERFACE_2_SOCKETS
1652c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt	monitor_conn = wpa_ctrl_open(cfile);
1662c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt#else
1672c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt	monitor_conn = cur_conn;
1682c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt#endif
1692c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt#ifdef ANDROID
1702c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt	if (cfile != ifname)
1712c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt#endif
172526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	os_free(cfile);
1732c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt	return cur_conn;
174526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* CONFIG_CTRL_IFACE_UDP || CONFIG_CTRL_IFACE_NAMED_PIPE */
175526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
176526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
177526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
178526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic void wpa_cli_close_connection(void)
179526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
180526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (ctrl_conn == NULL)
181526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return;
182526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
183526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (wpa_cli_attached) {
1842c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt		wpa_ctrl_detach(monitor_conn);
185526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		wpa_cli_attached = 0;
186526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
1872c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt#ifdef CTRL_INTERFACE_2_SOCKETS
1882c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt	wpa_ctrl_close(monitor_conn);
1892c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt#endif
190526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	wpa_ctrl_close(ctrl_conn);
1912c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt	ctrl_conn = monitor_conn = NULL;
192526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
193526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
194526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
195526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic void wpa_cli_msg_cb(char *msg, size_t len)
196526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
197526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	printf("%s\n", msg);
198526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
199526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
200526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
201526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int _wpa_ctrl_command(struct wpa_ctrl *ctrl, char *cmd, int print)
202526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
2032c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt	char buf[4096];
204526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	size_t len;
205526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	int ret;
206526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
207526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (ctrl_conn == NULL) {
208526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		printf("Not connected to wpa_supplicant - command dropped.\n");
209526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return -1;
210526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
211526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	len = sizeof(buf) - 1;
212526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	ret = wpa_ctrl_request(ctrl, cmd, os_strlen(cmd), buf, &len,
213526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			       wpa_cli_msg_cb);
214526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (ret == -2) {
215526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		printf("'%s' command timed out.\n", cmd);
216526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return -2;
217526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	} else if (ret < 0) {
218526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		printf("'%s' command failed.\n", cmd);
219526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return -1;
220526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
221526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (print) {
222526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		buf[len] = '\0';
223526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		printf("%s", buf);
224526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
225526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return 0;
226526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
227526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
228526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
229526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_ctrl_command(struct wpa_ctrl *ctrl, char *cmd)
230526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
231526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return _wpa_ctrl_command(ctrl, cmd, 1);
232526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
233526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
234526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
235526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_cli_cmd_status(struct wpa_ctrl *ctrl, int argc, char *argv[])
236526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
237526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	int verbose = argc > 0 && os_strcmp(argv[0], "verbose") == 0;
238526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return wpa_ctrl_command(ctrl, verbose ? "STATUS-VERBOSE" : "STATUS");
239526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
240526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
241526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
242526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_cli_cmd_ping(struct wpa_ctrl *ctrl, int argc, char *argv[])
243526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
244526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return wpa_ctrl_command(ctrl, "PING");
245526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
246526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
247526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
248526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_cli_cmd_mib(struct wpa_ctrl *ctrl, int argc, char *argv[])
249526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
250526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return wpa_ctrl_command(ctrl, "MIB");
251526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
252526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
253526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
254526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_cli_cmd_pmksa(struct wpa_ctrl *ctrl, int argc, char *argv[])
255526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
256526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return wpa_ctrl_command(ctrl, "PMKSA");
257526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
258526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
259526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
260526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_cli_cmd_help(struct wpa_ctrl *ctrl, int argc, char *argv[])
261526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
262526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	print_help();
263526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return 0;
264526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
265526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
266526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
267526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_cli_cmd_license(struct wpa_ctrl *ctrl, int argc, char *argv[])
268526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
269526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	printf("%s\n\n%s\n", wpa_cli_version, wpa_cli_full_license);
270526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return 0;
271526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
272526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
273526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
274526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_cli_cmd_quit(struct wpa_ctrl *ctrl, int argc, char *argv[])
275526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
276526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	wpa_cli_quit = 1;
277526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return 0;
278526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
279526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
280526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
281526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic void wpa_cli_show_variables(void)
282526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
283526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	printf("set variables:\n"
284526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	       "  EAPOL::heldPeriod (EAPOL state machine held period, "
285526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	       "in seconds)\n"
286526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	       "  EAPOL::authPeriod (EAPOL state machine authentication "
287526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	       "period, in seconds)\n"
288526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	       "  EAPOL::startPeriod (EAPOL state machine start period, in "
289526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	       "seconds)\n"
290526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	       "  EAPOL::maxStart (EAPOL state machine maximum start "
291526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	       "attempts)\n");
292526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	printf("  dot11RSNAConfigPMKLifetime (WPA/WPA2 PMK lifetime in "
293526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	       "seconds)\n"
294526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	       "  dot11RSNAConfigPMKReauthThreshold (WPA/WPA2 reauthentication"
295526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	       " threshold\n\tpercentage)\n"
296526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	       "  dot11RSNAConfigSATimeout (WPA/WPA2 timeout for completing "
297526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	       "security\n\tassociation in seconds)\n");
298526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
299526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
300526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
301526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_cli_cmd_set(struct wpa_ctrl *ctrl, int argc, char *argv[])
302526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
303526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	char cmd[256];
304526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	int res;
305526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
306526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (argc == 0) {
307526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		wpa_cli_show_variables();
308526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return 0;
309526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
310526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
311526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (argc != 2) {
312526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		printf("Invalid SET command: needs two arguments (variable "
313526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		       "name and value)\n");
314526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return -1;
315526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
316526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
317526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "SET %s %s", argv[0], argv[1]);
318526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
319526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		printf("Too long SET command.\n");
320526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return -1;
321526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
322526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
323526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
324526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
325526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
326526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_cli_cmd_logoff(struct wpa_ctrl *ctrl, int argc, char *argv[])
327526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
328526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return wpa_ctrl_command(ctrl, "LOGOFF");
329526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
330526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
331526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
332526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_cli_cmd_logon(struct wpa_ctrl *ctrl, int argc, char *argv[])
333526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
334526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return wpa_ctrl_command(ctrl, "LOGON");
335526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
336526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
337526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
338526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_cli_cmd_reassociate(struct wpa_ctrl *ctrl, int argc,
339526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				   char *argv[])
340526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
341526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return wpa_ctrl_command(ctrl, "REASSOCIATE");
342526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
343526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
344526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
345526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_cli_cmd_preauthenticate(struct wpa_ctrl *ctrl, int argc,
346526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				       char *argv[])
347526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
348526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	char cmd[256];
349526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	int res;
350526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
351526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (argc != 1) {
352526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		printf("Invalid PREAUTH command: needs one argument "
353526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		       "(BSSID)\n");
354526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return -1;
355526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
356526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
357526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "PREAUTH %s", argv[0]);
358526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
359526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		printf("Too long PREAUTH command.\n");
360526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return -1;
361526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
362526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
363526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
364526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
365526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
366526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_cli_cmd_ap_scan(struct wpa_ctrl *ctrl, int argc, char *argv[])
367526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
368526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	char cmd[256];
369526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	int res;
370526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
371526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (argc != 1) {
372526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		printf("Invalid AP_SCAN command: needs one argument (ap_scan "
373526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		       "value)\n");
374526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return -1;
375526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
376526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "AP_SCAN %s", argv[0]);
377526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
378526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		printf("Too long AP_SCAN command.\n");
379526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return -1;
380526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
381526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
382526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
383526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
384526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
385526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_cli_cmd_stkstart(struct wpa_ctrl *ctrl, int argc,
386526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				char *argv[])
387526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
388526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	char cmd[256];
389526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	int res;
390526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
391526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (argc != 1) {
392526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		printf("Invalid STKSTART command: needs one argument "
393526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		       "(Peer STA MAC address)\n");
394526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return -1;
395526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
396526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
397526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "STKSTART %s", argv[0]);
398526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
399526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		printf("Too long STKSTART command.\n");
400526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return -1;
401526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
402526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
403526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
404526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
405526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
406526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_cli_cmd_ft_ds(struct wpa_ctrl *ctrl, int argc, char *argv[])
407526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
408526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	char cmd[256];
409526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	int res;
410526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
411526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (argc != 1) {
412526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		printf("Invalid FT_DS command: needs one argument "
413526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		       "(Target AP MAC address)\n");
414526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return -1;
415526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
416526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
417526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "FT_DS %s", argv[0]);
418526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
419526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		printf("Too long FT_DS command.\n");
420526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return -1;
421526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
422526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
423526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
424526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
425526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
426526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_cli_cmd_wps_pbc(struct wpa_ctrl *ctrl, int argc, char *argv[])
427526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
428526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	char cmd[256];
429526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	int res;
430526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
431526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (argc == 0) {
432526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		/* Any BSSID */
433526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return wpa_ctrl_command(ctrl, "WPS_PBC");
434526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
435526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
436526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	/* Specific BSSID */
437526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "WPS_PBC %s", argv[0]);
438526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
439526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		printf("Too long WPS_PBC command.\n");
440526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return -1;
441526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
442526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
443526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
444526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
445526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
446526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_cli_cmd_wps_pin(struct wpa_ctrl *ctrl, int argc, char *argv[])
447526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
448526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	char cmd[256];
449526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	int res;
450526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
451526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (argc == 0) {
452526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		printf("Invalid WPS_PIN command: need one or two arguments:\n"
453526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		       "- BSSID: use 'any' to select any\n"
454526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		       "- PIN: optional, used only with devices that have no "
455526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		       "display\n");
456526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return -1;
457526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
458526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
459526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (argc == 1) {
460526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		/* Use dynamically generated PIN (returned as reply) */
461526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd), "WPS_PIN %s", argv[0]);
462526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
463526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			printf("Too long WPS_PIN command.\n");
464526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			return -1;
465526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		}
466526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return wpa_ctrl_command(ctrl, cmd);
467526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
468526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
469526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	/* Use hardcoded PIN from a label */
470526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "WPS_PIN %s %s", argv[0], argv[1]);
471526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
472526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		printf("Too long WPS_PIN command.\n");
473526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return -1;
474526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
475526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
476526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
477526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
478526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
479526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_cli_cmd_wps_reg(struct wpa_ctrl *ctrl, int argc, char *argv[])
480526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
481526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	char cmd[256];
482526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	int res;
483526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
484526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (argc != 2) {
485526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		printf("Invalid WPS_REG command: need two arguments:\n"
486526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		       "- BSSID: use 'any' to select any\n"
487526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		       "- AP PIN\n");
488526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return -1;
489526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
490526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
491526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "WPS_REG %s %s", argv[0], argv[1]);
492526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
493526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		printf("Too long WPS_REG command.\n");
494526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return -1;
495526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
496526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
497526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
498526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
499526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
500526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_cli_cmd_level(struct wpa_ctrl *ctrl, int argc, char *argv[])
501526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
502526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	char cmd[256];
503526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	int res;
504526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
505526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (argc != 1) {
506526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		printf("Invalid LEVEL command: needs one argument (debug "
507526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		       "level)\n");
508526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return -1;
509526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
510526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "LEVEL %s", argv[0]);
511526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
512526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		printf("Too long LEVEL command.\n");
513526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return -1;
514526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
515526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
516526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
517526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
518526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
519526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_cli_cmd_identity(struct wpa_ctrl *ctrl, int argc, char *argv[])
520526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
521526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	char cmd[256], *pos, *end;
522526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	int i, ret;
523526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
524526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (argc < 2) {
525526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		printf("Invalid IDENTITY command: needs two arguments "
526526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		       "(network id and identity)\n");
527526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return -1;
528526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
529526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
530526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	end = cmd + sizeof(cmd);
531526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	pos = cmd;
532526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	ret = os_snprintf(pos, end - pos, WPA_CTRL_RSP "IDENTITY-%s:%s",
533526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			  argv[0], argv[1]);
534526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (ret < 0 || ret >= end - pos) {
535526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		printf("Too long IDENTITY command.\n");
536526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return -1;
537526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
538526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	pos += ret;
539526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	for (i = 2; i < argc; i++) {
540526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		ret = os_snprintf(pos, end - pos, " %s", argv[i]);
541526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		if (ret < 0 || ret >= end - pos) {
542526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			printf("Too long IDENTITY command.\n");
543526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			return -1;
544526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		}
545526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		pos += ret;
546526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
547526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
548526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
549526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
550526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
551526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
552526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_cli_cmd_password(struct wpa_ctrl *ctrl, int argc, char *argv[])
553526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
554526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	char cmd[256], *pos, *end;
555526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	int i, ret;
556526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
557526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (argc < 2) {
558526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		printf("Invalid PASSWORD command: needs two arguments "
559526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		       "(network id and password)\n");
560526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return -1;
561526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
562526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
563526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	end = cmd + sizeof(cmd);
564526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	pos = cmd;
565526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	ret = os_snprintf(pos, end - pos, WPA_CTRL_RSP "PASSWORD-%s:%s",
566526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			  argv[0], argv[1]);
567526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (ret < 0 || ret >= end - pos) {
568526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		printf("Too long PASSWORD command.\n");
569526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return -1;
570526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
571526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	pos += ret;
572526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	for (i = 2; i < argc; i++) {
573526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		ret = os_snprintf(pos, end - pos, " %s", argv[i]);
574526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		if (ret < 0 || ret >= end - pos) {
575526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			printf("Too long PASSWORD command.\n");
576526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			return -1;
577526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		}
578526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		pos += ret;
579526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
580526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
581526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
582526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
583526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
584526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
585526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_cli_cmd_new_password(struct wpa_ctrl *ctrl, int argc,
586526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				    char *argv[])
587526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
588526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	char cmd[256], *pos, *end;
589526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	int i, ret;
590526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
591526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (argc < 2) {
592526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		printf("Invalid NEW_PASSWORD command: needs two arguments "
593526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		       "(network id and password)\n");
594526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return -1;
595526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
596526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
597526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	end = cmd + sizeof(cmd);
598526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	pos = cmd;
599526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	ret = os_snprintf(pos, end - pos, WPA_CTRL_RSP "NEW_PASSWORD-%s:%s",
600526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			  argv[0], argv[1]);
601526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (ret < 0 || ret >= end - pos) {
602526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		printf("Too long NEW_PASSWORD command.\n");
603526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return -1;
604526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
605526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	pos += ret;
606526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	for (i = 2; i < argc; i++) {
607526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		ret = os_snprintf(pos, end - pos, " %s", argv[i]);
608526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		if (ret < 0 || ret >= end - pos) {
609526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			printf("Too long NEW_PASSWORD command.\n");
610526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			return -1;
611526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		}
612526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		pos += ret;
613526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
614526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
615526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
616526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
617526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
618526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
619526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_cli_cmd_pin(struct wpa_ctrl *ctrl, int argc, char *argv[])
620526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
621526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	char cmd[256], *pos, *end;
622526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	int i, ret;
623526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
624526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (argc < 2) {
625526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		printf("Invalid PIN command: needs two arguments "
626526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		       "(network id and pin)\n");
627526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return -1;
628526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
629526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
630526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	end = cmd + sizeof(cmd);
631526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	pos = cmd;
632526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	ret = os_snprintf(pos, end - pos, WPA_CTRL_RSP "PIN-%s:%s",
633526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			  argv[0], argv[1]);
634526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (ret < 0 || ret >= end - pos) {
635526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		printf("Too long PIN command.\n");
636526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return -1;
637526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
638526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	pos += ret;
639526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	for (i = 2; i < argc; i++) {
640526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		ret = os_snprintf(pos, end - pos, " %s", argv[i]);
641526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		if (ret < 0 || ret >= end - pos) {
642526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			printf("Too long PIN command.\n");
643526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			return -1;
644526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		}
645526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		pos += ret;
646526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
647526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
648526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
649526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
650526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
651526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_cli_cmd_otp(struct wpa_ctrl *ctrl, int argc, char *argv[])
652526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
653526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	char cmd[256], *pos, *end;
654526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	int i, ret;
655526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
656526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (argc < 2) {
657526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		printf("Invalid OTP command: needs two arguments (network "
658526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		       "id and password)\n");
659526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return -1;
660526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
661526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
662526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	end = cmd + sizeof(cmd);
663526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	pos = cmd;
664526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	ret = os_snprintf(pos, end - pos, WPA_CTRL_RSP "OTP-%s:%s",
665526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			  argv[0], argv[1]);
666526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (ret < 0 || ret >= end - pos) {
667526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		printf("Too long OTP command.\n");
668526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return -1;
669526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
670526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	pos += ret;
671526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	for (i = 2; i < argc; i++) {
672526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		ret = os_snprintf(pos, end - pos, " %s", argv[i]);
673526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		if (ret < 0 || ret >= end - pos) {
674526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			printf("Too long OTP command.\n");
675526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			return -1;
676526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		}
677526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		pos += ret;
678526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
679526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
680526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
681526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
682526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
683526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
684526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_cli_cmd_passphrase(struct wpa_ctrl *ctrl, int argc,
685526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				  char *argv[])
686526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
687526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	char cmd[256], *pos, *end;
688526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	int i, ret;
689526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
690526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (argc < 2) {
691526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		printf("Invalid PASSPHRASE command: needs two arguments "
692526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		       "(network id and passphrase)\n");
693526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return -1;
694526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
695526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
696526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	end = cmd + sizeof(cmd);
697526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	pos = cmd;
698526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	ret = os_snprintf(pos, end - pos, WPA_CTRL_RSP "PASSPHRASE-%s:%s",
699526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			  argv[0], argv[1]);
700526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (ret < 0 || ret >= end - pos) {
701526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		printf("Too long PASSPHRASE command.\n");
702526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return -1;
703526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
704526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	pos += ret;
705526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	for (i = 2; i < argc; i++) {
706526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		ret = os_snprintf(pos, end - pos, " %s", argv[i]);
707526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		if (ret < 0 || ret >= end - pos) {
708526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			printf("Too long PASSPHRASE command.\n");
709526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			return -1;
710526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		}
711526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		pos += ret;
712526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
713526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
714526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
715526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
716526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
717526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
718526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_cli_cmd_bssid(struct wpa_ctrl *ctrl, int argc, char *argv[])
719526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
720526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	char cmd[256], *pos, *end;
721526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	int i, ret;
722526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
723526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (argc < 2) {
724526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		printf("Invalid BSSID command: needs two arguments (network "
725526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		       "id and BSSID)\n");
726526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return -1;
727526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
728526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
729526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	end = cmd + sizeof(cmd);
730526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	pos = cmd;
731526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	ret = os_snprintf(pos, end - pos, "BSSID");
732526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (ret < 0 || ret >= end - pos) {
733526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		printf("Too long BSSID command.\n");
734526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return -1;
735526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
736526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	pos += ret;
737526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	for (i = 0; i < argc; i++) {
738526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		ret = os_snprintf(pos, end - pos, " %s", argv[i]);
739526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		if (ret < 0 || ret >= end - pos) {
740526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			printf("Too long BSSID command.\n");
741526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			return -1;
742526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		}
743526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		pos += ret;
744526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
745526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
746526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
747526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
748526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
749526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
7502c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt#ifdef ANDROID
751eee21e1de8514a43f3e9089c136e7e27cc27a9fcDmitry Shmidtstatic int wpa_cli_cmd_scan_interval(struct wpa_ctrl *ctrl, int argc,
752eee21e1de8514a43f3e9089c136e7e27cc27a9fcDmitry Shmidt				     char *argv[])
753eee21e1de8514a43f3e9089c136e7e27cc27a9fcDmitry Shmidt{
754eee21e1de8514a43f3e9089c136e7e27cc27a9fcDmitry Shmidt	char cmd[256];
755eee21e1de8514a43f3e9089c136e7e27cc27a9fcDmitry Shmidt	int res;
756eee21e1de8514a43f3e9089c136e7e27cc27a9fcDmitry Shmidt
757eee21e1de8514a43f3e9089c136e7e27cc27a9fcDmitry Shmidt	if (argc != 1) {
758eee21e1de8514a43f3e9089c136e7e27cc27a9fcDmitry Shmidt		printf("Invalid SCAN_INTERVAL command: needs one argument "
759eee21e1de8514a43f3e9089c136e7e27cc27a9fcDmitry Shmidt		       "scan_interval value)\n");
760eee21e1de8514a43f3e9089c136e7e27cc27a9fcDmitry Shmidt		return -1;
761eee21e1de8514a43f3e9089c136e7e27cc27a9fcDmitry Shmidt	}
762eee21e1de8514a43f3e9089c136e7e27cc27a9fcDmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "SCAN_INTERVAL %s", argv[0]);
763eee21e1de8514a43f3e9089c136e7e27cc27a9fcDmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
764eee21e1de8514a43f3e9089c136e7e27cc27a9fcDmitry Shmidt		printf("Too long SCAN_INTERVAL command.\n");
765eee21e1de8514a43f3e9089c136e7e27cc27a9fcDmitry Shmidt		return -1;
766eee21e1de8514a43f3e9089c136e7e27cc27a9fcDmitry Shmidt	}
767eee21e1de8514a43f3e9089c136e7e27cc27a9fcDmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
768eee21e1de8514a43f3e9089c136e7e27cc27a9fcDmitry Shmidt}
769eee21e1de8514a43f3e9089c136e7e27cc27a9fcDmitry Shmidt
770eee21e1de8514a43f3e9089c136e7e27cc27a9fcDmitry Shmidt
7712c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidtstatic int wpa_cli_cmd_blacklist(struct wpa_ctrl *ctrl, int argc, char *argv[])
7722c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt{
7732c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt	char cmd[256], *pos, *end;
7742c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt	int i, ret;
7752c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt
7762c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt	end = cmd + sizeof(cmd);
7772c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt	pos = cmd;
7782c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt	ret = os_snprintf(pos, end - pos, "BLACKLIST");
7792c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt	if (ret < 0 || ret >= end - pos) {
7802c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt		printf("Too long BLACKLIST command.\n");
7812c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt		return -1;
7822c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt	}
7832c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt	pos += ret;
7842c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt	for (i = 0; i < argc; i++) {
7852c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt		ret = os_snprintf(pos, end - pos, " %s", argv[i]);
7862c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt		if (ret < 0 || ret >= end - pos) {
7872c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt			printf("Too long BLACKLIST command.\n");
7882c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt			return -1;
7892c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt		}
7902c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt		pos += ret;
7912c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt	}
7922c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt
7932c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
7942c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt}
7952c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt
7962c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt
7972c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidtstatic int wpa_cli_cmd_log_level(struct wpa_ctrl *ctrl, int argc, char *argv[])
7982c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt{
7992c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt	char cmd[256], *pos, *end;
8002c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt	int i, ret;
8012c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt
8022c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt	end = cmd + sizeof(cmd);
8032c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt	pos = cmd;
8042c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt	ret = os_snprintf(pos, end - pos, "LOG_LEVEL");
8052c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt	if (ret < 0 || ret >= end - pos) {
8062c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt		printf("Too long LOG_LEVEL command.\n");
8072c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt		return -1;
8082c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt	}
8092c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt	pos += ret;
8102c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt	for (i = 0; i < argc; i++) {
8112c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt		ret = os_snprintf(pos, end - pos, " %s", argv[i]);
8122c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt		if (ret < 0 || ret >= end - pos) {
8132c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt			printf("Too long LOG_LEVEL command.\n");
8142c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt			return -1;
8152c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt		}
8162c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt		pos += ret;
8172c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt	}
8182c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt
8192c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
8202c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt}
8212c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt#endif /* ANDROID */
8222c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt
8232c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt
824526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_cli_cmd_list_networks(struct wpa_ctrl *ctrl, int argc,
825526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				     char *argv[])
826526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
827526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return wpa_ctrl_command(ctrl, "LIST_NETWORKS");
828526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
829526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
830526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
831526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_cli_cmd_select_network(struct wpa_ctrl *ctrl, int argc,
832526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				      char *argv[])
833526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
834526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	char cmd[32];
835526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	int res;
836526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
837526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (argc < 1) {
838526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		printf("Invalid SELECT_NETWORK command: needs one argument "
839526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		       "(network id)\n");
840526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return -1;
841526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
842526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
843526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "SELECT_NETWORK %s", argv[0]);
844526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
845526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return -1;
846526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
847526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
848526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
849526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
850526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
851526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
852526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_cli_cmd_enable_network(struct wpa_ctrl *ctrl, int argc,
853526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				      char *argv[])
854526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
855526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	char cmd[32];
856526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	int res;
857526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
858526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (argc < 1) {
859526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		printf("Invalid ENABLE_NETWORK command: needs one argument "
860526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		       "(network id)\n");
861526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return -1;
862526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
863526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
864526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "ENABLE_NETWORK %s", argv[0]);
865526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
866526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return -1;
867526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
868526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
869526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
870526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
871526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
872526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
873526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_cli_cmd_disable_network(struct wpa_ctrl *ctrl, int argc,
874526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				       char *argv[])
875526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
876526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	char cmd[32];
877526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	int res;
878526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
879526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (argc < 1) {
880526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		printf("Invalid DISABLE_NETWORK command: needs one argument "
881526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		       "(network id)\n");
882526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return -1;
883526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
884526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
885526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "DISABLE_NETWORK %s", argv[0]);
886526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
887526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return -1;
888526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
889526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
890526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
891526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
892526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
893526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
894526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_cli_cmd_add_network(struct wpa_ctrl *ctrl, int argc,
895526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				   char *argv[])
896526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
897526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return wpa_ctrl_command(ctrl, "ADD_NETWORK");
898526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
899526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
900526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
901526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_cli_cmd_remove_network(struct wpa_ctrl *ctrl, int argc,
902526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				      char *argv[])
903526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
904526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	char cmd[32];
905526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	int res;
906526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
907526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (argc < 1) {
908526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		printf("Invalid REMOVE_NETWORK command: needs one argument "
909526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		       "(network id)\n");
910526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return -1;
911526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
912526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
913526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "REMOVE_NETWORK %s", argv[0]);
914526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
915526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return -1;
916526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
917526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
918526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
919526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
920526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
921526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
922526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic void wpa_cli_show_network_variables(void)
923526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
924526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	printf("set_network variables:\n"
925526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	       "  ssid (network name, SSID)\n"
926526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	       "  psk (WPA passphrase or pre-shared key)\n"
927526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	       "  key_mgmt (key management protocol)\n"
928526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	       "  identity (EAP identity)\n"
929526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	       "  password (EAP password)\n"
930526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	       "  ...\n"
931526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	       "\n"
932526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	       "Note: Values are entered in the same format as the "
933526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	       "configuration file is using,\n"
934526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	       "i.e., strings values need to be inside double quotation "
935526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	       "marks.\n"
936526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	       "For example: set_network 1 ssid \"network name\"\n"
937526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	       "\n"
938526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	       "Please see wpa_supplicant.conf documentation for full list "
939526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	       "of\navailable variables.\n");
940526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
941526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
942526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
943526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_cli_cmd_set_network(struct wpa_ctrl *ctrl, int argc,
944526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				   char *argv[])
945526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
946526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	char cmd[256];
947526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	int res;
948526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
949526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (argc == 0) {
950526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		wpa_cli_show_network_variables();
951526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return 0;
952526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
953526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
954526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (argc != 3) {
955526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		printf("Invalid SET_NETWORK command: needs three arguments\n"
956526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		       "(network id, variable name, and value)\n");
957526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return -1;
958526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
959526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
960526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "SET_NETWORK %s %s %s",
961526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			  argv[0], argv[1], argv[2]);
962526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
963526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		printf("Too long SET_NETWORK command.\n");
964526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return -1;
965526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
966526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
967526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
968526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
969526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
970526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_cli_cmd_get_network(struct wpa_ctrl *ctrl, int argc,
971526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				   char *argv[])
972526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
973526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	char cmd[256];
974526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	int res;
975526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
976526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (argc == 0) {
977526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		wpa_cli_show_network_variables();
978526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return 0;
979526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
980526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
981526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (argc != 2) {
982526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		printf("Invalid GET_NETWORK command: needs two arguments\n"
983526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		       "(network id and variable name)\n");
984526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return -1;
985526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
986526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
987526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "GET_NETWORK %s %s",
988526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			  argv[0], argv[1]);
989526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
990526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		printf("Too long GET_NETWORK command.\n");
991526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return -1;
992526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
993526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
994526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
995526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
996526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
997526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_cli_cmd_disconnect(struct wpa_ctrl *ctrl, int argc,
998526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				  char *argv[])
999526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
1000526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return wpa_ctrl_command(ctrl, "DISCONNECT");
1001526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
1002526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1003526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1004526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_cli_cmd_reconnect(struct wpa_ctrl *ctrl, int argc,
1005526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				  char *argv[])
1006526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
1007526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return wpa_ctrl_command(ctrl, "RECONNECT");
1008526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
1009526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1010526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1011526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_cli_cmd_save_config(struct wpa_ctrl *ctrl, int argc,
1012526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				   char *argv[])
1013526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
1014526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return wpa_ctrl_command(ctrl, "SAVE_CONFIG");
1015526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
1016526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1017526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1018526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_cli_cmd_scan(struct wpa_ctrl *ctrl, int argc, char *argv[])
1019526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
1020526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return wpa_ctrl_command(ctrl, "SCAN");
1021526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
1022526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1023526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1024526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_cli_cmd_scan_results(struct wpa_ctrl *ctrl, int argc,
1025526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				    char *argv[])
1026526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
1027526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return wpa_ctrl_command(ctrl, "SCAN_RESULTS");
1028526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
1029526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1030526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1031526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_cli_cmd_bss(struct wpa_ctrl *ctrl, int argc, char *argv[])
1032526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
1033526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	char cmd[64];
1034526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	int res;
1035526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1036526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (argc != 1) {
1037526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		printf("Invalid BSS command: need one argument (index or "
1038526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		       "BSSID)\n");
1039526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return -1;
1040526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
1041526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1042526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "BSS %s", argv[0]);
1043526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
1044526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return -1;
1045526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
1046526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1047526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
1048526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
1049526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1050526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1051526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_cli_cmd_get_capability(struct wpa_ctrl *ctrl, int argc,
1052526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				      char *argv[])
1053526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
1054526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	char cmd[64];
1055526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	int res;
1056526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1057526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (argc < 1 || argc > 2) {
1058526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		printf("Invalid GET_CAPABILITY command: need either one or "
1059526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		       "two arguments\n");
1060526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return -1;
1061526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
1062526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1063526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if ((argc == 2) && os_strcmp(argv[1], "strict") != 0) {
1064526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		printf("Invalid GET_CAPABILITY command: second argument, "
1065526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		       "if any, must be 'strict'\n");
1066526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return -1;
1067526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
1068526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1069526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "GET_CAPABILITY %s%s", argv[0],
1070526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			  (argc == 2) ? " strict" : "");
1071526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
1072526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return -1;
1073526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
1074526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1075526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
1076526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
1077526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1078526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1079526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_cli_list_interfaces(struct wpa_ctrl *ctrl)
1080526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
1081526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	printf("Available interfaces:\n");
1082526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return wpa_ctrl_command(ctrl, "INTERFACES");
1083526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
1084526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1085526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1086526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_cli_cmd_interface(struct wpa_ctrl *ctrl, int argc, char *argv[])
1087526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
1088526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (argc < 1) {
1089526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		wpa_cli_list_interfaces(ctrl);
1090526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return 0;
1091526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
1092526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1093526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	wpa_cli_close_connection();
1094526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	os_free(ctrl_ifname);
1095526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	ctrl_ifname = os_strdup(argv[0]);
1096526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
10972c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt	if ((ctrl_conn = wpa_cli_open_connection(ctrl_ifname)) != NULL) {
1098526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		printf("Connected to interface '%s.\n", ctrl_ifname);
10992c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt		if (wpa_ctrl_attach(monitor_conn) == 0) {
1100526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			wpa_cli_attached = 1;
1101526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		} else {
1102526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			printf("Warning: Failed to attach to "
1103526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			       "wpa_supplicant.\n");
1104526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		}
1105526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	} else {
1106526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		printf("Could not connect to interface '%s' - re-trying\n",
1107526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		       ctrl_ifname);
1108526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
1109526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return 0;
1110526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
1111526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1112526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1113526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_cli_cmd_reconfigure(struct wpa_ctrl *ctrl, int argc,
1114526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				   char *argv[])
1115526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
1116526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return wpa_ctrl_command(ctrl, "RECONFIGURE");
1117526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
1118526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1119526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1120526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_cli_cmd_terminate(struct wpa_ctrl *ctrl, int argc,
1121526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				 char *argv[])
1122526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
1123526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return wpa_ctrl_command(ctrl, "TERMINATE");
1124526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
1125526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1126526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1127526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_cli_cmd_interface_add(struct wpa_ctrl *ctrl, int argc,
1128526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				     char *argv[])
1129526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
1130526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	char cmd[256];
1131526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	int res;
1132526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1133526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (argc < 1) {
1134526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		printf("Invalid INTERFACE_ADD command: needs at least one "
1135526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		       "argument (interface name)\n"
1136526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		       "All arguments: ifname confname driver ctrl_interface "
1137526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		       "driver_param bridge_name\n");
1138526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return -1;
1139526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
1140526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1141526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	/*
1142526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	 * INTERFACE_ADD <ifname>TAB<confname>TAB<driver>TAB<ctrl_interface>TAB
1143526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	 * <driver_param>TAB<bridge_name>
1144526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	 */
1145526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd),
1146526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			  "INTERFACE_ADD %s\t%s\t%s\t%s\t%s\t%s",
1147526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			  argv[0],
1148526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			  argc > 1 ? argv[1] : "", argc > 2 ? argv[2] : "",
1149526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			  argc > 3 ? argv[3] : "", argc > 4 ? argv[4] : "",
1150526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			  argc > 5 ? argv[5] : "");
1151526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
1152526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return -1;
1153526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
1154526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
1155526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
1156526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1157526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1158526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_cli_cmd_interface_remove(struct wpa_ctrl *ctrl, int argc,
1159526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt					char *argv[])
1160526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
1161526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	char cmd[128];
1162526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	int res;
1163526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1164526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (argc != 1) {
1165526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		printf("Invalid INTERFACE_REMOVE command: needs one argument "
1166526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		       "(interface name)\n");
1167526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return -1;
1168526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
1169526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1170526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "INTERFACE_REMOVE %s", argv[0]);
1171526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
1172526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return -1;
1173526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
1174526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
1175526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
1176526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1177526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1178526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_cli_cmd_interface_list(struct wpa_ctrl *ctrl, int argc,
1179526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				      char *argv[])
1180526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
1181526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return wpa_ctrl_command(ctrl, "INTERFACE_LIST");
1182526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
1183526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1184526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
11852c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidtstatic int wpa_cli_cmd_driver(struct wpa_ctrl *ctrl, int argc,
11862c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt				      char *argv[])
11872c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt{
11882c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt	char cmd[32];
11892c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt
11902c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt	if (argc < 1) {
11912c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt		printf("Invalid DRIVER command: needs one argument (cmd)\n");
11922c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt		return -1;
11932c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt	}
11942c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt
11952c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt	if (argc > 1)
11962c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt		os_snprintf(cmd, sizeof(cmd), "DRIVER %s %s", argv[0], argv[1]);
11972c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt	else
11982c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt		os_snprintf(cmd, sizeof(cmd), "DRIVER %s", argv[0]);
11992c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
12002c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt
12012c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
12022c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt}
12032c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt
12042c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt
1205526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtenum wpa_cli_cmd_flags {
1206526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	cli_cmd_flag_none		= 0x00,
1207526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	cli_cmd_flag_sensitive		= 0x01
1208526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt};
1209526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1210526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstruct wpa_cli_cmd {
1211526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	const char *cmd;
1212526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	int (*handler)(struct wpa_ctrl *ctrl, int argc, char *argv[]);
1213526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	enum wpa_cli_cmd_flags flags;
1214526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	const char *usage;
1215526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt};
1216526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1217526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic struct wpa_cli_cmd wpa_cli_commands[] = {
1218526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	{ "status", wpa_cli_cmd_status,
1219526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  cli_cmd_flag_none,
1220526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  "[verbose] = get current WPA/EAPOL/EAP status" },
1221526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	{ "ping", wpa_cli_cmd_ping,
1222526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  cli_cmd_flag_none,
1223526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  "= pings wpa_supplicant" },
1224526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	{ "mib", wpa_cli_cmd_mib,
1225526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  cli_cmd_flag_none,
1226526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  "= get MIB variables (dot1x, dot11)" },
1227526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	{ "help", wpa_cli_cmd_help,
1228526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  cli_cmd_flag_none,
1229526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  "= show this usage help" },
1230526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	{ "interface", wpa_cli_cmd_interface,
1231526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  cli_cmd_flag_none,
1232526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  "[ifname] = show interfaces/select interface" },
1233526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	{ "level", wpa_cli_cmd_level,
1234526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  cli_cmd_flag_none,
1235526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  "<debug level> = change debug level" },
1236526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	{ "license", wpa_cli_cmd_license,
1237526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  cli_cmd_flag_none,
1238526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  "= show full wpa_cli license" },
1239526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	{ "quit", wpa_cli_cmd_quit,
1240526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  cli_cmd_flag_none,
1241526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  "= exit wpa_cli" },
1242526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	{ "set", wpa_cli_cmd_set,
1243526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  cli_cmd_flag_none,
1244526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  "= set variables (shows list of variables when run without "
1245526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  "arguments)" },
1246526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	{ "logon", wpa_cli_cmd_logon,
1247526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  cli_cmd_flag_none,
1248526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  "= IEEE 802.1X EAPOL state machine logon" },
1249526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	{ "logoff", wpa_cli_cmd_logoff,
1250526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  cli_cmd_flag_none,
1251526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  "= IEEE 802.1X EAPOL state machine logoff" },
1252526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	{ "pmksa", wpa_cli_cmd_pmksa,
1253526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  cli_cmd_flag_none,
1254526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  "= show PMKSA cache" },
1255526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	{ "reassociate", wpa_cli_cmd_reassociate,
1256526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  cli_cmd_flag_none,
1257526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  "= force reassociation" },
1258526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	{ "preauthenticate", wpa_cli_cmd_preauthenticate,
1259526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  cli_cmd_flag_none,
1260526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  "<BSSID> = force preauthentication" },
1261526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	{ "identity", wpa_cli_cmd_identity,
1262526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  cli_cmd_flag_none,
1263526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  "<network id> <identity> = configure identity for an SSID" },
1264526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	{ "password", wpa_cli_cmd_password,
1265526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  cli_cmd_flag_sensitive,
1266526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  "<network id> <password> = configure password for an SSID" },
1267526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	{ "new_password", wpa_cli_cmd_new_password,
1268526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  cli_cmd_flag_sensitive,
1269526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  "<network id> <password> = change password for an SSID" },
1270526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	{ "pin", wpa_cli_cmd_pin,
1271526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  cli_cmd_flag_sensitive,
1272526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  "<network id> <pin> = configure pin for an SSID" },
1273526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	{ "otp", wpa_cli_cmd_otp,
1274526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  cli_cmd_flag_sensitive,
1275526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  "<network id> <password> = configure one-time-password for an SSID"
1276526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	},
1277526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	{ "passphrase", wpa_cli_cmd_passphrase,
1278526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  cli_cmd_flag_sensitive,
1279526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  "<network id> <passphrase> = configure private key passphrase\n"
1280526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  "  for an SSID" },
1281526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	{ "bssid", wpa_cli_cmd_bssid,
1282526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  cli_cmd_flag_none,
1283526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  "<network id> <BSSID> = set preferred BSSID for an SSID" },
12842c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt#ifdef ANDROID
1285eee21e1de8514a43f3e9089c136e7e27cc27a9fcDmitry Shmidt	{ "scan_interval", wpa_cli_cmd_scan_interval,
1286eee21e1de8514a43f3e9089c136e7e27cc27a9fcDmitry Shmidt	  cli_cmd_flag_none,
1287eee21e1de8514a43f3e9089c136e7e27cc27a9fcDmitry Shmidt	  "<value> = set scan_interval parameter" },
12882c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt	{ "blacklist", wpa_cli_cmd_blacklist,
12892c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt	  cli_cmd_flag_none,
12902c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt	  "<BSSID> = add a BSSID to the blacklist\n"
12912c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt	  "blacklist clear = clear the blacklist\n"
12922c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt	  "blacklist = display the blacklist" },
12932c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt	{ "log_level", wpa_cli_cmd_log_level,
12942c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt	  cli_cmd_flag_none,
12952c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt	  "<level> [<timestamp>] = update the log level/timestamp of wpa_supplicant\n"
12962c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt	  "log_level = display the current log level and log options" },
12972c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt#endif
12982c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt    { "list_networks", wpa_cli_cmd_list_networks,
1299526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  cli_cmd_flag_none,
1300526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  "= list configured networks" },
1301526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	{ "select_network", wpa_cli_cmd_select_network,
1302526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  cli_cmd_flag_none,
1303526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  "<network id> = select a network (disable others)" },
1304526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	{ "enable_network", wpa_cli_cmd_enable_network,
1305526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  cli_cmd_flag_none,
1306526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  "<network id> = enable a network" },
1307526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	{ "disable_network", wpa_cli_cmd_disable_network,
1308526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  cli_cmd_flag_none,
1309526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  "<network id> = disable a network" },
1310526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	{ "add_network", wpa_cli_cmd_add_network,
1311526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  cli_cmd_flag_none,
1312526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  "= add a network" },
1313526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	{ "remove_network", wpa_cli_cmd_remove_network,
1314526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  cli_cmd_flag_none,
1315526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  "<network id> = remove a network" },
1316526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	{ "set_network", wpa_cli_cmd_set_network,
1317526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  cli_cmd_flag_sensitive,
1318526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  "<network id> <variable> <value> = set network variables (shows\n"
1319526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  "  list of variables when run without arguments)" },
1320526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	{ "get_network", wpa_cli_cmd_get_network,
1321526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  cli_cmd_flag_none,
1322526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  "<network id> <variable> = get network variables" },
1323526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	{ "save_config", wpa_cli_cmd_save_config,
1324526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  cli_cmd_flag_none,
1325526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  "= save the current configuration" },
1326526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	{ "disconnect", wpa_cli_cmd_disconnect,
1327526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  cli_cmd_flag_none,
1328526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  "= disconnect and wait for reassociate/reconnect command before\n"
1329526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  "  connecting" },
1330526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	{ "reconnect", wpa_cli_cmd_reconnect,
1331526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  cli_cmd_flag_none,
1332526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  "= like reassociate, but only takes effect if already disconnected"
1333526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	},
1334526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	{ "scan", wpa_cli_cmd_scan,
1335526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  cli_cmd_flag_none,
1336526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  "= request new BSS scan" },
1337526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	{ "scan_results", wpa_cli_cmd_scan_results,
1338526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  cli_cmd_flag_none,
1339526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  "= get latest scan results" },
1340526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	{ "bss", wpa_cli_cmd_bss,
1341526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  cli_cmd_flag_none,
1342526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  "<<idx> | <bssid>> = get detailed scan result info" },
1343526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	{ "get_capability", wpa_cli_cmd_get_capability,
1344526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  cli_cmd_flag_none,
1345526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  "<eap/pairwise/group/key_mgmt/proto/auth_alg> = get capabilies" },
1346526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	{ "reconfigure", wpa_cli_cmd_reconfigure,
1347526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  cli_cmd_flag_none,
1348526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  "= force wpa_supplicant to re-read its configuration file" },
1349526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	{ "terminate", wpa_cli_cmd_terminate,
1350526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  cli_cmd_flag_none,
1351526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  "= terminate wpa_supplicant" },
1352526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	{ "interface_add", wpa_cli_cmd_interface_add,
1353526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  cli_cmd_flag_none,
1354526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  "<ifname> <confname> <driver> <ctrl_interface> <driver_param>\n"
1355526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  "  <bridge_name> = adds new interface, all parameters but <ifname>\n"
1356526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  "  are optional" },
1357526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	{ "interface_remove", wpa_cli_cmd_interface_remove,
1358526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  cli_cmd_flag_none,
1359526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  "<ifname> = removes the interface" },
1360526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	{ "interface_list", wpa_cli_cmd_interface_list,
1361526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  cli_cmd_flag_none,
1362526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  "= list available interfaces" },
1363526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	{ "ap_scan", wpa_cli_cmd_ap_scan,
1364526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  cli_cmd_flag_none,
1365526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  "<value> = set ap_scan parameter" },
1366526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	{ "stkstart", wpa_cli_cmd_stkstart,
1367526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  cli_cmd_flag_none,
1368526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  "<addr> = request STK negotiation with <addr>" },
1369526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	{ "ft_ds", wpa_cli_cmd_ft_ds,
1370526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  cli_cmd_flag_none,
1371526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  "<addr> = request over-the-DS FT with <addr>" },
1372526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	{ "wps_pbc", wpa_cli_cmd_wps_pbc,
1373526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  cli_cmd_flag_none,
1374526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  "[BSSID] = start Wi-Fi Protected Setup: Push Button Configuration" },
1375526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	{ "wps_pin", wpa_cli_cmd_wps_pin,
1376526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  cli_cmd_flag_sensitive,
1377526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  "<BSSID> [PIN] = start WPS PIN method (returns PIN, if not "
1378526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  "hardcoded)" },
1379526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	{ "wps_reg", wpa_cli_cmd_wps_reg,
1380526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  cli_cmd_flag_sensitive,
1381526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	  "<BSSID> <AP PIN> = start WPS Registrar to configure an AP" },
13822c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt	{ "driver", wpa_cli_cmd_driver,
13832c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt	  cli_cmd_flag_none,
13842c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt	  "<command> = driver private commands" },
1385526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	{ NULL, NULL, cli_cmd_flag_none, NULL }
1386526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt};
1387526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1388526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1389526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/*
1390526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Prints command usage, lines are padded with the specified string.
1391526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */
1392526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic void print_cmd_help(struct wpa_cli_cmd *cmd, const char *pad)
1393526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
1394526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	char c;
1395526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	size_t n;
1396526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1397526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	printf("%s%s ", pad, cmd->cmd);
1398526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	for (n = 0; (c = cmd->usage[n]); n++) {
1399526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		printf("%c", c);
1400526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		if (c == '\n')
1401526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			printf("%s", pad);
1402526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
1403526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	printf("\n");
1404526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
1405526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1406526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1407526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic void print_help(void)
1408526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
1409526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	int n;
1410526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	printf("commands:\n");
1411526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	for (n = 0; wpa_cli_commands[n].cmd; n++)
1412526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		print_cmd_help(&wpa_cli_commands[n], "  ");
1413526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
1414526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1415526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1416526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef CONFIG_READLINE
1417526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int cmd_has_sensitive_data(const char *cmd)
1418526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
1419526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	const char *c, *delim;
1420526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	int n;
1421526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	size_t len;
1422526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1423526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	delim = os_strchr(cmd, ' ');
1424526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (delim)
1425526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		len = delim - cmd;
1426526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	else
1427526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		len = os_strlen(cmd);
1428526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1429526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	for (n = 0; (c = wpa_cli_commands[n].cmd); n++) {
1430526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		if (os_strncasecmp(cmd, c, len) == 0 && len == os_strlen(c))
1431526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			return (wpa_cli_commands[n].flags &
1432526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				cli_cmd_flag_sensitive);
1433526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
1434526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return 0;
1435526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
1436526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* CONFIG_READLINE */
1437526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1438526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1439526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_request(struct wpa_ctrl *ctrl, int argc, char *argv[])
1440526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
1441526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	struct wpa_cli_cmd *cmd, *match = NULL;
1442526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	int count;
1443526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	int ret = 0;
1444526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1445526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	count = 0;
1446526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	cmd = wpa_cli_commands;
1447526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	while (cmd->cmd) {
1448526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		if (os_strncasecmp(cmd->cmd, argv[0], os_strlen(argv[0])) == 0)
1449526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		{
1450526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			match = cmd;
1451526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			if (os_strcasecmp(cmd->cmd, argv[0]) == 0) {
1452526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				/* we have an exact match */
1453526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				count = 1;
1454526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				break;
1455526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			}
1456526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			count++;
1457526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		}
1458526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		cmd++;
1459526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
1460526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1461526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (count > 1) {
1462526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		printf("Ambiguous command '%s'; possible commands:", argv[0]);
1463526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		cmd = wpa_cli_commands;
1464526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		while (cmd->cmd) {
1465526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			if (os_strncasecmp(cmd->cmd, argv[0],
1466526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt					   os_strlen(argv[0])) == 0) {
1467526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				printf(" %s", cmd->cmd);
1468526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			}
1469526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			cmd++;
1470526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		}
1471526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		printf("\n");
1472526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		ret = 1;
1473526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	} else if (count == 0) {
1474526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		printf("Unknown command '%s'\n", argv[0]);
1475526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		ret = 1;
1476526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	} else {
14772c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt        if( os_strncasecmp( "level", argv[0], os_strlen(argv[0]) ) == 0 )  {
14782c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt            ctrl = monitor_conn;
14792c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt        }
1480526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		ret = match->handler(ctrl, argc - 1, &argv[1]);
1481526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
1482526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1483526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return ret;
1484526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
1485526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1486526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1487526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int str_match(const char *a, const char *b)
1488526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
1489526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return os_strncmp(a, b, os_strlen(b)) == 0;
1490526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
1491526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1492526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1493526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_cli_exec(const char *program, const char *arg1,
1494526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			const char *arg2)
1495526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
1496526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	char *cmd;
1497526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	size_t len;
1498526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	int res;
1499526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	int ret = 0;
1500526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1501526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	len = os_strlen(program) + os_strlen(arg1) + os_strlen(arg2) + 3;
1502526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	cmd = os_malloc(len);
1503526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (cmd == NULL)
1504526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return -1;
1505526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	res = os_snprintf(cmd, len, "%s %s %s", program, arg1, arg2);
1506526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (res < 0 || (size_t) res >= len) {
1507526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		os_free(cmd);
1508526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return -1;
1509526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
1510526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	cmd[len - 1] = '\0';
1511526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifndef _WIN32_WCE
1512526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (system(cmd) < 0)
1513526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		ret = -1;
1514526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* _WIN32_WCE */
1515526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	os_free(cmd);
1516526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1517526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return ret;
1518526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
1519526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1520526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1521526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic void wpa_cli_action_process(const char *msg)
1522526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
1523526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	const char *pos;
1524526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	char *copy = NULL, *id, *pos2;
1525526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1526526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	pos = msg;
1527526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (*pos == '<') {
1528526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		/* skip priority */
1529526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		pos = os_strchr(pos, '>');
1530526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		if (pos)
1531526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			pos++;
1532526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		else
1533526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			pos = msg;
1534526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
1535526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1536526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (str_match(pos, WPA_EVENT_CONNECTED)) {
1537526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		int new_id = -1;
1538526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		os_unsetenv("WPA_ID");
1539526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		os_unsetenv("WPA_ID_STR");
1540526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		os_unsetenv("WPA_CTRL_DIR");
1541526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1542526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		pos = os_strstr(pos, "[id=");
1543526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		if (pos)
1544526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			copy = os_strdup(pos + 4);
1545526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1546526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		if (copy) {
1547526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			pos2 = id = copy;
1548526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			while (*pos2 && *pos2 != ' ')
1549526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				pos2++;
1550526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			*pos2++ = '\0';
1551526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			new_id = atoi(id);
1552526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			os_setenv("WPA_ID", id, 1);
1553526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			while (*pos2 && *pos2 != '=')
1554526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				pos2++;
1555526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			if (*pos2 == '=')
1556526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				pos2++;
1557526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			id = pos2;
1558526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			while (*pos2 && *pos2 != ']')
1559526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				pos2++;
1560526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			*pos2 = '\0';
1561526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			os_setenv("WPA_ID_STR", id, 1);
1562526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			os_free(copy);
1563526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		}
1564526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1565526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		os_setenv("WPA_CTRL_DIR", ctrl_iface_dir, 1);
1566526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1567526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		if (!wpa_cli_connected || new_id != wpa_cli_last_id) {
1568526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			wpa_cli_connected = 1;
1569526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			wpa_cli_last_id = new_id;
1570526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			wpa_cli_exec(action_file, ctrl_ifname, "CONNECTED");
1571526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		}
1572526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	} else if (str_match(pos, WPA_EVENT_DISCONNECTED)) {
1573526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		if (wpa_cli_connected) {
1574526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			wpa_cli_connected = 0;
1575526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			wpa_cli_exec(action_file, ctrl_ifname, "DISCONNECTED");
1576526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		}
1577526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	} else if (str_match(pos, WPA_EVENT_TERMINATING)) {
1578526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		printf("wpa_supplicant is terminating - stop monitoring\n");
1579526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		wpa_cli_quit = 1;
1580526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
1581526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
1582526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1583526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1584526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifndef CONFIG_ANSI_C_EXTRA
1585526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic void wpa_cli_action_cb(char *msg, size_t len)
1586526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
1587526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	wpa_cli_action_process(msg);
1588526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
1589526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* CONFIG_ANSI_C_EXTRA */
1590526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1591526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1592526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic void wpa_cli_reconnect(void)
1593526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
1594526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	wpa_cli_close_connection();
1595526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	ctrl_conn = wpa_cli_open_connection(ctrl_ifname);
1596526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (ctrl_conn) {
1597526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		printf("Connection to wpa_supplicant re-established\n");
15982c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt		if (wpa_ctrl_attach(monitor_conn) == 0) {
1599526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			wpa_cli_attached = 1;
1600526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		} else {
1601526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			printf("Warning: Failed to attach to "
1602526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			       "wpa_supplicant.\n");
1603526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		}
1604526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
1605526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
1606526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1607526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1608526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic void wpa_cli_recv_pending(struct wpa_ctrl *ctrl, int in_read,
1609526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				 int action_monitor)
1610526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
1611526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	int first = 1;
16122c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt	if (ctrl == NULL) {
1613526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		wpa_cli_reconnect();
1614526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return;
1615526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
1616526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	while (wpa_ctrl_pending(ctrl) > 0) {
1617526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		char buf[256];
1618526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		size_t len = sizeof(buf) - 1;
1619526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		if (wpa_ctrl_recv(ctrl, buf, &len) == 0) {
1620526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			buf[len] = '\0';
1621526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			if (action_monitor)
1622526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				wpa_cli_action_process(buf);
1623526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			else {
1624526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				if (in_read && first)
1625526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt					printf("\n");
1626526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				first = 0;
1627526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				printf("%s\n", buf);
1628526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			}
1629526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		} else {
1630526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			printf("Could not read pending message.\n");
1631526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			break;
1632526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		}
1633526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
1634526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1635526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (wpa_ctrl_pending(ctrl) < 0) {
1636526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		printf("Connection to wpa_supplicant lost - trying to "
1637526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		       "reconnect\n");
1638526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		wpa_cli_reconnect();
1639526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
1640526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
1641526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1642526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1643526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef CONFIG_READLINE
1644526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic char * wpa_cli_cmd_gen(const char *text, int state)
1645526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
1646526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	static int i, len;
1647526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	const char *cmd;
1648526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1649526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (state == 0) {
1650526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		i = 0;
1651526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		len = os_strlen(text);
1652526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
1653526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1654526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	while ((cmd = wpa_cli_commands[i].cmd)) {
1655526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		i++;
1656526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		if (os_strncasecmp(cmd, text, len) == 0)
1657526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			return os_strdup(cmd);
1658526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
1659526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1660526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return NULL;
1661526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
1662526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1663526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1664526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic char * wpa_cli_dummy_gen(const char *text, int state)
1665526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
1666526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return NULL;
1667526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
1668526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1669526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1670526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic char ** wpa_cli_completion(const char *text, int start, int end)
1671526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
1672526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return rl_completion_matches(text, start == 0 ?
1673526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				     wpa_cli_cmd_gen : wpa_cli_dummy_gen);
1674526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
1675526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* CONFIG_READLINE */
1676526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1677526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1678526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic void wpa_cli_interactive(void)
1679526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
1680526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#define max_args 10
1681526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	char cmdbuf[256], *cmd, *argv[max_args], *pos;
1682526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	int argc;
1683526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef CONFIG_READLINE
1684526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	char *home, *hfile = NULL;
1685526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* CONFIG_READLINE */
1686526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1687526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	printf("\nInteractive mode\n\n");
1688526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1689526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef CONFIG_READLINE
1690526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	rl_attempted_completion_function = wpa_cli_completion;
1691526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	home = getenv("HOME");
1692526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (home) {
1693526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		const char *fname = ".wpa_cli_history";
1694526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		int hfile_len = os_strlen(home) + 1 + os_strlen(fname) + 1;
1695526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		hfile = os_malloc(hfile_len);
1696526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		if (hfile) {
1697526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			int res;
1698526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			res = os_snprintf(hfile, hfile_len, "%s/%s", home,
1699526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt					  fname);
1700526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			if (res >= 0 && res < hfile_len) {
1701526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				hfile[hfile_len - 1] = '\0';
1702526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				read_history(hfile);
1703526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				stifle_history(100);
1704526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			}
1705526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		}
1706526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
1707526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* CONFIG_READLINE */
1708526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1709526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	do {
17102c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt		wpa_cli_recv_pending(monitor_conn, 0, 0);
1711526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifndef CONFIG_NATIVE_WINDOWS
1712526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		alarm(ping_interval);
1713526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* CONFIG_NATIVE_WINDOWS */
1714526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef CONFIG_READLINE
1715526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		cmd = readline("> ");
1716526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		if (cmd && *cmd) {
1717526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			HIST_ENTRY *h;
1718526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			while (next_history())
1719526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				;
1720526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			h = previous_history();
1721526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			if (h == NULL || os_strcmp(cmd, h->line) != 0)
1722526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				add_history(cmd);
1723526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			next_history();
1724526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		}
1725526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#else /* CONFIG_READLINE */
1726526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		printf("> ");
1727526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		cmd = fgets(cmdbuf, sizeof(cmdbuf), stdin);
1728526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* CONFIG_READLINE */
1729526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifndef CONFIG_NATIVE_WINDOWS
1730526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		alarm(0);
1731526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* CONFIG_NATIVE_WINDOWS */
1732526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		if (cmd == NULL)
1733526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			break;
17342c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt		wpa_cli_recv_pending(monitor_conn, 0, 0);
1735526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		pos = cmd;
1736526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		while (*pos != '\0') {
1737526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			if (*pos == '\n') {
1738526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				*pos = '\0';
1739526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				break;
1740526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			}
1741526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			pos++;
1742526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		}
1743526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		argc = 0;
1744526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		pos = cmd;
1745526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		for (;;) {
1746526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			while (*pos == ' ')
1747526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				pos++;
1748526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			if (*pos == '\0')
1749526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				break;
1750526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			argv[argc] = pos;
1751526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			argc++;
1752526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			if (argc == max_args)
1753526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				break;
1754526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			if (*pos == '"') {
1755526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				char *pos2 = os_strrchr(pos, '"');
1756526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				if (pos2)
1757526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt					pos = pos2 + 1;
1758526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			}
1759526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			while (*pos != '\0' && *pos != ' ')
1760526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				pos++;
1761526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			if (*pos == ' ')
1762526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				*pos++ = '\0';
1763526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		}
1764526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		if (argc)
1765526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			wpa_request(ctrl_conn, argc, argv);
1766526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1767526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		if (cmd != cmdbuf)
1768526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			os_free(cmd);
1769526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	} while (!wpa_cli_quit);
1770526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1771526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef CONFIG_READLINE
1772526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (hfile) {
1773526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		/* Save command history, excluding lines that may contain
1774526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		 * passwords. */
1775526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		HIST_ENTRY *h;
1776526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		history_set_pos(0);
1777526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		while ((h = current_history())) {
1778526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			char *p = h->line;
1779526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			while (*p == ' ' || *p == '\t')
1780526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				p++;
1781526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			if (cmd_has_sensitive_data(p)) {
1782526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				h = remove_history(where_history());
1783526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				if (h) {
1784526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt					os_free(h->line);
1785526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt					os_free(h->data);
1786526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt					os_free(h);
1787526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				} else
1788526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt					next_history();
1789526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			} else
1790526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				next_history();
1791526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		}
1792526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		write_history(hfile);
1793526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		os_free(hfile);
1794526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
1795526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* CONFIG_READLINE */
1796526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
1797526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1798526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1799526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic void wpa_cli_action(struct wpa_ctrl *ctrl)
1800526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
1801526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef CONFIG_ANSI_C_EXTRA
1802526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	/* TODO: ANSI C version(?) */
1803526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	printf("Action processing not supported in ANSI C build.\n");
1804526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#else /* CONFIG_ANSI_C_EXTRA */
1805526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	fd_set rfds;
1806526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	int fd, res;
1807526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	struct timeval tv;
1808526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	char buf[256]; /* note: large enough to fit in unsolicited messages */
1809526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	size_t len;
1810526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1811526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	fd = wpa_ctrl_get_fd(ctrl);
1812526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1813526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	while (!wpa_cli_quit) {
1814526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		FD_ZERO(&rfds);
1815526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		FD_SET(fd, &rfds);
1816526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		tv.tv_sec = ping_interval;
1817526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		tv.tv_usec = 0;
1818526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		res = select(fd + 1, &rfds, NULL, NULL, &tv);
1819526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		if (res < 0 && errno != EINTR) {
1820526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			perror("select");
1821526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			break;
1822526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		}
1823526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1824526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		if (FD_ISSET(fd, &rfds))
1825526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			wpa_cli_recv_pending(ctrl, 0, 1);
1826526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		else {
1827526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			/* verify that connection is still working */
1828526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			len = sizeof(buf) - 1;
1829526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			if (wpa_ctrl_request(ctrl, "PING", 4, buf, &len,
1830526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt					     wpa_cli_action_cb) < 0 ||
1831526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			    len < 4 || os_memcmp(buf, "PONG", 4) != 0) {
1832526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				printf("wpa_supplicant did not reply to PING "
1833526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				       "command - exiting\n");
1834526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				break;
1835526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			}
1836526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		}
1837526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
1838526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* CONFIG_ANSI_C_EXTRA */
1839526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
1840526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1841526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1842526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic void wpa_cli_cleanup(void)
1843526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
1844526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	wpa_cli_close_connection();
1845526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (pid_file)
1846526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		os_daemonize_terminate(pid_file);
1847526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1848526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	os_program_deinit();
1849526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
1850526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1851526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic void wpa_cli_terminate(int sig)
1852526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
1853526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	wpa_cli_cleanup();
1854526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	exit(0);
1855526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
1856526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1857526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1858526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifndef CONFIG_NATIVE_WINDOWS
1859526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic void wpa_cli_alarm(int sig)
1860526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
1861526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (ctrl_conn && _wpa_ctrl_command(ctrl_conn, "PING", 0)) {
1862526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		printf("Connection to wpa_supplicant lost - trying to "
1863526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		       "reconnect\n");
1864526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		wpa_cli_close_connection();
1865526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
18662c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt	if (!monitor_conn)
1867526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		wpa_cli_reconnect();
18682c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt	if (monitor_conn)
18692c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt		wpa_cli_recv_pending(monitor_conn, 1, 0);
1870526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	alarm(ping_interval);
1871526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
1872526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* CONFIG_NATIVE_WINDOWS */
1873526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1874526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1875526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic char * wpa_cli_get_default_ifname(void)
1876526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
1877526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	char *ifname = NULL;
1878526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1879526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef CONFIG_CTRL_IFACE_UNIX
1880526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	struct dirent *dent;
1881526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	DIR *dir = opendir(ctrl_iface_dir);
18822c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt	if (!dir) {
18832c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt#ifdef ANDROID
18842c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt		char ifprop[PROPERTY_VALUE_MAX];
18852c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt		if (property_get("wifi.interface", ifprop, NULL) != 0) {
18862c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt			ifname = os_strdup(ifprop);
18872c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt			printf("Using interface '%s'\n", ifname);
18882c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt			return ifname;
18892c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt		}
18902c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt#endif
1891526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return NULL;
18922c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt	}
1893526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	while ((dent = readdir(dir))) {
1894526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef _DIRENT_HAVE_D_TYPE
1895526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		/*
1896526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		 * Skip the file if it is not a socket. Also accept
1897526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		 * DT_UNKNOWN (0) in case the C library or underlying
1898526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		 * file system does not support d_type.
1899526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		 */
1900526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		if (dent->d_type != DT_SOCK && dent->d_type != DT_UNKNOWN)
1901526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			continue;
1902526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* _DIRENT_HAVE_D_TYPE */
1903526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		if (os_strcmp(dent->d_name, ".") == 0 ||
1904526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		    os_strcmp(dent->d_name, "..") == 0)
1905526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			continue;
1906526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		printf("Selected interface '%s'\n", dent->d_name);
1907526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		ifname = os_strdup(dent->d_name);
1908526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		break;
1909526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
1910526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	closedir(dir);
1911526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* CONFIG_CTRL_IFACE_UNIX */
1912526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1913526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef CONFIG_CTRL_IFACE_NAMED_PIPE
19142c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt	char buf[4096], *pos;
1915526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	size_t len;
1916526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	struct wpa_ctrl *ctrl;
1917526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	int ret;
1918526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1919526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	ctrl = wpa_ctrl_open(NULL);
1920526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (ctrl == NULL)
1921526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return NULL;
1922526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1923526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	len = sizeof(buf) - 1;
1924526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	ret = wpa_ctrl_request(ctrl, "INTERFACES", 10, buf, &len, NULL);
1925526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (ret >= 0) {
1926526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		buf[len] = '\0';
1927526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		pos = os_strchr(buf, '\n');
1928526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		if (pos)
1929526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			*pos = '\0';
1930526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		ifname = os_strdup(buf);
1931526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
1932526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	wpa_ctrl_close(ctrl);
1933526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* CONFIG_CTRL_IFACE_NAMED_PIPE */
1934526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1935526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return ifname;
1936526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
1937526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1938526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1939526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtint main(int argc, char *argv[])
1940526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
1941526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	int interactive;
1942526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	int warning_displayed = 0;
1943526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	int c;
1944526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	int daemonize = 0;
1945526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	int ret = 0;
1946526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	const char *global = NULL;
1947526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1948526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (os_program_init())
1949526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return -1;
1950526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1951526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	for (;;) {
1952526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		c = getopt(argc, argv, "a:Bg:G:hi:p:P:v");
1953526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		if (c < 0)
1954526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			break;
1955526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		switch (c) {
1956526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		case 'a':
1957526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			action_file = optarg;
1958526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			break;
1959526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		case 'B':
1960526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			daemonize = 1;
1961526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			break;
1962526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		case 'g':
1963526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			global = optarg;
1964526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			break;
1965526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		case 'G':
1966526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			ping_interval = atoi(optarg);
1967526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			break;
1968526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		case 'h':
1969526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			usage();
1970526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			return 0;
1971526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		case 'v':
1972526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			printf("%s\n", wpa_cli_version);
1973526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			return 0;
1974526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		case 'i':
1975526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			os_free(ctrl_ifname);
1976526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			ctrl_ifname = os_strdup(optarg);
1977526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			break;
1978526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		case 'p':
1979526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			ctrl_iface_dir = optarg;
1980526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			break;
1981526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		case 'P':
1982526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			pid_file = optarg;
1983526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			break;
1984526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		default:
1985526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			usage();
1986526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			return -1;
1987526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		}
1988526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
1989526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1990526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	interactive = (argc == optind) && (action_file == NULL);
1991526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1992526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (interactive)
1993526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		printf("%s\n\n%s\n\n", wpa_cli_version, wpa_cli_license);
1994526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
1995526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (global) {
1996526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef CONFIG_CTRL_IFACE_NAMED_PIPE
1997526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		ctrl_conn = wpa_ctrl_open(NULL);
1998526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#else /* CONFIG_CTRL_IFACE_NAMED_PIPE */
1999526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		ctrl_conn = wpa_ctrl_open(global);
2000526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* CONFIG_CTRL_IFACE_NAMED_PIPE */
2001526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		if (ctrl_conn == NULL) {
2002526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			perror("Failed to connect to wpa_supplicant - "
2003526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			       "wpa_ctrl_open");
2004526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			return -1;
2005526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		}
2006526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
2007526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
2008526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	for (; !global;) {
2009526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		if (ctrl_ifname == NULL)
2010526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			ctrl_ifname = wpa_cli_get_default_ifname();
2011526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		ctrl_conn = wpa_cli_open_connection(ctrl_ifname);
2012526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		if (ctrl_conn) {
2013526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			if (warning_displayed)
2014526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				printf("Connection established.\n");
2015526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			break;
2016526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		}
2017526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
2018526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		if (!interactive) {
2019526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			perror("Failed to connect to wpa_supplicant - "
2020526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			       "wpa_ctrl_open");
2021526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			return -1;
2022526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		}
2023526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
2024526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		if (!warning_displayed) {
2025526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			printf("Could not connect to wpa_supplicant - "
2026526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			       "re-trying\n");
2027526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			warning_displayed = 1;
2028526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		}
2029526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		os_sleep(1, 0);
2030526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		continue;
2031526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
2032526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
2033526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifndef _WIN32_WCE
2034526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	signal(SIGINT, wpa_cli_terminate);
2035526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	signal(SIGTERM, wpa_cli_terminate);
2036526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* _WIN32_WCE */
2037526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifndef CONFIG_NATIVE_WINDOWS
2038526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	signal(SIGALRM, wpa_cli_alarm);
2039526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* CONFIG_NATIVE_WINDOWS */
2040526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
2041526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (interactive || action_file) {
20422c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt		if (wpa_ctrl_attach(monitor_conn) == 0) {
2043526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			wpa_cli_attached = 1;
2044526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		} else {
2045526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			printf("Warning: Failed to attach to "
2046526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			       "wpa_supplicant.\n");
2047526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			if (!interactive)
2048526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				return -1;
2049526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		}
2050526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
2051526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
2052526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (daemonize && os_daemonize(pid_file))
2053526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return -1;
2054526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
2055526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (interactive)
2056526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		wpa_cli_interactive();
2057526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	else if (action_file)
2058526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		wpa_cli_action(ctrl_conn);
2059526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	else
2060526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		ret = wpa_request(ctrl_conn, argc - optind, &argv[optind]);
2061526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
2062526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	os_free(ctrl_ifname);
2063526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	wpa_cli_cleanup();
2064526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
2065526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return ret;
2066526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
2067526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
2068526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#else /* CONFIG_CTRL_IFACE */
2069526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtint main(int argc, char *argv[])
2070526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
2071526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	printf("CONFIG_CTRL_IFACE not defined - wpa_cli disabled\n");
2072526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return -1;
2073526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
2074526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* CONFIG_CTRL_IFACE */
2075