Juan Lang : winhttp: Support IPv6 in netconn_resolve.

Alexandre Julliard julliard at winehq.org
Thu Jul 9 10:57:00 CDT 2009


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

Author: Juan Lang <juan.lang at gmail.com>
Date:   Wed Jul  8 10:41:17 2009 -0700

winhttp: Support IPv6 in netconn_resolve.

---

 dlls/winhttp/net.c |   22 ++++++++++++++++++----
 1 files changed, 18 insertions(+), 4 deletions(-)

diff --git a/dlls/winhttp/net.c b/dlls/winhttp/net.c
index caa83bf..181ff02 100644
--- a/dlls/winhttp/net.c
+++ b/dlls/winhttp/net.c
@@ -581,15 +581,25 @@ BOOL netconn_resolve( WCHAR *hostnameW, INTERNET_PORT port, struct sockaddr *sa,
 
 #ifdef HAVE_GETADDRINFO
     memset( &hints, 0, sizeof(struct addrinfo) );
+    /* Prefer IPv4 to IPv6 addresses, since some web servers do not listen on
+     * their IPv6 addresses even though they have IPv6 addresses in the DNS.
+     */
     hints.ai_family = AF_INET;
 
     ret = getaddrinfo( hostname, NULL, &hints, &res );
-    heap_free( hostname );
     if (ret != 0)
     {
-        TRACE("failed to get address of %s (%s)\n", debugstr_w(hostnameW), gai_strerror(ret));
-        return FALSE;
+        TRACE("failed to get IPv4 address of %s (%s), retrying with IPv6\n", debugstr_w(hostnameW), gai_strerror(ret));
+        hints.ai_family = AF_INET6;
+        ret = getaddrinfo( hostname, NULL, &hints, &res );
+        if (ret != 0)
+        {
+            TRACE("failed to get address of %s (%s)\n", debugstr_w(hostnameW), gai_strerror(ret));
+            heap_free( hostname );
+            return FALSE;
+        }
     }
+    heap_free( hostname );
     if (*sa_len < res->ai_addrlen)
     {
         WARN("address too small\n");
@@ -604,9 +614,13 @@ BOOL netconn_resolve( WCHAR *hostnameW, INTERNET_PORT port, struct sockaddr *sa,
     case AF_INET:
         ((struct sockaddr_in *)sa)->sin_port = htons( port );
         break;
+    case AF_INET6:
+        ((struct sockaddr_in6 *)sa)->sin6_port = htons( port );
+        break;
     }
 
     freeaddrinfo( res );
+    return TRUE;
 #else
     EnterCriticalSection( &cs_gethostbyname );
 
@@ -631,8 +645,8 @@ BOOL netconn_resolve( WCHAR *hostnameW, INTERNET_PORT port, struct sockaddr *sa,
     sin->sin_port = htons( port );
 
     LeaveCriticalSection( &cs_gethostbyname );
-#endif
     return TRUE;
+#endif
 }
 
 const void *netconn_get_certificate( netconn_t *conn )




More information about the wine-cvs mailing list