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