diff --git a/ares/CHANGES b/ares/CHANGES index 22a92ef27..4bfc1cf2d 100644 --- a/ares/CHANGES +++ b/ares/CHANGES @@ -1,5 +1,12 @@ Changelog for the c-ares project +* September 18 + +- Added constants that will be used by ares_getaddrinfo + +- Made ares_getnameinfo use the reentrant getservbyport (getservbyport_r) if it is + available to ensure it works properly in a threaded environment. + * September 10 - configure fix for detecting a member in the sockaddr_in6 struct which failed diff --git a/ares/acinclude.m4 b/ares/acinclude.m4 index f4f317eae..214c005e7 100644 --- a/ares/acinclude.m4 +++ b/ares/acinclude.m4 @@ -1,271 +1,318 @@ -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... -dnl -AC_DEFUN([CURL_CHECK_NONBLOCKING_SOCKET], -[ - AC_MSG_CHECKING([non-blocking sockets style]) - - AC_TRY_COMPILE([ -/* headers for O_NONBLOCK test */ -#include -#include -#include -],[ -/* try to compile O_NONBLOCK */ - -#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(_AIX4) -# 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 - 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]) -],[ -dnl the code was bad, try a different program now, test 2 - - AC_TRY_COMPILE([ -/* 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]) -],[ -dnl FIONBIO test was also bad -dnl the code was bad, try a different program now, test 3 - - AC_TRY_COMPILE([ -/* headers for ioctlsocket test (cygwin?) */ -#include -],[ -/* ioctlsocket source code */ - int socket; - unsigned long flags = ioctlsocket(socket, FIONBIO, &flags); -],[ -dnl ioctlsocket test was good -nonblock="ioctlsocket" -AC_DEFINE(HAVE_IOCTLSOCKET, 1, [use ioctlsocket() for non-blocking sockets]) -],[ -dnl ioctlsocket didnt compile!, go to test 4 - - AC_TRY_LINK([ -/* headers for IoctlSocket test (Amiga?) */ -#include -],[ -/* IoctlSocket source code */ - 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]) -],[ -dnl Ioctlsocket didnt compile, do test 5! - AC_TRY_COMPILE([ -/* headers for SO_NONBLOCK test (BeOS) */ -#include -],[ -/* SO_NONBLOCK source code */ - 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]) -],[ -dnl test 5 didnt compile! -nonblock="nada" -AC_DEFINE(HAVE_DISABLED_NONBLOCKING, 1, [disabled non-blocking sockets]) -]) -dnl end of fifth test - -]) -dnl end of forth test - -]) -dnl end of third test - -]) -dnl end of second test - -]) -dnl end of non-blocking try-compile test - AC_MSG_RESULT($nonblock) - - if test "$nonblock" = "nada"; then - AC_MSG_WARN([non-block sockets disabled]) - fi -]) - -dnl We create a function for detecting which compiler we use and then set as -dnl pendantic compiler options as possible for that particular compiler. The -dnl options are only used for debug-builds. - -dnl This is a copy of the original found in curl's configure script. Don't -dnl modify this one, edit the one in curl and copy it back here when that one -dnl is changed. - -AC_DEFUN([CURL_CC_DEBUG_OPTS], -[ - if test "$GCC" = "yes"; then - - dnl figure out gcc version! - AC_MSG_CHECKING([gcc version]) - gccver=`$CC -dumpversion` - num1=`echo $gccver | cut -d . -f1` - num2=`echo $gccver | cut -d . -f2` - gccnum=`(expr $num1 "*" 100 + $num2) 2>/dev/null` - AC_MSG_RESULT($gccver) - - AC_MSG_CHECKING([if this is icc in disguise]) - AC_EGREP_CPP([^__INTEL_COMPILER], [__INTEL_COMPILER], - dnl action if the text is found, this it has not been replaced by the - dnl cpp - ICC="no" - AC_MSG_RESULT([no]), - dnl the text was not found, it was replaced by the cpp - ICC="yes" - AC_MSG_RESULT([yes]) - ) - - if test "$ICC" = "yes"; then - dnl this is icc, not gcc. - - dnl ICC warnings we ignore: - dnl * 279 warns on static conditions in while expressions - dnl * 269 warns on our "%Od" printf formatters for curl_off_t output: - dnl "invalid format string conversion" - - WARN="-wd279,269" - - if test "$gccnum" -gt "600"; then - dnl icc 6.0 and older doesn't have the -Wall flag - WARN="-Wall $WARN" - fi - else dnl $ICC = yes - dnl - WARN="-W -Wall -Wwrite-strings -pedantic -Wno-long-long -Wundef -Wpointer-arith -Wnested-externs -Winline -Wmissing-declarations -Wmissing-prototypes -Wsign-compare" - - dnl -Wcast-align is a bit too annoying ;-) - - if test "$gccnum" -ge "296"; then - dnl gcc 2.96 or later - WARN="$WARN -Wfloat-equal" - - if test "$gccnum" -gt "296"; then - dnl this option does not exist in 2.96 - WARN="$WARN -Wno-format-nonliteral" - fi - - dnl -Wunreachable-code seems totally unreliable on my gcc 3.3.2 on - dnl on i686-Linux as it gives us heaps with false positives - if test "$gccnum" -ge "303"; then - dnl gcc 3.3 and later - WARN="$WARN -Wendif-labels -Wstrict-prototypes" - fi - fi - - for flag in $CPPFLAGS; do - case "$flag" in - -I*) - dnl include path - add=`echo $flag | sed 's/^-I/-isystem /g'` - WARN="$WARN $add" - ;; - esac - done - - fi dnl $ICC = no - - CFLAGS="$CFLAGS $WARN" - - fi dnl $GCC = yes - - dnl strip off optimizer flags - NEWFLAGS="" - for flag in $CFLAGS; do - case "$flag" in - -O*) - dnl echo "cut off $flag" - ;; - *) - NEWFLAGS="$NEWFLAGS $flag" - ;; - esac - done - CFLAGS=$NEWFLAGS - -]) dnl end of AC_DEFUN() - - -dnl This macro determines if the specified struct exists in the specified file -dnl Syntax: -dnl CARES_CHECK_STRUCT(headers, struct name, if found, [if not found]) - -AC_DEFUN([CARES_CHECK_STRUCT], [ - AC_MSG_CHECKING([for struct $2]) - AC_TRY_COMPILE([$1], - [ - struct $2 struct_instance; - ], ac_struct="yes", ac_found="no") - if test "$ac_struct" = "yes" ; then - AC_MSG_RESULT(yes) - $3 - else - AC_MSG_RESULT(no) - $4 - fi -]) - -dnl This macro determines if the specified constant exists in the specified file -dnl Syntax: -dnl CARES_CHECK_CONSTANT(headers, constant name, if found, [if not found]) - -AC_DEFUN([CARES_CHECK_CONSTANT], [ - AC_MSG_CHECKING([for $2]) - AC_EGREP_CPP(VARIABLEWASDEFINED, - [ - $1 - - #ifdef $2 - VARIABLEWASDEFINED - #else - NJET - #endif - ], ac_constant="yes", ac_constant="no" - ) - if test "$ac_constant" = "yes" ; then - AC_MSG_RESULT(yes) - $3 - else - AC_MSG_RESULT(no) - $4 - fi -]) - - +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... +dnl +AC_DEFUN([CURL_CHECK_NONBLOCKING_SOCKET], +[ + AC_MSG_CHECKING([non-blocking sockets style]) + + AC_TRY_COMPILE([ +/* headers for O_NONBLOCK test */ +#include +#include +#include +],[ +/* try to compile O_NONBLOCK */ + +#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(_AIX4) +# 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 + 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]) +],[ +dnl the code was bad, try a different program now, test 2 + + AC_TRY_COMPILE([ +/* 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]) +],[ +dnl FIONBIO test was also bad +dnl the code was bad, try a different program now, test 3 + + AC_TRY_COMPILE([ +/* headers for ioctlsocket test (cygwin?) */ +#include +],[ +/* ioctlsocket source code */ + int socket; + unsigned long flags = ioctlsocket(socket, FIONBIO, &flags); +],[ +dnl ioctlsocket test was good +nonblock="ioctlsocket" +AC_DEFINE(HAVE_IOCTLSOCKET, 1, [use ioctlsocket() for non-blocking sockets]) +],[ +dnl ioctlsocket didnt compile!, go to test 4 + + AC_TRY_LINK([ +/* headers for IoctlSocket test (Amiga?) */ +#include +],[ +/* IoctlSocket source code */ + 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]) +],[ +dnl Ioctlsocket didnt compile, do test 5! + AC_TRY_COMPILE([ +/* headers for SO_NONBLOCK test (BeOS) */ +#include +],[ +/* SO_NONBLOCK source code */ + 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]) +],[ +dnl test 5 didnt compile! +nonblock="nada" +AC_DEFINE(HAVE_DISABLED_NONBLOCKING, 1, [disabled non-blocking sockets]) +]) +dnl end of fifth test + +]) +dnl end of forth test + +]) +dnl end of third test + +]) +dnl end of second test + +]) +dnl end of non-blocking try-compile test + AC_MSG_RESULT($nonblock) + + if test "$nonblock" = "nada"; then + AC_MSG_WARN([non-block sockets disabled]) + fi +]) + +dnl We create a function for detecting which compiler we use and then set as +dnl pendantic compiler options as possible for that particular compiler. The +dnl options are only used for debug-builds. + +dnl This is a copy of the original found in curl's configure script. Don't +dnl modify this one, edit the one in curl and copy it back here when that one +dnl is changed. + +AC_DEFUN([CURL_CC_DEBUG_OPTS], +[ + if test "$GCC" = "yes"; then + + dnl figure out gcc version! + AC_MSG_CHECKING([gcc version]) + gccver=`$CC -dumpversion` + num1=`echo $gccver | cut -d . -f1` + num2=`echo $gccver | cut -d . -f2` + gccnum=`(expr $num1 "*" 100 + $num2) 2>/dev/null` + AC_MSG_RESULT($gccver) + + AC_MSG_CHECKING([if this is icc in disguise]) + AC_EGREP_CPP([^__INTEL_COMPILER], [__INTEL_COMPILER], + dnl action if the text is found, this it has not been replaced by the + dnl cpp + ICC="no" + AC_MSG_RESULT([no]), + dnl the text was not found, it was replaced by the cpp + ICC="yes" + AC_MSG_RESULT([yes]) + ) + + if test "$ICC" = "yes"; then + dnl this is icc, not gcc. + + dnl ICC warnings we ignore: + dnl * 279 warns on static conditions in while expressions + dnl * 269 warns on our "%Od" printf formatters for curl_off_t output: + dnl "invalid format string conversion" + + WARN="-wd279,269" + + if test "$gccnum" -gt "600"; then + dnl icc 6.0 and older doesn't have the -Wall flag + WARN="-Wall $WARN" + fi + else dnl $ICC = yes + dnl + WARN="-W -Wall -Wwrite-strings -pedantic -Wno-long-long -Wundef -Wpointer-arith -Wnested-externs -Winline -Wmissing-declarations -Wmissing-prototypes -Wsign-compare" + + dnl -Wcast-align is a bit too annoying ;-) + + if test "$gccnum" -ge "296"; then + dnl gcc 2.96 or later + WARN="$WARN -Wfloat-equal" + + if test "$gccnum" -gt "296"; then + dnl this option does not exist in 2.96 + WARN="$WARN -Wno-format-nonliteral" + fi + + dnl -Wunreachable-code seems totally unreliable on my gcc 3.3.2 on + dnl on i686-Linux as it gives us heaps with false positives + if test "$gccnum" -ge "303"; then + dnl gcc 3.3 and later + WARN="$WARN -Wendif-labels -Wstrict-prototypes" + fi + fi + + for flag in $CPPFLAGS; do + case "$flag" in + -I*) + dnl include path + add=`echo $flag | sed 's/^-I/-isystem /g'` + WARN="$WARN $add" + ;; + esac + done + + fi dnl $ICC = no + + CFLAGS="$CFLAGS $WARN" + + fi dnl $GCC = yes + + dnl strip off optimizer flags + NEWFLAGS="" + for flag in $CFLAGS; do + case "$flag" in + -O*) + dnl echo "cut off $flag" + ;; + *) + NEWFLAGS="$NEWFLAGS $flag" + ;; + esac + done + CFLAGS=$NEWFLAGS + +]) dnl end of AC_DEFUN() + + +dnl This macro determines if the specified struct exists in the specified file +dnl Syntax: +dnl CARES_CHECK_STRUCT(headers, struct name, if found, [if not found]) + +AC_DEFUN([CARES_CHECK_STRUCT], [ + AC_MSG_CHECKING([for struct $2]) + AC_TRY_COMPILE([$1], + [ + struct $2 struct_instance; + ], ac_struct="yes", ac_found="no") + if test "$ac_struct" = "yes" ; then + AC_MSG_RESULT(yes) + $3 + else + AC_MSG_RESULT(no) + $4 + fi +]) + +dnl This macro determines if the specified constant exists in the specified file +dnl Syntax: +dnl CARES_CHECK_CONSTANT(headers, constant name, if found, [if not found]) + +AC_DEFUN([CARES_CHECK_CONSTANT], [ + AC_MSG_CHECKING([for $2]) + AC_EGREP_CPP(VARIABLEWASDEFINED, + [ + $1 + + #ifdef $2 + VARIABLEWASDEFINED + #else + NJET + #endif + ], ac_constant="yes", ac_constant="no" + ) + if test "$ac_constant" = "yes" ; then + AC_MSG_RESULT(yes) + $3 + else + AC_MSG_RESULT(no) + $4 + fi +]) + + +dnl This macro determines how many parameters getservbyport_r takes +AC_DEFUN([CARES_CHECK_GETSERVBYPORT_R], [ + AC_MSG_CHECKING([how many arguments getservbyport_r takes]) + AC_TRY_COMPILE( + [#include ], + [ + int p1, p5; + char *p2, p4[4096]; + struct servent *p3, *p6; + getservbyport_r(p1, p2, p3, p4, p5, &p6); + ], ac_func_getservbyport_r=6, + [AC_TRY_COMPILE( + [#include ], + [ + int p1, p5; + char *p2, p4[4096]; + struct servent *p3; + getservbyport_r(p1, p2, p3, p4, p5); + ], ac_func_getservbyport_r=5, + [AC_TRY_COMPILE( + [#include ], + [ + int p1; + char *p2; + struct servent *p3; + struct servent_data p4; + getservbyport_r(p1, p2, p3, &p4); + ], ac_func_getservbyport_r=4, ac_func_getservbyport_r=0 + )] + )] + ) +if test $ac_func_getservbyport_r != "0" ; then + AC_MSG_RESULT($ac_func_getservbyport_r) + AC_DEFINE(HAVE_GETSERVBYPORT_R, 1, [Specifies whether getservbyport_r is present]) + AC_DEFINE_UNQUOTED(GETSERVBYPORT_R_ARGS, $ac_func_getservbyport_r, [Specifies the number of arguments to +getservbyport_r]) + if test $ac_func_getservbyport_r = "4" ; then + AC_DEFINE(GETSERVBYPORT_R_BUFSIZE, sizeof(struct servent_data), [Specifies the size of the buffer to pass to +getservbyport_r]) + else + AC_DEFINE(GETSERVBYPORT_R_BUFSIZE, 4096, [Specifies the size of the buffer to pass to getservbyport_r]) + fi +else + AC_MSG_RESULT([not found]) +fi +]) + diff --git a/ares/ares.h b/ares/ares.h index 4fca9865b..fd0147480 100644 --- a/ares/ares.h +++ b/ares/ares.h @@ -69,6 +69,10 @@ extern "C" { /* ares_getnameinfo error codes */ #define ARES_EBADFLAGS 18 +/* ares_getaddrinfo error codes */ +#define ARES_ENONAME 19 +#define ARES_EBADHINTS 20 + /* Flag values */ #define ARES_FLAG_USEVC (1 << 0) #define ARES_FLAG_PRIMARY (1 << 1) @@ -104,9 +108,27 @@ extern "C" { #define ARES_NI_LOOKUPHOST (1 << 8) #define ARES_NI_LOOKUPSERVICE (1 << 9) /* Reserved for future use */ -#define ARES_NI_IDN (1 << 10) -#define ARES_NI_ALLOW_UNASSIGNED (1 << 11) -#define ARES_NI_USE_STD3_ASCII_RULES (1 << 12) +#define ARES_NI_IDN (1 << 10) +#define ARES_NI_IDN_ALLOW_UNASSIGNED (1 << 11) +#define ARES_NI_IDN_USE_STD3_ASCII_RULES (1 << 12) + +/* Addrinfo flag values */ +#define ARES_AI_CANONNAME (1 << 0) +#define ARES_AI_NUMERICHOST (1 << 1) +#define ARES_AI_PASSIVE (1 << 2) +#define ARES_AI_NUMERICSERV (1 << 3) +#define ARES_AI_V4MAPPED (1 << 4) +#define ARES_AI_ALL (1 << 5) +#define ARES_AI_ADDRCONFIG (1 << 6) +/* Reserved for future use */ +#define ARES_AI_IDN (1 << 10) +#define ARES_AI_IDN_ALLOW_UNASSIGNED (1 << 11) +#define ARES_AI_IDN_USE_STD3_ASCII_RULES (1 << 12) +#define ARES_AI_CANONIDN (1 << 13) + +#define ARES_AI_MASK (ARES_AI_CANONNAME|ARES_AI_NUMERICHOST|ARES_AI_PASSIVE| \ + ARES_AI_NUMERICSERV|ARES_AI_V4MAPPED|ARES_AI_ALL| \ + ARES_AI_ADDRCONFIG) struct ares_options { int flags; diff --git a/ares/ares_getnameinfo.c b/ares/ares_getnameinfo.c index 23a5c79d4..e137fd3c5 100644 --- a/ares/ares_getnameinfo.c +++ b/ares/ares_getnameinfo.c @@ -256,7 +256,16 @@ static char *lookup_service(unsigned short port, int flags, char *buf) { struct servent *se; const char *proto; - +#if GETSERVBYPORT_R_ARGS == 6 + struct servent ret; + char buf[4096]; + int len = 4096; +#elif GETSERVBYPORT_R_ARGS == 5 + char buf[4096]; + int len = 4096; +#elif GETSERVBYPORT_R_ARGS == 4 + struct servent_data sed; +#endif if (flags & ARES_NI_UDP) proto = "udp"; else if (flags & ARES_NI_SCTP) @@ -265,7 +274,23 @@ static char *lookup_service(unsigned short port, int flags, char *buf) proto = "dccp"; else proto = "tcp"; +#ifdef HAVE_GETSERVBYPORT_R + #if GETSERVBYPORT_R_ARGS == 6 + if (getservbyport_r(port, proto, se, buf, len, &ret)) + se = NULL; + #elif GETSERVBYPORT_R_ARGS == 5 + se = getservbyport_r(port, proto, se, buf, len); + #elif GETSERVBYPORT_R_ARGS == 4 + if (getservbyport_r(port, proto, se, &sed) == -1) + se = NULL; + #else + /* Lets just hope the OS uses TLS! */ + se = getservbyport(port, proto); + #endif +#else + /* Lets just hope the OS uses TLS! */ se = getservbyport(port, proto); +#endif if (se && se->s_name) strcpy(buf, se->s_name); else diff --git a/ares/configure.ac b/ares/configure.ac index 271dfeb4f..a04205cda 100644 --- a/ares/configure.ac +++ b/ares/configure.ac @@ -1,352 +1,355 @@ -dnl Process this file with autoconf to produce a configure script. -AC_INIT(ares_init.c) -AM_CONFIG_HEADER(config.h) -AM_MAINTAINER_MODE -AM_INIT_AUTOMAKE(c-ares, CVS) - -AC_PROG_CC -AC_PROG_INSTALL - -case $host_os in -solaris*) - AC_DEFINE(ETC_INET, 1, [if a /etc/inet dir is being used]) - ;; -esac - -# check for ssize_t -AC_CHECK_TYPE(ssize_t, , - AC_DEFINE(ssize_t, int, [the signed version of size_t])) - -AC_SEARCH_LIBS(gethostbyname, nsl) -AC_SEARCH_LIBS(socket, socket) - -dnl ************************************************************ -dnl Option to switch on debug options. This makes an assumption that -dnl this is built as an 'ares' subdir in the curl source tree. Subject for -dnl improval in the future! -dnl -AC_MSG_CHECKING([whether to enable debug options]) -AC_ARG_ENABLE(debug, -AC_HELP_STRING([--enable-debug],[Enable pedantic debug options]) -AC_HELP_STRING([--disable-debug],[Disable debug options]), -[ case "$enableval" in - no) - AC_MSG_RESULT(no) - ;; - *) AC_MSG_RESULT(yes) - - dnl when doing the debug stuff, use static library only - AC_DISABLE_SHARED - - dnl Checks for standard header files, to make memdebug.h inclusions bettter - AC_HEADER_STDC - - dnl the entire --enable-debug is a hack that lives and runs on top of - dnl libcurl stuff so this BUILDING_LIBCURL is not THAT much uglier - AC_DEFINE(BUILDING_LIBCURL, 1, [when building as static part of libcurl]) - - CPPFLAGS="$CPPFLAGS -DCURLDEBUG -I$srcdir/../include" - CFLAGS="$CFLAGS -g" - - dnl set compiler "debug" options to become more picky, and remove - dnl optimize options from CFLAGS - CURL_CC_DEBUG_OPTS - - ;; - esac ], - AC_MSG_RESULT(no) -) - -AC_PROG_LIBTOOL - -dnl check for a few basic system headers we need -AC_CHECK_HEADERS( - sys/types.h \ - sys/time.h \ - sys/select.h \ - sys/socket.h \ - sys/ioctl.h \ - winsock.h \ - netinet/in.h \ - net/if.h \ - arpa/nameser.h \ - arpa/nameser_compat.h \ - arpa/inet.h, , , -[ -#ifdef HAVE_SYS_TYPES_H -#include -#endif -dnl We do this default-include simply to make sure that the nameser_compat.h -dnl header *REALLY* can be include after the new nameser.h. It seems AIX 5.1 -dnl (and others?) is not designed to allow this. -#ifdef HAVE_ARPA_NAMESER_H -#include -#endif - -dnl *Sigh* these are needed in order for net/if.h to get properly detected. -#ifdef HAVE_SYS_SOCKET_H -#include -#endif -#ifdef HAVE_WINSOCK_H -#include -#endif -] - ) - -AC_CHECK_TYPE(socklen_t, , - AC_DEFINE(socklen_t, int, [the length of a socket address]), - [ -#ifdef HAVE_SYS_TYPES_H -#include -#endif -#ifdef HAVE_SYS_SOCKET_H -#include -#endif -#ifdef HAVE_WINSOCK_H -#include -#endif - ]) - -dnl check for AF_INET6 -CARES_CHECK_CONSTANT( - [ -#ifdef HAVE_SYS_TYPES_H -#include -#endif -#ifdef HAVE_SYS_SOCKET_H -#include -#endif -#ifdef HAVE_WINSOCK_H -#include -#endif - - ], [PF_INET6], - AC_DEFINE_UNQUOTED(HAVE_PF_INET6,1,[Define to 1 if you have PF_INET6.]) -) - -dnl check for PF_INET6 -CARES_CHECK_CONSTANT( - [ -#ifdef HAVE_SYS_TYPES_H -#include -#endif -#ifdef HAVE_SYS_SOCKET_H -#include -#endif -#ifdef HAVE_WINSOCK_H -#include -#endif - - ], [AF_INET6], - AC_DEFINE_UNQUOTED(HAVE_AF_INET6,1,[Define to 1 if you have AF_INET6.]) -) - - -dnl check for the in6_addr structure -CARES_CHECK_STRUCT( - [ -#ifdef HAVE_SYS_TYPES_H -#include -#endif -#ifdef HAVE_WINSOCK_H -#include -#endif -#ifdef HAVE_NETINET_IN_H -#include -#endif - ], [in6_addr], - AC_DEFINE_UNQUOTED(HAVE_STRUCT_IN6_ADDR,1,[Define to 1 if you have struct in6_addr.]) -) - -dnl check for the sockaddr_in6 structure -CARES_CHECK_STRUCT( - [ -#ifdef HAVE_SYS_TYPES_H -#include -#endif -#ifdef HAVE_WINSOCK_H -#include -#endif -#ifdef HAVE_NETINET_IN_H -#include -#endif - ], [sockaddr_in6], - AC_DEFINE_UNQUOTED(HAVE_STRUCT_SOCKADDR_IN6,1, - [Define to 1 if you have struct sockaddr_in6.]) ac_have_sockaddr_in6=yes -) - -if test "$ac_have_sockaddr_in6" = "yes" ; then -AC_CHECK_MEMBER(struct sockaddr_in6.sin6_scope_id, - AC_DEFINE_UNQUOTED(HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID,1, - [Define to 1 if your struct sockaddr_in6 has sin6_scope_id.]) - , , - [ -#ifdef HAVE_SYS_TYPES_H -#include -#endif -#ifdef HAVE_WINSOCK_H -#include -#endif -#ifdef HAVE_NETINET_IN_H -#include -#endif - ], [sockaddr_in6], [sin6_scope_id], -) -fi - -dnl check for the addrinfo structure -CARES_CHECK_STRUCT( - [ -#ifdef HAVE_SYS_TYPES_H -#include -#endif -#ifdef HAVE_WINSOCK_H -#include -#endif -#ifdef HAVE_NETINET_IN_H -#include -#endif - ], [addrinfo], - AC_DEFINE_UNQUOTED(HAVE_STRUCT_ADDRINFO,1, - [Define to 1 if you have struct addrinfo.]) -) - -dnl check for inet_pton -AC_CHECK_FUNCS(inet_pton) -dnl Some systems have it, but not IPv6 -if test "$ac_cv_func_inet_pton" = "yes" ; then -AC_MSG_CHECKING(if inet_pton supports IPv6) -AC_TRY_RUN( - [ -#ifdef HAVE_SYS_TYPES_H -#include -#endif -#ifdef HAVE_SYS_SOCKET_H -#include -#endif -#ifdef HAVE_WINSOCK_H -#include -#endif -#ifdef HAVE_NETINET_IN_H -#include -#endif -int main() - { - struct in6_addr addr6; - if (inet_pton(AF_INET6, "::1", &addr6) < 1) - exit(1); - else - exit(0); - } - ], [ - AC_MSG_RESULT(yes) - AC_DEFINE_UNQUOTED(HAVE_INET_PTON_IPV6,1,[Define to 1 if inet_pton supports IPv6.]) - ], AC_MSG_RESULT(no),AC_MSG_RESULT(no)) -fi -dnl Check for inet_net_pton -AC_CHECK_FUNCS(inet_net_pton) -dnl Again, some systems have it, but not IPv6 -if test "$ac_cv_func_inet_net_pton" = "yes" ; then -AC_MSG_CHECKING(if inet_net_pton supports IPv6) -AC_TRY_RUN( - [ -#ifdef HAVE_SYS_TYPES_H -#include -#endif -#ifdef HAVE_SYS_SOCKET_H -#include -#endif -#ifdef HAVE_WINSOCK_H -#include -#endif -#ifdef HAVE_NETINET_IN_H -#include -#endif -int main() - { - struct in6_addr addr6; - if (inet_net_pton(AF_INET6, "::1", &addr6, sizeof(addr6)) < 1) - exit(1); - else - exit(0); - } - ], [ - AC_MSG_RESULT(yes) - AC_DEFINE_UNQUOTED(HAVE_INET_NET_PTON_IPV6,1,[Define to 1 if inet_net_pton supports IPv6.]) - ], AC_MSG_RESULT(no),AC_MSG_RESULT(no)) -fi - - -dnl Check for inet_ntop -AC_CHECK_FUNCS(inet_ntop) -dnl Again, some systems have it, but not IPv6 -if test "$ac_cv_func_inet_ntop" = "yes" ; then -AC_MSG_CHECKING(if inet_ntop supports IPv6) -AC_TRY_RUN( - [ -#ifdef HAVE_SYS_TYPES_H -#include -#endif -#ifdef HAVE_SYS_SOCKET_H -#include -#endif -#ifdef HAVE_WINSOCK_H -#include -#endif -#ifdef HAVE_NETINET_IN_H -#include -#endif -#include -int main() - { - struct in6_addr addr6; - char buf[128]; - if (inet_ntop(AF_INET6, &addr6, buf, 128) == 0 && errno == EAFNOSUPPORT) - exit(1); - else - exit(0); - } - ], [ - AC_MSG_RESULT(yes) - AC_DEFINE_UNQUOTED(HAVE_INET_NTOP_IPV6,1,[Define to 1 if inet_ntop supports IPv6.]) - ], AC_MSG_RESULT(no),AC_MSG_RESULT(no)) -fi - -AC_CHECK_SIZEOF(struct in6_addr, , -[ -#ifdef HAVE_SYS_TYPES_H -#include -#endif -#ifdef HAVE_SYS_SOCKET_H -#include -#endif -#ifdef HAVE_WINSOCK_H -#include -#endif -#ifdef HAVE_NETINET_IN_H -#include -#endif -] -) -AC_CHECK_SIZEOF(struct in_addr, , -[ -#ifdef HAVE_SYS_TYPES_H -#include -#endif -#ifdef HAVE_SYS_SOCKET_H -#include -#endif -#ifdef HAVE_WINSOCK_H -#include -#endif -#ifdef HAVE_NETINET_IN_H -#include -#endif -] -) - -AC_CHECK_FUNCS([bitncmp if_indextoname]) - -CURL_CHECK_NONBLOCKING_SOCKET - -AC_OUTPUT(Makefile) +dnl Process this file with autoconf to produce a configure script. +AC_INIT(ares_init.c) +AM_CONFIG_HEADER(config.h) +AM_MAINTAINER_MODE +AM_INIT_AUTOMAKE(c-ares, CVS) + +AC_PROG_CC +AC_PROG_INSTALL + +case $host_os in +solaris*) + AC_DEFINE(ETC_INET, 1, [if a /etc/inet dir is being used]) + ;; +esac + +# check for ssize_t +AC_CHECK_TYPE(ssize_t, , + AC_DEFINE(ssize_t, int, [the signed version of size_t])) + +AC_SEARCH_LIBS(gethostbyname, nsl) +AC_SEARCH_LIBS(socket, socket) + +dnl ************************************************************ +dnl Option to switch on debug options. This makes an assumption that +dnl this is built as an 'ares' subdir in the curl source tree. Subject for +dnl improval in the future! +dnl +AC_MSG_CHECKING([whether to enable debug options]) +AC_ARG_ENABLE(debug, +AC_HELP_STRING([--enable-debug],[Enable pedantic debug options]) +AC_HELP_STRING([--disable-debug],[Disable debug options]), +[ case "$enableval" in + no) + AC_MSG_RESULT(no) + ;; + *) AC_MSG_RESULT(yes) + + dnl when doing the debug stuff, use static library only + AC_DISABLE_SHARED + + dnl Checks for standard header files, to make memdebug.h inclusions bettter + AC_HEADER_STDC + + dnl the entire --enable-debug is a hack that lives and runs on top of + dnl libcurl stuff so this BUILDING_LIBCURL is not THAT much uglier + AC_DEFINE(BUILDING_LIBCURL, 1, [when building as static part of libcurl]) + + CPPFLAGS="$CPPFLAGS -DCURLDEBUG -I$srcdir/../include" + CFLAGS="$CFLAGS -g" + + dnl set compiler "debug" options to become more picky, and remove + dnl optimize options from CFLAGS + CURL_CC_DEBUG_OPTS + + ;; + esac ], + AC_MSG_RESULT(no) +) + +AC_PROG_LIBTOOL + +dnl check for a few basic system headers we need +AC_CHECK_HEADERS( + sys/types.h \ + sys/time.h \ + sys/select.h \ + sys/socket.h \ + sys/ioctl.h \ + winsock.h \ + netinet/in.h \ + net/if.h \ + arpa/nameser.h \ + arpa/nameser_compat.h \ + arpa/inet.h, , , +[ +#ifdef HAVE_SYS_TYPES_H +#include +#endif +dnl We do this default-include simply to make sure that the nameser_compat.h +dnl header *REALLY* can be include after the new nameser.h. It seems AIX 5.1 +dnl (and others?) is not designed to allow this. +#ifdef HAVE_ARPA_NAMESER_H +#include +#endif + +dnl *Sigh* these are needed in order for net/if.h to get properly detected. +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#ifdef HAVE_WINSOCK_H +#include +#endif +] + ) + +AC_CHECK_TYPE(socklen_t, , + AC_DEFINE(socklen_t, int, [the length of a socket address]), + [ +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#ifdef HAVE_WINSOCK_H +#include +#endif + ]) + +dnl check for AF_INET6 +CARES_CHECK_CONSTANT( + [ +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#ifdef HAVE_WINSOCK_H +#include +#endif + + ], [PF_INET6], + AC_DEFINE_UNQUOTED(HAVE_PF_INET6,1,[Define to 1 if you have PF_INET6.]) +) + +dnl check for PF_INET6 +CARES_CHECK_CONSTANT( + [ +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#ifdef HAVE_WINSOCK_H +#include +#endif + + ], [AF_INET6], + AC_DEFINE_UNQUOTED(HAVE_AF_INET6,1,[Define to 1 if you have AF_INET6.]) +) + + +dnl check for the in6_addr structure +CARES_CHECK_STRUCT( + [ +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_WINSOCK_H +#include +#endif +#ifdef HAVE_NETINET_IN_H +#include +#endif + ], [in6_addr], + AC_DEFINE_UNQUOTED(HAVE_STRUCT_IN6_ADDR,1,[Define to 1 if you have struct in6_addr.]) +) + +dnl check for the sockaddr_in6 structure +CARES_CHECK_STRUCT( + [ +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_WINSOCK_H +#include +#endif +#ifdef HAVE_NETINET_IN_H +#include +#endif + ], [sockaddr_in6], + AC_DEFINE_UNQUOTED(HAVE_STRUCT_SOCKADDR_IN6,1, + [Define to 1 if you have struct sockaddr_in6.]) ac_have_sockaddr_in6=yes +) + +if test "$ac_have_sockaddr_in6" = "yes" ; then +AC_CHECK_MEMBER(struct sockaddr_in6.sin6_scope_id, + AC_DEFINE_UNQUOTED(HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID,1, + [Define to 1 if your struct sockaddr_in6 has sin6_scope_id.]) + , , + [ +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_WINSOCK_H +#include +#endif +#ifdef HAVE_NETINET_IN_H +#include +#endif + ], [sockaddr_in6], [sin6_scope_id], +) +fi + +dnl check for the addrinfo structure +CARES_CHECK_STRUCT( + [ +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_WINSOCK_H +#include +#endif +#ifdef HAVE_NETINET_IN_H +#include +#endif + ], [addrinfo], + AC_DEFINE_UNQUOTED(HAVE_STRUCT_ADDRINFO,1, + [Define to 1 if you have struct addrinfo.]) +) + +dnl check for inet_pton +AC_CHECK_FUNCS(inet_pton) +dnl Some systems have it, but not IPv6 +if test "$ac_cv_func_inet_pton" = "yes" ; then +AC_MSG_CHECKING(if inet_pton supports IPv6) +AC_TRY_RUN( + [ +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#ifdef HAVE_WINSOCK_H +#include +#endif +#ifdef HAVE_NETINET_IN_H +#include +#endif +int main() + { + struct in6_addr addr6; + if (inet_pton(AF_INET6, "::1", &addr6) < 1) + exit(1); + else + exit(0); + } + ], [ + AC_MSG_RESULT(yes) + AC_DEFINE_UNQUOTED(HAVE_INET_PTON_IPV6,1,[Define to 1 if inet_pton supports IPv6.]) + ], AC_MSG_RESULT(no),AC_MSG_RESULT(no)) +fi +dnl Check for inet_net_pton +AC_CHECK_FUNCS(inet_net_pton) +dnl Again, some systems have it, but not IPv6 +if test "$ac_cv_func_inet_net_pton" = "yes" ; then +AC_MSG_CHECKING(if inet_net_pton supports IPv6) +AC_TRY_RUN( + [ +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#ifdef HAVE_WINSOCK_H +#include +#endif +#ifdef HAVE_NETINET_IN_H +#include +#endif +int main() + { + struct in6_addr addr6; + if (inet_net_pton(AF_INET6, "::1", &addr6, sizeof(addr6)) < 1) + exit(1); + else + exit(0); + } + ], [ + AC_MSG_RESULT(yes) + AC_DEFINE_UNQUOTED(HAVE_INET_NET_PTON_IPV6,1,[Define to 1 if inet_net_pton supports IPv6.]) + ], AC_MSG_RESULT(no),AC_MSG_RESULT(no)) +fi + + +dnl Check for inet_ntop +AC_CHECK_FUNCS(inet_ntop) +dnl Again, some systems have it, but not IPv6 +if test "$ac_cv_func_inet_ntop" = "yes" ; then +AC_MSG_CHECKING(if inet_ntop supports IPv6) +AC_TRY_RUN( + [ +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#ifdef HAVE_WINSOCK_H +#include +#endif +#ifdef HAVE_NETINET_IN_H +#include +#endif +#include +int main() + { + struct in6_addr addr6; + char buf[128]; + if (inet_ntop(AF_INET6, &addr6, buf, 128) == 0 && errno == EAFNOSUPPORT) + exit(1); + else + exit(0); + } + ], [ + AC_MSG_RESULT(yes) + AC_DEFINE_UNQUOTED(HAVE_INET_NTOP_IPV6,1,[Define to 1 if inet_ntop supports IPv6.]) + ], AC_MSG_RESULT(no),AC_MSG_RESULT(no)) +fi + +AC_CHECK_SIZEOF(struct in6_addr, , +[ +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#ifdef HAVE_WINSOCK_H +#include +#endif +#ifdef HAVE_NETINET_IN_H +#include +#endif +] +) +AC_CHECK_SIZEOF(struct in_addr, , +[ +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#ifdef HAVE_WINSOCK_H +#include +#endif +#ifdef HAVE_NETINET_IN_H +#include +#endif +] +) + +AC_CHECK_FUNCS([bitncmp if_indextoname]) + +dnl God bless non-standardized functions! We need to see which getservbyport_r variant is available +CARES_CHECK_GETSERVBYPORT_R + +CURL_CHECK_NONBLOCKING_SOCKET + +AC_OUTPUT(Makefile)