set(HAVE_GMTIME_R 1)
set(HAVE_IFADDRS_H 1)
set(HAVE_IF_NAMETOINDEX 1)
-set(HAVE_INET_NTOP 1)
-set(HAVE_INET_PTON 1)
set(HAVE_IOCTLSOCKET 0)
set(HAVE_IOCTLSOCKET_CAMEL 0)
set(HAVE_IOCTLSOCKET_CAMEL_FIONBIO 0)
set(HAVE_GLIBC_STRERROR_R 0)
set(HAVE_GMTIME_R 0)
set(HAVE_IFADDRS_H 0)
-set(HAVE_INET_NTOP 0)
-set(HAVE_INET_PTON 0)
set(HAVE_IOCTLSOCKET 1)
set(HAVE_IOCTLSOCKET_CAMEL 0)
set(HAVE_IOCTLSOCKET_CAMEL_FIONBIO 0)
check_function_exists("realpath" HAVE_REALPATH)
check_function_exists("sched_yield" HAVE_SCHED_YIELD)
- check_symbol_exists("inet_ntop" "${CURL_INCLUDES};stdlib.h;string.h" HAVE_INET_NTOP) # arpa/inet.h netinet/in.h sys/socket.h
- check_symbol_exists("inet_pton" "${CURL_INCLUDES};stdlib.h;string.h" HAVE_INET_PTON) # arpa/inet.h netinet/in.h sys/socket.h
check_symbol_exists("strcasecmp" "string.h" HAVE_STRCASECMP)
check_symbol_exists("stricmp" "string.h" HAVE_STRICMP)
check_symbol_exists("strcmpi" "string.h" HAVE_STRCMPI)
realpath \
sched_yield \
])
- CURL_CHECK_FUNC_INET_NTOP
- CURL_CHECK_FUNC_INET_PTON
CURL_CHECK_FUNC_STRCASECMP
CURL_CHECK_FUNC_STRCMPI
CURL_CHECK_FUNC_STRICMP
ip->maskbits = 128;
#endif
+ /* !checksrc! disable BANNEDFUNC 1 */
if(inet_pton(ip->family, ip->str, &ip->netaddr) != 1) {
free(ip->str);
free(ip);
if(ip && filter->type == CONNECTION_FILTER_BLACKLIST) {
if(filter->verbose) {
char buf[128] = { 0 };
+ /* !checksrc! disable BANNEDFUNC 1 */
inet_ntop(address->family, cinaddr, buf, sizeof(buf));
fprintf(stderr, "* Rejecting IP %s due to blacklist entry %s.\n",
buf, ip->str);
else if(!ip && filter->type == CONNECTION_FILTER_WHITELIST) {
if(filter->verbose) {
char buf[128] = { 0 };
+ /* !checksrc! disable BANNEDFUNC 1 */
inet_ntop(address->family, cinaddr, buf, sizeof(buf));
fprintf(stderr,
"* Rejecting IP %s due to missing whitelist entry.\n", buf);
getaddrinfo
gets
gmtime
+ inet_ntop
+ inet_pton
llseek
LoadLibrary
LoadLibraryA
/* Define to the function return type for send. */
#define SEND_TYPE_RETV int
-/* Must always use local implementations on Windows. */
-/* Define to 1 if you have an IPv6 capable working inet_ntop function. */
-/* #undef HAVE_INET_NTOP */
-/* Define to 1 if you have an IPv6 capable working inet_pton function. */
-/* #undef HAVE_INET_PTON */
-
/* Define to 1 if you have the `basename' function. */
#ifdef __MINGW32__
#define HAVE_BASENAME 1
/* Define to 1 if you have the <ifaddrs.h> header file. */
#cmakedefine HAVE_IFADDRS_H 1
-/* Define to 1 if you have an IPv6 capable working inet_ntop function. */
-#cmakedefine HAVE_INET_NTOP 1
-
-/* Define to 1 if you have an IPv6 capable working inet_pton function. */
-#cmakedefine HAVE_INET_PTON 1
-
/* Define to 1 if symbol `sa_family_t' exists */
#cmakedefine HAVE_SA_FAMILY_T 1
*/
#include "curl_setup.h"
-#ifndef HAVE_INET_NTOP
-
#ifdef HAVE_SYS_PARAM_H
#include <sys/param.h>
#endif
return NULL;
}
}
-#endif /* HAVE_INET_NTOP */
***************************************************************************/
#include "curl_setup.h"
-#ifdef HAVE_INET_NTOP
-#ifdef HAVE_NETINET_IN_H
-#include <netinet/in.h>
-#endif
-#ifndef _WIN32
-#include <sys/socket.h>
-#endif
-#ifdef HAVE_ARPA_INET_H
-#include <arpa/inet.h>
-#endif
-#ifdef __AMIGA__
-#define curlx_inet_ntop(af, src, buf, size) \
- (char *)inet_ntop(af, CURL_UNCONST(src), (unsigned char *)(buf), \
- (curl_socklen_t)(size))
-#else
-#define curlx_inet_ntop(af, src, buf, size) \
- inet_ntop(af, src, buf, (curl_socklen_t)(size))
-#endif
-#else
char *curlx_inet_ntop(int af, const void *src, char *buf, size_t size);
-#endif /* HAVE_INET_NTOP */
#endif /* HEADER_CURL_INET_NTOP_H */
*/
#include "curl_setup.h"
-#ifndef HAVE_INET_PTON
-
#ifdef HAVE_SYS_PARAM_H
#include <sys/param.h>
#endif
}
/* NOTREACHED */
}
-
-#endif /* HAVE_INET_PTON */
***************************************************************************/
#include "curl_setup.h"
-#ifdef HAVE_INET_PTON
-#ifdef HAVE_NETINET_IN_H
-#include <netinet/in.h>
-#endif
-#ifndef _WIN32
-#include <sys/socket.h>
-#endif
-#ifdef HAVE_ARPA_INET_H
-#include <arpa/inet.h>
-#endif
-#ifdef __AMIGA__
-#define curlx_inet_pton(x, y, z) \
- inet_pton(x, (unsigned char *)CURL_UNCONST(y), z)
-#else
-#define curlx_inet_pton(x, y, z) \
- inet_pton(x, y, z)
-#endif
-#else
int curlx_inet_pton(int af, const char *src, void *dst);
-#endif /* HAVE_INET_PTON */
#endif /* HEADER_CURL_INET_PTON_H */
dnl File version for 'aclocal' use. Keep it a single number.
dnl serial 73
-dnl CURL_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([CURL_INCLUDES_ARPA_INET], [
-curl_includes_arpa_inet="\
-/* includes start */
-#ifdef HAVE_SYS_TYPES_H
-# include <sys/types.h>
-#endif
-#ifdef HAVE_NETINET_IN_H
-# include <netinet/in.h>
-#endif
-#ifdef HAVE_ARPA_INET_H
-# include <arpa/inet.h>
-#endif
-#ifdef _WIN32
-#include <winsock2.h>
-#include <ws2tcpip.h>
-#else
-#include <sys/socket.h>
-#endif
-/* includes end */"
- AC_CHECK_HEADERS(
- sys/types.h netinet/in.h arpa/inet.h,
- [], [], [$curl_includes_arpa_inet])
-])
-
dnl CURL_INCLUDES_FCNTL
dnl -------------------------------------------------
])
-dnl CURL_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 curl_disallow_inet_ntop, then
-dnl HAVE_INET_NTOP is defined.
-
-AC_DEFUN([CURL_CHECK_FUNC_INET_NTOP], [
- AC_REQUIRE([CURL_INCLUDES_STDLIB])
- AC_REQUIRE([CURL_INCLUDES_ARPA_INET])
- AC_REQUIRE([CURL_INCLUDES_STRING])
-
- 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],[
- $curl_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([[
- $curl_includes_arpa_inet
- ]],[[
- char ipv4res[sizeof("255.255.255.255")];
- unsigned char ipv4a[5] = "";
- if(inet_ntop(0, ipv4a, ipv4res, 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 "$cross_compiling" != "yes" &&
- test "$tst_compi_inet_ntop" = "yes"; then
- AC_MSG_CHECKING([if inet_ntop seems to work])
- CURL_RUN_IFELSE([
- AC_LANG_PROGRAM([[
- $curl_includes_stdlib
- $curl_includes_arpa_inet
- $curl_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];
- const char *ipv6ptr = 0;
- const 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)
- return 1; /* fail */
- if(ipv4ptr != ipv4res)
- return 1; /* fail */
- if(!ipv4ptr[0])
- return 1; /* fail */
- if(memcmp(ipv4res, "192.168.100.1", 13))
- return 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)
- return 1; /* fail */
- if(ipv6ptr != ipv6res)
- return 1; /* fail */
- if(!ipv6ptr[0])
- return 1; /* fail */
- if(memcmp(ipv6res, "fe80::214:4fff:fe0b:76c8", 24))
- return 1; /* fail */
-
- /* verify working RFC 4291 zero prefixed IPv4 - mapped format */
- memset(ipv6a, 0, sizeof(ipv6a));
- ipv6a[12] = 0x7f;
- ipv6a[13] = 0x0;
- ipv6a[14] = 0x0;
- ipv6a[15] = 0x01;
- ipv6ptr = inet_ntop(AF_INET6, ipv6a, ipv6res, sizeof(ipv6res));
- if(!ipv6ptr)
- return 1; /* fail */
- if(ipv6ptr != ipv6res)
- return 1; /* fail */
- if(!ipv6ptr[0])
- return 1; /* fail */
- if(memcmp(ipv6res, "::127.0.0.1", 11))
- return 1; /* fail */
- return 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$curl_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 an IPv6 capable working inet_ntop function.])
- curl_cv_func_inet_ntop="yes"
- else
- AC_MSG_RESULT([no])
- curl_cv_func_inet_ntop="no"
- fi
-])
-
-
-dnl CURL_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 curl_disallow_inet_pton, then
-dnl HAVE_INET_PTON is defined.
-
-AC_DEFUN([CURL_CHECK_FUNC_INET_PTON], [
- AC_REQUIRE([CURL_INCLUDES_STDLIB])
- AC_REQUIRE([CURL_INCLUDES_ARPA_INET])
- AC_REQUIRE([CURL_INCLUDES_STRING])
-
- 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],[
- $curl_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([[
- $curl_includes_arpa_inet
- ]],[[
- unsigned char ipv4a[4 + 1] = "";
- const char *ipv4src = "192.168.100.1";
- if(inet_pton(0, ipv4src, ipv4a))
- 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 "$cross_compiling" != "yes" &&
- test "$tst_compi_inet_pton" = "yes"; then
- AC_MSG_CHECKING([if inet_pton seems to work])
- CURL_RUN_IFELSE([
- AC_LANG_PROGRAM([[
- $curl_includes_stdlib
- $curl_includes_arpa_inet
- $curl_includes_string
- ]],[[
- unsigned char ipv6a[16 + 1];
- unsigned char ipv4a[4 + 1];
- const char *ipv6src = "fe80::214:4fff:fe0b:76c8";
- const char *ipv4src = "192.168.100.1";
- /* - */
- memset(ipv4a, 1, sizeof(ipv4a));
- if(inet_pton(AF_INET, ipv4src, ipv4a) != 1)
- return 1; /* fail */
- /* - */
- if((ipv4a[0] != 0xc0) ||
- (ipv4a[1] != 0xa8) ||
- (ipv4a[2] != 0x64) ||
- (ipv4a[3] != 0x01) ||
- (ipv4a[4] != 0x01))
- return 1; /* fail */
- /* - */
- memset(ipv6a, 1, sizeof(ipv6a));
- if(inet_pton(AF_INET6, ipv6src, ipv6a) != 1)
- return 1; /* fail */
- /* - */
- 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[16] != 0x01))
- return 1; /* fail */
- /* - */
- if((ipv6a[2] != 0x0) ||
- (ipv6a[3] != 0x0) ||
- (ipv6a[4] != 0x0) ||
- (ipv6a[5] != 0x0) ||
- (ipv6a[6] != 0x0) ||
- (ipv6a[7] != 0x0))
- return 1; /* fail */
- /* - */
- return 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$curl_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 an IPv6 capable working inet_pton function.])
- curl_cv_func_inet_pton="yes"
- else
- AC_MSG_RESULT([no])
- curl_cv_func_inet_pton="no"
- fi
-])
-
-
dnl CURL_CHECK_FUNC_IOCTL
dnl -------------------------------------------------
dnl Verify if ioctl is available, prototyped, and
"getaddrinfo" => 1,
"gets" => 1,
"gmtime" => 1,
+ "inet_ntop" => 1,
+ "inet_pton" => 1,
"llseek" => 1,
"LoadLibrary" => 1,
"LoadLibraryA" => 1,
\
test1933 test1934 test1935 test1936 test1937 test1938 test1939 test1940 \
test1941 test1942 test1943 test1944 test1945 test1946 test1947 test1948 \
-test1955 test1956 test1957 test1958 test1959 test1960 test1964 test1965 \
-test1966 test1967 test1970 test1971 test1972 test1973 \
-test1974 test1975 test1976 test1977 test1978 test1979 test1980 test1981 \
-test1982 test1983 test1984 \
+test1955 test1956 test1957 test1958 test1959 test1960 test1961 \
+ test1964 test1965 test1966 test1967 test1970 \
+test1971 test1972 test1973 test1974 test1975 test1976 test1977 test1978 \
+test1979 test1980 test1981 test1982 test1983 test1984 \
\
test2000 test2001 test2002 test2003 test2004 test2005 test2006 test2007 \
test2008 test2009 test2010 test2011 test2012 test2013 test2014 test2015 \
--- /dev/null
+<?xml version="1.0" encoding="US-ASCII"?>
+<testcase>
+<info>
+<keywords>
+unittest
+</keywords>
+</info>
+
+# Client-side
+<client>
+<features>
+unittest
+</features>
+<name>
+curlx_inet_ntop() and curlx_inet_pton()
+</name>
+</client>
+</testcase>
CURLX_C = \
../../lib/curl_threads.c \
../../lib/curlx/fopen.c \
+ ../../lib/curlx/inet_ntop.c \
+ ../../lib/curlx/inet_pton.c \
../../lib/curlx/multibyte.c \
../../lib/curlx/strcopy.c \
../../lib/curlx/strerr.c \
#include "curlx/base64.h" /* for curlx_base64* */
#include "curlx/dynbuf.h" /* for curlx_dyn_*() */
#include "curlx/fopen.h" /* for curlx_f*() */
+#include "curlx/inet_ntop.h" /* for curlx_inet_ntop() */
+#include "curlx/inet_pton.h" /* for curlx_inet_pton() */
#include "curlx/strcopy.h" /* for curlx_strcopy() */
#include "curlx/strerr.h" /* for curlx_strerror() */
#include "curlx/strparse.h" /* for curlx_str_* parsing functions */
***************************************************************************/
#include "first.h"
-#ifdef HAVE_INET_PTON
-
#ifdef HAVE_NETINET_IN_H
#include <netinet/in.h>
#endif
return CURL_SOCKOPT_ALREADY_CONNECTED;
}
-#ifdef __AMIGA__
-#define my_inet_pton(x, y, z) inet_pton(x, (unsigned char *)CURL_UNCONST(y), z)
-#else
-#define my_inet_pton(x, y, z) inet_pton(x, y, z)
-#endif
-
/* Expected args: URL IP PORT */
static CURLcode test_lib1960(const char *URL)
{
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons((unsigned short)port);
- if(my_inet_pton(AF_INET, libtest_arg2, &serv_addr.sin_addr) <= 0) {
- curl_mfprintf(stderr, "inet_pton failed\n");
+ if(curlx_inet_pton(AF_INET, libtest_arg2, &serv_addr.sin_addr) <= 0) {
+ curl_mfprintf(stderr, "curlx_inet_pton() failed\n");
goto test_cleanup;
}
return result;
}
-#else
-static CURLcode test_lib1960(const char *URL)
-{
- (void)URL;
- curl_mprintf("lacks inet_pton\n");
- return CURLE_OK;
-}
-#endif
case QTYPE_A:
for(a = 0; a < ancount_a; a++) {
const unsigned char *store = ipv4_pref;
+ const char *ip;
if(add_answer(&resp->body, store, sizeof(ipv4_pref), QTYPE_A))
goto error;
+ ip = curlx_inet_ntop(AF_INET, store, addrbuf, sizeof(addrbuf));
logmsg("[%d] response A (%x) '%s'", qid, (unsigned int)QTYPE_A,
- curlx_inet_ntop(AF_INET, store, addrbuf, sizeof(addrbuf)));
+ ip ? ip : "(null)");
}
if(!ancount_a)
logmsg("[%d] response A empty", qid);
case QTYPE_AAAA:
for(a = 0; a < ancount_aaaa; a++) {
const unsigned char *store = ipv6_pref;
+ const char *ip;
if(add_answer(&resp->body, store, sizeof(ipv6_pref), QTYPE_AAAA))
goto error;
+ ip = curlx_inet_ntop(AF_INET6, store, addrbuf, sizeof(addrbuf));
logmsg("[%d] response AAAA (%x) '%s'", qid, (unsigned int)QTYPE_AAAA,
- curlx_inet_ntop(AF_INET6, store, addrbuf, sizeof(addrbuf)));
+ ip ? ip : "(null)");
}
if(!ancount_aaaa)
logmsg("[%d] response AAAA empty", qid);
unit1657.c unit1658.c unit1660.c unit1661.c unit1663.c unit1664.c \
unit1666.c unit1667.c unit1668.c unit1669.c \
unit1674.c unit1675.c unit1676.c \
- unit1979.c unit1980.c \
+ unit1961.c unit1979.c unit1980.c \
unit2413.c \
unit2600.c unit2601.c unit2602.c unit2603.c unit2604.c unit2605.c \
unit3200.c unit3205.c \
--- /dev/null
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 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 https://curl.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.
+ *
+ * SPDX-License-Identifier: curl
+ *
+ ***************************************************************************/
+#include "unitcheck.h"
+
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+#ifndef _WIN32
+#include <sys/socket.h>
+#endif
+#ifdef HAVE_ARPA_INET_H
+#include <arpa/inet.h>
+#endif
+#ifdef HAVE_NETINET_IN_H
+#include <netinet/in.h>
+#endif
+#ifdef HAVE_NETINET_IN6_H
+#include <netinet/in6.h>
+#endif
+
+/*
+ * If USE_IPV6 is disabled, we still want to parse IPv6 addresses, so make
+ * sure we have _some_ value for AF_INET6 without polluting our fake value
+ * everywhere.
+ */
+#if !defined(USE_IPV6) && !defined(AF_INET6)
+#define AF_INET6 (AF_INET + 1)
+#endif
+
+static int test_ntop(void)
+{
+ 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];
+ const char *ipv6ptr = 0;
+ const char *ipv4ptr = 0;
+
+ ipv4res[0] = '\0';
+ ipv4a[0] = 0xc0;
+ ipv4a[1] = 0xa8;
+ ipv4a[2] = 0x64;
+ ipv4a[3] = 0x01;
+ ipv4a[4] = 0x01;
+ ipv4ptr = curlx_inet_ntop(AF_INET, ipv4a, ipv4res, sizeof(ipv4res));
+ if(!ipv4ptr)
+ return 1; /* fail */
+ if(ipv4ptr != ipv4res)
+ return 1; /* fail */
+ if(!ipv4ptr[0])
+ return 1; /* fail */
+ if(memcmp(ipv4res, "192.168.100.1", 13))
+ return 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 = curlx_inet_ntop(AF_INET6, ipv6a, ipv6res, sizeof(ipv6res));
+ if(!ipv6ptr)
+ return 1; /* fail */
+ if(ipv6ptr != ipv6res)
+ return 1; /* fail */
+ if(!ipv6ptr[0])
+ return 1; /* fail */
+ if(memcmp(ipv6res, "fe80::214:4fff:fe0b:76c8", 24))
+ return 1; /* fail */
+
+ /* verify working RFC 4291 zero prefixed IPv4 - mapped format */
+ memset(ipv6a, 0, sizeof(ipv6a));
+ ipv6a[12] = 0x7f;
+ ipv6a[13] = 0x0;
+ ipv6a[14] = 0x0;
+ ipv6a[15] = 0x01;
+ ipv6ptr = curlx_inet_ntop(AF_INET6, ipv6a, ipv6res, sizeof(ipv6res));
+ if(!ipv6ptr)
+ return 1; /* fail */
+ if(ipv6ptr != ipv6res)
+ return 1; /* fail */
+ if(!ipv6ptr[0])
+ return 1; /* fail */
+ if(memcmp(ipv6res, "::127.0.0.1", 11))
+ return 1; /* fail */
+
+ return 0;
+}
+
+static int test_pton(void)
+{
+ unsigned char ipv6a[16 + 1];
+ unsigned char ipv4a[4 + 1];
+ const char *ipv6src = "fe80::214:4fff:fe0b:76c8";
+ const char *ipv4src = "192.168.100.1";
+
+ memset(ipv4a, 1, sizeof(ipv4a));
+ if(curlx_inet_pton(AF_INET, ipv4src, ipv4a) != 1)
+ return 1; /* fail */
+
+ if((ipv4a[0] != 0xc0) ||
+ (ipv4a[1] != 0xa8) ||
+ (ipv4a[2] != 0x64) ||
+ (ipv4a[3] != 0x01) ||
+ (ipv4a[4] != 0x01))
+ return 1; /* fail */
+
+ memset(ipv6a, 1, sizeof(ipv6a));
+ if(curlx_inet_pton(AF_INET6, ipv6src, ipv6a) != 1)
+ return 1; /* fail */
+
+ 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[16] != 0x01))
+ return 1; /* fail */
+
+ if((ipv6a[2] != 0x0) ||
+ (ipv6a[3] != 0x0) ||
+ (ipv6a[4] != 0x0) ||
+ (ipv6a[5] != 0x0) ||
+ (ipv6a[6] != 0x0) ||
+ (ipv6a[7] != 0x0))
+ return 1; /* fail */
+
+ return 0;
+}
+
+static CURLcode test_unit1961(const char *arg)
+{
+ UNITTEST_BEGIN_SIMPLE
+
+ fail_if(test_ntop(), "curlx_inet_ntop()");
+ fail_if(test_pton(), "curlx_inet_pton()");
+
+ UNITTEST_END_SIMPLE
+}