[PATCH 8/9] wpa_cli: simplify ctrl UDP path

Janusz Dziedzic janusz.dziedzic at tieto.com
Wed Sep 23 08:04:18 EDT 2015


Kill #ifdefs, use common code for IPv4/IPv6
in case of UDP control path.

Signed-off-by: Janusz Dziedzic <janusz.dziedzic at tieto.com>
---
 src/common/wpa_ctrl.c | 159 ++++++++++++++------------------------------------
 1 file changed, 44 insertions(+), 115 deletions(-)

diff --git a/src/common/wpa_ctrl.c b/src/common/wpa_ctrl.c
index c3ffa6f..ad0dcb8 100644
--- a/src/common/wpa_ctrl.c
+++ b/src/common/wpa_ctrl.c
@@ -15,9 +15,9 @@
 #include <unistd.h>
 #include <fcntl.h>
 #endif /* CONFIG_CTRL_IFACE_UNIX */
-#ifdef CONFIG_CTRL_IFACE_UDP_REMOTE
+#ifdef CONFIG_CTRL_IFACE_UDP
 #include <netdb.h>
-#endif /* CONFIG_CTRL_IFACE_UDP_REMOTE */
+#endif /* CONFIG_CTRL_IFACE_UDP */
 
 #ifdef ANDROID
 #include <dirent.h>
@@ -26,10 +26,6 @@
 #include "private/android_filesystem_config.h"
 #endif /* ANDROID */
 
-#ifdef CONFIG_CTRL_IFACE_UDP_IPV6
-#include <net/if.h>
-#endif /* CONFIG_CTRL_IFACE_UDP_IPV6 */
-
 #include "wpa_ctrl.h"
 #include "common.h"
 
