Skip to content
Snippets Groups Projects
acinclude.m4 56.5 KiB
Newer Older
  • Learn to ignore specific revisions
  • dnl CURL_CHECK_COMPILER_HALT_ON_ERROR
    dnl -------------------------------------------------
    dnl Verifies if the compiler actually halts after the
    dnl compilation phase without generating any object
    dnl code file, when the source compiles with errors.
    
    AC_DEFUN([CURL_CHECK_COMPILER_HALT_ON_ERROR], [
      AC_MSG_CHECKING([if compiler halts on compilation errors])
      AC_COMPILE_IFELSE([
        AC_LANG_PROGRAM([[
        ]],[[
          force compilation error
        ]])
      ],[
        AC_MSG_RESULT([no])
        AC_MSG_ERROR([compiler does not halt on compilation errors.])
      ],[
        AC_MSG_RESULT([yes])
      ])
    ])
    
    
    dnl CURL_CHECK_COMPILER_ARRAY_SIZE_NEGATIVE
    dnl -------------------------------------------------
    dnl Verifies if the compiler actually halts after the
    dnl compilation phase without generating any object
    dnl code file, when the source code tries to define a
    dnl type for a constant array with negative dimension.
    
    AC_DEFUN([CURL_CHECK_COMPILER_ARRAY_SIZE_NEGATIVE], [
      AC_REQUIRE([CURL_CHECK_COMPILER_HALT_ON_ERROR])dnl
      AC_MSG_CHECKING([if compiler halts on negative sized arrays])
      AC_COMPILE_IFELSE([
        AC_LANG_PROGRAM([[
          typedef char bad_t[sizeof(char) == sizeof(int) ? -1 : -1 ];
        ]],[[
          bad_t dummy;
        ]])
      ],[
        AC_MSG_RESULT([no])
        AC_MSG_ERROR([compiler does not halt on negative sized arrays.])
      ],[
        AC_MSG_RESULT([yes])
      ])
    ])
    
    
    dnl CURL_CHECK_DEF(SYMBOL, [INCLUDES], [SILENT])
    dnl -------------------------------------------------
    dnl Use the C preprocessor to find out if the given object-style symbol
    dnl is defined and get its expansion. This macro will not use default
    dnl includes even if no INCLUDES argument is given. This macro will run
    dnl silently when invoked with three arguments.
    
    AC_DEFUN([CURL_CHECK_DEF], [
      AS_VAR_PUSHDEF([ac_HaveDef], [curl_cv_have_def_$1])dnl
      AS_VAR_PUSHDEF([ac_Def], [curl_cv_def_$1])dnl
    
      if test -z "$SED"; then
        AC_MSG_ERROR([SED not set. Cannot continue without SED being set.])
      fi
      if test -z "$GREP"; then
        AC_MSG_ERROR([GREP not set. Cannot continue without GREP being set.])
      fi
    
      ifelse($3,,[AC_MSG_CHECKING([for preprocessor definition of $1])])
      tmp_exp=""
      AC_PREPROC_IFELSE([
        AC_LANG_SOURCE(
    ifelse($2,,,[$2])[[
    #ifdef $1
    CURL_DEF_TOKEN $1
    #endif
        ]])
      ],[
        tmp_exp=`eval "$ac_cpp conftest.$ac_ext" 2>/dev/null | \
          "$GREP" CURL_DEF_TOKEN 2>/dev/null | \
          "$SED" 's/.*CURL_DEF_TOKEN[[ ]]//' 2>/dev/null | \
          "$SED" 'q' 2>/dev/null`
        if test "$tmp_exp" = "$1"; then
          tmp_exp=""
        fi
      ])
      if test -z "$tmp_exp"; then
        AS_VAR_SET([ac_HaveDef], [no])
        ifelse($3,,[AC_MSG_RESULT([no])])
      else
        AS_VAR_SET([ac_HaveDef], [yes])
        AS_VAR_SET([ac_Def], [$tmp_exp])
        ifelse($3,,[AC_MSG_RESULT([$tmp_exp])])
      fi
      AS_VAR_POPDEF([ac_Def])dnl
      AS_VAR_POPDEF([ac_HaveDef])dnl
    ])
    
    
    
    dnl CURL_CHECK_HEADER_WINDOWS
    dnl -------------------------------------------------
    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
    
    #if defined(__CYGWIN__) || defined(__CEGCC__)
    
            HAVE_WINDOWS_H shall not be defined.
    #else
    
        ],[
          ac_cv_header_windows_h="yes"
        ],[
          ac_cv_header_windows_h="no"
        ])
      ])
    
      case "$ac_cv_header_windows_h" in
        yes)
          AC_DEFINE_UNQUOTED(HAVE_WINDOWS_H, 1,
            [Define to 1 if you have the windows.h header file.])
          AC_DEFINE_UNQUOTED(WIN32_LEAN_AND_MEAN, 1,
            [Define to avoid automatic inclusion of winsock.h])
          ;;
      esac
    
    dnl CURL_CHECK_NATIVE_WINDOWS
    dnl -------------------------------------------------
    dnl Check if building a native Windows target
    
    AC_DEFUN([CURL_CHECK_NATIVE_WINDOWS], [
      AC_REQUIRE([CURL_CHECK_HEADER_WINDOWS])dnl
      AC_CACHE_CHECK([whether build target is a native Windows one], [ac_cv_native_windows], [
        if test "$ac_cv_header_windows_h" = "no"; then
          ac_cv_native_windows="no"
        else
          AC_COMPILE_IFELSE([
    
            AC_LANG_PROGRAM([[
            ]],[[
    
    #if defined(__MINGW32__) || defined(__MINGW32CE__) || \
       (defined(_MSC_VER) && (defined(_WIN32) || defined(_WIN64)))
    
              int dummy=1;
    #else
              Not a native Windows build target.
    #endif
    
          ],[
            ac_cv_native_windows="yes"
          ],[
            ac_cv_native_windows="no"
          ])
        fi
      ])
      case "$ac_cv_native_windows" in
        yes)
          AC_DEFINE_UNQUOTED(NATIVE_WINDOWS, 1,
            [Define to 1 if you are building a native Windows target.])
          ;;
      esac
    ])
    
    
    
    dnl CURL_CHECK_HEADER_WINSOCK
    dnl -------------------------------------------------
    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
    
    #include <windows.h>
    #include <winsock.h>
    
    #if defined(__CYGWIN__) || defined(__CEGCC__)
    
            HAVE_WINSOCK_H shall not be defined.
    #else
    
        ],[
          ac_cv_header_winsock_h="yes"
        ],[
          ac_cv_header_winsock_h="no"
        ])
      ])
    
      case "$ac_cv_header_winsock_h" in
        yes)
          AC_DEFINE_UNQUOTED(HAVE_WINSOCK_H, 1,
            [Define to 1 if you have the winsock.h header file.])
          ;;
      esac
    
    ])
    
    
    dnl CURL_CHECK_HEADER_WINSOCK2
    dnl -------------------------------------------------
    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
    
    #include <windows.h>
    #include <winsock2.h>
    
    #if defined(__CYGWIN__) || defined(__CEGCC__) || defined(__MINGW32CE__)
    
            HAVE_WINSOCK2_H shall not be defined.
    #else
    
        ],[
          ac_cv_header_winsock2_h="yes"
        ],[
          ac_cv_header_winsock2_h="no"
        ])
      ])
    
      case "$ac_cv_header_winsock2_h" in
        yes)
          AC_DEFINE_UNQUOTED(HAVE_WINSOCK2_H, 1,
            [Define to 1 if you have the winsock2.h header file.])
          ;;
      esac
    
    ])
    
    
    dnl CURL_CHECK_HEADER_WS2TCPIP
    dnl -------------------------------------------------
    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>
    
    #if defined(__CYGWIN__) || defined(__CEGCC__) || defined(__MINGW32CE__)
    
            HAVE_WS2TCPIP_H shall not be defined.
    #else
    
        ],[
          ac_cv_header_ws2tcpip_h="yes"
        ],[
          ac_cv_header_ws2tcpip_h="no"
        ])
      ])
    
      case "$ac_cv_header_ws2tcpip_h" in
        yes)
          AC_DEFINE_UNQUOTED(HAVE_WS2TCPIP_H, 1,
            [Define to 1 if you have the ws2tcpip.h header file.])
          ;;
      esac
    
    dnl CURL_CHECK_HEADER_MALLOC
    dnl -------------------------------------------------
    dnl Check for compilable and valid malloc.h header,
    dnl and check if it is needed even with stdlib.h
    
    AC_DEFUN([CURL_CHECK_HEADER_MALLOC], [
      AC_CACHE_CHECK([for malloc.h], [ac_cv_header_malloc_h], [
        AC_COMPILE_IFELSE([
    
          AC_LANG_PROGRAM([[
    
            void *p = malloc(10);
            void *q = calloc(10,10);
            free(p);
            free(q);
    
        ],[
          ac_cv_header_malloc_h="yes"
        ],[
          ac_cv_header_malloc_h="no"
        ])
      ])
      if test "$ac_cv_header_malloc_h" = "yes"; then
        AC_DEFINE_UNQUOTED(HAVE_MALLOC_H, 1,
          [Define to 1 if you have the malloc.h header file.])
        #
        AC_COMPILE_IFELSE([
    
          AC_LANG_PROGRAM([[
    
            void *p = malloc(10);
            void *q = calloc(10,10);
            free(p);
            free(q);
    
        ],[
          curl_cv_need_header_malloc_h="no"
        ],[
          curl_cv_need_header_malloc_h="yes"
        ])
        #
        case "$curl_cv_need_header_malloc_h" in
          yes)
            AC_DEFINE_UNQUOTED(NEED_MALLOC_H, 1,
    
              [Define to 1 if you need the malloc.h header file even with stdlib.h])
    
    dnl CURL_CHECK_TYPE_SOCKLEN_T
    dnl -------------------------------------------------
    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
    
        dnl socklen_t not available
        AC_CACHE_CHECK([for socklen_t equivalent],
    
          [curl_cv_socklen_t_equiv], [
          curl_cv_socklen_t_equiv="unknown"
    
          for arg1 in 'int' 'SOCKET'; do
            for arg2 in "struct sockaddr" void; do
              for t in int size_t unsigned long "unsigned long"; do
    
                if test "$curl_cv_socklen_t_equiv" = "unknown"; then
                  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
    
    #define GETPEERNCALLCONV PASCAL
    
    #else
    #ifdef HAVE_SYS_TYPES_H
    #include <sys/types.h>
    #endif
    #ifdef HAVE_SYS_SOCKET_H
    #include <sys/socket.h>
    #endif
    
                      extern int GETPEERNCALLCONV getpeername($arg1, $arg2 *, $t *);
                    ]],[[
                      $t len=0;
                      getpeername(0,0,&len);
                    ]])
                  ],[
                    curl_cv_socklen_t_equiv="$t"
                  ])
                fi
    
        case "$curl_cv_socklen_t_equiv" in
          unknown)
            AC_MSG_ERROR([Cannot find a type to use in place of socklen_t])
            ;;
          *)
            AC_DEFINE_UNQUOTED(socklen_t, $curl_cv_socklen_t_equiv,
    
              [Type to use in place of socklen_t when system does not provide it.])
    
    #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_CHECK_FUNC_GETNAMEINFO
    
    dnl -------------------------------------------------
    
    dnl Test if the getnameinfo function is available, 
    dnl and check the types of five of its arguments.
    dnl If the function succeeds HAVE_GETNAMEINFO will be
    dnl defined, defining the types of the arguments in
    
    dnl GETNAMEINFO_TYPE_ARG1, GETNAMEINFO_TYPE_ARG2,
    
    dnl GETNAMEINFO_TYPE_ARG46 and GETNAMEINFO_TYPE_ARG7,
    dnl and also defining the type qualifier of first 
    dnl argument in GETNAMEINFO_QUAL_ARG1.
    
    AC_DEFUN([CURL_CHECK_FUNC_GETNAMEINFO], [
    
      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_MSG_CHECKING([for getnameinfo])
      AC_LINK_IFELSE([
    
        AC_LANG_FUNC_LINK_TRY([getnameinfo])
      ],[
        AC_MSG_RESULT([yes])
        curl_cv_getnameinfo="yes"
      ],[
        AC_MSG_RESULT([no])
        curl_cv_getnameinfo="no"
    
      ])
      #
      if test "$curl_cv_getnameinfo" != "yes"; then
        AC_MSG_CHECKING([deeper for getnameinfo])
    
          AC_LANG_PROGRAM([[
          ]],[[
    
        ],[
          AC_MSG_RESULT([yes])
          curl_cv_getnameinfo="yes"
        ],[
          AC_MSG_RESULT([but still no])
          curl_cv_getnameinfo="no"
    
        ])
      fi
      #
      if test "$curl_cv_getnameinfo" != "yes"; then
        AC_MSG_CHECKING([deeper and deeper for getnameinfo])
    
          AC_LANG_PROGRAM([[
    
    #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>
    #ifdef HAVE_WS2TCPIP_H
    #include <ws2tcpip.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_NETDB_H
    #include <netdb.h>
    #endif
    #endif
    
            getnameinfo(0, 0, 0, 0, 0, 0, 0);
    
        ],[
          AC_MSG_RESULT([yes])
          curl_cv_getnameinfo="yes"
        ],[
          AC_MSG_RESULT([but still no])
          curl_cv_getnameinfo="no"
    
        ])
      fi
      #
      if test "$curl_cv_getnameinfo" = "yes"; then
        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' 'DWORD'; do
                for gni_arg7 in 'int' 'unsigned int'; do
    
                  if test "$curl_cv_func_getnameinfo_args" = "unknown"; then
                    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"
                    ])
                  fi
    
        ]) # AC_CACHE_CHECK
        if test "$curl_cv_func_getnameinfo_args" = "unknown"; then
          AC_MSG_WARN([Cannot find proper types to use for getnameinfo args])
          AC_MSG_WARN([HAVE_GETNAMEINFO will not be defined])
        else
          gni_prev_IFS=$IFS; IFS=','
          set dummy `echo "$curl_cv_func_getnameinfo_args" | sed 's/\*/\*/g'`
          IFS=$gni_prev_IFS
          shift
    
          #
          gni_qual_type_arg1=$[1]
          #
    
          AC_DEFINE_UNQUOTED(GETNAMEINFO_TYPE_ARG2, $[2],
            [Define to the type of arg 2 for getnameinfo.])
          AC_DEFINE_UNQUOTED(GETNAMEINFO_TYPE_ARG46, $[3],
            [Define to the type of args 4 and 6 for getnameinfo.])
          AC_DEFINE_UNQUOTED(GETNAMEINFO_TYPE_ARG7, $[4],
            [Define to the type of arg 7 for getnameinfo.])
    
          prev_sh_opts=$-
    
          case $prev_sh_opts in
    
          #
          case "$gni_qual_type_arg1" in
    
              gni_qual_arg1=const
              gni_type_arg1=`echo $gni_qual_type_arg1 | sed 's/^const //'`
    
              gni_qual_arg1=
              gni_type_arg1=$gni_qual_type_arg1
    
          AC_DEFINE_UNQUOTED(GETNAMEINFO_QUAL_ARG1, $gni_qual_arg1,
            [Define to the type qualifier of arg 1 for getnameinfo.])
          AC_DEFINE_UNQUOTED(GETNAMEINFO_TYPE_ARG1, $gni_type_arg1,
            [Define to the type of arg 1 for getnameinfo.])
          #
    
          case $prev_sh_opts in
    
          AC_DEFINE_UNQUOTED(HAVE_GETNAMEINFO, 1,
            [Define to 1 if you have the getnameinfo function.])
          ac_cv_func_getnameinfo="yes"
        fi
    
    dnl TYPE_SOCKADDR_STORAGE
    dnl -------------------------------------------------
    dnl Check for struct sockaddr_storage. Most IPv6-enabled 
    dnl hosts have it, but 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>
    #endif
    #endif
       ])
    ])
    
    
    
    dnl CURL_CHECK_NI_WITHSCOPEID
    dnl -------------------------------------------------
    dnl Check for working NI_WITHSCOPEID in getnameinfo()
    
    AC_DEFUN([CURL_CHECK_NI_WITHSCOPEID], [
    
      AC_REQUIRE([CURL_CHECK_FUNC_GETNAMEINFO])dnl
      AC_REQUIRE([TYPE_SOCKADDR_STORAGE])dnl
    
      AC_CHECK_HEADERS(stdio.h sys/types.h sys/socket.h \
    
                       netdb.h netinet/in.h arpa/inet.h)
      #
    
      AC_CACHE_CHECK([for working NI_WITHSCOPEID], 
        [ac_cv_working_ni_withscopeid], [
        AC_RUN_IFELSE([
    
          AC_LANG_PROGRAM([[
    
    #endif
    #ifdef HAVE_NETINET_IN_H
    #include <netinet/in.h>
    #endif
    #ifdef HAVE_ARPA_INET_H
    #include <arpa/inet.h>
    #endif
    
    #if defined(NI_WITHSCOPEID) && defined(HAVE_GETNAMEINFO)
    #ifdef HAVE_STRUCT_SOCKADDR_STORAGE
            struct sockaddr_storage sa;
    #else
            unsigned char sa[256];
    #endif
            char hostbuf[NI_MAXHOST];
    
            GETNAMEINFO_TYPE_ARG2 salen = (GETNAMEINFO_TYPE_ARG2)sizeof(sa);
            GETNAMEINFO_TYPE_ARG46 hostlen = (GETNAMEINFO_TYPE_ARG46)sizeof(hostbuf);
            GETNAMEINFO_TYPE_ARG7 flags = NI_NUMERICHOST | NI_NUMERICSERV | NI_WITHSCOPEID;
    
            int fd = socket(AF_INET6, SOCK_STREAM, 0);
            if(fd < 0) {
              perror("socket()");
              return 1; /* Error creating socket */
            }
    
            rc = getsockname(fd, (GETNAMEINFO_TYPE_ARG1)&sa, &salen);
    
            if(rc) {
              perror("getsockname()");
              return 2; /* Error retrieving socket name */
            }
    
            rc = getnameinfo((GETNAMEINFO_TYPE_ARG1)&sa, salen, hostbuf, hostlen, NULL, 0, flags);
    
            if(rc) {
              printf("rc = %s\n", gai_strerror(rc));
              return 3; /* Error translating socket address */
            }
            return 0; /* Ok, NI_WITHSCOPEID works */
    #else
    
            return 4; /* Error, NI_WITHSCOPEID not defined or no getnameinfo() */
    
          ]]) # AC_LANG_PROGRAM
    
        ],[
          # Exit code == 0. Program worked.
          ac_cv_working_ni_withscopeid="yes"
        ],[
          # Exit code != 0. Program failed.
          ac_cv_working_ni_withscopeid="no"
        ],[
          # Program is not run when cross-compiling. So we assume
          # NI_WITHSCOPEID will work if we are able to compile it.
          AC_COMPILE_IFELSE([
    
            AC_LANG_PROGRAM([[
    
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netdb.h>
    
              unsigned int dummy= NI_NUMERICHOST | NI_NUMERICSERV | NI_WITHSCOPEID;
    
          ],[
            ac_cv_working_ni_withscopeid="yes"
          ],[
            ac_cv_working_ni_withscopeid="no"
          ]) # AC_COMPILE_IFELSE
        ]) # AC_RUN_IFELSE
      ]) # AC_CACHE_CHECK
    
      case "$ac_cv_working_ni_withscopeid" in
        yes)
          AC_DEFINE(HAVE_NI_WITHSCOPEID, 1,
            [Define to 1 if NI_WITHSCOPEID exists and works.])
          ;;
      esac
    
    dnl CURL_CHECK_FUNC_RECV
    dnl -------------------------------------------------
    dnl Test if the socket recv() function is available, 
    dnl and check its return type and the types of its 
    dnl arguments. If the function succeeds HAVE_RECV 
    dnl will be defined, defining the types of the arguments 
    dnl in RECV_TYPE_ARG1, RECV_TYPE_ARG2, RECV_TYPE_ARG3 
    dnl and RECV_TYPE_ARG4, defining the type of the function
    dnl return value in RECV_TYPE_RETV.
    
    AC_DEFUN([CURL_CHECK_FUNC_RECV], [
    
      AC_REQUIRE([CURL_CHECK_HEADER_WINSOCK])dnl
      AC_REQUIRE([CURL_CHECK_HEADER_WINSOCK2])dnl
    
      AC_CHECK_HEADERS(sys/types.h sys/socket.h)
    
        AC_LANG_PROGRAM([[
    
    #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>
    
      ],[
        AC_MSG_RESULT([yes])
        curl_cv_recv="yes"
      ],[
        AC_MSG_RESULT([no])
        curl_cv_recv="no"
    
        AC_CACHE_CHECK([types of args and return type for recv],
    
          [curl_cv_func_recv_args], [
          curl_cv_func_recv_args="unknown"
          for recv_retv in 'int' 'ssize_t'; do
    
            for recv_arg1 in 'int' 'ssize_t' 'SOCKET'; do
    
              for recv_arg2 in 'char *' 'void *'; do
    
                for recv_arg3 in 'size_t' 'int' 'socklen_t' 'unsigned int'; do
    
                    if test "$curl_cv_func_recv_args" = "unknown"; then
                      AC_COMPILE_IFELSE([
                        AC_LANG_PROGRAM([[
    
    #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
    
    #ifdef HAVE_SYS_TYPES_H
    #include <sys/types.h>
    #endif
    #ifdef HAVE_SYS_SOCKET_H
    #include <sys/socket.h>
    
                          extern $recv_retv RECVCALLCONV
                          recv($recv_arg1, $recv_arg2, $recv_arg3, $recv_arg4);
                        ]],[[
                          $recv_arg1 s=0;
                          $recv_arg2 buf=0;
                          $recv_arg3 len=0;
                          $recv_arg4 flags=0;
                          $recv_retv res = recv(s, buf, len, flags);
                        ]])
                      ],[
                        curl_cv_func_recv_args="$recv_arg1,$recv_arg2,$recv_arg3,$recv_arg4,$recv_retv"
                      ])
                    fi
    
                  done
                done
              done
            done
          done
        ]) # AC_CACHE_CHECK
        if test "$curl_cv_func_recv_args" = "unknown"; then
    
          AC_MSG_ERROR([Cannot find proper types to use for recv args])
    
        else
          recv_prev_IFS=$IFS; IFS=','
          set dummy `echo "$curl_cv_func_recv_args" | sed 's/\*/\*/g'`
          IFS=$recv_prev_IFS
          shift
          #
          AC_DEFINE_UNQUOTED(RECV_TYPE_ARG1, $[1],
            [Define to the type of arg 1 for recv.])
          AC_DEFINE_UNQUOTED(RECV_TYPE_ARG2, $[2],
            [Define to the type of arg 2 for recv.])
          AC_DEFINE_UNQUOTED(RECV_TYPE_ARG3, $[3],
            [Define to the type of arg 3 for recv.])
          AC_DEFINE_UNQUOTED(RECV_TYPE_ARG4, $[4],
            [Define to the type of arg 4 for recv.])
          AC_DEFINE_UNQUOTED(RECV_TYPE_RETV, $[5],
            [Define to the function return type for recv.])
          #
          AC_DEFINE_UNQUOTED(HAVE_RECV, 1,
            [Define to 1 if you have the recv function.])
          ac_cv_func_recv="yes"
        fi
    
      else
        AC_MSG_ERROR([Unable to link function recv])
    
      fi
    ]) # AC_DEFUN
    
    
    dnl CURL_CHECK_FUNC_SEND
    dnl -------------------------------------------------
    dnl Test if the socket send() function is available, 
    dnl and check its return type and the types of its 
    dnl arguments. If the function succeeds HAVE_SEND 
    dnl will be defined, defining the types of the arguments 
    dnl in SEND_TYPE_ARG1, SEND_TYPE_ARG2, SEND_TYPE_ARG3 
    dnl and SEND_TYPE_ARG4, defining the type of the function
    
    dnl return value in SEND_TYPE_RETV, and also defining the 
    dnl type qualifier of second argument in SEND_QUAL_ARG2.
    
      AC_REQUIRE([CURL_CHECK_HEADER_WINSOCK])dnl
      AC_REQUIRE([CURL_CHECK_HEADER_WINSOCK2])dnl
    
      AC_CHECK_HEADERS(sys/types.h sys/socket.h)
    
        AC_LANG_PROGRAM([[
    
    #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>
    
      ],[
        AC_MSG_RESULT([yes])
        curl_cv_send="yes"
      ],[
        AC_MSG_RESULT([no])
        curl_cv_send="no"
    
        AC_CACHE_CHECK([types of args and return type for send],
    
          [curl_cv_func_send_args], [
          curl_cv_func_send_args="unknown"
          for send_retv in 'int' 'ssize_t'; do
    
            for send_arg1 in 'int' 'ssize_t' 'SOCKET'; do
    
              for send_arg2 in 'char *' 'void *' 'const char *' 'const void *'; do
    
                for send_arg3 in 'size_t' 'int' 'socklen_t' 'unsigned int'; do
    
                    if test "$curl_cv_func_send_args" = "unknown"; then
                      AC_COMPILE_IFELSE([
                        AC_LANG_PROGRAM([[
    
    #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
    
    #ifdef HAVE_SYS_TYPES_H
    #include <sys/types.h>
    #endif
    #ifdef HAVE_SYS_SOCKET_H
    #include <sys/socket.h>
    
                          extern $send_retv SENDCALLCONV
                          send($send_arg1, $send_arg2, $send_arg3, $send_arg4);
                        ]],[[
                          $send_arg1 s=0;
                          $send_arg3 len=0;
                          $send_arg4 flags=0;
                          $send_retv res = send(s, 0, len, flags);
                        ]])
                      ],[
                        curl_cv_func_send_args="$send_arg1,$send_arg2,$send_arg3,$send_arg4,$send_retv"
                      ])
                    fi
    
                  done
                done
              done
            done
          done
        ]) # AC_CACHE_CHECK
        if test "$curl_cv_func_send_args" = "unknown"; then
    
          AC_MSG_ERROR([Cannot find proper types to use for send args])
    
        else
          send_prev_IFS=$IFS; IFS=','
          set dummy `echo "$curl_cv_func_send_args" | sed 's/\*/\*/g'`
          IFS=$send_prev_IFS