diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2006-10-19 23:17:39 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2006-10-19 23:17:39 +0000 |
commit | 33af087695a9c0092030da436c1647b51c18d096 (patch) | |
tree | 6dc8aa7d5f2ffff0286861cbd44a9b9baafb8ff2 /src/backend/libpq/ip.c | |
parent | 0549ba82e32410892ef0d644212436551974aa2b (diff) | |
download | postgresql-33af087695a9c0092030da436c1647b51c18d096.tar.gz postgresql-33af087695a9c0092030da436c1647b51c18d096.zip |
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.
Diffstat (limited to 'src/backend/libpq/ip.c')
-rw-r--r-- | src/backend/libpq/ip.c | 37 |
1 files 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; } |