From db16e7734918c63589fe607be94699449a618b5a Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Thu, 11 Jun 2009 19:00:15 +0000
Subject: [PATCH] Remove our inadequate kluge that tried to get AIX's various
 broken versions of getaddrinfo() to work.  Instead, recommend updating the OS
 to get a working version of getaddrinfo.  Per recent discussions.

---
 doc/src/sgml/installation.sgml | 115 ++++++++++++++++++---------------
 src/backend/libpq/ip.c         |  38 +----------
 2 files changed, 65 insertions(+), 88 deletions(-)

diff --git a/doc/src/sgml/installation.sgml b/doc/src/sgml/installation.sgml
index e91f34538aa..c272bade96b 100644
--- a/doc/src/sgml/installation.sgml
+++ b/doc/src/sgml/installation.sgml
@@ -1,4 +1,4 @@
-<!-- $PostgreSQL: pgsql/doc/src/sgml/installation.sgml,v 1.321 2009/04/27 16:27:35 momjian Exp $ -->
+<!-- $PostgreSQL: pgsql/doc/src/sgml/installation.sgml,v 1.322 2009/06/11 19:00:14 tgl Exp $ -->
 
 <chapter id="installation">
  <title><![%standalone-include[<productname>PostgreSQL</>]]>
@@ -2090,7 +2090,7 @@ kill `cat /usr/local/pgsql/data/postmaster.pid`
 
     <para>
      On AIX 4.3.2, you need <filename>libm.a</filename> that is in the
-     fileset bos.adt.libm.  Try the following command:
+     fileset <literal>bos.adt.libm</>.  Try the following command:
 <screen>
 $ lslpp -l bos.adt.libm
 </screen>
@@ -2120,11 +2120,11 @@ $ lslpp -l bos.adt.libm
 
     <para>
      AIX 5.3 has a problem
-     where <structname>sockadr_storage</structname> is not defined to
+     where <structname>sockaddr_storage</structname> is not defined to
      be large enough.  In version 5.3, IBM increased the size of
      <structname>sockaddr_un</structname>, the address structure for
      Unix-domain sockets, but did not correspondingly increase the
-     size of <structname>sockadr_storage</structname>.  The result of
+     size of <structname>sockaddr_storage</structname>.  The result of
      this is that attempts to use Unix-domain sockets with PostgreSQL
      lead to libpq overflowing the data structure.  TCP/IP connections
      work OK, but not Unix-domain sockets, which prevents the
@@ -2142,7 +2142,66 @@ $ lslpp -l bos.adt.libm
    </sect3>
 
    <sect3>
-    <title>Memory Management</title>
+    <title>Internet address issues</title>
+
+    <para>
+     PostgreSQL relies on the system's <function>getaddrinfo</> function
+     to parse IP addresses in <varname>listen_addresses</>,
+     <filename>pg_hba.conf</>, etc.  Older versions of AIX have assorted
+     bugs in this function.  If you have problems related to these settings,
+     updating to the latest fix pack for your AIX release should fix it.
+    </para>
+
+    <!-- http://archives.postgresql.org/message-id/6064jt6cfm.fsf_-_@dba2.int.libertyrms.com -->
+
+    <para>
+     One user reports:
+    </para>
+
+    <para>
+     When implementing PostgreSQL version 8.1 on AIX 5.3, we
+     periodically ran into problems where the statistics collector
+     would <quote>mysteriously</quote> not come up successfully.  This
+     appears to be the result of unexpected behaviour in the IPv6
+     implementation.  It looks like PostgreSQL and IPv6 do not play
+     very well together at this time on AIX.
+    </para>
+
+    <para>
+     Any of the following actions <quote>fix</quote> the problem.
+     <itemizedlist>
+      <listitem>
+       <para>
+        Delete the IPv6 address for localhost:
+<screen>
+(as root)
+# ifconfig lo0 inet6 ::1/0 delete
+</screen>
+       </para>
+      </listitem>
+
+      <listitem>
+       <para>
+        Remove IPv6 from net services.  The
+        file <filename>/etc/netsvc.conf</filename> on AIX is roughly
+        equivalent to <filename>/etc/nsswitch.conf</filename> on
+        Solaris/Linux.  The default, on AIX, is thus:
+<programlisting>
+hosts=local,bind
+</programlisting>
+        Replace this with:
+<programlisting>
+hosts=local4,bind4
+</programlisting>
+        to deactivate searching for IPv6 addresses.
+       </para>
+      </listitem>
+     </itemizedlist>
+    </para>
+   </sect3>
+
+   <sect3>
+    <title>Memory management</title>
     <!-- http://archives.postgresql.org/message-id/603bgqmpl9.fsf@dba2.int.libertyrms.com -->
 
     <para>
