From 17d2a464ad42c47ec37870e4b01a18ef5593877f Mon Sep 17 00:00:00 2001 From: Yang Tse Date: Thu, 13 Nov 2008 18:56:55 +0000 Subject: Refactor configure script detection of functions used to set sockets into non-blocking mode, and decouple function detection from function capability. --- ares/Makefile.dj | 1 + ares/Makefile.netware | 3 +- ares/acinclude.m4 | 148 --------- ares/ares_process.c | 53 ++- ares/config-win32.h | 5 +- ares/configure.ac | 10 +- ares/m4/cares-confopts.m4 | 74 ++++- ares/m4/cares-functions.m4 | 786 ++++++++++++++++++++++++++++++++++++++++++++- 8 files changed, 891 insertions(+), 189 deletions(-) (limited to 'ares') diff --git a/ares/Makefile.dj b/ares/Makefile.dj index 7ee6e0447..26a32fbf1 100644 --- a/ares/Makefile.dj +++ b/ares/Makefile.dj @@ -11,6 +11,7 @@ include ../packages/DOS/common.dj include Makefile.inc CFLAGS += -DWATT32 -DHAVE_AF_INET6 -DHAVE_PF_INET6 -DHAVE_IOCTLSOCKET \ + -DHAVE_IOCTLSOCKET_FIONBIO \ -DHAVE_STRUCT_IN6_ADDR -DHAVE_SOCKADDR_IN6_SIN6_SCOPE_ID \ -DHAVE_SYS_TIME_H -DHAVE_STRUCT_SOCKADDR_IN6 -DHAVE_STRUCT_ADDRINFO \ -DHAVE_SIGNAL_H -DHAVE_SIG_ATOMIC_T -DRETSIGTYPE='void' \ diff --git a/ares/Makefile.netware b/ares/Makefile.netware index 9ed7ba0c9..0a908f055 100644 --- a/ares/Makefile.netware +++ b/ares/Makefile.netware @@ -350,12 +350,13 @@ endif @echo $(DL)#define HAVE_ASSERT_H 1$(DL) >> $@ @echo $(DL)#define HAVE_ERR_H 1$(DL) >> $@ @echo $(DL)#define HAVE_FCNTL_H 1$(DL) >> $@ - @echo $(DL)#define HAVE_FIONBIO 1$(DL) >> $@ @echo $(DL)#define HAVE_GETHOSTBYADDR 1$(DL) >> $@ @echo $(DL)#define HAVE_GETHOSTBYNAME 1$(DL) >> $@ @echo $(DL)#define HAVE_GETPROTOBYNAME 1$(DL) >> $@ @echo $(DL)#define HAVE_GMTIME_R 1$(DL) >> $@ @echo $(DL)#define HAVE_INET_ADDR 1$(DL) >> $@ + @echo $(DL)#define HAVE_IOCTL 1$(DL) >> $@ + @echo $(DL)#define HAVE_IOCTL_FIONBIO 1$(DL) >> $@ @echo $(DL)#define HAVE_LL 1$(DL) >> $@ @echo $(DL)#define HAVE_LOCALTIME_R 1$(DL) >> $@ @echo $(DL)#define HAVE_MALLOC_H 1$(DL) >> $@ diff --git a/ares/acinclude.m4 b/ares/acinclude.m4 index abe10d78f..879643dc4 100644 --- a/ares/acinclude.m4 +++ b/ares/acinclude.m4 @@ -1433,154 +1433,6 @@ AC_DEFUN([TYPE_SIG_ATOMIC_T], [ ]) -dnl CURL_CHECK_NONBLOCKING_SOCKET -dnl ------------------------------------------------- -dnl Check for how to set a socket to non-blocking state. There seems to exist -dnl four known different ways, with the one used almost everywhere being POSIX -dnl and XPG3, while the other different ways for different systems (old BSD, -dnl Windows and Amiga). -dnl -dnl There are two known platforms (AIX 3.x and SunOS 4.1.x) where the -dnl O_NONBLOCK define is found but does not work. This condition is attempted -dnl to get caught in this script by using an excessive number of #ifdefs... - -AC_DEFUN([CURL_CHECK_NONBLOCKING_SOCKET], [ - AC_MSG_CHECKING([non-blocking sockets style]) - nonblock="unknown" - # - AC_COMPILE_IFELSE([ - AC_LANG_PROGRAM([[ -/* headers for O_NONBLOCK test */ -#include -#include -#include -/* */ -#if defined(sun) || defined(__sun__) || \ - defined(__SUNPRO_C) || defined(__SUNPRO_CC) -# if defined(__SVR4) || defined(__srv4__) -# define PLATFORM_SOLARIS -# else -# define PLATFORM_SUNOS4 -# endif -#endif -#if (defined(_AIX) || defined(__xlC__)) && !defined(_AIX41) -# define PLATFORM_AIX_V3 -#endif -/* */ -#if defined(PLATFORM_SUNOS4) || defined(PLATFORM_AIX_V3) || defined(__BEOS__) -#error "O_NONBLOCK does not work on this platform" -#endif - ]],[[ - /* O_NONBLOCK source test */ - int socket; - int flags = fcntl(socket, F_SETFL, flags | O_NONBLOCK); - ]]) - ],[ - dnl the O_NONBLOCK test was fine - nonblock="O_NONBLOCK" - AC_DEFINE(HAVE_O_NONBLOCK, 1, - [use O_NONBLOCK for non-blocking sockets]) - ]) - # - if test "$nonblock" = "unknown"; then - AC_COMPILE_IFELSE([ - AC_LANG_PROGRAM([[ -/* headers for FIONBIO test */ -#include -#include - ]],[[ - /* FIONBIO source test (old-style unix) */ - int socket; - int flags = ioctl(socket, FIONBIO, &flags); - ]]) - ],[ - dnl FIONBIO test was good - nonblock="FIONBIO" - AC_DEFINE(HAVE_FIONBIO, 1, - [use FIONBIO for non-blocking sockets]) - ]) - fi - # - if test "$nonblock" = "unknown"; then - AC_COMPILE_IFELSE([ - AC_LANG_PROGRAM([[ -/* headers for ioctlsocket test (Windows) */ -#undef inline -#ifdef HAVE_WINDOWS_H -#ifndef WIN32_LEAN_AND_MEAN -#define WIN32_LEAN_AND_MEAN -#endif -#include -#ifdef HAVE_WINSOCK2_H -#include -#else -#ifdef HAVE_WINSOCK_H -#include -#endif -#endif -#endif - ]],[[ - /* ioctlsocket source code (Windows) */ - SOCKET sd; - unsigned long flags = 0; - sd = socket(0, 0, 0); - ioctlsocket(sd, FIONBIO, &flags); - ]]) - ],[ - dnl ioctlsocket test was good - nonblock="ioctlsocket" - AC_DEFINE(HAVE_IOCTLSOCKET, 1, - [use ioctlsocket() for non-blocking sockets]) - ]) - fi - # - if test "$nonblock" = "unknown"; then - AC_LINK_IFELSE([ - AC_LANG_PROGRAM([[ -/* headers for IoctlSocket test (Amiga?) */ -#include - ]],[[ - /* IoctlSocket source code (Amiga?) */ - int socket; - int flags = IoctlSocket(socket, FIONBIO, (long)1); - ]]) - ],[ - dnl Ioctlsocket test was good - nonblock="IoctlSocket" - AC_DEFINE(HAVE_IOCTLSOCKET_CASE, 1, - [use Ioctlsocket() for non-blocking sockets]) - ]) - fi - # - if test "$nonblock" = "unknown"; then - AC_COMPILE_IFELSE([ - AC_LANG_PROGRAM([[ -/* headers for SO_NONBLOCK test (BeOS) */ -#include - ]],[[ - /* SO_NONBLOCK source code (BeOS) */ - long b = 1; - int socket; - int flags = setsockopt(socket, SOL_SOCKET, SO_NONBLOCK, &b, sizeof(b)); - ]]) - ],[ - dnl the SO_NONBLOCK test was good - nonblock="SO_NONBLOCK" - AC_DEFINE(HAVE_SO_NONBLOCK, 1, - [use SO_NONBLOCK for non-blocking sockets]) - ]) - fi - # - AC_MSG_RESULT($nonblock) - # - if test "$nonblock" = "unknown"; then - AC_DEFINE(HAVE_DISABLED_NONBLOCKING, 1, - [disabled non-blocking sockets]) - AC_MSG_WARN([non-block sockets disabled]) - fi -]) - - dnl TYPE_IN_ADDR_T dnl ------------------------------------------------- dnl Check for in_addr_t: it is used to receive the return code of inet_addr() diff --git a/ares/ares_process.c b/ares/ares_process.c index b7f375e19..05341aa64 100644 --- a/ares/ares_process.c +++ b/ares/ares_process.c @@ -805,68 +805,51 @@ void ares__send_query(ares_channel channel, struct query *query, static int setsocknonblock(ares_socket_t sockfd, /* operate on this */ int nonblock /* TRUE or FALSE */) { -#undef SETBLOCK -#define SETBLOCK 0 -#ifdef HAVE_O_NONBLOCK +#if defined(USE_BLOCKING_SOCKETS) + + return 0; /* returns success */ + +#elif defined(HAVE_FCNTL_O_NONBLOCK) + /* most recent unix versions */ int flags; - flags = fcntl(sockfd, F_GETFL, 0); if (FALSE != nonblock) return fcntl(sockfd, F_SETFL, flags | O_NONBLOCK); else return fcntl(sockfd, F_SETFL, flags & (~O_NONBLOCK)); -#undef SETBLOCK -#define SETBLOCK 1 -#endif -#if defined(HAVE_FIONBIO) && (SETBLOCK == 0) +#elif defined(HAVE_IOCTL_FIONBIO) + /* older unix versions */ int flags; - flags = nonblock; return ioctl(sockfd, FIONBIO, &flags); -#undef SETBLOCK -#define SETBLOCK 2 -#endif -#if defined(HAVE_IOCTLSOCKET) && (SETBLOCK == 0) +#elif defined(HAVE_IOCTLSOCKET_FIONBIO) + #ifdef WATT32 char flags; #else - /* Windows? */ + /* Windows */ unsigned long flags; #endif flags = nonblock; - return ioctlsocket(sockfd, FIONBIO, &flags); -#undef SETBLOCK -#define SETBLOCK 3 -#endif -#if defined(HAVE_IOCTLSOCKET_CASE) && (SETBLOCK == 0) - /* presumably for Amiga */ +#elif defined(HAVE_IOCTLSOCKET_CAMEL_FIONBIO) + + /* Amiga */ return IoctlSocket(sockfd, FIONBIO, (long)nonblock); -#undef SETBLOCK -#define SETBLOCK 4 -#endif -#if defined(HAVE_SO_NONBLOCK) && (SETBLOCK == 0) +#elif defined(HAVE_SETSOCKOPT_SO_NONBLOCK) + /* BeOS */ long b = nonblock ? 1 : 0; return setsockopt(sockfd, SOL_SOCKET, SO_NONBLOCK, &b, sizeof(b)); -#undef SETBLOCK -#define SETBLOCK 5 -#endif -#ifdef HAVE_DISABLED_NONBLOCKING - return 0; /* returns success */ -#undef SETBLOCK -#define SETBLOCK 6 -#endif - -#if (SETBLOCK == 0) -#error "no non-blocking method was found/used/set" +#else +# error "no non-blocking method was found/used/set" #endif } diff --git a/ares/config-win32.h b/ares/config-win32.h index 9e8f10c55..2245b0386 100644 --- a/ares/config-win32.h +++ b/ares/config-win32.h @@ -76,9 +76,12 @@ /* FUNCTIONS */ /* ---------------------------------------------------------------- */ -/* Define if you have the ioctlsocket function. */ +/* Define if you have the ioctlsocket function. */ #define HAVE_IOCTLSOCKET 1 +/* Define if you have a working ioctlsocket FIONBIO function. */ +#define HAVE_IOCTLSOCKET_FIONBIO 1 + /* Define if you have the strcasecmp function. */ /* #define HAVE_STRCASECMP 1 */ diff --git a/ares/configure.ac b/ares/configure.ac index 641a83e3e..1b1b20d59 100644 --- a/ares/configure.ac +++ b/ares/configure.ac @@ -553,12 +553,17 @@ CURL_CHECK_FUNC_RECVFROM CURL_CHECK_FUNC_SEND CURL_CHECK_MSG_NOSIGNAL +CARES_CHECK_FUNC_FCNTL CARES_CHECK_FUNC_FREEADDRINFO CARES_CHECK_FUNC_GETADDRINFO CARES_CHECK_FUNC_GETHOSTNAME CARES_CHECK_FUNC_GETSERVBYPORT_R CARES_CHECK_FUNC_INET_NTOP CARES_CHECK_FUNC_INET_PTON +CARES_CHECK_FUNC_IOCTL +CARES_CHECK_FUNC_IOCTLSOCKET +CARES_CHECK_FUNC_IOCTLSOCKET_CAMEL +CARES_CHECK_FUNC_SETSOCKOPT CARES_CHECK_FUNC_STRCASECMP CARES_CHECK_FUNC_STRCMPI CARES_CHECK_FUNC_STRDUP @@ -851,8 +856,6 @@ dnl and get the types of five of its arguments. CURL_CHECK_FUNC_GETNAMEINFO -CURL_CHECK_NONBLOCKING_SOCKET - AC_C_BIGENDIAN( [AC_DEFINE(ARES_BIG_ENDIAN, 1, [define this if ares is built for a big endian system])], @@ -883,6 +886,9 @@ if test -n "$RANDOM_FILE" && test X"$RANDOM_FILE" != Xno ; then [a suitable file/device to read random data from]) fi +CARES_CHECK_OPTION_NONBLOCKING +CARES_CHECK_NONBLOCKING_SOCKET + CARES_PRIVATE_LIBS="$LIBS" AC_SUBST(CARES_PRIVATE_LIBS) diff --git a/ares/m4/cares-confopts.m4 b/ares/m4/cares-confopts.m4 index 17a6875f3..c34197a48 100644 --- a/ares/m4/cares-confopts.m4 +++ b/ares/m4/cares-confopts.m4 @@ -16,7 +16,7 @@ #*************************************************************************** # File version for 'aclocal' use. Keep it a single number. -# serial 2 +# serial 3 dnl CARES_CHECK_OPTION_DEBUG @@ -52,6 +52,38 @@ AC_HELP_STRING([--disable-debug],[Disable debug build options]), ]) +dnl CARES_CHECK_OPTION_NONBLOCKING +dnl ------------------------------------------------- +dnl Verify if configure has been invoked with option +dnl --enable-nonblocking or --disable-nonblocking, and +dnl set shell variable want_nonblocking as appropriate. + +AC_DEFUN([CARES_CHECK_OPTION_NONBLOCKING], [ + AC_BEFORE([$0],[CARES_CHECK_NONBLOCKING_SOCKET])dnl + AC_MSG_CHECKING([whether to enable non-blocking communications]) + OPT_NONBLOCKING="default" + AC_ARG_ENABLE(nonblocking, +AC_HELP_STRING([--enable-nonblocking],[Enable non-blocking communications]) +AC_HELP_STRING([--disable-nonblocking],[Disable non-blocking communications]), + OPT_NONBLOCKING=$enableval) + case "$OPT_NONBLOCKING" in + no) + dnl --disable-nonblocking option used + want_nonblocking="no" + ;; + default) + dnl configure option not specified + want_nonblocking="yes" + ;; + *) + dnl --enable-nonblocking option used + want_nonblocking="yes" + ;; + esac + AC_MSG_RESULT([$want_nonblocking]) +]) + + dnl CARES_CHECK_OPTION_OPTIMIZE dnl ------------------------------------------------- dnl Verify if configure has been invoked with option @@ -140,3 +172,43 @@ AC_HELP_STRING([--disable-warnings],[Disable strict compiler warnings]), esac AC_MSG_RESULT([$want_warnings]) ]) + + +dnl CARES_CHECK_NONBLOCKING_SOCKET +dnl ------------------------------------------------- +dnl Check for how to set a socket into non-blocking state. + +AC_DEFUN([CARES_CHECK_NONBLOCKING_SOCKET], [ + AC_REQUIRE([CARES_CHECK_OPTION_NONBLOCKING])dnl + AC_REQUIRE([CARES_CHECK_FUNC_FCNTL])dnl + AC_REQUIRE([CARES_CHECK_FUNC_IOCTL])dnl + AC_REQUIRE([CARES_CHECK_FUNC_IOCTLSOCKET])dnl + AC_REQUIRE([CARES_CHECK_FUNC_IOCTLSOCKET_CAMEL])dnl + AC_REQUIRE([CARES_CHECK_FUNC_SETSOCKOPT])dnl + # + tst_method="unknown" + if test "$want_nonblocking" = "yes"; then + AC_MSG_CHECKING([how to set a socket into non-blocking mode]) + if test "x$ac_cv_func_fcntl_o_nonblock" = "xyes"; then + tst_method="fcntl O_NONBLOCK" + elif test "x$ac_cv_func_ioctl_fionbio" = "xyes"; then + tst_method="ioctl FIONBIO" + elif test "x$ac_cv_func_ioctlsocket_fionbio" = "xyes"; then + tst_method="ioctlsocket FIONBIO" + elif test "x$ac_cv_func_ioctlsocket_camel_fionbio" = "xyes"; then + tst_method="IoctlSocket FIONBIO" + elif test "x$ac_cv_func_setsockopt_so_nonblock" = "xyes"; then + tst_method="setsockopt SO_NONBLOCK" + fi + AC_MSG_RESULT([$tst_method]) + if test "$tst_method" = "unknown"; then + AC_MSG_WARN([cannot determine non-blocking socket method.]) + fi + fi + if test "$tst_method" = "unknown"; then + AC_DEFINE_UNQUOTED(USE_BLOCKING_SOCKETS, 1, + [Define to disable non-blocking sockets.]) + AC_MSG_WARN([non-blocking sockets disabled.]) + fi +]) + diff --git a/ares/m4/cares-functions.m4 b/ares/m4/cares-functions.m4 index 98bd070f0..66bf9cae6 100644 --- a/ares/m4/cares-functions.m4 +++ b/ares/m4/cares-functions.m4 @@ -16,7 +16,7 @@ #*************************************************************************** # File version for 'aclocal' use. Keep it a single number. -# serial 18 +# serial 19 dnl CARES_INCLUDES_ARPA_INET @@ -46,6 +46,30 @@ cares_includes_arpa_inet="\ ]) +dnl CARES_INCLUDES_FCNTL +dnl ------------------------------------------------- +dnl Set up variable with list of headers that must be +dnl included when fcntl.h is to be included. + +AC_DEFUN([CARES_INCLUDES_FCNTL], [ +cares_includes_fcntl="\ +/* includes start */ +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif +#ifdef HAVE_STROPTS_H +# include +#endif +/* includes end */" + AC_CHECK_HEADERS( + sys/types.h unistd.h fcntl.h, + [], [], [$cares_includes_fcntl]) +]) + + dnl CARES_INCLUDES_NETDB dnl ------------------------------------------------- dnl Set up variable with list of headers that must be @@ -112,6 +136,36 @@ cares_includes_string="\ ]) +dnl CARES_INCLUDES_STROPTS +dnl ------------------------------------------------- +dnl Set up variable with list of headers that must be +dnl included when stropts.h is to be included. + +AC_DEFUN([CARES_INCLUDES_STROPTS], [ +cares_includes_stropts="\ +/* includes start */ +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif +#ifdef HAVE_SYS_SOCKET_H +# include +#endif +#ifdef HAVE_SYS_IOCTL_H +# include +#endif +#ifdef HAVE_STROPTS_H +# include +#endif +/* includes end */" + AC_CHECK_HEADERS( + sys/types.h unistd.h sys/socket.h sys/ioctl.h stropts.h, + [], [], [$cares_includes_stropts]) +]) + + dnl CARES_INCLUDES_SYS_SOCKET dnl ------------------------------------------------- dnl Set up variable with list of headers that must be @@ -230,6 +284,155 @@ cares_includes_ws2tcpip="\ ]) +dnl CARES_CHECK_FUNC_FCNTL +dnl ------------------------------------------------- +dnl Verify if fcntl is available, prototyped, and +dnl can be compiled. If all of these are true, and +dnl usage has not been previously disallowed with +dnl shell variable cares_disallow_fcntl, then +dnl HAVE_FCNTL will be defined. + +AC_DEFUN([CARES_CHECK_FUNC_FCNTL], [ + AC_REQUIRE([CARES_INCLUDES_FCNTL])dnl + # + tst_links_fcntl="unknown" + tst_proto_fcntl="unknown" + tst_compi_fcntl="unknown" + tst_allow_fcntl="unknown" + # + AC_MSG_CHECKING([if fcntl can be linked]) + AC_LINK_IFELSE([ + AC_LANG_FUNC_LINK_TRY([fcntl]) + ],[ + AC_MSG_RESULT([yes]) + tst_links_fcntl="yes" + ],[ + AC_MSG_RESULT([no]) + tst_links_fcntl="no" + ]) + # + if test "$tst_links_fcntl" = "yes"; then + AC_MSG_CHECKING([if fcntl is prototyped]) + AC_EGREP_CPP([fcntl],[ + $cares_includes_fcntl + ],[ + AC_MSG_RESULT([yes]) + tst_proto_fcntl="yes" + ],[ + AC_MSG_RESULT([no]) + tst_proto_fcntl="no" + ]) + fi + # + if test "$tst_proto_fcntl" = "yes"; then + AC_MSG_CHECKING([if fcntl is compilable]) + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ + $cares_includes_fcntl + ]],[[ + if(0 != fcntl(0, 0, 0)) + return 1; + ]]) + ],[ + AC_MSG_RESULT([yes]) + tst_compi_fcntl="yes" + ],[ + AC_MSG_RESULT([no]) + tst_compi_fcntl="no" + ]) + fi + # + if test "$tst_compi_fcntl" = "yes"; then + AC_MSG_CHECKING([if fcntl usage allowed]) + if test "x$cares_disallow_fcntl" != "xyes"; then + AC_MSG_RESULT([yes]) + tst_allow_fcntl="yes" + else + AC_MSG_RESULT([no]) + tst_allow_fcntl="no" + fi + fi + # + AC_MSG_CHECKING([if fcntl might be used]) + if test "$tst_links_fcntl" = "yes" && + test "$tst_proto_fcntl" = "yes" && + test "$tst_compi_fcntl" = "yes" && + test "$tst_allow_fcntl" = "yes"; then + AC_MSG_RESULT([yes]) + AC_DEFINE_UNQUOTED(HAVE_FCNTL, 1, + [Define to 1 if you have the fcntl function.]) + ac_cv_func_fcntl="yes" + CARES_CHECK_FUNC_FCNTL_O_NONBLOCK + else + AC_MSG_RESULT([no]) + ac_cv_func_fcntl="no" + fi +]) + + +dnl CARES_CHECK_FUNC_FCNTL_O_NONBLOCK +dnl ------------------------------------------------- +dnl Verify if fcntl with status flag O_NONBLOCK is +dnl available, can be compiled, and seems to work. If +dnl all of these are true, then HAVE_FCNTL_O_NONBLOCK +dnl will be defined. + +AC_DEFUN([CARES_CHECK_FUNC_FCNTL_O_NONBLOCK], [ + # + tst_compi_fcntl_o_nonblock="unknown" + tst_allow_fcntl_o_nonblock="unknown" + # + case $host_os in + sunos4* | aix3* | beos*) + dnl O_NONBLOCK does not work on these platforms + cares_disallow_fcntl_o_nonblock="yes" + ;; + esac + # + if test "$ac_cv_func_fcntl" = "yes"; then + AC_MSG_CHECKING([if fcntl O_NONBLOCK is compilable]) + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ + $cares_includes_fcntl + ]],[[ + int flags = 0; + if(0 != fcntl(0, F_SETFL, flags | O_NONBLOCK)) + return 1; + ]]) + ],[ + AC_MSG_RESULT([yes]) + tst_compi_fcntl_o_nonblock="yes" + ],[ + AC_MSG_RESULT([no]) + tst_compi_fcntl_o_nonblock="no" + ]) + fi + # + if test "$tst_compi_fcntl_o_nonblock" = "yes"; then + AC_MSG_CHECKING([if fcntl O_NONBLOCK usage allowed]) + if test "x$cares_disallow_fcntl_o_nonblock" != "xyes"; then + AC_MSG_RESULT([yes]) + tst_allow_fcntl_o_nonblock="yes" + else + AC_MSG_RESULT([no]) + tst_allow_fcntl_o_nonblock="no" + fi + fi + # + AC_MSG_CHECKING([if fcntl O_NONBLOCK might be used]) + if test "$tst_compi_fcntl_o_nonblock" = "yes" && + test "$tst_allow_fcntl_o_nonblock" = "yes"; then + AC_MSG_RESULT([yes]) + AC_DEFINE_UNQUOTED(HAVE_FCNTL_O_NONBLOCK, 1, + [Define to 1 if you have a working fcntl O_NONBLOCK function.]) + ac_cv_func_fcntl_o_nonblock="yes" + else + AC_MSG_RESULT([no]) + ac_cv_func_fcntl_o_nonblock="no" + fi +]) + + dnl CARES_CHECK_FUNC_FREEADDRINFO dnl ------------------------------------------------- dnl Verify if freeaddrinfo is available, prototyped, @@ -1018,6 +1221,587 @@ AC_DEFUN([CARES_CHECK_FUNC_INET_PTON], [ ]) +dnl CARES_CHECK_FUNC_IOCTL +dnl ------------------------------------------------- +dnl Verify if ioctl is available, prototyped, and +dnl can be compiled. If all of these are true, and +dnl usage has not been previously disallowed with +dnl shell variable cares_disallow_ioctl, then +dnl HAVE_IOCTL will be defined. + +AC_DEFUN([CARES_CHECK_FUNC_IOCTL], [ + AC_REQUIRE([CARES_INCLUDES_STROPTS])dnl + # + tst_links_ioctl="unknown" + tst_proto_ioctl="unknown" + tst_compi_ioctl="unknown" + tst_allow_ioctl="unknown" + # + AC_MSG_CHECKING([if ioctl can be linked]) + AC_LINK_IFELSE([ + AC_LANG_FUNC_LINK_TRY([ioctl]) + ],[ + AC_MSG_RESULT([yes]) + tst_links_ioctl="yes" + ],[ + AC_MSG_RESULT([no]) + tst_links_ioctl="no" + ]) + # + if test "$tst_links_ioctl" = "yes"; then + AC_MSG_CHECKING([if ioctl is prototyped]) + AC_EGREP_CPP([ioctl],[ + $cares_includes_stropts + ],[ + AC_MSG_RESULT([yes]) + tst_proto_ioctl="yes" + ],[ + AC_MSG_RESULT([no]) + tst_proto_ioctl="no" + ]) + fi + # + if test "$tst_proto_ioctl" = "yes"; then + AC_MSG_CHECKING([if ioctl is compilable]) + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ + $cares_includes_stropts + ]],[[ + if(0 != ioctl(0, 0, 0)) + return 1; + ]]) + ],[ + AC_MSG_RESULT([yes]) + tst_compi_ioctl="yes" + ],[ + AC_MSG_RESULT([no]) + tst_compi_ioctl="no" + ]) + fi + # + if test "$tst_compi_ioctl" = "yes"; then + AC_MSG_CHECKING([if ioctl usage allowed]) + if test "x$cares_disallow_ioctl" != "xyes"; then + AC_MSG_RESULT([yes]) + tst_allow_ioctl="yes" + else + AC_MSG_RESULT([no]) + tst_allow_ioctl="no" + fi + fi + # + AC_MSG_CHECKING([if ioctl might be used]) + if test "$tst_links_ioctl" = "yes" && + test "$tst_proto_ioctl" = "yes" && + test "$tst_compi_ioctl" = "yes" && + test "$tst_allow_ioctl" = "yes"; then + AC_MSG_RESULT([yes]) + AC_DEFINE_UNQUOTED(HAVE_IOCTL, 1, + [Define to 1 if you have the ioctl function.]) + ac_cv_func_ioctl="yes" + CARES_CHECK_FUNC_IOCTL_FIONBIO + else + AC_MSG_RESULT([no]) + ac_cv_func_ioctl="no" + fi +]) + + +dnl CARES_CHECK_FUNC_IOCTL_FIONBIO +dnl ------------------------------------------------- +dnl Verify if ioctl with the FIONBIO command is +dnl available, can be compiled, and seems to work. If +dnl all of these are true, then HAVE_IOCTL_FIONBIO +dnl will be defined. + +AC_DEFUN([CARES_CHECK_FUNC_IOCTL_FIONBIO], [ + # + tst_compi_ioctl_fionbio="unknown" + tst_allow_ioctl_fionbio="unknown" + # + if test "$ac_cv_func_ioctl" = "yes"; then + AC_MSG_CHECKING([if ioctl FIONBIO is compilable]) + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ + $cares_includes_stropts + ]],[[ + int flags = 0; + if(0 != ioctl(0, FIONBIO, &flags)) + return 1; + ]]) + ],[ + AC_MSG_RESULT([yes]) + tst_compi_ioctl_fionbio="yes" + ],[ + AC_MSG_RESULT([no]) + tst_compi_ioctl_fionbio="no" + ]) + fi + # + if test "$tst_compi_ioctl_fionbio" = "yes"; then + AC_MSG_CHECKING([if ioctl FIONBIO usage allowed]) + if test "x$cares_disallow_ioctl_fionbio" != "xyes"; then + AC_MSG_RESULT([yes]) + tst_allow_ioctl_fionbio="yes" + else + AC_MSG_RESULT([no]) + tst_allow_ioctl_fionbio="no" + fi + fi + # + AC_MSG_CHECKING([if ioctl FIONBIO might be used]) + if test "$tst_compi_ioctl_fionbio" = "yes" && + test "$tst_allow_ioctl_fionbio" = "yes"; then + AC_MSG_RESULT([yes]) + AC_DEFINE_UNQUOTED(HAVE_IOCTL_FIONBIO, 1, + [Define to 1 if you have a working ioctl FIONBIO function.]) + ac_cv_func_ioctl_fionbio="yes" + else + AC_MSG_RESULT([no]) + ac_cv_func_ioctl_fionbio="no" + fi +]) + + +dnl CARES_CHECK_FUNC_IOCTLSOCKET +dnl ------------------------------------------------- +dnl Verify if ioctlsocket is available, prototyped, and +dnl can be compiled. If all of these are true, and +dnl usage has not been previously disallowed with +dnl shell variable cares_disallow_ioctlsocket, then +dnl HAVE_IOCTLSOCKET will be defined. + +AC_DEFUN([CARES_CHECK_FUNC_IOCTLSOCKET], [ + AC_REQUIRE([CARES_INCLUDES_WINSOCK2])dnl + # + tst_links_ioctlsocket="unknown" + tst_proto_ioctlsocket="unknown" + tst_compi_ioctlsocket="unknown" + tst_allow_ioctlsocket="unknown" + # + AC_MSG_CHECKING([if ioctlsocket can be linked]) + AC_LINK_IFELSE([ + AC_LANG_PROGRAM([[ + $cares_includes_winsock2 + ]],[[ + if(0 != ioctlsocket(0, 0, 0)) + return 1; + ]]) + ],[ + AC_MSG_RESULT([yes]) + tst_links_ioctlsocket="yes" + ],[ + AC_MSG_RESULT([no]) + tst_links_ioctlsocket="no" + ]) + # + if test "$tst_links_ioctlsocket" = "yes"; then + AC_MSG_CHECKING([if ioctlsocket is prototyped]) + AC_EGREP_CPP([ioctlsocket],[ + $cares_includes_winsock2 + ],[ + AC_MSG_RESULT([yes]) + tst_proto_ioctlsocket="yes" + ],[ + AC_MSG_RESULT([no]) + tst_proto_ioctlsocket="no" + ]) + fi + # + if test "$tst_proto_ioctlsocket" = "yes"; then + AC_MSG_CHECKING([if ioctlsocket is compilable]) + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ + $cares_includes_winsock2 + ]],[[ + if(0 != ioctlsocket(0, 0, 0)) + return 1; + ]]) + ],[ + AC_MSG_RESULT([yes]) + tst_compi_ioctlsocket="yes" + ],[ + AC_MSG_RESULT([no]) + tst_compi_ioctlsocket="no" + ]) + fi + # + if test "$tst_compi_ioctlsocket" = "yes"; then + AC_MSG_CHECKING([if ioctlsocket usage allowed]) + if test "x$cares_disallow_ioctlsocket" != "xyes"; then + AC_MSG_RESULT([yes]) + tst_allow_ioctlsocket="yes" + else + AC_MSG_RESULT([no]) + tst_allow_ioctlsocket="no" + fi + fi + # + AC_MSG_CHECKING([if ioctlsocket might be used]) + if test "$tst_links_ioctlsocket" = "yes" && + test "$tst_proto_ioctlsocket" = "yes" && + test "$tst_compi_ioctlsocket" = "yes" && + test "$tst_allow_ioctlsocket" = "yes"; then + AC_MSG_RESULT([yes]) + AC_DEFINE_UNQUOTED(HAVE_IOCTLSOCKET, 1, + [Define to 1 if you have the ioctlsocket function.]) + ac_cv_func_ioctlsocket="yes" + CARES_CHECK_FUNC_IOCTLSOCKET_FIONBIO + else + AC_MSG_RESULT([no]) + ac_cv_func_ioctlsocket="no" + fi +]) + + +dnl CARES_CHECK_FUNC_IOCTLSOCKET_FIONBIO +dnl ------------------------------------------------- +dnl Verify if ioctlsocket with the FIONBIO command is +dnl available, can be compiled, and seems to work. If +dnl all of these are true, then HAVE_IOCTLSOCKET_FIONBIO +dnl will be defined. + +AC_DEFUN([CARES_CHECK_FUNC_IOCTLSOCKET_FIONBIO], [ + # + tst_compi_ioctlsocket_fionbio="unknown" + tst_allow_ioctlsocket_fionbio="unknown" + # + if test "$ac_cv_func_ioctlsocket" = "yes"; then + AC_MSG_CHECKING([if ioctlsocket FIONBIO is compilable]) + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ + $cares_includes_winsock2 + ]],[[ + int flags = 0; + if(0 != ioctlsocket(0, FIONBIO, &flags)) + return 1; + ]]) + ],[ + AC_MSG_RESULT([yes]) + tst_compi_ioctlsocket_fionbio="yes" + ],[ + AC_MSG_RESULT([no]) + tst_compi_ioctlsocket_fionbio="no" + ]) + fi + # + if test "$tst_compi_ioctlsocket_fionbio" = "yes"; then + AC_MSG_CHECKING([if ioctlsocket FIONBIO usage allowed]) + if test "x$cares_disallow_ioctlsocket_fionbio" != "xyes"; then + AC_MSG_RESULT([yes]) + tst_allow_ioctlsocket_fionbio="yes" + else + AC_MSG_RESULT([no]) + tst_allow_ioctlsocket_fionbio="no" + fi + fi + # + AC_MSG_CHECKING([if ioctlsocket FIONBIO might be used]) + if test "$tst_compi_ioctlsocket_fionbio" = "yes" && + test "$tst_allow_ioctlsocket_fionbio" = "yes"; then + AC_MSG_RESULT([yes]) + AC_DEFINE_UNQUOTED(HAVE_IOCTLSOCKET_FIONBIO, 1, + [Define to 1 if you have a working ioctlsocket FIONBIO function.]) + ac_cv_func_ioctlsocket_fionbio="yes" + else + AC_MSG_RESULT([no]) + ac_cv_func_ioctlsocket_fionbio="no" + fi +]) + + +dnl CARES_CHECK_FUNC_IOCTLSOCKET_CAMEL +dnl ------------------------------------------------- +dnl Verify if IoctlSocket is available, prototyped, and +dnl can be compiled. If all of these are true, and +dnl usage has not been previously disallowed with +dnl shell variable cares_disallow_ioctlsocket_camel, +dnl then HAVE_IOCTLSOCKET_CAMEL will be defined. + +AC_DEFUN([CARES_CHECK_FUNC_IOCTLSOCKET_CAMEL], [ + AC_REQUIRE([CARES_INCLUDES_STROPTS])dnl + # + tst_links_ioctlsocket_camel="unknown" + tst_proto_ioctlsocket_camel="unknown" + tst_compi_ioctlsocket_camel="unknown" + tst_allow_ioctlsocket_camel="unknown" + # + AC_MSG_CHECKING([if IoctlSocket can be linked]) + AC_LINK_IFELSE([ + AC_LANG_FUNC_LINK_TRY([IoctlSocket]) + ],[ + AC_MSG_RESULT([yes]) + tst_links_ioctlsocket_camel="yes" + ],[ + AC_MSG_RESULT([no]) + tst_links_ioctlsocket_camel="no" + ]) + # + if test "$tst_links_ioctlsocket_camel" = "yes"; then + AC_MSG_CHECKING([if IoctlSocket is prototyped]) + AC_EGREP_CPP([IoctlSocket],[ + $cares_includes_stropts + ],[ + AC_MSG_RESULT([yes]) + tst_proto_ioctlsocket_camel="yes" + ],[ + AC_MSG_RESULT([no]) + tst_proto_ioctlsocket_camel="no" + ]) + fi + # + if test "$tst_proto_ioctlsocket_camel" = "yes"; then + AC_MSG_CHECKING([if IoctlSocket is compilable]) + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ + $cares_includes_stropts + ]],[[ + if(0 != IoctlSocket(0, 0, 0)) + return 1; + ]]) + ],[ + AC_MSG_RESULT([yes]) + tst_compi_ioctlsocket_camel="yes" + ],[ + AC_MSG_RESULT([no]) + tst_compi_ioctlsocket_camel="no" + ]) + fi + # + if test "$tst_compi_ioctlsocket_camel" = "yes"; then + AC_MSG_CHECKING([if IoctlSocket usage allowed]) + if test "x$cares_disallow_ioctlsocket_camel" != "xyes"; then + AC_MSG_RESULT([yes]) + tst_allow_ioctlsocket_camel="yes" + else + AC_MSG_RESULT([no]) + tst_allow_ioctlsocket_camel="no" + fi + fi + # + AC_MSG_CHECKING([if IoctlSocket might be used]) + if test "$tst_links_ioctlsocket_camel" = "yes" && + test "$tst_proto_ioctlsocket_camel" = "yes" && + test "$tst_compi_ioctlsocket_camel" = "yes" && + test "$tst_allow_ioctlsocket_camel" = "yes"; then + AC_MSG_RESULT([yes]) + AC_DEFINE_UNQUOTED(HAVE_IOCTLSOCKET_CAMEL, 1, + [Define to 1 if you have the IoctlSocket camel case function.]) + ac_cv_func_ioctlsocket_camel="yes" + CARES_CHECK_FUNC_IOCTLSOCKET_CAMEL_FIONBIO + else + AC_MSG_RESULT([no]) + ac_cv_func_ioctlsocket_camel="no" + fi +]) + + +dnl CARES_CHECK_FUNC_IOCTLSOCKET_CAMEL_FIONBIO +dnl ------------------------------------------------- +dnl Verify if IoctlSocket with FIONBIO command is available, +dnl can be compiled, and seems to work. If all of these are +dnl true, then HAVE_IOCTLSOCKET_CAMEL_FIONBIO will be defined. + +AC_DEFUN([CARES_CHECK_FUNC_IOCTLSOCKET_CAMEL_FIONBIO], [ + # + tst_compi_ioctlsocket_camel_fionbio="unknown" + tst_allow_ioctlsocket_camel_fionbio="unknown" + # + if test "$ac_cv_func_ioctlsocket_camel" = "yes"; then + AC_MSG_CHECKING([if IoctlSocket FIONBIO is compilable]) + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ + $cares_includes_stropts + ]],[[ + long flags = 0; + if(0 != ioctlsocket(0, FIONBIO, &flags)) + return 1; + ]]) + ],[ + AC_MSG_RESULT([yes]) + tst_compi_ioctlsocket_camel_fionbio="yes" + ],[ + AC_MSG_RESULT([no]) + tst_compi_ioctlsocket_camel_fionbio="no" + ]) + fi + # + if test "$tst_compi_ioctlsocket_camel_fionbio" = "yes"; then + AC_MSG_CHECKING([if IoctlSocket FIONBIO usage allowed]) + if test "x$cares_disallow_ioctlsocket_camel_fionbio" != "xyes"; then + AC_MSG_RESULT([yes]) + tst_allow_ioctlsocket_camel_fionbio="yes" + else + AC_MSG_RESULT([no]) + tst_allow_ioctlsocket_camel_fionbio="no" + fi + fi + # + AC_MSG_CHECKING([if IoctlSocket FIONBIO might be used]) + if test "$tst_compi_ioctlsocket_camel_fionbio" = "yes" && + test "$tst_allow_ioctlsocket_camel_fionbio" = "yes"; then + AC_MSG_RESULT([yes]) + AC_DEFINE_UNQUOTED(HAVE_IOCTLSOCKET_CAMEL_FIONBIO, 1, + [Define to 1 if you have a working IoctlSocket camel case FIONBIO function.]) + ac_cv_func_ioctlsocket_camel_fionbio="yes" + else + AC_MSG_RESULT([no]) + ac_cv_func_ioctlsocket_camel_fionbio="no" + fi +]) + + +dnl CARES_CHECK_FUNC_SETSOCKOPT +dnl ------------------------------------------------- +dnl Verify if setsockopt is available, prototyped, and +dnl can be compiled. If all of these are true, and +dnl usage has not been previously disallowed with +dnl shell variable cares_disallow_setsockopt, then +dnl HAVE_SETSOCKOPT will be defined. + +AC_DEFUN([CARES_CHECK_FUNC_SETSOCKOPT], [ + AC_REQUIRE([CARES_INCLUDES_WINSOCK2])dnl + AC_REQUIRE([CARES_INCLUDES_SYS_SOCKET])dnl + # + tst_links_setsockopt="unknown" + tst_proto_setsockopt="unknown" + tst_compi_setsockopt="unknown" + tst_allow_setsockopt="unknown" + # + AC_MSG_CHECKING([if setsockopt can be linked]) + AC_LINK_IFELSE([ + AC_LANG_PROGRAM([[ + $cares_includes_winsock2 + $cares_includes_sys_socket + ]],[[ + if(0 != setsockopt(0, 0, 0, 0, 0)) + return 1; + ]]) + ],[ + AC_MSG_RESULT([yes]) + tst_links_setsockopt="yes" + ],[ + AC_MSG_RESULT([no]) + tst_links_setsockopt="no" + ]) + # + if test "$tst_links_setsockopt" = "yes"; then + AC_MSG_CHECKING([if setsockopt is prototyped]) + AC_EGREP_CPP([setsockopt],[ + $cares_includes_winsock2 + $cares_includes_sys_socket + ],[ + AC_MSG_RESULT([yes]) + tst_proto_setsockopt="yes" + ],[ + AC_MSG_RESULT([no]) + tst_proto_setsockopt="no" + ]) + fi + # + if test "$tst_proto_setsockopt" = "yes"; then + AC_MSG_CHECKING([if setsockopt is compilable]) + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ + $cares_includes_winsock2 + $cares_includes_sys_socket + ]],[[ + if(0 != setsockopt(0, 0, 0, 0, 0)) + return 1; + ]]) + ],[ + AC_MSG_RESULT([yes]) + tst_compi_setsockopt="yes" + ],[ + AC_MSG_RESULT([no]) + tst_compi_setsockopt="no" + ]) + fi + # + if test "$tst_compi_setsockopt" = "yes"; then + AC_MSG_CHECKING([if setsockopt usage allowed]) + if test "x$cares_disallow_setsockopt" != "xyes"; then + AC_MSG_RESULT([yes]) + tst_allow_setsockopt="yes" + else + AC_MSG_RESULT([no]) + tst_allow_setsockopt="no" + fi + fi + # + AC_MSG_CHECKING([if setsockopt might be used]) + if test "$tst_links_setsockopt" = "yes" && + test "$tst_proto_setsockopt" = "yes" && + test "$tst_compi_setsockopt" = "yes" && + test "$tst_allow_setsockopt" = "yes"; then + AC_MSG_RESULT([yes]) + AC_DEFINE_UNQUOTED(HAVE_SETSOCKOPT, 1, + [Define to 1 if you have the setsockopt function.]) + ac_cv_func_setsockopt="yes" + CARES_CHECK_FUNC_SETSOCKOPT_SO_NONBLOCK + else + AC_MSG_RESULT([no]) + ac_cv_func_setsockopt="no" + fi +]) + + +dnl CARES_CHECK_FUNC_SETSOCKOPT_SO_NONBLOCK +dnl ------------------------------------------------- +dnl Verify if setsockopt with the SO_NONBLOCK command is +dnl available, can be compiled, and seems to work. If +dnl all of these are true, then HAVE_SETSOCKOPT_SO_NONBLOCK +dnl will be defined. + +AC_DEFUN([CARES_CHECK_FUNC_SETSOCKOPT_SO_NONBLOCK], [ + # + tst_compi_setsockopt_so_nonblock="unknown" + tst_allow_setsockopt_so_nonblock="unknown" + # + if test "$ac_cv_func_setsockopt" = "yes"; then + AC_MSG_CHECKING([if setsockopt SO_NONBLOCK is compilable]) + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ + $cares_includes_winsock2 + $cares_includes_sys_socket + ]],[[ + if(0 != setsockopt(0, SOL_SOCKET, SO_NONBLOCK, 0, 0)) + return 1; + ]]) + ],[ + AC_MSG_RESULT([yes]) + tst_compi_setsockopt_so_nonblock="yes" + ],[ + AC_MSG_RESULT([no]) + tst_compi_setsockopt_so_nonblock="no" + ]) + fi + # + if test "$tst_compi_setsockopt_so_nonblock" = "yes"; then + AC_MSG_CHECKING([if setsockopt SO_NONBLOCK usage allowed]) + if test "x$cares_disallow_setsockopt_so_nonblock" != "xyes"; then + AC_MSG_RESULT([yes]) + tst_allow_setsockopt_so_nonblock="yes" + else + AC_MSG_RESULT([no]) + tst_allow_setsockopt_so_nonblock="no" + fi + fi + # + AC_MSG_CHECKING([if setsockopt SO_NONBLOCK might be used]) + if test "$tst_compi_setsockopt_so_nonblock" = "yes" && + test "$tst_allow_setsockopt_so_nonblock" = "yes"; then + AC_MSG_RESULT([yes]) + AC_DEFINE_UNQUOTED(HAVE_SETSOCKOPT_SO_NONBLOCK, 1, + [Define to 1 if you have a working setsockopt SO_NONBLOCK function.]) + ac_cv_func_setsockopt_so_nonblock="yes" + else + AC_MSG_RESULT([no]) + ac_cv_func_setsockopt_so_nonblock="no" + fi +]) + + dnl CARES_CHECK_FUNC_STRCASECMP dnl ------------------------------------------------- dnl Verify if strcasecmp is available, prototyped, and -- cgit v1.2.3