Commit c2e9997a authored by Martin Hurton's avatar Martin Hurton

Don't set the AI_V4MAPPED flag on FreeBSD

The problem is that even though the AI_V4MAPPED flag is defined
on FreeBSD, the getaddrinfo function does not support it and
returns EAI_BADFLAGS.

The patch also sets the flag on Windows if it is defined there.
This is true for Windows Vista and later.

Fixes issue #331.
parent 6d776d08
...@@ -277,11 +277,12 @@ int zmq::tcp_address_t::resolve_interface (char const *interface_, ...@@ -277,11 +277,12 @@ int zmq::tcp_address_t::resolve_interface (char const *interface_,
// service-name irregularity due to indeterminate socktype. // service-name irregularity due to indeterminate socktype.
req.ai_flags = AI_PASSIVE | AI_NUMERICHOST; req.ai_flags = AI_PASSIVE | AI_NUMERICHOST;
#ifndef ZMQ_HAVE_WINDOWS #if defined AI_V4MAPPED && !defined ZMQ_HAVE_FREEBSD
// Windows by default maps IPv4 addresses into IPv6. In this API we only // In this API we only require IPv4-mapped addresses when
// require IPv4-mapped addresses when no native IPv6 interfaces are // no native IPv6 interfaces are available (~AI_ALL).
// available (~AI_ALL). This saves an additional DNS roundtrip for IPv4 // This saves an additional DNS roundtrip for IPv4 addresses.
// addresses. // Note: While the AI_V4MAPPED flag is defined on FreeBSD system,
// it is not supported here. See libzmq issue #331.
if (req.ai_family == AF_INET6) if (req.ai_family == AF_INET6)
req.ai_flags |= AI_V4MAPPED; req.ai_flags |= AI_V4MAPPED;
#endif #endif
...@@ -323,10 +324,12 @@ int zmq::tcp_address_t::resolve_hostname (const char *hostname_, bool ipv4only_) ...@@ -323,10 +324,12 @@ int zmq::tcp_address_t::resolve_hostname (const char *hostname_, bool ipv4only_)
// doesn't really matter, since it's not included in the addr-output. // doesn't really matter, since it's not included in the addr-output.
req.ai_socktype = SOCK_STREAM; req.ai_socktype = SOCK_STREAM;
#ifndef ZMQ_HAVE_WINDOWS #if defined AI_V4MAPPED && !defined ZMQ_HAVE_FREEBSD
// Windows by default maps IPv4 addresses into IPv6. In this API we only // In this API we only require IPv4-mapped addresses when
// require IPv4-mapped addresses when no native IPv6 interfaces are // no native IPv6 interfaces are available.
// available. This saves an additional DNS roundtrip for IPv4 addresses. // This saves an additional DNS roundtrip for IPv4 addresses.
// Note: While the AI_V4MAPPED flag is defined on FreeBSD system,
// it is not supported here. See libzmq issue #331.
if (req.ai_family == AF_INET6) if (req.ai_family == AF_INET6)
req.ai_flags |= AI_V4MAPPED; req.ai_flags |= AI_V4MAPPED;
#endif #endif
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment