Juan Lang : wininet: Support IPv6 in GetAddress.

Alexandre Julliard julliard at winehq.org
Fri Jul 10 08:52:05 CDT 2009


Module: wine
Branch: master
Commit: cd0c18be6c54a4e599b1f1a0c43472189154d29f
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=cd0c18be6c54a4e599b1f1a0c43472189154d29f

Author: Juan Lang <juan.lang at gmail.com>
Date:   Thu Jul  9 11:51:21 2009 -0700

wininet: 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 );




More information about the wine-cvs mailing list