Skip to content
Snippets Groups Projects
cares-functions.m4 37.3 KiB
Newer Older
  • Learn to ignore specific revisions
  • #***************************************************************************
    # $Id$
    #
    # Copyright (C) 2008 by Daniel Stenberg et al
    #
    # Permission to use, copy, modify, and distribute this software and its
    # documentation for any purpose and without fee is hereby granted, provided
    # that the above copyright notice appear in all copies and that both that
    # copyright notice and this permission notice appear in supporting
    # documentation, and that the name of M.I.T. not be used in advertising or
    # publicity pertaining to distribution of the software without specific,
    # written prior permission.  M.I.T. makes no representations about the
    # suitability of this software for any purpose.  It is provided "as is"
    # without express or implied warranty.
    #
    #***************************************************************************
    
    # File version for 'aclocal' use. Keep it a single number.
    
    # serial 10
    
    
    
    dnl CARES_INCLUDES_ARPA_INET
    dnl -------------------------------------------------
    dnl Set up variable with list of headers that must be
    dnl included when arpa/inet.h is to be included.
    
    AC_DEFUN([CARES_INCLUDES_ARPA_INET], [
    cares_includes_arpa_inet="\
    /* includes start */
    #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
    /* includes end */"
      AC_CHECK_HEADERS(
        sys/types.h sys/socket.h netinet/in.h arpa/inet.h,
        [], [], [$cares_includes_arpa_inet])
    ])
    
    
    
    dnl CARES_INCLUDES_NETDB
    dnl -------------------------------------------------
    dnl Set up variable with list of headers that must be
    dnl included when netdb.h is to be included.
    
    AC_DEFUN([CARES_INCLUDES_NETDB], [
    cares_includes_netdb="\
    /* includes start */
    #ifdef HAVE_SYS_TYPES_H
    #  include <sys/types.h>
    #endif
    #ifdef HAVE_NETDB_H
    #  include <netdb.h>
    #endif
    /* includes end */"
      AC_CHECK_HEADERS(
        sys/types.h netdb.h,
        [], [], [$cares_includes_netdb])
    ])
    
    dnl CARES_INCLUDES_STDLIB
    dnl -------------------------------------------------
    dnl Set up variable with list of headers that must be
    dnl included when stdlib.h is to be included.
    
    AC_DEFUN([CARES_INCLUDES_STDLIB], [
    cares_includes_stdlib="\
    /* includes start */
    #ifdef HAVE_SYS_TYPES_H
    #  include <sys/types.h>
    #endif
    #ifdef HAVE_STDLIB_H
    #  include <stdlib.h>
    #endif
    /* includes end */"
      AC_CHECK_HEADERS(
        sys/types.h stdlib.h,
        [], [], [$cares_includes_stdlib])
    ])
    
    
    
    dnl CARES_INCLUDES_STRING
    dnl -------------------------------------------------
    dnl Set up variable with list of headers that must be
    
    Yang Tse's avatar
    Yang Tse committed
    dnl included when string(s).h is to be included.
    
    
    AC_DEFUN([CARES_INCLUDES_STRING], [
    cares_includes_string="\
    /* includes start */
    #ifdef HAVE_SYS_TYPES_H
    #  include <sys/types.h>
    #endif
    #ifdef HAVE_STRING_H
    #  include <string.h>
    #endif
    
    Yang Tse's avatar
    Yang Tse committed
    #ifdef HAVE_STRINGS_H
    #  include <strings.h>
    #endif
    
    /* includes end */"
      AC_CHECK_HEADERS(
    
    Yang Tse's avatar
    Yang Tse committed
        sys/types.h string.h strings.h,
    
        [], [], [$cares_includes_string])
    ])
    
    
    
    dnl CARES_INCLUDES_SYS_UIO
    dnl -------------------------------------------------
    dnl Set up variable with list of headers that must be
    dnl included when sys/uio.h is to be included.
    
    AC_DEFUN([CARES_INCLUDES_SYS_UIO], [
    cares_includes_sys_uio="\
    /* includes start */
    #ifdef HAVE_SYS_TYPES_H
    #  include <sys/types.h>
    #endif
    #ifdef HAVE_SYS_UIO_H
    #  include <sys/uio.h>
    #endif
    /* includes end */"
      AC_CHECK_HEADERS(
        sys/types.h sys/uio.h,
        [], [], [$cares_includes_sys_uio])
    ])
    
    
    
    dnl CARES_INCLUDES_UNISTD
    dnl -------------------------------------------------
    dnl Set up variable with list of headers that must be
    dnl included when unistd.h is to be included.
    
    AC_DEFUN([CARES_INCLUDES_UNISTD], [
    cares_includes_unistd="\
    /* includes start */
    #ifdef HAVE_SYS_TYPES_H
    #  include <sys/types.h>
    #endif
    #ifdef HAVE_UNISTD_H
    #  include <unistd.h>
    #endif
    /* includes end */"
      AC_CHECK_HEADERS(
        sys/types.h unistd.h,
        [], [], [$cares_includes_unistd])
    ])
    
    
    
    dnl CARES_INCLUDES_WINSOCK2
    dnl -------------------------------------------------
    dnl Set up variable with list of headers that must be
    dnl included when winsock(2).h is to be included.
    
    AC_DEFUN([CARES_INCLUDES_WINSOCK2], [
    cares_includes_winsock2="\
    /* includes start */
    #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
    /* includes end */"
      CURL_CHECK_HEADER_WINDOWS
      CURL_CHECK_HEADER_WINSOCK
      CURL_CHECK_HEADER_WINSOCK2
    ])
    
    
    
    dnl CARES_CHECK_FUNC_GETHOSTNAME
    dnl -------------------------------------------------
    dnl Verify if gethostname is available, prototyped, and
    dnl can be compiled. If all of these are true, and
    dnl usage has not been previously disallowed with
    dnl shell variable cares_disallow_gethostname, then
    dnl HAVE_GETHOSTNAME will be defined.
    
    AC_DEFUN([CARES_CHECK_FUNC_GETHOSTNAME], [
    
      AC_REQUIRE([CARES_INCLUDES_WINSOCK2])dnl
    
      AC_REQUIRE([CARES_INCLUDES_UNISTD])dnl
      #
      tst_links_gethostname="unknown"
      tst_proto_gethostname="unknown"
      tst_compi_gethostname="unknown"
      tst_allow_gethostname="unknown"
      #
      AC_MSG_CHECKING([if gethostname can be linked])
      AC_LINK_IFELSE([
    
        AC_LANG_PROGRAM([[
          $cares_includes_winsock2
          $cares_includes_unistd
        ]],[[
          if(0 != gethostname(0, 0))
            return 1;
        ]])
    
      ],[
        AC_MSG_RESULT([yes])
        tst_links_gethostname="yes"
      ],[
        AC_MSG_RESULT([no])
        tst_links_gethostname="no"
      ])
      #
      if test "$tst_links_gethostname" = "yes"; then
        AC_MSG_CHECKING([if gethostname is prototyped])
        AC_EGREP_CPP([gethostname],[
    
          $cares_includes_winsock2
    
          $cares_includes_unistd
        ],[
          AC_MSG_RESULT([yes])
          tst_proto_gethostname="yes"
        ],[
          AC_MSG_RESULT([no])
          tst_proto_gethostname="no"
        ])
      fi
      #
      if test "$tst_proto_gethostname" = "yes"; then
        AC_MSG_CHECKING([if gethostname is compilable])
        AC_COMPILE_IFELSE([
          AC_LANG_PROGRAM([[
    
            $cares_includes_winsock2
    
            $cares_includes_unistd
          ]],[[
            if(0 != gethostname(0, 0))
              return 1;
          ]])
        ],[
          AC_MSG_RESULT([yes])
          tst_compi_gethostname="yes"
        ],[
          AC_MSG_RESULT([no])
          tst_compi_gethostname="no"
        ])
      fi
      #
      if test "$tst_compi_gethostname" = "yes"; then
        AC_MSG_CHECKING([if gethostname usage allowed])
        if test "x$cares_disallow_gethostname" != "xyes"; then
          AC_MSG_RESULT([yes])
          tst_allow_gethostname="yes"
        else
          AC_MSG_RESULT([no])
          tst_allow_gethostname="no"
        fi
      fi
      #
      AC_MSG_CHECKING([if gethostname might be used])
      if test "$tst_links_gethostname" = "yes" &&
         test "$tst_proto_gethostname" = "yes" &&
         test "$tst_compi_gethostname" = "yes" &&
         test "$tst_allow_gethostname" = "yes"; then
        AC_MSG_RESULT([yes])
        AC_DEFINE_UNQUOTED(HAVE_GETHOSTNAME, 1,
          [Define to 1 if you have the gethostname function.])
        ac_cv_func_gethostname="yes"
      else
        AC_MSG_RESULT([no])
        ac_cv_func_gethostname="no"
      fi
    ])
    
    
    
    dnl CARES_CHECK_FUNC_GETSERVBYPORT_R
    dnl -------------------------------------------------
    dnl Verify if getservbyport_r is available, prototyped,
    dnl and can be compiled. If all of these are true, and
    dnl usage has not been previously disallowed with
    dnl shell variable cares_disallow_getservbyport_r, then
    dnl HAVE_GETSERVBYPORT_R will be defined.
    
    AC_DEFUN([CARES_CHECK_FUNC_GETSERVBYPORT_R], [
    
      AC_REQUIRE([CARES_INCLUDES_NETDB])dnl
    
      #
      tst_links_getservbyport_r="unknown"
      tst_proto_getservbyport_r="unknown"
      tst_compi_getservbyport_r="unknown"
      tst_allow_getservbyport_r="unknown"
      tst_nargs_getservbyport_r="unknown"
      #
      AC_MSG_CHECKING([if getservbyport_r can be linked])
      AC_LINK_IFELSE([
        AC_LANG_FUNC_LINK_TRY([getservbyport_r])
      ],[
        AC_MSG_RESULT([yes])
        tst_links_getservbyport_r="yes"
      ],[
        AC_MSG_RESULT([no])
        tst_links_getservbyport_r="no"
      ])
      #
      if test "$tst_links_getservbyport_r" = "yes"; then
        AC_MSG_CHECKING([if getservbyport_r is prototyped])
        AC_EGREP_CPP([getservbyport_r],[
          $cares_includes_netdb
        ],[
          AC_MSG_RESULT([yes])
          tst_proto_getservbyport_r="yes"
        ],[
          AC_MSG_RESULT([no])
          tst_proto_getservbyport_r="no"
        ])
      fi
      #
      if test "$tst_proto_getservbyport_r" = "yes"; then
        if test "$tst_nargs_getservbyport_r" = "unknown"; then
          AC_MSG_CHECKING([if getservbyport_r takes 4 args.])
          AC_COMPILE_IFELSE([
            AC_LANG_PROGRAM([[
              $cares_includes_netdb
            ]],[[
              if(0 != getservbyport_r(0, 0, 0, 0))
                return 1;
            ]])
          ],[
            AC_MSG_RESULT([yes])
            tst_compi_getservbyport_r="yes"
            tst_nargs_getservbyport_r="4"
          ],[
            AC_MSG_RESULT([no])
            tst_compi_getservbyport_r="no"
          ])
        fi
        if test "$tst_nargs_getservbyport_r" = "unknown"; then
          AC_MSG_CHECKING([if getservbyport_r takes 5 args.])
          AC_COMPILE_IFELSE([
            AC_LANG_PROGRAM([[
              $cares_includes_netdb
            ]],[[
              if(0 != getservbyport_r(0, 0, 0, 0, 0))
                return 1;
            ]])
          ],[
            AC_MSG_RESULT([yes])
            tst_compi_getservbyport_r="yes"
            tst_nargs_getservbyport_r="5"
          ],[
            AC_MSG_RESULT([no])
            tst_compi_getservbyport_r="no"
          ])
        fi
        if test "$tst_nargs_getservbyport_r" = "unknown"; then
          AC_MSG_CHECKING([if getservbyport_r takes 6 args.])
          AC_COMPILE_IFELSE([
            AC_LANG_PROGRAM([[
              $cares_includes_netdb
            ]],[[
              if(0 != getservbyport_r(0, 0, 0, 0, 0, 0))
                return 1;
            ]])
          ],[
            AC_MSG_RESULT([yes])
            tst_compi_getservbyport_r="yes"
            tst_nargs_getservbyport_r="6"
          ],[
            AC_MSG_RESULT([no])
            tst_compi_getservbyport_r="no"
          ])
        fi
        AC_MSG_CHECKING([if getservbyport_r is compilable])
        if test "$tst_compi_getservbyport_r" = "yes"; then
          AC_MSG_RESULT([yes])
        else
          AC_MSG_RESULT([no])
        fi
      fi
      #
      if test "$tst_compi_getservbyport_r" = "yes"; then
        AC_MSG_CHECKING([if getservbyport_r usage allowed])
        if test "x$cares_disallow_getservbyport_r" != "xyes"; then
          AC_MSG_RESULT([yes])
          tst_allow_getservbyport_r="yes"
        else
          AC_MSG_RESULT([no])
          tst_allow_getservbyport_r="no"
        fi
      fi
      #
      AC_MSG_CHECKING([if getservbyport_r might be used])
      if test "$tst_links_getservbyport_r" = "yes" &&
         test "$tst_proto_getservbyport_r" = "yes" &&
         test "$tst_compi_getservbyport_r" = "yes" &&
         test "$tst_allow_getservbyport_r" = "yes"; then
        AC_MSG_RESULT([yes])
        AC_DEFINE_UNQUOTED(HAVE_GETSERVBYPORT_R, 1,
          [Define to 1 if you have the getservbyport_r function.])
        AC_DEFINE_UNQUOTED(GETSERVBYPORT_R_ARGS, $tst_nargs_getservbyport_r,
          [Specifies the number of arguments to getservbyport_r])
        if test "$tst_nargs_getservbyport_r" -eq "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
        ac_cv_func_getservbyport_r="yes"
      else
        AC_MSG_RESULT([no])
        ac_cv_func_getservbyport_r="no"
      fi
    ])
    
    
    
    dnl CARES_CHECK_FUNC_INET_NTOP
    dnl -------------------------------------------------
    dnl Verify if inet_ntop is available, prototyped, can
    dnl be compiled and seems to work. If all of these are
    dnl true, and usage has not been previously disallowed
    dnl with shell variable cares_disallow_inet_ntop, then
    dnl HAVE_INET_NTOP will be defined.
    
    AC_DEFUN([CARES_CHECK_FUNC_INET_NTOP], [
    
      AC_REQUIRE([CARES_INCLUDES_STDLIB])dnl
    
      AC_REQUIRE([CARES_INCLUDES_ARPA_INET])dnl
      AC_REQUIRE([CARES_INCLUDES_STRING])dnl
      #
      tst_links_inet_ntop="unknown"
      tst_proto_inet_ntop="unknown"
      tst_compi_inet_ntop="unknown"
      tst_works_inet_ntop="unknown"
      tst_allow_inet_ntop="unknown"
      #
      AC_MSG_CHECKING([if inet_ntop can be linked])
      AC_LINK_IFELSE([
        AC_LANG_FUNC_LINK_TRY([inet_ntop])
      ],[
        AC_MSG_RESULT([yes])
        tst_links_inet_ntop="yes"
      ],[
        AC_MSG_RESULT([no])
        tst_links_inet_ntop="no"
      ])
      #
      if test "$tst_links_inet_ntop" = "yes"; then
        AC_MSG_CHECKING([if inet_ntop is prototyped])
        AC_EGREP_CPP([inet_ntop],[
          $cares_includes_arpa_inet
        ],[
          AC_MSG_RESULT([yes])
          tst_proto_inet_ntop="yes"
        ],[
          AC_MSG_RESULT([no])
          tst_proto_inet_ntop="no"
        ])
      fi
      #
      if test "$tst_proto_inet_ntop" = "yes"; then
        AC_MSG_CHECKING([if inet_ntop is compilable])
        AC_COMPILE_IFELSE([
          AC_LANG_PROGRAM([[
            $cares_includes_arpa_inet
          ]],[[
            if(0 != inet_ntop(0, 0, 0, 0))
              return 1;
          ]])
        ],[
          AC_MSG_RESULT([yes])
          tst_compi_inet_ntop="yes"
        ],[
          AC_MSG_RESULT([no])
          tst_compi_inet_ntop="no"
        ])
      fi
      #
      dnl only do runtime verification when not cross-compiling
      if test "x$cross_compiling" != "xyes" &&
        test "$tst_compi_inet_ntop" = "yes"; then
        AC_MSG_CHECKING([if inet_ntop seems to work])
        AC_RUN_IFELSE([
          AC_LANG_PROGRAM([[
    
            $cares_includes_stdlib
    
            $cares_includes_arpa_inet
            $cares_includes_string
          ]],[[
            char ipv6res[sizeof("ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255")];
            char ipv4res[sizeof "255.255.255.255"];
            unsigned char ipv6a[26];
            unsigned char ipv4a[5];
            char *ipv6ptr = 0;
            char *ipv4ptr = 0;
            /* - */
            ipv4res[0] = '\0';
            ipv4a[0] = 0xc0;
            ipv4a[1] = 0xa8;
            ipv4a[2] = 0x64;
            ipv4a[3] = 0x01;
            ipv4a[4] = 0x01;
            /* - */
            ipv4ptr = inet_ntop(AF_INET, ipv4a, ipv4res, sizeof(ipv4res));
            if(!ipv4ptr)
              exit(1); /* fail */
            if(ipv4ptr != ipv4res)
              exit(1); /* fail */
            if(!ipv4ptr[0])
              exit(1); /* fail */
            if(memcmp(ipv4res, "192.168.100.1", 13) != 0)
              exit(1); /* fail */
            /* - */
            ipv6res[0] = '\0';
            memset(ipv6a, 0, sizeof(ipv6a));
            ipv6a[0] = 0xfe;
            ipv6a[1] = 0x80;
            ipv6a[8] = 0x02;
            ipv6a[9] = 0x14;
            ipv6a[10] = 0x4f;
            ipv6a[11] = 0xff;
            ipv6a[12] = 0xfe;
            ipv6a[13] = 0x0b;
            ipv6a[14] = 0x76;
            ipv6a[15] = 0xc8;
            ipv6a[25] = 0x01;
            /* - */
            ipv6ptr = inet_ntop(AF_INET6, ipv6a, ipv6res, sizeof(ipv6res));
            if(!ipv6ptr)
              exit(1); /* fail */
            if(ipv6ptr != ipv6res)
              exit(1); /* fail */
            if(!ipv6ptr[0])
              exit(1); /* fail */
            if(memcmp(ipv6res, "fe80::214:4fff:fe0b:76c8", 24) != 0)
              exit(1); /* fail */
            /* - */
            exit(0);
          ]])
        ],[
          AC_MSG_RESULT([yes])
          tst_works_inet_ntop="yes"
        ],[
          AC_MSG_RESULT([no])
          tst_works_inet_ntop="no"
        ])
      fi
      #
      if test "$tst_compi_inet_ntop" = "yes" &&
        test "$tst_works_inet_ntop" != "no"; then
        AC_MSG_CHECKING([if inet_ntop usage allowed])
        if test "x$cares_disallow_inet_ntop" != "xyes"; then
          AC_MSG_RESULT([yes])
          tst_allow_inet_ntop="yes"
        else
          AC_MSG_RESULT([no])
          tst_allow_inet_ntop="no"
        fi
      fi
      #
      AC_MSG_CHECKING([if inet_ntop might be used])
      if test "$tst_links_inet_ntop" = "yes" &&
         test "$tst_proto_inet_ntop" = "yes" &&
         test "$tst_compi_inet_ntop" = "yes" &&
         test "$tst_allow_inet_ntop" = "yes" &&
         test "$tst_works_inet_ntop" != "no"; then
        AC_MSG_RESULT([yes])
        AC_DEFINE_UNQUOTED(HAVE_INET_NTOP, 1,
          [Define to 1 if you have a IPv6 capable working inet_ntop function.])
        ac_cv_func_inet_ntop="yes"
      else
        AC_MSG_RESULT([no])
        ac_cv_func_inet_ntop="no"
      fi
    ])
    
    
    
    dnl CARES_CHECK_FUNC_INET_PTON
    dnl -------------------------------------------------
    dnl Verify if inet_pton is available, prototyped, can
    dnl be compiled and seems to work. If all of these are
    dnl true, and usage has not been previously disallowed
    dnl with shell variable cares_disallow_inet_pton, then
    dnl HAVE_INET_PTON will be defined.
    
    AC_DEFUN([CARES_CHECK_FUNC_INET_PTON], [
    
      AC_REQUIRE([CARES_INCLUDES_STDLIB])dnl
    
      AC_REQUIRE([CARES_INCLUDES_ARPA_INET])dnl
      AC_REQUIRE([CARES_INCLUDES_STRING])dnl
      #
      tst_links_inet_pton="unknown"
      tst_proto_inet_pton="unknown"
      tst_compi_inet_pton="unknown"
      tst_works_inet_pton="unknown"
      tst_allow_inet_pton="unknown"
      #
      AC_MSG_CHECKING([if inet_pton can be linked])
      AC_LINK_IFELSE([
        AC_LANG_FUNC_LINK_TRY([inet_pton])
      ],[
        AC_MSG_RESULT([yes])
        tst_links_inet_pton="yes"
      ],[
        AC_MSG_RESULT([no])
        tst_links_inet_pton="no"
      ])
      #
      if test "$tst_links_inet_pton" = "yes"; then
        AC_MSG_CHECKING([if inet_pton is prototyped])
        AC_EGREP_CPP([inet_pton],[
          $cares_includes_arpa_inet
        ],[
          AC_MSG_RESULT([yes])
          tst_proto_inet_pton="yes"
        ],[
          AC_MSG_RESULT([no])
          tst_proto_inet_pton="no"
        ])
      fi
      #
      if test "$tst_proto_inet_pton" = "yes"; then
        AC_MSG_CHECKING([if inet_pton is compilable])
        AC_COMPILE_IFELSE([
          AC_LANG_PROGRAM([[
            $cares_includes_arpa_inet
          ]],[[
            if(0 != inet_pton(0, 0, 0))
              return 1;
          ]])
        ],[
          AC_MSG_RESULT([yes])
          tst_compi_inet_pton="yes"
        ],[
          AC_MSG_RESULT([no])
          tst_compi_inet_pton="no"
        ])
      fi
      #
      dnl only do runtime verification when not cross-compiling
      if test "x$cross_compiling" != "xyes" &&
        test "$tst_compi_inet_pton" = "yes"; then
        AC_MSG_CHECKING([if inet_pton seems to work])
        AC_RUN_IFELSE([
          AC_LANG_PROGRAM([[
    
            $cares_includes_stdlib
    
            $cares_includes_arpa_inet
            $cares_includes_string
          ]],[[
            unsigned char ipv6a[26];
            unsigned char ipv4a[5];
            const char *ipv6src = "fe80::214:4fff:fe0b:76c8";
            const char *ipv4src = "192.168.100.1";
            /* - */
            memset(ipv4a, 1, sizeof(ipv4a));
            if(1 != inet_pton(AF_INET, ipv4src, ipv4a))
              exit(1); /* fail */
            /* - */
            if( (ipv4a[0] != 0xc0) ||
                (ipv4a[1] != 0xa8) ||
                (ipv4a[2] != 0x64) ||
                (ipv4a[3] != 0x01) ||
                (ipv4a[4] != 0x01) )
              exit(1); /* fail */
            /* - */
            memset(ipv6a, 1, sizeof(ipv6a));
            if(1 != inet_pton(AF_INET6, ipv6src, ipv6a))
              exit(1); /* fail */
            /* - */
            ipv6res[0] = '\0';
            memset(ipv6a, 0, sizeof(ipv6a));
            if( (ipv6a[0]  != 0xfe) ||
                (ipv6a[1]  != 0x80) ||
                (ipv6a[8]  != 0x02) ||
                (ipv6a[9]  != 0x14) ||
                (ipv6a[10] != 0x4f) ||
                (ipv6a[11] != 0xff) ||
                (ipv6a[12] != 0xfe) ||
                (ipv6a[13] != 0x0b) ||
                (ipv6a[14] != 0x76) ||
                (ipv6a[15] != 0xc8) ||
                (ipv6a[25] != 0x01) )
              exit(1); /* fail */
            /* - */
            if( (ipv6a[2]  != 0x0) ||
                (ipv6a[3]  != 0x0) ||
                (ipv6a[4]  != 0x0) ||
                (ipv6a[5]  != 0x0) ||
                (ipv6a[6]  != 0x0) ||
                (ipv6a[7]  != 0x0) ||
                (ipv6a[16] != 0x0) ||
                (ipv6a[17] != 0x0) ||
                (ipv6a[18] != 0x0) ||
                (ipv6a[19] != 0x0) ||
                (ipv6a[20] != 0x0) ||
                (ipv6a[21] != 0x0) ||
                (ipv6a[22] != 0x0) ||
                (ipv6a[23] != 0x0) ||
                (ipv6a[24] != 0x0) )
              exit(1); /* fail */
            /* - */
            exit(0);
          ]])
        ],[
          AC_MSG_RESULT([yes])
          tst_works_inet_pton="yes"
        ],[
          AC_MSG_RESULT([no])
          tst_works_inet_pton="no"
        ])
      fi
      #
      if test "$tst_compi_inet_pton" = "yes" &&
        test "$tst_works_inet_pton" != "no"; then
        AC_MSG_CHECKING([if inet_pton usage allowed])
        if test "x$cares_disallow_inet_pton" != "xyes"; then
          AC_MSG_RESULT([yes])
          tst_allow_inet_pton="yes"
        else
          AC_MSG_RESULT([no])
          tst_allow_inet_pton="no"
        fi
      fi
      #
      AC_MSG_CHECKING([if inet_pton might be used])
      if test "$tst_links_inet_pton" = "yes" &&
         test "$tst_proto_inet_pton" = "yes" &&
         test "$tst_compi_inet_pton" = "yes" &&
         test "$tst_allow_inet_pton" = "yes" &&
         test "$tst_works_inet_pton" != "no"; then
        AC_MSG_RESULT([yes])
        AC_DEFINE_UNQUOTED(HAVE_INET_PTON, 1,
          [Define to 1 if you have a IPv6 capable working inet_pton function.])
        ac_cv_func_inet_pton="yes"
      else
        AC_MSG_RESULT([no])
        ac_cv_func_inet_pton="no"
      fi
    ])
    
    
    
    Yang Tse's avatar
    Yang Tse committed
    dnl CARES_CHECK_FUNC_STRCASECMP
    dnl -------------------------------------------------
    dnl Verify if strcasecmp is available, prototyped, and
    dnl can be compiled. If all of these are true, and
    dnl usage has not been previously disallowed with
    dnl shell variable cares_disallow_strcasecmp, then
    dnl HAVE_STRCASECMP will be defined.
    
    AC_DEFUN([CARES_CHECK_FUNC_STRCASECMP], [
      AC_REQUIRE([CARES_INCLUDES_STRING])dnl
      #
      tst_links_strcasecmp="unknown"
      tst_proto_strcasecmp="unknown"
      tst_compi_strcasecmp="unknown"
      tst_allow_strcasecmp="unknown"
      #
      AC_MSG_CHECKING([if strcasecmp can be linked])
      AC_LINK_IFELSE([
        AC_LANG_FUNC_LINK_TRY([strcasecmp])
      ],[
        AC_MSG_RESULT([yes])
        tst_links_strcasecmp="yes"
      ],[
        AC_MSG_RESULT([no])
        tst_links_strcasecmp="no"
      ])
      #
      if test "$tst_links_strcasecmp" = "yes"; then
        AC_MSG_CHECKING([if strcasecmp is prototyped])
        AC_EGREP_CPP([strcasecmp],[
          $cares_includes_string
        ],[
          AC_MSG_RESULT([yes])
          tst_proto_strcasecmp="yes"
        ],[
          AC_MSG_RESULT([no])
          tst_proto_strcasecmp="no"
        ])
      fi
      #
      if test "$tst_proto_strcasecmp" = "yes"; then
        AC_MSG_CHECKING([if strcasecmp is compilable])
        AC_COMPILE_IFELSE([
          AC_LANG_PROGRAM([[
            $cares_includes_string
          ]],[[
            if(0 != strcasecmp(0, 0))
              return 1;
          ]])
        ],[
          AC_MSG_RESULT([yes])
          tst_compi_strcasecmp="yes"
        ],[
          AC_MSG_RESULT([no])
          tst_compi_strcasecmp="no"
        ])
      fi
      #
      if test "$tst_compi_strcasecmp" = "yes"; then
        AC_MSG_CHECKING([if strcasecmp usage allowed])
        if test "x$cares_disallow_strcasecmp" != "xyes"; then
          AC_MSG_RESULT([yes])
          tst_allow_strcasecmp="yes"
        else
          AC_MSG_RESULT([no])
          tst_allow_strcasecmp="no"
        fi
      fi
      #
      AC_MSG_CHECKING([if strcasecmp might be used])
      if test "$tst_links_strcasecmp" = "yes" &&
         test "$tst_proto_strcasecmp" = "yes" &&
         test "$tst_compi_strcasecmp" = "yes" &&
         test "$tst_allow_strcasecmp" = "yes"; then
        AC_MSG_RESULT([yes])
        AC_DEFINE_UNQUOTED(HAVE_STRCASECMP, 1,
          [Define to 1 if you have the strcasecmp function.])
        ac_cv_func_strcasecmp="yes"
      else
        AC_MSG_RESULT([no])
        ac_cv_func_strcasecmp="no"
      fi
    ])
    
    
    dnl CARES_CHECK_FUNC_STRCMPI
    dnl -------------------------------------------------
    dnl Verify if strcmpi is available, prototyped, and
    dnl can be compiled. If all of these are true, and
    dnl usage has not been previously disallowed with
    dnl shell variable cares_disallow_strcmpi, then
    dnl HAVE_STRCMPI will be defined.
    
    AC_DEFUN([CARES_CHECK_FUNC_STRCMPI], [
      AC_REQUIRE([CARES_INCLUDES_STRING])dnl
      #
      tst_links_strcmpi="unknown"
      tst_proto_strcmpi="unknown"
      tst_compi_strcmpi="unknown"
      tst_allow_strcmpi="unknown"
      #
      AC_MSG_CHECKING([if strcmpi can be linked])
      AC_LINK_IFELSE([
        AC_LANG_FUNC_LINK_TRY([strcmpi])
      ],[
        AC_MSG_RESULT([yes])
        tst_links_strcmpi="yes"
      ],[
        AC_MSG_RESULT([no])
        tst_links_strcmpi="no"
      ])
      #
      if test "$tst_links_strcmpi" = "yes"; then
        AC_MSG_CHECKING([if strcmpi is prototyped])
        AC_EGREP_CPP([strcmpi],[
          $cares_includes_string
        ],[
          AC_MSG_RESULT([yes])
          tst_proto_strcmpi="yes"
        ],[
          AC_MSG_RESULT([no])
          tst_proto_strcmpi="no"
        ])
      fi
      #
      if test "$tst_proto_strcmpi" = "yes"; then
        AC_MSG_CHECKING([if strcmpi is compilable])
        AC_COMPILE_IFELSE([
          AC_LANG_PROGRAM([[
            $cares_includes_string
          ]],[[
            if(0 != strcmpi(0, 0))
              return 1;
          ]])
        ],[
          AC_MSG_RESULT([yes])
          tst_compi_strcmpi="yes"
        ],[
          AC_MSG_RESULT([no])
          tst_compi_strcmpi="no"
        ])
      fi
      #
      if test "$tst_compi_strcmpi" = "yes"; then
        AC_MSG_CHECKING([if strcmpi usage allowed])
        if test "x$cares_disallow_strcmpi" != "xyes"; then
          AC_MSG_RESULT([yes])
          tst_allow_strcmpi="yes"
        else
          AC_MSG_RESULT([no])
          tst_allow_strcmpi="no"
        fi
      fi
      #
      AC_MSG_CHECKING([if strcmpi might be used])
      if test "$tst_links_strcmpi" = "yes" &&
         test "$tst_proto_strcmpi" = "yes" &&
         test "$tst_compi_strcmpi" = "yes" &&
         test "$tst_allow_strcmpi" = "yes"; then
        AC_MSG_RESULT([yes])
        AC_DEFINE_UNQUOTED(HAVE_STRCMPI, 1,
          [Define to 1 if you have the strcmpi function.])
        ac_cv_func_strcmpi="yes"
      else
        AC_MSG_RESULT([no])
        ac_cv_func_strcmpi="no"
      fi
    ])
    
    
    
    dnl CARES_CHECK_FUNC_STRDUP
    dnl -------------------------------------------------
    dnl Verify if strdup is available, prototyped, and
    dnl can be compiled. If all of these are true, and
    dnl usage has not been previously disallowed with
    dnl shell variable cares_disallow_strdup, then
    dnl HAVE_STRDUP will be defined.
    
    AC_DEFUN([CARES_CHECK_FUNC_STRDUP], [
      AC_REQUIRE([CARES_INCLUDES_STRING])dnl
      #
      tst_links_strdup="unknown"
      tst_proto_strdup="unknown"
      tst_compi_strdup="unknown"
      tst_allow_strdup="unknown"
      #
      AC_MSG_CHECKING([if strdup can be linked])
      AC_LINK_IFELSE([
        AC_LANG_FUNC_LINK_TRY([strdup])
      ],[
        AC_MSG_RESULT([yes])
        tst_links_strdup="yes"
      ],[
        AC_MSG_RESULT([no])
        tst_links_strdup="no"
      ])
      #
      if test "$tst_links_strdup" = "yes"; then
        AC_MSG_CHECKING([if strdup is prototyped])
        AC_EGREP_CPP([strdup],[
          $cares_includes_string
        ],[
          AC_MSG_RESULT([yes])
          tst_proto_strdup="yes"
        ],[
          AC_MSG_RESULT([no])
          tst_proto_strdup="no"
        ])
      fi
      #
      if test "$tst_proto_strdup" = "yes"; then
        AC_MSG_CHECKING([if strdup is compilable])
        AC_COMPILE_IFELSE([
          AC_LANG_PROGRAM([[
            $cares_includes_string
          ]],[[
            if(0 != strdup(0))
              return 1;
          ]])
        ],[
          AC_MSG_RESULT([yes])
          tst_compi_strdup="yes"
        ],[
          AC_MSG_RESULT([no])
          tst_compi_strdup="no"
        ])
      fi
      #
      if test "$tst_compi_strdup" = "yes"; then
        AC_MSG_CHECKING([if strdup usage allowed])
        if test "x$cares_disallow_strdup" != "xyes"; then
          AC_MSG_RESULT([yes])
          tst_allow_strdup="yes"
        else
          AC_MSG_RESULT([no])
          tst_allow_strdup="no"
        fi
      fi
      #
      AC_MSG_CHECKING([if strdup might be used])
      if test "$tst_links_strdup" = "yes" &&
         test "$tst_proto_strdup" = "yes" &&
         test "$tst_compi_strdup" = "yes" &&
         test "$tst_allow_strdup" = "yes"; then
        AC_MSG_RESULT([yes])
        AC_DEFINE_UNQUOTED(HAVE_STRDUP, 1,
          [Define to 1 if you have the strdup function.])
        ac_cv_func_strdup="yes"
      else
        AC_MSG_RESULT([no])
        ac_cv_func_strdup="no"
      fi
    ])
    
    
    Yang Tse's avatar
    Yang Tse committed
    
    dnl CARES_CHECK_FUNC_STRICMP
    dnl -------------------------------------------------
    dnl Verify if stricmp is available, prototyped, and
    dnl can be compiled. If all of these are true, and
    dnl usage has not been previously disallowed with