From: Todd C. Miller Date: Wed, 20 Nov 2013 19:04:47 +0000 (-0700) Subject: Add dedicated test for getaddrinfo(). Tru64 UNIX contains two X-Git-Tag: SUDO_1_8_9^2~79 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6a1d1e1483d0126b6dba63c01f38853c258f1e4f;p=sudo Add dedicated test for getaddrinfo(). Tru64 UNIX contains two versions of getaddrinfo and we must include netdb.h to get the proper definition. --- diff --git a/MANIFEST b/MANIFEST index c8a37f75b..5e77e7c49 100644 --- 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 diff --git a/aclocal.m4 b/aclocal.m4 index cc710d454..a3746e82a 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -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]) diff --git a/configure b/configure index 38b16153e..70365285d 100755 --- 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 +#include +#include +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 + #include + #include + 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" diff --git a/configure.ac b/configure.ac index a55e23a9d..35b44a19a 100644 --- a/configure.ac +++ b/configure.ac @@ -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 index 000000000..2d71fbead --- /dev/null +++ b/m4/ax_func_getaddrinfo.m4 @@ -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 +#include +#include +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 + #include + #include + 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 +])