summaryrefslogtreecommitdiff
path: root/network_io
diff options
context:
space:
mode:
authorjorton <jorton@13f79535-47bb-0310-9956-ffa450edef68>2003-07-17 14:27:39 +0000
committerjorton <jorton@13f79535-47bb-0310-9956-ffa450edef68>2003-07-17 14:27:39 +0000
commiteb85744ef4a3674f479bad5d2ef44fd1d6c85d33 (patch)
tree1d7ccedb26d1343abe7b351bc0f7078b87e09ad5 /network_io
parentcaad936e85c9188cc7a1477b61ea59633f35c949 (diff)
downloadlibapr-eb85744ef4a3674f479bad5d2ef44fd1d6c85d33.tar.gz
Use AI_ADDRCONFIG flag by default, where available.
* sockaddr.c (call_resolver): For lookups of AF_UNSPEC addresses, set the AI_ADDRCONFIG flag; retry without the flag if getaddrinfo returns EAI_BADFLAGS. git-svn-id: http://svn.apache.org/repos/asf/apr/apr/trunk@64571 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'network_io')
-rw-r--r--network_io/unix/sockaddr.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/network_io/unix/sockaddr.c b/network_io/unix/sockaddr.c
index ef0ec1010..c53ab48b1 100644
--- a/network_io/unix/sockaddr.c
+++ b/network_io/unix/sockaddr.c
@@ -373,7 +373,22 @@ static apr_status_t call_resolver(apr_sockaddr_t **sa,
memset(&hints, 0, sizeof(hints));
hints.ai_family = family;
hints.ai_socktype = SOCK_STREAM;
+#ifdef AI_ADDRCONFIG
+ if (family == AF_UNSPEC) {
+ /* By default, only look up addresses using address types for
+ * which a local interface is configured, i.e. no IPv6 if no
+ * IPv6 interfaces configured. */
+ hints.ai_flags = AI_ADDRCONFIG;
+ }
+#endif
error = getaddrinfo(hostname, NULL, &hints, &ai_list);
+#ifdef AI_ADDRCONFIG
+ if (error == EAI_BADFLAGS && family == AF_UNSPEC) {
+ /* Retry with no flags if AI_ADDRCONFIG was rejected. */
+ hints.ai_flags = 0;
+ error = getaddrinfo(hostname, NULL, &hints, &ai_list);
+ }
+#endif
if (error) {
#ifndef WIN32
if (error == EAI_SYSTEM) {