[PATCH 1/2] Add Android socket support for control part

Dmitry Shmidt dimitrysh
Thu Feb 24 15:57:25 PST 2011


Signed-off-by: Dmitry Shmidt <dimitrysh at google.com>
---
 src/common/wpa_ctrl.c |   97 ++++++++++++++++++++++++++++++++++++++++++++++++-
 src/common/wpa_ctrl.h |   17 +++++++++
 2 files changed, 112 insertions(+), 2 deletions(-)

diff --git a/src/common/wpa_ctrl.c b/src/common/wpa_ctrl.c
index 81fe6ba..1e78bd9 100644
--- a/src/common/wpa_ctrl.c
+++ b/src/common/wpa_ctrl.c
@@ -20,12 +20,24 @@
 #include <sys/un.h>
 #endif /* CONFIG_CTRL_IFACE_UNIX */

+#ifdef ANDROID
+#include <dirent.h>
+#include <linux/limits.h>
+#include <cutils/sockets.h>
+#include <cutils/memory.h>
+#include "private/android_filesystem_config.h"
+#endif
+
 #include "wpa_ctrl.h"
 #include "common.h"


 #if defined(CONFIG_CTRL_IFACE_UNIX) || defined(CONFIG_CTRL_IFACE_UDP)
 #define CTRL_IFACE_SOCKET
+#ifdef ANDROID
+static const char *local_socket_dir = "/data/misc/wifi/sockets";
+static const char *local_socket_prefix = "wpa_ctrl_";
+#endif /* ANDROID */
 #endif /* CONFIG_CTRL_IFACE_UNIX || CONFIG_CTRL_IFACE_UDP */


@@ -81,7 +93,12 @@ struct wpa_ctrl * wpa_ctrl_open(const char *ctrl_path)
 	counter++;
 try_again:
 	ret = os_snprintf(ctrl->local.sun_path, sizeof(ctrl->local.sun_path),
+#ifdef ANDROID
+			  "%s/%s%d-%d", local_socket_dir, local_socket_prefix,
+                    getpid(), counter);
+#else /* ANDROID */
 			  "/tmp/wpa_ctrl_%d-%d", (int) getpid(), counter);
+#endif
 	if (ret < 0 || (size_t) ret >= sizeof(ctrl->local.sun_path)) {
 		close(ctrl->s);
 		os_free(ctrl);
@@ -105,6 +122,30 @@ try_again:
 		return NULL;
 	}

+#ifdef ANDROID
+	chmod(ctrl->local.sun_path, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP);
+	chown(ctrl->local.sun_path, AID_SYSTEM, AID_WIFI);
+	/*
+	 * If the ctrl_path isn't an absolute pathname, assume that
+	 * it's the name of a socket in the Android reserved namespace.
+	 * Otherwise, it's a normal UNIX domain socket appearing in the
+	 * filesystem.
+	 */
+	if (ctrl_path != NULL && *ctrl_path != '/') {
+		os_snprintf(ctrl->dest.sun_path, sizeof(ctrl->dest.sun_path), "wpa_%s",
+			    ctrl_path);
+		if (socket_local_client_connect(ctrl->s,
+						ctrl->dest.sun_path,
+						ANDROID_SOCKET_NAMESPACE_RESERVED,
+						SOCK_DGRAM) < 0) {
+			close(ctrl->s);
+			unlink(ctrl->local.sun_path);
+			os_free(ctrl);
+			return NULL;
+		}
+		return ctrl;
+	}
+#endif
 	ctrl->dest.sun_family = AF_UNIX;
 	res = os_strlcpy(ctrl->dest.sun_path, ctrl_path,
 			 sizeof(ctrl->dest.sun_path));
@@ -127,13 +168,61 @@ try_again:

 void wpa_ctrl_close(struct wpa_ctrl *ctrl)
 {
+	if (ctrl == NULL)
+		return;
 	unlink(ctrl->local.sun_path);
-	close(ctrl->s);
+	if (ctrl->s >= 0)
+		close(ctrl->s);
 	os_free(ctrl);
 }

