Add workaround for broken getaddrinfo in Apple's NAT64 environment.
This commit is contained in:
parent
bc6e494d2d
commit
595ff85c33
@ -3327,6 +3327,37 @@ asio::error_code getaddrinfo(const char* host,
|
|||||||
return ec = translate_addrinfo_error(error);
|
return ec = translate_addrinfo_error(error);
|
||||||
#else
|
#else
|
||||||
int error = ::getaddrinfo(host, service, &hints, result);
|
int error = ::getaddrinfo(host, service, &hints, result);
|
||||||
|
#if defined(__MACH__) && defined(__APPLE__)
|
||||||
|
using namespace std; // For isdigit and atoi.
|
||||||
|
if (error == 0 && service && isdigit(static_cast<unsigned char>(service[0])))
|
||||||
|
{
|
||||||
|
u_short_type port = host_to_network_short(atoi(service));
|
||||||
|
for (addrinfo_type* ai = *result; ai; ai = ai->ai_next)
|
||||||
|
{
|
||||||
|
switch (ai->ai_family)
|
||||||
|
{
|
||||||
|
case ASIO_OS_DEF(AF_INET):
|
||||||
|
{
|
||||||
|
sockaddr_in4_type* sinptr =
|
||||||
|
reinterpret_cast<sockaddr_in4_type*>(ai->ai_addr);
|
||||||
|
if (sinptr->sin_port == 0)
|
||||||
|
sinptr->sin_port = port;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ASIO_OS_DEF(AF_INET6):
|
||||||
|
{
|
||||||
|
sockaddr_in6_type* sin6ptr =
|
||||||
|
reinterpret_cast<sockaddr_in6_type*>(ai->ai_addr);
|
||||||
|
if (sin6ptr->sin6_port == 0)
|
||||||
|
sin6ptr->sin6_port = port;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
return ec = translate_addrinfo_error(error);
|
return ec = translate_addrinfo_error(error);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user