Thread: Re: [HACKERS] [GENERAL] [PATCH] Better way to check for getaddrinfo

Re: [HACKERS] [GENERAL] [PATCH] Better way to check for getaddrinfo

From
Bruce Momjian
Date:
Tom Lane wrote:
> Bruce Momjian <pgman@candle.pha.pa.us> writes:
> > I have the answer.  Tru64 netdb.h has:
>
> >     #if defined (_SOCKADDR_LEN) || defined (_XOPEN_SOURCE_EXTENDED)
> >     #define getaddrinfo ngetaddrinfo
> >     #else
> >     #define getaddrinfo ogetaddrinfo
> >     #endif
>
> Seems like the same method we use for testing finite() and other
> possible-macros would handle this, then.

OK, patch attached.  I did the macro test you suggested.  Would someone
test this on Tru64?

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073
Index: configure
===================================================================
RCS file: /cvsroot/pgsql/configure,v
retrieving revision 1.473
diff -c -c -r1.473 configure
*** configure    17 Jan 2006 23:52:27 -0000    1.473
--- configure    26 Jan 2006 21:55:52 -0000
***************
*** 14589,14650 ****
  # versions of getaddrinfo don't follow normal C call protocol.  This is OK
  # because we want to use our own getaddrinfo.c on Windows anyway.)
  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
  /* confdefs.h.  */
  _ACEOF
  cat confdefs.h >>conftest.$ac_ext
  cat >>conftest.$ac_ext <<_ACEOF
  /* end confdefs.h.  */
- /* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
-    For example, HP-UX 11i <limits.h> declares gettimeofday.  */
- #define $ac_func innocuous_$ac_func
-
- /* System header to define __stub macros and hopefully few prototypes,
-     which can conflict with char $ac_func (); below.
-     Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-     <limits.h> exists even on freestanding compilers.  */
-
- #ifdef __STDC__
- # include <limits.h>
- #else
- # include <assert.h>
- #endif

! #undef $ac_func
!
! /* 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 ();
! /* 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
! char (*f) () = $ac_func;
! #endif
! #ifdef __cplusplus
! }
! #endif

  int
  main ()
  {
! return f != $ac_func;
    ;
    return 0;
  }
--- 14589,14610 ----
  # versions of getaddrinfo don't follow normal C call protocol.  This is OK
  # because we want to use our own getaddrinfo.c on Windows anyway.)
  if test x"$ac_cv_type_struct_addrinfo" = xyes ; then
! echo "$as_me:$LINENO: checking for getaddrinfo" >&5
! echo $ECHO_N "checking for getaddrinfo... $ECHO_C" >&6
! cat >conftest.$ac_ext <<_ACEOF
  /* confdefs.h.  */
  _ACEOF
  cat confdefs.h >>conftest.$ac_ext
  cat >>conftest.$ac_ext <<_ACEOF
  /* end confdefs.h.  */

! #include <sys/socket.h>
! #include <netdb.h>

  int
  main ()
  {
! return getaddrinfo("", "", NULL, NULL) ? 0 : 1;
    ;
    return 0;
  }
***************
*** 14671,14706 ****
    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
- sed 's/^/| /' conftest.$ac_ext >&5

! eval "$as_ac_var=no"
! fi
! rm -f conftest.err 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
!   case $LIBOBJS in
!     "$ac_func.$ac_objext"   | \
!   *" $ac_func.$ac_objext"   | \
!     "$ac_func.$ac_objext "* | \
!   *" $ac_func.$ac_objext "* ) ;;
!   *) LIBOBJS="$LIBOBJS $ac_func.$ac_objext" ;;
  esac

  fi
! done
!
!
  else
    case $LIBOBJS in
      "getaddrinfo.$ac_objext"   | \
--- 14631,14660 ----
    ac_status=$?
    echo "$as_me:$LINENO: \$? = $ac_status" >&5
    (exit $ac_status); }; }; then

! cat >>confdefs.h <<\_ACEOF
! #define HAVE_GETADDRINFO 1
  _ACEOF

+ echo "$as_me:$LINENO: result: yes" >&5
+ echo "${ECHO_T}yes" >&6
  else
!   echo "$as_me: failed program was:" >&5
! sed 's/^/| /' conftest.$ac_ext >&5
!
! echo "$as_me:$LINENO: result: no" >&5
! echo "${ECHO_T}no" >&6
!              case $LIBOBJS in
!     "getaddrinfo.$ac_objext"   | \
!   *" getaddrinfo.$ac_objext"   | \
!     "getaddrinfo.$ac_objext "* | \
!   *" getaddrinfo.$ac_objext "* ) ;;
!   *) LIBOBJS="$LIBOBJS getaddrinfo.$ac_objext" ;;
  esac

  fi
! rm -f conftest.err conftest.$ac_objext \
!       conftest$ac_exeext conftest.$ac_ext
  else
    case $LIBOBJS in
      "getaddrinfo.$ac_objext"   | \
Index: configure.in
===================================================================
RCS file: /cvsroot/pgsql/configure.in,v
retrieving revision 1.443
diff -c -c -r1.443 configure.in
*** configure.in    17 Jan 2006 23:52:30 -0000    1.443
--- configure.in    26 Jan 2006 21:55:52 -0000
***************
*** 921,927 ****
  # versions of getaddrinfo don't follow normal C call protocol.  This is OK
  # because we want to use our own getaddrinfo.c on Windows anyway.)
  if test x"$ac_cv_type_struct_addrinfo" = xyes ; then
!   AC_REPLACE_FUNCS([getaddrinfo])
  else
    AC_LIBOBJ(getaddrinfo)
  fi
--- 921,937 ----
  # versions of getaddrinfo don't follow normal C call protocol.  This is OK
  # because we want to use our own getaddrinfo.c on Windows anyway.)
  if test x"$ac_cv_type_struct_addrinfo" = xyes ; then
! dnl Cannot use AC_CHECK_FUNC because getaddrinfo may be a macro
! AC_MSG_CHECKING(for getaddrinfo)
! AC_TRY_LINK([
! #include <sys/socket.h>
! #include <netdb.h>
! ],
!             [return getaddrinfo("", "", NULL, NULL) ? 0 : 1;],
!             [AC_DEFINE(HAVE_GETADDRINFO, 1, [Define to 1 if you have getaddrinfo().])
! AC_MSG_RESULT(yes)],
!             [AC_MSG_RESULT(no)
!              AC_LIBOBJ(getaddrinfo)])
  else
    AC_LIBOBJ(getaddrinfo)
  fi
Index: src/include/pg_config.h.in
===================================================================
RCS file: /cvsroot/pgsql/src/include/pg_config.h.in,v
retrieving revision 1.90
diff -c -c -r1.90 pg_config.h.in
*** src/include/pg_config.h.in    17 Jan 2006 23:52:31 -0000    1.90
--- src/include/pg_config.h.in    26 Jan 2006 21:55:54 -0000
***************
*** 129,135 ****
  /* Define to 1 if your compiler understands __FUNCTION__. */
  #undef HAVE_FUNCNAME__FUNCTION

! /* Define to 1 if you have the `getaddrinfo' function. */
  #undef HAVE_GETADDRINFO

  /* Define to 1 if you have the `gethostbyname_r' function. */
--- 129,135 ----
  /* Define to 1 if your compiler understands __FUNCTION__. */
  #undef HAVE_FUNCNAME__FUNCTION

! /* Define to 1 if you have getaddrinfo(). */
  #undef HAVE_GETADDRINFO

  /* Define to 1 if you have the `gethostbyname_r' function. */