]> granicus.if.org Git - sudo/commitdiff
Add dedicated test for getaddrinfo(). Tru64 UNIX contains two
authorTodd C. Miller <Todd.Miller@courtesan.com>
Wed, 20 Nov 2013 19:04:47 +0000 (12:04 -0700)
committerTodd C. Miller <Todd.Miller@courtesan.com>
Wed, 20 Nov 2013 19:04:47 +0000 (12:04 -0700)
versions of getaddrinfo and we must include netdb.h to get the
proper definition.

MANIFEST
aclocal.m4
configure
configure.ac
m4/ax_func_getaddrinfo.m4 [new file with mode: 0644]

index c8a37f75bf96d8cde64e041a9b26e9973f458265..5e77e7c499f3e7956a654c9da39f5512b53d5669 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -157,6 +157,7 @@ install-sh
 ltmain.sh
 m4/ax_check_compile_flag.m4
 m4/ax_check_link_flag.m4
+m4/ax_func_getaddrinfo.m4
 m4/ax_func_snprintf.m4
 m4/libtool.m4
 m4/ltoptions.m4
index cc710d45485a6dc9428a80935c7a5a8d7705c2ea..a3746e82a1ece13cac5614ac9158e19719ce6669 100644 (file)
@@ -128,6 +128,7 @@ AC_DEFUN([_AC_TYPE_LONG_LONG_SNIPPET],
 
 m4_include([m4/ax_check_compile_flag.m4])
 m4_include([m4/ax_check_link_flag.m4])
+m4_include([m4/ax_func_getaddrinfo.m4])
 m4_include([m4/ax_func_snprintf.m4])
 m4_include([m4/libtool.m4])
 m4_include([m4/ltoptions.m4])
index 38b16153eec927b88ad6e141b2716819735126c0..70365285d610e6ae5ed6ab4fc0efaf24932dfcb5 100755 (executable)
--- a/configure
+++ b/configure
@@ -18518,84 +18518,93 @@ $as_echo "no" >&6; }
 
 fi
 
-for ac_func in getaddrinfo
-do :
-  ac_fn_c_check_func "$LINENO" "getaddrinfo" "ac_cv_func_getaddrinfo"
-if test "x$ac_cv_func_getaddrinfo" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_GETADDRINFO 1
+#
+# Check for getaddrinfo and add any required libs to NET_LIBS
+#
+OLIBS="$LIBS"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for getaddrinfo" >&5
+$as_echo_n "checking for getaddrinfo... " >&6; }
+if ${ax_cv_func_getaddrinfo+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netdb.h>
+int main() { return getaddrinfo(NULL, NULL, NULL, NULL); }
 _ACEOF
-
+if ac_fn_c_try_link "$LINENO"; then :
+  ax_cv_func_getaddrinfo=yes
 else
+  ax_cv_func_getaddrinfo=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
 
-    found=no
-    for libs in "-lsocket" "-linet" "-lsocket -lnsl"; do
-       _libs=
-       for lib in $libs; do
-           case "$NET_LIBS" in
-               *"$lib"*)   ;;
-               *)          _libs="$_libs $lib";;
-           esac
-       done
-       libs="${_libs# }"
-       test -z "$libs" && continue
-       lib="`echo \"$libs\"|sed -e 's/^-l//' -e 's/ .*$//'`"
-       extralibs="`echo \"$libs\"|sed 's/^-l[^ ]*//'`"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_func_getaddrinfo" >&5
+$as_echo "$ax_cv_func_getaddrinfo" >&6; }
+if test X"$ax_cv_func_getaddrinfo" = X"yes"; then
 
-    _sudo_check_lib_extras=`echo "$extralibs"|sed -e 's/       *//g' -e 's/-l/_/g'`
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for getaddrinfo in -l$lib${5+ }$extralibs" >&5
-$as_echo_n "checking for getaddrinfo in -l$lib${5+ }$extralibs... " >&6; }
-    if { as_var=sudo_cv_lib_$lib''_getaddrinfo$_sudo_check_lib_extras; eval \${$as_var+:} false; }; then :
+$as_echo "#define HAVE_GETADDRINFO 1" >>confdefs.h
+
+else
+    # Not found in libc, check libsocket and libinet
+    _found=no
+    for _libs in "-lsocket" "-linet" "-lsocket -lnsl"; do
+       _cv="ax_cv_lib_getaddrinfo`echo \"$_libs\"|sed -e 's/-l/_/g' -e 's/ *//g'`"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking for getaddrinfo in $_libs" >&5
+$as_echo_n "checking for getaddrinfo in $_libs... " >&6; }
+       if eval \${$_cv+:} false; then :
   $as_echo_n "(cached) " >&6
 else
 
