OSDN Git Service

Add ANDROID-related changes
[android-x86/external-wpa_supplicant_6.git] / wpa_supplicant / wpa_cli.c
index 7de6534..c57d20d 100644 (file)
 #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 =
@@ -87,11 +92,16 @@ static const char *wpa_cli_full_license =
 "\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;
@@ -121,9 +131,10 @@ static void usage(void)
 
 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;
@@ -131,6 +142,11 @@ static struct wpa_ctrl * wpa_cli_open_connection(const char *ifname)
        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)
@@ -140,10 +156,21 @@ static struct wpa_ctrl * wpa_cli_open_connection(const char *ifname)
                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 */
 }
 
@@ -154,11 +181,14 @@ static void wpa_cli_close_connection(void)
                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;
 }
 
 
@@ -170,7 +200,7 @@ static void wpa_cli_msg_cb(char *msg, size_t len)
 
 static int _wpa_ctrl_command(struct wpa_ctrl *ctrl, char *cmd, int print)
 {
-       char buf[2048];
+       char buf[4096];
        size_t len;
        int ret;
 
@@ -717,6 +747,60 @@ static int wpa_cli_cmd_bssid(struct wpa_ctrl *ctrl, int argc, char *argv[])
 }
 
 
+#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[])
 {
@@ -990,9 +1074,9 @@ static int wpa_cli_cmd_interface(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 "
@@ -1078,6 +1162,26 @@ static int wpa_cli_cmd_interface_list(struct wpa_ctrl *ctrl, int argc,
 }
 
 
+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
@@ -1157,7 +1261,18 @@ static struct wpa_cli_cmd wpa_cli_commands[] = {
        { "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,
@@ -1241,6 +1356,9 @@ static struct wpa_cli_cmd wpa_cli_commands[] = {
        { "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 }
 };
 
@@ -1333,6 +1451,9 @@ static int wpa_request(struct wpa_ctrl *ctrl, int argc, char *argv[])
                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]);
        }
 
@@ -1451,7 +1572,7 @@ static void wpa_cli_reconnect(void)
        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 "
@@ -1465,7 +1586,7 @@ static void wpa_cli_recv_pending(struct wpa_ctrl *ctrl, int in_read,
                                 int action_monitor)
 {
        int first = 1;
-       if (ctrl_conn == NULL) {
+       if (ctrl == NULL) {
                wpa_cli_reconnect();
                return;
        }
@@ -1563,7 +1684,7 @@ static void wpa_cli_interactive(void)
 #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 */
@@ -1587,7 +1708,7 @@ static void wpa_cli_interactive(void)
 #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') {
@@ -1719,10 +1840,10 @@ static void wpa_cli_alarm(int sig)
                       "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 */
@@ -1735,8 +1856,17 @@ static char * wpa_cli_get_default_ifname(void)
 #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
                /*
@@ -1758,7 +1888,7 @@ static char * wpa_cli_get_default_ifname(void)
 #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;
@@ -1886,7 +2016,7 @@ int main(int argc, char *argv[])
 #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 "