Added constants that will be used by ares_getaddrinfo. Made ares_getnameinfo use the reentrant getservbyport (getservbyport_r) if it isavailable to ensure it works properly in a threaded environment

This commit is contained in:
Dominick Meglio 2005-09-18 16:44:49 +00:00
parent e7093b3ca8
commit 6a48639c68
5 changed files with 731 additions and 627 deletions

View File

@ -1,5 +1,12 @@
Changelog for the c-ares project 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 * September 10
- configure fix for detecting a member in the sockaddr_in6 struct which failed - configure fix for detecting a member in the sockaddr_in6 struct which failed

View File

@ -1,271 +1,318 @@
dnl Check for how to set a socket to non-blocking state. There seems to exist 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 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 and XPG3, while the other different ways for different systems (old BSD,
dnl Windows and Amiga). dnl Windows and Amiga).
dnl dnl
dnl There are two known platforms (AIX 3.x and SunOS 4.1.x) where the 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 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 to get caught in this script by using an excessive number of #ifdefs...
dnl dnl
AC_DEFUN([CURL_CHECK_NONBLOCKING_SOCKET], AC_DEFUN([CURL_CHECK_NONBLOCKING_SOCKET],
[ [
AC_MSG_CHECKING([non-blocking sockets style]) AC_MSG_CHECKING([non-blocking sockets style])
AC_TRY_COMPILE([ AC_TRY_COMPILE([
/* headers for O_NONBLOCK test */ /* headers for O_NONBLOCK test */
#include <sys/types.h> #include <sys/types.h>
#include <unistd.h> #include <unistd.h>
#include <fcntl.h> #include <fcntl.h>
],[ ],[
/* try to compile O_NONBLOCK */ /* try to compile O_NONBLOCK */
#if defined(sun) || defined(__sun__) || defined(__SUNPRO_C) || defined(__SUNPRO_CC) #if defined(sun) || defined(__sun__) || defined(__SUNPRO_C) || defined(__SUNPRO_CC)
# if defined(__SVR4) || defined(__srv4__) # if defined(__SVR4) || defined(__srv4__)
# define PLATFORM_SOLARIS # define PLATFORM_SOLARIS
# else # else
# define PLATFORM_SUNOS4 # define PLATFORM_SUNOS4
# endif # endif
#endif #endif
#if (defined(_AIX) || defined(__xlC__)) && !defined(_AIX4) #if (defined(_AIX) || defined(__xlC__)) && !defined(_AIX4)
# define PLATFORM_AIX_V3 # define PLATFORM_AIX_V3
#endif #endif
#if defined(PLATFORM_SUNOS4) || defined(PLATFORM_AIX_V3) || defined(__BEOS__) #if defined(PLATFORM_SUNOS4) || defined(PLATFORM_AIX_V3) || defined(__BEOS__)
#error "O_NONBLOCK does not work on this platform" #error "O_NONBLOCK does not work on this platform"
#endif #endif
int socket; int socket;
int flags = fcntl(socket, F_SETFL, flags | O_NONBLOCK); int flags = fcntl(socket, F_SETFL, flags | O_NONBLOCK);
],[ ],[
dnl the O_NONBLOCK test was fine dnl the O_NONBLOCK test was fine
nonblock="O_NONBLOCK" nonblock="O_NONBLOCK"
AC_DEFINE(HAVE_O_NONBLOCK, 1, [use O_NONBLOCK for non-blocking sockets]) 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 dnl the code was bad, try a different program now, test 2
AC_TRY_COMPILE([ AC_TRY_COMPILE([
/* headers for FIONBIO test */ /* headers for FIONBIO test */
#include <unistd.h> #include <unistd.h>
#include <stropts.h> #include <stropts.h>
],[ ],[
/* FIONBIO source test (old-style unix) */ /* FIONBIO source test (old-style unix) */
int socket; int socket;
int flags = ioctl(socket, FIONBIO, &flags); int flags = ioctl(socket, FIONBIO, &flags);
],[ ],[
dnl FIONBIO test was good dnl FIONBIO test was good
nonblock="FIONBIO" nonblock="FIONBIO"
AC_DEFINE(HAVE_FIONBIO, 1, [use FIONBIO for non-blocking sockets]) AC_DEFINE(HAVE_FIONBIO, 1, [use FIONBIO for non-blocking sockets])
],[ ],[
dnl FIONBIO test was also bad dnl FIONBIO test was also bad
dnl the code was bad, try a different program now, test 3 dnl the code was bad, try a different program now, test 3
AC_TRY_COMPILE([ AC_TRY_COMPILE([
/* headers for ioctlsocket test (cygwin?) */ /* headers for ioctlsocket test (cygwin?) */
#include <windows.h> #include <windows.h>
],[ ],[
/* ioctlsocket source code */ /* ioctlsocket source code */
int socket; int socket;
unsigned long flags = ioctlsocket(socket, FIONBIO, &flags); unsigned long flags = ioctlsocket(socket, FIONBIO, &flags);
],[ ],[
dnl ioctlsocket test was good dnl ioctlsocket test was good
nonblock="ioctlsocket" nonblock="ioctlsocket"
AC_DEFINE(HAVE_IOCTLSOCKET, 1, [use ioctlsocket() for non-blocking sockets]) AC_DEFINE(HAVE_IOCTLSOCKET, 1, [use ioctlsocket() for non-blocking sockets])
],[ ],[
dnl ioctlsocket didnt compile!, go to test 4 dnl ioctlsocket didnt compile!, go to test 4
AC_TRY_LINK([ AC_TRY_LINK([
/* headers for IoctlSocket test (Amiga?) */ /* headers for IoctlSocket test (Amiga?) */
#include <sys/ioctl.h> #include <sys/ioctl.h>
],[ ],[
/* IoctlSocket source code */ /* IoctlSocket source code */
int socket; int socket;
int flags = IoctlSocket(socket, FIONBIO, (long)1); int flags = IoctlSocket(socket, FIONBIO, (long)1);
],[ ],[
dnl ioctlsocket test was good dnl ioctlsocket test was good
nonblock="IoctlSocket" nonblock="IoctlSocket"
AC_DEFINE(HAVE_IOCTLSOCKET_CASE, 1, [use Ioctlsocket() for non-blocking sockets]) AC_DEFINE(HAVE_IOCTLSOCKET_CASE, 1, [use Ioctlsocket() for non-blocking sockets])
],[ ],[
dnl Ioctlsocket didnt compile, do test 5! dnl Ioctlsocket didnt compile, do test 5!
AC_TRY_COMPILE([ AC_TRY_COMPILE([
/* headers for SO_NONBLOCK test (BeOS) */ /* headers for SO_NONBLOCK test (BeOS) */
#include <socket.h> #include <socket.h>
],[ ],[
/* SO_NONBLOCK source code */ /* SO_NONBLOCK source code */
long b = 1; long b = 1;
int socket; int socket;
int flags = setsockopt(socket, SOL_SOCKET, SO_NONBLOCK, &b, sizeof(b)); int flags = setsockopt(socket, SOL_SOCKET, SO_NONBLOCK, &b, sizeof(b));
],[ ],[
dnl the SO_NONBLOCK test was good dnl the SO_NONBLOCK test was good
nonblock="SO_NONBLOCK" nonblock="SO_NONBLOCK"
AC_DEFINE(HAVE_SO_NONBLOCK, 1, [use SO_NONBLOCK for non-blocking sockets]) AC_DEFINE(HAVE_SO_NONBLOCK, 1, [use SO_NONBLOCK for non-blocking sockets])
],[ ],[
dnl test 5 didnt compile! dnl test 5 didnt compile!
nonblock="nada" nonblock="nada"
AC_DEFINE(HAVE_DISABLED_NONBLOCKING, 1, [disabled non-blocking sockets]) AC_DEFINE(HAVE_DISABLED_NONBLOCKING, 1, [disabled non-blocking sockets])
]) ])
dnl end of fifth test dnl end of fifth test
]) ])
dnl end of forth test dnl end of forth test
]) ])
dnl end of third test dnl end of third test
]) ])
dnl end of second test dnl end of second test
]) ])
dnl end of non-blocking try-compile test dnl end of non-blocking try-compile test
AC_MSG_RESULT($nonblock) AC_MSG_RESULT($nonblock)
if test "$nonblock" = "nada"; then if test "$nonblock" = "nada"; then
AC_MSG_WARN([non-block sockets disabled]) AC_MSG_WARN([non-block sockets disabled])
fi fi
]) ])
dnl We create a function for detecting which compiler we use and then set as 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 pendantic compiler options as possible for that particular compiler. The
dnl options are only used for debug-builds. 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 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 modify this one, edit the one in curl and copy it back here when that one
dnl is changed. dnl is changed.
AC_DEFUN([CURL_CC_DEBUG_OPTS], AC_DEFUN([CURL_CC_DEBUG_OPTS],
[ [
if test "$GCC" = "yes"; then if test "$GCC" = "yes"; then
dnl figure out gcc version! dnl figure out gcc version!
AC_MSG_CHECKING([gcc version]) AC_MSG_CHECKING([gcc version])
gccver=`$CC -dumpversion` gccver=`$CC -dumpversion`
num1=`echo $gccver | cut -d . -f1` num1=`echo $gccver | cut -d . -f1`
num2=`echo $gccver | cut -d . -f2` num2=`echo $gccver | cut -d . -f2`
gccnum=`(expr $num1 "*" 100 + $num2) 2>/dev/null` gccnum=`(expr $num1 "*" 100 + $num2) 2>/dev/null`
AC_MSG_RESULT($gccver) AC_MSG_RESULT($gccver)
AC_MSG_CHECKING([if this is icc in disguise]) AC_MSG_CHECKING([if this is icc in disguise])
AC_EGREP_CPP([^__INTEL_COMPILER], [__INTEL_COMPILER], AC_EGREP_CPP([^__INTEL_COMPILER], [__INTEL_COMPILER],
dnl action if the text is found, this it has not been replaced by the dnl action if the text is found, this it has not been replaced by the
dnl cpp dnl cpp
ICC="no" ICC="no"
AC_MSG_RESULT([no]), AC_MSG_RESULT([no]),
dnl the text was not found, it was replaced by the cpp dnl the text was not found, it was replaced by the cpp
ICC="yes" ICC="yes"
AC_MSG_RESULT([yes]) AC_MSG_RESULT([yes])
) )
if test "$ICC" = "yes"; then if test "$ICC" = "yes"; then
dnl this is icc, not gcc. dnl this is icc, not gcc.
dnl ICC warnings we ignore: dnl ICC warnings we ignore:
dnl * 279 warns on static conditions in while expressions dnl * 279 warns on static conditions in while expressions
dnl * 269 warns on our "%Od" printf formatters for curl_off_t output: dnl * 269 warns on our "%Od" printf formatters for curl_off_t output:
dnl "invalid format string conversion" dnl "invalid format string conversion"
WARN="-wd279,269" WARN="-wd279,269"
if test "$gccnum" -gt "600"; then if test "$gccnum" -gt "600"; then
dnl icc 6.0 and older doesn't have the -Wall flag dnl icc 6.0 and older doesn't have the -Wall flag
WARN="-Wall $WARN" WARN="-Wall $WARN"
fi fi
else dnl $ICC = yes else dnl $ICC = yes
dnl dnl
WARN="-W -Wall -Wwrite-strings -pedantic -Wno-long-long -Wundef -Wpointer-arith -Wnested-externs -Winline -Wmissing-declarations -Wmissing-prototypes -Wsign-compare" 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 ;-) dnl -Wcast-align is a bit too annoying ;-)
if test "$gccnum" -ge "296"; then if test "$gccnum" -ge "296"; then
dnl gcc 2.96 or later dnl gcc 2.96 or later
WARN="$WARN -Wfloat-equal" WARN="$WARN -Wfloat-equal"
if test "$gccnum" -gt "296"; then if test "$gccnum" -gt "296"; then
dnl this option does not exist in 2.96 dnl this option does not exist in 2.96
WARN="$WARN -Wno-format-nonliteral" WARN="$WARN -Wno-format-nonliteral"
fi fi
dnl -Wunreachable-code seems totally unreliable on my gcc 3.3.2 on 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 dnl on i686-Linux as it gives us heaps with false positives
if test "$gccnum" -ge "303"; then if test "$gccnum" -ge "303"; then
dnl gcc 3.3 and later dnl gcc 3.3 and later
WARN="$WARN -Wendif-labels -Wstrict-prototypes" WARN="$WARN -Wendif-labels -Wstrict-prototypes"
fi fi
fi fi
for flag in $CPPFLAGS; do for flag in $CPPFLAGS; do
case "$flag" in case "$flag" in
-I*) -I*)
dnl include path dnl include path
add=`echo $flag | sed 's/^-I/-isystem /g'` add=`echo $flag | sed 's/^-I/-isystem /g'`
WARN="$WARN $add" WARN="$WARN $add"
;; ;;
esac esac
done done
fi dnl $ICC = no fi dnl $ICC = no
CFLAGS="$CFLAGS $WARN" CFLAGS="$CFLAGS $WARN"
fi dnl $GCC = yes fi dnl $GCC = yes
dnl strip off optimizer flags dnl strip off optimizer flags
NEWFLAGS="" NEWFLAGS=""
for flag in $CFLAGS; do for flag in $CFLAGS; do
case "$flag" in case "$flag" in
-O*) -O*)
dnl echo "cut off $flag" dnl echo "cut off $flag"
;; ;;
*) *)
NEWFLAGS="$NEWFLAGS $flag" NEWFLAGS="$NEWFLAGS $flag"
;; ;;
esac esac
done done
CFLAGS=$NEWFLAGS CFLAGS=$NEWFLAGS
]) dnl end of AC_DEFUN() ]) dnl end of AC_DEFUN()
dnl This macro determines if the specified struct exists in the specified file dnl This macro determines if the specified struct exists in the specified file
dnl Syntax: dnl Syntax:
dnl CARES_CHECK_STRUCT(headers, struct name, if found, [if not found]) dnl CARES_CHECK_STRUCT(headers, struct name, if found, [if not found])
AC_DEFUN([CARES_CHECK_STRUCT], [ AC_DEFUN([CARES_CHECK_STRUCT], [
AC_MSG_CHECKING([for struct $2]) AC_MSG_CHECKING([for struct $2])
AC_TRY_COMPILE([$1], AC_TRY_COMPILE([$1],
[ [
struct $2 struct_instance; struct $2 struct_instance;
], ac_struct="yes", ac_found="no") ], ac_struct="yes", ac_found="no")
if test "$ac_struct" = "yes" ; then if test "$ac_struct" = "yes" ; then
AC_MSG_RESULT(yes) AC_MSG_RESULT(yes)
$3 $3
else else
AC_MSG_RESULT(no) AC_MSG_RESULT(no)
$4 $4
fi fi
]) ])
dnl This macro determines if the specified constant exists in the specified file dnl This macro determines if the specified constant exists in the specified file
dnl Syntax: dnl Syntax:
dnl CARES_CHECK_CONSTANT(headers, constant name, if found, [if not found]) dnl CARES_CHECK_CONSTANT(headers, constant name, if found, [if not found])
AC_DEFUN([CARES_CHECK_CONSTANT], [ AC_DEFUN([CARES_CHECK_CONSTANT], [
AC_MSG_CHECKING([for $2]) AC_MSG_CHECKING([for $2])
AC_EGREP_CPP(VARIABLEWASDEFINED, AC_EGREP_CPP(VARIABLEWASDEFINED,
[ [
$1 $1
#ifdef $2 #ifdef $2
VARIABLEWASDEFINED VARIABLEWASDEFINED
#else #else
NJET NJET
#endif #endif
], ac_constant="yes", ac_constant="no" ], ac_constant="yes", ac_constant="no"
) )
if test "$ac_constant" = "yes" ; then if test "$ac_constant" = "yes" ; then
AC_MSG_RESULT(yes) AC_MSG_RESULT(yes)
$3 $3
else else
AC_MSG_RESULT(no) AC_MSG_RESULT(no)
$4 $4
fi 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 <netdb.h>],
[
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 <netdb.h>],
[
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 <netdb.h>],
[
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
])

View File

@ -69,6 +69,10 @@ extern "C" {
/* ares_getnameinfo error codes */ /* ares_getnameinfo error codes */
#define ARES_EBADFLAGS 18 #define ARES_EBADFLAGS 18
/* ares_getaddrinfo error codes */
#define ARES_ENONAME 19
#define ARES_EBADHINTS 20
/* Flag values */ /* Flag values */
#define ARES_FLAG_USEVC (1 << 0) #define ARES_FLAG_USEVC (1 << 0)
#define ARES_FLAG_PRIMARY (1 << 1) #define ARES_FLAG_PRIMARY (1 << 1)
@ -104,9 +108,27 @@ extern "C" {
#define ARES_NI_LOOKUPHOST (1 << 8) #define ARES_NI_LOOKUPHOST (1 << 8)
#define ARES_NI_LOOKUPSERVICE (1 << 9) #define ARES_NI_LOOKUPSERVICE (1 << 9)
/* Reserved for future use */ /* Reserved for future use */
#define ARES_NI_IDN (1 << 10) #define ARES_NI_IDN (1 << 10)
#define ARES_NI_ALLOW_UNASSIGNED (1 << 11) #define ARES_NI_IDN_ALLOW_UNASSIGNED (1 << 11)
#define ARES_NI_USE_STD3_ASCII_RULES (1 << 12) #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 { struct ares_options {
int flags; int flags;

View File

@ -256,7 +256,16 @@ static char *lookup_service(unsigned short port, int flags, char *buf)
{ {
struct servent *se; struct servent *se;
const char *proto; 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) if (flags & ARES_NI_UDP)
proto = "udp"; proto = "udp";
else if (flags & ARES_NI_SCTP) else if (flags & ARES_NI_SCTP)
@ -265,7 +274,23 @@ static char *lookup_service(unsigned short port, int flags, char *buf)
proto = "dccp"; proto = "dccp";
else else
proto = "tcp"; 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); se = getservbyport(port, proto);
#endif
if (se && se->s_name) if (se && se->s_name)
strcpy(buf, se->s_name); strcpy(buf, se->s_name);
else else

View File

@ -1,352 +1,355 @@
dnl Process this file with autoconf to produce a configure script. dnl Process this file with autoconf to produce a configure script.
AC_INIT(ares_init.c) AC_INIT(ares_init.c)
AM_CONFIG_HEADER(config.h) AM_CONFIG_HEADER(config.h)
AM_MAINTAINER_MODE AM_MAINTAINER_MODE
AM_INIT_AUTOMAKE(c-ares, CVS) AM_INIT_AUTOMAKE(c-ares, CVS)
AC_PROG_CC AC_PROG_CC
AC_PROG_INSTALL AC_PROG_INSTALL
case $host_os in case $host_os in
solaris*) solaris*)
AC_DEFINE(ETC_INET, 1, [if a /etc/inet dir is being used]) AC_DEFINE(ETC_INET, 1, [if a /etc/inet dir is being used])
;; ;;
esac esac
# check for ssize_t # check for ssize_t
AC_CHECK_TYPE(ssize_t, , AC_CHECK_TYPE(ssize_t, ,
AC_DEFINE(ssize_t, int, [the signed version of size_t])) AC_DEFINE(ssize_t, int, [the signed version of size_t]))
AC_SEARCH_LIBS(gethostbyname, nsl) AC_SEARCH_LIBS(gethostbyname, nsl)
AC_SEARCH_LIBS(socket, socket) AC_SEARCH_LIBS(socket, socket)
dnl ************************************************************ dnl ************************************************************
dnl Option to switch on debug options. This makes an assumption that 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 this is built as an 'ares' subdir in the curl source tree. Subject for
dnl improval in the future! dnl improval in the future!
dnl dnl
AC_MSG_CHECKING([whether to enable debug options]) AC_MSG_CHECKING([whether to enable debug options])
AC_ARG_ENABLE(debug, AC_ARG_ENABLE(debug,
AC_HELP_STRING([--enable-debug],[Enable pedantic debug options]) AC_HELP_STRING([--enable-debug],[Enable pedantic debug options])
AC_HELP_STRING([--disable-debug],[Disable debug options]), AC_HELP_STRING([--disable-debug],[Disable debug options]),
[ case "$enableval" in [ case "$enableval" in
no) no)
AC_MSG_RESULT(no) AC_MSG_RESULT(no)
;; ;;
*) AC_MSG_RESULT(yes) *) AC_MSG_RESULT(yes)
dnl when doing the debug stuff, use static library only dnl when doing the debug stuff, use static library only
AC_DISABLE_SHARED AC_DISABLE_SHARED
dnl Checks for standard header files, to make memdebug.h inclusions bettter dnl Checks for standard header files, to make memdebug.h inclusions bettter
AC_HEADER_STDC AC_HEADER_STDC
dnl the entire --enable-debug is a hack that lives and runs on top of 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 dnl libcurl stuff so this BUILDING_LIBCURL is not THAT much uglier
AC_DEFINE(BUILDING_LIBCURL, 1, [when building as static part of libcurl]) AC_DEFINE(BUILDING_LIBCURL, 1, [when building as static part of libcurl])
CPPFLAGS="$CPPFLAGS -DCURLDEBUG -I$srcdir/../include" CPPFLAGS="$CPPFLAGS -DCURLDEBUG -I$srcdir/../include"
CFLAGS="$CFLAGS -g" CFLAGS="$CFLAGS -g"
dnl set compiler "debug" options to become more picky, and remove dnl set compiler "debug" options to become more picky, and remove
dnl optimize options from CFLAGS dnl optimize options from CFLAGS
CURL_CC_DEBUG_OPTS CURL_CC_DEBUG_OPTS
;; ;;
esac ], esac ],
AC_MSG_RESULT(no) AC_MSG_RESULT(no)
) )
AC_PROG_LIBTOOL AC_PROG_LIBTOOL
dnl check for a few basic system headers we need dnl check for a few basic system headers we need
AC_CHECK_HEADERS( AC_CHECK_HEADERS(
sys/types.h \ sys/types.h \
sys/time.h \ sys/time.h \
sys/select.h \ sys/select.h \
sys/socket.h \ sys/socket.h \
sys/ioctl.h \ sys/ioctl.h \
winsock.h \ winsock.h \
netinet/in.h \ netinet/in.h \
net/if.h \ net/if.h \
arpa/nameser.h \ arpa/nameser.h \
arpa/nameser_compat.h \ arpa/nameser_compat.h \
arpa/inet.h, , , arpa/inet.h, , ,
[ [
#ifdef HAVE_SYS_TYPES_H #ifdef HAVE_SYS_TYPES_H
#include <sys/types.h> #include <sys/types.h>
#endif #endif
dnl We do this default-include simply to make sure that the nameser_compat.h 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 header *REALLY* can be include after the new nameser.h. It seems AIX 5.1
dnl (and others?) is not designed to allow this. dnl (and others?) is not designed to allow this.
#ifdef HAVE_ARPA_NAMESER_H #ifdef HAVE_ARPA_NAMESER_H
#include <arpa/nameser.h> #include <arpa/nameser.h>
#endif #endif
dnl *Sigh* these are needed in order for net/if.h to get properly detected. dnl *Sigh* these are needed in order for net/if.h to get properly detected.
#ifdef HAVE_SYS_SOCKET_H #ifdef HAVE_SYS_SOCKET_H
#include <sys/socket.h> #include <sys/socket.h>
#endif #endif
#ifdef HAVE_WINSOCK_H #ifdef HAVE_WINSOCK_H
#include <winsock.h> #include <winsock.h>
#endif #endif
] ]
) )
AC_CHECK_TYPE(socklen_t, , AC_CHECK_TYPE(socklen_t, ,
AC_DEFINE(socklen_t, int, [the length of a socket address]), AC_DEFINE(socklen_t, int, [the length of a socket address]),
[ [
#ifdef HAVE_SYS_TYPES_H #ifdef HAVE_SYS_TYPES_H
#include <sys/types.h> #include <sys/types.h>
#endif #endif
#ifdef HAVE_SYS_SOCKET_H #ifdef HAVE_SYS_SOCKET_H
#include <sys/socket.h> #include <sys/socket.h>
#endif #endif
#ifdef HAVE_WINSOCK_H #ifdef HAVE_WINSOCK_H
#include <winsock.h> #include <winsock.h>
#endif #endif
]) ])
dnl check for AF_INET6 dnl check for AF_INET6
CARES_CHECK_CONSTANT( CARES_CHECK_CONSTANT(
[ [
#ifdef HAVE_SYS_TYPES_H #ifdef HAVE_SYS_TYPES_H
#include <sys/types.h> #include <sys/types.h>
#endif #endif
#ifdef HAVE_SYS_SOCKET_H #ifdef HAVE_SYS_SOCKET_H
#include <sys/socket.h> #include <sys/socket.h>
#endif #endif
#ifdef HAVE_WINSOCK_H #ifdef HAVE_WINSOCK_H
#include <winsock.h> #include <winsock.h>
#endif #endif
], [PF_INET6], ], [PF_INET6],
AC_DEFINE_UNQUOTED(HAVE_PF_INET6,1,[Define to 1 if you have PF_INET6.]) AC_DEFINE_UNQUOTED(HAVE_PF_INET6,1,[Define to 1 if you have PF_INET6.])
) )
dnl check for PF_INET6 dnl check for PF_INET6
CARES_CHECK_CONSTANT( CARES_CHECK_CONSTANT(
[ [
#ifdef HAVE_SYS_TYPES_H #ifdef HAVE_SYS_TYPES_H
#include <sys/types.h> #include <sys/types.h>
#endif #endif
#ifdef HAVE_SYS_SOCKET_H #ifdef HAVE_SYS_SOCKET_H
#include <sys/socket.h> #include <sys/socket.h>
#endif #endif
#ifdef HAVE_WINSOCK_H #ifdef HAVE_WINSOCK_H
#include <winsock.h> #include <winsock.h>
#endif #endif
], [AF_INET6], ], [AF_INET6],
AC_DEFINE_UNQUOTED(HAVE_AF_INET6,1,[Define to 1 if you have AF_INET6.]) AC_DEFINE_UNQUOTED(HAVE_AF_INET6,1,[Define to 1 if you have AF_INET6.])
) )
dnl check for the in6_addr structure dnl check for the in6_addr structure
CARES_CHECK_STRUCT( CARES_CHECK_STRUCT(
[ [
#ifdef HAVE_SYS_TYPES_H #ifdef HAVE_SYS_TYPES_H
#include <sys/types.h> #include <sys/types.h>
#endif #endif
#ifdef HAVE_WINSOCK_H #ifdef HAVE_WINSOCK_H
#include <winsock.h> #include <winsock.h>
#endif #endif
#ifdef HAVE_NETINET_IN_H #ifdef HAVE_NETINET_IN_H
#include <netinet/in.h> #include <netinet/in.h>
#endif #endif
], [in6_addr], ], [in6_addr],
AC_DEFINE_UNQUOTED(HAVE_STRUCT_IN6_ADDR,1,[Define to 1 if you have struct 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 dnl check for the sockaddr_in6 structure
CARES_CHECK_STRUCT( CARES_CHECK_STRUCT(
[ [
#ifdef HAVE_SYS_TYPES_H #ifdef HAVE_SYS_TYPES_H
#include <sys/types.h> #include <sys/types.h>
#endif #endif
#ifdef HAVE_WINSOCK_H #ifdef HAVE_WINSOCK_H
#include <winsock.h> #include <winsock.h>
#endif #endif
#ifdef HAVE_NETINET_IN_H #ifdef HAVE_NETINET_IN_H
#include <netinet/in.h> #include <netinet/in.h>
#endif #endif
], [sockaddr_in6], ], [sockaddr_in6],
AC_DEFINE_UNQUOTED(HAVE_STRUCT_SOCKADDR_IN6,1, AC_DEFINE_UNQUOTED(HAVE_STRUCT_SOCKADDR_IN6,1,
[Define to 1 if you have struct sockaddr_in6.]) ac_have_sockaddr_in6=yes [Define to 1 if you have struct sockaddr_in6.]) ac_have_sockaddr_in6=yes
) )
if test "$ac_have_sockaddr_in6" = "yes" ; then if test "$ac_have_sockaddr_in6" = "yes" ; then
AC_CHECK_MEMBER(struct sockaddr_in6.sin6_scope_id, AC_CHECK_MEMBER(struct sockaddr_in6.sin6_scope_id,
AC_DEFINE_UNQUOTED(HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID,1, AC_DEFINE_UNQUOTED(HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID,1,
[Define to 1 if your struct sockaddr_in6 has sin6_scope_id.]) [Define to 1 if your struct sockaddr_in6 has sin6_scope_id.])
, , , ,
[ [
#ifdef HAVE_SYS_TYPES_H #ifdef HAVE_SYS_TYPES_H
#include <sys/types.h> #include <sys/types.h>
#endif #endif
#ifdef HAVE_WINSOCK_H #ifdef HAVE_WINSOCK_H
#include <winsock.h> #include <winsock.h>
#endif #endif
#ifdef HAVE_NETINET_IN_H #ifdef HAVE_NETINET_IN_H
#include <netinet/in.h> #include <netinet/in.h>
#endif #endif
], [sockaddr_in6], [sin6_scope_id], ], [sockaddr_in6], [sin6_scope_id],
) )
fi fi
dnl check for the addrinfo structure dnl check for the addrinfo structure
CARES_CHECK_STRUCT( CARES_CHECK_STRUCT(
[ [
#ifdef HAVE_SYS_TYPES_H #ifdef HAVE_SYS_TYPES_H
#include <sys/types.h> #include <sys/types.h>
#endif #endif
#ifdef HAVE_WINSOCK_H #ifdef HAVE_WINSOCK_H
#include <winsock.h> #include <winsock.h>
#endif #endif
#ifdef HAVE_NETINET_IN_H #ifdef HAVE_NETINET_IN_H
#include <netinet/in.h> #include <netinet/in.h>
#endif #endif
], [addrinfo], ], [addrinfo],
AC_DEFINE_UNQUOTED(HAVE_STRUCT_ADDRINFO,1, AC_DEFINE_UNQUOTED(HAVE_STRUCT_ADDRINFO,1,
[Define to 1 if you have struct addrinfo.]) [Define to 1 if you have struct addrinfo.])
) )
dnl check for inet_pton dnl check for inet_pton
AC_CHECK_FUNCS(inet_pton) AC_CHECK_FUNCS(inet_pton)
dnl Some systems have it, but not IPv6 dnl Some systems have it, but not IPv6
if test "$ac_cv_func_inet_pton" = "yes" ; then if test "$ac_cv_func_inet_pton" = "yes" ; then
AC_MSG_CHECKING(if inet_pton supports IPv6) AC_MSG_CHECKING(if inet_pton supports IPv6)
AC_TRY_RUN( AC_TRY_RUN(
[ [
#ifdef HAVE_SYS_TYPES_H #ifdef HAVE_SYS_TYPES_H
#include <sys/types.h> #include <sys/types.h>
#endif #endif
#ifdef HAVE_SYS_SOCKET_H #ifdef HAVE_SYS_SOCKET_H
#include <sys/socket.h> #include <sys/socket.h>
#endif #endif
#ifdef HAVE_WINSOCK_H #ifdef HAVE_WINSOCK_H
#include <winsock.h> #include <winsock.h>
#endif #endif
#ifdef HAVE_NETINET_IN_H #ifdef HAVE_NETINET_IN_H
#include <netinet/in.h> #include <netinet/in.h>
#endif #endif
int main() int main()
{ {
struct in6_addr addr6; struct in6_addr addr6;
if (inet_pton(AF_INET6, "::1", &addr6) < 1) if (inet_pton(AF_INET6, "::1", &addr6) < 1)
exit(1); exit(1);
else else
exit(0); exit(0);
} }
], [ ], [
AC_MSG_RESULT(yes) AC_MSG_RESULT(yes)
AC_DEFINE_UNQUOTED(HAVE_INET_PTON_IPV6,1,[Define to 1 if inet_pton supports IPv6.]) AC_DEFINE_UNQUOTED(HAVE_INET_PTON_IPV6,1,[Define to 1 if inet_pton supports IPv6.])
], AC_MSG_RESULT(no),AC_MSG_RESULT(no)) ], AC_MSG_RESULT(no),AC_MSG_RESULT(no))
fi fi
dnl Check for inet_net_pton dnl Check for inet_net_pton
AC_CHECK_FUNCS(inet_net_pton) AC_CHECK_FUNCS(inet_net_pton)
dnl Again, some systems have it, but not IPv6 dnl Again, some systems have it, but not IPv6
if test "$ac_cv_func_inet_net_pton" = "yes" ; then if test "$ac_cv_func_inet_net_pton" = "yes" ; then
AC_MSG_CHECKING(if inet_net_pton supports IPv6) AC_MSG_CHECKING(if inet_net_pton supports IPv6)
AC_TRY_RUN( AC_TRY_RUN(
[ [
#ifdef HAVE_SYS_TYPES_H #ifdef HAVE_SYS_TYPES_H
#include <sys/types.h> #include <sys/types.h>
#endif #endif
#ifdef HAVE_SYS_SOCKET_H #ifdef HAVE_SYS_SOCKET_H
#include <sys/socket.h> #include <sys/socket.h>
#endif #endif
#ifdef HAVE_WINSOCK_H #ifdef HAVE_WINSOCK_H
#include <winsock.h> #include <winsock.h>
#endif #endif
#ifdef HAVE_NETINET_IN_H #ifdef HAVE_NETINET_IN_H
#include <netinet/in.h> #include <netinet/in.h>
#endif #endif
int main() int main()
{ {
struct in6_addr addr6; struct in6_addr addr6;
if (inet_net_pton(AF_INET6, "::1", &addr6, sizeof(addr6)) < 1) if (inet_net_pton(AF_INET6, "::1", &addr6, sizeof(addr6)) < 1)
exit(1); exit(1);
else else
exit(0); exit(0);
} }
], [ ], [
AC_MSG_RESULT(yes) AC_MSG_RESULT(yes)
AC_DEFINE_UNQUOTED(HAVE_INET_NET_PTON_IPV6,1,[Define to 1 if inet_net_pton supports IPv6.]) 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)) ], AC_MSG_RESULT(no),AC_MSG_RESULT(no))
fi fi
dnl Check for inet_ntop dnl Check for inet_ntop
AC_CHECK_FUNCS(inet_ntop) AC_CHECK_FUNCS(inet_ntop)
dnl Again, some systems have it, but not IPv6 dnl Again, some systems have it, but not IPv6
if test "$ac_cv_func_inet_ntop" = "yes" ; then if test "$ac_cv_func_inet_ntop" = "yes" ; then
AC_MSG_CHECKING(if inet_ntop supports IPv6) AC_MSG_CHECKING(if inet_ntop supports IPv6)
AC_TRY_RUN( AC_TRY_RUN(
[ [
#ifdef HAVE_SYS_TYPES_H #ifdef HAVE_SYS_TYPES_H
#include <sys/types.h> #include <sys/types.h>
#endif #endif
#ifdef HAVE_SYS_SOCKET_H #ifdef HAVE_SYS_SOCKET_H
#include <sys/socket.h> #include <sys/socket.h>
#endif #endif
#ifdef HAVE_WINSOCK_H #ifdef HAVE_WINSOCK_H
#include <winsock.h> #include <winsock.h>
#endif #endif
#ifdef HAVE_NETINET_IN_H #ifdef HAVE_NETINET_IN_H
#include <netinet/in.h> #include <netinet/in.h>
#endif #endif
#include <errno.h> #include <errno.h>
int main() int main()
{ {
struct in6_addr addr6; struct in6_addr addr6;
char buf[128]; char buf[128];
if (inet_ntop(AF_INET6, &addr6, buf, 128) == 0 && errno == EAFNOSUPPORT) if (inet_ntop(AF_INET6, &addr6, buf, 128) == 0 && errno == EAFNOSUPPORT)
exit(1); exit(1);
else else
exit(0); exit(0);
} }
], [ ], [
AC_MSG_RESULT(yes) AC_MSG_RESULT(yes)
AC_DEFINE_UNQUOTED(HAVE_INET_NTOP_IPV6,1,[Define to 1 if inet_ntop supports IPv6.]) AC_DEFINE_UNQUOTED(HAVE_INET_NTOP_IPV6,1,[Define to 1 if inet_ntop supports IPv6.])
], AC_MSG_RESULT(no),AC_MSG_RESULT(no)) ], AC_MSG_RESULT(no),AC_MSG_RESULT(no))
fi fi
AC_CHECK_SIZEOF(struct in6_addr, , AC_CHECK_SIZEOF(struct in6_addr, ,
[ [
#ifdef HAVE_SYS_TYPES_H #ifdef HAVE_SYS_TYPES_H
#include <sys/types.h> #include <sys/types.h>
#endif #endif
#ifdef HAVE_SYS_SOCKET_H #ifdef HAVE_SYS_SOCKET_H
#include <sys/socket.h> #include <sys/socket.h>
#endif #endif
#ifdef HAVE_WINSOCK_H #ifdef HAVE_WINSOCK_H
#include <winsock.h> #include <winsock.h>
#endif #endif
#ifdef HAVE_NETINET_IN_H #ifdef HAVE_NETINET_IN_H
#include <netinet/in.h> #include <netinet/in.h>
#endif #endif
] ]
) )
AC_CHECK_SIZEOF(struct in_addr, , AC_CHECK_SIZEOF(struct in_addr, ,
[ [
#ifdef HAVE_SYS_TYPES_H #ifdef HAVE_SYS_TYPES_H
#include <sys/types.h> #include <sys/types.h>
#endif #endif
#ifdef HAVE_SYS_SOCKET_H #ifdef HAVE_SYS_SOCKET_H
#include <sys/socket.h> #include <sys/socket.h>
#endif #endif
#ifdef HAVE_WINSOCK_H #ifdef HAVE_WINSOCK_H
#include <winsock.h> #include <winsock.h>
#endif #endif
#ifdef HAVE_NETINET_IN_H #ifdef HAVE_NETINET_IN_H
#include <netinet/in.h> #include <netinet/in.h>
#endif #endif
] ]
) )
AC_CHECK_FUNCS([bitncmp if_indextoname]) AC_CHECK_FUNCS([bitncmp if_indextoname])
CURL_CHECK_NONBLOCKING_SOCKET dnl God bless non-standardized functions! We need to see which getservbyport_r variant is available
CARES_CHECK_GETSERVBYPORT_R
AC_OUTPUT(Makefile)
CURL_CHECK_NONBLOCKING_SOCKET
AC_OUTPUT(Makefile)