-       SUDO_CHECK_LIB_OLIBS="$LIBS"
-       LIBS="$LIBS -l$lib${5+ }$extralibs"
-       cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+           _nlibs=
+           for _l in $_libs; do
+               case "$LIBS" in
+                   *"$_l"*)    ;;
+                   *)          _nlibs="$_nlibs $_l";;
+               esac
+           done
+           _libs="${_nlibs# }"
+           if test -z "$_libs"; then
+               # No new libs to check
+               eval $_cv=no
+           else
+               AX_FUNC_GETADDRINFO_OLIBS="$LIBS"
+               LIBS="$LIBS $_libs"
+               cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char getaddrinfo ();
-int
-main ()
-{
-return getaddrinfo ();
-  ;
-  return 0;
-}
+#include <sys/types.h>
+    #include <sys/socket.h>
+    #include <netdb.h>
+    int main() { return getaddrinfo(NULL, NULL, NULL, NULL); }
 _ACEOF
 if ac_fn_c_try_link "$LINENO"; then :
-  eval sudo_cv_lib_$lib''_getaddrinfo$_sudo_check_lib_extras=yes
+  eval $_cv=yes
 else
-  eval sudo_cv_lib_$lib''_getaddrinfo$_sudo_check_lib_extras=no
-
+  eval $_cv=no
 fi
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
-       LIBS="$SUDO_CHECK_LIB_OLIBS"
+               LIBS="$AX_FUNC_GETADDRINFO_OLIBS"
+           fi
 
 fi
 
-    if eval test \$sudo_cv_lib_$lib''_getaddrinfo$_sudo_check_lib_extras = "yes"; then
-       { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+       if eval test \$$_cv = "yes"; then
+           { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
 $as_echo "yes" >&6; }
-       NET_LIBS="${NET_LIBS} $libs"; LIBS="${LIBS} $libs"; found=yes; break
-    else
+           $as_echo "#define HAVE_GETADDRINFO 1" >>confdefs.h
+
+           test -n "$_libs" && LIBS="$LIBS $_libs"
+           break
+       fi
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
 $as_echo "no" >&6; }
-
-    fi
-
     done
-    if test X"$found" != X"no"; then
-       $as_echo "#define HAVE_GETADDRINFO 1" >>confdefs.h
-
-    else
+    if eval test \$$_cv != "yes"; then
        case " $LIBOBJS " in
   *" getaddrinfo.$ac_objext "* ) ;;
   *) LIBOBJS="$LIBOBJS getaddrinfo.$ac_objext"
@@ -18603,10 +18612,14 @@ $as_echo "no" >&6; }
 esac
 
     fi
-
 fi
-done
 
+for lib in $LIBS; do
+    case "$OLIBS" in
+       *"$lib"*)   ;;
+       *)          NET_LIBS="$NET_LIBS $lib";;
+    esac
+done
 for ac_func in getprogname
 do :
   ac_fn_c_check_func "$LINENO" "getprogname" "ac_cv_func_getprogname"
index a55e23a9d27f70c497db9457ecca4f9fb952de32..35b44a19aea8097b3710554cdf87bb05f7b3b32b 100644 (file)
@@ -2533,32 +2533,17 @@ AC_CHECK_FUNC(syslog, [], [
        SUDO_CHECK_LIB($lib, syslog, [NET_LIBS="${NET_LIBS} $libs"; LIBS="${LIBS} $libs"; break], [], [$extralibs])
     done
 ])