@@ -2292,52 +2351,6 @@ createlang: language installation failed: ERROR:  could not load library "/opt/d
      </biblioentry>
     </bibliography>
    </sect3>
-
-   <sect3>
-    <title>Statistics Collector Issues</title>
-    <!-- http://archives.postgresql.org/message-id/6064jt6cfm.fsf_-_@dba2.int.libertyrms.com -->
-
-    <para>
-     When implementing PostgreSQL version 8.1 on AIX 5.3, we
-     periodically ran into problems where the statistics collector
-     would <quote>mysteriously</quote> not come up successfully.  This
-     appears to be the result of unexpected behaviour in the IPv6
-     implementation.  It looks like PostgreSQL and IPv6 do not play
-     very well together at this time on AIX.
-    </para>
-
-    <para>
-     Any of the following actions <quote>fix</quote> the problem.
-     <itemizedlist>
-      <listitem>
-       <para>
-        Delete the IPv6 address for localhost:
-<screen>
-(as root)
-# ifconfig lo0 inet6 ::1/0 delete
-</screen>
-       </para>
-      </listitem>
-
-      <listitem>
-       <para>
-        Remove IPv6 from net services.  The
-        file <filename>/etc/netsvc.conf</filename> on AIX is roughly
-        equivalent to <filename>/etc/nsswitch.conf</filename> on
-        Solaris/Linux.  The default, on AIX, is thus:
-<programlisting>
-hosts=local,bind
-</programlisting>
-        Replace this with:
-<programlisting>
-hosts=local4,bind4
-</programlisting>
-        to deactivate searching for IPv6 addresses.
-       </para>
-      </listitem>
-     </itemizedlist>
-    </para>
-   </sect3>
   </sect2>
 
   <sect2 id="installation-notes-cygwin">
diff --git a/src/backend/libpq/ip.c b/src/backend/libpq/ip.c
index 80880b38070..90ec119d79d 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.46 2009/06/11 14:48:58 momjian Exp $
+ *	  $PostgreSQL: pgsql/src/backend/libpq/ip.c,v 1.47 2009/06/11 19:00:15 tgl Exp $
  *
  * This file and the IPV6 implementation were initially provided by
  * Nigel Kukard <nkukard@lbsd.net>, Linux Based Systems Design
@@ -74,45 +74,9 @@ pg_getaddrinfo_all(const char *hostname, const char *servname,
 		return getaddrinfo_unix(servname, hintp, result);
 #endif
 
-#ifndef _AIX
 	/* NULL has special meaning to getaddrinfo(). */
 	rc = getaddrinfo((!hostname || hostname[0] == '\0') ? NULL : hostname,
 					 servname, hintp, result);
-#else							/* _AIX */
-
-	/*
-	 * Various versions of AIX have various bugs in getaddrinfo()'s handling
-	 * of the servname parameter, including failing entirely if it's not NULL
-	 * and failing to zero sin_port when it is NULL :-(.  Avoid these by
-	 * always passing NULL and handling the port number for ourselves.
-	 */
-	rc = getaddrinfo((!hostname || hostname[0] == '\0') ? NULL : hostname,
-					 NULL, hintp, result);
-
-	if (rc == 0)
-	{
-		struct addrinfo *addr;
-		unsigned short port = 0;
-
-		if (servname && *servname)
-			port = atoi(servname);
-
-		for (addr = *result; addr; addr = addr->ai_next)
-		{
-			switch (addr->ai_family)
-			{
-				case AF_INET:
-					((struct sockaddr_in *) addr->ai_addr)->sin_port = htons(port);
-					break;
-#ifdef HAVE_IPV6
-				case AF_INET6:
-					((struct sockaddr_in6 *) addr->ai_addr)->sin6_port = htons(port);
-					break;
-#endif
-			}
-		}
-	}
-#endif   /* _AIX */
 
 	return rc;
 }
-- 
GitLab