From cd0c18be6c54a4e599b1f1a0c43472189154d29f Mon Sep 17 00:00:00 2001 From: Juan Lang Date: Thu, 9 Jul 2009 11:51:21 -0700 Subject: [PATCH] wininet: Support IPv6 in GetAddress. --- dlls/wininet/utility.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/dlls/wininet/utility.c b/dlls/wininet/utility.c index e2eee46aaf6..0812af5ac95 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 );