Tom Lane wrote:
Andrew Chernow <[EMAIL PROTECTED]> writes:
I am trying to compile libpq on HP-UX 10.20 using gcc 2.95.3, cpu is a 400MHz PA8500. I'm using the 8.3.5 tarball.

Yeah, 10.20 is a bit old and creaky, and the system headers are shy of a
load in a few places.  I currently use the attached fixes.

                        regards, tom lane


That got rid of all warnings. Although, it still fails to compile due to gethostbyname_r:

thread.c:141: too many arguments to function `gethostbyname_r'

hpux 10.20, hpux 11 and aix (maybe more) use a 3 argument version, not 5:

int
gethostbyname_r(const char *name, struct hostent *result,
                struct hostent_data *buffer);

I supplied a patch that includes a configure check. NOTE: the hpux platform check at the top of thread.c may not be cross-compiler, I think they are from gcc. Does the postgresql config system define platform somewhere so I can #ifdef PG_HPUX?

--
Andrew Chernow
eSilo, LLC
every bit counts
http://www.esilo.com/
Index: configure.in
===================================================================
RCS file: /projects/cvsroot/pgsql/configure.in,v
retrieving revision 1.571
diff -C6 -r1.571 configure.in
*** configure.in        30 Oct 2008 12:28:51 -0000      1.571
--- configure.in        16 Nov 2008 05:15:59 -0000
***************
*** 1363,1374 ****
--- 1363,1392 ----
  if test "$PORTNAME" != "win32"; then
  AC_CHECK_HEADER(pthread.h, [], [AC_MSG_ERROR([pthread.h not found, required 
for --enable-thread-safety])])
  fi
  
  AC_CHECK_FUNCS([strerror_r getpwuid_r gethostbyname_r])
  
+ # determines if the system has a 3 or 5 argument gethostbyname_r, only needed 
with threads
+ # there is also a 6 arg version used by linux
+ if test "$enable_thread_safety" = yes ; then
+       AC_MSG_CHECKING([gethostbyname_r argument count])
+       AC_TRY_COMPILE(
+       [#undef _XOPEN_SOURCE_EXTENDED
+ #ifndef _REENTRANT
+ #define _REENTRANT
+ #endif
+ #ifndef _THREAD_SAFE
+ #define _THREAD_SAFE
+ #endif
+ #include <netdb.h>],
+       [gethostbyname_r((void *)0, (void *)0, (void *)0)],
+       [AC_DEFINE(GETHOSTBYNAME_R_ARGCNT, 3, [Define to the number of 
arguments gethostbyname_r accepts]) AC_MSG_RESULT(3)],
+       [AC_DEFINE(GETHOSTBYNAME_R_ARGCNT, 5, [Define to the number of 
arguments gethostbyname_r accepts]) AC_MSG_RESULT(5)])
+ fi
+ 
  # Do test here with the proper thread flags
  PGAC_FUNC_GETPWUID_R_5ARG
  PGAC_FUNC_STRERROR_R_INT
  
  CFLAGS="$_CFLAGS"
  LIBS="$_LIBS"
Index: src/port/thread.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/port/thread.c,v
retrieving revision 1.39
diff -C6 -r1.39 thread.c
*** src/port/thread.c   22 Apr 2008 13:06:57 -0000      1.39
--- src/port/thread.c   16 Nov 2008 05:16:00 -0000
***************
*** 9,20 ****
--- 9,27 ----
   *
   * $PostgreSQL: pgsql/src/port/thread.c,v 1.39 2008/04/22 13:06:57 mha Exp $
   *
   *-------------------------------------------------------------------------
   */
  
+ /* When _XOPEN_SOURCE_EXTENDED is defined, struct hostent_data does
+  * not get declared.  This structure is needed by hpux gethostbyname_r.
+  */
+ #if defined(FRONTEND) && defined(ENABLE_THREAD_SAFETY) && (defined(__hpux) || 
defined(__hpux__) || defined(hpux))
+ #undef _XOPEN_SOURCE_EXTENDED
+ #endif
+ 
  #include "c.h"
  
  #include <pwd.h>
  #if defined(FRONTEND) && defined(ENABLE_THREAD_SAFETY)
  #endif
  
***************
*** 126,142 ****
--- 133,171 ----
                                char *buffer, size_t buflen,
                                struct hostent ** result,
                                int *herrno)
  {
  #if defined(FRONTEND) && defined(ENABLE_THREAD_SAFETY) && 
defined(HAVE_GETHOSTBYNAME_R)
  
+ #if GETHOSTBYNAME_R_ARGCNT == 3
+       *result = NULL;
+ 
+       if (buflen < sizeof(struct hostent_data))
+       {
+               /* linux man page says this gets set when buffer is too small */
+               *herrno = ERANGE;
+               return -1;
+       }
+ 
+       if (gethostbyname_r(name, resultbuf, (struct hostent_data *)buffer))
+       {
+               *herrno = h_errno;
+               return -1;
+       }
+ 
+       *result = resultbuf;
+ 
+ /* 5 argument version.  There is also a 6 arg version found on linux. */
+ #else
        /*
         * broken (well early POSIX draft) gethostbyname_r() which returns 
'struct
         * hostent *'
         */
        *result = gethostbyname_r(name, resultbuf, buffer, buflen, herrno);
+ #endif /* GETHOSTBYNAME_R_ARGCNT */
+ 
        return (*result == NULL) ? -1 : 0;
  #else
  
        /* no gethostbyname_r(), just use gethostbyname() */
        *result = gethostbyname(name);
  
-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to