[PATCH v7 10/16] Improve the mingw getaddrinfo stub to handle more use cases

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: Erik Faye-Lund
Date: Wednesday, November 3, 2010 - 6:35 pm

From: Martin Storsjö <martin@martin.st>

Allow the node parameter to be null, which is used for getting
the default bind address.

Also allow the hints parameter to be null, to improve standard
conformance of the stub implementation a little.

Signed-off-by: Martin Storsjo <martin@martin.st>
---
 compat/mingw.c |   28 +++++++++++++++++++++-------
 1 files changed, 21 insertions(+), 7 deletions(-)

diff --git a/compat/mingw.c b/compat/mingw.c
index 146a6ed..a6c1ee7 100644
--- a/compat/mingw.c
+++ b/compat/mingw.c
@@ -1039,19 +1039,22 @@ static int WSAAPI getaddrinfo_stub(const char *node, const char *service,
 				   const struct addrinfo *hints,
 				   struct addrinfo **res)
 {
-	struct hostent *h = gethostbyname(node);
+	struct hostent *h = NULL;
 	struct addrinfo *ai;
 	struct sockaddr_in *sin;
 
-	if (!h)
-		return WSAGetLastError();
+	if (node) {
+		h = gethostbyname(node);
+		if (!h)
+			return WSAGetLastError();
+	}
 
 	ai = xmalloc(sizeof(struct addrinfo));
 	*res = ai;
 	ai->ai_flags = 0;
 	ai->ai_family = AF_INET;
-	ai->ai_socktype = hints->ai_socktype;
-	switch (hints->ai_socktype) {
+	ai->ai_socktype = hints ? hints->ai_socktype : 0;
+	switch (ai->ai_socktype) {
 	case SOCK_STREAM:
 		ai->ai_protocol = IPPROTO_TCP;
 		break;
@@ -1063,14 +1066,25 @@ static int WSAAPI getaddrinfo_stub(const char *node, const char *service,
 		break;
 	}
 	ai->ai_addrlen = sizeof(struct sockaddr_in);
-	ai->ai_canonname = strdup(h->h_name);
+	if (hints && (hints->ai_flags & AI_CANONNAME))
+		ai->ai_canonname = h ? strdup(h->h_name) : NULL;
+	else
+		ai->ai_canonname = NULL;
 
 	sin = xmalloc(ai->ai_addrlen);
 	memset(sin, 0, ai->ai_addrlen);
 	sin->sin_family = AF_INET;
+	/* Note: getaddrinfo is supposed to allow service to be a string,
+	 * which should be looked up using getservbyname. This is
+	 * currently not implemented */
 	if (service)
 		sin->sin_port = htons(atoi(service));
-	sin->sin_addr = *(struct in_addr *)h->h_addr;
+	if (h)
+		sin->sin_addr = *(struct in_addr *)h->h_addr;
+	else if (hints && (hints->ai_flags & AI_PASSIVE))
+		sin->sin_addr.s_addr = INADDR_ANY;
+	else
+		sin->sin_addr.s_addr = INADDR_LOOPBACK;
 	ai->ai_addr = (struct sockaddr *)sin;
 	ai->ai_next = 0;
 	return 0;
-- 
1.7.3.2.162.g09d37

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
[PATCH v7 00/16] daemon-win32, Erik Faye-Lund, (Wed Nov 3, 6:35 pm)
[PATCH v7 01/16] mingw: add network-wrappers for daemon, Erik Faye-Lund, (Wed Nov 3, 6:35 pm)
[PATCH v7 02/16] mingw: implement syslog, Erik Faye-Lund, (Wed Nov 3, 6:35 pm)
[PATCH v7 05/16] mingw: use real pid, Erik Faye-Lund, (Wed Nov 3, 6:35 pm)
[PATCH v7 07/16] mingw: add kill emulation, Erik Faye-Lund, (Wed Nov 3, 6:35 pm)
[PATCH v7 10/16] Improve the mingw getaddrinfo stub to han ..., Erik Faye-Lund, (Wed Nov 3, 6:35 pm)
[PATCH v7 12/16] mingw: import poll-emulation from gnulib, Erik Faye-Lund, (Wed Nov 3, 6:35 pm)
[PATCH v7 13/16] mingw: use poll-emulation from gnulib, Erik Faye-Lund, (Wed Nov 3, 6:35 pm)
[PATCH v7 14/16] daemon: use socklen_t, Erik Faye-Lund, (Wed Nov 3, 6:35 pm)
[PATCH] daemon: support &lt;directory&gt; arguments again, Jonathan Nieder, (Mon Jan 3, 9:04 pm)