-#endif /* CONFIG_CTRL_IFACE_UNIX */
+#ifdef ANDROID
+/**
+ * wpa_ctrl_cleanup() - Delete any local UNIX domain socket files that
+ * may be left over from clients that were previously connected to
+ * wpa_supplicant. This keeps these files from being orphaned in the
+ * event of crashes that prevented them from being removed as part
+ * of the normal orderly shutdown.
+ */
+void wpa_ctrl_cleanup(void)
+{
+    DIR *dir;
+    struct dirent entry;
+    struct dirent *result;
+    size_t dirnamelen;
+    int prefixlen = strlen(local_socket_prefix);
+    size_t maxcopy;
+    char pathname[PATH_MAX];
+    char *namep;
+
+    if ((dir = opendir(local_socket_dir)) == NULL)
+        return;
+
+    dirnamelen = (size_t)snprintf(pathname, sizeof(pathname), "%s/",
local_socket_dir);
+    if (dirnamelen >= sizeof(pathname)) {
+        closedir(dir);
+        return;
+    }
+    namep = pathname + dirnamelen;
+    maxcopy = PATH_MAX-dirnamelen;
+    while (readdir_r(dir, &entry, &result) == 0 && result != NULL) {
+        if (strncmp(entry.d_name, local_socket_prefix, prefixlen) == 0) {
+            if (strlcpy(namep, entry.d_name, maxcopy) < maxcopy) {
+                unlink(pathname);
+            }
+        }
+    }
+    closedir(dir);
+}
+#endif /* ANDROID */

+#else /* CONFIG_CTRL_IFACE_UNIX */
+#ifdef ANDROID
+void wpa_ctrl_cleanup(void)
+{
+}
+#endif /* ANDROID */
+#endif /* CONFIG_CTRL_IFACE_UNIX */

 #ifdef CONFIG_CTRL_IFACE_UDP

@@ -234,7 +323,11 @@ int wpa_ctrl_request(struct wpa_ctrl *ctrl, const
char *cmd, size_t cmd_len,
 	os_free(cmd_buf);

 	for (;;) {
+#ifdef ANDROID
+		tv.tv_sec = 10;
+#else
 		tv.tv_sec = 2;
+#endif
 		tv.tv_usec = 0;
 		FD_ZERO(&rfds);
 		FD_SET(ctrl->s, &rfds);
diff --git a/src/common/wpa_ctrl.h b/src/common/wpa_ctrl.h
index 86653a2..7f40b70 100644
--- a/src/common/wpa_ctrl.h
+++ b/src/common/wpa_ctrl.h
@@ -56,6 +56,12 @@ extern "C" {
 #define WPA_EVENT_EAP_FAILURE "CTRL-EVENT-EAP-FAILURE "
 /** New scan results available */
 #define WPA_EVENT_SCAN_RESULTS "CTRL-EVENT-SCAN-RESULTS "
+/** wpa_supplicant state change */
+#define WPA_EVENT_STATE_CHANGE "CTRL-EVENT-STATE-CHANGE "
+/** AP to STA speed */
+#define WPA_EVENT_LINK_SPEED "CTRL-EVENT-LINK-SPEED "
+/** Driver state change */
+#define WPA_EVENT_DRIVER_STATE "CTRL-EVENT-DRIVER-STATE "
 /** A new BSS entry was added (followed by BSS entry id and BSSID) */
 #define WPA_EVENT_BSS_ADDED "CTRL-EVENT-BSS-ADDED "
 /** A BSS entry was removed (followed by BSS entry id and BSSID) */
@@ -259,6 +265,17 @@ int wpa_ctrl_pending(struct wpa_ctrl *ctrl);
  */
 int wpa_ctrl_get_fd(struct wpa_ctrl *ctrl);

+#ifdef ANDROID
+/**
+ * wpa_ctrl_cleanup() - Delete any local UNIX domain socket files that
+ * may be left over from clients that were previously connected to
+ * wpa_supplicant. This keeps these files from being orphaned in the
+ * event of crashes that prevented them from being removed as part
+ * of the normal orderly shutdown.
+ */
+void wpa_ctrl_cleanup(void);
+#endif  /* ANDROID */
+
 #ifdef CONFIG_CTRL_IFACE_UDP
 #define WPA_CTRL_IFACE_PORT 9877
 #define WPA_GLOBAL_CTRL_IFACE_PORT 9878
-- 
1.7.3.1



More information about the Hostap mailing list