From 33af087695a9c0092030da436c1647b51c18d096 Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Thu, 19 Oct 2006 23:17:39 +0000
Subject: [PATCH] Try to fix the AIX getaddrinfo mess in a way that works on
 all versions. Going to wait for buildfarm results before backpatching, this
 time.

---
 src/backend/libpq/ip.c | 37 +++++++++++++++++++++++++++++--------
 1 file changed, 29 insertions(+), 8 deletions(-)

diff --git a/src/backend/libpq/ip.c b/src/backend/libpq/ip.c
index 5f42676b360..a8f13b696c7 100644
--- a/src/backend/libpq/ip.c
+++ b/src/backend/libpq/ip.c
@@ -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;
 }
 
 
-- 
GitLab