Fix bug 8153 found when building on an IPv6-only system by Kai Blin.
authorJeremy Allison <jra@samba.org>
Thu, 19 May 2011 19:32:15 +0000 (12:32 -0700)
committerKarolin Seeger <kseeger@samba.org>
Fri, 20 May 2011 19:15:50 +0000 (21:15 +0200)
When building on IPv6-only, doing:

hints.ai_family = AF_INET;
getaddrinfo("0.0.0.0", NULL, &hints, &ppres)

fails as AF_INET is unavailable on an IPv6-only system. This
causes us to fallback to our replacement getaddrinfo code
which is IPv4-only.

As we're only trying to detect a specific AIX bug here,
broaden the tests to find that bug, and also test for
working getaddrinfo in an IPv6-only safe way.

lib/replace/libreplace_network.m4

index f9bca40ce9410c76935c3310d3cb19ffa9bbc9a6..eadcc6bfc11a153415e99cdd2ee149d5bfca5f29 100644 (file)
@@ -240,12 +240,25 @@ if test x"$libreplace_cv_HAVE_GETADDRINFO" = x"yes"; then
                {
                        struct addrinfo hints = {0,};
                        struct addrinfo *ppres;
-                       const char hostname[] = "0.0.0.0";
+                       const char hostname1[] = "0.0.0.0";
+                       const char hostname2[] = "127.0.0.1";
+                       const char hostname3[] = "::";
                        hints.ai_socktype = SOCK_STREAM;
-                       hints.ai_family = AF_INET;
+                       hints.ai_family = AF_UNSPEC;
                        hints.ai_flags =
                                AI_NUMERICHOST|AI_PASSIVE|AI_ADDRCONFIG;
-                       return getaddrinfo(hostname, NULL, &hints, &ppres) != 0 ? 1 : 0;
+                       /* Test for broken flag combination on AIX. */
+                       if (getaddrinfo(hostname1, NULL, &hints, &ppres) == EAI_BADFLAGS) {
+                               /* This fails on an IPv6-only box, but not with
+                                  the EAI_BADFLAGS error. */
+                               return 1;
+                       }
+                       if (getaddrinfo(hostname2, NULL, &hints, &ppres) == 0) {
+                               /* IPv4 lookup works - good enough. */
+                               return 0;
+                       }
+                       /* Uh-oh, no IPv4. Are we IPv6-only ? */
+                       return getaddrinfo(hostname3, NULL, &hints, &ppres) != 0 ? 1 : 0;
                }],
                libreplace_cv_HAVE_GETADDRINFO=yes,
                libreplace_cv_HAVE_GETADDRINFO=no)