Try to fix the AIX getaddrinfo mess in a way that works on all versions.
authorTom Lane <tgl@sss.pgh.pa.us>
Thu, 19 Oct 2006 23:17:39 +0000 (23:17 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Thu, 19 Oct 2006 23:17:39 +0000 (23:17 +0000)
Going to wait for buildfarm results before backpatching, this time.

src/backend/libpq/ip.c

index 5f42676b3603f98de8e6f93e185690cf816dda3b..a8f13b696c7779d89eca25f66fd1936f346080f8 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/libpq/ip.c,v 1.37 2006/10/19 17:26:32 tgl Exp $
+ *   $PostgreSQL: pgsql/src/backend/libpq/ip.c,v 1.38 2006/10/19 23:17:39 tgl Exp $
  *
  * This file and the IPV6 implementation were initially provided by
  * Nigel Kukard <nkukard@lbsd.net>, Linux Based Systems Design
@@ -64,6 +64,8 @@ int
 pg_getaddrinfo_all(const char *hostname, const char *servname,
                   const struct addrinfo * hintp, struct addrinfo ** result)
 {
+   int         rc;
+
    /* not all versions of getaddrinfo() zero *result on failure */
    *result = NULL;
 
@@ -72,18 +74,37 @@ pg_getaddrinfo_all(const char *hostname, const char *servname,
        return getaddrinfo_unix(servname, hintp, result);
 #endif
 
+   /* NULL has special meaning to getaddrinfo(). */
+   rc = getaddrinfo((!hostname || hostname[0] == '\0') ? NULL : hostname,
+                    servname, hintp, result);
+
 #ifdef _AIX
    /*
-    * It seems AIX's getaddrinfo doesn't reliably zero sin_port when servname
-    * is NULL, so force the issue.
+    * It seems some versions of AIX's getaddrinfo don't reliably zero
+    * sin_port when servname is NULL, so clean up after it.
     */
-   if (servname == NULL)
-       servname = "0";
+   if (servname == NULL && rc == 0)
+   {
+       struct addrinfo *addr;
+
+       for (addr = *result; addr; addr = addr->ai_next)
+       {
+           switch (addr->ai_family)
+           {
+               case AF_INET:
+                   ((struct sockaddr_in *) addr->ai_addr)->sin_port = htons(0);
+                   break;
+#ifdef HAVE_IPV6
+               case AF_INET6:
+                   ((struct sockaddr_in6 *) addr->ai_addr)->sin6_port = htons(0);
+                   break;
+#endif
+           }
+       }
+   }
 #endif
 
-   /* NULL has special meaning to getaddrinfo(). */
-   return getaddrinfo((!hostname || hostname[0] == '\0') ? NULL : hostname,
-                      servname, hintp, result);
+   return rc;
 }