wininet(10/10): Support IPv6 in GetAddress
Juan Lang
juan.lang at gmail.com
Thu Jul 9 14:01:54 CDT 2009
--Juan
-------------- next part --------------
From 7231d632f4b6a3d8ab8f8b9f4dc957b7159064b5 Mon Sep 17 00:00:00 2001
From: Juan Lang <juan.lang at gmail.com>
Date: Thu, 9 Jul 2009 11:51:21 -0700
Subject: [PATCH 14/14] Support IPv6 in GetAddress
---
dlls/wininet/utility.c | 16 ++++++++++++++--
1 files changed, 14 insertions(+), 2 deletions(-)
diff --git a/dlls/wininet/utility.c b/dlls/wininet/utility.c
index e2eee46..0812af5 100644
--- a/dlls/wininet/utility.c
+++ b/dlls/wininet/utility.c
@@ -178,14 +178,23 @@ BOOL GetAddress(LPCWSTR lpszServerName, INTERNET_PORT nServerPort,
#ifdef HAVE_GETADDRINFO
memset( &hints, 0, sizeof(struct addrinfo) );
+ /* Prefer IPv4 to IPv6 addresses, since some servers do not listen on
+ * their IPv6 addresses even though they have IPv6 addresses in the DNS.
+ */
hints.ai_family = AF_INET;
ret = getaddrinfo( name, NULL, &hints, &res );
HeapFree( GetProcessHeap(), 0, name );
if (ret != 0)
{
- TRACE("failed to get address of %s (%s)\n", debugstr_w(lpszServerName), gai_strerror(ret));
- return FALSE;
+ TRACE("failed to get IPv4 address of %s (%s), retrying with IPv6\n", debugstr_w(lpszServerName), gai_strerror(ret));
+ hints.ai_family = AF_INET6;
+ ret = getaddrinfo( name, NULL, &hints, &res );
+ if (ret != 0)
+ {
+ TRACE("failed to get address of %s (%s)\n", debugstr_w(lpszServerName), gai_strerror(ret));
+ return FALSE;
+ }
}
if (*sa_len < res->ai_addrlen)
{
@@ -201,6 +210,9 @@ BOOL GetAddress(LPCWSTR lpszServerName, INTERNET_PORT nServerPort,
case AF_INET:
((struct sockaddr_in *)psa)->sin_port = htons(nServerPort);
break;
+ case AF_INET6:
+ ((struct sockaddr_in6 *)psa)->sin6_port = htons(nServerPort);
+ break;
}
freeaddrinfo( res );
--
1.6.3.2
More information about the wine-patches
mailing list