From 142cb601f86e56e18cc19ea4998dd87a4504993f Mon Sep 17 00:00:00 2001 From: Yang Tse Date: Wed, 24 Sep 2008 16:43:12 +0000 Subject: [PATCH] HAVE_INET_NTOP will only be defined when an IPv6 capable working inet_ntop function is available. --- ares/configure.ac | 34 +------ ares/inet_ntop.c | 2 +- ares/inet_ntop.h | 2 +- ares/m4/cares-functions.m4 | 186 ++++++++++++++++++++++++++++++++++++- 4 files changed, 188 insertions(+), 36 deletions(-) diff --git a/ares/configure.ac b/ares/configure.ac index e579ea052..5c43e006a 100644 --- a/ares/configure.ac +++ b/ares/configure.ac @@ -660,6 +660,7 @@ CURL_CHECK_MSG_NOSIGNAL CARES_CHECK_FUNC_GETHOSTNAME CARES_CHECK_FUNC_GETSERVBYPORT_R +CARES_CHECK_FUNC_INET_NTOP CARES_CHECK_FUNC_STRCASECMP CARES_CHECK_FUNC_STRCMPI CARES_CHECK_FUNC_STRDUP @@ -919,39 +920,6 @@ int main() fi -dnl Check for inet_ntop -AC_CHECK_FUNCS(inet_ntop) -dnl Again, some systems have it, but not IPv6 -if test "$ac_cv_func_inet_ntop" = "yes" ; then -AC_MSG_CHECKING(if inet_ntop supports IPv6) -AC_TRY_RUN( - [ -#ifdef HAVE_SYS_TYPES_H -#include -#endif -#ifdef HAVE_SYS_SOCKET_H -#include -#endif -#ifdef HAVE_NETINET_IN_H -#include -#endif -#include -int main() - { - struct in6_addr addr6; - char buf[128]; - if (inet_ntop(AF_INET6, &addr6, buf, 128) == 0 && errno == EAFNOSUPPORT) - exit(1); - else - exit(0); - } - ], [ - AC_MSG_RESULT(yes) - AC_DEFINE_UNQUOTED(HAVE_INET_NTOP_IPV6,1, - [Define to 1 if inet_ntop supports IPv6.]) - ], AC_MSG_RESULT(no),AC_MSG_RESULT(no)) -fi - AC_CHECK_SIZEOF(struct in6_addr, , [ #undef inline diff --git a/ares/inet_ntop.c b/ares/inet_ntop.c index 914576f5d..7f43b5c03 100644 --- a/ares/inet_ntop.c +++ b/ares/inet_ntop.c @@ -46,7 +46,7 @@ #include "inet_ntop.h" -#if !defined(HAVE_INET_NTOP) || !defined(HAVE_INET_NTOP_IPV6) +#ifndef HAVE_INET_NTOP #ifdef SPRINTF_CHAR # define SPRINTF(x) strlen(sprintf/**/x) diff --git a/ares/inet_ntop.h b/ares/inet_ntop.h index 9ddc9eb32..ab9735e80 100644 --- a/ares/inet_ntop.h +++ b/ares/inet_ntop.h @@ -18,7 +18,7 @@ * without express or implied warranty. */ -#if defined(HAVE_INET_NTOP) && defined(HAVE_INET_NTOP_IPV6) +#ifdef HAVE_INET_NTOP #define ares_inet_ntop(w,x,y,z) inet_ntop(w,x,y,z) #else const char *ares_inet_ntop(int af, const void *src, char *dst, size_t size); diff --git a/ares/m4/cares-functions.m4 b/ares/m4/cares-functions.m4 index 8522cb7b4..bdec24b11 100644 --- a/ares/m4/cares-functions.m4 +++ b/ares/m4/cares-functions.m4 @@ -16,7 +16,34 @@ #*************************************************************************** # File version for 'aclocal' use. Keep it a single number. -# serial 7 +# serial 8 + + +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 +#endif +#ifdef HAVE_SYS_SOCKET_H +# include +#endif +#ifdef HAVE_NETINET_IN_H +# include +#endif +#ifdef HAVE_ARPA_INET_H +# include +#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 @@ -368,6 +395,163 @@ AC_DEFUN([CARES_CHECK_FUNC_GETSERVBYPORT_R], [ ]) +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_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_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_STRCASECMP dnl ------------------------------------------------- dnl Verify if strcasecmp is available, prototyped, and