From 1da6eb7fdaa79a93972c290174bd7136672a894f Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Wed, 2 Apr 2003 00:49:28 +0000 Subject: [PATCH] Whack getaddrinfo() patch around until it works, more or less, on machines without IPv6. Or at least it works on HPUX 10.20 ... --- config/c-library.m4 | 12 ++- configure | 149 +++++++++++++++++++++++++++++- configure.in | 13 ++- src/backend/libpq/ip.c | 69 +++++++------- src/backend/libpq/pqcomm.c | 12 ++- src/backend/libpq/pqformat.c | 10 +- src/include/getaddrinfo.h | 63 +++++++++++-- src/include/libpq/ip.h | 46 ++++----- src/include/pg_config.h.in | 8 +- src/interfaces/libpq/fe-connect.c | 8 +- src/interfaces/libpq/fe-misc.c | 4 +- src/port/getaddrinfo.c | 59 ++++++++++-- src/template/hpux | 6 +- 13 files changed, 364 insertions(+), 95 deletions(-) diff --git a/config/c-library.m4 b/config/c-library.m4 index 906a787f0e..4453723bd5 100644 --- a/config/c-library.m4 +++ b/config/c-library.m4 @@ -1,5 +1,5 @@ # Macros that test various C library quirks -# $Header: /cvsroot/pgsql/config/c-library.m4,v 1.15 2003/01/28 21:57:12 petere Exp $ +# $Header: /cvsroot/pgsql/config/c-library.m4,v 1.16 2003/04/02 00:49:27 tgl Exp $ # PGAC_VAR_INT_TIMEZONE @@ -62,6 +62,16 @@ AC_DEFUN([PGAC_STRUCT_SOCKADDR_UN], ])])# PGAC_STRUCT_SOCKADDR_UN +# PGAC_STRUCT_ADDRINFO +# ----------------------- +# If `struct addrinfo' exists, define HAVE_STRUCT_ADDRINFO. +AC_DEFUN([PGAC_STRUCT_ADDRINFO], +[AC_CHECK_TYPES([struct addrinfo], [], [], +[#include +#include +])])# PGAC_STRUCT_ADDRINFO + + # PGAC_FUNC_POSIX_SIGNALS # ----------------------- # Check to see if the machine has the POSIX signal interface. Define diff --git a/configure b/configure index 72f9dc3f13..4bb4d8a465 100755 --- a/configure +++ b/configure @@ -9392,6 +9392,66 @@ cat >>confdefs.h <<_ACEOF _ACEOF +fi + +echo "$as_me:$LINENO: checking for struct addrinfo" >&5 +echo $ECHO_N "checking for struct addrinfo... $ECHO_C" >&6 +if test "${ac_cv_type_struct_addrinfo+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +#include "confdefs.h" +#include +#include + + +#ifdef F77_DUMMY_MAIN +# ifdef __cplusplus + extern "C" +# endif + int F77_DUMMY_MAIN() { return 1; } +#endif +int +main () +{ +if ((struct addrinfo *) 0) + return 0; +if (sizeof (struct addrinfo)) + return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_type_struct_addrinfo=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +ac_cv_type_struct_addrinfo=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_type_struct_addrinfo" >&5 +echo "${ECHO_T}$ac_cv_type_struct_addrinfo" >&6 +if test $ac_cv_type_struct_addrinfo = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_STRUCT_ADDRINFO 1 +_ACEOF + + fi @@ -10950,8 +11010,7 @@ fi - -for ac_func in fseeko getaddrinfo gethostname getopt_long getrusage inet_aton random srandom strcasecmp strdup strerror strtol strtoul +for ac_func in fseeko gethostname getopt_long getrusage inet_aton random srandom strcasecmp strdup strerror strtol strtoul do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` echo "$as_me:$LINENO: checking for $ac_func" >&5 @@ -11030,6 +11089,92 @@ done +# system's version of getaddrinfo(), if any, may be used only if we found +# a definition for struct addrinfo; see notes in src/include/getaddrinfo.h +if test x"$ac_cv_type_struct_addrinfo" = xyes ; then + +for ac_func in getaddrinfo +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 +if eval "test \"\${$as_ac_var+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +#include "confdefs.h" +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. */ +#include +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func (); +char (*f) (); + +#ifdef F77_DUMMY_MAIN +# ifdef __cplusplus + extern "C" +# endif + int F77_DUMMY_MAIN() { return 1; } +#endif +int +main () +{ +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +f = $ac_func; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +eval "$as_ac_var=no" +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +else + LIBOBJS="$LIBOBJS $ac_func.$ac_objext" +fi +done + + +else + LIBOBJS="$LIBOBJS getaddrinfo.$ac_objext" +fi + # BSD/OS & NetBSD use a custom fseeko/ftello built on fsetpos/fgetpos # We override the previous test that said fseeko/ftello didn't exist # OS tests are also done in include/c.h and port/fseeko.c diff --git a/configure.in b/configure.in index a7d961ecb1..ed59aa9025 100644 --- a/configure.in +++ b/configure.in @@ -1,5 +1,5 @@ dnl Process this file with autoconf to produce a configure script. -dnl $Header: /cvsroot/pgsql/configure.in,v 1.240 2003/03/29 11:31:51 petere Exp $ +dnl $Header: /cvsroot/pgsql/configure.in,v 1.241 2003/04/02 00:49:28 tgl Exp $ dnl dnl Developers, please strive to achieve this order: dnl @@ -746,6 +746,7 @@ AC_C_VOLATILE AC_STRUCT_TIMEZONE PGAC_UNION_SEMUN PGAC_STRUCT_SOCKADDR_UN +PGAC_STRUCT_ADDRINFO AC_CHECK_TYPES([struct cmsgcred, struct fcred, struct sockcred], [], [], [#include @@ -847,7 +848,15 @@ else AC_CHECK_FUNCS([fpclass fp_class fp_class_d class], [break]) fi -AC_REPLACE_FUNCS([fseeko getaddrinfo gethostname getopt_long getrusage inet_aton random srandom strcasecmp strdup strerror strtol strtoul]) +AC_REPLACE_FUNCS([fseeko gethostname getopt_long getrusage inet_aton random srandom strcasecmp strdup strerror strtol strtoul]) + +# system's version of getaddrinfo(), if any, may be used only if we found +# a definition for struct addrinfo; see notes in src/include/getaddrinfo.h +if test x"$ac_cv_type_struct_addrinfo" = xyes ; then + AC_REPLACE_FUNCS([getaddrinfo]) +else + AC_LIBOBJ(getaddrinfo) +fi # BSD/OS & NetBSD use a custom fseeko/ftello built on fsetpos/fgetpos # We override the previous test that said fseeko/ftello didn't exist diff --git a/src/backend/libpq/ip.c b/src/backend/libpq/ip.c index 3c3b872c1d..a9a7cf1e83 100644 --- a/src/backend/libpq/ip.c +++ b/src/backend/libpq/ip.c @@ -1,14 +1,14 @@ /*------------------------------------------------------------------------- * * ip.c - * Handles IPv6 + * IPv6-aware network access. * * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/libpq/ip.c,v 1.3 2003/03/29 11:31:51 petere Exp $ + * $Header: /cvsroot/pgsql/src/backend/libpq/ip.c,v 1.4 2003/04/02 00:49:28 tgl Exp $ * * This file and the IPV6 implementation were initially provided by * Nigel Kukard , Linux Based Systems Design @@ -17,11 +17,8 @@ *------------------------------------------------------------------------- */ -#ifndef FRONTEND -#include "postgres.h" -#else -#include "postgres_fe.h" -#endif +/* This is intended to be used in both frontend and backend, so use c.h */ +#include "c.h" #include #include @@ -36,18 +33,25 @@ #include #include -#include "libpq/libpq.h" -#include "miscadmin.h" +#include "libpq/ip.h" -#ifdef FRONTEND -#define elog fprintf -#define LOG stderr + +static int rangeSockAddrAF_INET(const SockAddr *addr, + const SockAddr *netaddr, + const SockAddr *netmask); + +#ifdef HAVE_IPV6 +static int rangeSockAddrAF_INET6(const SockAddr *addr, + const SockAddr *netaddr, + const SockAddr *netmask); +static void convSockAddr6to4(const SockAddr *src, SockAddr *dst); #endif -#if defined(HAVE_UNIX_SOCKETS) +#ifdef HAVE_UNIX_SOCKETS static int getaddrinfo_unix(const char *path, const struct addrinfo *hintsp, struct addrinfo **result); -#endif /* HAVE_UNIX_SOCKETS */ +#endif + /* * getaddrinfo2 - get address info for Unix, IPv4 and IPv6 sockets @@ -59,15 +63,11 @@ getaddrinfo2(const char *hostname, const char *servname, #ifdef HAVE_UNIX_SOCKETS if (hintp != NULL && hintp->ai_family == AF_UNIX) return getaddrinfo_unix(servname, hintp, result); - else - { -#endif /* HAVE_UNIX_SOCKETS */ - /* NULL has special meaning to getaddrinfo */ - return getaddrinfo((!hostname || hostname[0] == '\0') ? NULL : hostname, - servname, hintp, result); -#ifdef HAVE_UNIX_SOCKETS - } -#endif /* HAVE_UNIX_SOCKETS */ +#endif + + /* NULL has special meaning to getaddrinfo */ + return getaddrinfo((!hostname || hostname[0] == '\0') ? NULL : hostname, + servname, hintp, result); } @@ -98,11 +98,11 @@ freeaddrinfo2(int hint_ai_family, struct addrinfo *ai) #if defined(HAVE_UNIX_SOCKETS) /* ------- - * getaddrinfo_unix - get unix socket info using IPv6 + * getaddrinfo_unix - get unix socket info using IPv6-compatible API * * Bug: only one addrinfo is set even though hintsp is NULL or * ai_socktype is 0 - * AI_CANNONNAME does not support. + * AI_CANONNAME is not supported. * ------- */ static int @@ -128,7 +128,7 @@ getaddrinfo_unix(const char *path, const struct addrinfo *hintsp, if (hints.ai_family != AF_UNIX) { - elog(LOG, "hints.ai_family is invalid in getaddrinfo_unix()\n"); + /* shouldn't have been called */ return EAI_ADDRFAMILY; } @@ -247,8 +247,6 @@ SockAddr_pton(SockAddr *sa, const char *src) } - - /* * isAF_INETx - check to see if sa is AF_INET or AF_INET6 */ @@ -267,7 +265,8 @@ isAF_INETx(const int family) int -rangeSockAddr(const SockAddr *addr, const SockAddr *netaddr, const SockAddr *netmask) +rangeSockAddr(const SockAddr *addr, const SockAddr *netaddr, + const SockAddr *netmask) { if (addr->sa.sa_family == AF_INET) return rangeSockAddrAF_INET(addr, netaddr, netmask); @@ -279,7 +278,7 @@ rangeSockAddr(const SockAddr *addr, const SockAddr *netaddr, const SockAddr *net return 0; } -int +static int rangeSockAddrAF_INET(const SockAddr *addr, const SockAddr *netaddr, const SockAddr *netmask) { @@ -294,8 +293,10 @@ rangeSockAddrAF_INET(const SockAddr *addr, const SockAddr *netaddr, return 0; } + #ifdef HAVE_IPV6 -int + +static int rangeSockAddrAF_INET6(const SockAddr *addr, const SockAddr *netaddr, const SockAddr *netmask) { @@ -324,7 +325,7 @@ rangeSockAddrAF_INET6(const SockAddr *addr, const SockAddr *netaddr, return 1; } -void +static void convSockAddr6to4(const SockAddr *src, SockAddr *dst) { char addr_str[INET6_ADDRSTRLEN]; @@ -337,6 +338,8 @@ convSockAddr6to4(const SockAddr *src, SockAddr *dst) + (src->in6.sin6_addr.s6_addr[14] << 8) + (src->in6.sin6_addr.s6_addr[13] << 16) + (src->in6.sin6_addr.s6_addr[12] << 24); + SockAddr_ntop(src, addr_str, INET6_ADDRSTRLEN, 0); } -#endif + +#endif /* HAVE_IPV6 */ diff --git a/src/backend/libpq/pqcomm.c b/src/backend/libpq/pqcomm.c index 20954a4ecf..cc06347e45 100644 --- a/src/backend/libpq/pqcomm.c +++ b/src/backend/libpq/pqcomm.c @@ -29,7 +29,7 @@ * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $Id: pqcomm.c,v 1.148 2003/03/29 11:31:51 petere Exp $ + * $Id: pqcomm.c,v 1.149 2003/04/02 00:49:28 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -204,7 +204,11 @@ StreamServerPort(int family, char *hostName, unsigned short portNumber, struct addrinfo *addrs = NULL; struct addrinfo hint; - Assert(family == AF_INET6 || family == AF_INET || family == AF_UNIX); +#ifdef HAVE_UNIX_SOCKETS + Assert(family == AF_UNIX || isAF_INETx(family)); +#else + Assert(isAF_INETx(family)); +#endif /* Initialize hint structure */ MemSet(&hint, 0, sizeof(hint)); @@ -229,8 +233,8 @@ StreamServerPort(int family, char *hostName, unsigned short portNumber, ret = getaddrinfo2(hostName, service, &hint, &addrs); if (ret || addrs == NULL) { - elog(LOG, "server socket failure: getaddrinfo2()%s: %s", - (family == AF_INET6) ? " using IPv6" : "", gai_strerror(ret)); + elog(LOG, "server socket failure: getaddrinfo2(): %s", + gai_strerror(ret)); if (addrs != NULL) freeaddrinfo2(hint.ai_family, addrs); return STATUS_ERROR; diff --git a/src/backend/libpq/pqformat.c b/src/backend/libpq/pqformat.c index 5f5acb4443..50f17977d3 100644 --- a/src/backend/libpq/pqformat.c +++ b/src/backend/libpq/pqformat.c @@ -16,7 +16,7 @@ * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $Id: pqformat.c,v 1.25 2002/09/04 23:31:35 tgl Exp $ + * $Id: pqformat.c,v 1.26 2003/04/02 00:49:28 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -49,13 +49,15 @@ #include #include +#include +#include +#ifdef HAVE_ENDIAN_H +#include +#endif #include "libpq/libpq.h" #include "libpq/pqformat.h" #include "mb/pg_wchar.h" -#ifdef HAVE_ENDIAN_H -#include -#endif /* -------------------------------- diff --git a/src/include/getaddrinfo.h b/src/include/getaddrinfo.h index 7933f93d70..2b47d613e9 100644 --- a/src/include/getaddrinfo.h +++ b/src/include/getaddrinfo.h @@ -1,12 +1,34 @@ -/* $Header: /cvsroot/pgsql/src/include/getaddrinfo.h,v 1.1 2003/03/29 11:31:51 petere Exp $ */ - +/*------------------------------------------------------------------------- + * + * getaddrinfo.h + * Support getaddrinfo() on platforms that don't have it. + * + * + * Note: we use our own routines on platforms that don't HAVE_STRUCT_ADDRINFO, + * whether or not the library routine getaddrinfo() can be found. This + * policy is needed because on some platforms a manually installed libbind.a + * may provide getaddrinfo(), yet the system headers may not provide the + * struct definitions needed to call it. To avoid conflict with the libbind + * definition in such cases, we rename our routines to pg_xxx() via macros. + * + * This code will also work on platforms where struct addrinfo is defined + * in the system headers but no getaddrinfo() can be located. + * + * Copyright (c) 2003, PostgreSQL Global Development Group + * + * $Id: getaddrinfo.h,v 1.2 2003/04/02 00:49:28 tgl Exp $ + * + *------------------------------------------------------------------------- + */ #ifndef GETADDRINFO_H #define GETADDRINFO_H -#include "c.h" +#include #include +#ifndef HAVE_STRUCT_ADDRINFO + struct addrinfo { int ai_flags; int ai_family; @@ -18,13 +40,6 @@ struct addrinfo { struct addrinfo *ai_next; }; - -int getaddrinfo(const char *node, const char *service, - const struct addrinfo *hints, struct addrinfo **res); -void freeaddrinfo(struct addrinfo *res); -const char *gai_strerror(int errcode); - - #define EAI_BADFLAGS -1 #define EAI_NONAME -2 #define EAI_AGAIN -3 @@ -40,4 +55,32 @@ const char *gai_strerror(int errcode); #define AI_PASSIVE 0x0001 #define AI_NUMERICHOST 0x0004 +#endif /* HAVE_STRUCT_ADDRINFO */ + + +#ifndef HAVE_GETADDRINFO + +/* Rename private copies per comments above */ +#ifdef getaddrinfo +#undef getaddrinfo +#endif +#define getaddrinfo pg_getaddrinfo + +#ifdef freeaddrinfo +#undef freeaddrinfo +#endif +#define freeaddrinfo pg_freeaddrinfo + +#ifdef gai_strerror +#undef gai_strerror +#endif +#define gai_strerror pg_gai_strerror + +extern int getaddrinfo(const char *node, const char *service, + const struct addrinfo *hints, struct addrinfo **res); +extern void freeaddrinfo(struct addrinfo *res); +extern const char *gai_strerror(int errcode); + +#endif /* HAVE_GETADDRINFO */ + #endif /* GETADDRINFO_H */ diff --git a/src/include/libpq/ip.h b/src/include/libpq/ip.h index ac782a0336..7866b81ccb 100644 --- a/src/include/libpq/ip.h +++ b/src/include/libpq/ip.h @@ -1,28 +1,32 @@ +/*------------------------------------------------------------------------- + * + * ip.h + * Definitions for IPv6-aware network access. + * + * Copyright (c) 2003, PostgreSQL Global Development Group + * + * $Id: ip.h,v 1.3 2003/04/02 00:49:28 tgl Exp $ + * + *------------------------------------------------------------------------- + */ #ifndef IP_H #define IP_H -#include "c.h" -#include -#include -#include "libpq/pqcomm.h" -#ifndef HAVE_GETADDRINFO + #include "getaddrinfo.h" -#endif +#include "libpq/pqcomm.h" -int getaddrinfo2(const char *hostname, const char *servname, - const struct addrinfo *hintp, struct addrinfo **result); -void freeaddrinfo2(int hint_ai_family, struct addrinfo *ai); -char *SockAddr_ntop(const SockAddr *sa, char *dst, size_t cnt, int v4conv); -int SockAddr_pton(SockAddr *sa, const char *src); -int isAF_INETx(const int family); -int rangeSockAddr(const SockAddr *addr, const SockAddr *netaddr, - const SockAddr *netmask); -int rangeSockAddrAF_INET(const SockAddr *addr, const SockAddr *netaddr, - const SockAddr *netmask); -#ifdef HAVE_IPV6 -int rangeSockAddrAF_INET6(const SockAddr *addr, const SockAddr *netaddr, - const SockAddr *netmask); -void convSockAddr6to4(const SockAddr *src, SockAddr *dst); -#endif +extern int getaddrinfo2(const char *hostname, const char *servname, + const struct addrinfo *hintp, + struct addrinfo **result); +extern void freeaddrinfo2(int hint_ai_family, struct addrinfo *ai); + +extern char *SockAddr_ntop(const SockAddr *sa, char *dst, size_t cnt, + int v4conv); +extern int SockAddr_pton(SockAddr *sa, const char *src); + +extern int isAF_INETx(const int family); +extern int rangeSockAddr(const SockAddr *addr, const SockAddr *netaddr, + const SockAddr *netmask); #endif /* IP_H */ diff --git a/src/include/pg_config.h.in b/src/include/pg_config.h.in index f515c6cff1..d135e815a9 100644 --- a/src/include/pg_config.h.in +++ b/src/include/pg_config.h.in @@ -8,7 +8,7 @@ * or in pg_config.h afterwards. Of course, if you edit pg_config.h, then your * changes will be overwritten the next time you run configure. * - * $Id: pg_config.h.in,v 1.42 2003/03/29 11:31:51 petere Exp $ + * $Id: pg_config.h.in,v 1.43 2003/04/02 00:49:28 tgl Exp $ */ #ifndef PG_CONFIG_H @@ -465,6 +465,9 @@ /* Set to 1 if you have gethostname() */ #undef HAVE_GETHOSTNAME +/* Set to 1 if you have getpeereid() */ +#undef HAVE_GETPEEREID + /* Set to 1 if struct tm has a tm_zone member */ #undef HAVE_TM_ZONE @@ -589,6 +592,9 @@ /* Set to 1 if you have struct sockaddr_un */ #undef HAVE_STRUCT_SOCKADDR_UN +/* Set to 1 if you have struct addrinfo */ +#undef HAVE_STRUCT_ADDRINFO + /* Set to 1 if you have krb5_ticket.enc_part2 */ #undef HAVE_KRB5_TICKET_ENC_PART2 diff --git a/src/interfaces/libpq/fe-connect.c b/src/interfaces/libpq/fe-connect.c index 141c80e276..3d938031ef 100644 --- a/src/interfaces/libpq/fe-connect.c +++ b/src/interfaces/libpq/fe-connect.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-connect.c,v 1.229 2003/03/29 11:31:51 petere Exp $ + * $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-connect.c,v 1.230 2003/04/02 00:49:28 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -881,9 +881,9 @@ connectDBStart(PGconn *conn) * for the *last* alternative, which may not be what users expect * :-(). * - * In either case, we never actually fall out of the loop; the - * only exits are via "break" or "goto connect_errReturn". Thus, - * there is no exit test in the for(). + * Notice we never actually fall out of the loop; the only exits are + * via "break" or "goto connect_errReturn". Thus, there is no exit + * test in the for(). */ for (addr_cur = addrs; ; addr_cur = addr_cur->ai_next) { diff --git a/src/interfaces/libpq/fe-misc.c b/src/interfaces/libpq/fe-misc.c index ad99e5de15..0f971343cc 100644 --- a/src/interfaces/libpq/fe-misc.c +++ b/src/interfaces/libpq/fe-misc.c @@ -25,7 +25,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-misc.c,v 1.87 2003/03/06 03:16:55 tgl Exp $ + * $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-misc.c,v 1.88 2003/04/02 00:49:28 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -35,6 +35,8 @@ #include #include #include +#include +#include #ifdef WIN32 #include "win32.h" diff --git a/src/port/getaddrinfo.c b/src/port/getaddrinfo.c index aa3d3ab6b8..972f6b6b39 100644 --- a/src/port/getaddrinfo.c +++ b/src/port/getaddrinfo.c @@ -1,12 +1,28 @@ -/* $Header: /cvsroot/pgsql/src/port/getaddrinfo.c,v 1.1 2003/03/29 11:31:52 petere Exp $ */ +/*------------------------------------------------------------------------- + * + * getaddrinfo.c + * Support getaddrinfo() on platforms that don't have it. + * + * + * Copyright (c) 2003, PostgreSQL Global Development Group + * + * + * IDENTIFICATION + * $Header: /cvsroot/pgsql/src/port/getaddrinfo.c,v 1.2 2003/04/02 00:49:28 tgl Exp $ + * + *------------------------------------------------------------------------- + */ +/* This is intended to be used in both frontend and backend, so use c.h */ #include "c.h" -#include "getaddrinfo.h" -#include + #include +#include #include #include +#include "getaddrinfo.h" + int getaddrinfo(const char *node, const char *service, @@ -16,7 +32,8 @@ getaddrinfo(const char *node, const char *service, struct addrinfo *ai; struct sockaddr_in sin, *psin; - if (!hints || (hints->ai_family != AF_INET && hints->ai_family != AF_UNSPEC)) + if (!hints || + (hints->ai_family != AF_INET && hints->ai_family != AF_UNSPEC)) return EAI_FAMILY; if (hints->ai_socktype != SOCK_STREAM) @@ -25,6 +42,10 @@ getaddrinfo(const char *node, const char *service, if (!node && !service) return EAI_NONAME; + memset(&sin, 0, sizeof(sin)); + + sin.sin_family = AF_INET; + if (node) { if (node[0] == '\0') @@ -66,7 +87,7 @@ getaddrinfo(const char *node, const char *service, } if (service) - sin.sin_port = htons((unsigned short)atoi(service)); + sin.sin_port = htons((unsigned short) atoi(service)); ai = malloc(sizeof(*ai)); if (!ai) @@ -78,11 +99,11 @@ getaddrinfo(const char *node, const char *service, return EAI_MEMORY; } - memcpy(psin, &sin, sizeof(sin)); + memcpy(psin, &sin, sizeof(*psin)); - ai->ai_family = hints->ai_family; - ai->ai_socktype = hints->ai_socktype; - ai->ai_protocol = hints->ai_protocol; + ai->ai_family = AF_INET; + ai->ai_socktype = SOCK_STREAM; + ai->ai_protocol = IPPROTO_TCP; ai->ai_addrlen = sizeof(*psin); ai->ai_addr = (struct sockaddr *) psin; ai->ai_canonname = NULL; @@ -106,9 +127,10 @@ freeaddrinfo(struct addrinfo *res) } -const char* +const char * gai_strerror(int errcode) { +#ifdef HAVE_HSTRERROR int hcode; switch (errcode) @@ -129,4 +151,21 @@ gai_strerror(int errcode) } return hstrerror(hcode); + +#else /* !HAVE_HSTRERROR */ + + switch (errcode) + { + case EAI_NONAME: + return "Unknown host"; + case EAI_NODATA: + return "No address associated with name"; + case EAI_AGAIN: + return "Host name lookup failure"; + case EAI_FAIL: + default: + return "Unknown server error"; + } + +#endif /* HAVE_HSTRERROR */ } diff --git a/src/template/hpux b/src/template/hpux index 4db8f44eba..34a5e86144 100644 --- a/src/template/hpux +++ b/src/template/hpux @@ -1,6 +1,8 @@ if test "$GCC" = yes ; then - CFLAGS=-O2 + CPPFLAGS="-D_XOPEN_SOURCE_EXTENDED" + CFLAGS="-O2" else CC="$CC -Ae" - CFLAGS=+O2 + CPPFLAGS="-D_XOPEN_SOURCE_EXTENDED" + CFLAGS="+O2" fi