Skip to content
Snippets Groups Projects
acinclude.m4 34.4 KiB
Newer Older
  • Learn to ignore specific revisions
  • #***************************************************************************
    #                                  _   _ ____  _
    #  Project                     ___| | | |  _ \| |
    #                             / __| | | | |_) | |
    #                            | (__| |_| |  _ <| |___
    #                             \___|\___/|_| \_\_____|
    #
    # Copyright (C) 1998 - 2005, Daniel Stenberg, <daniel@haxx.se>, et al.
    #
    # This software is licensed as described in the file COPYING, which
    # you should have received as part of this distribution. The terms
    # are also available at http://curl.haxx.se/docs/copyright.html.
    #
    # You may opt to use, copy, modify, merge, publish, distribute and/or sell
    # copies of the Software, and permit persons to whom the Software is
    # furnished to do so, under the terms of the COPYING file.
    #
    # This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
    # KIND, either express or implied.
    #
    # $Id$
    ###########################################################################
    
    
    dnl CURL_CHECK_HEADER_WINDOWS
    dnl -------------------------------------------------
    
    Yang Tse's avatar
    Yang Tse committed
    dnl Check for compilable and valid windows.h header 
    
    
    AC_DEFUN([CURL_CHECK_HEADER_WINDOWS], [
      AC_CACHE_CHECK([for windows.h], [ac_cv_header_windows_h], [
        AC_COMPILE_IFELSE([
          AC_LANG_PROGRAM([
    
    #ifndef WIN32_LEAN_AND_MEAN
    
    #define WIN32_LEAN_AND_MEAN
    
    #endif
    
    #include <windows.h>
          ],[
            int dummy=2*WINVER;
          ])
        ],[
          ac_cv_header_windows_h="yes"
        ],[
          ac_cv_header_windows_h="no"
        ])
      ])
      if test "x$ac_cv_header_windows_h" = "xyes"; then
    
    Yang Tse's avatar
    Yang Tse committed
        AC_DEFINE_UNQUOTED(HAVE_WINDOWS_H, 1,
    
          [Define to 1 if you have the windows.h header file.])
    
    Yang Tse's avatar
    Yang Tse committed
        AC_DEFINE_UNQUOTED(WIN32_LEAN_AND_MEAN, 1,
          [Define to avoid automatic inclusion of winsock.h])
    
      fi
    ])
    
    
    dnl CURL_CHECK_HEADER_WINSOCK
    dnl -------------------------------------------------
    
    Yang Tse's avatar
    Yang Tse committed
    dnl Check for compilable and valid winsock.h header 
    
    
    AC_DEFUN([CURL_CHECK_HEADER_WINSOCK], [
      AC_REQUIRE([CURL_CHECK_HEADER_WINDOWS])dnl
      AC_CACHE_CHECK([for winsock.h], [ac_cv_header_winsock_h], [
        AC_COMPILE_IFELSE([
          AC_LANG_PROGRAM([
    
    #ifndef WIN32_LEAN_AND_MEAN
    
    #define WIN32_LEAN_AND_MEAN
    
    #endif
    
    #include <windows.h>
    #include <winsock.h>
          ],[
            int dummy=WSACleanup();
          ])
        ],[
          ac_cv_header_winsock_h="yes"
        ],[
          ac_cv_header_winsock_h="no"
        ])
      ])
      if test "x$ac_cv_header_winsock_h" = "xyes"; then
    
    Yang Tse's avatar
    Yang Tse committed
        AC_DEFINE_UNQUOTED(HAVE_WINSOCK_H, 1,
    
          [Define to 1 if you have the winsock.h header file.])
      fi
    ])
    
    
    dnl CURL_CHECK_HEADER_WINSOCK2
    dnl -------------------------------------------------
    
    Yang Tse's avatar
    Yang Tse committed
    dnl Check for compilable and valid winsock2.h header 
    
    
    AC_DEFUN([CURL_CHECK_HEADER_WINSOCK2], [
      AC_REQUIRE([CURL_CHECK_HEADER_WINDOWS])dnl
      AC_CACHE_CHECK([for winsock2.h], [ac_cv_header_winsock2_h], [
        AC_COMPILE_IFELSE([
          AC_LANG_PROGRAM([
    
    #ifndef WIN32_LEAN_AND_MEAN
    
    #define WIN32_LEAN_AND_MEAN
    
    #endif
    
    #include <windows.h>
    #include <winsock2.h>
          ],[
            int dummy=2*IPPROTO_ESP;
          ])
        ],[
          ac_cv_header_winsock2_h="yes"
        ],[
          ac_cv_header_winsock2_h="no"
        ])
      ])
      if test "x$ac_cv_header_winsock2_h" = "xyes"; then
    
    Yang Tse's avatar
    Yang Tse committed
        AC_DEFINE_UNQUOTED(HAVE_WINSOCK2_H, 1,
    
          [Define to 1 if you have the winsock2.h header file.])
      fi
    ])
    
    
    dnl CURL_CHECK_HEADER_WS2TCPIP
    dnl -------------------------------------------------
    
    Yang Tse's avatar
    Yang Tse committed
    dnl Check for compilable and valid ws2tcpip.h header
    
    
    AC_DEFUN([CURL_CHECK_HEADER_WS2TCPIP], [
      AC_REQUIRE([CURL_CHECK_HEADER_WINSOCK2])dnl
      AC_CACHE_CHECK([for ws2tcpip.h], [ac_cv_header_ws2tcpip_h], [
        AC_COMPILE_IFELSE([
          AC_LANG_PROGRAM([
    
    #ifndef WIN32_LEAN_AND_MEAN
    
    #define WIN32_LEAN_AND_MEAN
    
    #include <windows.h>
    #include <winsock2.h>
    #include <ws2tcpip.h>
          ],[
            int dummy=2*IP_PKTINFO;
          ])
        ],[
          ac_cv_header_ws2tcpip_h="yes"
        ],[
          ac_cv_header_ws2tcpip_h="no"
        ])
      ])
      if test "x$ac_cv_header_ws2tcpip_h" = "xyes"; then
    
    Yang Tse's avatar
    Yang Tse committed
        AC_DEFINE_UNQUOTED(HAVE_WS2TCPIP_H, 1,
    
          [Define to 1 if you have the ws2tcpip.h header file.])
      fi
    ])
    
    
    
    dnl CURL_CHECK_TYPE_SOCKLEN_T
    dnl -------------------------------------------------
    
    Yang Tse's avatar
    Yang Tse committed
    dnl Check for existing socklen_t type, and provide
    dnl an equivalent type if socklen_t not available
    
    
    AC_DEFUN([CURL_CHECK_TYPE_SOCKLEN_T], [
      AC_REQUIRE([CURL_CHECK_HEADER_WS2TCPIP])dnl
      AC_CHECK_TYPE([socklen_t], ,[
    
    Yang Tse's avatar
    Yang Tse committed
        AC_CACHE_CHECK([for socklen_t equivalent], 
          [curl_cv_socklen_t_equiv], [
    
    Yang Tse's avatar
    Yang Tse committed
          curl_cv_socklen_t_equiv="unknown"
    
    Yang Tse's avatar
    Yang Tse committed
          for arg2 in "struct sockaddr" void; do
            for t in int size_t unsigned long "unsigned long"; do
    
              AC_COMPILE_IFELSE([
                AC_LANG_PROGRAM([
    #undef inline
    #ifdef HAVE_WINDOWS_H
    
    #ifndef WIN32_LEAN_AND_MEAN
    
    #define WIN32_LEAN_AND_MEAN
    
    #include <windows.h>
    #ifdef HAVE_WINSOCK2_H
    #include <winsock2.h>
    #else
    #ifdef HAVE_WINSOCK_H
    #include <winsock.h>
    #endif
    #endif
    #else
    #ifdef HAVE_SYS_TYPES_H
    #include <sys/types.h>
    #endif
    #ifdef HAVE_SYS_SOCKET_H
    #include <sys/socket.h>
    #endif
    #endif
                  int getpeername (int, $arg2 *, $t *);
                ],[
    
    Yang Tse's avatar
    Yang Tse committed
                  $t len=0;
    
    Yang Tse's avatar
    Yang Tse committed
                 curl_cv_socklen_t_equiv="$t"
    
    Yang Tse's avatar
    Yang Tse committed
        if test "$curl_cv_socklen_t_equiv" = "unknown"; then
    
    Yang Tse's avatar
    Yang Tse committed
          AC_MSG_ERROR([Cannot find a type to use in place of socklen_t])
    
    Yang Tse's avatar
    Yang Tse committed
          AC_DEFINE_UNQUOTED(socklen_t, $curl_cv_socklen_t_equiv,
    
            [type to use in place of socklen_t if not defined])
        fi
      ],[
    
    #undef inline
    
    #ifndef WIN32_LEAN_AND_MEAN
    #define WIN32_LEAN_AND_MEAN
    #endif
    #include <windows.h>
    #ifdef HAVE_WINSOCK2_H
    #include <winsock2.h>
    
    #ifdef HAVE_WS2TCPIP_H
    #include <ws2tcpip.h>
    #endif
    
    #else
    #ifdef HAVE_SYS_TYPES_H
    #include <sys/types.h>
    #endif
    #ifdef HAVE_SYS_SOCKET_H
    #include <sys/socket.h>
    #endif
    #endif
      ])
    ])
    
    
    
    dnl CURL_FUNC_GETNAMEINFO_ARGTYPES
    dnl -------------------------------------------------
    dnl Check the type to be passed to five of the arguments
    dnl of getnameinfo function, and define those types in  
    dnl GETNAMEINFO_TYPE_ARG1, GETNAMEINFO_TYPE_ARG2,
    dnl GETNAMEINFO_TYPE_ARG46 and GETNAMEINFO_TYPE_ARG7.
    dnl This function is experimental and its results shall
    dnl not be trusted while this notice is in place ------
    
    AC_DEFUN([CURL_FUNC_GETNAMEINFO_ARGTYPES], [
      AC_REQUIRE([CURL_CHECK_HEADER_WS2TCPIP])dnl
      AC_REQUIRE([CURL_CHECK_TYPE_SOCKLEN_T])dnl
      AC_CHECK_HEADERS(sys/types.h sys/socket.h netdb.h)
      AC_CACHE_CHECK([types of arguments for getnameinfo],
        [curl_cv_func_getnameinfo_args], [
        curl_cv_func_getnameinfo_args="unknown"
    
        for gni_arg1 in 'struct sockaddr *' 'const struct sockaddr *' 'void *'; do
    
          for gni_arg2 in 'socklen_t' 'size_t' 'int'; do
    
            for gni_arg46 in 'size_t' 'int' 'socklen_t' 'unsigned int'; do
    
              for gni_arg7 in 'int' 'unsigned int'; do
                AC_COMPILE_IFELSE([
                  AC_LANG_PROGRAM([
    
    #ifndef WIN32_LEAN_AND_MEAN
    
    #define WIN32_LEAN_AND_MEAN
    
    #if (!defined(_WIN32_WINNT)) || (_WIN32_WINNT < 0x0501)
    
    Yang Tse's avatar
    Yang Tse committed
    #undef _WIN32_WINNT
    #define _WIN32_WINNT 0x0501
    #endif
    
    #include <windows.h>
    #ifdef HAVE_WINSOCK2_H
    
    #ifdef HAVE_WS2TCPIP_H
    #include <ws2tcpip.h>
    #endif
    
    #else
    #ifdef HAVE_SYS_TYPES_H
    #include <sys/types.h>
    #endif
    #ifdef HAVE_SYS_SOCKET_H
    #include <sys/socket.h>
    #endif
    #ifdef HAVE_NETDB_H
    #include <netdb.h>
    #endif
    
                    extern int GNICALLCONV getnameinfo($gni_arg1, $gni_arg2,
    
                                           char *, $gni_arg46,
                                           char *, $gni_arg46,
                                           $gni_arg7);
                  ],[
                    $gni_arg2 salen=0;
                    $gni_arg46 hostlen=0;
                    $gni_arg46 servlen=0;
                    $gni_arg7 flags=0;
    
                    int res = getnameinfo(0, salen, 0, hostlen, 0, servlen, flags);
    
                  ])
                ],[
                   curl_cv_func_getnameinfo_args="$gni_arg1,$gni_arg2,$gni_arg46,$gni_arg7"
                   break 4
                ])
              done
            done
          done
        done
      ])
      if test "$curl_cv_func_getnameinfo_args" = "unknown"; then
    
        AC_MSG_WARN([Cannot find proper types to use for getnameinfo args])
    
      else
        gni_prev_IFS=$IFS; IFS=','
        set dummy `echo "$curl_cv_func_getnameinfo_args" | sed 's/\*/\*/g'`
        IFS=$gni_prev_IFS
        shift
        AC_DEFINE_UNQUOTED(GETNAMEINFO_TYPE_ARG1, $[1],
    
    Yang Tse's avatar
    Yang Tse committed
          [Define to the type of arg 1 for getnameinfo.])
    
        AC_DEFINE_UNQUOTED(GETNAMEINFO_TYPE_ARG2, $[2],
    
    Yang Tse's avatar
    Yang Tse committed
          [Define to the type of arg 2 for getnameinfo.])
    
        AC_DEFINE_UNQUOTED(GETNAMEINFO_TYPE_ARG46, $[3],
    
    Yang Tse's avatar
    Yang Tse committed
          [Define to the type of args 4 and 6 for getnameinfo.])
    
        AC_DEFINE_UNQUOTED(GETNAMEINFO_TYPE_ARG7, $[4],
    
    Yang Tse's avatar
    Yang Tse committed
          [Define to the type of arg 7 for getnameinfo.])
    
    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...
    dnl
    
    AC_DEFUN([CURL_CHECK_NONBLOCKING_SOCKET],
    
    [
      AC_MSG_CHECKING([non-blocking sockets style])
    
      AC_TRY_COMPILE([
    /* headers for O_NONBLOCK test */
    #include <sys/types.h>
    #include <unistd.h>
    #include <fcntl.h>
    ],[
    /* 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 <unistd.h>
    #include <stropts.h>
    ],[
    
    /* 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 (Windows) */
    #undef inline
    #ifdef HAVE_WINDOWS_H
    #ifndef WIN32_LEAN_AND_MEAN
    #define WIN32_LEAN_AND_MEAN
    #endif
    
    #include <windows.h>
    
    #ifdef HAVE_WINSOCK2_H
    #include <winsock2.h>
    #else
    #ifdef HAVE_WINSOCK_H
    #include <winsock.h>
    #endif
    #endif
    #endif
    
    ],[
    /* ioctlsocket source code */
    
    Yang Tse's avatar
    Yang Tse committed
     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])
    
    dnl ioctlsocket didnt compile!, go to test 4
    
      AC_TRY_LINK([
    
    /* headers for IoctlSocket test (Amiga?) */
    #include <sys/ioctl.h>
    ],[
    /* 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) */
    
    ],[
    /* 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 TYPE_SOCKADDR_STORAGE
    dnl -------------------------------------------------
    
    dnl Check for struct sockaddr_storage. Most IPv6-enabled hosts have it, but
    dnl AIX 4.3 is one known exception.
    AC_DEFUN([TYPE_SOCKADDR_STORAGE],
    [
       AC_CHECK_TYPE([struct sockaddr_storage],
            AC_DEFINE(HAVE_STRUCT_SOCKADDR_STORAGE, 1,
                      [if struct sockaddr_storage is defined]), ,
       [
    
    #undef inline
    #ifdef HAVE_WINDOWS_H
    #ifndef WIN32_LEAN_AND_MEAN
    #define WIN32_LEAN_AND_MEAN
    #endif
    #include <windows.h>
    #ifdef HAVE_WINSOCK2_H
    #include <winsock2.h>
    #endif
    #else
    
    #ifdef HAVE_SYS_TYPES_H
    #include <sys/types.h>
    #endif
    #ifdef HAVE_SYS_SOCKET_H
    #include <sys/socket.h>
    #endif
    #ifdef HAVE_NETINET_IN_H
    #include <netinet/in.h>
    #endif
    #ifdef HAVE_ARPA_INET_H
    #include <arpa/inet.h>
    
    dnl TYPE_IN_ADDR_T
    dnl -------------------------------------------------
    
    dnl Check for in_addr_t: it is used to receive the return code of inet_addr()
    
    AC_DEFUN([TYPE_IN_ADDR_T],
    [
       AC_CHECK_TYPE([in_addr_t], ,[
          AC_MSG_CHECKING([for in_addr_t equivalent])
          AC_CACHE_VAL([curl_cv_in_addr_t_equiv],
          [
             curl_cv_in_addr_t_equiv=
    
             for t in "unsigned long" int size_t unsigned long; do
    
    #undef inline
    #ifdef HAVE_WINDOWS_H
    #ifndef WIN32_LEAN_AND_MEAN
    #define WIN32_LEAN_AND_MEAN
    #endif
    #include <windows.h>
    #ifdef HAVE_WINSOCK2_H
    #include <winsock2.h>
    #else
    #ifdef HAVE_WINSOCK_H
    #include <winsock.h>
    #endif
    #endif
    #else
    #ifdef HAVE_SYS_TYPES_H
    #include <sys/types.h>
    #endif
    #ifdef HAVE_SYS_SOCKET_H
    #include <sys/socket.h>
    #endif
    #ifdef HAVE_NETINET_IN_H
    #include <netinet/in.h>
    #endif
    
    Yang Tse's avatar
    Yang Tse committed
    #ifdef HAVE_ARPA_INET_H
    #include <arpa/inet.h>
    #endif
    
                ],[
                   $t data = inet_addr ("1.2.3.4");
                ],[
                   curl_cv_in_addr_t_equiv="$t"
                   break
                ])
    
             done
    
             if test "x$curl_cv_in_addr_t_equiv" = x; then
                AC_MSG_ERROR([Cannot find a type to use in place of in_addr_t])
             fi
          ])
          AC_MSG_RESULT($curl_cv_in_addr_t_equiv)
          AC_DEFINE_UNQUOTED(in_addr_t, $curl_cv_in_addr_t_equiv,
    			[type to use in place of in_addr_t if not defined])],
    
          [
    #undef inline
    #ifdef HAVE_WINDOWS_H
    #ifndef WIN32_LEAN_AND_MEAN
    #define WIN32_LEAN_AND_MEAN
    #endif
    #include <windows.h>
    #ifdef HAVE_WINSOCK2_H
    #include <winsock2.h>
    #else
    #ifdef HAVE_WINSOCK_H
    #include <winsock.h>
    #endif
    #endif
    #else
    #ifdef HAVE_SYS_TYPES_H
    #include <sys/types.h>
    #endif
    #ifdef HAVE_SYS_SOCKET_H
    
    #include <sys/socket.h>
    
    #endif
    #ifdef HAVE_NETINET_IN_H
    #include <netinet/in.h>
    #endif
    
    Yang Tse's avatar
    Yang Tse committed
    #ifdef HAVE_ARPA_INET_H
    #include <arpa/inet.h>
    #endif
    
    Daniel Stenberg's avatar
    Daniel Stenberg committed
      ]) dnl AC_CHECK_TYPE
    ]) dnl AC_DEFUN
    
    dnl ************************************************************
    dnl check for "localhost", if it doesn't exist, we can't do the
    dnl gethostbyname_r tests!
    dnl 
    
    
    AC_DEFUN([CURL_CHECK_WORKING_RESOLVER],[
    
    AC_MSG_CHECKING([if "localhost" resolves])
    AC_TRY_RUN([
    #include <string.h>
    #include <sys/types.h>
    #include <netdb.h>
    
    int
    main () {
    struct hostent *h;
    h = gethostbyname("localhost");
    exit (h == NULL ? 1 : 0); }],[
          AC_MSG_RESULT(yes)],[
          AC_MSG_RESULT(no)
          AC_MSG_ERROR([can't figure out gethostbyname_r() since localhost doesn't resolve])
    
          ]
    )
    ])
    
    dnl ************************************************************
    
    dnl check for working getaddrinfo() that works with AI_NUMERICHOST
    
    AC_DEFUN([CURL_CHECK_WORKING_GETADDRINFO],[
    
      AC_CACHE_CHECK(for working getaddrinfo, ac_cv_working_getaddrinfo,[
      AC_TRY_RUN( [
    #include <netdb.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    
    
        struct addrinfo hints, *ai;
        int error;
    
        memset(&hints, 0, sizeof(hints));
    
        hints.ai_family = AF_UNSPEC;
        hints.ai_socktype = SOCK_STREAM;
        error = getaddrinfo("127.0.0.1", "8080", &hints, &ai);
        if (error) {
    
    }
    ],[
      ac_cv_working_getaddrinfo="yes"
    ],[
      ac_cv_working_getaddrinfo="no"
    ],[
      ac_cv_working_getaddrinfo="yes"
    ])])
    if test "$ac_cv_working_getaddrinfo" = "yes"; then
      AC_DEFINE(HAVE_GETADDRINFO, 1, [Define if getaddrinfo exists and works])
      AC_DEFINE(ENABLE_IPV6, 1, [Define if you want to enable IPv6 support])
    
      IPV6_ENABLED=1
      AC_SUBST(IPV6_ENABLED)
    fi
    ])
    
    
    dnl ************************************************************
    dnl check for working NI_WITHSCOPEID in getnameinfo()
    dnl
    AC_DEFUN([CURL_CHECK_NI_WITHSCOPEID],[
      AC_CACHE_CHECK(for working NI_WITHSCOPEID, ac_cv_working_ni_withscopeid,[
    
     AC_RUN_IFELSE([[
    
    #include <stdio.h>
    #include <sys/types.h>
    
    #include <sys/socket.h>
    #include <netdb.h>
    int main()
    {
    #ifdef NI_WITHSCOPEID
       struct sockaddr_storage ss;
    
       int fd = socket(AF_INET6, SOCK_STREAM, 0);
    
         perror("socket()");
         return 1; /* couldn't create socket of either kind */
    
       }
    
       rc = getsockname(fd, (struct sockaddr *)&ss, &sslen);
    
    
       rc = getnameinfo((struct sockaddr *)&ss, sslen, hbuf, sizeof(hbuf),
                         NULL, 0,
                         NI_NUMERICHOST | NI_NUMERICSERV | NI_WITHSCOPEID);
    
    
       if(rc) {
         printf("rc = %s\n", gai_strerror(rc));
    
    
       return 0; /* everything works fine, use NI_WITHSCOPEID! */
    #else
    
       return 4; /* we don't seem to have the definition, don't use it */
    
    #endif
    }
    ]],
    dnl program worked:
    [ ac_cv_working_ni_withscopeid="yes" ],
    dnl program failed:
    [ ac_cv_working_ni_withscopeid="no" ],
    
    dnl we cross-compile, check the headers using the preprocessor
    [
    
     AC_EGREP_CPP(WORKS,
    [
    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netdb.h>
    
    #ifdef NI_WITHSCOPEID
    WORKS
    #endif
    ],
      ac_cv_working_ni_withscopeid="yes",
      ac_cv_working_ni_withscopeid="no" )
    
     ]
    
    ) dnl end of AC_RUN_IFELSE
    
    ]) dnl end of AC_CACHE_CHECK
    
    if test "$ac_cv_working_ni_withscopeid" = "yes"; then
    
      AC_DEFINE(HAVE_NI_WITHSCOPEID, 1,
                [Define if NI_WITHSCOPEID exists and works])
    
    AC_DEFUN([CURL_CHECK_LOCALTIME_R],
    
      dnl check for localtime_r
    
      AC_CHECK_FUNCS(localtime_r,[
        AC_MSG_CHECKING(whether localtime_r is declared)
        AC_EGREP_CPP(localtime_r,[
    #include <time.h>],[
          AC_MSG_RESULT(yes)],[
          AC_MSG_RESULT(no)
          AC_MSG_CHECKING(whether localtime_r with -D_REENTRANT is declared)
          AC_EGREP_CPP(localtime_r,[
    #define _REENTRANT
    #include <time.h>],[
    	AC_DEFINE(NEED_REENTRANT)
    	AC_MSG_RESULT(yes)],
    	AC_MSG_RESULT(no))])])
    ])
    
    
    dnl
    dnl This function checks for strerror_r(). If it isn't found at first, it
    dnl retries with _THREAD_SAFE defined, as that is what AIX seems to require
    dnl in order to find this function.
    dnl
    dnl If the function is found, it will then proceed to check how the function
    dnl actually works: glibc-style or POSIX-style.
    dnl
    dnl glibc:
    dnl      char *strerror_r(int errnum, char *buf, size_t n);
    dnl  
    dnl  What this one does is to return the error string (no surprises there),
    dnl  but it doesn't usually copy anything into buf!  The 'buf' and 'n'
    dnl  parameters are only meant as an optional working area, in case strerror_r
    dnl  needs it.  A quick test on a few systems shows that it's generally not
    dnl  touched at all.
    dnl
    dnl POSIX:
    dnl      int strerror_r(int errnum, char *buf, size_t n);
    dnl
    
    AC_DEFUN([CURL_CHECK_STRERROR_R],
    [
    
      AC_CHECK_FUNCS(strerror_r)
    
      if test "x$ac_cv_func_strerror_r" = "xyes"; then
    
    
        AC_MSG_CHECKING(whether strerror_r is declared)
        AC_EGREP_CPP(strerror_r,[
    #include <string.h>],[
          AC_MSG_RESULT(yes)],[
          AC_MSG_RESULT(no)
    
          AC_MSG_CHECKING(whether strerror_r with -D_REENTRANT is declared)
    
          AC_EGREP_CPP(strerror_r,[
    
    #include <string.h>],[
    
    	AC_MSG_RESULT(yes)],
    
    	AC_MSG_RESULT(no)
            AC_DEFINE(HAVE_NO_STRERROR_R_DECL, 1, [we have no strerror_r() proto])
           ) dnl with _THREAD_SAFE
        ]) dnl plain cpp for it
    
        dnl determine if this strerror_r() is glibc or POSIX
        AC_MSG_CHECKING([for a glibc strerror_r API])
        AC_TRY_RUN([
    #include <string.h>
    #include <errno.h>
    int
    main () {
      char buffer[1024]; /* big enough to play with */
      char *string =
        strerror_r(EACCES, buffer, sizeof(buffer));
        /* this should've returned a string */
        if(!string || !string[0])
          return 99;
        return 0;
    }
    ],
    
        AC_DEFINE(HAVE_GLIBC_STRERROR_R, 1, [we have a glibc-style strerror_r()])
        AC_MSG_RESULT([yes]),
    
    
        dnl Use an inferior method of strerror_r detection while cross-compiling
        AC_EGREP_CPP(yes, [
    #include <features.h>
    #ifdef __GLIBC__
    yes
    #endif
    ], 
          dnl looks like glibc, so assume a glibc-style strerror_r()
          GLIBC_STRERROR_R="1"
          AC_DEFINE(HAVE_GLIBC_STRERROR_R, 1, [we have a glibc-style strerror_r()])
          AC_MSG_RESULT([yes]),
          AC_MSG_NOTICE([cannot determine strerror_r() style: edit lib/config.h manually!])
        ) dnl while cross-compiling
    
        if test -z "$GLIBC_STRERROR_R"; then
    
          AC_MSG_CHECKING([for a POSIX strerror_r API])
          AC_TRY_RUN([
    
    #include <string.h>
    #include <errno.h>
    int
    main () {
      char buffer[1024]; /* big enough to play with */
      int error =
        strerror_r(EACCES, buffer, sizeof(buffer));
        /* This should've returned zero, and written an error string in the
           buffer.*/
        if(!buffer[0] || error)
          return 99;
        return 0;
    }
    ],
    
          AC_DEFINE(HAVE_POSIX_STRERROR_R, 1, [we have a POSIX-style strerror_r()])
          AC_MSG_RESULT([yes]),
          AC_MSG_RESULT([no]) ,
          dnl cross-compiling!
          AC_MSG_NOTICE([cannot determine strerror_r() style: edit lib/config.h manually!])
        )
    
        fi dnl if not using glibc API
    
      fi dnl we have a strerror_r
    
    AC_DEFUN([CURL_CHECK_INET_NTOA_R],
    
    [
      dnl determine if function definition for inet_ntoa_r exists.
      AC_CHECK_FUNCS(inet_ntoa_r,[
        AC_MSG_CHECKING(whether inet_ntoa_r is declared)
        AC_EGREP_CPP(inet_ntoa_r,[
    #include <arpa/inet.h>],[
    
          AC_DEFINE(HAVE_INET_NTOA_R_DECL, 1, [inet_ntoa_r() is declared])
    
          AC_MSG_RESULT(yes)],[
          AC_MSG_RESULT(no)
          AC_MSG_CHECKING(whether inet_ntoa_r with -D_REENTRANT is declared)
          AC_EGREP_CPP(inet_ntoa_r,[
    #define _REENTRANT
    #include <arpa/inet.h>],[
    
    	AC_DEFINE(HAVE_INET_NTOA_R_DECL, 1, [inet_ntoa_r() is declared])
    	AC_DEFINE(NEED_REENTRANT, 1, [need REENTRANT defined])
    
    	AC_MSG_RESULT(yes)],
    	AC_MSG_RESULT(no))])])
    ])
    
    
    AC_DEFUN([CURL_CHECK_GETHOSTBYADDR_R],
    
    [
      dnl check for number of arguments to gethostbyaddr_r. it might take
      dnl either 5, 7, or 8 arguments.
      AC_CHECK_FUNCS(gethostbyaddr_r,[
        AC_MSG_CHECKING(if gethostbyaddr_r takes 5 arguments)
        AC_TRY_COMPILE([
    #include <sys/types.h>
    #include <netdb.h>],[
    char * address;
    int length;
    int type;
    struct hostent h;
    struct hostent_data hdata;
    int rc;
    rc = gethostbyaddr_r(address, length, type, &h, &hdata);],[
          AC_MSG_RESULT(yes)
    
          AC_DEFINE(HAVE_GETHOSTBYADDR_R_5, 1, [gethostbyaddr_r() takes 5 args])
    
          ac_cv_gethostbyaddr_args=5],[
          AC_MSG_RESULT(no)
          AC_MSG_CHECKING(if gethostbyaddr_r with -D_REENTRANT takes 5 arguments)
          AC_TRY_COMPILE([
    #define _REENTRANT
    #include <sys/types.h>
    #include <netdb.h>],[
    char * address;
    int length;
    int type;
    struct hostent h;
    struct hostent_data hdata;
    int rc;
    rc = gethostbyaddr_r(address, length, type, &h, &hdata);],[
    	AC_MSG_RESULT(yes)
    
    	AC_DEFINE(HAVE_GETHOSTBYADDR_R_5, 1, [gethostbyaddr_r() takes 5 args])
    	AC_DEFINE(NEED_REENTRANT, 1, [need REENTRANT])
    
    	ac_cv_gethostbyaddr_args=5],[
    	AC_MSG_RESULT(no)
    	AC_MSG_CHECKING(if gethostbyaddr_r takes 7 arguments)
    	AC_TRY_COMPILE([
    #include <sys/types.h>
    #include <netdb.h>],[
    char * address;
    int length;
    int type;
    struct hostent h;
    char buffer[8192];
    int h_errnop;
    struct hostent * hp;
    
    hp = gethostbyaddr_r(address, length, type, &h,
                         buffer, 8192, &h_errnop);],[
    	  AC_MSG_RESULT(yes)
    
    	  AC_DEFINE(HAVE_GETHOSTBYADDR_R_7, 1, [gethostbyaddr_r() takes 7 args] )
    
    	  ac_cv_gethostbyaddr_args=7],[
    	  AC_MSG_RESULT(no)
    	  AC_MSG_CHECKING(if gethostbyaddr_r takes 8 arguments)
    	  AC_TRY_COMPILE([
    #include <sys/types.h>
    #include <netdb.h>],[
    char * address;
    int length;
    int type;
    struct hostent h;
    char buffer[8192];
    int h_errnop;
    struct hostent * hp;
    int rc;
    
    rc = gethostbyaddr_r(address, length, type, &h,
                         buffer, 8192, &hp, &h_errnop);],[
    	    AC_MSG_RESULT(yes)
    
    	    AC_DEFINE(HAVE_GETHOSTBYADDR_R_8, 1, [gethostbyaddr_r() takes 8 args])
    
    	    ac_cv_gethostbyaddr_args=8],[
    	    AC_MSG_RESULT(no)
    	    have_missing_r_funcs="$have_missing_r_funcs gethostbyaddr_r"])])])])])
    ])
    
    
    AC_DEFUN([CURL_CHECK_GETHOSTBYNAME_R],
    
    [
      dnl check for number of arguments to gethostbyname_r. it might take
      dnl either 3, 5, or 6 arguments.
      AC_CHECK_FUNCS(gethostbyname_r,[
    
        AC_MSG_CHECKING([if gethostbyname_r takes 3 arguments])
        AC_TRY_COMPILE([
    
    #include <string.h>
    #include <sys/types.h>
    #include <netdb.h>
    
    gethostbyname_r(const char *, struct hostent *, struct hostent_data *);],[
    
    Daniel Stenberg's avatar
    Daniel Stenberg committed
    struct hostent_data data;
    
    gethostbyname_r(NULL, NULL, NULL);],[
    
          AC_MSG_RESULT(yes)
    
          AC_DEFINE(HAVE_GETHOSTBYNAME_R_3, 1, [gethostbyname_r() takes 3 args])
    
          ac_cv_gethostbyname_args=3],[
          AC_MSG_RESULT(no)
    
          AC_MSG_CHECKING([if gethostbyname_r with -D_REENTRANT takes 3 arguments])
          AC_TRY_COMPILE([
    
    #define _REENTRANT
    
    #include <string.h>
    #include <sys/types.h>
    #include <netdb.h>
    
    gethostbyname_r(const char *,struct hostent *, struct hostent_data *);],[
    
    Daniel Stenberg's avatar
    Daniel Stenberg committed
    struct hostent_data data;
    
    gethostbyname_r(NULL, NULL, NULL);],[
    
    	AC_MSG_RESULT(yes)
    
    	AC_DEFINE(HAVE_GETHOSTBYNAME_R_3, 1, [gethostbyname_r() takes 3 args])
    	AC_DEFINE(NEED_REENTRANT, 1, [needs REENTRANT])
    
    	ac_cv_gethostbyname_args=3],[
    	AC_MSG_RESULT(no)
    
    	AC_MSG_CHECKING([if gethostbyname_r takes 5 arguments])
    	AC_TRY_COMPILE([
    
    #include <sys/types.h>
    #include <netdb.h>
    
    struct hostent *
    gethostbyname_r(const char *, struct hostent *, char *, int, int *);],[