#include <readline/history.h>
#endif /* CONFIG_READLINE */
+#define CTRL_INTERFACE_2_SOCKETS
+
#include "wpa_ctrl.h"
#include "common.h"
#include "version.h"
+#ifdef ANDROID
+#include <cutils/properties.h>
+#endif
static const char *wpa_cli_version =
"\n";
static struct wpa_ctrl *ctrl_conn;
+static struct wpa_ctrl *monitor_conn;
static int wpa_cli_quit = 0;
static int wpa_cli_attached = 0;
static int wpa_cli_connected = 0;
static int wpa_cli_last_id = 0;
+#ifdef ANDROID
+static const char *ctrl_iface_dir = "/data/misc/wifi/wpa_supplicant";
+#else
static const char *ctrl_iface_dir = "/var/run/wpa_supplicant";
+#endif
static char *ctrl_ifname = NULL;
static const char *pid_file = NULL;
static const char *action_file = NULL;
static struct wpa_ctrl * wpa_cli_open_connection(const char *ifname)
{
+ struct wpa_ctrl *cur_conn;
#if defined(CONFIG_CTRL_IFACE_UDP) || defined(CONFIG_CTRL_IFACE_NAMED_PIPE)
- ctrl_conn = wpa_ctrl_open(ifname);
- return ctrl_conn;
+ cur_conn = wpa_ctrl_open(ifname);
+ return cur_conn;
#else /* CONFIG_CTRL_IFACE_UDP || CONFIG_CTRL_IFACE_NAMED_PIPE */
char *cfile;
int flen, res;
if (ifname == NULL)
return NULL;
+#ifdef ANDROID
+ if (access(ctrl_iface_dir, F_OK) < 0)
+ cfile = (char *)ifname;
+ else {
+#endif
flen = os_strlen(ctrl_iface_dir) + os_strlen(ifname) + 2;
cfile = os_malloc(flen);
if (cfile == NULL)
os_free(cfile);
return NULL;
}
-
- ctrl_conn = wpa_ctrl_open(cfile);
+#ifdef ANDROID
+ }
+#endif
+
+ cur_conn = wpa_ctrl_open(cfile);
+#ifdef CTRL_INTERFACE_2_SOCKETS
+ monitor_conn = wpa_ctrl_open(cfile);
+#else
+ monitor_conn = cur_conn;
+#endif
+#ifdef ANDROID
+ if (cfile != ifname)
+#endif
os_free(cfile);
- return ctrl_conn;
+ return cur_conn;
#endif /* CONFIG_CTRL_IFACE_UDP || CONFIG_CTRL_IFACE_NAMED_PIPE */
}
return;
if (wpa_cli_attached) {
- wpa_ctrl_detach(ctrl_conn);
+ wpa_ctrl_detach(monitor_conn);
wpa_cli_attached = 0;
}
+#ifdef CTRL_INTERFACE_2_SOCKETS
+ wpa_ctrl_close(monitor_conn);
+#endif
wpa_ctrl_close(ctrl_conn);
- ctrl_conn = NULL;
+ ctrl_conn = monitor_conn = NULL;
}
static int _wpa_ctrl_command(struct wpa_ctrl *ctrl, char *cmd, int print)
{
- char buf[2048];
+ char buf[4096];
size_t len;
int ret;
}
+#ifdef ANDROID
+static int wpa_cli_cmd_blacklist(struct wpa_ctrl *ctrl, int argc, char *argv[])
+{
+ char cmd[256], *pos, *end;
+ int i, ret;
+
+ end = cmd + sizeof(cmd);
+ pos = cmd;
+ ret = os_snprintf(pos, end - pos, "BLACKLIST");
+ if (ret < 0 || ret >= end - pos) {
+ printf("Too long BLACKLIST command.\n");
+ return -1;
+ }
+ pos += ret;
+ for (i = 0; i < argc; i++) {
+ ret = os_snprintf(pos, end - pos, " %s", argv[i]);
+ if (ret < 0 || ret >= end - pos) {
+ printf("Too long BLACKLIST command.\n");
+ return -1;
+ }
+ pos += ret;
+ }
+
+ return wpa_ctrl_command(ctrl, cmd);
+}
+
+
+static int wpa_cli_cmd_log_level(struct wpa_ctrl *ctrl, int argc, char *argv[])
+{
+ char cmd[256], *pos, *end;
+ int i, ret;
+
+ end = cmd + sizeof(cmd);
+ pos = cmd;
+ ret = os_snprintf(pos, end - pos, "LOG_LEVEL");
+ if (ret < 0 || ret >= end - pos) {
+ printf("Too long LOG_LEVEL command.\n");
+ return -1;
+ }
+ pos += ret;
+ for (i = 0; i < argc; i++) {
+ ret = os_snprintf(pos, end - pos, " %s", argv[i]);
+ if (ret < 0 || ret >= end - pos) {
+ printf("Too long LOG_LEVEL command.\n");
+ return -1;
+ }
+ pos += ret;
+ }
+
+ return wpa_ctrl_command(ctrl, cmd);
+}
+#endif /* ANDROID */
+
+
static int wpa_cli_cmd_list_networks(struct wpa_ctrl *ctrl, int argc,
char *argv[])
{
os_free(ctrl_ifname);
ctrl_ifname = os_strdup(argv[0]);
- if (wpa_cli_open_connection(ctrl_ifname)) {
+ if ((ctrl_conn = wpa_cli_open_connection(ctrl_ifname)) != NULL) {
printf("Connected to interface '%s.\n", ctrl_ifname);
- if (wpa_ctrl_attach(ctrl_conn) == 0) {
+ if (wpa_ctrl_attach(monitor_conn) == 0) {
wpa_cli_attached = 1;
} else {
printf("Warning: Failed to attach to "
}
+static int wpa_cli_cmd_driver(struct wpa_ctrl *ctrl, int argc,
+ char *argv[])
+{
+ char cmd[32];
+
+ if (argc < 1) {
+ printf("Invalid DRIVER command: needs one argument (cmd)\n");
+ return -1;
+ }
+
+ if (argc > 1)
+ os_snprintf(cmd, sizeof(cmd), "DRIVER %s %s", argv[0], argv[1]);
+ else
+ os_snprintf(cmd, sizeof(cmd), "DRIVER %s", argv[0]);
+ cmd[sizeof(cmd) - 1] = '\0';
+
+ return wpa_ctrl_command(ctrl, cmd);
+}
+
+
enum wpa_cli_cmd_flags {
cli_cmd_flag_none = 0x00,
cli_cmd_flag_sensitive = 0x01
{ "bssid", wpa_cli_cmd_bssid,
cli_cmd_flag_none,
"<network id> <BSSID> = set preferred BSSID for an SSID" },
- { "list_networks", wpa_cli_cmd_list_networks,
+#ifdef ANDROID
+ { "blacklist", wpa_cli_cmd_blacklist,
+ cli_cmd_flag_none,
+ "<BSSID> = add a BSSID to the blacklist\n"
+ "blacklist clear = clear the blacklist\n"
+ "blacklist = display the blacklist" },
+ { "log_level", wpa_cli_cmd_log_level,
+ cli_cmd_flag_none,
+ "<level> [<timestamp>] = update the log level/timestamp of wpa_supplicant\n"
+ "log_level = display the current log level and log options" },
+#endif
+ { "list_networks", wpa_cli_cmd_list_networks,
cli_cmd_flag_none,
"= list configured networks" },
{ "select_network", wpa_cli_cmd_select_network,
{ "wps_reg", wpa_cli_cmd_wps_reg,
cli_cmd_flag_sensitive,
"<BSSID> <AP PIN> = start WPS Registrar to configure an AP" },
+ { "driver", wpa_cli_cmd_driver,
+ cli_cmd_flag_none,
+ "<command> = driver private commands" },
{ NULL, NULL, cli_cmd_flag_none, NULL }
};
printf("Unknown command '%s'\n", argv[0]);
ret = 1;
} else {
+ if( os_strncasecmp( "level", argv[0], os_strlen(argv[0]) ) == 0 ) {
+ ctrl = monitor_conn;
+ }
ret = match->handler(ctrl, argc - 1, &argv[1]);
}
ctrl_conn = wpa_cli_open_connection(ctrl_ifname);
if (ctrl_conn) {
printf("Connection to wpa_supplicant re-established\n");
- if (wpa_ctrl_attach(ctrl_conn) == 0) {
+ if (wpa_ctrl_attach(monitor_conn) == 0) {
wpa_cli_attached = 1;
} else {
printf("Warning: Failed to attach to "
int action_monitor)
{
int first = 1;
- if (ctrl_conn == NULL) {
+ if (ctrl == NULL) {
wpa_cli_reconnect();
return;
}
#endif /* CONFIG_READLINE */
do {
- wpa_cli_recv_pending(ctrl_conn, 0, 0);
+ wpa_cli_recv_pending(monitor_conn, 0, 0);
#ifndef CONFIG_NATIVE_WINDOWS
alarm(ping_interval);
#endif /* CONFIG_NATIVE_WINDOWS */
#endif /* CONFIG_NATIVE_WINDOWS */
if (cmd == NULL)
break;
- wpa_cli_recv_pending(ctrl_conn, 0, 0);
+ wpa_cli_recv_pending(monitor_conn, 0, 0);
pos = cmd;
while (*pos != '\0') {
if (*pos == '\n') {
"reconnect\n");
wpa_cli_close_connection();
}
- if (!ctrl_conn)
+ if (!monitor_conn)
wpa_cli_reconnect();
- if (ctrl_conn)
- wpa_cli_recv_pending(ctrl_conn, 1, 0);
+ if (monitor_conn)
+ wpa_cli_recv_pending(monitor_conn, 1, 0);
alarm(ping_interval);
}
#endif /* CONFIG_NATIVE_WINDOWS */
#ifdef CONFIG_CTRL_IFACE_UNIX
struct dirent *dent;
DIR *dir = opendir(ctrl_iface_dir);
- if (!dir)
+ if (!dir) {
+#ifdef ANDROID
+ char ifprop[PROPERTY_VALUE_MAX];
+ if (property_get("wifi.interface", ifprop, NULL) != 0) {
+ ifname = os_strdup(ifprop);
+ printf("Using interface '%s'\n", ifname);
+ return ifname;
+ }
+#endif
return NULL;
+ }
while ((dent = readdir(dir))) {
#ifdef _DIRENT_HAVE_D_TYPE
/*
#endif /* CONFIG_CTRL_IFACE_UNIX */
#ifdef CONFIG_CTRL_IFACE_NAMED_PIPE
- char buf[2048], *pos;
+ char buf[4096], *pos;
size_t len;
struct wpa_ctrl *ctrl;
int ret;
#endif /* CONFIG_NATIVE_WINDOWS */
if (interactive || action_file) {
- if (wpa_ctrl_attach(ctrl_conn) == 0) {
+ if (wpa_ctrl_attach(monitor_conn) == 0) {
wpa_cli_attached = 1;
} else {
printf("Warning: Failed to attach to "