-dnl
-dnl If getaddrinfo(3) not in libc, check -lsocket and -linet
-dnl May need to link with *both* -lnsl and -lsocket due to unresolved symbols.
-dnl
-AC_CHECK_FUNCS(getaddrinfo, [], [
-    found=no
-    for libs in "-lsocket" "-linet" "-lsocket -lnsl"; do
-       _libs=
-       for lib in $libs; do
-           case "$NET_LIBS" in
-               *"$lib"*)   ;;
-               *)          _libs="$_libs $lib";;
-           esac
-       done
-       libs="${_libs# }"
-       test -z "$libs" && continue
-       lib="`echo \"$libs\"|sed -e 's/^-l//' -e 's/ .*$//'`"
-       extralibs="`echo \"$libs\"|sed 's/^-l[[^ ]]*//'`"
-       SUDO_CHECK_LIB($lib, getaddrinfo, [NET_LIBS="${NET_LIBS} $libs"; LIBS="${LIBS} $libs"; found=yes; break], [], [$extralibs])
-    done
-    if test X"$found" != X"no"; then
-       AC_DEFINE(HAVE_GETADDRINFO)
-    else
-       AC_LIBOBJ(getaddrinfo)
-    fi
-])
+#
+# Check for getaddrinfo and add any required libs to NET_LIBS
+#
+OLIBS="$LIBS"
+AX_FUNC_GETADDRINFO
+for lib in $LIBS; do
+    case "$OLIBS" in
+       *"$lib"*)   ;;
+       *)          NET_LIBS="$NET_LIBS $lib";;
+    esac
+done
 dnl
 dnl Check for getprogname() or __progname
 dnl
diff --git a/m4/ax_func_getaddrinfo.m4 b/m4/ax_func_getaddrinfo.m4
new file mode 100644 (file)
index 0000000..2d71fbe
--- /dev/null
@@ -0,0 +1,70 @@
+#
+# SYNOPSIS
+#
+#   AX_FUNC_GETADDRINFO
+#
+# DESCRIPTION
+#
+#   Checks for the getaddrinfo function in the standard C library,
+#   as well as the socket and inet libraries, if they are present.
+#   If extra libraries are required, they are added to LIBS.
+#   If no getaddrinfo function is found, it is added to LIBOBJS.
+#   Note: Tru64 UNIX contains two versions of getaddrinfo and we must
+#   include netdb.h to get the proper definition.
+#
+# LICENSE
+#
+#   Placed in the public domain by Todd C. Miller on November 20, 2013.
+#
+
+AC_DEFUN([AX_FUNC_GETADDRINFO],
+[AC_MSG_CHECKING(for getaddrinfo)
+AC_CACHE_VAL(ax_cv_func_getaddrinfo,
+[AC_LINK_IFELSE([AC_LANG_SOURCE([[#include <sys/types.h>
+#include <sys/socket.h>
+#include <netdb.h>
+int main() { return getaddrinfo(NULL, NULL, NULL, NULL); }]])], [ax_cv_func_getaddrinfo=yes], [ax_cv_func_getaddrinfo=no])])
+AC_MSG_RESULT([$ax_cv_func_getaddrinfo])
+if test X"$ax_cv_func_getaddrinfo" = X"yes"; then
+    AC_DEFINE(HAVE_GETADDRINFO, 1, [Define to 1 if you have the `getaddrinfo' function.])
+else
+    # Not found in libc, check libsocket and libinet
+    _found=no
+    for _libs in "-lsocket" "-linet" "-lsocket -lnsl"; do
+       _cv="ax_cv_lib_getaddrinfo`echo \"$_libs\"|sed -e 's/-l/_/g' -e 's/ *//g'`"
+       AC_MSG_CHECKING([for getaddrinfo in $_libs])
+       AC_CACHE_VAL([$_cv], [
+           _nlibs=
+           for _l in $_libs; do
+               case "$LIBS" in
+                   *"$_l"*)    ;;
+                   *)          _nlibs="$_nlibs $_l";;
+               esac
+           done
+           _libs="${_nlibs# }"
+           if test -z "$_libs"; then
+               # No new libs to check
+               eval $_cv=no
+           else
+               AX_FUNC_GETADDRINFO_OLIBS="$LIBS"
+               LIBS="$LIBS $_libs"
+               AC_LINK_IFELSE([AC_LANG_SOURCE([[#include <sys/types.h>
+    #include <sys/socket.h>
+    #include <netdb.h>
+    int main() { return getaddrinfo(NULL, NULL, NULL, NULL); }]])], [eval $_cv=yes], [eval $_cv=no])
+               LIBS="$AX_FUNC_GETADDRINFO_OLIBS"
+           fi
+       ])
+       if eval test \$$_cv = "yes"; then
+           AC_MSG_RESULT([yes])
+           AC_DEFINE(HAVE_GETADDRINFO)
+           test -n "$_libs" && LIBS="$LIBS $_libs"
+           break
+       fi
+       AC_MSG_RESULT([no])
+    done
+    if eval test \$$_cv != "yes"; then
+       AC_LIBOBJ(getaddrinfo)
+    fi
+fi
+])