@@ -51,13 +47,6 @@
 struct wpa_ctrl {
 #ifdef CONFIG_CTRL_IFACE_UDP
 	int s;
-#ifdef CONFIG_CTRL_IFACE_UDP_IPV6
-	struct sockaddr_in6 local;
-	struct sockaddr_in6 dest;
-#else /* CONFIG_CTRL_IFACE_UDP_IPV6 */
-	struct sockaddr_in local;
-	struct sockaddr_in dest;
-#endif /* CONFIG_CTRL_IFACE_UDP_IPV6 */
 	char *cookie;
 	char *remote_ifname;
 	char *remote_ip;
@@ -294,134 +283,74 @@ struct wpa_ctrl * wpa_ctrl_open(const char *ctrl_path)
 	struct wpa_ctrl *ctrl;
 	char buf[128];
 	size_t len;
-#ifdef CONFIG_CTRL_IFACE_UDP_REMOTE
-	struct hostent *h;
-#endif /* CONFIG_CTRL_IFACE_UDP_REMOTE */
+	struct addrinfo hints = {0}, *res, *ressave;
+	char *port, *name;
+	int port_id = WPA_CTRL_IFACE_PORT;
+	char p[32] = {0};
+	int n;
 
 	ctrl = os_zalloc(sizeof(*ctrl));
 	if (ctrl == NULL)
 		return NULL;
 
-#ifdef CONFIG_CTRL_IFACE_UDP_IPV6
-	ctrl->s = socket(PF_INET6, SOCK_DGRAM, 0);
-#else /* CONFIG_CTRL_IFACE_UDP_IPV6 */
-	ctrl->s = socket(PF_INET, SOCK_DGRAM, 0);
-#endif /* CONFIG_CTRL_IFACE_UDP_IPV6 */
-	if (ctrl->s < 0) {
-		perror("socket");
-		os_free(ctrl);
-		return NULL;
-	}
-
-#ifdef CONFIG_CTRL_IFACE_UDP_IPV6
-	ctrl->local.sin6_family = AF_INET6;
-#ifdef CONFIG_CTRL_IFACE_UDP_REMOTE
-	ctrl->local.sin6_addr = in6addr_any;
-#else /* CONFIG_CTRL_IFACE_UDP_REMOTE */
-	inet_pton(AF_INET6, "::1", &ctrl->local.sin6_addr);
-#endif /* CONFIG_CTRL_IFACE_UDP_REMOTE */
-#else /* CONFIG_CTRL_IFACE_UDP_IPV6 */
-	ctrl->local.sin_family = AF_INET;
-#ifdef CONFIG_CTRL_IFACE_UDP_REMOTE
-	ctrl->local.sin_addr.s_addr = INADDR_ANY;
-#else /* CONFIG_CTRL_IFACE_UDP_REMOTE */
-	ctrl->local.sin_addr.s_addr = htonl((127 << 24) | 1);
-#endif /* CONFIG_CTRL_IFACE_UDP_REMOTE */
-#endif /* CONFIG_CTRL_IFACE_UDP_IPV6 */
-
-	if (bind(ctrl->s, (struct sockaddr *) &ctrl->local,
-		 sizeof(ctrl->local)) < 0) {
-		close(ctrl->s);
-		os_free(ctrl);
-		return NULL;
-	}
-
-#ifdef CONFIG_CTRL_IFACE_UDP_IPV6
-	ctrl->dest.sin6_family = AF_INET6;
-	inet_pton(AF_INET6, "::1", &ctrl->dest.sin6_addr);
-	ctrl->dest.sin6_port = htons(WPA_CTRL_IFACE_PORT);
-#else /* CONFIG_CTRL_IFACE_UDP_IPV6 */
-	ctrl->dest.sin_family = AF_INET;
-	ctrl->dest.sin_addr.s_addr = htonl((127 << 24) | 1);
-	ctrl->dest.sin_port = htons(WPA_CTRL_IFACE_PORT);
-#endif /* CONFIG_CTRL_IFACE_UDP_IPV6 */
-
-#ifdef CONFIG_CTRL_IFACE_UDP_REMOTE
+	/* get host/port */
 	if (ctrl_path) {
-		char *port, *name;
-		int port_id;
-#ifdef CONFIG_CTRL_IFACE_UDP_IPV6
-		char *scope;
-		int scope_id = 0;
-#endif /* CONFIG_CTRL_IFACE_UDP_IPV6 */
-
 		name = os_strdup(ctrl_path);
-		if (name == NULL) {
-			close(ctrl->s);
-			os_free(ctrl);
+		if (name == NULL)
 			return NULL;
-		}
 
 		port = os_strchr(name, ',');
 
 		if (port) {
 			port_id = atoi(&port[1]);
 			port[0] = '\0';
-		} else
-			port_id = WPA_CTRL_IFACE_PORT;
-
-#ifdef CONFIG_CTRL_IFACE_UDP_IPV6
-		scope = os_strchr(name, '%');
-		if (scope) {
-			scope_id = if_nametoindex(&scope[1]);
-			scope[0] = '\0';
 		}
-		h = gethostbyname2(name, AF_INET6);
-#else /* CONFIG_CTRL_IFACE_UDP_IPV6 */
-		h = gethostbyname(name);
-#endif /* CONFIG_CTRL_IFACE_UDP_IPV6 */
+
 		ctrl->remote_ip = os_strdup(name);
 		os_free(name);
-		if (h == NULL) {
-			perror("gethostbyname");
-			close(ctrl->s);
-			os_free(ctrl->remote_ip);
-			os_free(ctrl);
-			return NULL;
-		}
-#ifdef CONFIG_CTRL_IFACE_UDP_IPV6
-		ctrl->dest.sin6_scope_id = scope_id;
-		ctrl->dest.sin6_port = htons(port_id);
-		os_memcpy(&ctrl->dest.sin6_addr, h->h_addr, h->h_length);
-#else /* CONFIG_CTRL_IFACE_UDP_IPV6 */
-		ctrl->dest.sin_port = htons(port_id);
-		os_memcpy(&ctrl->dest.sin_addr.s_addr, h->h_addr, h->h_length);
-#endif /* CONFIG_CTRL_IFACE_UDP_IPV6 */
 	} else
 		ctrl->remote_ip = os_strdup("localhost");
-#endif /* CONFIG_CTRL_IFACE_UDP_REMOTE */
 
-	if (connect(ctrl->s, (struct sockaddr *) &ctrl->dest,
-		    sizeof(ctrl->dest)) < 0) {
-#ifdef CONFIG_CTRL_IFACE_UDP_IPV6
-		char addr[INET6_ADDRSTRLEN];
-		wpa_printf(MSG_ERROR, "connect(%s:%d) failed: %s",
-			   inet_ntop(AF_INET6, &ctrl->dest.sin6_addr, addr,
-				     sizeof(ctrl->dest)),
-			   ntohs(ctrl->dest.sin6_port),
-			   strerror(errno));
-#else /* CONFIG_CTRL_IFACE_UDP_IPV6 */
-		wpa_printf(MSG_ERROR, "connect(%s:%d) failed: %s",
-			   inet_ntoa(ctrl->dest.sin_addr),
-			   ntohs(ctrl->dest.sin_port),
-			   strerror(errno));
-#endif /* CONFIG_CTRL_IFACE_UDP_IPV6 */
+	os_snprintf(p, sizeof(p), "%d", port_id);
+
+	/* Get IPv4/IPv6 addrinfo */
+	hints.ai_family = AF_UNSPEC;
+	hints.ai_socktype = SOCK_DGRAM;
+
+	n = getaddrinfo(ctrl->remote_ip, p, &hints, &res);
+	if (n < 0) {
+		fprintf(stderr, "getaddrinfo error:: [%s]\n", gai_strerror(n));
+		os_free(ctrl->remote_ip);
+		os_free(ctrl);
+		return NULL;
+	}
+
+	ressave = res;
+
+	ctrl->s = -1;
+	for (res = ressave; res != NULL; res = res->ai_next) {
+		ctrl->s = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
+		if (ctrl->s == -1)
+			continue;
+
+		if (connect(ctrl->s, res->ai_addr, res->ai_addrlen) != -1)
+			/* Success */
+			break;
+
 		close(ctrl->s);
+		ctrl->s = -1;
+	}
+
+	if (ctrl->s < 0) {
+		perror("socket/connect");
+		freeaddrinfo(ressave);
 		os_free(ctrl->remote_ip);
 		os_free(ctrl);
 		return NULL;
 	}
 
+	freeaddrinfo(ressave);
+
 	len = sizeof(buf) - 1;
 	if (wpa_ctrl_request(ctrl, "GET_COOKIE", 10, buf, &len, NULL) == 0) {
 		buf[len] = '\0';
-- 
1.9.1



More information about the HostAP mailing list