[ 
https://issues.apache.org/jira/browse/THRIFT-2539?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14015294#comment-14015294
 ] 

Randy Abernethy commented on THRIFT-2539:
-----------------------------------------

Looking around for a better implementation, perhaps this patch from the Apache 
trunk provides guidance:

{code}
--- apr/apr/trunk/network_io/unix/sockaddr.c    2012/05/21 20:38:41     1341196
+++ apr/apr/trunk/network_io/unix/sockaddr.c    2012/05/28 13:01:04     1343233
@@ -364,8 +364,23 @@
     }
     error = getaddrinfo(hostname, servname, &hints, &ai_list);
 #ifdef HAVE_GAI_ADDRCONFIG
-    if (error == EAI_BADFLAGS && family == APR_UNSPEC) {
-        /* Retry without AI_ADDRCONFIG if it was rejected. */
+    /*
+     * Using AI_ADDRCONFIG involves some unfortunate guesswork because it
+     * does not consider loopback addresses when trying to determine if
+     * IPv4 or IPv6 is configured on a system (see RFC 3493).
+     * This is a problem if one actually wants to listen on or connect to
+     * the loopback address of a protocol family that is not otherwise
+     * configured on the system. See PR 52709.
+     * To work around some of the problems, retry without AI_ADDRCONFIG
+     * in case of EAI_ADDRFAMILY.
+     * XXX: apr_sockaddr_info_get() should really accept a flag to determine
+     * XXX: if AI_ADDRCONFIG's guesswork is wanted and if the address is
+     * XXX: to be used for listen() or connect().
+     *
+     * In case of EAI_BADFLAGS, AI_ADDRCONFIG is not supported.
+     */
+    if ((family == APR_UNSPEC) && (error == EAI_BADFLAGS
+                                   || error == EAI_ADDRFAMILY)) {
         hints.ai_flags &= ~AI_ADDRCONFIG;
         error = getaddrinfo(hostname, servname, &hints, &ai_list);
     }

{code}

> Tsocket.cpp addrinfo ai_flags = AI_ADDRCONFIG
> ---------------------------------------------
>
>                 Key: THRIFT-2539
>                 URL: https://issues.apache.org/jira/browse/THRIFT-2539
>             Project: Thrift
>          Issue Type: Question
>    Affects Versions: 0.9.1
>            Reporter: MichaƂ Gazda
>            Assignee: Randy Abernethy
>         Attachments: THRIFT-2539-my-new-feature.patch, TSocket.cpp
>
>
> While creating and using thrift based app we have found some problem on 
> windows 7 which was not present on winxp. When  we try to open socket with 
> local_open() for the host name "localhost" getaddrinfo fails with 11004. What 
> is important we do not have any physical network address as all network cards 
> are disabled in the system. As I assume it is connected wit he flag 
> AI_ADDRCONFIG. Why it is set by default? I wonder if I do remove it can it 
> cause some problems? I would like our app to be able to communicate locally 
> even if there is no external network available.
> Hope to get quick reply, thank you.



--
This message was sent by Atlassian JIRA
(v6.2#6252)

Reply via email to