diff --git a/cmake/libraries.cmake b/cmake/libraries.cmake index 832d2da6e4a..eb21b628bfa 100644 --- a/cmake/libraries.cmake +++ b/cmake/libraries.cmake @@ -19,7 +19,7 @@ set(FLB_PATH_LIB_ONIGMO "lib/onigmo") set(FLB_PATH_LIB_MPACK "lib/mpack-amalgamation-1.1") set(FLB_PATH_LIB_MINIZ "lib/miniz") set(FLB_PATH_LIB_TUTF8E "lib/tutf8e") -set(FLB_PATH_LIB_CARES "lib/c-ares-1.19.1") +set(FLB_PATH_LIB_CARES "lib/c-ares-1.23.0") set(FLB_PATH_LIB_SNAPPY "lib/snappy-fef67ac") set(FLB_PATH_LIB_RDKAFKA "lib/librdkafka-2.1.0") set(FLB_PATH_LIB_RING_BUFFER "lib/lwrb") diff --git a/lib/c-ares-1.19.1/LICENSE.md b/lib/c-ares-1.19.1/LICENSE.md deleted file mode 100644 index ad6bb52b729..00000000000 --- a/lib/c-ares-1.19.1/LICENSE.md +++ /dev/null @@ -1,15 +0,0 @@ -# c-ares license - -Copyright (c) 2007 - 2018, Daniel Stenberg with many contributors, see AUTHORS -file. - -Copyright 1998 by the Massachusetts Institute of Technology. - -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. diff --git a/lib/c-ares-1.19.1/RELEASE-NOTES b/lib/c-ares-1.19.1/RELEASE-NOTES deleted file mode 100644 index 2524f3ccf41..00000000000 --- a/lib/c-ares-1.19.1/RELEASE-NOTES +++ /dev/null @@ -1,57 +0,0 @@ -c-ares version 1.19.1 - -This is a security and bugfix release. - -A special thanks goes out to the Open Source Technology Improvement Fund -(https://ostif.org) for sponsoring a security audit of c-ares performed by X41 -(https://x41-dsec.de). - -Security: - o CVE-2023-32067. High. 0-byte UDP payload causes Denial of Service [12] - o CVE-2023-31147. Moderate. Insufficient randomness in generation of DNS - query IDs [13] - o CVE-2023-31130. Moderate. Buffer Underwrite in ares_inet_net_pton() [14] - o CVE-2023-31124. Low. AutoTools does not set CARES_RANDOM_FILE during cross - compilation [15] - -Bug fixes: - o Fix uninitialized memory warning in test [1] - o Turn off IPV6_V6ONLY on Windows to allow IPv4-mapped IPv6 addresses [2] - o ares_getaddrinfo() should allow a port of 0 [3] - o Fix memory leak in ares_send() on error [4] - o Fix comment style in ares_data.h [5] - o Remove unneeded ifdef for Windows [6] - o Fix typo in ares_init_options.3 [7] - o Re-add support for Watcom compiler [8] - o Sync ax_pthread.m4 with upstream [9] - o Windows: Invalid stack variable used out of scope for HOSTS path [10] - o Sync ax_cxx_compile_stdcxx_11.m4 with upstream to fix uclibc support [11] - -Thanks go to these friendly people for their efforts and contributions: - Brad House (@bradh352) - @Chilledheart - Daniel Stenberg (@bagder) - Douglas R. Reno (@renodr) - Gregor Jasny (@gjasny) - Jay Freeman (@saurik) - @lifenjoiner - Nikolaos Chatzikonstantinou (@createyourpersonalaccount) - Yijie Ma (@yijiem) -(9 contributors) - -References to bug reports and discussions on issues: - [1] = https://github.com/c-ares/c-ares/pull/515 - [2] = https://github.com/c-ares/c-ares/pull/520 - [3] = https://github.com/c-ares/c-ares/issues/517 - [4] = https://github.com/c-ares/c-ares/pull/511 - [5] = https://github.com/c-ares/c-ares/pull/513 - [6] = https://github.com/c-ares/c-ares/pull/512 - [7] = https://github.com/c-ares/c-ares/pull/510 - [8] = https://github.com/c-ares/c-ares/pull/509 - [9] = https://github.com/c-ares/c-ares/pull/507 - [10] = https://github.com/c-ares/c-ares/pull/502 - [11] = https://github.com/c-ares/c-ares/pull/505 - [12] = https://github.com/c-ares/c-ares/security/advisories/GHSA-9g78-jv2r-p7vc - [13] = https://github.com/c-ares/c-ares/security/advisories/GHSA-8r8p-23f3-64c2 - [14] = https://github.com/c-ares/c-ares/security/advisories/GHSA-x6mf-cxr9-8q6v - [15] = https://github.com/c-ares/c-ares/security/advisories/GHSA-54xr-f67r-4pc4 diff --git a/lib/c-ares-1.19.1/TODO b/lib/c-ares-1.19.1/TODO deleted file mode 100644 index fa31cea6fb7..00000000000 --- a/lib/c-ares-1.19.1/TODO +++ /dev/null @@ -1,23 +0,0 @@ -TODO -==== - -ares_reinit() - -- To allow an app to force a re-read of /etc/resolv.conf etc, pretty much - like the res_init() resolver function offers - -ares_gethostbyname - -- When built to support IPv6, it needs to also support PF_UNSPEC or similar, - so that an application can ask for any protocol and then c-ares would return - all known resolves and not just explicitly IPv4 _or_ IPv6 resolves. - -ares_process - -- Upon next ABI breakage ares_process() should be changed to return 'int' - and return ARES_ENOTINITIALIZED if ares_library_init() has not been called. - -ares_process_fd - -- Upon next ABI breakage ares_process_fd() should be changed to return - 'int' and return ARES_ENOTINITIALIZED if library has not been initialized. diff --git a/lib/c-ares-1.19.1/docs/Makefile.am b/lib/c-ares-1.19.1/docs/Makefile.am deleted file mode 100644 index 289445ce49b..00000000000 --- a/lib/c-ares-1.19.1/docs/Makefile.am +++ /dev/null @@ -1,11 +0,0 @@ -#*************************************************************************** - -########################################################################### - -AUTOMAKE_OPTIONS = foreign subdir-objects no-dependencies - -include Makefile.inc - -man_MANS = $(MANPAGES) - -EXTRA_DIST = $(MANPAGES) ahost.1 adig.1 acountry.1 Makefile.inc CMakeLists.txt diff --git a/lib/c-ares-1.19.1/docs/Makefile.inc b/lib/c-ares-1.19.1/docs/Makefile.inc deleted file mode 100644 index 3aa62aa43b3..00000000000 --- a/lib/c-ares-1.19.1/docs/Makefile.inc +++ /dev/null @@ -1,59 +0,0 @@ -MANPAGES = ares_cancel.3 \ - ares_create_query.3 \ - ares_destroy.3 \ - ares_destroy_options.3 \ - ares_dup.3 \ - ares_expand_name.3 \ - ares_expand_string.3 \ - ares_fds.3 \ - ares_free_data.3 \ - ares_free_hostent.3 \ - ares_free_string.3 \ - ares_freeaddrinfo.3 \ - ares_get_servers.3 \ - ares_get_servers_ports.3 \ - ares_getaddrinfo.3 \ - ares_gethostbyaddr.3 \ - ares_gethostbyname.3 \ - ares_gethostbyname_file.3 \ - ares_getnameinfo.3 \ - ares_getsock.3 \ - ares_inet_ntop.3 \ - ares_inet_pton.3 \ - ares_init.3 \ - ares_init_options.3 \ - ares_library_cleanup.3 \ - ares_library_init.3 \ - ares_library_init_android.3 \ - ares_library_initialized.3 \ - ares_mkquery.3 \ - ares_parse_a_reply.3 \ - ares_parse_aaaa_reply.3 \ - ares_parse_caa_reply.3 \ - ares_parse_mx_reply.3 \ - ares_parse_naptr_reply.3 \ - ares_parse_ns_reply.3 \ - ares_parse_ptr_reply.3 \ - ares_parse_soa_reply.3 \ - ares_parse_srv_reply.3 \ - ares_parse_txt_reply.3 \ - ares_parse_uri_reply.3 \ - ares_process.3 \ - ares_query.3 \ - ares_save_options.3 \ - ares_search.3 \ - ares_send.3 \ - ares_set_local_dev.3 \ - ares_set_local_ip4.3 \ - ares_set_local_ip6.3 \ - ares_set_servers.3 \ - ares_set_servers_csv.3 \ - ares_set_servers_ports.3 \ - ares_set_servers_ports_csv.3 \ - ares_set_socket_callback.3 \ - ares_set_socket_configure_callback.3 \ - ares_set_socket_functions.3 \ - ares_set_sortlist.3 \ - ares_strerror.3 \ - ares_timeout.3 \ - ares_version.3 diff --git a/lib/c-ares-1.19.1/docs/acountry.1 b/lib/c-ares-1.19.1/docs/acountry.1 deleted file mode 100644 index ab5ab3d0223..00000000000 --- a/lib/c-ares-1.19.1/docs/acountry.1 +++ /dev/null @@ -1,54 +0,0 @@ -.TH ACOUNTRY "1" "April 2011" "c-ares utilities" -.SH NAME -acountry \- print the country where an IPv4 address or host is located -.SH SYNOPSIS -.B acountry -[\fIOPTION\fR]... \fIHOST\fR... -.SH DESCRIPTION -.PP -.\" Add any additional description here -.PP -Print the country where HOST (an IPv4 address or hostname) is located, -using the countries.nerd.dk DNS domain to identify the country. -.PP -This utility comes with the \fBc\-ares\fR asynchronous resolver library. -.SH OPTIONS -.TP -\fB\-d\fR -Print some extra debugging output. -.TP -\fB\-h\fR, \fB\-?\fR -Display this help and exit. -.TP -\fB\-v\fR -Be more verbose. Print extra information. -.SH "REPORTING BUGS" -Report bugs to the c-ares mailing list: -.br -\fBhttps://lists.haxx.se/listinfo/c-ares\fR -.SH "SEE ALSO" -.PP -adig(1), ahost(1). -.PP -The DNSBL countries.nerd.dk -.br -\fBhttp://countries.nerd.dk/\fR -.SH COPYRIGHT -This utility is based on code/ideas contained in sofware written by Greg Hudson (ares) -carrying the following notice: -.br -Copyright 1998 by the Massachusetts Institute of Technology. -.br -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. -.br -No further copyright claims are being made by the author(s) of this utility. -.SH AUTHOR -Gisle Vanem diff --git a/lib/c-ares-1.19.1/docs/ares_free_data.3 b/lib/c-ares-1.19.1/docs/ares_free_data.3 deleted file mode 100644 index a6f3938be5c..00000000000 --- a/lib/c-ares-1.19.1/docs/ares_free_data.3 +++ /dev/null @@ -1,80 +0,0 @@ -.\" -.\" Copyright 1998 by the Massachusetts Institute of Technology. -.\" Copyright (C) 2004-2010 by Daniel Stenberg -.\" -.\" 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. -.\" -.TH ARES_FREE_DATA 3 "5 March 2010" -.SH NAME -ares_free_data \- Free data allocated by several c-ares functions -.SH SYNOPSIS -.nf -#include - -void ares_free_data(void *\fIdataptr\fP) -.fi -.SH DESCRIPTION -.PP -The -.B ares_free_data(3) -function frees one or more data structures allocated and returned -by several c-ares functions. Specifically the data returned by the -following list of functions must be deallocated using this function. -.TP 5 -.B ares_get_servers(3) -When used to free the data returned by ares_get_servers(3) this -will free the whole linked list of ares_addr_node structures returned -by ares_get_servers(3). -.TP -.B ares_parse_srv_reply(3) -When used to free the data returned by ares_parse_srv_reply(3) this -will free the whole linked list of ares_srv_reply structures returned -by ares_parse_srv_reply(3), along with any additional storage -associated with those structures. -.TP -.B ares_parse_mx_reply(3) -When used to free the data returned by ares_parse_mx_reply(3) this -will free the whole linked list of ares_mx_reply structures returned -by ares_parse_mx_reply(3), along with any additional storage -associated with those structures. -.TP -.B ares_parse_txt_reply(3) -When used to free the data returned by ares_parse_txt_reply(3) this -will free the whole linked list of ares_txt_reply structures returned -by ares_parse_txt_reply(3), along with any additional storage -associated with those structures. -.TP -.B ares_parse_soa_reply(3) -When used to free the data returned by ares_parse_soa_reply(3) this -will free the ares_soa_reply structure, along with any additional storage -associated with those structure. -.B ares_parse_uri_reply(3) -When used to free the data returned by ares_parse_uri_reply(3) this -will free list of ares_uri_reply structures, along with any additional -storage associated with those structure. -.SH RETURN VALUE -The ares_free_data() function does not return a value. -.SH AVAILABILITY -This function was first introduced in c-ares version 1.7.0. -.SH SEE ALSO -.BR ares_get_servers(3), -.BR ares_parse_srv_reply(3), -.BR ares_parse_mx_reply(3), -.BR ares_parse_txt_reply(3), -.BR ares_parse_soa_reply(3) -.SH AUTHOR -Yang Tse -.PP -Copyright 1998 by the Massachusetts Institute of Technology. -.br -Copyright (C) 2004-2010 by Daniel Stenberg. diff --git a/lib/c-ares-1.19.1/docs/ares_get_servers_ports.3 b/lib/c-ares-1.19.1/docs/ares_get_servers_ports.3 deleted file mode 100644 index 1f5d1f708b7..00000000000 --- a/lib/c-ares-1.19.1/docs/ares_get_servers_ports.3 +++ /dev/null @@ -1 +0,0 @@ -.so man3/ares_get_servers.3 diff --git a/lib/c-ares-1.19.1/docs/ares_init.3 b/lib/c-ares-1.19.1/docs/ares_init.3 deleted file mode 100644 index 0baf4b76fea..00000000000 --- a/lib/c-ares-1.19.1/docs/ares_init.3 +++ /dev/null @@ -1,81 +0,0 @@ -.\" -.\" Copyright 1998 by the Massachusetts Institute of Technology. -.\" Copyright (C) 2004-2010 by Daniel Stenberg -.\" -.\" 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. -.\" -.TH ARES_INIT 3 "5 March 2010" -.SH NAME -ares_init \- Initialize a resolver channel -.SH SYNOPSIS -.nf -#include - -int ares_init(ares_channel *\fIchannelptr\fP) -.fi -.SH DESCRIPTION -The \fBares_init(3)\fP function initializes a communications channel for name -service lookups. If it returns successfully, \fBares_init(3)\fP will set the -variable pointed to by \fIchannelptr\fP to a handle used to identify the name -service channel. The caller should invoke \fIares_destroy(3)\fP on the handle -when the channel is no longer needed. - -The \fIares_init_options(3)\fP function is provide to offer more init -alternatives. -.SH RETURN VALUES -\fIares_init(3)\fP can return any of the following values: -.TP 14 -.B ARES_SUCCESS -Initialization succeeded. -.TP 14 -.B ARES_EFILE -A configuration file could not be read. -.TP 14 -.B ARES_ENOMEM -The process's available memory was exhausted. -.TP 14 -.B ARES_ENOTINITIALIZED -c-ares library initialization not yet performed. -.SH NOTES -When initializing from -.B /etc/resolv.conf, -.BR ares_init (3) -reads the -.I domain -and -.I search -directives to allow lookups of short names relative to the domains -specified. The -.I domain -and -.I search -directives override one another. If more that one instance of either -.I domain -or -.I search -directives is specified, the last occurrence wins. For more information, -please see the -.BR resolv.conf (5) -manual page. -.SH SEE ALSO -.BR ares_init_options(3), -.BR ares_destroy(3), -.BR ares_dup(3), -.BR ares_library_init(3), -.BR ares_set_servers(3) -.SH AUTHOR -Greg Hudson, MIT Information Systems -.br -Copyright 1998 by the Massachusetts Institute of Technology. -.br -Copyright (C) 2004-2010 by Daniel Stenberg. diff --git a/lib/c-ares-1.19.1/docs/ares_set_servers_ports.3 b/lib/c-ares-1.19.1/docs/ares_set_servers_ports.3 deleted file mode 100644 index a3be18938e6..00000000000 --- a/lib/c-ares-1.19.1/docs/ares_set_servers_ports.3 +++ /dev/null @@ -1 +0,0 @@ -.so man3/ares_set_servers.3 diff --git a/lib/c-ares-1.19.1/docs/ares_set_servers_ports_csv.3 b/lib/c-ares-1.19.1/docs/ares_set_servers_ports_csv.3 deleted file mode 100644 index 30535c69f10..00000000000 --- a/lib/c-ares-1.19.1/docs/ares_set_servers_ports_csv.3 +++ /dev/null @@ -1 +0,0 @@ -.so man3/ares_set_servers_csv.3 diff --git a/lib/c-ares-1.19.1/include/ares.h b/lib/c-ares-1.19.1/include/ares.h deleted file mode 100644 index 8c7520eec65..00000000000 --- a/lib/c-ares-1.19.1/include/ares.h +++ /dev/null @@ -1,764 +0,0 @@ - -/* Copyright 1998 by the Massachusetts Institute of Technology. - * Copyright (C) 2007-2013 by Daniel Stenberg - * - * 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. - */ - -#ifndef ARES__H -#define ARES__H - -#include "ares_version.h" /* c-ares version defines */ -#include "ares_build.h" /* c-ares build definitions */ -#include "ares_rules.h" /* c-ares rules enforcement */ - -/* - * Define WIN32 when build target is Win32 API - */ - -#if (defined(_WIN32) || defined(__WIN32__)) && \ - !defined(WIN32) && !defined(__SYMBIAN32__) -# define WIN32 -#endif - -#include - -/* HP-UX systems version 9, 10 and 11 lack sys/select.h and so does oldish - libc5-based Linux systems. Only include it on system that are known to - require it! */ -#if defined(_AIX) || defined(__NOVELL_LIBC__) || defined(__NetBSD__) || \ - defined(__minix) || defined(__SYMBIAN32__) || defined(__INTEGRITY) || \ - defined(ANDROID) || defined(__ANDROID__) || defined(__OpenBSD__) || \ - defined(__QNXNTO__) || defined(__MVS__) || defined(__HAIKU__) -#include -#endif -#if (defined(NETWARE) && !defined(__NOVELL_LIBC__)) -#include -#endif - -#if defined(WATT32) -# include -# include -# include -#elif defined(_WIN32_WCE) -# ifndef WIN32_LEAN_AND_MEAN -# define WIN32_LEAN_AND_MEAN -# endif -# include -# include -#elif defined(WIN32) -# ifndef WIN32_LEAN_AND_MEAN -# define WIN32_LEAN_AND_MEAN -# endif -# include -# include -# include -/* To aid with linking against a static c-ares build, lets tell the microsoft - * compiler to pull in needed dependencies */ -# ifdef _MSC_VER -# pragma comment(lib, "ws2_32") -# pragma comment(lib, "advapi32") -# pragma comment(lib, "iphlpapi") -# endif -#else -# include -# include -#endif - -#if defined(ANDROID) || defined(__ANDROID__) -#include -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -/* -** c-ares external API function linkage decorations. -*/ - -#ifdef CARES_STATICLIB -# define CARES_EXTERN -#elif defined(WIN32) || defined(_WIN32) || defined(__SYMBIAN32__) -# if defined(CARES_BUILDING_LIBRARY) -# define CARES_EXTERN __declspec(dllexport) -# else -# define CARES_EXTERN __declspec(dllimport) -# endif -#elif defined(CARES_BUILDING_LIBRARY) && defined(CARES_SYMBOL_HIDING) -# define CARES_EXTERN CARES_SYMBOL_SCOPE_EXTERN -#else -# define CARES_EXTERN -#endif - - -#define ARES_SUCCESS 0 - -/* Server error codes (ARES_ENODATA indicates no relevant answer) */ -#define ARES_ENODATA 1 -#define ARES_EFORMERR 2 -#define ARES_ESERVFAIL 3 -#define ARES_ENOTFOUND 4 -#define ARES_ENOTIMP 5 -#define ARES_EREFUSED 6 - -/* Locally generated error codes */ -#define ARES_EBADQUERY 7 -#define ARES_EBADNAME 8 -#define ARES_EBADFAMILY 9 -#define ARES_EBADRESP 10 -#define ARES_ECONNREFUSED 11 -#define ARES_ETIMEOUT 12 -#define ARES_EOF 13 -#define ARES_EFILE 14 -#define ARES_ENOMEM 15 -#define ARES_EDESTRUCTION 16 -#define ARES_EBADSTR 17 - -/* ares_getnameinfo error codes */ -#define ARES_EBADFLAGS 18 - -/* ares_getaddrinfo error codes */ -#define ARES_ENONAME 19 -#define ARES_EBADHINTS 20 - -/* Uninitialized library error code */ -#define ARES_ENOTINITIALIZED 21 /* introduced in 1.7.0 */ - -/* ares_library_init error codes */ -#define ARES_ELOADIPHLPAPI 22 /* introduced in 1.7.0 */ -#define ARES_EADDRGETNETWORKPARAMS 23 /* introduced in 1.7.0 */ - -/* More error codes */ -#define ARES_ECANCELLED 24 /* introduced in 1.7.0 */ - -/* More ares_getaddrinfo error codes */ -#define ARES_ESERVICE 25 /* introduced in 1.?.0 */ - -/* Flag values */ -#define ARES_FLAG_USEVC (1 << 0) -#define ARES_FLAG_PRIMARY (1 << 1) -#define ARES_FLAG_IGNTC (1 << 2) -#define ARES_FLAG_NORECURSE (1 << 3) -#define ARES_FLAG_STAYOPEN (1 << 4) -#define ARES_FLAG_NOSEARCH (1 << 5) -#define ARES_FLAG_NOALIASES (1 << 6) -#define ARES_FLAG_NOCHECKRESP (1 << 7) -#define ARES_FLAG_EDNS (1 << 8) - -/* Option mask values */ -#define ARES_OPT_FLAGS (1 << 0) -#define ARES_OPT_TIMEOUT (1 << 1) -#define ARES_OPT_TRIES (1 << 2) -#define ARES_OPT_NDOTS (1 << 3) -#define ARES_OPT_UDP_PORT (1 << 4) -#define ARES_OPT_TCP_PORT (1 << 5) -#define ARES_OPT_SERVERS (1 << 6) -#define ARES_OPT_DOMAINS (1 << 7) -#define ARES_OPT_LOOKUPS (1 << 8) -#define ARES_OPT_SOCK_STATE_CB (1 << 9) -#define ARES_OPT_SORTLIST (1 << 10) -#define ARES_OPT_SOCK_SNDBUF (1 << 11) -#define ARES_OPT_SOCK_RCVBUF (1 << 12) -#define ARES_OPT_TIMEOUTMS (1 << 13) -#define ARES_OPT_ROTATE (1 << 14) -#define ARES_OPT_EDNSPSZ (1 << 15) -#define ARES_OPT_NOROTATE (1 << 16) -#define ARES_OPT_RESOLVCONF (1 << 17) -#define ARES_OPT_HOSTS_FILE (1 << 18) - -/* Nameinfo flag values */ -#define ARES_NI_NOFQDN (1 << 0) -#define ARES_NI_NUMERICHOST (1 << 1) -#define ARES_NI_NAMEREQD (1 << 2) -#define ARES_NI_NUMERICSERV (1 << 3) -#define ARES_NI_DGRAM (1 << 4) -#define ARES_NI_TCP 0 -#define ARES_NI_UDP ARES_NI_DGRAM -#define ARES_NI_SCTP (1 << 5) -#define ARES_NI_DCCP (1 << 6) -#define ARES_NI_NUMERICSCOPE (1 << 7) -#define ARES_NI_LOOKUPHOST (1 << 8) -#define ARES_NI_LOOKUPSERVICE (1 << 9) -/* Reserved for future use */ -#define ARES_NI_IDN (1 << 10) -#define ARES_NI_IDN_ALLOW_UNASSIGNED (1 << 11) -#define ARES_NI_IDN_USE_STD3_ASCII_RULES (1 << 12) - -/* Addrinfo flag values */ -#define ARES_AI_CANONNAME (1 << 0) -#define ARES_AI_NUMERICHOST (1 << 1) -#define ARES_AI_PASSIVE (1 << 2) -#define ARES_AI_NUMERICSERV (1 << 3) -#define ARES_AI_V4MAPPED (1 << 4) -#define ARES_AI_ALL (1 << 5) -#define ARES_AI_ADDRCONFIG (1 << 6) -#define ARES_AI_NOSORT (1 << 7) -#define ARES_AI_ENVHOSTS (1 << 8) -/* Reserved for future use */ -#define ARES_AI_IDN (1 << 10) -#define ARES_AI_IDN_ALLOW_UNASSIGNED (1 << 11) -#define ARES_AI_IDN_USE_STD3_ASCII_RULES (1 << 12) -#define ARES_AI_CANONIDN (1 << 13) - -#define ARES_AI_MASK (ARES_AI_CANONNAME|ARES_AI_NUMERICHOST|ARES_AI_PASSIVE| \ - ARES_AI_NUMERICSERV|ARES_AI_V4MAPPED|ARES_AI_ALL| \ - ARES_AI_ADDRCONFIG) -#define ARES_GETSOCK_MAXNUM 16 /* ares_getsock() can return info about this - many sockets */ -#define ARES_GETSOCK_READABLE(bits,num) (bits & (1<< (num))) -#define ARES_GETSOCK_WRITABLE(bits,num) (bits & (1 << ((num) + \ - ARES_GETSOCK_MAXNUM))) - -/* c-ares library initialization flag values */ -#define ARES_LIB_INIT_NONE (0) -#define ARES_LIB_INIT_WIN32 (1 << 0) -#define ARES_LIB_INIT_ALL (ARES_LIB_INIT_WIN32) - - -/* - * Typedef our socket type - */ - -#ifndef ares_socket_typedef -#ifdef WIN32 -typedef SOCKET ares_socket_t; -#define ARES_SOCKET_BAD INVALID_SOCKET -#else -typedef int ares_socket_t; -#define ARES_SOCKET_BAD -1 -#endif -#define ares_socket_typedef -#endif /* ares_socket_typedef */ - -typedef void (*ares_sock_state_cb)(void *data, - ares_socket_t socket_fd, - int readable, - int writable); - -struct apattern; - -/* NOTE about the ares_options struct to users and developers. - - This struct will remain looking like this. It will not be extended nor - shrunk in future releases, but all new options will be set by ares_set_*() - options instead of with the ares_init_options() function. - - Eventually (in a galaxy far far away), all options will be settable by - ares_set_*() options and the ares_init_options() function will become - deprecated. - - When new options are added to c-ares, they are not added to this - struct. And they are not "saved" with the ares_save_options() function but - instead we encourage the use of the ares_dup() function. Needless to say, - if you add config options to c-ares you need to make sure ares_dup() - duplicates this new option. - - */ -struct ares_options { - int flags; - int timeout; /* in seconds or milliseconds, depending on options */ - int tries; - int ndots; - unsigned short udp_port; - unsigned short tcp_port; - int socket_send_buffer_size; - int socket_receive_buffer_size; - struct in_addr *servers; - int nservers; - char **domains; - int ndomains; - char *lookups; - ares_sock_state_cb sock_state_cb; - void *sock_state_cb_data; - struct apattern *sortlist; - int nsort; - int ednspsz; - char *resolvconf_path; - char *hosts_path; -}; - -struct hostent; -struct timeval; -struct sockaddr; -struct ares_channeldata; -struct ares_addrinfo; -struct ares_addrinfo_hints; - -typedef struct ares_channeldata *ares_channel; - -typedef void (*ares_callback)(void *arg, - int status, - int timeouts, - unsigned char *abuf, - int alen); - -typedef void (*ares_host_callback)(void *arg, - int status, - int timeouts, - struct hostent *hostent); - -typedef void (*ares_nameinfo_callback)(void *arg, - int status, - int timeouts, - char *node, - char *service); - -typedef int (*ares_sock_create_callback)(ares_socket_t socket_fd, - int type, - void *data); - -typedef int (*ares_sock_config_callback)(ares_socket_t socket_fd, - int type, - void *data); - -typedef void (*ares_addrinfo_callback)(void *arg, - int status, - int timeouts, - struct ares_addrinfo *res); - -CARES_EXTERN int ares_library_init(int flags); - -CARES_EXTERN int ares_library_init_mem(int flags, - void *(*amalloc)(size_t size), - void (*afree)(void *ptr), - void *(*arealloc)(void *ptr, size_t size)); - -#if defined(ANDROID) || defined(__ANDROID__) -CARES_EXTERN void ares_library_init_jvm(JavaVM *jvm); -CARES_EXTERN int ares_library_init_android(jobject connectivity_manager); -CARES_EXTERN int ares_library_android_initialized(void); -#endif - -CARES_EXTERN int ares_library_initialized(void); - -CARES_EXTERN void ares_library_cleanup(void); - -CARES_EXTERN const char *ares_version(int *version); - -CARES_EXTERN int ares_init(ares_channel *channelptr); - -CARES_EXTERN int ares_init_options(ares_channel *channelptr, - struct ares_options *options, - int optmask); - -CARES_EXTERN int ares_save_options(ares_channel channel, - struct ares_options *options, - int *optmask); - -CARES_EXTERN void ares_destroy_options(struct ares_options *options); - -CARES_EXTERN int ares_dup(ares_channel *dest, - ares_channel src); - -CARES_EXTERN void ares_destroy(ares_channel channel); - -CARES_EXTERN void ares_cancel(ares_channel channel); - -/* These next 3 configure local binding for the out-going socket - * connection. Use these to specify source IP and/or network device - * on multi-homed systems. - */ -CARES_EXTERN void ares_set_local_ip4(ares_channel channel, unsigned int local_ip); - -/* local_ip6 should be 16 bytes in length */ -CARES_EXTERN void ares_set_local_ip6(ares_channel channel, - const unsigned char* local_ip6); - -/* local_dev_name should be null terminated. */ -CARES_EXTERN void ares_set_local_dev(ares_channel channel, - const char* local_dev_name); - -CARES_EXTERN void ares_set_socket_callback(ares_channel channel, - ares_sock_create_callback callback, - void *user_data); - -CARES_EXTERN void ares_set_socket_configure_callback(ares_channel channel, - ares_sock_config_callback callback, - void *user_data); - -CARES_EXTERN int ares_set_sortlist(ares_channel channel, - const char *sortstr); - -CARES_EXTERN void ares_getaddrinfo(ares_channel channel, - const char* node, - const char* service, - const struct ares_addrinfo_hints* hints, - ares_addrinfo_callback callback, - void* arg); - -CARES_EXTERN void ares_freeaddrinfo(struct ares_addrinfo* ai); - -/* - * Virtual function set to have user-managed socket IO. - * Note that all functions need to be defined, and when - * set, the library will not do any bind nor set any - * socket options, assuming the client handles these - * through either socket creation or the - * ares_sock_config_callback call. - */ -struct iovec; -struct ares_socket_functions { - ares_socket_t(*asocket)(int, int, int, void *); - int(*aclose)(ares_socket_t, void *); - int(*aconnect)(ares_socket_t, const struct sockaddr *, ares_socklen_t, void *); - ares_ssize_t(*arecvfrom)(ares_socket_t, void *, size_t, int, struct sockaddr *, ares_socklen_t *, void *); - ares_ssize_t(*asendv)(ares_socket_t, const struct iovec *, int, void *); -}; - -CARES_EXTERN void ares_set_socket_functions(ares_channel channel, - const struct ares_socket_functions * funcs, - void *user_data); - -CARES_EXTERN void ares_send(ares_channel channel, - const unsigned char *qbuf, - int qlen, - ares_callback callback, - void *arg); - -CARES_EXTERN void ares_query(ares_channel channel, - const char *name, - int dnsclass, - int type, - ares_callback callback, - void *arg); - -CARES_EXTERN void ares_search(ares_channel channel, - const char *name, - int dnsclass, - int type, - ares_callback callback, - void *arg); - -CARES_EXTERN void ares_gethostbyname(ares_channel channel, - const char *name, - int family, - ares_host_callback callback, - void *arg); - -CARES_EXTERN int ares_gethostbyname_file(ares_channel channel, - const char *name, - int family, - struct hostent **host); - -CARES_EXTERN void ares_gethostbyaddr(ares_channel channel, - const void *addr, - int addrlen, - int family, - ares_host_callback callback, - void *arg); - -CARES_EXTERN void ares_getnameinfo(ares_channel channel, - const struct sockaddr *sa, - ares_socklen_t salen, - int flags, - ares_nameinfo_callback callback, - void *arg); - -CARES_EXTERN int ares_fds(ares_channel channel, - fd_set *read_fds, - fd_set *write_fds); - -CARES_EXTERN int ares_getsock(ares_channel channel, - ares_socket_t *socks, - int numsocks); - -CARES_EXTERN struct timeval *ares_timeout(ares_channel channel, - struct timeval *maxtv, - struct timeval *tv); - -CARES_EXTERN void ares_process(ares_channel channel, - fd_set *read_fds, - fd_set *write_fds); - -CARES_EXTERN void ares_process_fd(ares_channel channel, - ares_socket_t read_fd, - ares_socket_t write_fd); - -CARES_EXTERN int ares_create_query(const char *name, - int dnsclass, - int type, - unsigned short id, - int rd, - unsigned char **buf, - int *buflen, - int max_udp_size); - -CARES_EXTERN int ares_mkquery(const char *name, - int dnsclass, - int type, - unsigned short id, - int rd, - unsigned char **buf, - int *buflen); - -CARES_EXTERN int ares_expand_name(const unsigned char *encoded, - const unsigned char *abuf, - int alen, - char **s, - long *enclen); - -CARES_EXTERN int ares_expand_string(const unsigned char *encoded, - const unsigned char *abuf, - int alen, - unsigned char **s, - long *enclen); - -/* - * NOTE: before c-ares 1.7.0 we would most often use the system in6_addr - * struct below when ares itself was built, but many apps would use this - * private version since the header checked a HAVE_* define for it. Starting - * with 1.7.0 we always declare and use our own to stop relying on the - * system's one. - */ -struct ares_in6_addr { - union { - unsigned char _S6_u8[16]; - } _S6_un; -}; - -struct ares_addrttl { - struct in_addr ipaddr; - int ttl; -}; - -struct ares_addr6ttl { - struct ares_in6_addr ip6addr; - int ttl; -}; - -struct ares_caa_reply { - struct ares_caa_reply *next; - int critical; - unsigned char *property; - size_t plength; /* plength excludes null termination */ - unsigned char *value; - size_t length; /* length excludes null termination */ -}; - -struct ares_srv_reply { - struct ares_srv_reply *next; - char *host; - unsigned short priority; - unsigned short weight; - unsigned short port; -}; - -struct ares_mx_reply { - struct ares_mx_reply *next; - char *host; - unsigned short priority; -}; - -struct ares_txt_reply { - struct ares_txt_reply *next; - unsigned char *txt; - size_t length; /* length excludes null termination */ -}; - -/* NOTE: This structure is a superset of ares_txt_reply - */ -struct ares_txt_ext { - struct ares_txt_ext *next; - unsigned char *txt; - size_t length; - /* 1 - if start of new record - * 0 - if a chunk in the same record */ - unsigned char record_start; -}; - -struct ares_naptr_reply { - struct ares_naptr_reply *next; - unsigned char *flags; - unsigned char *service; - unsigned char *regexp; - char *replacement; - unsigned short order; - unsigned short preference; -}; - -struct ares_soa_reply { - char *nsname; - char *hostmaster; - unsigned int serial; - unsigned int refresh; - unsigned int retry; - unsigned int expire; - unsigned int minttl; -}; - -struct ares_uri_reply { - struct ares_uri_reply *next; - unsigned short priority; - unsigned short weight; - char *uri; - int ttl; -}; - -/* - * Similar to addrinfo, but with extra ttl and missing canonname. - */ -struct ares_addrinfo_node { - int ai_ttl; - int ai_flags; - int ai_family; - int ai_socktype; - int ai_protocol; - ares_socklen_t ai_addrlen; - struct sockaddr *ai_addr; - struct ares_addrinfo_node *ai_next; -}; - -/* - * alias - label of the resource record. - * name - value (canonical name) of the resource record. - * See RFC2181 10.1.1. CNAME terminology. - */ -struct ares_addrinfo_cname { - int ttl; - char *alias; - char *name; - struct ares_addrinfo_cname *next; -}; - -struct ares_addrinfo { - struct ares_addrinfo_cname *cnames; - struct ares_addrinfo_node *nodes; - char *name; -}; - -struct ares_addrinfo_hints { - int ai_flags; - int ai_family; - int ai_socktype; - int ai_protocol; -}; - -/* -** Parse the buffer, starting at *abuf and of length alen bytes, previously -** obtained from an ares_search call. Put the results in *host, if nonnull. -** Also, if addrttls is nonnull, put up to *naddrttls IPv4 addresses along with -** their TTLs in that array, and set *naddrttls to the number of addresses -** so written. -*/ - -CARES_EXTERN int ares_parse_a_reply(const unsigned char *abuf, - int alen, - struct hostent **host, - struct ares_addrttl *addrttls, - int *naddrttls); - -CARES_EXTERN int ares_parse_aaaa_reply(const unsigned char *abuf, - int alen, - struct hostent **host, - struct ares_addr6ttl *addrttls, - int *naddrttls); - -CARES_EXTERN int ares_parse_caa_reply(const unsigned char* abuf, - int alen, - struct ares_caa_reply** caa_out); - -CARES_EXTERN int ares_parse_ptr_reply(const unsigned char *abuf, - int alen, - const void *addr, - int addrlen, - int family, - struct hostent **host); - -CARES_EXTERN int ares_parse_ns_reply(const unsigned char *abuf, - int alen, - struct hostent **host); - -CARES_EXTERN int ares_parse_srv_reply(const unsigned char* abuf, - int alen, - struct ares_srv_reply** srv_out); - -CARES_EXTERN int ares_parse_mx_reply(const unsigned char* abuf, - int alen, - struct ares_mx_reply** mx_out); - -CARES_EXTERN int ares_parse_txt_reply(const unsigned char* abuf, - int alen, - struct ares_txt_reply** txt_out); - -CARES_EXTERN int ares_parse_txt_reply_ext(const unsigned char* abuf, - int alen, - struct ares_txt_ext** txt_out); - -CARES_EXTERN int ares_parse_naptr_reply(const unsigned char* abuf, - int alen, - struct ares_naptr_reply** naptr_out); - -CARES_EXTERN int ares_parse_soa_reply(const unsigned char* abuf, - int alen, - struct ares_soa_reply** soa_out); - -CARES_EXTERN int ares_parse_uri_reply(const unsigned char* abuf, - int alen, - struct ares_uri_reply** uri_out); - -CARES_EXTERN void ares_free_string(void *str); - -CARES_EXTERN void ares_free_hostent(struct hostent *host); - -CARES_EXTERN void ares_free_data(void *dataptr); - -CARES_EXTERN const char *ares_strerror(int code); - -struct ares_addr_node { - struct ares_addr_node *next; - int family; - union { - struct in_addr addr4; - struct ares_in6_addr addr6; - } addr; -}; - -struct ares_addr_port_node { - struct ares_addr_port_node *next; - int family; - union { - struct in_addr addr4; - struct ares_in6_addr addr6; - } addr; - int udp_port; - int tcp_port; -}; - -CARES_EXTERN int ares_set_servers(ares_channel channel, - struct ares_addr_node *servers); -CARES_EXTERN int ares_set_servers_ports(ares_channel channel, - struct ares_addr_port_node *servers); - -/* Incomming string format: host[:port][,host[:port]]... */ -CARES_EXTERN int ares_set_servers_csv(ares_channel channel, - const char* servers); -CARES_EXTERN int ares_set_servers_ports_csv(ares_channel channel, - const char* servers); - -CARES_EXTERN int ares_get_servers(ares_channel channel, - struct ares_addr_node **servers); -CARES_EXTERN int ares_get_servers_ports(ares_channel channel, - struct ares_addr_port_node **servers); - -CARES_EXTERN const char *ares_inet_ntop(int af, const void *src, char *dst, - ares_socklen_t size); - -CARES_EXTERN int ares_inet_pton(int af, const char *src, void *dst); - - -#ifdef __cplusplus -} -#endif - -#endif /* ARES__H */ diff --git a/lib/c-ares-1.19.1/include/ares_dns.h b/lib/c-ares-1.19.1/include/ares_dns.h deleted file mode 100644 index bc8aa7b1091..00000000000 --- a/lib/c-ares-1.19.1/include/ares_dns.h +++ /dev/null @@ -1,112 +0,0 @@ -#ifndef HEADER_CARES_DNS_H -#define HEADER_CARES_DNS_H - -/* Copyright 1998, 2011 by the Massachusetts Institute of Technology. - * - * 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. - */ - -/* - * NOTE TO INTEGRATORS: - * - * This header is made public due to legacy projects relying on it. - * Please do not use the macros within this header, or include this - * header in your project as it may be removed in the future. - */ - - -/* - * Macro DNS__16BIT reads a network short (16 bit) given in network - * byte order, and returns its value as an unsigned short. - */ -#define DNS__16BIT(p) ((unsigned short)((unsigned int) 0xffff & \ - (((unsigned int)((unsigned char)(p)[0]) << 8U) | \ - ((unsigned int)((unsigned char)(p)[1]))))) - -/* - * Macro DNS__32BIT reads a network long (32 bit) given in network - * byte order, and returns its value as an unsigned int. - */ -#define DNS__32BIT(p) ((unsigned int) \ - (((unsigned int)((unsigned char)(p)[0]) << 24U) | \ - ((unsigned int)((unsigned char)(p)[1]) << 16U) | \ - ((unsigned int)((unsigned char)(p)[2]) << 8U) | \ - ((unsigned int)((unsigned char)(p)[3])))) - -#define DNS__SET16BIT(p, v) (((p)[0] = (unsigned char)(((v) >> 8) & 0xff)), \ - ((p)[1] = (unsigned char)((v) & 0xff))) -#define DNS__SET32BIT(p, v) (((p)[0] = (unsigned char)(((v) >> 24) & 0xff)), \ - ((p)[1] = (unsigned char)(((v) >> 16) & 0xff)), \ - ((p)[2] = (unsigned char)(((v) >> 8) & 0xff)), \ - ((p)[3] = (unsigned char)((v) & 0xff))) - -#if 0 -/* we cannot use this approach on systems where we can't access 16/32 bit - data on un-aligned addresses */ -#define DNS__16BIT(p) ntohs(*(unsigned short*)(p)) -#define DNS__32BIT(p) ntohl(*(unsigned long*)(p)) -#define DNS__SET16BIT(p, v) *(unsigned short*)(p) = htons(v) -#define DNS__SET32BIT(p, v) *(unsigned long*)(p) = htonl(v) -#endif - -/* Macros for parsing a DNS header */ -#define DNS_HEADER_QID(h) DNS__16BIT(h) -#define DNS_HEADER_QR(h) (((h)[2] >> 7) & 0x1) -#define DNS_HEADER_OPCODE(h) (((h)[2] >> 3) & 0xf) -#define DNS_HEADER_AA(h) (((h)[2] >> 2) & 0x1) -#define DNS_HEADER_TC(h) (((h)[2] >> 1) & 0x1) -#define DNS_HEADER_RD(h) ((h)[2] & 0x1) -#define DNS_HEADER_RA(h) (((h)[3] >> 7) & 0x1) -#define DNS_HEADER_Z(h) (((h)[3] >> 4) & 0x7) -#define DNS_HEADER_RCODE(h) ((h)[3] & 0xf) -#define DNS_HEADER_QDCOUNT(h) DNS__16BIT((h) + 4) -#define DNS_HEADER_ANCOUNT(h) DNS__16BIT((h) + 6) -#define DNS_HEADER_NSCOUNT(h) DNS__16BIT((h) + 8) -#define DNS_HEADER_ARCOUNT(h) DNS__16BIT((h) + 10) - -/* Macros for constructing a DNS header */ -#define DNS_HEADER_SET_QID(h, v) DNS__SET16BIT(h, v) -#define DNS_HEADER_SET_QR(h, v) ((h)[2] |= (unsigned char)(((v) & 0x1) << 7)) -#define DNS_HEADER_SET_OPCODE(h, v) ((h)[2] |= (unsigned char)(((v) & 0xf) << 3)) -#define DNS_HEADER_SET_AA(h, v) ((h)[2] |= (unsigned char)(((v) & 0x1) << 2)) -#define DNS_HEADER_SET_TC(h, v) ((h)[2] |= (unsigned char)(((v) & 0x1) << 1)) -#define DNS_HEADER_SET_RD(h, v) ((h)[2] |= (unsigned char)((v) & 0x1)) -#define DNS_HEADER_SET_RA(h, v) ((h)[3] |= (unsigned char)(((v) & 0x1) << 7)) -#define DNS_HEADER_SET_Z(h, v) ((h)[3] |= (unsigned char)(((v) & 0x7) << 4)) -#define DNS_HEADER_SET_RCODE(h, v) ((h)[3] |= (unsigned char)((v) & 0xf)) -#define DNS_HEADER_SET_QDCOUNT(h, v) DNS__SET16BIT((h) + 4, v) -#define DNS_HEADER_SET_ANCOUNT(h, v) DNS__SET16BIT((h) + 6, v) -#define DNS_HEADER_SET_NSCOUNT(h, v) DNS__SET16BIT((h) + 8, v) -#define DNS_HEADER_SET_ARCOUNT(h, v) DNS__SET16BIT((h) + 10, v) - -/* Macros for parsing the fixed part of a DNS question */ -#define DNS_QUESTION_TYPE(q) DNS__16BIT(q) -#define DNS_QUESTION_CLASS(q) DNS__16BIT((q) + 2) - -/* Macros for constructing the fixed part of a DNS question */ -#define DNS_QUESTION_SET_TYPE(q, v) DNS__SET16BIT(q, v) -#define DNS_QUESTION_SET_CLASS(q, v) DNS__SET16BIT((q) + 2, v) - -/* Macros for parsing the fixed part of a DNS resource record */ -#define DNS_RR_TYPE(r) DNS__16BIT(r) -#define DNS_RR_CLASS(r) DNS__16BIT((r) + 2) -#define DNS_RR_TTL(r) DNS__32BIT((r) + 4) -#define DNS_RR_LEN(r) DNS__16BIT((r) + 8) - -/* Macros for constructing the fixed part of a DNS resource record */ -#define DNS_RR_SET_TYPE(r, v) DNS__SET16BIT(r, v) -#define DNS_RR_SET_CLASS(r, v) DNS__SET16BIT((r) + 2, v) -#define DNS_RR_SET_TTL(r, v) DNS__SET32BIT((r) + 4, v) -#define DNS_RR_SET_LEN(r, v) DNS__SET16BIT((r) + 8, v) - -#endif /* HEADER_CARES_DNS_H */ diff --git a/lib/c-ares-1.19.1/include/ares_nameser.h b/lib/c-ares-1.19.1/include/ares_nameser.h deleted file mode 100644 index 18a9e5ac0e2..00000000000 --- a/lib/c-ares-1.19.1/include/ares_nameser.h +++ /dev/null @@ -1,484 +0,0 @@ - -#ifndef ARES_NAMESER_H -#define ARES_NAMESER_H - -#include "ares_build.h" - -#ifdef CARES_HAVE_ARPA_NAMESER_H -# include -#endif -#ifdef CARES_HAVE_ARPA_NAMESER_COMPAT_H -# include -#endif - -/* ============================================================================ - * arpa/nameser.h may or may not provide ALL of the below defines, so check - * each one individually and set if not - * ============================================================================ - */ - -#ifndef NS_PACKETSZ -# define NS_PACKETSZ 512 /* maximum packet size */ -#endif - -#ifndef NS_MAXDNAME -# define NS_MAXDNAME 256 /* maximum domain name */ -#endif - -#ifndef NS_MAXCDNAME -# define NS_MAXCDNAME 255 /* maximum compressed domain name */ -#endif - -#ifndef NS_MAXLABEL -# define NS_MAXLABEL 63 -#endif - -#ifndef NS_HFIXEDSZ -# define NS_HFIXEDSZ 12 /* #/bytes of fixed data in header */ -#endif - -#ifndef NS_QFIXEDSZ -# define NS_QFIXEDSZ 4 /* #/bytes of fixed data in query */ -#endif - -#ifndef NS_RRFIXEDSZ -# define NS_RRFIXEDSZ 10 /* #/bytes of fixed data in r record */ -#endif - -#ifndef NS_INT16SZ -# define NS_INT16SZ 2 -#endif - -#ifndef NS_INADDRSZ -# define NS_INADDRSZ 4 -#endif - -#ifndef NS_IN6ADDRSZ -# define NS_IN6ADDRSZ 16 -#endif - -#ifndef NS_CMPRSFLGS -# define NS_CMPRSFLGS 0xc0 /* Flag bits indicating name compression. */ -#endif - -#ifndef NS_DEFAULTPORT -# define NS_DEFAULTPORT 53 /* For both TCP and UDP. */ -#endif - -/* ============================================================================ - * arpa/nameser.h should provide these enumerations always, so if not found, - * provide them - * ============================================================================ - */ -#ifndef CARES_HAVE_ARPA_NAMESER_H - -typedef enum __ns_class { - ns_c_invalid = 0, /* Cookie. */ - ns_c_in = 1, /* Internet. */ - ns_c_2 = 2, /* unallocated/unsupported. */ - ns_c_chaos = 3, /* MIT Chaos-net. */ - ns_c_hs = 4, /* MIT Hesiod. */ - /* Query class values which do not appear in resource records */ - ns_c_none = 254, /* for prereq. sections in update requests */ - ns_c_any = 255, /* Wildcard match. */ - ns_c_max = 65536 -} ns_class; - -typedef enum __ns_type { - ns_t_invalid = 0, /* Cookie. */ - ns_t_a = 1, /* Host address. */ - ns_t_ns = 2, /* Authoritative server. */ - ns_t_md = 3, /* Mail destination. */ - ns_t_mf = 4, /* Mail forwarder. */ - ns_t_cname = 5, /* Canonical name. */ - ns_t_soa = 6, /* Start of authority zone. */ - ns_t_mb = 7, /* Mailbox domain name. */ - ns_t_mg = 8, /* Mail group member. */ - ns_t_mr = 9, /* Mail rename name. */ - ns_t_null = 10, /* Null resource record. */ - ns_t_wks = 11, /* Well known service. */ - ns_t_ptr = 12, /* Domain name pointer. */ - ns_t_hinfo = 13, /* Host information. */ - ns_t_minfo = 14, /* Mailbox information. */ - ns_t_mx = 15, /* Mail routing information. */ - ns_t_txt = 16, /* Text strings. */ - ns_t_rp = 17, /* Responsible person. */ - ns_t_afsdb = 18, /* AFS cell database. */ - ns_t_x25 = 19, /* X_25 calling address. */ - ns_t_isdn = 20, /* ISDN calling address. */ - ns_t_rt = 21, /* Router. */ - ns_t_nsap = 22, /* NSAP address. */ - ns_t_nsap_ptr = 23, /* Reverse NSAP lookup (deprecated). */ - ns_t_sig = 24, /* Security signature. */ - ns_t_key = 25, /* Security key. */ - ns_t_px = 26, /* X.400 mail mapping. */ - ns_t_gpos = 27, /* Geographical position (withdrawn). */ - ns_t_aaaa = 28, /* Ip6 Address. */ - ns_t_loc = 29, /* Location Information. */ - ns_t_nxt = 30, /* Next domain (security). */ - ns_t_eid = 31, /* Endpoint identifier. */ - ns_t_nimloc = 32, /* Nimrod Locator. */ - ns_t_srv = 33, /* Server Selection. */ - ns_t_atma = 34, /* ATM Address */ - ns_t_naptr = 35, /* Naming Authority PoinTeR */ - ns_t_kx = 36, /* Key Exchange */ - ns_t_cert = 37, /* Certification record */ - ns_t_a6 = 38, /* IPv6 address (deprecates AAAA) */ - ns_t_dname = 39, /* Non-terminal DNAME (for IPv6) */ - ns_t_sink = 40, /* Kitchen sink (experimentatl) */ - ns_t_opt = 41, /* EDNS0 option (meta-RR) */ - ns_t_apl = 42, /* Address prefix list (RFC3123) */ - ns_t_ds = 43, /* Delegation Signer (RFC4034) */ - ns_t_sshfp = 44, /* SSH Key Fingerprint (RFC4255) */ - ns_t_rrsig = 46, /* Resource Record Signature (RFC4034) */ - ns_t_nsec = 47, /* Next Secure (RFC4034) */ - ns_t_dnskey = 48, /* DNS Public Key (RFC4034) */ - ns_t_tkey = 249, /* Transaction key */ - ns_t_tsig = 250, /* Transaction signature. */ - ns_t_ixfr = 251, /* Incremental zone transfer. */ - ns_t_axfr = 252, /* Transfer zone of authority. */ - ns_t_mailb = 253, /* Transfer mailbox records. */ - ns_t_maila = 254, /* Transfer mail agent records. */ - ns_t_any = 255, /* Wildcard match. */ - ns_t_uri = 256, /* Uniform Resource Identifier (RFC7553) */ - ns_t_caa = 257, /* Certification Authority Authorization. */ - ns_t_max = 65536 -} ns_type; - -typedef enum __ns_opcode { - ns_o_query = 0, /* Standard query. */ - ns_o_iquery = 1, /* Inverse query (deprecated/unsupported). */ - ns_o_status = 2, /* Name server status query (unsupported). */ - /* Opcode 3 is undefined/reserved. */ - ns_o_notify = 4, /* Zone change notification. */ - ns_o_update = 5, /* Zone update message. */ - ns_o_max = 6 -} ns_opcode; - -typedef enum __ns_rcode { - ns_r_noerror = 0, /* No error occurred. */ - ns_r_formerr = 1, /* Format error. */ - ns_r_servfail = 2, /* Server failure. */ - ns_r_nxdomain = 3, /* Name error. */ - ns_r_notimpl = 4, /* Unimplemented. */ - ns_r_refused = 5, /* Operation refused. */ - /* these are for BIND_UPDATE */ - ns_r_yxdomain = 6, /* Name exists */ - ns_r_yxrrset = 7, /* RRset exists */ - ns_r_nxrrset = 8, /* RRset does not exist */ - ns_r_notauth = 9, /* Not authoritative for zone */ - ns_r_notzone = 10, /* Zone of record different from zone section */ - ns_r_max = 11, - /* The following are TSIG extended errors */ - ns_r_badsig = 16, - ns_r_badkey = 17, - ns_r_badtime = 18 -} ns_rcode; - -#endif /* CARES_HAVE_ARPA_NAMESER_H */ - - -/* ============================================================================ - * arpa/nameser_compat.h typically sets these. However on some systems - * arpa/nameser.h does, but may not set all of them. Lets conditionally - * define each - * ============================================================================ - */ - -#ifndef PACKETSZ -# define PACKETSZ NS_PACKETSZ -#endif - -#ifndef MAXDNAME -# define MAXDNAME NS_MAXDNAME -#endif - -#ifndef MAXCDNAME -# define MAXCDNAME NS_MAXCDNAME -#endif - -#ifndef MAXLABEL -# define MAXLABEL NS_MAXLABEL -#endif - -#ifndef HFIXEDSZ -# define HFIXEDSZ NS_HFIXEDSZ -#endif - -#ifndef QFIXEDSZ -# define QFIXEDSZ NS_QFIXEDSZ -#endif - -#ifndef RRFIXEDSZ -# define RRFIXEDSZ NS_RRFIXEDSZ -#endif - -#ifndef INDIR_MASK -# define INDIR_MASK NS_CMPRSFLGS -#endif - -#ifndef NAMESERVER_PORT -# define NAMESERVER_PORT NS_DEFAULTPORT -#endif - - -/* opcodes */ -#ifndef O_QUERY -# define O_QUERY 0 /* ns_o_query */ -#endif -#ifndef O_IQUERY -# define O_IQUERY 1 /* ns_o_iquery */ -#endif -#ifndef O_STATUS -# define O_STATUS 2 /* ns_o_status */ -#endif -#ifndef O_NOTIFY -# define O_NOTIFY 4 /* ns_o_notify */ -#endif -#ifndef O_UPDATE -# define O_UPDATE 5 /* ns_o_update */ -#endif - - -/* response codes */ -#ifndef SERVFAIL -# define SERVFAIL ns_r_servfail -#endif -#ifndef NOTIMP -# define NOTIMP ns_r_notimpl -#endif -#ifndef REFUSED -# define REFUSED ns_r_refused -#endif -#if defined(_WIN32) && !defined(HAVE_ARPA_NAMESER_COMPAT_H) && defined(NOERROR) -# undef NOERROR /* it seems this is already defined in winerror.h */ -#endif -#ifndef NOERROR -# define NOERROR ns_r_noerror -#endif -#ifndef FORMERR -# define FORMERR ns_r_formerr -#endif -#ifndef NXDOMAIN -# define NXDOMAIN ns_r_nxdomain -#endif -/* Non-standard response codes, use numeric values */ -#ifndef YXDOMAIN -# define YXDOMAIN 6 /* ns_r_yxdomain */ -#endif -#ifndef YXRRSET -# define YXRRSET 7 /* ns_r_yxrrset */ -#endif -#ifndef NXRRSET -# define NXRRSET 8 /* ns_r_nxrrset */ -#endif -#ifndef NOTAUTH -# define NOTAUTH 9 /* ns_r_notauth */ -#endif -#ifndef NOTZONE -# define NOTZONE 10 /* ns_r_notzone */ -#endif -#ifndef TSIG_BADSIG -# define TSIG_BADSIG 16 /* ns_r_badsig */ -#endif -#ifndef TSIG_BADKEY -# define TSIG_BADKEY 17 /* ns_r_badkey */ -#endif -#ifndef TSIG_BADTIME -# define TSIG_BADTIME 18 /* ns_r_badtime */ -#endif - - -/* classes */ -#ifndef C_IN -# define C_IN 1 /* ns_c_in */ -#endif -#ifndef C_CHAOS -# define C_CHAOS 3 /* ns_c_chaos */ -#endif -#ifndef C_HS -# define C_HS 4 /* ns_c_hs */ -#endif -#ifndef C_NONE -# define C_NONE 254 /* ns_c_none */ -#endif -#ifndef C_ANY -# define C_ANY 255 /* ns_c_any */ -#endif - - -/* types */ -#ifndef T_A -# define T_A 1 /* ns_t_a */ -#endif -#ifndef T_NS -# define T_NS 2 /* ns_t_ns */ -#endif -#ifndef T_MD -# define T_MD 3 /* ns_t_md */ -#endif -#ifndef T_MF -# define T_MF 4 /* ns_t_mf */ -#endif -#ifndef T_CNAME -# define T_CNAME 5 /* ns_t_cname */ -#endif -#ifndef T_SOA -# define T_SOA 6 /* ns_t_soa */ -#endif -#ifndef T_MB -# define T_MB 7 /* ns_t_mb */ -#endif -#ifndef T_MG -# define T_MG 8 /* ns_t_mg */ -#endif -#ifndef T_MR -# define T_MR 9 /* ns_t_mr */ -#endif -#ifndef T_NULL -# define T_NULL 10 /* ns_t_null */ -#endif -#ifndef T_WKS -# define T_WKS 11 /* ns_t_wks */ -#endif -#ifndef T_PTR -# define T_PTR 12 /* ns_t_ptr */ -#endif -#ifndef T_HINFO -# define T_HINFO 13 /* ns_t_hinfo */ -#endif -#ifndef T_MINFO -# define T_MINFO 14 /* ns_t_minfo */ -#endif -#ifndef T_MX -# define T_MX 15 /* ns_t_mx */ -#endif -#ifndef T_TXT -# define T_TXT 16 /* ns_t_txt */ -#endif -#ifndef T_RP -# define T_RP 17 /* ns_t_rp */ -#endif -#ifndef T_AFSDB -# define T_AFSDB 18 /* ns_t_afsdb */ -#endif -#ifndef T_X25 -# define T_X25 19 /* ns_t_x25 */ -#endif -#ifndef T_ISDN -# define T_ISDN 20 /* ns_t_isdn */ -#endif -#ifndef T_RT -# define T_RT 21 /* ns_t_rt */ -#endif -#ifndef T_NSAP -# define T_NSAP 22 /* ns_t_nsap */ -#endif -#ifndef T_NSAP_PTR -# define T_NSAP_PTR 23 /* ns_t_nsap_ptr */ -#endif -#ifndef T_SIG -# define T_SIG 24 /* ns_t_sig */ -#endif -#ifndef T_KEY -# define T_KEY 25 /* ns_t_key */ -#endif -#ifndef T_PX -# define T_PX 26 /* ns_t_px */ -#endif -#ifndef T_GPOS -# define T_GPOS 27 /* ns_t_gpos */ -#endif -#ifndef T_AAAA -# define T_AAAA 28 /* ns_t_aaaa */ -#endif -#ifndef T_LOC -# define T_LOC 29 /* ns_t_loc */ -#endif -#ifndef T_NXT -# define T_NXT 30 /* ns_t_nxt */ -#endif -#ifndef T_EID -# define T_EID 31 /* ns_t_eid */ -#endif -#ifndef T_NIMLOC -# define T_NIMLOC 32 /* ns_t_nimloc */ -#endif -#ifndef T_SRV -# define T_SRV 33 /* ns_t_srv */ -#endif -#ifndef T_ATMA -# define T_ATMA 34 /* ns_t_atma */ -#endif -#ifndef T_NAPTR -# define T_NAPTR 35 /* ns_t_naptr */ -#endif -#ifndef T_KX -# define T_KX 36 /* ns_t_kx */ -#endif -#ifndef T_CERT -# define T_CERT 37 /* ns_t_cert */ -#endif -#ifndef T_A6 -# define T_A6 38 /* ns_t_a6 */ -#endif -#ifndef T_DNAME -# define T_DNAME 39 /* ns_t_dname */ -#endif -#ifndef T_SINK -# define T_SINK 40 /* ns_t_sink */ -#endif -#ifndef T_OPT -# define T_OPT 41 /* ns_t_opt */ -#endif -#ifndef T_APL -# define T_APL 42 /* ns_t_apl */ -#endif -#ifndef T_DS -# define T_DS 43 /* ns_t_ds */ -#endif -#ifndef T_SSHFP -# define T_SSHFP 44 /* ns_t_sshfp */ -#endif -#ifndef T_RRSIG -# define T_RRSIG 46 /* ns_t_rrsig */ -#endif -#ifndef T_NSEC -# define T_NSEC 47 /* ns_t_nsec */ -#endif -#ifndef T_DNSKEY -# define T_DNSKEY 48 /* ns_t_dnskey */ -#endif -#ifndef T_TKEY -# define T_TKEY 249 /* ns_t_tkey */ -#endif -#ifndef T_TSIG -# define T_TSIG 250 /* ns_t_tsig */ -#endif -#ifndef T_IXFR -# define T_IXFR 251 /* ns_t_ixfr */ -#endif -#ifndef T_AXFR -# define T_AXFR 252 /* ns_t_axfr */ -#endif -#ifndef T_MAILB -# define T_MAILB 253 /* ns_t_mailb */ -#endif -#ifndef T_MAILA -# define T_MAILA 254 /* ns_t_maila */ -#endif -#ifndef T_ANY -# define T_ANY 255 /* ns_t_any */ -#endif -#ifndef T_URI -# define T_URI 256 /* ns_t_uri */ -#endif -#ifndef T_CAA -# define T_CAA 257 /* ns_t_caa */ -#endif -#ifndef T_MAX -# define T_MAX 65536 /* ns_t_max */ -#endif - - -#endif /* ARES_NAMESER_H */ diff --git a/lib/c-ares-1.19.1/include/ares_version.h b/lib/c-ares-1.19.1/include/ares_version.h deleted file mode 100644 index 35a1ed1a3d3..00000000000 --- a/lib/c-ares-1.19.1/include/ares_version.h +++ /dev/null @@ -1,24 +0,0 @@ - -#ifndef ARES__VERSION_H -#define ARES__VERSION_H - -/* This is the global package copyright */ -#define ARES_COPYRIGHT "2004 - 2021 Daniel Stenberg, ." - -#define ARES_VERSION_MAJOR 1 -#define ARES_VERSION_MINOR 19 -#define ARES_VERSION_PATCH 1 -#define ARES_VERSION ((ARES_VERSION_MAJOR<<16)|\ - (ARES_VERSION_MINOR<<8)|\ - (ARES_VERSION_PATCH)) -#define ARES_VERSION_STR "1.19.1" - -#if (ARES_VERSION >= 0x010700) -# define CARES_HAVE_ARES_LIBRARY_INIT 1 -# define CARES_HAVE_ARES_LIBRARY_CLEANUP 1 -#else -# undef CARES_HAVE_ARES_LIBRARY_INIT -# undef CARES_HAVE_ARES_LIBRARY_CLEANUP -#endif - -#endif diff --git a/lib/c-ares-1.19.1/src/CMakeLists.txt b/lib/c-ares-1.19.1/src/CMakeLists.txt deleted file mode 100644 index 6750c1780f6..00000000000 --- a/lib/c-ares-1.19.1/src/CMakeLists.txt +++ /dev/null @@ -1,2 +0,0 @@ -ADD_SUBDIRECTORY (lib) -ADD_SUBDIRECTORY (tools) diff --git a/lib/c-ares-1.19.1/src/Makefile.am b/lib/c-ares-1.19.1/src/Makefile.am deleted file mode 100644 index 2e97e422f73..00000000000 --- a/lib/c-ares-1.19.1/src/Makefile.am +++ /dev/null @@ -1,2 +0,0 @@ -EXTRA_DIST=CMakeLists.txt -SUBDIRS=lib tools diff --git a/lib/c-ares-1.19.1/src/lib/ares__addrinfo2hostent.c b/lib/c-ares-1.19.1/src/lib/ares__addrinfo2hostent.c deleted file mode 100644 index efb145cd11b..00000000000 --- a/lib/c-ares-1.19.1/src/lib/ares__addrinfo2hostent.c +++ /dev/null @@ -1,266 +0,0 @@ -/* Copyright 1998 by the Massachusetts Institute of Technology. - * Copyright 2005 Dominick Meglio - * Copyright (C) 2019 by Andrew Selivanov - * Copyright (C) 2021 by Brad House - * - * 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. - */ - -#include "ares_setup.h" - -#ifdef HAVE_NETINET_IN_H -# include -#endif -#ifdef HAVE_NETDB_H -# include -#endif -#ifdef HAVE_ARPA_INET_H -# include -#endif - -#include "ares_nameser.h" - -#ifdef HAVE_STRINGS_H -# include -#endif - -#ifdef HAVE_LIMITS_H -# include -#endif - -#include "ares.h" -#include "ares_dns.h" -#include "ares_inet_net_pton.h" -#include "ares_private.h" - -int ares__addrinfo2hostent(const struct ares_addrinfo *ai, int family, - struct hostent **host) -{ - struct ares_addrinfo_node *next; - struct ares_addrinfo_cname *next_cname; - char **aliases = NULL; - char *addrs = NULL; - int naliases = 0, naddrs = 0, alias = 0, i; - - if (ai == NULL || host == NULL) - return ARES_EBADQUERY; - - *host = ares_malloc(sizeof(**host)); - if (!(*host)) - { - goto enomem; - } - memset(*host, 0, sizeof(**host)); - - /* Use the first node of the response as the family, since hostent can only - * represent one family. We assume getaddrinfo() returned a sorted list if - * the user requested AF_UNSPEC. */ - if (family == AF_UNSPEC && ai->nodes) - family = ai->nodes->ai_family; - - next = ai->nodes; - while (next) - { - if(next->ai_family == family) - { - ++naddrs; - } - next = next->ai_next; - } - - next_cname = ai->cnames; - while (next_cname) - { - if(next_cname->alias) - ++naliases; - next_cname = next_cname->next; - } - - aliases = ares_malloc((naliases + 1) * sizeof(char *)); - if (!aliases) - { - goto enomem; - } - (*host)->h_aliases = aliases; - memset(aliases, 0, (naliases + 1) * sizeof(char *)); - - if (naliases) - { - next_cname = ai->cnames; - while (next_cname) - { - if(next_cname->alias) { - aliases[alias] = ares_strdup(next_cname->alias); - if (!aliases[alias]) { - goto enomem; - } - alias++; - } - next_cname = next_cname->next; - } - } - - - (*host)->h_addr_list = ares_malloc((naddrs + 1) * sizeof(char *)); - if (!(*host)->h_addr_list) - { - goto enomem; - } - - memset((*host)->h_addr_list, 0, (naddrs + 1) * sizeof(char *)); - - if (ai->cnames) - { - (*host)->h_name = ares_strdup(ai->cnames->name); - if ((*host)->h_name == NULL && ai->cnames->name) - { - goto enomem; - } - } - else - { - (*host)->h_name = ares_strdup(ai->name); - if ((*host)->h_name == NULL && ai->name) - { - goto enomem; - } - } - - (*host)->h_addrtype = family; - (*host)->h_length = (family == AF_INET)? - sizeof(struct in_addr):sizeof(struct ares_in6_addr); - - if (naddrs) - { - addrs = ares_malloc(naddrs * (*host)->h_length); - if (!addrs) - { - goto enomem; - } - - i = 0; - next = ai->nodes; - while (next) - { - if(next->ai_family == family) - { - (*host)->h_addr_list[i] = addrs + (i * (*host)->h_length); - if (family == AF_INET6) - { - memcpy((*host)->h_addr_list[i], - &(CARES_INADDR_CAST(struct sockaddr_in6 *, next->ai_addr)->sin6_addr), - (*host)->h_length); - } - else - { - memcpy((*host)->h_addr_list[i], - &(CARES_INADDR_CAST(struct sockaddr_in *, next->ai_addr)->sin_addr), - (*host)->h_length); - } - ++i; - } - next = next->ai_next; - } - - if (i == 0) - { - ares_free(addrs); - } - } - - if (naddrs == 0 && naliases == 0) - { - ares_free_hostent(*host); - *host = NULL; - return ARES_ENODATA; - } - - return ARES_SUCCESS; - -enomem: - ares_free_hostent(*host); - *host = NULL; - return ARES_ENOMEM; -} - - -int ares__addrinfo2addrttl(const struct ares_addrinfo *ai, int family, - int req_naddrttls, struct ares_addrttl *addrttls, - struct ares_addr6ttl *addr6ttls, int *naddrttls) -{ - struct ares_addrinfo_node *next; - struct ares_addrinfo_cname *next_cname; - int cname_ttl = INT_MAX; - - if (family != AF_INET && family != AF_INET6) - return ARES_EBADQUERY; - - if (ai == NULL || naddrttls == NULL) - return ARES_EBADQUERY; - - if (family == AF_INET && addrttls == NULL) - return ARES_EBADQUERY; - - if (family == AF_INET6 && addr6ttls == NULL) - return ARES_EBADQUERY; - - if (req_naddrttls == 0) - return ARES_EBADQUERY; - - *naddrttls = 0; - - next_cname = ai->cnames; - while (next_cname) - { - if(next_cname->ttl < cname_ttl) - cname_ttl = next_cname->ttl; - next_cname = next_cname->next; - } - - next = ai->nodes; - while (next) - { - if(next->ai_family == family) - { - if (*naddrttls < req_naddrttls) - { - if (family == AF_INET6) - { - if(next->ai_ttl > cname_ttl) - addr6ttls[*naddrttls].ttl = cname_ttl; - else - addr6ttls[*naddrttls].ttl = next->ai_ttl; - - memcpy(&addr6ttls[*naddrttls].ip6addr, - &(CARES_INADDR_CAST(struct sockaddr_in6 *, next->ai_addr)->sin6_addr), - sizeof(struct ares_in6_addr)); - } - else - { - if(next->ai_ttl > cname_ttl) - addrttls[*naddrttls].ttl = cname_ttl; - else - addrttls[*naddrttls].ttl = next->ai_ttl; - memcpy(&addrttls[*naddrttls].ipaddr, - &(CARES_INADDR_CAST(struct sockaddr_in *, next->ai_addr)->sin_addr), - sizeof(struct in_addr)); - } - (*naddrttls)++; - } - } - next = next->ai_next; - } - - return ARES_SUCCESS; -} - diff --git a/lib/c-ares-1.19.1/src/lib/ares__addrinfo_localhost.c b/lib/c-ares-1.19.1/src/lib/ares__addrinfo_localhost.c deleted file mode 100644 index 5bc1e0bff08..00000000000 --- a/lib/c-ares-1.19.1/src/lib/ares__addrinfo_localhost.c +++ /dev/null @@ -1,240 +0,0 @@ -/* Copyright (C) 2021 - * - * 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. - */ - -#include "ares_setup.h" - -#ifdef HAVE_NETINET_IN_H -# include -#endif -#ifdef HAVE_NETDB_H -# include -#endif -#ifdef HAVE_ARPA_INET_H -# include -#endif - -#if defined(_WIN32) && defined(_WIN32_WINNT) && _WIN32_WINNT >= 0x0600 -#include -#include -#endif - -#include "ares.h" -#include "ares_inet_net_pton.h" -#include "ares_nowarn.h" -#include "ares_private.h" - -int ares_append_ai_node(int aftype, - unsigned short port, - int ttl, - const void *adata, - struct ares_addrinfo_node **nodes) -{ - struct ares_addrinfo_node *node; - - node = ares__append_addrinfo_node(nodes); - if (!node) - { - return ARES_ENOMEM; - } - - memset(node, 0, sizeof(*node)); - - if (aftype == AF_INET) - { - struct sockaddr_in *sin = ares_malloc(sizeof(*sin)); - if (!sin) - { - return ARES_ENOMEM; - } - - memset(sin, 0, sizeof(*sin)); - memcpy(&sin->sin_addr.s_addr, adata, sizeof(sin->sin_addr.s_addr)); - sin->sin_family = AF_INET; - sin->sin_port = htons(port); - - node->ai_addr = (struct sockaddr *)sin; - node->ai_family = AF_INET; - node->ai_addrlen = sizeof(*sin); - node->ai_addr = (struct sockaddr *)sin; - node->ai_ttl = ttl; - } - - if (aftype == AF_INET6) - { - struct sockaddr_in6 *sin6 = ares_malloc(sizeof(*sin6)); - if (!sin6) - { - return ARES_ENOMEM; - } - - memset(sin6, 0, sizeof(*sin6)); - memcpy(&sin6->sin6_addr.s6_addr, adata, sizeof(sin6->sin6_addr.s6_addr)); - sin6->sin6_family = AF_INET6; - sin6->sin6_port = htons(port); - - node->ai_addr = (struct sockaddr *)sin6; - node->ai_family = AF_INET6; - node->ai_addrlen = sizeof(*sin6); - node->ai_addr = (struct sockaddr *)sin6; - node->ai_ttl = ttl; - } - - return ARES_SUCCESS; -} - - -static int ares__default_loopback_addrs(int aftype, - unsigned short port, - struct ares_addrinfo_node **nodes) -{ - int status = ARES_SUCCESS; - - if (aftype == AF_UNSPEC || aftype == AF_INET6) - { - struct ares_in6_addr addr6; - ares_inet_pton(AF_INET6, "::1", &addr6); - status = ares_append_ai_node(AF_INET6, port, 0, &addr6, nodes); - if (status != ARES_SUCCESS) - { - return status; - } - } - - if (aftype == AF_UNSPEC || aftype == AF_INET) - { - struct in_addr addr4; - ares_inet_pton(AF_INET, "127.0.0.1", &addr4); - status = ares_append_ai_node(AF_INET, port, 0, &addr4, nodes); - if (status != ARES_SUCCESS) - { - return status; - } - } - - return status; -} - - -static int ares__system_loopback_addrs(int aftype, - unsigned short port, - struct ares_addrinfo_node **nodes) -{ -#if defined(_WIN32) && defined(_WIN32_WINNT) && _WIN32_WINNT >= 0x0600 && !defined(__WATCOMC__) - PMIB_UNICASTIPADDRESS_TABLE table; - unsigned int i; - int status; - - *nodes = NULL; - - if (GetUnicastIpAddressTable(aftype, &table) != NO_ERROR) - return ARES_ENOTFOUND; - - for (i=0; iNumEntries; i++) - { - if (table->Table[i].InterfaceLuid.Info.IfType != - IF_TYPE_SOFTWARE_LOOPBACK) - { - continue; - } - - if (table->Table[i].Address.si_family == AF_INET) - { - status = ares_append_ai_node(table->Table[i].Address.si_family, port, 0, - &table->Table[i].Address.Ipv4.sin_addr, - nodes); - } - else if (table->Table[i].Address.si_family == AF_INET6) - { - status = ares_append_ai_node(table->Table[i].Address.si_family, port, 0, - &table->Table[i].Address.Ipv6.sin6_addr, - nodes); - } - else - { - /* Ignore any others */ - continue; - } - - if (status != ARES_SUCCESS) - { - goto fail; - } - } - - if (*nodes == NULL) - status = ARES_ENOTFOUND; - -fail: - FreeMibTable(table); - - if (status != ARES_SUCCESS) - { - ares__freeaddrinfo_nodes(*nodes); - *nodes = NULL; - } - - return status; - -#else - (void)aftype; - (void)port; - (void)nodes; - /* Not supported on any other OS at this time */ - return ARES_ENOTFOUND; -#endif -} - - -int ares__addrinfo_localhost(const char *name, - unsigned short port, - const struct ares_addrinfo_hints *hints, - struct ares_addrinfo *ai) -{ - struct ares_addrinfo_node *nodes = NULL; - int result; - - /* Validate family */ - switch (hints->ai_family) { - case AF_INET: - case AF_INET6: - case AF_UNSPEC: - break; - default: - return ARES_EBADFAMILY; - } - - ai->name = ares_strdup(name); - if(!ai->name) - { - goto enomem; - } - - result = ares__system_loopback_addrs(hints->ai_family, port, &nodes); - - if (result == ARES_ENOTFOUND) - { - result = ares__default_loopback_addrs(hints->ai_family, port, &nodes); - } - - ares__addrinfo_cat_nodes(&ai->nodes, nodes); - - return result; - -enomem: - ares__freeaddrinfo_nodes(nodes); - ares_free(ai->name); - ai->name = NULL; - return ARES_ENOMEM; -} diff --git a/lib/c-ares-1.19.1/src/lib/ares__close_sockets.c b/lib/c-ares-1.19.1/src/lib/ares__close_sockets.c deleted file mode 100644 index 0477174e3e1..00000000000 --- a/lib/c-ares-1.19.1/src/lib/ares__close_sockets.c +++ /dev/null @@ -1,61 +0,0 @@ - -/* Copyright 1998 by the Massachusetts Institute of Technology. - * - * 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. - */ - -#include "ares_setup.h" - -#include "ares.h" -#include "ares_private.h" - -void ares__close_sockets(ares_channel channel, struct server_state *server) -{ - struct send_request *sendreq; - - /* Free all pending output buffers. */ - while (server->qhead) - { - /* Advance server->qhead; pull out query as we go. */ - sendreq = server->qhead; - server->qhead = sendreq->next; - if (sendreq->data_storage != NULL) - ares_free(sendreq->data_storage); - ares_free(sendreq); - } - server->qtail = NULL; - - /* Reset any existing input buffer. */ - if (server->tcp_buffer) - ares_free(server->tcp_buffer); - server->tcp_buffer = NULL; - server->tcp_lenbuf_pos = 0; - - /* Reset brokenness */ - server->is_broken = 0; - - /* Close the TCP and UDP sockets. */ - if (server->tcp_socket != ARES_SOCKET_BAD) - { - SOCK_STATE_CALLBACK(channel, server->tcp_socket, 0, 0); - ares__close_socket(channel, server->tcp_socket); - server->tcp_socket = ARES_SOCKET_BAD; - server->tcp_connection_generation = ++channel->tcp_connection_generation; - } - if (server->udp_socket != ARES_SOCKET_BAD) - { - SOCK_STATE_CALLBACK(channel, server->udp_socket, 0, 0); - ares__close_socket(channel, server->udp_socket); - server->udp_socket = ARES_SOCKET_BAD; - } -} diff --git a/lib/c-ares-1.19.1/src/lib/ares__get_hostent.c b/lib/c-ares-1.19.1/src/lib/ares__get_hostent.c deleted file mode 100644 index 367f39037b1..00000000000 --- a/lib/c-ares-1.19.1/src/lib/ares__get_hostent.c +++ /dev/null @@ -1,260 +0,0 @@ - -/* Copyright 1998, 2011 by the Massachusetts Institute of Technology. - * - * 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. - */ - -#include "ares_setup.h" - -#ifdef HAVE_NETINET_IN_H -# include -#endif -#ifdef HAVE_NETDB_H -# include -#endif -#ifdef HAVE_ARPA_INET_H -# include -#endif - -#include "ares.h" -#include "ares_inet_net_pton.h" -#include "ares_nowarn.h" -#include "ares_private.h" - -int ares__get_hostent(FILE *fp, int family, struct hostent **host) -{ - char *line = NULL, *p, *q, **alias; - char *txtaddr, *txthost, *txtalias; - int status; - size_t addrlen, linesize, naliases; - struct ares_addr addr; - struct hostent *hostent = NULL; - - *host = NULL; /* Assume failure */ - - /* Validate family */ - switch (family) { - case AF_INET: - case AF_INET6: - case AF_UNSPEC: - break; - default: - return ARES_EBADFAMILY; - } - - while ((status = ares__read_line(fp, &line, &linesize)) == ARES_SUCCESS) - { - - /* Trim line comment. */ - p = line; - while (*p && (*p != '#')) - p++; - *p = '\0'; - - /* Trim trailing whitespace. */ - q = p - 1; - while ((q >= line) && ISSPACE(*q)) - q--; - *++q = '\0'; - - /* Skip leading whitespace. */ - p = line; - while (*p && ISSPACE(*p)) - p++; - if (!*p) - /* Ignore line if empty. */ - continue; - - /* Pointer to start of IPv4 or IPv6 address part. */ - txtaddr = p; - - /* Advance past address part. */ - while (*p && !ISSPACE(*p)) - p++; - if (!*p) - /* Ignore line if reached end of line. */ - continue; - - /* Null terminate address part. */ - *p = '\0'; - - /* Advance to host name */ - p++; - while (*p && ISSPACE(*p)) - p++; - if (!*p) - /* Ignore line if reached end of line. */ - continue; /* LCOV_EXCL_LINE: trailing whitespace already stripped */ - - /* Pointer to start of host name. */ - txthost = p; - - /* Advance past host name. */ - while (*p && !ISSPACE(*p)) - p++; - - /* Pointer to start of first alias. */ - txtalias = NULL; - if (*p) - { - q = p + 1; - while (*q && ISSPACE(*q)) - q++; - if (*q) - txtalias = q; - } - - /* Null terminate host name. */ - *p = '\0'; - - /* find out number of aliases. */ - naliases = 0; - if (txtalias) - { - p = txtalias; - while (*p) - { - while (*p && !ISSPACE(*p)) - p++; - while (*p && ISSPACE(*p)) - p++; - naliases++; - } - } - - /* Convert address string to network address for the requested family. */ - addrlen = 0; - addr.family = AF_UNSPEC; - addr.addrV4.s_addr = INADDR_NONE; - if ((family == AF_INET) || (family == AF_UNSPEC)) - { - if (ares_inet_pton(AF_INET, txtaddr, &addr.addrV4) > 0) - { - /* Actual network address family and length. */ - addr.family = AF_INET; - addrlen = sizeof(addr.addrV4); - } - } - if ((family == AF_INET6) || ((family == AF_UNSPEC) && (!addrlen))) - { - if (ares_inet_pton(AF_INET6, txtaddr, &addr.addrV6) > 0) - { - /* Actual network address family and length. */ - addr.family = AF_INET6; - addrlen = sizeof(addr.addrV6); - } - } - if (!addrlen) - /* Ignore line if invalid address string for the requested family. */ - continue; - - /* - ** Actual address family possible values are AF_INET and AF_INET6 only. - */ - - /* Allocate memory for the hostent structure. */ - hostent = ares_malloc(sizeof(struct hostent)); - if (!hostent) - break; - - /* Initialize fields for out of memory condition. */ - hostent->h_aliases = NULL; - hostent->h_addr_list = NULL; - - /* Copy official host name. */ - hostent->h_name = ares_strdup(txthost); - if (!hostent->h_name) - break; - - /* Copy network address. */ - hostent->h_addr_list = ares_malloc(2 * sizeof(char *)); - if (!hostent->h_addr_list) - break; - hostent->h_addr_list[1] = NULL; - hostent->h_addr_list[0] = ares_malloc(addrlen); - if (!hostent->h_addr_list[0]) - break; - if (addr.family == AF_INET) - memcpy(hostent->h_addr_list[0], &addr.addrV4, sizeof(addr.addrV4)); - else - memcpy(hostent->h_addr_list[0], &addr.addrV6, sizeof(addr.addrV6)); - - /* Copy aliases. */ - hostent->h_aliases = ares_malloc((naliases + 1) * sizeof(char *)); - if (!hostent->h_aliases) - break; - alias = hostent->h_aliases; - while (naliases) - *(alias + naliases--) = NULL; - *alias = NULL; - while (txtalias) - { - p = txtalias; - while (*p && !ISSPACE(*p)) - p++; - q = p; - while (*q && ISSPACE(*q)) - q++; - *p = '\0'; - if ((*alias = ares_strdup(txtalias)) == NULL) - break; - alias++; - txtalias = *q ? q : NULL; - } - if (txtalias) - /* Alias memory allocation failure. */ - break; - - /* Copy actual network address family and length. */ - hostent->h_addrtype = aresx_sitoss(addr.family); - hostent->h_length = aresx_uztoss(addrlen); - - /* Free line buffer. */ - ares_free(line); - - /* Return hostent successfully */ - *host = hostent; - return ARES_SUCCESS; - - } - - /* If allocated, free line buffer. */ - if (line) - ares_free(line); - - if (status == ARES_SUCCESS) - { - /* Memory allocation failure; clean up. */ - if (hostent) - { - if (hostent->h_name) - ares_free((char *) hostent->h_name); - if (hostent->h_aliases) - { - for (alias = hostent->h_aliases; *alias; alias++) - ares_free(*alias); - ares_free(hostent->h_aliases); - } - if (hostent->h_addr_list) - { - if (hostent->h_addr_list[0]) - ares_free(hostent->h_addr_list[0]); - ares_free(hostent->h_addr_list); - } - ares_free(hostent); - } - return ARES_ENOMEM; - } - - return status; -} diff --git a/lib/c-ares-1.19.1/src/lib/ares__parse_into_addrinfo.c b/lib/c-ares-1.19.1/src/lib/ares__parse_into_addrinfo.c deleted file mode 100644 index 4393f04b961..00000000000 --- a/lib/c-ares-1.19.1/src/lib/ares__parse_into_addrinfo.c +++ /dev/null @@ -1,229 +0,0 @@ -/* Copyright (C) 2019 by Andrew Selivanov - * - * 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. - */ - -#include "ares_setup.h" - -#ifdef HAVE_NETINET_IN_H -# include -#endif -#ifdef HAVE_NETDB_H -# include -#endif -#ifdef HAVE_ARPA_INET_H -# include -#endif - -#include "ares_nameser.h" - -#ifdef HAVE_STRINGS_H -# include -#endif - -#ifdef HAVE_LIMITS_H -# include -#endif - -#include "ares.h" -#include "ares_dns.h" -#include "ares_private.h" - -int ares__parse_into_addrinfo(const unsigned char *abuf, - int alen, int cname_only_is_enodata, - unsigned short port, - struct ares_addrinfo *ai) -{ - unsigned int qdcount, ancount; - int status, i, rr_type, rr_class, rr_len, rr_ttl; - int got_a = 0, got_aaaa = 0, got_cname = 0; - long len; - const unsigned char *aptr; - char *question_hostname = NULL; - char *hostname, *rr_name = NULL, *rr_data; - struct ares_addrinfo_cname *cname, *cnames = NULL; - struct ares_addrinfo_node *nodes = NULL; - - /* Give up if abuf doesn't have room for a header. */ - if (alen < HFIXEDSZ) - return ARES_EBADRESP; - - /* Fetch the question and answer count from the header. */ - qdcount = DNS_HEADER_QDCOUNT(abuf); - ancount = DNS_HEADER_ANCOUNT(abuf); - if (qdcount != 1) - return ARES_EBADRESP; - - - /* Expand the name from the question, and skip past the question. */ - aptr = abuf + HFIXEDSZ; - status = ares__expand_name_for_response(aptr, abuf, alen, &question_hostname, &len, 0); - if (status != ARES_SUCCESS) - return status; - if (aptr + len + QFIXEDSZ > abuf + alen) - { - status = ARES_EBADRESP; - goto failed_stat; - } - - hostname = question_hostname; - - aptr += len + QFIXEDSZ; - - /* Examine each answer resource record (RR) in turn. */ - for (i = 0; i < (int)ancount; i++) - { - /* Decode the RR up to the data field. */ - status = ares__expand_name_for_response(aptr, abuf, alen, &rr_name, &len, 0); - if (status != ARES_SUCCESS) - { - rr_name = NULL; - goto failed_stat; - } - - aptr += len; - if (aptr + RRFIXEDSZ > abuf + alen) - { - status = ARES_EBADRESP; - goto failed_stat; - } - rr_type = DNS_RR_TYPE(aptr); - rr_class = DNS_RR_CLASS(aptr); - rr_len = DNS_RR_LEN(aptr); - rr_ttl = DNS_RR_TTL(aptr); - aptr += RRFIXEDSZ; - if (aptr + rr_len > abuf + alen) - { - status = ARES_EBADRESP; - goto failed_stat; - } - - if (rr_class == C_IN && rr_type == T_A - && rr_len == sizeof(struct in_addr) - && strcasecmp(rr_name, hostname) == 0) - { - got_a = 1; - if (aptr + sizeof(struct in_addr) > abuf + alen) - { /* LCOV_EXCL_START: already checked above */ - status = ARES_EBADRESP; - goto failed_stat; - } /* LCOV_EXCL_STOP */ - - status = ares_append_ai_node(AF_INET, port, rr_ttl, aptr, &nodes); - if (status != ARES_SUCCESS) - goto failed_stat; - } - else if (rr_class == C_IN && rr_type == T_AAAA - && rr_len == sizeof(struct ares_in6_addr) - && strcasecmp(rr_name, hostname) == 0) - { - got_aaaa = 1; - if (aptr + sizeof(struct ares_in6_addr) > abuf + alen) - { /* LCOV_EXCL_START: already checked above */ - status = ARES_EBADRESP; - goto failed_stat; - } /* LCOV_EXCL_STOP */ - - status = ares_append_ai_node(AF_INET6, port, rr_ttl, aptr, &nodes); - if (status != ARES_SUCCESS) - goto failed_stat; - } - - if (rr_class == C_IN && rr_type == T_CNAME) - { - got_cname = 1; - status = ares__expand_name_for_response(aptr, abuf, alen, &rr_data, - &len, 1); - if (status != ARES_SUCCESS) - { - goto failed_stat; - } - - /* Decode the RR data and replace the hostname with it. */ - /* SA: Seems wrong as it introduses order dependency. */ - hostname = rr_data; - - cname = ares__append_addrinfo_cname(&cnames); - if (!cname) - { - status = ARES_ENOMEM; - ares_free(rr_data); - goto failed_stat; - } - cname->ttl = rr_ttl; - cname->alias = rr_name; - cname->name = rr_data; - rr_name = NULL; - } - else - { - /* rr_name is only saved for cname */ - ares_free(rr_name); - rr_name = NULL; - } - - - aptr += rr_len; - if (aptr > abuf + alen) - { /* LCOV_EXCL_START: already checked above */ - status = ARES_EBADRESP; - goto failed_stat; - } /* LCOV_EXCL_STOP */ - } - - if (status == ARES_SUCCESS) - { - if (!got_a && !got_aaaa) - { - if (!got_cname || (got_cname && cname_only_is_enodata)) - { - status = ARES_ENODATA; - goto failed_stat; - } - } - - /* save the question hostname as ai->name */ - if (ai->name == NULL || strcasecmp(ai->name, question_hostname) != 0) - { - ares_free(ai->name); - ai->name = ares_strdup(question_hostname); - if (!ai->name) - { - status = ARES_ENOMEM; - goto failed_stat; - } - } - - if (got_a || got_aaaa) - { - ares__addrinfo_cat_nodes(&ai->nodes, nodes); - nodes = NULL; - } - - if (got_cname) - { - ares__addrinfo_cat_cnames(&ai->cnames, cnames); - cnames = NULL; - } - } - - ares_free(question_hostname); - return status; - -failed_stat: - ares_free(question_hostname); - ares_free(rr_name); - ares__freeaddrinfo_cnames(cnames); - ares__freeaddrinfo_nodes(nodes); - return status; -} diff --git a/lib/c-ares-1.19.1/src/lib/ares__read_line.c b/lib/c-ares-1.19.1/src/lib/ares__read_line.c deleted file mode 100644 index c62ad2a2b41..00000000000 --- a/lib/c-ares-1.19.1/src/lib/ares__read_line.c +++ /dev/null @@ -1,73 +0,0 @@ - -/* Copyright 1998 by the Massachusetts Institute of Technology. - * - * 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. - */ - -#include "ares_setup.h" - -#include "ares.h" -#include "ares_nowarn.h" -#include "ares_private.h" - -/* This is an internal function. Its contract is to read a line from - * a file into a dynamically allocated buffer, zeroing the trailing - * newline if there is one. The calling routine may call - * ares__read_line multiple times with the same buf and bufsize - * pointers; *buf will be reallocated and *bufsize adjusted as - * appropriate. The initial value of *buf should be NULL. After the - * calling routine is done reading lines, it should free *buf. - */ -int ares__read_line(FILE *fp, char **buf, size_t *bufsize) -{ - char *newbuf; - size_t offset = 0; - size_t len; - - if (*buf == NULL) - { - *buf = ares_malloc(128); - if (!*buf) - return ARES_ENOMEM; - *bufsize = 128; - } - - for (;;) - { - int bytestoread = aresx_uztosi(*bufsize - offset); - - if (!fgets(*buf + offset, bytestoread, fp)) - return (offset != 0) ? 0 : (ferror(fp)) ? ARES_EFILE : ARES_EOF; - len = offset + strlen(*buf + offset); - if ((*buf)[len - 1] == '\n') - { - (*buf)[len - 1] = 0; - break; - } - offset = len; - if(len < *bufsize - 1) - continue; - - /* Allocate more space. */ - newbuf = ares_realloc(*buf, *bufsize * 2); - if (!newbuf) - { - ares_free(*buf); - *buf = NULL; - return ARES_ENOMEM; - } - *buf = newbuf; - *bufsize *= 2; - } - return ARES_SUCCESS; -} diff --git a/lib/c-ares-1.19.1/src/lib/ares__readaddrinfo.c b/lib/c-ares-1.19.1/src/lib/ares__readaddrinfo.c deleted file mode 100644 index 2315df94111..00000000000 --- a/lib/c-ares-1.19.1/src/lib/ares__readaddrinfo.c +++ /dev/null @@ -1,258 +0,0 @@ -/* Copyright (C) 2019 by Andrew Selivanov - * - * 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. - */ - -#include "ares_setup.h" - -#ifdef HAVE_NETINET_IN_H -# include -#endif -#ifdef HAVE_NETDB_H -# include -#endif -#ifdef HAVE_ARPA_INET_H -# include -#endif - -#include "ares.h" -#include "ares_inet_net_pton.h" -#include "ares_nowarn.h" -#include "ares_private.h" - -#define MAX_ALIASES 40 - -int ares__readaddrinfo(FILE *fp, - const char *name, - unsigned short port, - const struct ares_addrinfo_hints *hints, - struct ares_addrinfo *ai) -{ - char *line = NULL, *p, *q; - char *txtaddr, *txthost, *txtalias; - char *aliases[MAX_ALIASES]; - unsigned int i, alias_count; - int status = ARES_SUCCESS; - size_t linesize; - struct ares_addrinfo_cname *cname = NULL, *cnames = NULL; - struct ares_addrinfo_node *nodes = NULL; - int match_with_alias, match_with_canonical; - int want_cname = hints->ai_flags & ARES_AI_CANONNAME; - - /* Validate family */ - switch (hints->ai_family) { - case AF_INET: - case AF_INET6: - case AF_UNSPEC: - break; - default: - return ARES_EBADFAMILY; - } - - ai->name = ares_strdup(name); - if(!ai->name) - { - status = ARES_ENOMEM; - goto fail; - } - - while ((status = ares__read_line(fp, &line, &linesize)) == ARES_SUCCESS) - { - match_with_alias = 0; - match_with_canonical = 0; - alias_count = 0; - /* Trim line comment. */ - p = line; - while (*p && (*p != '#')) - p++; - *p = '\0'; - - /* Trim trailing whitespace. */ - q = p - 1; - while ((q >= line) && ISSPACE(*q)) - q--; - *++q = '\0'; - - /* Skip leading whitespace. */ - p = line; - while (*p && ISSPACE(*p)) - p++; - if (!*p) - /* Ignore line if empty. */ - continue; - - /* Pointer to start of IPv4 or IPv6 address part. */ - txtaddr = p; - - /* Advance past address part. */ - while (*p && !ISSPACE(*p)) - p++; - if (!*p) - /* Ignore line if reached end of line. */ - continue; - - /* Null terminate address part. */ - *p = '\0'; - - /* Advance to host name */ - p++; - while (*p && ISSPACE(*p)) - p++; - if (!*p) - /* Ignore line if reached end of line. */ - continue; /* LCOV_EXCL_LINE: trailing whitespace already stripped */ - - /* Pointer to start of host name. */ - txthost = p; - - /* Advance past host name. */ - while (*p && !ISSPACE(*p)) - p++; - - /* Pointer to start of first alias. */ - txtalias = NULL; - if (*p) - { - q = p + 1; - while (*q && ISSPACE(*q)) - q++; - if (*q) - txtalias = q; - } - - /* Null terminate host name. */ - *p = '\0'; - - /* Find out if host name matches with canonical host name. */ - if (strcasecmp(txthost, name) == 0) - { - match_with_canonical = 1; - } - - /* Find out if host name matches with one of the aliases. */ - while (txtalias) - { - p = txtalias; - while (*p && !ISSPACE(*p)) - p++; - q = p; - while (*q && ISSPACE(*q)) - q++; - *p = '\0'; - if (strcasecmp(txtalias, name) == 0) - { - match_with_alias = 1; - if (!want_cname) - break; - } - if (alias_count < MAX_ALIASES) - { - aliases[alias_count++] = txtalias; - } - txtalias = *q ? q : NULL; - } - - /* Try next line if host does not match. */ - if (!match_with_alias && !match_with_canonical) - { - continue; - } - - /* - * Convert address string to network address for the requested families. - * Actual address family possible values are AF_INET and AF_INET6 only. - */ - if ((hints->ai_family == AF_INET) || (hints->ai_family == AF_UNSPEC)) - { - struct in_addr addr4; - if (ares_inet_pton(AF_INET, txtaddr, &addr4) == 1) - { - status = ares_append_ai_node(AF_INET, port, 0, &addr4, &nodes); - if (status != ARES_SUCCESS) - { - goto fail; - } - } - } - if ((hints->ai_family == AF_INET6) || (hints->ai_family == AF_UNSPEC)) - { - struct ares_in6_addr addr6; - if (ares_inet_pton(AF_INET6, txtaddr, &addr6) == 1) - { - status = ares_append_ai_node(AF_INET6, port, 0, &addr6, &nodes); - if (status != ARES_SUCCESS) - { - goto fail; - } - } - } - - if (status != ARES_SUCCESS) - /* Ignore line if invalid address string for the requested family. */ - continue; - - if (want_cname) - { - for (i = 0; i < alias_count; ++i) - { - cname = ares__append_addrinfo_cname(&cnames); - if (!cname) - { - status = ARES_ENOMEM; - goto fail; - } - cname->alias = ares_strdup(aliases[i]); - cname->name = ares_strdup(txthost); - } - /* No aliases, cname only. */ - if(!alias_count) - { - cname = ares__append_addrinfo_cname(&cnames); - if (!cname) - { - status = ARES_ENOMEM; - goto fail; - } - cname->name = ares_strdup(txthost); - } - } - } - - /* Last read failed. */ - if (status == ARES_ENOMEM) - { - goto fail; - } - - /* If no results, its a failure */ - if (!nodes) - { - status = ARES_ENOTFOUND; - goto fail; - } - - /* Free line buffer. */ - ares_free(line); - ares__addrinfo_cat_cnames(&ai->cnames, cnames); - ares__addrinfo_cat_nodes(&ai->nodes, nodes); - - return ARES_SUCCESS; - -fail: - ares_free(line); - ares__freeaddrinfo_cnames(cnames); - ares__freeaddrinfo_nodes(nodes); - ares_free(ai->name); - ai->name = NULL; - return status; -} diff --git a/lib/c-ares-1.19.1/src/lib/ares__sortaddrinfo.c b/lib/c-ares-1.19.1/src/lib/ares__sortaddrinfo.c deleted file mode 100644 index 3f050cad00f..00000000000 --- a/lib/c-ares-1.19.1/src/lib/ares__sortaddrinfo.c +++ /dev/null @@ -1,507 +0,0 @@ -/* - * Original file name getaddrinfo.c - * Lifted from the 'Android Bionic' project with the BSD license. - */ - -/* - * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. - * Copyright (C) 2018 The Android Open Source Project - * Copyright (C) 2019 by Andrew Selivanov - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the project nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include "ares_setup.h" - -#ifdef HAVE_NETINET_IN_H -# include -#endif -#ifdef HAVE_NETDB_H -# include -#endif -#ifdef HAVE_STRINGS_H -# include -#endif - -#include -#include - -#include "ares.h" -#include "ares_private.h" - -struct addrinfo_sort_elem -{ - struct ares_addrinfo_node *ai; - int has_src_addr; - ares_sockaddr src_addr; - int original_order; -}; - -#define ARES_IPV6_ADDR_MC_SCOPE(a) ((a)->s6_addr[1] & 0x0f) - -#define ARES_IPV6_ADDR_SCOPE_NODELOCAL 0x01 -#define ARES_IPV6_ADDR_SCOPE_INTFACELOCAL 0x01 -#define ARES_IPV6_ADDR_SCOPE_LINKLOCAL 0x02 -#define ARES_IPV6_ADDR_SCOPE_SITELOCAL 0x05 -#define ARES_IPV6_ADDR_SCOPE_ORGLOCAL 0x08 -#define ARES_IPV6_ADDR_SCOPE_GLOBAL 0x0e - -#define ARES_IN_LOOPBACK(a) ((((long int)(a)) & 0xff000000) == 0x7f000000) - -/* RFC 4193. */ -#define ARES_IN6_IS_ADDR_ULA(a) (((a)->s6_addr[0] & 0xfe) == 0xfc) - -/* These macros are modelled after the ones in . */ -/* RFC 4380, section 2.6 */ -#define ARES_IN6_IS_ADDR_TEREDO(a) \ - ((*(const unsigned int *)(const void *)(&(a)->s6_addr[0]) == ntohl(0x20010000))) -/* RFC 3056, section 2. */ -#define ARES_IN6_IS_ADDR_6TO4(a) \ - (((a)->s6_addr[0] == 0x20) && ((a)->s6_addr[1] == 0x02)) -/* 6bone testing address area (3ffe::/16), deprecated in RFC 3701. */ -#define ARES_IN6_IS_ADDR_6BONE(a) \ - (((a)->s6_addr[0] == 0x3f) && ((a)->s6_addr[1] == 0xfe)) - - -static int get_scope(const struct sockaddr *addr) -{ - if (addr->sa_family == AF_INET6) - { - const struct sockaddr_in6 *addr6 = CARES_INADDR_CAST(const struct sockaddr_in6 *, addr); - if (IN6_IS_ADDR_MULTICAST(&addr6->sin6_addr)) - { - return ARES_IPV6_ADDR_MC_SCOPE(&addr6->sin6_addr); - } - else if (IN6_IS_ADDR_LOOPBACK(&addr6->sin6_addr) || - IN6_IS_ADDR_LINKLOCAL(&addr6->sin6_addr)) - { - /* - * RFC 4291 section 2.5.3 says loopback is to be treated as having - * link-local scope. - */ - return ARES_IPV6_ADDR_SCOPE_LINKLOCAL; - } - else if (IN6_IS_ADDR_SITELOCAL(&addr6->sin6_addr)) - { - return ARES_IPV6_ADDR_SCOPE_SITELOCAL; - } - else - { - return ARES_IPV6_ADDR_SCOPE_GLOBAL; - } - } - else if (addr->sa_family == AF_INET) - { - const struct sockaddr_in *addr4 = CARES_INADDR_CAST(const struct sockaddr_in *, addr); - unsigned long int na = ntohl(addr4->sin_addr.s_addr); - if (ARES_IN_LOOPBACK(na) || /* 127.0.0.0/8 */ - (na & 0xffff0000) == 0xa9fe0000) /* 169.254.0.0/16 */ - { - return ARES_IPV6_ADDR_SCOPE_LINKLOCAL; - } - else - { - /* - * RFC 6724 section 3.2. Other IPv4 addresses, including private - * addresses and shared addresses (100.64.0.0/10), are assigned global - * scope. - */ - return ARES_IPV6_ADDR_SCOPE_GLOBAL; - } - } - else - { - /* - * This should never happen. - * Return a scope with low priority as a last resort. - */ - return ARES_IPV6_ADDR_SCOPE_NODELOCAL; - } -} - -static int get_label(const struct sockaddr *addr) -{ - if (addr->sa_family == AF_INET) - { - return 4; - } - else if (addr->sa_family == AF_INET6) - { - const struct sockaddr_in6 *addr6 = CARES_INADDR_CAST(const struct sockaddr_in6 *, addr); - if (IN6_IS_ADDR_LOOPBACK(&addr6->sin6_addr)) - { - return 0; - } - else if (IN6_IS_ADDR_V4MAPPED(&addr6->sin6_addr)) - { - return 4; - } - else if (ARES_IN6_IS_ADDR_6TO4(&addr6->sin6_addr)) - { - return 2; - } - else if (ARES_IN6_IS_ADDR_TEREDO(&addr6->sin6_addr)) - { - return 5; - } - else if (ARES_IN6_IS_ADDR_ULA(&addr6->sin6_addr)) - { - return 13; - } - else if (IN6_IS_ADDR_V4COMPAT(&addr6->sin6_addr)) - { - return 3; - } - else if (IN6_IS_ADDR_SITELOCAL(&addr6->sin6_addr)) - { - return 11; - } - else if (ARES_IN6_IS_ADDR_6BONE(&addr6->sin6_addr)) - { - return 12; - } - else - { - /* All other IPv6 addresses, including global unicast addresses. */ - return 1; - } - } - else - { - /* - * This should never happen. - * Return a semi-random label as a last resort. - */ - return 1; - } -} - -/* - * Get the precedence for a given IPv4/IPv6 address. - * RFC 6724, section 2.1. - */ -static int get_precedence(const struct sockaddr *addr) -{ - if (addr->sa_family == AF_INET) - { - return 35; - } - else if (addr->sa_family == AF_INET6) - { - const struct sockaddr_in6 *addr6 = CARES_INADDR_CAST(const struct sockaddr_in6 *, addr); - if (IN6_IS_ADDR_LOOPBACK(&addr6->sin6_addr)) - { - return 50; - } - else if (IN6_IS_ADDR_V4MAPPED(&addr6->sin6_addr)) - { - return 35; - } - else if (ARES_IN6_IS_ADDR_6TO4(&addr6->sin6_addr)) - { - return 30; - } - else if (ARES_IN6_IS_ADDR_TEREDO(&addr6->sin6_addr)) - { - return 5; - } - else if (ARES_IN6_IS_ADDR_ULA(&addr6->sin6_addr)) - { - return 3; - } - else if (IN6_IS_ADDR_V4COMPAT(&addr6->sin6_addr) || - IN6_IS_ADDR_SITELOCAL(&addr6->sin6_addr) || - ARES_IN6_IS_ADDR_6BONE(&addr6->sin6_addr)) - { - return 1; - } - else - { - /* All other IPv6 addresses, including global unicast addresses. */ - return 40; - } - } - else - { - return 1; - } -} - -/* - * Find number of matching initial bits between the two addresses a1 and a2. - */ -static int common_prefix_len(const struct in6_addr *a1, - const struct in6_addr *a2) -{ - const char *p1 = (const char *)a1; - const char *p2 = (const char *)a2; - unsigned i; - for (i = 0; i < sizeof(*a1); ++i) - { - int x, j; - if (p1[i] == p2[i]) - { - continue; - } - x = p1[i] ^ p2[i]; - for (j = 0; j < CHAR_BIT; ++j) - { - if (x & (1 << (CHAR_BIT - 1))) - { - return i * CHAR_BIT + j; - } - x <<= 1; - } - } - return sizeof(*a1) * CHAR_BIT; -} - -/* - * Compare two source/destination address pairs. - * RFC 6724, section 6. - */ -static int rfc6724_compare(const void *ptr1, const void *ptr2) -{ - const struct addrinfo_sort_elem *a1 = (const struct addrinfo_sort_elem *)ptr1; - const struct addrinfo_sort_elem *a2 = (const struct addrinfo_sort_elem *)ptr2; - int scope_src1, scope_dst1, scope_match1; - int scope_src2, scope_dst2, scope_match2; - int label_src1, label_dst1, label_match1; - int label_src2, label_dst2, label_match2; - int precedence1, precedence2; - int prefixlen1, prefixlen2; - - /* Rule 1: Avoid unusable destinations. */ - if (a1->has_src_addr != a2->has_src_addr) - { - return a2->has_src_addr - a1->has_src_addr; - } - - /* Rule 2: Prefer matching scope. */ - scope_src1 = ARES_IPV6_ADDR_SCOPE_NODELOCAL; - if (a1->has_src_addr) - scope_src1 = get_scope(&a1->src_addr.sa); - scope_dst1 = get_scope(a1->ai->ai_addr); - scope_match1 = (scope_src1 == scope_dst1); - - scope_src2 = ARES_IPV6_ADDR_SCOPE_NODELOCAL; - if (a2->has_src_addr) - scope_src2 = get_scope(&a2->src_addr.sa); - scope_dst2 = get_scope(a2->ai->ai_addr); - scope_match2 = (scope_src2 == scope_dst2); - - if (scope_match1 != scope_match2) - { - return scope_match2 - scope_match1; - } - - /* Rule 3: Avoid deprecated addresses. */ - - /* Rule 4: Prefer home addresses. */ - - /* Rule 5: Prefer matching label. */ - label_src1 = 1; - if (a1->has_src_addr) - label_src1 = get_label(&a1->src_addr.sa); - label_dst1 = get_label(a1->ai->ai_addr); - label_match1 = (label_src1 == label_dst1); - - label_src2 = 1; - if (a2->has_src_addr) - label_src2 = get_label(&a2->src_addr.sa); - label_dst2 = get_label(a2->ai->ai_addr); - label_match2 = (label_src2 == label_dst2); - - if (label_match1 != label_match2) - { - return label_match2 - label_match1; - } - - /* Rule 6: Prefer higher precedence. */ - precedence1 = get_precedence(a1->ai->ai_addr); - precedence2 = get_precedence(a2->ai->ai_addr); - if (precedence1 != precedence2) - { - return precedence2 - precedence1; - } - - /* Rule 7: Prefer native transport. */ - - /* Rule 8: Prefer smaller scope. */ - if (scope_dst1 != scope_dst2) - { - return scope_dst1 - scope_dst2; - } - - /* Rule 9: Use longest matching prefix. */ - if (a1->has_src_addr && a1->ai->ai_addr->sa_family == AF_INET6 && - a2->has_src_addr && a2->ai->ai_addr->sa_family == AF_INET6) - { - const struct sockaddr_in6 *a1_src = &a1->src_addr.sa6; - const struct sockaddr_in6 *a1_dst = - CARES_INADDR_CAST(const struct sockaddr_in6 *, a1->ai->ai_addr); - const struct sockaddr_in6 *a2_src = &a2->src_addr.sa6; - const struct sockaddr_in6 *a2_dst = - CARES_INADDR_CAST(const struct sockaddr_in6 *, a2->ai->ai_addr); - prefixlen1 = common_prefix_len(&a1_src->sin6_addr, &a1_dst->sin6_addr); - prefixlen2 = common_prefix_len(&a2_src->sin6_addr, &a2_dst->sin6_addr); - if (prefixlen1 != prefixlen2) - { - return prefixlen2 - prefixlen1; - } - } - - /* - * Rule 10: Leave the order unchanged. - * We need this since qsort() is not necessarily stable. - */ - return a1->original_order - a2->original_order; -} - -/* - * Find the source address that will be used if trying to connect to the given - * address. - * - * Returns 1 if a source address was found, 0 if the address is unreachable, - * and -1 if a fatal error occurred. If 0 or 1, the contents of src_addr are - * undefined. - */ -static int find_src_addr(ares_channel channel, - const struct sockaddr *addr, - struct sockaddr *src_addr) -{ - ares_socket_t sock; - int ret; - ares_socklen_t len; - - switch (addr->sa_family) - { - case AF_INET: - len = sizeof(struct sockaddr_in); - break; - case AF_INET6: - len = sizeof(struct sockaddr_in6); - break; - default: - /* No known usable source address for non-INET families. */ - return 0; - } - - sock = ares__open_socket(channel, addr->sa_family, SOCK_DGRAM, IPPROTO_UDP); - if (sock == ARES_SOCKET_BAD) - { - if (errno == EAFNOSUPPORT) - { - return 0; - } - else - { - return -1; - } - } - - do - { - ret = ares__connect_socket(channel, sock, addr, len); - } - while (ret == -1 && errno == EINTR); - - if (ret == -1) - { - ares__close_socket(channel, sock); - return 0; - } - - if (getsockname(sock, src_addr, &len) != 0) - { - ares__close_socket(channel, sock); - return -1; - } - ares__close_socket(channel, sock); - return 1; -} - -/* - * Sort the linked list starting at sentinel->ai_next in RFC6724 order. - * Will leave the list unchanged if an error occurs. - */ -int ares__sortaddrinfo(ares_channel channel, struct ares_addrinfo_node *list_sentinel) -{ - struct ares_addrinfo_node *cur; - int nelem = 0, i; - int has_src_addr; - struct addrinfo_sort_elem *elems; - - cur = list_sentinel->ai_next; - while (cur) - { - ++nelem; - cur = cur->ai_next; - } - - if (!nelem) - return ARES_ENODATA; - - elems = (struct addrinfo_sort_elem *)ares_malloc( - nelem * sizeof(struct addrinfo_sort_elem)); - if (!elems) - { - return ARES_ENOMEM; - } - - /* - * Convert the linked list to an array that also contains the candidate - * source address for each destination address. - */ - for (i = 0, cur = list_sentinel->ai_next; i < nelem; ++i, cur = cur->ai_next) - { - assert(cur != NULL); - elems[i].ai = cur; - elems[i].original_order = i; - has_src_addr = find_src_addr(channel, cur->ai_addr, &elems[i].src_addr.sa); - if (has_src_addr == -1) - { - ares_free(elems); - return ARES_ENOTFOUND; - } - elems[i].has_src_addr = has_src_addr; - } - - /* Sort the addresses, and rearrange the linked list so it matches the sorted - * order. */ - qsort((void *)elems, nelem, sizeof(struct addrinfo_sort_elem), - rfc6724_compare); - - list_sentinel->ai_next = elems[0].ai; - for (i = 0; i < nelem - 1; ++i) - { - elems[i].ai->ai_next = elems[i + 1].ai; - } - elems[nelem - 1].ai->ai_next = NULL; - - ares_free(elems); - return ARES_SUCCESS; -} diff --git a/lib/c-ares-1.19.1/src/lib/ares__timeval.c b/lib/c-ares-1.19.1/src/lib/ares__timeval.c deleted file mode 100644 index 94efb7db1e9..00000000000 --- a/lib/c-ares-1.19.1/src/lib/ares__timeval.c +++ /dev/null @@ -1,111 +0,0 @@ - -/* 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. - */ - -#include "ares_setup.h" -#include "ares.h" -#include "ares_private.h" - -#if defined(WIN32) && !defined(MSDOS) - -struct timeval ares__tvnow(void) -{ - /* - ** GetTickCount() is available on _all_ Windows versions from W95 up - ** to nowadays. Returns milliseconds elapsed since last system boot, - ** increases monotonically and wraps once 49.7 days have elapsed. - */ - struct timeval now; - DWORD milliseconds = GetTickCount(); - now.tv_sec = milliseconds / 1000; - now.tv_usec = (milliseconds % 1000) * 1000; - return now; -} - -#elif defined(HAVE_CLOCK_GETTIME_MONOTONIC) - -struct timeval ares__tvnow(void) -{ - /* - ** clock_gettime() is granted to be increased monotonically when the - ** monotonic clock is queried. Time starting point is unspecified, it - ** could be the system start-up time, the Epoch, or something else, - ** in any case the time starting point does not change once that the - ** system has started up. - */ - struct timeval now; - struct timespec tsnow; - if(0 == clock_gettime(CLOCK_MONOTONIC, &tsnow)) { - now.tv_sec = tsnow.tv_sec; - now.tv_usec = tsnow.tv_nsec / 1000; - } - /* - ** Even when the configure process has truly detected monotonic clock - ** availability, it might happen that it is not actually available at - ** run-time. When this occurs simply fallback to other time source. - */ -#ifdef HAVE_GETTIMEOFDAY - else - (void)gettimeofday(&now, NULL); /* LCOV_EXCL_LINE */ -#else - else { - now.tv_sec = (long)time(NULL); - now.tv_usec = 0; - } -#endif - return now; -} - -#elif defined(HAVE_GETTIMEOFDAY) - -struct timeval ares__tvnow(void) -{ - /* - ** gettimeofday() is not granted to be increased monotonically, due to - ** clock drifting and external source time synchronization it can jump - ** forward or backward in time. - */ - struct timeval now; - (void)gettimeofday(&now, NULL); - return now; -} - -#else - -struct timeval ares__tvnow(void) -{ - /* - ** time() returns the value of time in seconds since the Epoch. - */ - struct timeval now; - now.tv_sec = (long)time(NULL); - now.tv_usec = 0; - return now; -} - -#endif - -#if 0 /* Not used */ -/* - * Make sure that the first argument is the more recent time, as otherwise - * we'll get a weird negative time-diff back... - * - * Returns: the time difference in number of milliseconds. - */ -long ares__tvdiff(struct timeval newer, struct timeval older) -{ - return (newer.tv_sec-older.tv_sec)*1000+ - (newer.tv_usec-older.tv_usec)/1000; -} -#endif - diff --git a/lib/c-ares-1.19.1/src/lib/ares_android.h b/lib/c-ares-1.19.1/src/lib/ares_android.h deleted file mode 100644 index 93fb75f5850..00000000000 --- a/lib/c-ares-1.19.1/src/lib/ares_android.h +++ /dev/null @@ -1,27 +0,0 @@ -/* Copyright (C) 2017 by John Schember - * - * 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. - */ - -#ifndef __ARES_ANDROID_H__ -#define __ARES_ANDROID_H__ - -#if defined(ANDROID) || defined(__ANDROID__) - -char **ares_get_android_server_list(size_t max_servers, size_t *num_servers); -char *ares_get_android_search_domains_list(void); -void ares_library_cleanup_android(void); - -#endif - -#endif /* __ARES_ANDROID_H__ */ diff --git a/lib/c-ares-1.19.1/src/lib/ares_cancel.c b/lib/c-ares-1.19.1/src/lib/ares_cancel.c deleted file mode 100644 index 465cc9e95ee..00000000000 --- a/lib/c-ares-1.19.1/src/lib/ares_cancel.c +++ /dev/null @@ -1,63 +0,0 @@ - -/* Copyright (C) 2004 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. - */ - -#include "ares_setup.h" -#include - -#include "ares.h" -#include "ares_private.h" - -/* - * ares_cancel() cancels all ongoing requests/resolves that might be going on - * on the given channel. It does NOT kill the channel, use ares_destroy() for - * that. - */ -void ares_cancel(ares_channel channel) -{ - struct query *query; - struct list_node list_head_copy; - struct list_node* list_head; - struct list_node* list_node; - int i; - - if (!ares__is_list_empty(&(channel->all_queries))) - { - /* Swap list heads, so that only those queries which were present on entry - * into this function are cancelled. New queries added by callbacks of - * queries being cancelled will not be cancelled themselves. - */ - list_head = &(channel->all_queries); - list_head_copy.prev = list_head->prev; - list_head_copy.next = list_head->next; - list_head_copy.prev->next = &list_head_copy; - list_head_copy.next->prev = &list_head_copy; - list_head->prev = list_head; - list_head->next = list_head; - for (list_node = list_head_copy.next; list_node != &list_head_copy; ) - { - query = list_node->data; - list_node = list_node->next; /* since we're deleting the query */ - query->callback(query->arg, ARES_ECANCELLED, 0, NULL, 0); - ares__free_query(query); - } - } - if (!(channel->flags & ARES_FLAG_STAYOPEN) && ares__is_list_empty(&(channel->all_queries))) - { - if (channel->servers) - { - for (i = 0; i < channel->nservers; i++) - ares__close_sockets(channel, &channel->servers[i]); - } - } -} diff --git a/lib/c-ares-1.19.1/src/lib/ares_create_query.c b/lib/c-ares-1.19.1/src/lib/ares_create_query.c deleted file mode 100644 index e3d874b4509..00000000000 --- a/lib/c-ares-1.19.1/src/lib/ares_create_query.c +++ /dev/null @@ -1,197 +0,0 @@ - -/* Copyright 1998 by the Massachusetts Institute of Technology. - * - * 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. - */ - -#include "ares_setup.h" - -#ifdef HAVE_NETINET_IN_H -# include -#endif - -#include "ares_nameser.h" - -#include "ares.h" -#include "ares_dns.h" -#include "ares_private.h" - - -/* Header format, from RFC 1035: - * 1 1 1 1 1 1 - * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 - * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ - * | ID | - * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ - * |QR| Opcode |AA|TC|RD|RA| Z | RCODE | - * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ - * | QDCOUNT | - * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ - * | ANCOUNT | - * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ - * | NSCOUNT | - * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ - * | ARCOUNT | - * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ - * - * AA, TC, RA, and RCODE are only set in responses. Brief description - * of the remaining fields: - * ID Identifier to match responses with queries - * QR Query (0) or response (1) - * Opcode For our purposes, always O_QUERY - * RD Recursion desired - * Z Reserved (zero) - * QDCOUNT Number of queries - * ANCOUNT Number of answers - * NSCOUNT Number of name server records - * ARCOUNT Number of additional records - * - * Question format, from RFC 1035: - * 1 1 1 1 1 1 - * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 - * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ - * | | - * / QNAME / - * / / - * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ - * | QTYPE | - * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ - * | QCLASS | - * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ - * - * The query name is encoded as a series of labels, each represented - * as a one-byte length (maximum 63) followed by the text of the - * label. The list is terminated by a label of length zero (which can - * be thought of as the root domain). - */ - -int ares_create_query(const char *name, int dnsclass, int type, - unsigned short id, int rd, unsigned char **bufp, - int *buflenp, int max_udp_size) -{ - size_t len; - unsigned char *q; - const char *p; - size_t buflen; - unsigned char *buf; - - /* Set our results early, in case we bail out early with an error. */ - *buflenp = 0; - *bufp = NULL; - - /* Per RFC 7686, reject queries for ".onion" domain names with NXDOMAIN. */ - if (ares__is_onion_domain(name)) - return ARES_ENOTFOUND; - - /* Allocate a memory area for the maximum size this packet might need. +2 - * is for the length byte and zero termination if no dots or ecscaping is - * used. - */ - len = strlen(name) + 2 + HFIXEDSZ + QFIXEDSZ + - (max_udp_size ? EDNSFIXEDSZ : 0); - buf = ares_malloc(len); - if (!buf) - return ARES_ENOMEM; - - /* Set up the header. */ - q = buf; - memset(q, 0, HFIXEDSZ); - DNS_HEADER_SET_QID(q, id); - DNS_HEADER_SET_OPCODE(q, O_QUERY); - if (rd) { - DNS_HEADER_SET_RD(q, 1); - } - else { - DNS_HEADER_SET_RD(q, 0); - } - DNS_HEADER_SET_QDCOUNT(q, 1); - - if (max_udp_size) { - DNS_HEADER_SET_ARCOUNT(q, 1); - } - - /* A name of "." is a screw case for the loop below, so adjust it. */ - if (strcmp(name, ".") == 0) - name++; - - /* Start writing out the name after the header. */ - q += HFIXEDSZ; - while (*name) - { - if (*name == '.') { - ares_free (buf); - return ARES_EBADNAME; - } - - /* Count the number of bytes in this label. */ - len = 0; - for (p = name; *p && *p != '.'; p++) - { - if (*p == '\\' && *(p + 1) != 0) - p++; - len++; - } - if (len > MAXLABEL) { - ares_free (buf); - return ARES_EBADNAME; - } - - /* Encode the length and copy the data. */ - *q++ = (unsigned char)len; - for (p = name; *p && *p != '.'; p++) - { - if (*p == '\\' && *(p + 1) != 0) - p++; - *q++ = *p; - } - - /* Go to the next label and repeat, unless we hit the end. */ - if (!*p) - break; - name = p + 1; - } - - /* Add the zero-length label at the end. */ - *q++ = 0; - - /* Finish off the question with the type and class. */ - DNS_QUESTION_SET_TYPE(q, type); - DNS_QUESTION_SET_CLASS(q, dnsclass); - - q += QFIXEDSZ; - if (max_udp_size) - { - memset(q, 0, EDNSFIXEDSZ); - q++; - DNS_RR_SET_TYPE(q, T_OPT); - DNS_RR_SET_CLASS(q, max_udp_size); - q += (EDNSFIXEDSZ-1); - } - buflen = (q - buf); - - /* Reject names that are longer than the maximum of 255 bytes that's - * specified in RFC 1035 ("To simplify implementations, the total length of - * a domain name (i.e., label octets and label length octets) is restricted - * to 255 octets or less."). */ - if (buflen > (size_t)(MAXCDNAME + HFIXEDSZ + QFIXEDSZ + - (max_udp_size ? EDNSFIXEDSZ : 0))) { - ares_free (buf); - return ARES_EBADNAME; - } - - /* we know this fits in an int at this point */ - *buflenp = (int) buflen; - *bufp = buf; - - return ARES_SUCCESS; -} diff --git a/lib/c-ares-1.19.1/src/lib/ares_data.c b/lib/c-ares-1.19.1/src/lib/ares_data.c deleted file mode 100644 index 69dff06689a..00000000000 --- a/lib/c-ares-1.19.1/src/lib/ares_data.c +++ /dev/null @@ -1,256 +0,0 @@ - -/* Copyright (C) 2009-2013 by Daniel Stenberg - * - * 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. - */ - - -#include "ares_setup.h" - -#include - -#include "ares.h" -#include "ares_data.h" -#include "ares_private.h" - - -/* -** ares_free_data() - c-ares external API function. -** -** This function must be used by the application to free data memory that -** has been internally allocated by some c-ares function and for which a -** pointer has already been returned to the calling application. The list -** of c-ares functions returning pointers that must be free'ed using this -** function is: -** -** ares_get_servers() -** ares_parse_srv_reply() -** ares_parse_txt_reply() -*/ - -void ares_free_data(void *dataptr) -{ - while (dataptr != NULL) { - struct ares_data *ptr; - void *next_data = NULL; - -#ifdef __INTEL_COMPILER -# pragma warning(push) -# pragma warning(disable:1684) - /* 1684: conversion from pointer to same-sized integral type */ -#endif - - ptr = (void *)((char *)dataptr - offsetof(struct ares_data, data)); - -#ifdef __INTEL_COMPILER -# pragma warning(pop) -#endif - - if (ptr->mark != ARES_DATATYPE_MARK) - return; - - switch (ptr->type) - { - case ARES_DATATYPE_MX_REPLY: - - if (ptr->data.mx_reply.next) - next_data = ptr->data.mx_reply.next; - if (ptr->data.mx_reply.host) - ares_free(ptr->data.mx_reply.host); - break; - - case ARES_DATATYPE_SRV_REPLY: - - if (ptr->data.srv_reply.next) - next_data = ptr->data.srv_reply.next; - if (ptr->data.srv_reply.host) - ares_free(ptr->data.srv_reply.host); - break; - - case ARES_DATATYPE_URI_REPLY: - - if (ptr->data.uri_reply.next) - next_data = ptr->data.uri_reply.next; - if (ptr->data.uri_reply.uri) - ares_free(ptr->data.uri_reply.uri); - break; - - case ARES_DATATYPE_TXT_REPLY: - case ARES_DATATYPE_TXT_EXT: - - if (ptr->data.txt_reply.next) - next_data = ptr->data.txt_reply.next; - if (ptr->data.txt_reply.txt) - ares_free(ptr->data.txt_reply.txt); - break; - - case ARES_DATATYPE_ADDR_NODE: - - if (ptr->data.addr_node.next) - next_data = ptr->data.addr_node.next; - break; - - case ARES_DATATYPE_ADDR_PORT_NODE: - - if (ptr->data.addr_port_node.next) - next_data = ptr->data.addr_port_node.next; - break; - - case ARES_DATATYPE_NAPTR_REPLY: - - if (ptr->data.naptr_reply.next) - next_data = ptr->data.naptr_reply.next; - if (ptr->data.naptr_reply.flags) - ares_free(ptr->data.naptr_reply.flags); - if (ptr->data.naptr_reply.service) - ares_free(ptr->data.naptr_reply.service); - if (ptr->data.naptr_reply.regexp) - ares_free(ptr->data.naptr_reply.regexp); - if (ptr->data.naptr_reply.replacement) - ares_free(ptr->data.naptr_reply.replacement); - break; - - case ARES_DATATYPE_SOA_REPLY: - if (ptr->data.soa_reply.nsname) - ares_free(ptr->data.soa_reply.nsname); - if (ptr->data.soa_reply.hostmaster) - ares_free(ptr->data.soa_reply.hostmaster); - break; - - case ARES_DATATYPE_CAA_REPLY: - - if (ptr->data.caa_reply.next) - next_data = ptr->data.caa_reply.next; - if (ptr->data.caa_reply.property) - ares_free(ptr->data.caa_reply.property); - if (ptr->data.caa_reply.value) - ares_free(ptr->data.caa_reply.value); - break; - - default: - return; - } - - ares_free(ptr); - dataptr = next_data; - } -} - - -/* -** ares_malloc_data() - c-ares internal helper function. -** -** This function allocates memory for a c-ares private ares_data struct -** for the specified ares_datatype, initializes c-ares private fields -** and zero initializes those which later might be used from the public -** API. It returns an interior pointer which can be passed by c-ares -** functions to the calling application, and that must be free'ed using -** c-ares external API function ares_free_data(). -*/ - -void *ares_malloc_data(ares_datatype type) -{ - struct ares_data *ptr; - - ptr = ares_malloc(sizeof(struct ares_data)); - if (!ptr) - return NULL; - - switch (type) - { - case ARES_DATATYPE_MX_REPLY: - ptr->data.mx_reply.next = NULL; - ptr->data.mx_reply.host = NULL; - ptr->data.mx_reply.priority = 0; - break; - - case ARES_DATATYPE_SRV_REPLY: - ptr->data.srv_reply.next = NULL; - ptr->data.srv_reply.host = NULL; - ptr->data.srv_reply.priority = 0; - ptr->data.srv_reply.weight = 0; - ptr->data.srv_reply.port = 0; - break; - - case ARES_DATATYPE_URI_REPLY: - ptr->data.uri_reply.next = NULL; - ptr->data.uri_reply.priority = 0; - ptr->data.uri_reply.weight = 0; - ptr->data.uri_reply.uri = NULL; - ptr->data.uri_reply.ttl = 0; - break; - - case ARES_DATATYPE_TXT_EXT: - ptr->data.txt_ext.record_start = 0; - /* FALLTHROUGH */ - - case ARES_DATATYPE_TXT_REPLY: - ptr->data.txt_reply.next = NULL; - ptr->data.txt_reply.txt = NULL; - ptr->data.txt_reply.length = 0; - break; - - case ARES_DATATYPE_CAA_REPLY: - ptr->data.caa_reply.next = NULL; - ptr->data.caa_reply.plength = 0; - ptr->data.caa_reply.property = NULL; - ptr->data.caa_reply.length = 0; - ptr->data.caa_reply.value = NULL; - break; - - case ARES_DATATYPE_ADDR_NODE: - ptr->data.addr_node.next = NULL; - ptr->data.addr_node.family = 0; - memset(&ptr->data.addr_node.addrV6, 0, - sizeof(ptr->data.addr_node.addrV6)); - break; - - case ARES_DATATYPE_ADDR_PORT_NODE: - ptr->data.addr_port_node.next = NULL; - ptr->data.addr_port_node.family = 0; - ptr->data.addr_port_node.udp_port = 0; - ptr->data.addr_port_node.tcp_port = 0; - memset(&ptr->data.addr_port_node.addrV6, 0, - sizeof(ptr->data.addr_port_node.addrV6)); - break; - - case ARES_DATATYPE_NAPTR_REPLY: - ptr->data.naptr_reply.next = NULL; - ptr->data.naptr_reply.flags = NULL; - ptr->data.naptr_reply.service = NULL; - ptr->data.naptr_reply.regexp = NULL; - ptr->data.naptr_reply.replacement = NULL; - ptr->data.naptr_reply.order = 0; - ptr->data.naptr_reply.preference = 0; - break; - - case ARES_DATATYPE_SOA_REPLY: - ptr->data.soa_reply.nsname = NULL; - ptr->data.soa_reply.hostmaster = NULL; - ptr->data.soa_reply.serial = 0; - ptr->data.soa_reply.refresh = 0; - ptr->data.soa_reply.retry = 0; - ptr->data.soa_reply.expire = 0; - ptr->data.soa_reply.minttl = 0; - break; - - default: - ares_free(ptr); - return NULL; - } - - ptr->mark = ARES_DATATYPE_MARK; - ptr->type = type; - - return &ptr->data; -} diff --git a/lib/c-ares-1.19.1/src/lib/ares_data.h b/lib/c-ares-1.19.1/src/lib/ares_data.h deleted file mode 100644 index a682ad54cb9..00000000000 --- a/lib/c-ares-1.19.1/src/lib/ares_data.h +++ /dev/null @@ -1,81 +0,0 @@ -#ifndef __ARES_DATA_H -#define __ARES_DATA_H - - -/* Copyright (C) 2009-2013 by Daniel Stenberg - * - * 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. - */ - -typedef enum { - ARES_DATATYPE_UNKNOWN = 1, /* unknown data type - introduced in 1.7.0 */ - ARES_DATATYPE_SRV_REPLY, /* struct ares_srv_reply - introduced in 1.7.0 */ - ARES_DATATYPE_TXT_REPLY, /* struct ares_txt_reply - introduced in 1.7.0 */ - ARES_DATATYPE_TXT_EXT, /* struct ares_txt_ext - introduced in 1.11.0 */ - ARES_DATATYPE_ADDR_NODE, /* struct ares_addr_node - introduced in 1.7.1 */ - ARES_DATATYPE_MX_REPLY, /* struct ares_mx_reply - introduced in 1.7.2 */ - ARES_DATATYPE_NAPTR_REPLY,/* struct ares_naptr_reply - introduced in 1.7.6 */ - ARES_DATATYPE_SOA_REPLY, /* struct ares_soa_reply - introduced in 1.9.0 */ - ARES_DATATYPE_URI_REPLY, /* struct ares_uri_reply */ -#if 0 - ARES_DATATYPE_ADDR6TTL, /* struct ares_addrttl */ - ARES_DATATYPE_ADDRTTL, /* struct ares_addr6ttl */ - ARES_DATATYPE_HOSTENT, /* struct hostent */ - ARES_DATATYPE_OPTIONS, /* struct ares_options */ -#endif - ARES_DATATYPE_ADDR_PORT_NODE, /* struct ares_addr_port_node - introduced in 1.11.0 */ - ARES_DATATYPE_CAA_REPLY, /* struct ares_caa_reply - introduced in 1.17 */ - ARES_DATATYPE_LAST /* not used - introduced in 1.7.0 */ -} ares_datatype; - -#define ARES_DATATYPE_MARK 0xbead - -/* - * ares_data struct definition is internal to c-ares and shall not - * be exposed by the public API in order to allow future changes - * and extensions to it without breaking ABI. This will be used - * internally by c-ares as the container of multiple types of data - * dynamically allocated for which a reference will be returned - * to the calling application. - * - * c-ares API functions returning a pointer to c-ares internally - * allocated data will actually be returning an interior pointer - * into this ares_data struct. - * - * All this is 'invisible' to the calling application, the only - * requirement is that this kind of data must be free'ed by the - * calling application using ares_free_data() with the pointer - * it has received from a previous c-ares function call. - */ - -struct ares_data { - ares_datatype type; /* Actual data type identifier. */ - unsigned int mark; /* Private ares_data signature. */ - union { - struct ares_txt_reply txt_reply; - struct ares_txt_ext txt_ext; - struct ares_srv_reply srv_reply; - struct ares_addr_node addr_node; - struct ares_addr_port_node addr_port_node; - struct ares_mx_reply mx_reply; - struct ares_naptr_reply naptr_reply; - struct ares_soa_reply soa_reply; - struct ares_caa_reply caa_reply; - struct ares_uri_reply uri_reply; - } data; -}; - -void *ares_malloc_data(ares_datatype type); - - -#endif /* __ARES_DATA_H */ diff --git a/lib/c-ares-1.19.1/src/lib/ares_destroy.c b/lib/c-ares-1.19.1/src/lib/ares_destroy.c deleted file mode 100644 index 62c899f82e0..00000000000 --- a/lib/c-ares-1.19.1/src/lib/ares_destroy.c +++ /dev/null @@ -1,121 +0,0 @@ - -/* Copyright 1998 by the Massachusetts Institute of Technology. - * Copyright (C) 2004-2011 by Daniel Stenberg - * - * 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. - */ - -#include "ares_setup.h" - -#include - -#include "ares.h" -#include "ares_private.h" - -void ares_destroy_options(struct ares_options *options) -{ - int i; - - if(options->servers) - ares_free(options->servers); - for (i = 0; i < options->ndomains; i++) - ares_free(options->domains[i]); - if(options->domains) - ares_free(options->domains); - if(options->sortlist) - ares_free(options->sortlist); - if(options->lookups) - ares_free(options->lookups); - if(options->resolvconf_path) - ares_free(options->resolvconf_path); - if(options->hosts_path) - ares_free(options->hosts_path); -} - -void ares_destroy(ares_channel channel) -{ - int i; - struct query *query; - struct list_node* list_head; - struct list_node* list_node; - - if (!channel) - return; - - list_head = &(channel->all_queries); - for (list_node = list_head->next; list_node != list_head; ) - { - query = list_node->data; - list_node = list_node->next; /* since we're deleting the query */ - query->callback(query->arg, ARES_EDESTRUCTION, 0, NULL, 0); - ares__free_query(query); - } -#ifndef NDEBUG - /* Freeing the query should remove it from all the lists in which it sits, - * so all query lists should be empty now. - */ - assert(ares__is_list_empty(&(channel->all_queries))); - for (i = 0; i < ARES_QID_TABLE_SIZE; i++) - { - assert(ares__is_list_empty(&(channel->queries_by_qid[i]))); - } - for (i = 0; i < ARES_TIMEOUT_TABLE_SIZE; i++) - { - assert(ares__is_list_empty(&(channel->queries_by_timeout[i]))); - } -#endif - - ares__destroy_servers_state(channel); - - if (channel->domains) { - for (i = 0; i < channel->ndomains; i++) - ares_free(channel->domains[i]); - ares_free(channel->domains); - } - - if(channel->sortlist) - ares_free(channel->sortlist); - - if (channel->lookups) - ares_free(channel->lookups); - - if (channel->resolvconf_path) - ares_free(channel->resolvconf_path); - - if (channel->hosts_path) - ares_free(channel->hosts_path); - - if (channel->rand_state) - ares__destroy_rand_state(channel->rand_state); - - ares_free(channel); -} - -void ares__destroy_servers_state(ares_channel channel) -{ - struct server_state *server; - int i; - - if (channel->servers) - { - for (i = 0; i < channel->nservers; i++) - { - server = &channel->servers[i]; - ares__close_sockets(channel, server); - assert(ares__is_list_empty(&server->queries_to_server)); - } - ares_free(channel->servers); - channel->servers = NULL; - } - channel->nservers = -1; -} diff --git a/lib/c-ares-1.19.1/src/lib/ares_expand_name.c b/lib/c-ares-1.19.1/src/lib/ares_expand_name.c deleted file mode 100644 index ad1c97f9377..00000000000 --- a/lib/c-ares-1.19.1/src/lib/ares_expand_name.c +++ /dev/null @@ -1,311 +0,0 @@ - -/* Copyright 1998, 2011 by the Massachusetts Institute of Technology. - * - * 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. - */ - -#include "ares_setup.h" - -#ifdef HAVE_NETINET_IN_H -# include -#endif - -#include "ares_nameser.h" - -#include "ares.h" -#include "ares_nowarn.h" -#include "ares_private.h" /* for the memdebug */ - -/* Maximum number of indirections allowed for a name */ -#define MAX_INDIRS 50 - -static int name_length(const unsigned char *encoded, const unsigned char *abuf, - int alen, int is_hostname); - -/* Reserved characters for names that need to be escaped */ -static int is_reservedch(int ch) -{ - switch (ch) { - case '"': - case '.': - case ';': - case '\\': - case '(': - case ')': - case '@': - case '$': - return 1; - default: - break; - } - - return 0; -} - -static int ares__isprint(int ch) -{ - if (ch >= 0x20 && ch <= 0x7E) - return 1; - return 0; -} - -/* Character set allowed by hostnames. This is to include the normal - * domain name character set plus: - * - underscores which are used in SRV records. - * - Forward slashes such as are used for classless in-addr.arpa - * delegation (CNAMEs) - * - Asterisks may be used for wildcard domains in CNAMEs as seen in the - * real world. - * While RFC 2181 section 11 does state not to do validation, - * that applies to servers, not clients. Vulnerabilities have been - * reported when this validation is not performed. Security is more - * important than edge-case compatibility (which is probably invalid - * anyhow). */ -static int is_hostnamech(int ch) -{ - /* [A-Za-z0-9-*._/] - * Don't use isalnum() as it is locale-specific - */ - if (ch >= 'A' && ch <= 'Z') - return 1; - if (ch >= 'a' && ch <= 'z') - return 1; - if (ch >= '0' && ch <= '9') - return 1; - if (ch == '-' || ch == '.' || ch == '_' || ch == '/' || ch == '*') - return 1; - - return 0; -} - -/* Expand an RFC1035-encoded domain name given by encoded. The - * containing message is given by abuf and alen. The result given by - * *s, which is set to a NUL-terminated allocated buffer. *enclen is - * set to the length of the encoded name (not the length of the - * expanded name; the goal is to tell the caller how many bytes to - * move forward to get past the encoded name). - * - * In the simple case, an encoded name is a series of labels, each - * composed of a one-byte length (limited to values between 0 and 63 - * inclusive) followed by the label contents. The name is terminated - * by a zero-length label. - * - * In the more complicated case, a label may be terminated by an - * indirection pointer, specified by two bytes with the high bits of - * the first byte (corresponding to INDIR_MASK) set to 11. With the - * two high bits of the first byte stripped off, the indirection - * pointer gives an offset from the beginning of the containing - * message with more labels to decode. Indirection can happen an - * arbitrary number of times, so we have to detect loops. - * - * Since the expanded name uses '.' as a label separator, we use - * backslashes to escape periods or backslashes in the expanded name. - * - * If the result is expected to be a hostname, then no escaped data is allowed - * and will return error. - */ - -int ares__expand_name_validated(const unsigned char *encoded, - const unsigned char *abuf, - int alen, char **s, long *enclen, - int is_hostname) -{ - int len, indir = 0; - char *q; - const unsigned char *p; - union { - ares_ssize_t sig; - size_t uns; - } nlen; - - nlen.sig = name_length(encoded, abuf, alen, is_hostname); - if (nlen.sig < 0) - return ARES_EBADNAME; - - *s = ares_malloc(nlen.uns + 1); - if (!*s) - return ARES_ENOMEM; - q = *s; - - if (nlen.uns == 0) { - /* RFC2181 says this should be ".": the root of the DNS tree. - * Since this function strips trailing dots though, it becomes "" - */ - q[0] = '\0'; - - /* indirect root label (like 0xc0 0x0c) is 2 bytes long (stupid, but - valid) */ - if ((*encoded & INDIR_MASK) == INDIR_MASK) - *enclen = 2L; - else - *enclen = 1L; /* the caller should move one byte to get past this */ - - return ARES_SUCCESS; - } - - /* No error-checking necessary; it was all done by name_length(). */ - p = encoded; - while (*p) - { - if ((*p & INDIR_MASK) == INDIR_MASK) - { - if (!indir) - { - *enclen = aresx_uztosl(p + 2U - encoded); - indir = 1; - } - p = abuf + ((*p & ~INDIR_MASK) << 8 | *(p + 1)); - } - else - { - int name_len = *p; - len = name_len; - p++; - - while (len--) - { - /* Output as \DDD for consistency with RFC1035 5.1, except - * for the special case of a root name response */ - if (!ares__isprint(*p) && !(name_len == 1 && *p == 0)) - { - *q++ = '\\'; - *q++ = (char)('0' + *p / 100); - *q++ = (char)('0' + (*p % 100) / 10); - *q++ = (char)('0' + (*p % 10)); - } - else if (is_reservedch(*p)) - { - *q++ = '\\'; - *q++ = *p; - } - else - { - *q++ = *p; - } - p++; - } - *q++ = '.'; - } - } - - if (!indir) - *enclen = aresx_uztosl(p + 1U - encoded); - - /* Nuke the trailing period if we wrote one. */ - if (q > *s) - *(q - 1) = 0; - else - *q = 0; /* zero terminate; LCOV_EXCL_LINE: empty names exit above */ - - return ARES_SUCCESS; -} - - -int ares_expand_name(const unsigned char *encoded, const unsigned char *abuf, - int alen, char **s, long *enclen) -{ - return ares__expand_name_validated(encoded, abuf, alen, s, enclen, 0); -} - -/* Return the length of the expansion of an encoded domain name, or - * -1 if the encoding is invalid. - */ -static int name_length(const unsigned char *encoded, const unsigned char *abuf, - int alen, int is_hostname) -{ - int n = 0, offset, indir = 0, top; - - /* Allow the caller to pass us abuf + alen and have us check for it. */ - if (encoded >= abuf + alen) - return -1; - - while (*encoded) - { - top = (*encoded & INDIR_MASK); - if (top == INDIR_MASK) - { - /* Check the offset and go there. */ - if (encoded + 1 >= abuf + alen) - return -1; - offset = (*encoded & ~INDIR_MASK) << 8 | *(encoded + 1); - if (offset >= alen) - return -1; - encoded = abuf + offset; - - /* If we've seen more indirects than the message length, - * then there's a loop. - */ - ++indir; - if (indir > alen || indir > MAX_INDIRS) - return -1; - } - else if (top == 0x00) - { - int name_len = *encoded; - offset = name_len; - if (encoded + offset + 1 >= abuf + alen) - return -1; - encoded++; - - while (offset--) - { - if (!ares__isprint(*encoded) && !(name_len == 1 && *encoded == 0)) - { - if (is_hostname) - return -1; - n += 4; - } - else if (is_reservedch(*encoded)) - { - if (is_hostname) - return -1; - n += 2; - } - else - { - if (is_hostname && !is_hostnamech(*encoded)) - return -1; - n += 1; - } - encoded++; - } - - n++; - } - else - { - /* RFC 1035 4.1.4 says other options (01, 10) for top 2 - * bits are reserved. - */ - return -1; - } - } - - /* If there were any labels at all, then the number of dots is one - * less than the number of labels, so subtract one. - */ - return (n) ? n - 1 : n; -} - -/* Like ares_expand_name_validated but returns EBADRESP in case of invalid - * input. */ -int ares__expand_name_for_response(const unsigned char *encoded, - const unsigned char *abuf, int alen, - char **s, long *enclen, int is_hostname) -{ - int status = ares__expand_name_validated(encoded, abuf, alen, s, enclen, - is_hostname); - if (status == ARES_EBADNAME) - status = ARES_EBADRESP; - return status; -} diff --git a/lib/c-ares-1.19.1/src/lib/ares_expand_string.c b/lib/c-ares-1.19.1/src/lib/ares_expand_string.c deleted file mode 100644 index 03e39299752..00000000000 --- a/lib/c-ares-1.19.1/src/lib/ares_expand_string.c +++ /dev/null @@ -1,67 +0,0 @@ - -/* Copyright 1998 by the Massachusetts Institute of Technology. - * - * 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. - */ - -#include "ares_setup.h" - -#ifdef HAVE_NETINET_IN_H -# include -#endif - -#include "ares_nameser.h" - -#include "ares.h" -#include "ares_private.h" /* for the memdebug */ - -/* Simply decodes a length-encoded character string. The first byte of the - * input is the length of the string to be returned and the bytes thereafter - * are the characters of the string. The returned result will be NULL - * terminated. - */ -int ares_expand_string(const unsigned char *encoded, - const unsigned char *abuf, - int alen, - unsigned char **s, - long *enclen) -{ - unsigned char *q; - union { - ares_ssize_t sig; - size_t uns; - } elen; - - if (encoded == abuf+alen) - return ARES_EBADSTR; - - elen.uns = *encoded; - if (encoded+elen.sig+1 > abuf+alen) - return ARES_EBADSTR; - - encoded++; - - *s = ares_malloc(elen.uns+1); - if (*s == NULL) - return ARES_ENOMEM; - q = *s; - strncpy((char *)q, (char *)encoded, elen.uns); - q[elen.uns] = '\0'; - - *s = q; - - *enclen = (long)(elen.sig+1); - - return ARES_SUCCESS; -} - diff --git a/lib/c-ares-1.19.1/src/lib/ares_fds.c b/lib/c-ares-1.19.1/src/lib/ares_fds.c deleted file mode 100644 index f405fc047c7..00000000000 --- a/lib/c-ares-1.19.1/src/lib/ares_fds.c +++ /dev/null @@ -1,59 +0,0 @@ - -/* Copyright 1998 by the Massachusetts Institute of Technology. - * - * 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. - */ - -#include "ares_setup.h" - -#include "ares.h" -#include "ares_nowarn.h" -#include "ares_private.h" - -int ares_fds(ares_channel channel, fd_set *read_fds, fd_set *write_fds) -{ - struct server_state *server; - ares_socket_t nfds; - int i; - - /* Are there any active queries? */ - int active_queries = !ares__is_list_empty(&(channel->all_queries)); - - nfds = 0; - for (i = 0; i < channel->nservers; i++) - { - server = &channel->servers[i]; - /* We only need to register interest in UDP sockets if we have - * outstanding queries. - */ - if (active_queries && server->udp_socket != ARES_SOCKET_BAD) - { - FD_SET(server->udp_socket, read_fds); - if (server->udp_socket >= nfds) - nfds = server->udp_socket + 1; - } - /* We always register for TCP events, because we want to know - * when the other side closes the connection, so we don't waste - * time trying to use a broken connection. - */ - if (server->tcp_socket != ARES_SOCKET_BAD) - { - FD_SET(server->tcp_socket, read_fds); - if (server->qhead) - FD_SET(server->tcp_socket, write_fds); - if (server->tcp_socket >= nfds) - nfds = server->tcp_socket + 1; - } - } - return (int)nfds; -} diff --git a/lib/c-ares-1.19.1/src/lib/ares_free_hostent.c b/lib/c-ares-1.19.1/src/lib/ares_free_hostent.c deleted file mode 100644 index ea28ff0e2c1..00000000000 --- a/lib/c-ares-1.19.1/src/lib/ares_free_hostent.c +++ /dev/null @@ -1,43 +0,0 @@ - -/* Copyright 1998 by the Massachusetts Institute of Technology. - * - * 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. - */ - -#include "ares_setup.h" - -#ifdef HAVE_NETDB_H -#include -#endif - -#include "ares.h" -#include "ares_private.h" /* for memdebug */ - -void ares_free_hostent(struct hostent *host) -{ - char **p; - - if (!host) - return; - - ares_free((char *)(host->h_name)); - for (p = host->h_aliases; p && *p; p++) - ares_free(*p); - ares_free(host->h_aliases); - if (host->h_addr_list) { - ares_free(host->h_addr_list[0]); /* no matter if there is one or many entries, - there is only one malloc for all of them */ - ares_free(host->h_addr_list); - } - ares_free(host); -} diff --git a/lib/c-ares-1.19.1/src/lib/ares_free_string.c b/lib/c-ares-1.19.1/src/lib/ares_free_string.c deleted file mode 100644 index 024992e1c20..00000000000 --- a/lib/c-ares-1.19.1/src/lib/ares_free_string.c +++ /dev/null @@ -1,25 +0,0 @@ - -/* Copyright 2000 by the Massachusetts Institute of Technology. - * - * 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. - */ - -#include "ares_setup.h" - -#include "ares.h" -#include "ares_private.h" - -void ares_free_string(void *str) -{ - ares_free(str); -} diff --git a/lib/c-ares-1.19.1/src/lib/ares_freeaddrinfo.c b/lib/c-ares-1.19.1/src/lib/ares_freeaddrinfo.c deleted file mode 100644 index ab871363d51..00000000000 --- a/lib/c-ares-1.19.1/src/lib/ares_freeaddrinfo.c +++ /dev/null @@ -1,60 +0,0 @@ - -/* Copyright 1998 by the Massachusetts Institute of Technology. - * Copyright (C) 2019 by Andrew Selivanov - * - * 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. - */ - -#include "ares_setup.h" - -#ifdef HAVE_NETDB_H -# include -#endif - -#include "ares.h" -#include "ares_private.h" - -void ares__freeaddrinfo_cnames(struct ares_addrinfo_cname *head) -{ - struct ares_addrinfo_cname *current; - while (head) - { - current = head; - head = head->next; - ares_free(current->alias); - ares_free(current->name); - ares_free(current); - } -} - -void ares__freeaddrinfo_nodes(struct ares_addrinfo_node *head) -{ - struct ares_addrinfo_node *current; - while (head) - { - current = head; - head = head->ai_next; - ares_free(current->ai_addr); - ares_free(current); - } -} - -void ares_freeaddrinfo(struct ares_addrinfo *ai) -{ - if (ai == NULL) - return; - ares__freeaddrinfo_cnames(ai->cnames); - ares__freeaddrinfo_nodes(ai->nodes); - ares_free(ai->name); - ares_free(ai); -} diff --git a/lib/c-ares-1.19.1/src/lib/ares_getaddrinfo.c b/lib/c-ares-1.19.1/src/lib/ares_getaddrinfo.c deleted file mode 100644 index cb494242f28..00000000000 --- a/lib/c-ares-1.19.1/src/lib/ares_getaddrinfo.c +++ /dev/null @@ -1,850 +0,0 @@ - -/* Copyright 1998, 2011, 2013 by the Massachusetts Institute of Technology. - * Copyright (C) 2017 - 2018 by Christian Ammer - * Copyright (C) 2019 by Andrew Selivanov - * - * 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. - */ - -#include "ares_setup.h" - -#ifdef HAVE_GETSERVBYNAME_R -# if !defined(GETSERVBYNAME_R_ARGS) || \ - (GETSERVBYNAME_R_ARGS < 4) || (GETSERVBYNAME_R_ARGS > 6) -# error "you MUST specifiy a valid number of arguments for getservbyname_r" -# endif -#endif - -#ifdef HAVE_NETINET_IN_H -# include -#endif -#ifdef HAVE_NETDB_H -# include -#endif -#ifdef HAVE_ARPA_INET_H -# include -#endif - -#include "ares_nameser.h" - -#ifdef HAVE_STRINGS_H -#include -#endif -#include - -#ifdef HAVE_LIMITS_H -#include -#endif - -#include "ares.h" -#include "bitncmp.h" -#include "ares_private.h" - -#ifdef WATT32 -#undef WIN32 -#endif -#ifdef WIN32 -# include "ares_platform.h" -#endif - -struct host_query -{ - ares_channel channel; - char *name; - unsigned short port; /* in host order */ - ares_addrinfo_callback callback; - void *arg; - struct ares_addrinfo_hints hints; - int sent_family; /* this family is what was is being used */ - int timeouts; /* number of timeouts we saw for this request */ - const char *remaining_lookups; /* types of lookup we need to perform ("fb" by - default, file and dns respectively) */ - struct ares_addrinfo *ai; /* store results between lookups */ - int remaining; /* number of DNS answers waiting for */ - int next_domain; /* next search domain to try */ - int nodata_cnt; /* Track nodata responses to possibly override final result */ -}; - -static const struct ares_addrinfo_hints default_hints = { - 0, /* ai_flags */ - AF_UNSPEC, /* ai_family */ - 0, /* ai_socktype */ - 0, /* ai_protocol */ -}; - -static const struct ares_addrinfo_cname empty_addrinfo_cname = { - INT_MAX, /* ttl */ - NULL, /* alias */ - NULL, /* name */ - NULL, /* next */ -}; - -static const struct ares_addrinfo_node empty_addrinfo_node = { - 0, /* ai_ttl */ - 0, /* ai_flags */ - 0, /* ai_family */ - 0, /* ai_socktype */ - 0, /* ai_protocol */ - 0, /* ai_addrlen */ - NULL, /* ai_addr */ - NULL /* ai_next */ -}; - -static const struct ares_addrinfo empty_addrinfo = { - NULL, /* cnames */ - NULL, /* nodes */ - NULL /* name */ -}; - -/* forward declarations */ -static void host_callback(void *arg, int status, int timeouts, - unsigned char *abuf, int alen); -static int as_is_first(const struct host_query *hquery); -static int as_is_only(const struct host_query* hquery); -static int next_dns_lookup(struct host_query *hquery); - -struct ares_addrinfo_cname *ares__malloc_addrinfo_cname() -{ - struct ares_addrinfo_cname *cname = ares_malloc(sizeof(struct ares_addrinfo_cname)); - if (!cname) - return NULL; - - *cname = empty_addrinfo_cname; - return cname; -} - -struct ares_addrinfo_cname *ares__append_addrinfo_cname(struct ares_addrinfo_cname **head) -{ - struct ares_addrinfo_cname *tail = ares__malloc_addrinfo_cname(); - struct ares_addrinfo_cname *last = *head; - if (!last) - { - *head = tail; - return tail; - } - - while (last->next) - { - last = last->next; - } - - last->next = tail; - return tail; -} - -void ares__addrinfo_cat_cnames(struct ares_addrinfo_cname **head, - struct ares_addrinfo_cname *tail) -{ - struct ares_addrinfo_cname *last = *head; - if (!last) - { - *head = tail; - return; - } - - while (last->next) - { - last = last->next; - } - - last->next = tail; -} - -struct ares_addrinfo *ares__malloc_addrinfo() -{ - struct ares_addrinfo *ai = ares_malloc(sizeof(struct ares_addrinfo)); - if (!ai) - return NULL; - - *ai = empty_addrinfo; - return ai; -} - -struct ares_addrinfo_node *ares__malloc_addrinfo_node() -{ - struct ares_addrinfo_node *node = - ares_malloc(sizeof(struct ares_addrinfo_node)); - if (!node) - return NULL; - - *node = empty_addrinfo_node; - return node; -} - -/* Allocate new addrinfo and append to the tail. */ -struct ares_addrinfo_node *ares__append_addrinfo_node(struct ares_addrinfo_node **head) -{ - struct ares_addrinfo_node *tail = ares__malloc_addrinfo_node(); - struct ares_addrinfo_node *last = *head; - if (!last) - { - *head = tail; - return tail; - } - - while (last->ai_next) - { - last = last->ai_next; - } - - last->ai_next = tail; - return tail; -} - -void ares__addrinfo_cat_nodes(struct ares_addrinfo_node **head, - struct ares_addrinfo_node *tail) -{ - struct ares_addrinfo_node *last = *head; - if (!last) - { - *head = tail; - return; - } - - while (last->ai_next) - { - last = last->ai_next; - } - - last->ai_next = tail; -} - -/* Resolve service name into port number given in host byte order. - * If not resolved, return 0. - */ -static unsigned short lookup_service(const char *service, int flags) -{ - const char *proto; - struct servent *sep; -#ifdef HAVE_GETSERVBYNAME_R - struct servent se; - char tmpbuf[4096]; -#endif - - if (service) - { - if (flags & ARES_NI_UDP) - proto = "udp"; - else if (flags & ARES_NI_SCTP) - proto = "sctp"; - else if (flags & ARES_NI_DCCP) - proto = "dccp"; - else - proto = "tcp"; -#ifdef HAVE_GETSERVBYNAME_R - memset(&se, 0, sizeof(se)); - sep = &se; - memset(tmpbuf, 0, sizeof(tmpbuf)); -#if GETSERVBYNAME_R_ARGS == 6 - if (getservbyname_r(service, proto, &se, (void *)tmpbuf, sizeof(tmpbuf), - &sep) != 0) - sep = NULL; /* LCOV_EXCL_LINE: buffer large so this never fails */ -#elif GETSERVBYNAME_R_ARGS == 5 - sep = - getservbyname_r(service, proto, &se, (void *)tmpbuf, sizeof(tmpbuf)); -#elif GETSERVBYNAME_R_ARGS == 4 - if (getservbyname_r(service, proto, &se, (void *)tmpbuf) != 0) - sep = NULL; -#else - /* Lets just hope the OS uses TLS! */ - sep = getservbyname(service, proto); -#endif -#else - /* Lets just hope the OS uses TLS! */ -#if (defined(NETWARE) && !defined(__NOVELL_LIBC__)) - sep = getservbyname(service, (char *)proto); -#else - sep = getservbyname(service, proto); -#endif -#endif - return (sep ? ntohs((unsigned short)sep->s_port) : 0); - } - return 0; -} - -/* If the name looks like an IP address or an error occured, - * fake up a host entry, end the query immediately, and return true. - * Otherwise return false. - */ -static int fake_addrinfo(const char *name, - unsigned short port, - const struct ares_addrinfo_hints *hints, - struct ares_addrinfo *ai, - ares_addrinfo_callback callback, - void *arg) -{ - struct ares_addrinfo_cname *cname; - int status = ARES_SUCCESS; - int result = 0; - int family = hints->ai_family; - if (family == AF_INET || family == AF_INET6 || family == AF_UNSPEC) - { - /* It only looks like an IP address if it's all numbers and dots. */ - int numdots = 0, valid = 1; - const char *p; - for (p = name; *p; p++) - { - if (!ISDIGIT(*p) && *p != '.') - { - valid = 0; - break; - } - else if (*p == '.') - { - numdots++; - } - } - - /* if we don't have 3 dots, it is illegal - * (although inet_pton doesn't think so). - */ - if (numdots != 3 || !valid) - result = 0; - else - { - struct in_addr addr4; - result = ares_inet_pton(AF_INET, name, &addr4) < 1 ? 0 : 1; - if (result) - { - status = ares_append_ai_node(AF_INET, port, 0, &addr4, &ai->nodes); - if (status != ARES_SUCCESS) - { - callback(arg, status, 0, NULL); - return 1; - } - } - } - } - - if (!result && (family == AF_INET6 || family == AF_UNSPEC)) - { - struct ares_in6_addr addr6; - result = ares_inet_pton(AF_INET6, name, &addr6) < 1 ? 0 : 1; - if (result) - { - status = ares_append_ai_node(AF_INET6, port, 0, &addr6, &ai->nodes); - if (status != ARES_SUCCESS) - { - callback(arg, status, 0, NULL); - return 1; - } - } - } - - if (!result) - return 0; - - if (hints->ai_flags & ARES_AI_CANONNAME) - { - cname = ares__append_addrinfo_cname(&ai->cnames); - if (!cname) - { - ares_freeaddrinfo(ai); - callback(arg, ARES_ENOMEM, 0, NULL); - return 1; - } - - /* Duplicate the name, to avoid a constness violation. */ - cname->name = ares_strdup(name); - if (!cname->name) - { - ares_freeaddrinfo(ai); - callback(arg, ARES_ENOMEM, 0, NULL); - return 1; - } - } - - ai->nodes->ai_socktype = hints->ai_socktype; - ai->nodes->ai_protocol = hints->ai_protocol; - - callback(arg, ARES_SUCCESS, 0, ai); - return 1; -} - -static void end_hquery(struct host_query *hquery, int status) -{ - struct ares_addrinfo_node sentinel; - struct ares_addrinfo_node *next; - if (status == ARES_SUCCESS) - { - if (!(hquery->hints.ai_flags & ARES_AI_NOSORT) && hquery->ai->nodes) - { - sentinel.ai_next = hquery->ai->nodes; - ares__sortaddrinfo(hquery->channel, &sentinel); - hquery->ai->nodes = sentinel.ai_next; - } - next = hquery->ai->nodes; - - while (next) - { - next->ai_socktype = hquery->hints.ai_socktype; - next->ai_protocol = hquery->hints.ai_protocol; - next = next->ai_next; - } - } - else - { - /* Clean up what we have collected by so far. */ - ares_freeaddrinfo(hquery->ai); - hquery->ai = NULL; - } - - hquery->callback(hquery->arg, status, hquery->timeouts, hquery->ai); - ares_free(hquery->name); - ares_free(hquery); -} - -static int is_localhost(const char *name) -{ - /* RFC6761 6.3 says : The domain "localhost." and any names falling within ".localhost." */ - size_t len; - - if (name == NULL) - return 0; - - if (strcmp(name, "localhost") == 0) - return 1; - - len = strlen(name); - if (len < 10 /* strlen(".localhost") */) - return 0; - - if (strcmp(name + (len - 10 /* strlen(".localhost") */), ".localhost") == 0) - return 1; - - return 0; -} - -static int file_lookup(struct host_query *hquery) -{ - FILE *fp; - int error; - int status; - char *path_hosts = NULL; - - if (hquery->hints.ai_flags & ARES_AI_ENVHOSTS) - { - path_hosts = ares_strdup(getenv("CARES_HOSTS")); - if (!path_hosts) - return ARES_ENOMEM; - } - - if (hquery->channel->hosts_path) - { - path_hosts = ares_strdup(hquery->channel->hosts_path); - if (!path_hosts) - return ARES_ENOMEM; - } - - if (!path_hosts) - { -#ifdef WIN32 - char PATH_HOSTS[MAX_PATH]; - win_platform platform; - - PATH_HOSTS[0] = '\0'; - - platform = ares__getplatform(); - - if (platform == WIN_NT) - { - char tmp[MAX_PATH]; - HKEY hkeyHosts; - - if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, WIN_NS_NT_KEY, 0, KEY_READ, - &hkeyHosts) == ERROR_SUCCESS) - { - DWORD dwLength = MAX_PATH; - RegQueryValueExA(hkeyHosts, DATABASEPATH, NULL, NULL, (LPBYTE)tmp, - &dwLength); - ExpandEnvironmentStringsA(tmp, PATH_HOSTS, MAX_PATH); - RegCloseKey(hkeyHosts); - } - } - else if (platform == WIN_9X) - GetWindowsDirectoryA(PATH_HOSTS, MAX_PATH); - else - return ARES_ENOTFOUND; - - strcat(PATH_HOSTS, WIN_PATH_HOSTS); -#elif defined(WATT32) - const char *PATH_HOSTS = _w32_GetHostsFile(); - - if (!PATH_HOSTS) - return ARES_ENOTFOUND; -#endif - path_hosts = ares_strdup(PATH_HOSTS); - if (!path_hosts) - return ARES_ENOMEM; - } - - fp = fopen(path_hosts, "r"); - if (!fp) - { - error = ERRNO; - switch (error) - { - case ENOENT: - case ESRCH: - status = ARES_ENOTFOUND; - break; - default: - DEBUGF(fprintf(stderr, "fopen() failed with error: %d %s\n", error, - strerror(error))); - DEBUGF(fprintf(stderr, "Error opening file: %s\n", path_hosts)); - status = ARES_EFILE; - break; - } - } - else - { - status = ares__readaddrinfo(fp, hquery->name, hquery->port, &hquery->hints, hquery->ai); - fclose(fp); - } - ares_free(path_hosts); - - /* RFC6761 section 6.3 #3 states that "Name resolution APIs and libraries - * SHOULD recognize localhost names as special and SHOULD always return the - * IP loopback address for address queries". - * We will also ignore ALL errors when trying to resolve localhost, such - * as permissions errors reading /etc/hosts or a malformed /etc/hosts */ - if (status != ARES_SUCCESS && is_localhost(hquery->name)) - { - return ares__addrinfo_localhost(hquery->name, hquery->port, - &hquery->hints, hquery->ai); - } - - return status; -} - -static void next_lookup(struct host_query *hquery, int status) -{ - switch (*hquery->remaining_lookups) - { - case 'b': - /* RFC6761 section 6.3 #3 says "Name resolution APIs SHOULD NOT send - * queries for localhost names to their configured caching DNS - * server(s)." */ - if (!is_localhost(hquery->name)) - { - /* DNS lookup */ - if (next_dns_lookup(hquery)) - break; - } - - hquery->remaining_lookups++; - next_lookup(hquery, status); - break; - - case 'f': - /* Host file lookup */ - if (file_lookup(hquery) == ARES_SUCCESS) - { - end_hquery(hquery, ARES_SUCCESS); - break; - } - hquery->remaining_lookups++; - next_lookup(hquery, status); - break; - default: - /* No lookup left */ - end_hquery(hquery, status); - break; - } -} - -static void host_callback(void *arg, int status, int timeouts, - unsigned char *abuf, int alen) -{ - struct host_query *hquery = (struct host_query*)arg; - int addinfostatus = ARES_SUCCESS; - hquery->timeouts += timeouts; - hquery->remaining--; - - if (status == ARES_SUCCESS) - { - addinfostatus = ares__parse_into_addrinfo(abuf, alen, 1, hquery->port, hquery->ai); - } - - if (!hquery->remaining) - { - if (addinfostatus != ARES_SUCCESS && addinfostatus != ARES_ENODATA) - { - /* error in parsing result e.g. no memory */ - if (addinfostatus == ARES_EBADRESP && hquery->ai->nodes) - { - /* We got a bad response from server, but at least one query - * ended with ARES_SUCCESS */ - end_hquery(hquery, ARES_SUCCESS); - } - else - { - end_hquery(hquery, addinfostatus); - } - } - else if (hquery->ai->nodes) - { - /* at least one query ended with ARES_SUCCESS */ - end_hquery(hquery, ARES_SUCCESS); - } - else if (status == ARES_ENOTFOUND || status == ARES_ENODATA || - addinfostatus == ARES_ENODATA) - { - if (status == ARES_ENODATA || addinfostatus == ARES_ENODATA) - hquery->nodata_cnt++; - next_lookup(hquery, hquery->nodata_cnt?ARES_ENODATA:status); - } - else if (status == ARES_EDESTRUCTION) - { - /* NOTE: Could also be ARES_EDESTRUCTION. We need to only call this - * once all queries (there can be multiple for getaddrinfo) are - * terminated. */ - end_hquery(hquery, status); - } - else - { - end_hquery(hquery, status); - } - } - - /* at this point we keep on waiting for the next query to finish */ -} - -void ares_getaddrinfo(ares_channel channel, - const char* name, const char* service, - const struct ares_addrinfo_hints* hints, - ares_addrinfo_callback callback, void* arg) -{ - struct host_query *hquery; - unsigned short port = 0; - int family; - struct ares_addrinfo *ai; - char *alias_name = NULL; - int status; - - if (!hints) - { - hints = &default_hints; - } - - family = hints->ai_family; - - /* Right now we only know how to look up Internet addresses - and unspec means try both basically. */ - if (family != AF_INET && - family != AF_INET6 && - family != AF_UNSPEC) - { - callback(arg, ARES_ENOTIMP, 0, NULL); - return; - } - - if (ares__is_onion_domain(name)) - { - callback(arg, ARES_ENOTFOUND, 0, NULL); - return; - } - - /* perform HOSTALIAS resolution (technically this function does some other - * things we are going to ignore) */ - status = ares__single_domain(channel, name, &alias_name); - if (status != ARES_SUCCESS) { - callback(arg, status, 0, NULL); - return; - } - - if (alias_name) - name = alias_name; - - if (service) - { - if (hints->ai_flags & ARES_AI_NUMERICSERV) - { - unsigned long val; - errno = 0; - val = strtoul(service, NULL, 0); - if ((val == 0 && errno != 0) || val > 65535) - { - ares_free(alias_name); - callback(arg, ARES_ESERVICE, 0, NULL); - return; - } - port = (unsigned short)val; - } - else - { - port = lookup_service(service, 0); - if (!port) - { - unsigned long val; - errno = 0; - val = strtoul(service, NULL, 0); - if ((val == 0 && errno != 0) || val > 65535) - { - ares_free(alias_name); - callback(arg, ARES_ESERVICE, 0, NULL); - return; - } - port = (unsigned short)val; - } - } - } - - ai = ares__malloc_addrinfo(); - if (!ai) - { - ares_free(alias_name); - callback(arg, ARES_ENOMEM, 0, NULL); - return; - } - - if (fake_addrinfo(name, port, hints, ai, callback, arg)) - { - ares_free(alias_name); - return; - } - - /* Allocate and fill in the host query structure. */ - hquery = ares_malloc(sizeof(struct host_query)); - if (!hquery) - { - ares_free(alias_name); - ares_freeaddrinfo(ai); - callback(arg, ARES_ENOMEM, 0, NULL); - return; - } - - hquery->name = ares_strdup(name); - ares_free(alias_name); - if (!hquery->name) - { - ares_free(hquery); - ares_freeaddrinfo(ai); - callback(arg, ARES_ENOMEM, 0, NULL); - return; - } - - hquery->port = port; - hquery->channel = channel; - hquery->hints = *hints; - hquery->sent_family = -1; /* nothing is sent yet */ - hquery->callback = callback; - hquery->arg = arg; - hquery->remaining_lookups = channel->lookups; - hquery->timeouts = 0; - hquery->ai = ai; - hquery->next_domain = -1; - hquery->remaining = 0; - hquery->nodata_cnt = 0; - - /* Start performing lookups according to channel->lookups. */ - next_lookup(hquery, ARES_ECONNREFUSED /* initial error code */); -} - -static int next_dns_lookup(struct host_query *hquery) -{ - char *s = NULL; - int is_s_allocated = 0; - int status; - - /* if next_domain == -1 and as_is_first is true, try hquery->name */ - if (hquery->next_domain == -1) - { - if (as_is_first(hquery)) - { - s = hquery->name; - } - hquery->next_domain = 0; - } - - /* if as_is_first is false, try hquery->name at last */ - if (!s && hquery->next_domain == hquery->channel->ndomains) { - if (!as_is_first(hquery)) - { - s = hquery->name; - } - hquery->next_domain++; - } - - if (!s && hquery->next_domain < hquery->channel->ndomains && !as_is_only(hquery)) - { - status = ares__cat_domain( - hquery->name, - hquery->channel->domains[hquery->next_domain++], - &s); - if (status == ARES_SUCCESS) - { - is_s_allocated = 1; - } - } - - if (s) - { - switch (hquery->hints.ai_family) - { - case AF_INET: - hquery->remaining += 1; - ares_query(hquery->channel, s, C_IN, T_A, host_callback, hquery); - break; - case AF_INET6: - hquery->remaining += 1; - ares_query(hquery->channel, s, C_IN, T_AAAA, host_callback, hquery); - break; - case AF_UNSPEC: - hquery->remaining += 2; - ares_query(hquery->channel, s, C_IN, T_A, host_callback, hquery); - ares_query(hquery->channel, s, C_IN, T_AAAA, host_callback, hquery); - break; - default: break; - } - if (is_s_allocated) - { - ares_free(s); - } - return 1; - } - else - { - assert(!hquery->ai->nodes); - return 0; - } -} - -static int as_is_first(const struct host_query* hquery) -{ - char* p; - int ndots = 0; - size_t nname = hquery->name?strlen(hquery->name):0; - for (p = hquery->name; *p; p++) - { - if (*p == '.') - { - ndots++; - } - } - if (nname && hquery->name[nname-1] == '.') - { - /* prevent ARES_EBADNAME for valid FQDN, where ndots < channel->ndots */ - return 1; - } - return ndots >= hquery->channel->ndots; -} - -static int as_is_only(const struct host_query* hquery) -{ - size_t nname = hquery->name?strlen(hquery->name):0; - if (nname && hquery->name[nname-1] == '.') - return 1; - return 0; -} - diff --git a/lib/c-ares-1.19.1/src/lib/ares_getenv.c b/lib/c-ares-1.19.1/src/lib/ares_getenv.c deleted file mode 100644 index f6e4dc29526..00000000000 --- a/lib/c-ares-1.19.1/src/lib/ares_getenv.c +++ /dev/null @@ -1,28 +0,0 @@ - - -/* Copyright 1998 by the Massachusetts Institute of Technology. - * - * 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. - */ - -#include "ares_setup.h" -#include "ares_getenv.h" - -#ifndef HAVE_GETENV - -char *ares_getenv(const char *name) -{ - return NULL; -} - -#endif diff --git a/lib/c-ares-1.19.1/src/lib/ares_getenv.h b/lib/c-ares-1.19.1/src/lib/ares_getenv.h deleted file mode 100644 index 6da6cc5081a..00000000000 --- a/lib/c-ares-1.19.1/src/lib/ares_getenv.h +++ /dev/null @@ -1,26 +0,0 @@ -#ifndef HEADER_CARES_GETENV_H -#define HEADER_CARES_GETENV_H - - -/* Copyright 1998 by the Massachusetts Institute of Technology. - * - * 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. - */ - -#include "ares_setup.h" - -#ifndef HAVE_GETENV -extern char *ares_getenv(const char *name); -#endif - -#endif /* HEADER_CARES_GETENV_H */ diff --git a/lib/c-ares-1.19.1/src/lib/ares_gethostbyaddr.c b/lib/c-ares-1.19.1/src/lib/ares_gethostbyaddr.c deleted file mode 100644 index c62d230d96e..00000000000 --- a/lib/c-ares-1.19.1/src/lib/ares_gethostbyaddr.c +++ /dev/null @@ -1,287 +0,0 @@ - -/* Copyright 1998 by the Massachusetts Institute of Technology. - * - * 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. - */ -#include "ares_setup.h" - -#ifdef HAVE_NETINET_IN_H -# include -#endif -#ifdef HAVE_NETDB_H -# include -#endif -#ifdef HAVE_ARPA_INET_H -# include -#endif - -#include "ares_nameser.h" - -#include "ares.h" -#include "ares_inet_net_pton.h" -#include "ares_platform.h" -#include "ares_private.h" - -#ifdef WATT32 -#undef WIN32 -#endif - -struct addr_query { - /* Arguments passed to ares_gethostbyaddr() */ - ares_channel channel; - struct ares_addr addr; - ares_host_callback callback; - void *arg; - - const char *remaining_lookups; - int timeouts; -}; - -static void next_lookup(struct addr_query *aquery); -static void addr_callback(void *arg, int status, int timeouts, - unsigned char *abuf, int alen); -static void end_aquery(struct addr_query *aquery, int status, - struct hostent *host); -static int file_lookup(struct ares_addr *addr, struct hostent **host); -static void ptr_rr_name(char *name, const struct ares_addr *addr); - -void ares_gethostbyaddr(ares_channel channel, const void *addr, int addrlen, - int family, ares_host_callback callback, void *arg) -{ - struct addr_query *aquery; - - if (family != AF_INET && family != AF_INET6) - { - callback(arg, ARES_ENOTIMP, 0, NULL); - return; - } - - if ((family == AF_INET && addrlen != sizeof(aquery->addr.addrV4)) || - (family == AF_INET6 && addrlen != sizeof(aquery->addr.addrV6))) - { - callback(arg, ARES_ENOTIMP, 0, NULL); - return; - } - - aquery = ares_malloc(sizeof(struct addr_query)); - if (!aquery) - { - callback(arg, ARES_ENOMEM, 0, NULL); - return; - } - aquery->channel = channel; - if (family == AF_INET) - memcpy(&aquery->addr.addrV4, addr, sizeof(aquery->addr.addrV4)); - else - memcpy(&aquery->addr.addrV6, addr, sizeof(aquery->addr.addrV6)); - aquery->addr.family = family; - aquery->callback = callback; - aquery->arg = arg; - aquery->remaining_lookups = channel->lookups; - aquery->timeouts = 0; - - next_lookup(aquery); -} - -static void next_lookup(struct addr_query *aquery) -{ - const char *p; - char name[128]; - int status; - struct hostent *host; - - for (p = aquery->remaining_lookups; *p; p++) - { - switch (*p) - { - case 'b': - ptr_rr_name(name, &aquery->addr); - aquery->remaining_lookups = p + 1; - ares_query(aquery->channel, name, C_IN, T_PTR, addr_callback, - aquery); - return; - case 'f': - status = file_lookup(&aquery->addr, &host); - - /* this status check below previously checked for !ARES_ENOTFOUND, - but we should not assume that this single error code is the one - that can occur, as that is in fact no longer the case */ - if (status == ARES_SUCCESS) - { - end_aquery(aquery, status, host); - return; - } - break; - } - } - end_aquery(aquery, ARES_ENOTFOUND, NULL); -} - -static void addr_callback(void *arg, int status, int timeouts, - unsigned char *abuf, int alen) -{ - struct addr_query *aquery = (struct addr_query *) arg; - struct hostent *host; - size_t addrlen; - - aquery->timeouts += timeouts; - if (status == ARES_SUCCESS) - { - if (aquery->addr.family == AF_INET) - { - addrlen = sizeof(aquery->addr.addrV4); - status = ares_parse_ptr_reply(abuf, alen, &aquery->addr.addrV4, - (int)addrlen, AF_INET, &host); - } - else - { - addrlen = sizeof(aquery->addr.addrV6); - status = ares_parse_ptr_reply(abuf, alen, &aquery->addr.addrV6, - (int)addrlen, AF_INET6, &host); - } - end_aquery(aquery, status, host); - } - else if (status == ARES_EDESTRUCTION || status == ARES_ECANCELLED) - end_aquery(aquery, status, NULL); - else - next_lookup(aquery); -} - -static void end_aquery(struct addr_query *aquery, int status, - struct hostent *host) -{ - aquery->callback(aquery->arg, status, aquery->timeouts, host); - if (host) - ares_free_hostent(host); - ares_free(aquery); -} - -static int file_lookup(struct ares_addr *addr, struct hostent **host) -{ - FILE *fp; - int status; - int error; - -#ifdef WIN32 - char PATH_HOSTS[MAX_PATH]; - win_platform platform; - - PATH_HOSTS[0] = '\0'; - - platform = ares__getplatform(); - - if (platform == WIN_NT) { - char tmp[MAX_PATH]; - HKEY hkeyHosts; - - if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, WIN_NS_NT_KEY, 0, KEY_READ, - &hkeyHosts) == ERROR_SUCCESS) - { - DWORD dwLength = MAX_PATH; - RegQueryValueExA(hkeyHosts, DATABASEPATH, NULL, NULL, (LPBYTE)tmp, - &dwLength); - ExpandEnvironmentStringsA(tmp, PATH_HOSTS, MAX_PATH); - RegCloseKey(hkeyHosts); - } - } - else if (platform == WIN_9X) - GetWindowsDirectoryA(PATH_HOSTS, MAX_PATH); - else - return ARES_ENOTFOUND; - - strcat(PATH_HOSTS, WIN_PATH_HOSTS); - -#elif defined(WATT32) - const char *PATH_HOSTS = _w32_GetHostsFile(); - - if (!PATH_HOSTS) - return ARES_ENOTFOUND; -#endif - - fp = fopen(PATH_HOSTS, "r"); - if (!fp) - { - error = ERRNO; - switch(error) - { - case ENOENT: - case ESRCH: - return ARES_ENOTFOUND; - default: - DEBUGF(fprintf(stderr, "fopen() failed with error: %d %s\n", - error, strerror(error))); - DEBUGF(fprintf(stderr, "Error opening file: %s\n", - PATH_HOSTS)); - *host = NULL; - return ARES_EFILE; - } - } - while ((status = ares__get_hostent(fp, addr->family, host)) == ARES_SUCCESS) - { - if (addr->family != (*host)->h_addrtype) - { - ares_free_hostent(*host); - continue; - } - if (addr->family == AF_INET) - { - if (memcmp((*host)->h_addr, &addr->addrV4, - sizeof(addr->addrV4)) == 0) - break; - } - else if (addr->family == AF_INET6) - { - if (memcmp((*host)->h_addr, &addr->addrV6, - sizeof(addr->addrV6)) == 0) - break; - } - ares_free_hostent(*host); - } - fclose(fp); - if (status == ARES_EOF) - status = ARES_ENOTFOUND; - if (status != ARES_SUCCESS) - *host = NULL; - return status; -} - -static void ptr_rr_name(char *name, const struct ares_addr *addr) -{ - if (addr->family == AF_INET) - { - unsigned long laddr = ntohl(addr->addrV4.s_addr); - unsigned long a1 = (laddr >> 24UL) & 0xFFUL; - unsigned long a2 = (laddr >> 16UL) & 0xFFUL; - unsigned long a3 = (laddr >> 8UL) & 0xFFUL; - unsigned long a4 = laddr & 0xFFUL; - sprintf(name, "%lu.%lu.%lu.%lu.in-addr.arpa", a4, a3, a2, a1); - } - else - { - unsigned char *bytes = (unsigned char *)&addr->addrV6; - /* There are too many arguments to do this in one line using - * minimally C89-compliant compilers */ - sprintf(name, - "%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.", - bytes[15]&0xf, bytes[15] >> 4, bytes[14]&0xf, bytes[14] >> 4, - bytes[13]&0xf, bytes[13] >> 4, bytes[12]&0xf, bytes[12] >> 4, - bytes[11]&0xf, bytes[11] >> 4, bytes[10]&0xf, bytes[10] >> 4, - bytes[9]&0xf, bytes[9] >> 4, bytes[8]&0xf, bytes[8] >> 4); - sprintf(name+strlen(name), - "%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.ip6.arpa", - bytes[7]&0xf, bytes[7] >> 4, bytes[6]&0xf, bytes[6] >> 4, - bytes[5]&0xf, bytes[5] >> 4, bytes[4]&0xf, bytes[4] >> 4, - bytes[3]&0xf, bytes[3] >> 4, bytes[2]&0xf, bytes[2] >> 4, - bytes[1]&0xf, bytes[1] >> 4, bytes[0]&0xf, bytes[0] >> 4); - } -} diff --git a/lib/c-ares-1.19.1/src/lib/ares_gethostbyname.c b/lib/c-ares-1.19.1/src/lib/ares_gethostbyname.c deleted file mode 100644 index 8c71cc67f3c..00000000000 --- a/lib/c-ares-1.19.1/src/lib/ares_gethostbyname.c +++ /dev/null @@ -1,338 +0,0 @@ -/* Copyright 1998, 2011, 2013 by the Massachusetts Institute of Technology. - * - * 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. - */ - -#include "ares_setup.h" - -#ifdef HAVE_NETINET_IN_H -# include -#endif -#ifdef HAVE_NETDB_H -# include -#endif -#ifdef HAVE_ARPA_INET_H -# include -#endif - -#include "ares_nameser.h" - -#ifdef HAVE_STRINGS_H -#include -#endif - -#include "ares.h" -#include "ares_inet_net_pton.h" -#include "bitncmp.h" -#include "ares_platform.h" -#include "ares_nowarn.h" -#include "ares_private.h" - -static void sort_addresses(struct hostent *host, - const struct apattern *sortlist, int nsort); -static void sort6_addresses(struct hostent *host, - const struct apattern *sortlist, int nsort); -static int get_address_index(const struct in_addr *addr, - const struct apattern *sortlist, int nsort); -static int get6_address_index(const struct ares_in6_addr *addr, - const struct apattern *sortlist, int nsort); - -struct host_query { - ares_host_callback callback; - void *arg; - ares_channel channel; -}; - -static void ares_gethostbyname_callback(void *arg, int status, int timeouts, - struct ares_addrinfo *result) -{ - struct hostent *hostent = NULL; - struct host_query *ghbn_arg = arg; - - if (status == ARES_SUCCESS) - { - status = ares__addrinfo2hostent(result, AF_UNSPEC, &hostent); - } - - /* addrinfo2hostent will only return ENODATA if there are no addresses _and_ - * no cname/aliases. However, gethostbyname will return ENODATA even if there - * is cname/alias data */ - if (status == ARES_SUCCESS && hostent && - (!hostent->h_addr_list || !hostent->h_addr_list[0])) - { - status = ARES_ENODATA; - } - - if (status == ARES_SUCCESS && ghbn_arg->channel->nsort && hostent) - { - if (hostent->h_addrtype == AF_INET6) - sort6_addresses(hostent, ghbn_arg->channel->sortlist, - ghbn_arg->channel->nsort); - if (hostent->h_addrtype == AF_INET) - sort_addresses(hostent, ghbn_arg->channel->sortlist, - ghbn_arg->channel->nsort); - } - - ghbn_arg->callback(ghbn_arg->arg, status, timeouts, hostent); - - ares_freeaddrinfo(result); - ares_free(ghbn_arg); - ares_free_hostent(hostent); -} - -void ares_gethostbyname(ares_channel channel, const char *name, int family, - ares_host_callback callback, void *arg) -{ - const struct ares_addrinfo_hints hints = { ARES_AI_CANONNAME, family, 0, 0 }; - struct host_query *ghbn_arg; - - if (!callback) - return; - - ghbn_arg = ares_malloc(sizeof(*ghbn_arg)); - if (!ghbn_arg) - { - callback(arg, ARES_ENOMEM, 0, NULL); - return; - } - - ghbn_arg->callback=callback; - ghbn_arg->arg=arg; - ghbn_arg->channel=channel; - - ares_getaddrinfo(channel, name, NULL, &hints, ares_gethostbyname_callback, - ghbn_arg); -} - - -static void sort_addresses(struct hostent *host, - const struct apattern *sortlist, int nsort) -{ - struct in_addr a1, a2; - int i1, i2, ind1, ind2; - - /* This is a simple insertion sort, not optimized at all. i1 walks - * through the address list, with the loop invariant that everything - * to the left of i1 is sorted. In the loop body, the value at i1 is moved - * back through the list (via i2) until it is in sorted order. - */ - for (i1 = 0; host->h_addr_list[i1]; i1++) - { - memcpy(&a1, host->h_addr_list[i1], sizeof(struct in_addr)); - ind1 = get_address_index(&a1, sortlist, nsort); - for (i2 = i1 - 1; i2 >= 0; i2--) - { - memcpy(&a2, host->h_addr_list[i2], sizeof(struct in_addr)); - ind2 = get_address_index(&a2, sortlist, nsort); - if (ind2 <= ind1) - break; - memcpy(host->h_addr_list[i2 + 1], &a2, sizeof(struct in_addr)); - } - memcpy(host->h_addr_list[i2 + 1], &a1, sizeof(struct in_addr)); - } -} - -/* Find the first entry in sortlist which matches addr. Return nsort - * if none of them match. - */ -static int get_address_index(const struct in_addr *addr, - const struct apattern *sortlist, - int nsort) -{ - int i; - - for (i = 0; i < nsort; i++) - { - if (sortlist[i].family != AF_INET) - continue; - if (sortlist[i].type == PATTERN_MASK) - { - if ((addr->s_addr & sortlist[i].mask.addr4.s_addr) - == sortlist[i].addrV4.s_addr) - break; - } - else - { - if (!ares__bitncmp(&addr->s_addr, &sortlist[i].addrV4.s_addr, - sortlist[i].mask.bits)) - break; - } - } - return i; -} - -static void sort6_addresses(struct hostent *host, - const struct apattern *sortlist, int nsort) -{ - struct ares_in6_addr a1, a2; - int i1, i2, ind1, ind2; - - /* This is a simple insertion sort, not optimized at all. i1 walks - * through the address list, with the loop invariant that everything - * to the left of i1 is sorted. In the loop body, the value at i1 is moved - * back through the list (via i2) until it is in sorted order. - */ - for (i1 = 0; host->h_addr_list[i1]; i1++) - { - memcpy(&a1, host->h_addr_list[i1], sizeof(struct ares_in6_addr)); - ind1 = get6_address_index(&a1, sortlist, nsort); - for (i2 = i1 - 1; i2 >= 0; i2--) - { - memcpy(&a2, host->h_addr_list[i2], sizeof(struct ares_in6_addr)); - ind2 = get6_address_index(&a2, sortlist, nsort); - if (ind2 <= ind1) - break; - memcpy(host->h_addr_list[i2 + 1], &a2, sizeof(struct ares_in6_addr)); - } - memcpy(host->h_addr_list[i2 + 1], &a1, sizeof(struct ares_in6_addr)); - } -} - -/* Find the first entry in sortlist which matches addr. Return nsort - * if none of them match. - */ -static int get6_address_index(const struct ares_in6_addr *addr, - const struct apattern *sortlist, - int nsort) -{ - int i; - - for (i = 0; i < nsort; i++) - { - if (sortlist[i].family != AF_INET6) - continue; - if (!ares__bitncmp(addr, &sortlist[i].addrV6, sortlist[i].mask.bits)) - break; - } - return i; -} - - - -static int file_lookup(const char *name, int family, struct hostent **host); - -/* I really have no idea why this is exposed as a public function, but since - * it is, we can't kill this legacy function. */ -int ares_gethostbyname_file(ares_channel channel, const char *name, - int family, struct hostent **host) -{ - int result; - - /* We only take the channel to ensure that ares_init() been called. */ - if(channel == NULL) - { - /* Anything will do, really. This seems fine, and is consistent with - other error cases. */ - *host = NULL; - return ARES_ENOTFOUND; - } - - /* Just chain to the internal implementation we use here; it's exactly - * what we want. - */ - result = file_lookup(name, family, host); - if(result != ARES_SUCCESS) - { - /* We guarantee a NULL hostent on failure. */ - *host = NULL; - } - return result; -} - -static int file_lookup(const char *name, int family, struct hostent **host) -{ - FILE *fp; - char **alias; - int status; - int error; - -#ifdef WIN32 - char PATH_HOSTS[MAX_PATH]; - win_platform platform; - - PATH_HOSTS[0] = '\0'; - - platform = ares__getplatform(); - - if (platform == WIN_NT) { - char tmp[MAX_PATH]; - HKEY hkeyHosts; - - if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, WIN_NS_NT_KEY, 0, KEY_READ, - &hkeyHosts) == ERROR_SUCCESS) - { - DWORD dwLength = MAX_PATH; - RegQueryValueExA(hkeyHosts, DATABASEPATH, NULL, NULL, (LPBYTE)tmp, - &dwLength); - ExpandEnvironmentStringsA(tmp, PATH_HOSTS, MAX_PATH); - RegCloseKey(hkeyHosts); - } - } - else if (platform == WIN_9X) - GetWindowsDirectoryA(PATH_HOSTS, MAX_PATH); - else - return ARES_ENOTFOUND; - - strcat(PATH_HOSTS, WIN_PATH_HOSTS); - -#elif defined(WATT32) - const char *PATH_HOSTS = _w32_GetHostsFile(); - - if (!PATH_HOSTS) - return ARES_ENOTFOUND; -#endif - - /* Per RFC 7686, reject queries for ".onion" domain names with NXDOMAIN. */ - if (ares__is_onion_domain(name)) - return ARES_ENOTFOUND; - - - fp = fopen(PATH_HOSTS, "r"); - if (!fp) - { - error = ERRNO; - switch(error) - { - case ENOENT: - case ESRCH: - return ARES_ENOTFOUND; - default: - DEBUGF(fprintf(stderr, "fopen() failed with error: %d %s\n", - error, strerror(error))); - DEBUGF(fprintf(stderr, "Error opening file: %s\n", - PATH_HOSTS)); - *host = NULL; - return ARES_EFILE; - } - } - while ((status = ares__get_hostent(fp, family, host)) == ARES_SUCCESS) - { - if (strcasecmp((*host)->h_name, name) == 0) - break; - for (alias = (*host)->h_aliases; *alias; alias++) - { - if (strcasecmp(*alias, name) == 0) - break; - } - if (*alias) - break; - ares_free_hostent(*host); - } - fclose(fp); - if (status == ARES_EOF) - status = ARES_ENOTFOUND; - if (status != ARES_SUCCESS) - *host = NULL; - return status; -} - diff --git a/lib/c-ares-1.19.1/src/lib/ares_getnameinfo.c b/lib/c-ares-1.19.1/src/lib/ares_getnameinfo.c deleted file mode 100644 index 966919ac232..00000000000 --- a/lib/c-ares-1.19.1/src/lib/ares_getnameinfo.c +++ /dev/null @@ -1,447 +0,0 @@ - -/* Copyright 2005 by Dominick Meglio - * - * 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. - */ -#include "ares_setup.h" - -#ifdef HAVE_GETSERVBYPORT_R -# if !defined(GETSERVBYPORT_R_ARGS) || \ - (GETSERVBYPORT_R_ARGS < 4) || (GETSERVBYPORT_R_ARGS > 6) -# error "you MUST specifiy a valid number of arguments for getservbyport_r" -# endif -#endif - -#ifdef HAVE_NETINET_IN_H -# include -#endif -#ifdef HAVE_NETDB_H -# include -#endif -#ifdef HAVE_ARPA_INET_H -# include -#endif - -#include "ares_nameser.h" - -#ifdef HAVE_NET_IF_H -#include -#endif - -#include "ares.h" -#include "ares_ipv6.h" -#include "ares_nowarn.h" -#include "ares_private.h" - -struct nameinfo_query { - ares_nameinfo_callback callback; - void *arg; - union { - struct sockaddr_in addr4; - struct sockaddr_in6 addr6; - } addr; - int family; - int flags; - int timeouts; -}; - -#ifdef HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID -#define IPBUFSIZ \ - (sizeof("ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255") + IF_NAMESIZE) -#else -#define IPBUFSIZ \ - (sizeof("ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255")) -#endif - -static void nameinfo_callback(void *arg, int status, int timeouts, - struct hostent *host); -static char *lookup_service(unsigned short port, int flags, - char *buf, size_t buflen); -#ifdef HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID -static void append_scopeid(struct sockaddr_in6 *addr6, unsigned int scopeid, - char *buf, size_t buflen); -#endif -STATIC_TESTABLE char *ares_striendstr(const char *s1, const char *s2); - -void ares_getnameinfo(ares_channel channel, const struct sockaddr *sa, - ares_socklen_t salen, - int flags, ares_nameinfo_callback callback, void *arg) -{ - struct sockaddr_in *addr = NULL; - struct sockaddr_in6 *addr6 = NULL; - struct nameinfo_query *niquery; - unsigned int port = 0; - - /* Validate socket address family and length */ - if ((sa->sa_family == AF_INET) && - (salen == sizeof(struct sockaddr_in))) - { - addr = CARES_INADDR_CAST(struct sockaddr_in *, sa); - port = addr->sin_port; - } - else if ((sa->sa_family == AF_INET6) && - (salen == sizeof(struct sockaddr_in6))) - { - addr6 = CARES_INADDR_CAST(struct sockaddr_in6 *, sa); - port = addr6->sin6_port; - } - else - { - callback(arg, ARES_ENOTIMP, 0, NULL, NULL); - return; - } - - /* If neither, assume they want a host */ - if (!(flags & ARES_NI_LOOKUPSERVICE) && !(flags & ARES_NI_LOOKUPHOST)) - flags |= ARES_NI_LOOKUPHOST; - - /* All they want is a service, no need for DNS */ - if ((flags & ARES_NI_LOOKUPSERVICE) && !(flags & ARES_NI_LOOKUPHOST)) - { - char buf[33], *service; - - service = lookup_service((unsigned short)(port & 0xffff), - flags, buf, sizeof(buf)); - callback(arg, ARES_SUCCESS, 0, NULL, service); - return; - } - - /* They want a host lookup */ - if ((flags & ARES_NI_LOOKUPHOST)) - { - /* A numeric host can be handled without DNS */ - if ((flags & ARES_NI_NUMERICHOST)) - { - char ipbuf[IPBUFSIZ]; - char srvbuf[33]; - char *service = NULL; - ipbuf[0] = 0; - - /* Specifying not to lookup a host, but then saying a host - * is required has to be illegal. - */ - if (flags & ARES_NI_NAMEREQD) - { - callback(arg, ARES_EBADFLAGS, 0, NULL, NULL); - return; - } - if (salen == sizeof(struct sockaddr_in6)) - { - ares_inet_ntop(AF_INET6, &addr6->sin6_addr, ipbuf, IPBUFSIZ); - /* If the system supports scope IDs, use it */ -#ifdef HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID - append_scopeid(addr6, flags, ipbuf, sizeof(ipbuf)); -#endif - } - else - { - ares_inet_ntop(AF_INET, &addr->sin_addr, ipbuf, IPBUFSIZ); - } - /* They also want a service */ - if (flags & ARES_NI_LOOKUPSERVICE) - service = lookup_service((unsigned short)(port & 0xffff), - flags, srvbuf, sizeof(srvbuf)); - callback(arg, ARES_SUCCESS, 0, ipbuf, service); - return; - } - /* This is where a DNS lookup becomes necessary */ - else - { - niquery = ares_malloc(sizeof(struct nameinfo_query)); - if (!niquery) - { - callback(arg, ARES_ENOMEM, 0, NULL, NULL); - return; - } - niquery->callback = callback; - niquery->arg = arg; - niquery->flags = flags; - niquery->timeouts = 0; - if (sa->sa_family == AF_INET) - { - niquery->family = AF_INET; - memcpy(&niquery->addr.addr4, addr, sizeof(niquery->addr.addr4)); - ares_gethostbyaddr(channel, &addr->sin_addr, - sizeof(struct in_addr), AF_INET, - nameinfo_callback, niquery); - } - else - { - niquery->family = AF_INET6; - memcpy(&niquery->addr.addr6, addr6, sizeof(niquery->addr.addr6)); - ares_gethostbyaddr(channel, &addr6->sin6_addr, - sizeof(struct ares_in6_addr), AF_INET6, - nameinfo_callback, niquery); - } - } - } -} - -static void nameinfo_callback(void *arg, int status, int timeouts, - struct hostent *host) -{ - struct nameinfo_query *niquery = (struct nameinfo_query *) arg; - char srvbuf[33]; - char *service = NULL; - - niquery->timeouts += timeouts; - if (status == ARES_SUCCESS) - { - /* They want a service too */ - if (niquery->flags & ARES_NI_LOOKUPSERVICE) - { - if (niquery->family == AF_INET) - service = lookup_service(niquery->addr.addr4.sin_port, - niquery->flags, srvbuf, sizeof(srvbuf)); - else - service = lookup_service(niquery->addr.addr6.sin6_port, - niquery->flags, srvbuf, sizeof(srvbuf)); - } - /* NOFQDN means we have to strip off the domain name portion. We do - this by determining our own domain name, then searching the string - for this domain name and removing it. - */ -#ifdef HAVE_GETHOSTNAME - if (niquery->flags & ARES_NI_NOFQDN) - { - char buf[255]; - char *domain; - gethostname(buf, 255); - if ((domain = strchr(buf, '.')) != NULL) - { - char *end = ares_striendstr(host->h_name, domain); - if (end) - *end = 0; - } - } -#endif - niquery->callback(niquery->arg, ARES_SUCCESS, niquery->timeouts, - (char *)(host->h_name), - service); - ares_free(niquery); - return; - } - /* We couldn't find the host, but it's OK, we can use the IP */ - else if (status == ARES_ENOTFOUND && !(niquery->flags & ARES_NI_NAMEREQD)) - { - char ipbuf[IPBUFSIZ]; - if (niquery->family == AF_INET) - ares_inet_ntop(AF_INET, &niquery->addr.addr4.sin_addr, ipbuf, - IPBUFSIZ); - else - { - ares_inet_ntop(AF_INET6, &niquery->addr.addr6.sin6_addr, ipbuf, - IPBUFSIZ); -#ifdef HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID - append_scopeid(&niquery->addr.addr6, niquery->flags, ipbuf, - sizeof(ipbuf)); -#endif - } - /* They want a service too */ - if (niquery->flags & ARES_NI_LOOKUPSERVICE) - { - if (niquery->family == AF_INET) - service = lookup_service(niquery->addr.addr4.sin_port, - niquery->flags, srvbuf, sizeof(srvbuf)); - else - service = lookup_service(niquery->addr.addr6.sin6_port, - niquery->flags, srvbuf, sizeof(srvbuf)); - } - niquery->callback(niquery->arg, ARES_SUCCESS, niquery->timeouts, ipbuf, - service); - ares_free(niquery); - return; - } - niquery->callback(niquery->arg, status, niquery->timeouts, NULL, NULL); - ares_free(niquery); -} - -static char *lookup_service(unsigned short port, int flags, - char *buf, size_t buflen) -{ - const char *proto; - struct servent *sep; -#ifdef HAVE_GETSERVBYPORT_R - struct servent se; -#endif - char tmpbuf[4096]; - char *name; - size_t name_len; - - if (port) - { - if (flags & ARES_NI_NUMERICSERV) - sep = NULL; - else - { - if (flags & ARES_NI_UDP) - proto = "udp"; - else if (flags & ARES_NI_SCTP) - proto = "sctp"; - else if (flags & ARES_NI_DCCP) - proto = "dccp"; - else - proto = "tcp"; -#ifdef HAVE_GETSERVBYPORT_R - memset(&se, 0, sizeof(se)); - sep = &se; - memset(tmpbuf, 0, sizeof(tmpbuf)); -#if GETSERVBYPORT_R_ARGS == 6 - if (getservbyport_r(port, proto, &se, (void *)tmpbuf, - sizeof(tmpbuf), &sep) != 0) - sep = NULL; /* LCOV_EXCL_LINE: buffer large so this never fails */ -#elif GETSERVBYPORT_R_ARGS == 5 - sep = getservbyport_r(port, proto, &se, (void *)tmpbuf, - sizeof(tmpbuf)); -#elif GETSERVBYPORT_R_ARGS == 4 - if (getservbyport_r(port, proto, &se, (void *)tmpbuf) != 0) - sep = NULL; -#else - /* Lets just hope the OS uses TLS! */ - sep = getservbyport(port, proto); -#endif -#else - /* Lets just hope the OS uses TLS! */ -#if (defined(NETWARE) && !defined(__NOVELL_LIBC__)) - sep = getservbyport(port, (char*)proto); -#else - sep = getservbyport(port, proto); -#endif -#endif - } - if (sep && sep->s_name) - { - /* get service name */ - name = sep->s_name; - } - else - { - /* get port as a string */ - sprintf(tmpbuf, "%u", (unsigned int)ntohs(port)); - name = tmpbuf; - } - name_len = strlen(name); - if (name_len < buflen) - /* return it if buffer big enough */ - memcpy(buf, name, name_len + 1); - else - /* avoid reusing previous one */ - buf[0] = '\0'; /* LCOV_EXCL_LINE: no real service names are too big */ - return buf; - } - buf[0] = '\0'; - return NULL; -} - -#ifdef HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID -static void append_scopeid(struct sockaddr_in6 *addr6, unsigned int flags, - char *buf, size_t buflen) -{ -#ifdef HAVE_IF_INDEXTONAME - int is_ll, is_mcll; -#endif - char tmpbuf[IF_NAMESIZE + 2]; - size_t bufl; - int is_scope_long = sizeof(addr6->sin6_scope_id) > sizeof(unsigned int); - - tmpbuf[0] = '%'; - -#ifdef HAVE_IF_INDEXTONAME - is_ll = IN6_IS_ADDR_LINKLOCAL(&addr6->sin6_addr); - is_mcll = IN6_IS_ADDR_MC_LINKLOCAL(&addr6->sin6_addr); - if ((flags & ARES_NI_NUMERICSCOPE) || - (!is_ll && !is_mcll)) - { - if (is_scope_long) - { - sprintf(&tmpbuf[1], "%lu", (unsigned long)addr6->sin6_scope_id); - } - else - { - sprintf(&tmpbuf[1], "%u", (unsigned int)addr6->sin6_scope_id); - } - } - else - { - if (if_indextoname(addr6->sin6_scope_id, &tmpbuf[1]) == NULL) - { - if (is_scope_long) - { - sprintf(&tmpbuf[1], "%lu", (unsigned long)addr6->sin6_scope_id); - } - else - { - sprintf(&tmpbuf[1], "%u", (unsigned int)addr6->sin6_scope_id); - } - } - } -#else - if (is_scope_long) - { - sprintf(&tmpbuf[1], "%lu", (unsigned long)addr6->sin6_scope_id); - } - else - { - sprintf(&tmpbuf[1], "%u", (unsigned int)addr6->sin6_scope_id); - } - (void) flags; -#endif - tmpbuf[IF_NAMESIZE + 1] = '\0'; - bufl = strlen(buf); - - if(bufl + strlen(tmpbuf) < buflen) - /* only append the scopeid string if it fits in the target buffer */ - strcpy(&buf[bufl], tmpbuf); -} -#endif - -/* Determines if s1 ends with the string in s2 (case-insensitive) */ -STATIC_TESTABLE char *ares_striendstr(const char *s1, const char *s2) -{ - const char *c1, *c2, *c1_begin; - int lo1, lo2; - size_t s1_len = strlen(s1), s2_len = strlen(s2); - - /* If the substr is longer than the full str, it can't match */ - if (s2_len > s1_len) - return NULL; - - /* Jump to the end of s1 minus the length of s2 */ - c1_begin = s1+s1_len-s2_len; - c1 = (const char *)c1_begin; - c2 = s2; - while (c2 < s2+s2_len) - { - lo1 = TOLOWER(*c1); - lo2 = TOLOWER(*c2); - if (lo1 != lo2) - return NULL; - else - { - c1++; - c2++; - } - } - return (char *)c1_begin; -} - -int ares__is_onion_domain(const char *name) -{ - if (ares_striendstr(name, ".onion")) - return 1; - - if (ares_striendstr(name, ".onion.")) - return 1; - - return 0; -} diff --git a/lib/c-ares-1.19.1/src/lib/ares_getsock.c b/lib/c-ares-1.19.1/src/lib/ares_getsock.c deleted file mode 100644 index 22d344679fa..00000000000 --- a/lib/c-ares-1.19.1/src/lib/ares_getsock.c +++ /dev/null @@ -1,66 +0,0 @@ - -/* Copyright (C) 2005 - 2010, Daniel Stenberg - * - * 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. - */ - -#include "ares_setup.h" - -#include "ares.h" -#include "ares_private.h" - -int ares_getsock(ares_channel channel, - ares_socket_t *socks, - int numsocks) /* size of the 'socks' array */ -{ - struct server_state *server; - int i; - int sockindex=0; - int bitmap = 0; - unsigned int setbits = 0xffffffff; - - /* Are there any active queries? */ - int active_queries = !ares__is_list_empty(&(channel->all_queries)); - - for (i = 0; i < channel->nservers; i++) - { - server = &channel->servers[i]; - /* We only need to register interest in UDP sockets if we have - * outstanding queries. - */ - if (active_queries && server->udp_socket != ARES_SOCKET_BAD) - { - if(sockindex >= numsocks || sockindex >= ARES_GETSOCK_MAXNUM) - break; - socks[sockindex] = server->udp_socket; - bitmap |= ARES_GETSOCK_READABLE(setbits, sockindex); - sockindex++; - } - /* We always register for TCP events, because we want to know - * when the other side closes the connection, so we don't waste - * time trying to use a broken connection. - */ - if (server->tcp_socket != ARES_SOCKET_BAD) - { - if(sockindex >= numsocks || sockindex >= ARES_GETSOCK_MAXNUM) - break; - socks[sockindex] = server->tcp_socket; - bitmap |= ARES_GETSOCK_READABLE(setbits, sockindex); - - if (server->qhead && active_queries) - /* then the tcp socket is also writable! */ - bitmap |= ARES_GETSOCK_WRITABLE(setbits, sockindex); - - sockindex++; - } - } - return bitmap; -} diff --git a/lib/c-ares-1.19.1/src/lib/ares_inet_net_pton.h b/lib/c-ares-1.19.1/src/lib/ares_inet_net_pton.h deleted file mode 100644 index 90da2cc6514..00000000000 --- a/lib/c-ares-1.19.1/src/lib/ares_inet_net_pton.h +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef HEADER_CARES_INET_NET_PTON_H -#define HEADER_CARES_INET_NET_PTON_H - -/* Copyright (C) 2005-2013 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. - */ - -#ifdef HAVE_INET_NET_PTON -#define ares_inet_net_pton(w,x,y,z) inet_net_pton(w,x,y,z) -#else -int ares_inet_net_pton(int af, const char *src, void *dst, size_t size); -#endif - -#endif /* HEADER_CARES_INET_NET_PTON_H */ diff --git a/lib/c-ares-1.19.1/src/lib/ares_init.c b/lib/c-ares-1.19.1/src/lib/ares_init.c deleted file mode 100644 index 0519f43e561..00000000000 --- a/lib/c-ares-1.19.1/src/lib/ares_init.c +++ /dev/null @@ -1,2266 +0,0 @@ - -/* Copyright 1998 by the Massachusetts Institute of Technology. - * Copyright (C) 2007-2013 by Daniel Stenberg - * - * 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. - */ - -#include "ares_setup.h" - -#ifdef HAVE_SYS_PARAM_H -#include -#endif - -#ifdef HAVE_NETINET_IN_H -#include -#endif - -#ifdef HAVE_NETDB_H -#include -#endif - -#ifdef HAVE_ARPA_INET_H -#include -#endif - -#include "ares_nameser.h" - -#if defined(ANDROID) || defined(__ANDROID__) -#include -#include "ares_android.h" -/* From the Bionic sources */ -#define DNS_PROP_NAME_PREFIX "net.dns" -#define MAX_DNS_PROPERTIES 8 -#endif - -#if defined(CARES_USE_LIBRESOLV) -#include -#endif - -#if defined(USE_WINSOCK) -# include -#endif - -#include "ares.h" -#include "ares_inet_net_pton.h" -#include "ares_nowarn.h" -#include "ares_platform.h" -#include "ares_private.h" - -#ifdef WATT32 -#undef WIN32 /* Redefined in MingW/MSVC headers */ -#endif - - -static int init_by_options(ares_channel channel, - const struct ares_options *options, - int optmask); -static int init_by_environment(ares_channel channel); -static int init_by_resolv_conf(ares_channel channel); -static int init_by_defaults(ares_channel channel); - -#ifndef WATT32 -static int config_nameserver(struct server_state **servers, int *nservers, - char *str); -#endif -static int set_search(ares_channel channel, const char *str); -static int set_options(ares_channel channel, const char *str); -static const char *try_option(const char *p, const char *q, const char *opt); - -static int config_sortlist(struct apattern **sortlist, int *nsort, - const char *str); -static int sortlist_alloc(struct apattern **sortlist, int *nsort, - struct apattern *pat); -static int ip_addr(const char *s, ares_ssize_t len, struct in_addr *addr); -static void natural_mask(struct apattern *pat); -#if !defined(WIN32) && !defined(WATT32) && \ - !defined(ANDROID) && !defined(__ANDROID__) && !defined(CARES_USE_LIBRESOLV) -static int config_domain(ares_channel channel, char *str); -static int config_lookup(ares_channel channel, const char *str, - const char *bindch, const char *altbindch, - const char *filech); -static char *try_config(char *s, const char *opt, char scc); -#endif - -#define ARES_CONFIG_CHECK(x) (x->lookups && x->nsort > -1 && \ - x->nservers > -1 && \ - x->ndomains > -1 && \ - x->ndots > -1 && x->timeout > -1 && \ - x->tries > -1) - -int ares_init(ares_channel *channelptr) -{ - return ares_init_options(channelptr, NULL, 0); -} - -int ares_init_options(ares_channel *channelptr, struct ares_options *options, - int optmask) -{ - ares_channel channel; - int i; - int status = ARES_SUCCESS; - struct timeval now; - - if (ares_library_initialized() != ARES_SUCCESS) - return ARES_ENOTINITIALIZED; /* LCOV_EXCL_LINE: n/a on non-WinSock */ - - channel = ares_malloc(sizeof(struct ares_channeldata)); - if (!channel) { - *channelptr = NULL; - return ARES_ENOMEM; - } - - now = ares__tvnow(); - - /* Set everything to distinguished values so we know they haven't - * been set yet. - */ - channel->flags = -1; - channel->timeout = -1; - channel->tries = -1; - channel->ndots = -1; - channel->rotate = -1; - channel->udp_port = -1; - channel->tcp_port = -1; - channel->ednspsz = -1; - channel->socket_send_buffer_size = -1; - channel->socket_receive_buffer_size = -1; - channel->nservers = -1; - channel->ndomains = -1; - channel->nsort = -1; - channel->tcp_connection_generation = 0; - channel->lookups = NULL; - channel->domains = NULL; - channel->sortlist = NULL; - channel->servers = NULL; - channel->sock_state_cb = NULL; - channel->sock_state_cb_data = NULL; - channel->sock_create_cb = NULL; - channel->sock_create_cb_data = NULL; - channel->sock_config_cb = NULL; - channel->sock_config_cb_data = NULL; - channel->sock_funcs = NULL; - channel->sock_func_cb_data = NULL; - channel->resolvconf_path = NULL; - channel->hosts_path = NULL; - channel->rand_state = NULL; - - channel->last_server = 0; - channel->last_timeout_processed = (time_t)now.tv_sec; - - memset(&channel->local_dev_name, 0, sizeof(channel->local_dev_name)); - channel->local_ip4 = 0; - memset(&channel->local_ip6, 0, sizeof(channel->local_ip6)); - - /* Initialize our lists of queries */ - ares__init_list_head(&(channel->all_queries)); - for (i = 0; i < ARES_QID_TABLE_SIZE; i++) - { - ares__init_list_head(&(channel->queries_by_qid[i])); - } - for (i = 0; i < ARES_TIMEOUT_TABLE_SIZE; i++) - { - ares__init_list_head(&(channel->queries_by_timeout[i])); - } - - /* Initialize configuration by each of the four sources, from highest - * precedence to lowest. - */ - - status = init_by_options(channel, options, optmask); - if (status != ARES_SUCCESS) { - DEBUGF(fprintf(stderr, "Error: init_by_options failed: %s\n", - ares_strerror(status))); - /* If we fail to apply user-specified options, fail the whole init process */ - goto done; - } - status = init_by_environment(channel); - if (status != ARES_SUCCESS) - DEBUGF(fprintf(stderr, "Error: init_by_environment failed: %s\n", - ares_strerror(status))); - if (status == ARES_SUCCESS) { - status = init_by_resolv_conf(channel); - if (status != ARES_SUCCESS) - DEBUGF(fprintf(stderr, "Error: init_by_resolv_conf failed: %s\n", - ares_strerror(status))); - } - - /* - * No matter what failed or succeeded, seed defaults to provide - * useful behavior for things that we missed. - */ - status = init_by_defaults(channel); - if (status != ARES_SUCCESS) - DEBUGF(fprintf(stderr, "Error: init_by_defaults failed: %s\n", - ares_strerror(status))); - - /* Generate random key */ - - if (status == ARES_SUCCESS) { - channel->rand_state = ares__init_rand_state(); - if (channel->rand_state == NULL) { - status = ARES_ENOMEM; - } - - if (status == ARES_SUCCESS) - channel->next_id = ares__generate_new_id(channel->rand_state); - else - DEBUGF(fprintf(stderr, "Error: init_id_key failed: %s\n", - ares_strerror(status))); - } - -done: - if (status != ARES_SUCCESS) - { - /* Something failed; clean up memory we may have allocated. */ - if (channel->servers) - ares_free(channel->servers); - if (channel->ndomains != -1) - ares__strsplit_free(channel->domains, channel->ndomains); - if (channel->sortlist) - ares_free(channel->sortlist); - if(channel->lookups) - ares_free(channel->lookups); - if(channel->resolvconf_path) - ares_free(channel->resolvconf_path); - if(channel->hosts_path) - ares_free(channel->hosts_path); - if (channel->rand_state) - ares__destroy_rand_state(channel->rand_state); - ares_free(channel); - return status; - } - - /* Trim to one server if ARES_FLAG_PRIMARY is set. */ - if ((channel->flags & ARES_FLAG_PRIMARY) && channel->nservers > 1) - channel->nservers = 1; - - ares__init_servers_state(channel); - - *channelptr = channel; - return ARES_SUCCESS; -} - -/* ares_dup() duplicates a channel handle with all its options and returns a - new channel handle */ -int ares_dup(ares_channel *dest, ares_channel src) -{ - struct ares_options opts; - struct ares_addr_port_node *servers; - int non_v4_default_port = 0; - int i, rc; - int optmask; - - *dest = NULL; /* in case of failure return NULL explicitly */ - - /* First get the options supported by the old ares_save_options() function, - which is most of them */ - rc = ares_save_options(src, &opts, &optmask); - if(rc) - { - ares_destroy_options(&opts); - return rc; - } - - /* Then create the new channel with those options */ - rc = ares_init_options(dest, &opts, optmask); - - /* destroy the options copy to not leak any memory */ - ares_destroy_options(&opts); - - if(rc) - return rc; - - /* Now clone the options that ares_save_options() doesn't support. */ - (*dest)->sock_create_cb = src->sock_create_cb; - (*dest)->sock_create_cb_data = src->sock_create_cb_data; - (*dest)->sock_config_cb = src->sock_config_cb; - (*dest)->sock_config_cb_data = src->sock_config_cb_data; - (*dest)->sock_funcs = src->sock_funcs; - (*dest)->sock_func_cb_data = src->sock_func_cb_data; - - strncpy((*dest)->local_dev_name, src->local_dev_name, - sizeof((*dest)->local_dev_name)); - (*dest)->local_ip4 = src->local_ip4; - memcpy((*dest)->local_ip6, src->local_ip6, sizeof(src->local_ip6)); - - /* Full name server cloning required if there is a non-IPv4, or non-default port, nameserver */ - for (i = 0; i < src->nservers; i++) - { - if ((src->servers[i].addr.family != AF_INET) || - (src->servers[i].addr.udp_port != 0) || - (src->servers[i].addr.tcp_port != 0)) { - non_v4_default_port++; - break; - } - } - if (non_v4_default_port) { - rc = ares_get_servers_ports(src, &servers); - if (rc != ARES_SUCCESS) { - ares_destroy(*dest); - *dest = NULL; - return rc; - } - rc = ares_set_servers_ports(*dest, servers); - ares_free_data(servers); - if (rc != ARES_SUCCESS) { - ares_destroy(*dest); - *dest = NULL; - return rc; - } - } - - return ARES_SUCCESS; /* everything went fine */ -} - -/* Save options from initialized channel */ -int ares_save_options(ares_channel channel, struct ares_options *options, - int *optmask) -{ - int i, j; - int ipv4_nservers = 0; - - /* Zero everything out */ - memset(options, 0, sizeof(struct ares_options)); - - if (!ARES_CONFIG_CHECK(channel)) - return ARES_ENODATA; - - /* Traditionally the optmask wasn't saved in the channel struct so it was - recreated here. ROTATE is the first option that has no struct field of - its own in the public config struct */ - (*optmask) = (ARES_OPT_FLAGS|ARES_OPT_TRIES|ARES_OPT_NDOTS| - ARES_OPT_UDP_PORT|ARES_OPT_TCP_PORT|ARES_OPT_SOCK_STATE_CB| - ARES_OPT_SERVERS|ARES_OPT_DOMAINS|ARES_OPT_LOOKUPS| - ARES_OPT_SORTLIST|ARES_OPT_TIMEOUTMS); - (*optmask) |= (channel->rotate ? ARES_OPT_ROTATE : ARES_OPT_NOROTATE); - - if (channel->resolvconf_path) - (*optmask) |= ARES_OPT_RESOLVCONF; - - if (channel->hosts_path) - (*optmask) |= ARES_OPT_HOSTS_FILE; - - /* Copy easy stuff */ - options->flags = channel->flags; - - /* We return full millisecond resolution but that's only because we don't - set the ARES_OPT_TIMEOUT anymore, only the new ARES_OPT_TIMEOUTMS */ - options->timeout = channel->timeout; - options->tries = channel->tries; - options->ndots = channel->ndots; - options->udp_port = ntohs(aresx_sitous(channel->udp_port)); - options->tcp_port = ntohs(aresx_sitous(channel->tcp_port)); - options->sock_state_cb = channel->sock_state_cb; - options->sock_state_cb_data = channel->sock_state_cb_data; - - /* Copy IPv4 servers that use the default port */ - if (channel->nservers) { - for (i = 0; i < channel->nservers; i++) - { - if ((channel->servers[i].addr.family == AF_INET) && - (channel->servers[i].addr.udp_port == 0) && - (channel->servers[i].addr.tcp_port == 0)) - ipv4_nservers++; - } - if (ipv4_nservers) { - options->servers = ares_malloc(ipv4_nservers * sizeof(struct in_addr)); - if (!options->servers) - return ARES_ENOMEM; - for (i = j = 0; i < channel->nservers; i++) - { - if ((channel->servers[i].addr.family == AF_INET) && - (channel->servers[i].addr.udp_port == 0) && - (channel->servers[i].addr.tcp_port == 0)) - memcpy(&options->servers[j++], - &channel->servers[i].addr.addrV4, - sizeof(channel->servers[i].addr.addrV4)); - } - } - } - options->nservers = ipv4_nservers; - - /* copy domains */ - if (channel->ndomains) { - options->domains = ares_malloc(channel->ndomains * sizeof(char *)); - if (!options->domains) - return ARES_ENOMEM; - - for (i = 0; i < channel->ndomains; i++) - { - options->ndomains = i; - options->domains[i] = ares_strdup(channel->domains[i]); - if (!options->domains[i]) - return ARES_ENOMEM; - } - } - options->ndomains = channel->ndomains; - - /* copy lookups */ - if (channel->lookups) { - options->lookups = ares_strdup(channel->lookups); - if (!options->lookups && channel->lookups) - return ARES_ENOMEM; - } - - /* copy sortlist */ - if (channel->nsort) { - options->sortlist = ares_malloc(channel->nsort * sizeof(struct apattern)); - if (!options->sortlist) - return ARES_ENOMEM; - for (i = 0; i < channel->nsort; i++) - options->sortlist[i] = channel->sortlist[i]; - } - options->nsort = channel->nsort; - - /* copy path for resolv.conf file */ - if (channel->resolvconf_path) { - options->resolvconf_path = ares_strdup(channel->resolvconf_path); - if (!options->resolvconf_path) - return ARES_ENOMEM; - } - - /* copy path for hosts file */ - if (channel->hosts_path) { - options->hosts_path = ares_strdup(channel->hosts_path); - if (!options->hosts_path) - return ARES_ENOMEM; - } - - return ARES_SUCCESS; -} - -static int init_by_options(ares_channel channel, - const struct ares_options *options, - int optmask) -{ - int i; - - /* Easy stuff. */ - if ((optmask & ARES_OPT_FLAGS) && channel->flags == -1) - channel->flags = options->flags; - if ((optmask & ARES_OPT_TIMEOUTMS) && channel->timeout == -1) - channel->timeout = options->timeout; - else if ((optmask & ARES_OPT_TIMEOUT) && channel->timeout == -1) - channel->timeout = options->timeout * 1000; - if ((optmask & ARES_OPT_TRIES) && channel->tries == -1) - channel->tries = options->tries; - if ((optmask & ARES_OPT_NDOTS) && channel->ndots == -1) - channel->ndots = options->ndots; - if ((optmask & ARES_OPT_ROTATE) && channel->rotate == -1) - channel->rotate = 1; - if ((optmask & ARES_OPT_NOROTATE) && channel->rotate == -1) - channel->rotate = 0; - if ((optmask & ARES_OPT_UDP_PORT) && channel->udp_port == -1) - channel->udp_port = htons(options->udp_port); - if ((optmask & ARES_OPT_TCP_PORT) && channel->tcp_port == -1) - channel->tcp_port = htons(options->tcp_port); - if ((optmask & ARES_OPT_SOCK_STATE_CB) && channel->sock_state_cb == NULL) - { - channel->sock_state_cb = options->sock_state_cb; - channel->sock_state_cb_data = options->sock_state_cb_data; - } - if ((optmask & ARES_OPT_SOCK_SNDBUF) - && channel->socket_send_buffer_size == -1) - channel->socket_send_buffer_size = options->socket_send_buffer_size; - if ((optmask & ARES_OPT_SOCK_RCVBUF) - && channel->socket_receive_buffer_size == -1) - channel->socket_receive_buffer_size = options->socket_receive_buffer_size; - - if ((optmask & ARES_OPT_EDNSPSZ) && channel->ednspsz == -1) - channel->ednspsz = options->ednspsz; - - /* Copy the IPv4 servers, if given. */ - if ((optmask & ARES_OPT_SERVERS) && channel->nservers == -1) - { - /* Avoid zero size allocations at any cost */ - if (options->nservers > 0) - { - channel->servers = - ares_malloc(options->nservers * sizeof(struct server_state)); - if (!channel->servers) - return ARES_ENOMEM; - for (i = 0; i < options->nservers; i++) - { - channel->servers[i].addr.family = AF_INET; - channel->servers[i].addr.udp_port = 0; - channel->servers[i].addr.tcp_port = 0; - memcpy(&channel->servers[i].addr.addrV4, - &options->servers[i], - sizeof(channel->servers[i].addr.addrV4)); - } - } - channel->nservers = options->nservers; - } - - /* Copy the domains, if given. Keep channel->ndomains consistent so - * we can clean up in case of error. - */ - if ((optmask & ARES_OPT_DOMAINS) && channel->ndomains == -1) - { - /* Avoid zero size allocations at any cost */ - if (options->ndomains > 0) - { - channel->domains = ares_malloc(options->ndomains * sizeof(char *)); - if (!channel->domains) - return ARES_ENOMEM; - for (i = 0; i < options->ndomains; i++) - { - channel->ndomains = i; - channel->domains[i] = ares_strdup(options->domains[i]); - if (!channel->domains[i]) - return ARES_ENOMEM; - } - } - channel->ndomains = options->ndomains; - } - - /* Set lookups, if given. */ - if ((optmask & ARES_OPT_LOOKUPS) && !channel->lookups) - { - channel->lookups = ares_strdup(options->lookups); - if (!channel->lookups) - return ARES_ENOMEM; - } - - /* copy sortlist */ - if ((optmask & ARES_OPT_SORTLIST) && (channel->nsort == -1)) { - if (options->nsort > 0) { - channel->sortlist = ares_malloc(options->nsort * sizeof(struct apattern)); - if (!channel->sortlist) - return ARES_ENOMEM; - for (i = 0; i < options->nsort; i++) - channel->sortlist[i] = options->sortlist[i]; - } - channel->nsort = options->nsort; - } - - /* Set path for resolv.conf file, if given. */ - if ((optmask & ARES_OPT_RESOLVCONF) && !channel->resolvconf_path) - { - channel->resolvconf_path = ares_strdup(options->resolvconf_path); - if (!channel->resolvconf_path && options->resolvconf_path) - return ARES_ENOMEM; - } - - /* Set path for hosts file, if given. */ - if ((optmask & ARES_OPT_HOSTS_FILE) && !channel->hosts_path) - { - channel->hosts_path = ares_strdup(options->hosts_path); - if (!channel->hosts_path && options->hosts_path) - return ARES_ENOMEM; - } - - channel->optmask = optmask; - - return ARES_SUCCESS; -} - -static int init_by_environment(ares_channel channel) -{ - const char *localdomain, *res_options; - int status; - - localdomain = getenv("LOCALDOMAIN"); - if (localdomain && channel->ndomains == -1) - { - status = set_search(channel, localdomain); - if (status != ARES_SUCCESS) - return status; - } - - res_options = getenv("RES_OPTIONS"); - if (res_options) - { - status = set_options(channel, res_options); - if (status != ARES_SUCCESS) - return status; /* LCOV_EXCL_LINE: set_options() never fails */ - } - - return ARES_SUCCESS; -} - -#ifdef WIN32 -/* - * get_REG_SZ() - * - * Given a 'hKey' handle to an open registry key and a 'leafKeyName' pointer - * to the name of the registry leaf key to be queried, fetch it's string - * value and return a pointer in *outptr to a newly allocated memory area - * holding it as a null-terminated string. - * - * Returns 0 and nullifies *outptr upon inability to return a string value. - * - * Returns 1 and sets *outptr when returning a dynamically allocated string. - * - * Supported on Windows NT 3.5 and newer. - */ -static int get_REG_SZ(HKEY hKey, const char *leafKeyName, char **outptr) -{ - DWORD size = 0; - int res; - - *outptr = NULL; - - /* Find out size of string stored in registry */ - res = RegQueryValueExA(hKey, leafKeyName, 0, NULL, NULL, &size); - if ((res != ERROR_SUCCESS && res != ERROR_MORE_DATA) || !size) - return 0; - - /* Allocate buffer of indicated size plus one given that string - might have been stored without null termination */ - *outptr = ares_malloc(size+1); - if (!*outptr) - return 0; - - /* Get the value for real */ - res = RegQueryValueExA(hKey, leafKeyName, 0, NULL, - (unsigned char *)*outptr, &size); - if ((res != ERROR_SUCCESS) || (size == 1)) - { - ares_free(*outptr); - *outptr = NULL; - return 0; - } - - /* Null terminate buffer allways */ - *(*outptr + size) = '\0'; - - return 1; -} - -static void commanjoin(char** dst, const char* const src, const size_t len) -{ - char *newbuf; - size_t newsize; - - /* 1 for terminating 0 and 2 for , and terminating 0 */ - newsize = len + (*dst ? (strlen(*dst) + 2) : 1); - newbuf = ares_realloc(*dst, newsize); - if (!newbuf) - return; - if (*dst == NULL) - *newbuf = '\0'; - *dst = newbuf; - if (strlen(*dst) != 0) - strcat(*dst, ","); - strncat(*dst, src, len); -} - -/* - * commajoin() - * - * RTF code. - */ -static void commajoin(char **dst, const char *src) -{ - commanjoin(dst, src, strlen(src)); -} - - -/* A structure to hold the string form of IPv4 and IPv6 addresses so we can - * sort them by a metric. - */ -typedef struct -{ - /* The metric we sort them by. */ - ULONG metric; - - /* Original index of the item, used as a secondary sort parameter to make - * qsort() stable if the metrics are equal */ - size_t orig_idx; - - /* Room enough for the string form of any IPv4 or IPv6 address that - * ares_inet_ntop() will create. Based on the existing c-ares practice. - */ - char text[sizeof("ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255")]; -} Address; - -/* Sort Address values \a left and \a right by metric, returning the usual - * indicators for qsort(). - */ -static int compareAddresses(const void *arg1, - const void *arg2) -{ - const Address * const left = arg1; - const Address * const right = arg2; - /* Lower metric the more preferred */ - if(left->metric < right->metric) return -1; - if(left->metric > right->metric) return 1; - /* If metrics are equal, lower original index more preferred */ - if(left->orig_idx < right->orig_idx) return -1; - if(left->orig_idx > right->orig_idx) return 1; - return 0; -} - -/* There can be multiple routes to "the Internet". And there can be different - * DNS servers associated with each of the interfaces that offer those routes. - * We have to assume that any DNS server can serve any request. But, some DNS - * servers may only respond if requested over their associated interface. But - * we also want to use "the preferred route to the Internet" whenever possible - * (and not use DNS servers on a non-preferred route even by forcing request - * to go out on the associated non-preferred interface). i.e. We want to use - * the DNS servers associated with the same interface that we would use to - * make a general request to anything else. - * - * But, Windows won't sort the DNS servers by the metrics associated with the - * routes and interfaces _even_ though it obviously sends IP packets based on - * those same routes and metrics. So, we must do it ourselves. - * - * So, we sort the DNS servers by the same metric values used to determine how - * an outgoing IP packet will go, thus effectively using the DNS servers - * associated with the interface that the DNS requests themselves will - * travel. This gives us optimal routing and avoids issues where DNS servers - * won't respond to requests that don't arrive via some specific subnetwork - * (and thus some specific interface). - * - * This function computes the metric we use to sort. On the interface - * identified by \a luid, it determines the best route to \a dest and combines - * that route's metric with \a interfaceMetric to compute a metric for the - * destination address on that interface. This metric can be used as a weight - * to sort the DNS server addresses associated with each interface (lower is - * better). - * - * Note that by restricting the route search to the specific interface with - * which the DNS servers are associated, this function asks the question "What - * is the metric for sending IP packets to this DNS server?" which allows us - * to sort the DNS servers correctly. - */ -static ULONG getBestRouteMetric(IF_LUID * const luid, /* Can't be const :( */ - const SOCKADDR_INET * const dest, - const ULONG interfaceMetric) -{ - /* On this interface, get the best route to that destination. */ -#if defined(__WATCOMC__) - /* OpenWatcom's builtin Windows SDK does not have a definition for - * MIB_IPFORWARD_ROW2, and also does not allow the usage of SOCKADDR_INET - * as a variable. Let's work around this by returning the worst possible - * metric, but only when using the OpenWatcom compiler. - * It may be worth investigating using a different version of the Windows - * SDK with OpenWatcom in the future, though this may be fixed in OpenWatcom - * 2.0. - */ - return (ULONG)-1; -#else - MIB_IPFORWARD_ROW2 row; - SOCKADDR_INET ignored; - if(GetBestRoute2(/* The interface to use. The index is ignored since we are - * passing a LUID. - */ - luid, 0, - /* No specific source address. */ - NULL, - /* Our destination address. */ - dest, - /* No options. */ - 0, - /* The route row. */ - &row, - /* The best source address, which we don't need. */ - &ignored) != NO_ERROR - /* If the metric is "unused" (-1) or too large for us to add the two - * metrics, use the worst possible, thus sorting this last. - */ - || row.Metric == (ULONG)-1 - || row.Metric > ((ULONG)-1) - interfaceMetric) { - /* Return the worst possible metric. */ - return (ULONG)-1; - } - - /* Return the metric value from that row, plus the interface metric. - * - * See - * http://msdn.microsoft.com/en-us/library/windows/desktop/aa814494(v=vs.85).aspx - * which describes the combination as a "sum". - */ - return row.Metric + interfaceMetric; -#endif /* __WATCOMC__ */ -} - -/* - * get_DNS_Windows() - * - * Locates DNS info using GetAdaptersAddresses() function from the Internet - * Protocol Helper (IP Helper) API. When located, this returns a pointer - * in *outptr to a newly allocated memory area holding a null-terminated - * string with a space or comma seperated list of DNS IP addresses. - * - * Returns 0 and nullifies *outptr upon inability to return DNSes string. - * - * Returns 1 and sets *outptr when returning a dynamically allocated string. - * - * Implementation supports Windows XP and newer. - */ -#define IPAA_INITIAL_BUF_SZ 15 * 1024 -#define IPAA_MAX_TRIES 3 -static int get_DNS_Windows(char **outptr) -{ - IP_ADAPTER_DNS_SERVER_ADDRESS *ipaDNSAddr; - IP_ADAPTER_ADDRESSES *ipaa, *newipaa, *ipaaEntry; - ULONG ReqBufsz = IPAA_INITIAL_BUF_SZ; - ULONG Bufsz = IPAA_INITIAL_BUF_SZ; - ULONG AddrFlags = 0; - int trying = IPAA_MAX_TRIES; - int res; - - /* The capacity of addresses, in elements. */ - size_t addressesSize; - /* The number of elements in addresses. */ - size_t addressesIndex = 0; - /* The addresses we will sort. */ - Address *addresses; - - union { - struct sockaddr *sa; - struct sockaddr_in *sa4; - struct sockaddr_in6 *sa6; - } namesrvr; - - *outptr = NULL; - - ipaa = ares_malloc(Bufsz); - if (!ipaa) - return 0; - - /* Start with enough room for a few DNS server addresses and we'll grow it - * as we encounter more. - */ - addressesSize = 4; - addresses = (Address*)ares_malloc(sizeof(Address) * addressesSize); - if(addresses == NULL) { - /* We need room for at least some addresses to function. */ - ares_free(ipaa); - return 0; - } - - /* Usually this call suceeds with initial buffer size */ - res = GetAdaptersAddresses(AF_UNSPEC, AddrFlags, NULL, ipaa, &ReqBufsz); - if ((res != ERROR_BUFFER_OVERFLOW) && (res != ERROR_SUCCESS)) - goto done; - - while ((res == ERROR_BUFFER_OVERFLOW) && (--trying)) - { - if (Bufsz < ReqBufsz) - { - newipaa = ares_realloc(ipaa, ReqBufsz); - if (!newipaa) - goto done; - Bufsz = ReqBufsz; - ipaa = newipaa; - } - res = GetAdaptersAddresses(AF_UNSPEC, AddrFlags, NULL, ipaa, &ReqBufsz); - if (res == ERROR_SUCCESS) - break; - } - if (res != ERROR_SUCCESS) - goto done; - - for (ipaaEntry = ipaa; ipaaEntry; ipaaEntry = ipaaEntry->Next) - { - if(ipaaEntry->OperStatus != IfOperStatusUp) - continue; - - /* For each interface, find any associated DNS servers as IPv4 or IPv6 - * addresses. For each found address, find the best route to that DNS - * server address _on_ _that_ _interface_ (at this moment in time) and - * compute the resulting total metric, just as Windows routing will do. - * Then, sort all the addresses found by the metric. - */ - for (ipaDNSAddr = ipaaEntry->FirstDnsServerAddress; - ipaDNSAddr; - ipaDNSAddr = ipaDNSAddr->Next) - { - namesrvr.sa = ipaDNSAddr->Address.lpSockaddr; - - if (namesrvr.sa->sa_family == AF_INET) - { - if ((namesrvr.sa4->sin_addr.S_un.S_addr == INADDR_ANY) || - (namesrvr.sa4->sin_addr.S_un.S_addr == INADDR_NONE)) - continue; - - /* Allocate room for another address, if necessary, else skip. */ - if(addressesIndex == addressesSize) { - const size_t newSize = addressesSize + 4; - Address * const newMem = - (Address*)ares_realloc(addresses, sizeof(Address) * newSize); - if(newMem == NULL) { - continue; - } - addresses = newMem; - addressesSize = newSize; - } - - addresses[addressesIndex].metric = - getBestRouteMetric(&ipaaEntry->Luid, - (SOCKADDR_INET*)(namesrvr.sa), - ipaaEntry->Ipv4Metric); - - /* Record insertion index to make qsort stable */ - addresses[addressesIndex].orig_idx = addressesIndex; - - if (!ares_inet_ntop(AF_INET, &namesrvr.sa4->sin_addr, - addresses[addressesIndex].text, - sizeof(addresses[0].text))) { - continue; - } - ++addressesIndex; - } - else if (namesrvr.sa->sa_family == AF_INET6) - { - if (memcmp(&namesrvr.sa6->sin6_addr, &ares_in6addr_any, - sizeof(namesrvr.sa6->sin6_addr)) == 0) - continue; - - /* Allocate room for another address, if necessary, else skip. */ - if(addressesIndex == addressesSize) { - const size_t newSize = addressesSize + 4; - Address * const newMem = - (Address*)ares_realloc(addresses, sizeof(Address) * newSize); - if(newMem == NULL) { - continue; - } - addresses = newMem; - addressesSize = newSize; - } - - addresses[addressesIndex].metric = - getBestRouteMetric(&ipaaEntry->Luid, - (SOCKADDR_INET*)(namesrvr.sa), - ipaaEntry->Ipv6Metric); - - /* Record insertion index to make qsort stable */ - addresses[addressesIndex].orig_idx = addressesIndex; - - if (!ares_inet_ntop(AF_INET6, &namesrvr.sa6->sin6_addr, - addresses[addressesIndex].text, - sizeof(addresses[0].text))) { - continue; - } - ++addressesIndex; - } - else { - /* Skip non-IPv4/IPv6 addresses completely. */ - continue; - } - } - } - - /* Sort all of the textual addresses by their metric (and original index if - * metrics are equal). */ - qsort(addresses, addressesIndex, sizeof(*addresses), compareAddresses); - - /* Join them all into a single string, removing duplicates. */ - { - size_t i; - for(i = 0; i < addressesIndex; ++i) { - size_t j; - /* Look for this address text appearing previously in the results. */ - for(j = 0; j < i; ++j) { - if(strcmp(addresses[j].text, addresses[i].text) == 0) { - break; - } - } - /* Iff we didn't emit this address already, emit it now. */ - if(j == i) { - /* Add that to outptr (if we can). */ - commajoin(outptr, addresses[i].text); - } - } - } - -done: - ares_free(addresses); - - if (ipaa) - ares_free(ipaa); - - if (!*outptr) { - return 0; - } - - return 1; -} - -/* - * get_SuffixList_Windows() - * - * Reads the "DNS Suffix Search List" from registry and writes the list items - * whitespace separated to outptr. If the Search List is empty, the - * "Primary Dns Suffix" is written to outptr. - * - * Returns 0 and nullifies *outptr upon inability to return the suffix list. - * - * Returns 1 and sets *outptr when returning a dynamically allocated string. - * - * Implementation supports Windows Server 2003 and newer - */ -static int get_SuffixList_Windows(char **outptr) -{ - HKEY hKey, hKeyEnum; - char keyName[256]; - DWORD keyNameBuffSize; - DWORD keyIdx = 0; - char *p = NULL; - - *outptr = NULL; - - if (ares__getplatform() != WIN_NT) - return 0; - - /* 1. Global DNS Suffix Search List */ - if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, WIN_NS_NT_KEY, 0, - KEY_READ, &hKey) == ERROR_SUCCESS) - { - get_REG_SZ(hKey, SEARCHLIST_KEY, outptr); - if (get_REG_SZ(hKey, DOMAIN_KEY, &p)) - { - commajoin(outptr, p); - ares_free(p); - p = NULL; - } - RegCloseKey(hKey); - } - - if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, WIN_NT_DNSCLIENT, 0, - KEY_READ, &hKey) == ERROR_SUCCESS) - { - if (get_REG_SZ(hKey, SEARCHLIST_KEY, &p)) - { - commajoin(outptr, p); - ares_free(p); - p = NULL; - } - RegCloseKey(hKey); - } - - /* 2. Connection Specific Search List composed of: - * a. Primary DNS Suffix */ - if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, WIN_DNSCLIENT, 0, - KEY_READ, &hKey) == ERROR_SUCCESS) - { - if (get_REG_SZ(hKey, PRIMARYDNSSUFFIX_KEY, &p)) - { - commajoin(outptr, p); - ares_free(p); - p = NULL; - } - RegCloseKey(hKey); - } - - /* b. Interface SearchList, Domain, DhcpDomain */ - if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, WIN_NS_NT_KEY "\\" INTERFACES_KEY, 0, - KEY_READ, &hKey) == ERROR_SUCCESS) - { - for(;;) - { - keyNameBuffSize = sizeof(keyName); - if (RegEnumKeyExA(hKey, keyIdx++, keyName, &keyNameBuffSize, - 0, NULL, NULL, NULL) - != ERROR_SUCCESS) - break; - if (RegOpenKeyExA(hKey, keyName, 0, KEY_QUERY_VALUE, &hKeyEnum) - != ERROR_SUCCESS) - continue; - /* p can be comma separated (SearchList) */ - if (get_REG_SZ(hKeyEnum, SEARCHLIST_KEY, &p)) - { - commajoin(outptr, p); - ares_free(p); - p = NULL; - } - if (get_REG_SZ(hKeyEnum, DOMAIN_KEY, &p)) - { - commajoin(outptr, p); - ares_free(p); - p = NULL; - } - if (get_REG_SZ(hKeyEnum, DHCPDOMAIN_KEY, &p)) - { - commajoin(outptr, p); - ares_free(p); - p = NULL; - } - RegCloseKey(hKeyEnum); - } - RegCloseKey(hKey); - } - - return *outptr != NULL; -} - -#endif - -static int init_by_resolv_conf(ares_channel channel) -{ -#if !defined(ANDROID) && !defined(__ANDROID__) && !defined(WATT32) && \ - !defined(CARES_USE_LIBRESOLV) - char *line = NULL; -#endif - int status = -1, nservers = 0, nsort = 0; - struct server_state *servers = NULL; - struct apattern *sortlist = NULL; - -#ifdef WIN32 - - if (channel->nservers > -1) /* don't override ARES_OPT_SERVER */ - return ARES_SUCCESS; - - if (get_DNS_Windows(&line)) - { - status = config_nameserver(&servers, &nservers, line); - ares_free(line); - } - - if (channel->ndomains == -1 && get_SuffixList_Windows(&line)) - { - status = set_search(channel, line); - ares_free(line); - } - - if (status == ARES_SUCCESS) - status = ARES_EOF; - else - /* Catch the case when all the above checks fail (which happens when there - is no network card or the cable is unplugged) */ - status = ARES_EFILE; -#elif defined(__MVS__) - - struct __res_state *res = 0; - int count4, count6; - __STATEEXTIPV6 *v6; - struct server_state *pserver; - if (0 == res) { - int rc = res_init(); - while (rc == -1 && h_errno == TRY_AGAIN) { - rc = res_init(); - } - if (rc == -1) { - return ARES_ENOMEM; - } - res = __res(); - } - - v6 = res->__res_extIPv6; - count4 = res->nscount; - if (v6) { - count6 = v6->__stat_nscount; - } else { - count6 = 0; - } - - nservers = count4 + count6; - servers = ares_malloc(nservers * sizeof(struct server_state)); - if (!servers) - return ARES_ENOMEM; - - memset(servers, 0, nservers * sizeof(struct server_state)); - - pserver = servers; - for (int i = 0; i < count4; ++i, ++pserver) { - struct sockaddr_in *addr_in = &(res->nsaddr_list[i]); - pserver->addr.addrV4.s_addr = addr_in->sin_addr.s_addr; - pserver->addr.family = AF_INET; - pserver->addr.udp_port = addr_in->sin_port; - pserver->addr.tcp_port = addr_in->sin_port; - } - - for (int j = 0; j < count6; ++j, ++pserver) { - struct sockaddr_in6 *addr_in = &(v6->__stat_nsaddr_list[j]); - memcpy(&(pserver->addr.addr.addr6), &(addr_in->sin6_addr), - sizeof(addr_in->sin6_addr)); - pserver->addr.family = AF_INET6; - pserver->addr.udp_port = addr_in->sin6_port; - pserver->addr.tcp_port = addr_in->sin6_port; - } - - status = ARES_EOF; - -#elif defined(__riscos__) - - /* Under RISC OS, name servers are listed in the - system variable Inet$Resolvers, space separated. */ - - line = getenv("Inet$Resolvers"); - status = ARES_EOF; - if (line) { - char *resolvers = ares_strdup(line), *pos, *space; - - if (!resolvers) - return ARES_ENOMEM; - - pos = resolvers; - do { - space = strchr(pos, ' '); - if (space) - *space = '\0'; - status = config_nameserver(&servers, &nservers, pos); - if (status != ARES_SUCCESS) - break; - pos = space + 1; - } while (space); - - if (status == ARES_SUCCESS) - status = ARES_EOF; - - ares_free(resolvers); - } - -#elif defined(WATT32) - int i; - - sock_init(); - for (i = 0; def_nameservers[i]; i++) - ; - if (i == 0) - return ARES_SUCCESS; /* use localhost DNS server */ - - nservers = i; - servers = ares_malloc(sizeof(struct server_state)); - if (!servers) - return ARES_ENOMEM; - memset(servers, 0, sizeof(struct server_state)); - - for (i = 0; def_nameservers[i]; i++) - { - servers[i].addr.addrV4.s_addr = htonl(def_nameservers[i]); - servers[i].addr.family = AF_INET; - servers[i].addr.udp_port = 0; - servers[i].addr.tcp_port = 0; - } - status = ARES_EOF; - -#elif defined(ANDROID) || defined(__ANDROID__) - unsigned int i; - char **dns_servers; - char *domains; - size_t num_servers; - - /* Use the Android connectivity manager to get a list - * of DNS servers. As of Android 8 (Oreo) net.dns# - * system properties are no longer available. Google claims this - * improves privacy. Apps now need the ACCESS_NETWORK_STATE - * permission and must use the ConnectivityManager which - * is Java only. */ - dns_servers = ares_get_android_server_list(MAX_DNS_PROPERTIES, &num_servers); - if (dns_servers != NULL) - { - for (i = 0; i < num_servers; i++) - { - status = config_nameserver(&servers, &nservers, dns_servers[i]); - if (status != ARES_SUCCESS) - break; - status = ARES_EOF; - } - for (i = 0; i < num_servers; i++) - { - ares_free(dns_servers[i]); - } - ares_free(dns_servers); - } - if (channel->ndomains == -1) - { - domains = ares_get_android_search_domains_list(); - set_search(channel, domains); - ares_free(domains); - } - -# ifdef HAVE___SYSTEM_PROPERTY_GET - /* Old way using the system property still in place as - * a fallback. Older android versions can still use this. - * it's possible for older apps not not have added the new - * permission and we want to try to avoid breaking those. - * - * We'll only run this if we don't have any dns servers - * because this will get the same ones (if it works). */ - if (status != ARES_EOF) { - char propname[PROP_NAME_MAX]; - char propvalue[PROP_VALUE_MAX]=""; - for (i = 1; i <= MAX_DNS_PROPERTIES; i++) { - snprintf(propname, sizeof(propname), "%s%u", DNS_PROP_NAME_PREFIX, i); - if (__system_property_get(propname, propvalue) < 1) { - status = ARES_EOF; - break; - } - - status = config_nameserver(&servers, &nservers, propvalue); - if (status != ARES_SUCCESS) - break; - status = ARES_EOF; - } - } -# endif /* HAVE___SYSTEM_PROPERTY_GET */ -#elif defined(CARES_USE_LIBRESOLV) - struct __res_state res; - memset(&res, 0, sizeof(res)); - int result = res_ninit(&res); - if (result == 0 && (res.options & RES_INIT)) { - status = ARES_EOF; - - if (channel->nservers == -1) { - union res_sockaddr_union addr[MAXNS]; - int nscount = res_getservers(&res, addr, MAXNS); - int i; - for (i = 0; i < nscount; ++i) { - char str[INET6_ADDRSTRLEN]; - int config_status; - sa_family_t family = addr[i].sin.sin_family; - if (family == AF_INET) { - ares_inet_ntop(family, &addr[i].sin.sin_addr, str, sizeof(str)); - } else if (family == AF_INET6) { - ares_inet_ntop(family, &addr[i].sin6.sin6_addr, str, sizeof(str)); - } else { - continue; - } - - config_status = config_nameserver(&servers, &nservers, str); - if (config_status != ARES_SUCCESS) { - status = config_status; - break; - } - } - } - if (channel->ndomains == -1) { - int entries = 0; - while ((entries < MAXDNSRCH) && res.dnsrch[entries]) - entries++; - if(entries) { - channel->domains = ares_malloc(entries * sizeof(char *)); - if (!channel->domains) { - status = ARES_ENOMEM; - } else { - int i; - channel->ndomains = entries; - for (i = 0; i < channel->ndomains; ++i) { - channel->domains[i] = ares_strdup(res.dnsrch[i]); - if (!channel->domains[i]) - status = ARES_ENOMEM; - } - } - } - } - if (channel->ndots == -1) - channel->ndots = res.ndots; - if (channel->tries == -1) - channel->tries = res.retry; - if (channel->rotate == -1) - channel->rotate = res.options & RES_ROTATE; - if (channel->timeout == -1) { - channel->timeout = res.retrans * 1000; -#ifdef __APPLE__ - channel->timeout /= (res.retry + 1) * (res.nscount > 0 ? res.nscount : 1); -#endif - } - - res_ndestroy(&res); - } -#else - { - char *p; - FILE *fp; - size_t linesize; - int error; - int update_domains; - const char *resolvconf_path; - - /* Don't read resolv.conf and friends if we don't have to */ - if (ARES_CONFIG_CHECK(channel)) - return ARES_SUCCESS; - - /* Only update search domains if they're not already specified */ - update_domains = (channel->ndomains == -1); - - /* Support path for resolvconf filename set by ares_init_options */ - if(channel->resolvconf_path) { - resolvconf_path = channel->resolvconf_path; - } else { - resolvconf_path = PATH_RESOLV_CONF; - } - - fp = fopen(resolvconf_path, "r"); - if (fp) { - while ((status = ares__read_line(fp, &line, &linesize)) == ARES_SUCCESS) - { - if ((p = try_config(line, "domain", ';')) && update_domains) - status = config_domain(channel, p); - else if ((p = try_config(line, "lookup", ';')) && !channel->lookups) - status = config_lookup(channel, p, "bind", NULL, "file"); - else if ((p = try_config(line, "search", ';')) && update_domains) - status = set_search(channel, p); - else if ((p = try_config(line, "nameserver", ';')) && - channel->nservers == -1) - status = config_nameserver(&servers, &nservers, p); - else if ((p = try_config(line, "sortlist", ';')) && - channel->nsort == -1) - status = config_sortlist(&sortlist, &nsort, p); - else if ((p = try_config(line, "options", ';'))) - status = set_options(channel, p); - else - status = ARES_SUCCESS; - if (status != ARES_SUCCESS) - break; - } - fclose(fp); - } - else { - error = ERRNO; - switch(error) { - case ENOENT: - case ESRCH: - status = ARES_EOF; - break; - default: - DEBUGF(fprintf(stderr, "fopen() failed with error: %d %s\n", - error, strerror(error))); - DEBUGF(fprintf(stderr, "Error opening file: %s\n", PATH_RESOLV_CONF)); - status = ARES_EFILE; - } - } - - if ((status == ARES_EOF) && (!channel->lookups)) { - /* Many systems (Solaris, Linux, BSD's) use nsswitch.conf */ - fp = fopen("/etc/nsswitch.conf", "r"); - if (fp) { - while ((status = ares__read_line(fp, &line, &linesize)) == - ARES_SUCCESS) - { - if ((p = try_config(line, "hosts:", '\0')) && !channel->lookups) - (void)config_lookup(channel, p, "dns", "resolve", "files"); - } - fclose(fp); - } - else { - error = ERRNO; - switch(error) { - case ENOENT: - case ESRCH: - break; - default: - DEBUGF(fprintf(stderr, "fopen() failed with error: %d %s\n", - error, strerror(error))); - DEBUGF(fprintf(stderr, "Error opening file: %s\n", - "/etc/nsswitch.conf")); - } - - /* ignore error, maybe we will get luck in next if clause */ - status = ARES_EOF; - } - } - - if ((status == ARES_EOF) && (!channel->lookups)) { - /* Linux / GNU libc 2.x and possibly others have host.conf */ - fp = fopen("/etc/host.conf", "r"); - if (fp) { - while ((status = ares__read_line(fp, &line, &linesize)) == - ARES_SUCCESS) - { - if ((p = try_config(line, "order", '\0')) && !channel->lookups) - /* ignore errors */ - (void)config_lookup(channel, p, "bind", NULL, "hosts"); - } - fclose(fp); - } - else { - error = ERRNO; - switch(error) { - case ENOENT: - case ESRCH: - break; - default: - DEBUGF(fprintf(stderr, "fopen() failed with error: %d %s\n", - error, strerror(error))); - DEBUGF(fprintf(stderr, "Error opening file: %s\n", - "/etc/host.conf")); - } - - /* ignore error, maybe we will get luck in next if clause */ - status = ARES_EOF; - } - } - - if ((status == ARES_EOF) && (!channel->lookups)) { - /* Tru64 uses /etc/svc.conf */ - fp = fopen("/etc/svc.conf", "r"); - if (fp) { - while ((status = ares__read_line(fp, &line, &linesize)) == - ARES_SUCCESS) - { - if ((p = try_config(line, "hosts=", '\0')) && !channel->lookups) - /* ignore errors */ - (void)config_lookup(channel, p, "bind", NULL, "local"); - } - fclose(fp); - } - else { - error = ERRNO; - switch(error) { - case ENOENT: - case ESRCH: - break; - default: - DEBUGF(fprintf(stderr, "fopen() failed with error: %d %s\n", - error, strerror(error))); - DEBUGF(fprintf(stderr, "Error opening file: %s\n", "/etc/svc.conf")); - } - - /* ignore error, default value will be chosen for `channel->lookups` */ - status = ARES_EOF; - } - } - - if(line) - ares_free(line); - } - -#endif - - /* Handle errors. */ - if (status != ARES_EOF) - { - if (servers != NULL) - ares_free(servers); - if (sortlist != NULL) - ares_free(sortlist); - return status; - } - - /* If we got any name server entries, fill them in. */ - if (servers) - { - channel->servers = servers; - channel->nservers = nservers; - } - - /* If we got any sortlist entries, fill them in. */ - if (sortlist) - { - channel->sortlist = sortlist; - channel->nsort = nsort; - } - - return ARES_SUCCESS; -} - -static int init_by_defaults(ares_channel channel) -{ - char *hostname = NULL; - int rc = ARES_SUCCESS; -#ifdef HAVE_GETHOSTNAME - char *dot; -#endif - - if (channel->flags == -1) - channel->flags = 0; - if (channel->timeout == -1) - channel->timeout = DEFAULT_TIMEOUT; - if (channel->tries == -1) - channel->tries = DEFAULT_TRIES; - if (channel->ndots == -1) - channel->ndots = 1; - if (channel->rotate == -1) - channel->rotate = 0; - if (channel->udp_port == -1) - channel->udp_port = htons(NAMESERVER_PORT); - if (channel->tcp_port == -1) - channel->tcp_port = htons(NAMESERVER_PORT); - - if (channel->ednspsz == -1) - channel->ednspsz = EDNSPACKETSZ; - - if (channel->nservers == -1) { - /* If nobody specified servers, try a local named. */ - channel->servers = ares_malloc(sizeof(struct server_state)); - if (!channel->servers) { - rc = ARES_ENOMEM; - goto error; - } - channel->servers[0].addr.family = AF_INET; - channel->servers[0].addr.addrV4.s_addr = htonl(INADDR_LOOPBACK); - channel->servers[0].addr.udp_port = 0; - channel->servers[0].addr.tcp_port = 0; - channel->nservers = 1; - } - -#if defined(USE_WINSOCK) -#define toolong(x) (x == -1) && (SOCKERRNO == WSAEFAULT) -#elif defined(ENAMETOOLONG) -#define toolong(x) (x == -1) && ((SOCKERRNO == ENAMETOOLONG) || \ - (SOCKERRNO == EINVAL)) -#else -#define toolong(x) (x == -1) && (SOCKERRNO == EINVAL) -#endif - - if (channel->ndomains == -1) { - /* Derive a default domain search list from the kernel hostname, - * or set it to empty if the hostname isn't helpful. - */ -#ifndef HAVE_GETHOSTNAME - channel->ndomains = 0; /* default to none */ -#else - GETHOSTNAME_TYPE_ARG2 lenv = 64; - size_t len = 64; - int res; - channel->ndomains = 0; /* default to none */ - - hostname = ares_malloc(len); - if(!hostname) { - rc = ARES_ENOMEM; - goto error; - } - - do { - res = gethostname(hostname, lenv); - - if(toolong(res)) { - char *p; - len *= 2; - lenv *= 2; - p = ares_realloc(hostname, len); - if(!p) { - rc = ARES_ENOMEM; - goto error; - } - hostname = p; - continue; - } - else if(res) { - /* Lets not treat a gethostname failure as critical, since we - * are ok if gethostname doesn't even exist */ - *hostname = '\0'; - break; - } - - } while (res != 0); - - dot = strchr(hostname, '.'); - if (dot) { - /* a dot was found */ - channel->domains = ares_malloc(sizeof(char *)); - if (!channel->domains) { - rc = ARES_ENOMEM; - goto error; - } - channel->domains[0] = ares_strdup(dot + 1); - if (!channel->domains[0]) { - rc = ARES_ENOMEM; - goto error; - } - channel->ndomains = 1; - } -#endif - } - - if (channel->nsort == -1) { - channel->sortlist = NULL; - channel->nsort = 0; - } - - if (!channel->lookups) { - channel->lookups = ares_strdup("fb"); - if (!channel->lookups) - rc = ARES_ENOMEM; - } - - error: - if(rc) { - if(channel->servers) { - ares_free(channel->servers); - channel->servers = NULL; - } - - if(channel->domains && channel->domains[0]) - ares_free(channel->domains[0]); - if(channel->domains) { - ares_free(channel->domains); - channel->domains = NULL; - } - - if(channel->lookups) { - ares_free(channel->lookups); - channel->lookups = NULL; - } - - if(channel->resolvconf_path) { - ares_free(channel->resolvconf_path); - channel->resolvconf_path = NULL; - } - - if(channel->hosts_path) { - ares_free(channel->hosts_path); - channel->hosts_path = NULL; - } - } - - if(hostname) - ares_free(hostname); - - return rc; -} - -#if !defined(WIN32) && !defined(WATT32) && \ - !defined(ANDROID) && !defined(__ANDROID__) && !defined(CARES_USE_LIBRESOLV) -static int config_domain(ares_channel channel, char *str) -{ - char *q; - - /* Set a single search domain. */ - q = str; - while (*q && !ISSPACE(*q)) - q++; - *q = '\0'; - return set_search(channel, str); -} - -#if defined(__INTEL_COMPILER) && (__INTEL_COMPILER == 910) && \ - defined(__OPTIMIZE__) && defined(__unix__) && defined(__i386__) - /* workaround icc 9.1 optimizer issue */ -# define vqualifier volatile -#else -# define vqualifier -#endif - -static int config_lookup(ares_channel channel, const char *str, - const char *bindch, const char *altbindch, - const char *filech) -{ - char lookups[3], *l; - const char *vqualifier p; - int found; - - if (altbindch == NULL) - altbindch = bindch; - - /* Set the lookup order. Only the first letter of each work - * is relevant, and it has to be "b" for DNS or "f" for the - * host file. Ignore everything else. - */ - l = lookups; - p = str; - found = 0; - while (*p) - { - if ((*p == *bindch || *p == *altbindch || *p == *filech) && l < lookups + 2) { - if (*p == *bindch || *p == *altbindch) *l++ = 'b'; - else *l++ = 'f'; - found = 1; - } - while (*p && !ISSPACE(*p) && (*p != ',')) - p++; - while (*p && (ISSPACE(*p) || (*p == ','))) - p++; - } - if (!found) - return ARES_ENOTINITIALIZED; - *l = '\0'; - channel->lookups = ares_strdup(lookups); - return (channel->lookups) ? ARES_SUCCESS : ARES_ENOMEM; -} -#endif /* !WIN32 & !WATT32 & !ANDROID & !__ANDROID__ & !CARES_USE_LIBRESOLV */ - -#ifndef WATT32 -/* Validate that the ip address matches the subnet (network base and network - * mask) specified. Addresses are specified in standard Network Byte Order as - * 16 bytes, and the netmask is 0 to 128 (bits). - */ -static int ares_ipv6_subnet_matches(const unsigned char netbase[16], - unsigned char netmask, - const unsigned char ipaddr[16]) -{ - unsigned char mask[16] = { 0 }; - unsigned char i; - - /* Misuse */ - if (netmask > 128) - return 0; - - /* Quickly set whole bytes */ - memset(mask, 0xFF, netmask / 8); - - /* Set remaining bits */ - if(netmask % 8) { - mask[netmask / 8] = (unsigned char)(0xff << (8 - (netmask % 8))); - } - - for (i=0; i<16; i++) { - if ((netbase[i] & mask[i]) != (ipaddr[i] & mask[i])) - return 0; - } - - return 1; -} - -/* Return true iff the IPv6 ipaddr is blacklisted. */ -static int ares_ipv6_server_blacklisted(const unsigned char ipaddr[16]) -{ - /* A list of blacklisted IPv6 subnets. */ - const struct { - const unsigned char netbase[16]; - unsigned char netmask; - } blacklist[] = { - /* fec0::/10 was deprecated by [RFC3879] in September 2004. Formerly a - * Site-Local scoped address prefix. These are never valid DNS servers, - * but are known to be returned at least sometimes on Windows and Android. - */ - { - { - 0xfe, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, - 10 - } - }; - size_t i; - - /* See if ipaddr matches any of the entries in the blacklist. */ - for (i = 0; i < sizeof(blacklist) / sizeof(blacklist[0]); ++i) { - if (ares_ipv6_subnet_matches( - blacklist[i].netbase, blacklist[i].netmask, ipaddr)) - return 1; - } - return 0; -} - -/* Add the IPv4 or IPv6 nameservers in str (separated by commas) to the - * servers list, updating servers and nservers as required. - * - * This will silently ignore blacklisted IPv6 nameservers as detected by - * ares_ipv6_server_blacklisted(). - * - * Returns an error code on failure, else ARES_SUCCESS. - */ -static int config_nameserver(struct server_state **servers, int *nservers, - char *str) -{ - struct ares_addr host; - struct server_state *newserv; - char *p, *txtaddr; - /* On Windows, there may be more than one nameserver specified in the same - * registry key, so we parse input as a space or comma seperated list. - */ - for (p = str; p;) - { - /* Skip whitespace and commas. */ - while (*p && (ISSPACE(*p) || (*p == ','))) - p++; - if (!*p) - /* No more input, done. */ - break; - - /* Pointer to start of IPv4 or IPv6 address part. */ - txtaddr = p; - - /* Advance past this address. */ - while (*p && !ISSPACE(*p) && (*p != ',')) - p++; - if (*p) - /* Null terminate this address. */ - *p++ = '\0'; - else - /* Reached end of input, done when this address is processed. */ - p = NULL; - - /* Convert textual address to binary format. */ - if (ares_inet_pton(AF_INET, txtaddr, &host.addrV4) == 1) - host.family = AF_INET; - else if (ares_inet_pton(AF_INET6, txtaddr, &host.addrV6) == 1 - /* Silently skip blacklisted IPv6 servers. */ - && !ares_ipv6_server_blacklisted( - (const unsigned char *)&host.addrV6)) - host.family = AF_INET6; - else - continue; - - /* Resize servers state array. */ - newserv = ares_realloc(*servers, (*nservers + 1) * - sizeof(struct server_state)); - if (!newserv) - return ARES_ENOMEM; - - /* Store address data. */ - newserv[*nservers].addr.family = host.family; - newserv[*nservers].addr.udp_port = 0; - newserv[*nservers].addr.tcp_port = 0; - if (host.family == AF_INET) - memcpy(&newserv[*nservers].addr.addrV4, &host.addrV4, - sizeof(host.addrV4)); - else - memcpy(&newserv[*nservers].addr.addrV6, &host.addrV6, - sizeof(host.addrV6)); - - /* Update arguments. */ - *servers = newserv; - *nservers += 1; - } - - return ARES_SUCCESS; -} -#endif /* !WATT32 */ - -static int config_sortlist(struct apattern **sortlist, int *nsort, - const char *str) -{ - struct apattern pat; - const char *q; - - /* Add sortlist entries. */ - while (*str && *str != ';') - { - int bits; - char ipbuf[16], ipbufpfx[32]; - /* Find just the IP */ - q = str; - while (*q && *q != '/' && *q != ';' && !ISSPACE(*q)) - q++; - if (q-str >= 16) - return ARES_EBADSTR; - memcpy(ipbuf, str, q-str); - ipbuf[q-str] = '\0'; - /* Find the prefix */ - if (*q == '/') - { - const char *str2 = q+1; - while (*q && *q != ';' && !ISSPACE(*q)) - q++; - if (q-str >= 32) - return ARES_EBADSTR; - memcpy(ipbufpfx, str, q-str); - ipbufpfx[q-str] = '\0'; - str = str2; - } - else - ipbufpfx[0] = '\0'; - /* Lets see if it is CIDR */ - /* First we'll try IPv6 */ - if ((bits = ares_inet_net_pton(AF_INET6, ipbufpfx[0] ? ipbufpfx : ipbuf, - &pat.addrV6, - sizeof(pat.addrV6))) > 0) - { - pat.type = PATTERN_CIDR; - pat.mask.bits = (unsigned short)bits; - pat.family = AF_INET6; - if (!sortlist_alloc(sortlist, nsort, &pat)) { - ares_free(*sortlist); - *sortlist = NULL; - return ARES_ENOMEM; - } - } - else if (ipbufpfx[0] && - (bits = ares_inet_net_pton(AF_INET, ipbufpfx, &pat.addrV4, - sizeof(pat.addrV4))) > 0) - { - pat.type = PATTERN_CIDR; - pat.mask.bits = (unsigned short)bits; - pat.family = AF_INET; - if (!sortlist_alloc(sortlist, nsort, &pat)) { - ares_free(*sortlist); - *sortlist = NULL; - return ARES_ENOMEM; - } - } - /* See if it is just a regular IP */ - else if (ip_addr(ipbuf, q-str, &pat.addrV4) == 0) - { - if (ipbufpfx[0]) - { - memcpy(ipbuf, str, q-str); - ipbuf[q-str] = '\0'; - if (ip_addr(ipbuf, q-str, &pat.mask.addr4) != 0) - natural_mask(&pat); - } - else - natural_mask(&pat); - pat.family = AF_INET; - pat.type = PATTERN_MASK; - if (!sortlist_alloc(sortlist, nsort, &pat)) { - ares_free(*sortlist); - *sortlist = NULL; - return ARES_ENOMEM; - } - } - else - { - while (*q && *q != ';' && !ISSPACE(*q)) - q++; - } - str = q; - while (ISSPACE(*str)) - str++; - } - - return ARES_SUCCESS; -} - -static int set_search(ares_channel channel, const char *str) -{ - size_t cnt; - - if(channel->ndomains != -1) { - /* LCOV_EXCL_START: all callers check ndomains == -1 */ - /* if we already have some domains present, free them first */ - ares__strsplit_free(channel->domains, channel->ndomains); - channel->domains = NULL; - channel->ndomains = -1; - } /* LCOV_EXCL_STOP */ - - channel->domains = ares__strsplit(str, ", ", &cnt); - channel->ndomains = (int)cnt; - if (channel->domains == NULL || channel->ndomains == 0) { - channel->domains = NULL; - channel->ndomains = -1; - } - - return ARES_SUCCESS; -} - -static int set_options(ares_channel channel, const char *str) -{ - const char *p, *q, *val; - - p = str; - while (*p) - { - q = p; - while (*q && !ISSPACE(*q)) - q++; - val = try_option(p, q, "ndots:"); - if (val && channel->ndots == -1) - channel->ndots = aresx_sltosi(strtol(val, NULL, 10)); - val = try_option(p, q, "retrans:"); - if (val && channel->timeout == -1) - channel->timeout = aresx_sltosi(strtol(val, NULL, 10)); - val = try_option(p, q, "retry:"); - if (val && channel->tries == -1) - channel->tries = aresx_sltosi(strtol(val, NULL, 10)); - val = try_option(p, q, "rotate"); - if (val && channel->rotate == -1) - channel->rotate = 1; - p = q; - while (ISSPACE(*p)) - p++; - } - - return ARES_SUCCESS; -} - -static const char *try_option(const char *p, const char *q, const char *opt) -{ - size_t len = strlen(opt); - return ((size_t)(q - p) >= len && !strncmp(p, opt, len)) ? &p[len] : NULL; -} - -#if !defined(WIN32) && !defined(WATT32) && \ - !defined(ANDROID) && !defined(__ANDROID__) && !defined(CARES_USE_LIBRESOLV) -static char *try_config(char *s, const char *opt, char scc) -{ - size_t len; - char *p; - char *q; - - if (!s || !opt) - /* no line or no option */ - return NULL; /* LCOV_EXCL_LINE */ - - /* Hash '#' character is always used as primary comment char, additionally - a not-NUL secondary comment char will be considered when specified. */ - - /* trim line comment */ - p = s; - if(scc) - while (*p && (*p != '#') && (*p != scc)) - p++; - else - while (*p && (*p != '#')) - p++; - *p = '\0'; - - /* trim trailing whitespace */ - q = p - 1; - while ((q >= s) && ISSPACE(*q)) - q--; - *++q = '\0'; - - /* skip leading whitespace */ - p = s; - while (*p && ISSPACE(*p)) - p++; - - if (!*p) - /* empty line */ - return NULL; - - if ((len = strlen(opt)) == 0) - /* empty option */ - return NULL; /* LCOV_EXCL_LINE */ - - if (strncmp(p, opt, len) != 0) - /* line and option do not match */ - return NULL; - - /* skip over given option name */ - p += len; - - if (!*p) - /* no option value */ - return NULL; /* LCOV_EXCL_LINE */ - - if ((opt[len-1] != ':') && (opt[len-1] != '=') && !ISSPACE(*p)) - /* whitespace between option name and value is mandatory - for given option names which do not end with ':' or '=' */ - return NULL; - - /* skip over whitespace */ - while (*p && ISSPACE(*p)) - p++; - - if (!*p) - /* no option value */ - return NULL; - - /* return pointer to option value */ - return p; -} -#endif /* !WIN32 & !WATT32 & !ANDROID & !__ANDROID__ */ - -static int ip_addr(const char *ipbuf, ares_ssize_t len, struct in_addr *addr) -{ - - /* Four octets and three periods yields at most 15 characters. */ - if (len > 15) - return -1; - - if (ares_inet_pton(AF_INET, ipbuf, addr) < 1) - return -1; - - return 0; -} - -static void natural_mask(struct apattern *pat) -{ - struct in_addr addr; - - /* Store a host-byte-order copy of pat in a struct in_addr. Icky, - * but portable. - */ - addr.s_addr = ntohl(pat->addrV4.s_addr); - - /* This is out of date in the CIDR world, but some people might - * still rely on it. - */ - if (IN_CLASSA(addr.s_addr)) - pat->mask.addr4.s_addr = htonl(IN_CLASSA_NET); - else if (IN_CLASSB(addr.s_addr)) - pat->mask.addr4.s_addr = htonl(IN_CLASSB_NET); - else - pat->mask.addr4.s_addr = htonl(IN_CLASSC_NET); -} - -static int sortlist_alloc(struct apattern **sortlist, int *nsort, - struct apattern *pat) -{ - struct apattern *newsort; - newsort = ares_realloc(*sortlist, (*nsort + 1) * sizeof(struct apattern)); - if (!newsort) - return 0; - newsort[*nsort] = *pat; - *sortlist = newsort; - (*nsort)++; - return 1; -} - - -void ares_set_local_ip4(ares_channel channel, unsigned int local_ip) -{ - channel->local_ip4 = local_ip; -} - -/* local_ip6 should be 16 bytes in length */ -void ares_set_local_ip6(ares_channel channel, - const unsigned char* local_ip6) -{ - memcpy(&channel->local_ip6, local_ip6, sizeof(channel->local_ip6)); -} - -/* local_dev_name should be null terminated. */ -void ares_set_local_dev(ares_channel channel, - const char* local_dev_name) -{ - strncpy(channel->local_dev_name, local_dev_name, - sizeof(channel->local_dev_name)); - channel->local_dev_name[sizeof(channel->local_dev_name) - 1] = 0; -} - - -void ares_set_socket_callback(ares_channel channel, - ares_sock_create_callback cb, - void *data) -{ - channel->sock_create_cb = cb; - channel->sock_create_cb_data = data; -} - -void ares_set_socket_configure_callback(ares_channel channel, - ares_sock_config_callback cb, - void *data) -{ - channel->sock_config_cb = cb; - channel->sock_config_cb_data = data; -} - -void ares_set_socket_functions(ares_channel channel, - const struct ares_socket_functions * funcs, - void *data) -{ - channel->sock_funcs = funcs; - channel->sock_func_cb_data = data; -} - -int ares_set_sortlist(ares_channel channel, const char *sortstr) -{ - int nsort = 0; - struct apattern *sortlist = NULL; - int status; - - if (!channel) - return ARES_ENODATA; - - status = config_sortlist(&sortlist, &nsort, sortstr); - if (status == ARES_SUCCESS && sortlist) { - if (channel->sortlist) - ares_free(channel->sortlist); - channel->sortlist = sortlist; - channel->nsort = nsort; - } - return status; -} - -void ares__init_servers_state(ares_channel channel) -{ - struct server_state *server; - int i; - - for (i = 0; i < channel->nservers; i++) - { - server = &channel->servers[i]; - server->udp_socket = ARES_SOCKET_BAD; - server->tcp_socket = ARES_SOCKET_BAD; - server->tcp_connection_generation = ++channel->tcp_connection_generation; - server->tcp_lenbuf_pos = 0; - server->tcp_buffer_pos = 0; - server->tcp_buffer = NULL; - server->tcp_length = 0; - server->qhead = NULL; - server->qtail = NULL; - ares__init_list_head(&server->queries_to_server); - server->channel = channel; - server->is_broken = 0; - } -} diff --git a/lib/c-ares-1.19.1/src/lib/ares_iphlpapi.h b/lib/c-ares-1.19.1/src/lib/ares_iphlpapi.h deleted file mode 100644 index 343aee3ffbd..00000000000 --- a/lib/c-ares-1.19.1/src/lib/ares_iphlpapi.h +++ /dev/null @@ -1,221 +0,0 @@ -#ifndef HEADER_CARES_IPHLPAPI_H -#define HEADER_CARES_IPHLPAPI_H - -/* Copyright 1998 by the Massachusetts Institute of Technology. - * Copyright (C) 2004 - 2011 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. - */ - -#if defined(USE_WINSOCK) - -#ifndef INET_ADDRSTRLEN -#define INET_ADDRSTRLEN 22 -#endif - -#ifndef INET6_ADDRSTRLEN -#define INET6_ADDRSTRLEN 65 -#endif - -/* ---------------------------------- */ -#if !defined(_WS2DEF_) && \ - !defined(__CSADDR_DEFINED__) && \ - !defined(__CSADDR_T_DEFINED) -/* ---------------------------------- */ - -typedef struct _SOCKET_ADDRESS { - LPSOCKADDR lpSockaddr; - INT iSockaddrLength; -} SOCKET_ADDRESS, *PSOCKET_ADDRESS; - -typedef struct _CSADDR_INFO { - SOCKET_ADDRESS LocalAddr; - SOCKET_ADDRESS RemoteAddr; - INT iSocketType; - INT iProtocol; -} CSADDR_INFO, *PCSADDR_INFO; - -/* --------------------------------- */ -#endif /* ! _WS2DEF_ && \ */ -/* ! __CSADDR_DEFINED__ && \ */ -/* ! __CSADDR_T_DEFINED */ -/* --------------------------------- */ - -/* ------------------------------- */ -#if !defined(IP_ADAPTER_DDNS_ENABLED) -/* ------------------------------- */ - -#define IP_ADAPTER_ADDRESS_DNS_ELIGIBLE 0x0001 -#define IP_ADAPTER_ADDRESS_TRANSIENT 0x0002 - -#define IP_ADAPTER_DDNS_ENABLED 0x0001 -#define IP_ADAPTER_REGISTER_ADAPTER_SUFFIX 0x0002 -#define IP_ADAPTER_DHCP_ENABLED 0x0004 -#define IP_ADAPTER_RECEIVE_ONLY 0x0008 -#define IP_ADAPTER_NO_MULTICAST 0x0010 -#define IP_ADAPTER_IPV6_OTHER_STATEFUL_CONFIG 0x0020 - -#define GAA_FLAG_SKIP_UNICAST 0x0001 -#define GAA_FLAG_SKIP_ANYCAST 0x0002 -#define GAA_FLAG_SKIP_MULTICAST 0x0004 -#define GAA_FLAG_SKIP_DNS_SERVER 0x0008 -#define GAA_FLAG_INCLUDE_PREFIX 0x0010 -#define GAA_FLAG_SKIP_FRIENDLY_NAME 0x0020 - -typedef enum { - IpPrefixOriginOther = 0, - IpPrefixOriginManual, - IpPrefixOriginWellKnown, - IpPrefixOriginDhcp, - IpPrefixOriginRouterAdvertisement -} IP_PREFIX_ORIGIN; - -typedef enum { - IpSuffixOriginOther = 0, - IpSuffixOriginManual, - IpSuffixOriginWellKnown, - IpSuffixOriginDhcp, - IpSuffixOriginLinkLayerAddress, - IpSuffixOriginRandom -} IP_SUFFIX_ORIGIN; - -typedef enum { - IpDadStateInvalid = 0, - IpDadStateTentative, - IpDadStateDuplicate, - IpDadStateDeprecated, - IpDadStatePreferred -} IP_DAD_STATE; - -typedef enum { - IfOperStatusUp = 1, - IfOperStatusDown, - IfOperStatusTesting, - IfOperStatusUnknown, - IfOperStatusDormant, - IfOperStatusNotPresent, - IfOperStatusLowerLayerDown -} IF_OPER_STATUS; - -typedef enum { - ScopeLevelInterface = 0x0001, - ScopeLevelLink = 0x0002, - ScopeLevelSubnet = 0x0003, - ScopeLevelAdmin = 0x0004, - ScopeLevelSite = 0x0005, - ScopeLevelOrganization = 0x0008, - ScopeLevelGlobal = 0x000E -} SCOPE_LEVEL; - -typedef struct _IP_ADAPTER_UNICAST_ADDRESS { - union { - ULONGLONG Alignment; - struct { - ULONG Length; - DWORD Flags; - } s; - } u; - struct _IP_ADAPTER_UNICAST_ADDRESS *Next; - SOCKET_ADDRESS Address; - IP_PREFIX_ORIGIN PrefixOrigin; - IP_SUFFIX_ORIGIN SuffixOrigin; - IP_DAD_STATE DadState; - ULONG ValidLifetime; - ULONG PreferredLifetime; - ULONG LeaseLifetime; -} IP_ADAPTER_UNICAST_ADDRESS, *PIP_ADAPTER_UNICAST_ADDRESS; - -typedef struct _IP_ADAPTER_ANYCAST_ADDRESS { - union { - ULONGLONG Alignment; - struct { - ULONG Length; - DWORD Flags; - } s; - } u; - struct _IP_ADAPTER_ANYCAST_ADDRESS *Next; - SOCKET_ADDRESS Address; -} IP_ADAPTER_ANYCAST_ADDRESS, *PIP_ADAPTER_ANYCAST_ADDRESS; - -typedef struct _IP_ADAPTER_MULTICAST_ADDRESS { - union { - ULONGLONG Alignment; - struct { - ULONG Length; - DWORD Flags; - } s; - } u; - struct _IP_ADAPTER_MULTICAST_ADDRESS *Next; - SOCKET_ADDRESS Address; -} IP_ADAPTER_MULTICAST_ADDRESS, *PIP_ADAPTER_MULTICAST_ADDRESS; - -typedef struct _IP_ADAPTER_DNS_SERVER_ADDRESS { - union { - ULONGLONG Alignment; - struct { - ULONG Length; - DWORD Reserved; - } s; - } u; - struct _IP_ADAPTER_DNS_SERVER_ADDRESS *Next; - SOCKET_ADDRESS Address; -} IP_ADAPTER_DNS_SERVER_ADDRESS, *PIP_ADAPTER_DNS_SERVER_ADDRESS; - -typedef struct _IP_ADAPTER_PREFIX { - union { - ULONGLONG Alignment; - struct { - ULONG Length; - DWORD Flags; - } s; - } u; - struct _IP_ADAPTER_PREFIX *Next; - SOCKET_ADDRESS Address; - ULONG PrefixLength; -} IP_ADAPTER_PREFIX, *PIP_ADAPTER_PREFIX; - -typedef struct _IP_ADAPTER_ADDRESSES { - union { - ULONGLONG Alignment; - struct { - ULONG Length; - DWORD IfIndex; - } s; - } u; - struct _IP_ADAPTER_ADDRESSES *Next; - PCHAR AdapterName; - PIP_ADAPTER_UNICAST_ADDRESS FirstUnicastAddress; - PIP_ADAPTER_ANYCAST_ADDRESS FirstAnycastAddress; - PIP_ADAPTER_MULTICAST_ADDRESS FirstMulticastAddress; - PIP_ADAPTER_DNS_SERVER_ADDRESS FirstDnsServerAddress; - PWCHAR DnsSuffix; - PWCHAR Description; - PWCHAR FriendlyName; - BYTE PhysicalAddress[MAX_ADAPTER_ADDRESS_LENGTH]; - DWORD PhysicalAddressLength; - DWORD Flags; - DWORD Mtu; - DWORD IfType; - IF_OPER_STATUS OperStatus; - DWORD Ipv6IfIndex; - DWORD ZoneIndices[16]; - PIP_ADAPTER_PREFIX FirstPrefix; -} IP_ADAPTER_ADDRESSES, *PIP_ADAPTER_ADDRESSES; - -/* -------------------------------- */ -#endif /* ! IP_ADAPTER_DDNS_ENABLED */ -/* -------------------------------- */ - -#endif /* USE_WINSOCK */ - -#endif /* HEADER_CARES_IPHLPAPI_H */ diff --git a/lib/c-ares-1.19.1/src/lib/ares_ipv6.h b/lib/c-ares-1.19.1/src/lib/ares_ipv6.h deleted file mode 100644 index fdbc21fe8f9..00000000000 --- a/lib/c-ares-1.19.1/src/lib/ares_ipv6.h +++ /dev/null @@ -1,85 +0,0 @@ - -/* Copyright (C) 2005 by Dominick Meglio - * - * 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. - */ - -#ifndef ARES_IPV6_H -#define ARES_IPV6_H - -#ifndef HAVE_PF_INET6 -#define PF_INET6 AF_INET6 -#endif - -#ifndef HAVE_STRUCT_SOCKADDR_IN6 -struct sockaddr_in6 -{ - unsigned short sin6_family; - unsigned short sin6_port; - unsigned long sin6_flowinfo; - struct ares_in6_addr sin6_addr; - unsigned int sin6_scope_id; -}; -#endif - -typedef union -{ - struct sockaddr sa; - struct sockaddr_in sa4; - struct sockaddr_in6 sa6; -} ares_sockaddr; - -#ifndef HAVE_STRUCT_ADDRINFO -struct addrinfo -{ - int ai_flags; - int ai_family; - int ai_socktype; - int ai_protocol; - ares_socklen_t ai_addrlen; /* Follow rfc3493 struct addrinfo */ - char *ai_canonname; - struct sockaddr *ai_addr; - struct addrinfo *ai_next; -}; -#endif - -#ifndef NS_IN6ADDRSZ -#ifndef HAVE_STRUCT_IN6_ADDR -/* We cannot have it set to zero, so we pick a fixed value here */ -#define NS_IN6ADDRSZ 16 -#else -#define NS_IN6ADDRSZ sizeof(struct in6_addr) -#endif -#endif - -#ifndef NS_INADDRSZ -#define NS_INADDRSZ sizeof(struct in_addr) -#endif - -#ifndef NS_INT16SZ -#define NS_INT16SZ 2 -#endif - -#ifndef IF_NAMESIZE -#ifdef IFNAMSIZ -#define IF_NAMESIZE IFNAMSIZ -#else -#define IF_NAMESIZE 256 -#endif -#endif - -/* Defined in inet_net_pton.c for no particular reason. */ -extern const struct ares_in6_addr ares_in6addr_any; /* :: */ - - -#endif /* ARES_IPV6_H */ diff --git a/lib/c-ares-1.19.1/src/lib/ares_library_init.c b/lib/c-ares-1.19.1/src/lib/ares_library_init.c deleted file mode 100644 index bbfcbeec178..00000000000 --- a/lib/c-ares-1.19.1/src/lib/ares_library_init.c +++ /dev/null @@ -1,113 +0,0 @@ - -/* Copyright 1998 by the Massachusetts Institute of Technology. - * Copyright (C) 2004-2009 by Daniel Stenberg - * - * 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. - */ - -#include "ares_setup.h" - -#include "ares.h" -#include "ares_private.h" - -/* library-private global and unique instance vars */ - -#if defined(ANDROID) || defined(__ANDROID__) -#include "ares_android.h" -#endif - -/* library-private global vars with source visibility restricted to this file */ - -static unsigned int ares_initialized; -static int ares_init_flags; - -/* library-private global vars with visibility across the whole library */ - -/* Some systems may return either NULL or a valid pointer on malloc(0). c-ares should - * never call malloc(0) so lets return NULL so we're more likely to find an issue if it - * were to occur. */ - -static void *default_malloc(size_t size) { if (size == 0) { return NULL; } return malloc(size); } - -#if defined(WIN32) -/* We need indirections to handle Windows DLL rules. */ -static void *default_realloc(void *p, size_t size) { return realloc(p, size); } -static void default_free(void *p) { free(p); } -#else -# define default_realloc realloc -# define default_free free -#endif -void *(*ares_malloc)(size_t size) = default_malloc; -void *(*ares_realloc)(void *ptr, size_t size) = default_realloc; -void (*ares_free)(void *ptr) = default_free; - -int ares_library_init(int flags) -{ - if (ares_initialized) - { - ares_initialized++; - return ARES_SUCCESS; - } - ares_initialized++; - - /* NOTE: ARES_LIB_INIT_WIN32 flag no longer used */ - - ares_init_flags = flags; - - return ARES_SUCCESS; -} - -int ares_library_init_mem(int flags, - void *(*amalloc)(size_t size), - void (*afree)(void *ptr), - void *(*arealloc)(void *ptr, size_t size)) -{ - if (amalloc) - ares_malloc = amalloc; - if (arealloc) - ares_realloc = arealloc; - if (afree) - ares_free = afree; - return ares_library_init(flags); -} - - -void ares_library_cleanup(void) -{ - if (!ares_initialized) - return; - ares_initialized--; - if (ares_initialized) - return; - - /* NOTE: ARES_LIB_INIT_WIN32 flag no longer used */ - -#if defined(ANDROID) || defined(__ANDROID__) - ares_library_cleanup_android(); -#endif - - ares_init_flags = ARES_LIB_INIT_NONE; - ares_malloc = malloc; - ares_realloc = realloc; - ares_free = free; -} - - -int ares_library_initialized(void) -{ -#ifdef USE_WINSOCK - if (!ares_initialized) - return ARES_ENOTINITIALIZED; -#endif - return ARES_SUCCESS; -} diff --git a/lib/c-ares-1.19.1/src/lib/ares_llist.c b/lib/c-ares-1.19.1/src/lib/ares_llist.c deleted file mode 100644 index 36ca84c43e4..00000000000 --- a/lib/c-ares-1.19.1/src/lib/ares_llist.c +++ /dev/null @@ -1,63 +0,0 @@ - -/* Copyright 1998 by the Massachusetts Institute of Technology. - * - * 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. - */ - -#include "ares_setup.h" - -#include "ares.h" -#include "ares_private.h" - -/* Routines for managing doubly-linked circular linked lists with a - * dummy head. - */ - -/* Initialize a new head node */ -void ares__init_list_head(struct list_node* head) { - head->prev = head; - head->next = head; - head->data = NULL; -} - -/* Initialize a list node */ -void ares__init_list_node(struct list_node* node, void* d) { - node->prev = NULL; - node->next = NULL; - node->data = d; -} - -/* Returns true iff the given list is empty */ -int ares__is_list_empty(struct list_node* head) { - return ((head->next == head) && (head->prev == head)); -} - -/* Inserts new_node before old_node */ -void ares__insert_in_list(struct list_node* new_node, - struct list_node* old_node) { - new_node->next = old_node; - new_node->prev = old_node->prev; - old_node->prev->next = new_node; - old_node->prev = new_node; -} - -/* Removes the node from the list it's in, if any */ -void ares__remove_from_list(struct list_node* node) { - if (node->next != NULL) { - node->prev->next = node->next; - node->next->prev = node->prev; - node->prev = NULL; - node->next = NULL; - } -} - diff --git a/lib/c-ares-1.19.1/src/lib/ares_llist.h b/lib/c-ares-1.19.1/src/lib/ares_llist.h deleted file mode 100644 index 20f4d1ce426..00000000000 --- a/lib/c-ares-1.19.1/src/lib/ares_llist.h +++ /dev/null @@ -1,39 +0,0 @@ -#ifndef __ARES_LLIST_H -#define __ARES_LLIST_H - - -/* Copyright 1998 by the Massachusetts Institute of Technology. - * - * 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. - */ - - -/* Node definition for circular, doubly-linked list */ -struct list_node { - struct list_node *prev; - struct list_node *next; - void* data; -}; - -void ares__init_list_head(struct list_node* head); - -void ares__init_list_node(struct list_node* node, void* d); - -int ares__is_list_empty(struct list_node* head); - -void ares__insert_in_list(struct list_node* new_node, - struct list_node* old_node); - -void ares__remove_from_list(struct list_node* node); - -#endif /* __ARES_LLIST_H */ diff --git a/lib/c-ares-1.19.1/src/lib/ares_mkquery.c b/lib/c-ares-1.19.1/src/lib/ares_mkquery.c deleted file mode 100644 index 5aea914bd0e..00000000000 --- a/lib/c-ares-1.19.1/src/lib/ares_mkquery.c +++ /dev/null @@ -1,24 +0,0 @@ - -/* Copyright 1998 by the Massachusetts Institute of Technology. - * - * 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. - */ - -#include "ares_setup.h" -#include "ares.h" - -int ares_mkquery(const char *name, int dnsclass, int type, unsigned short id, - int rd, unsigned char **buf, int *buflen) -{ - return ares_create_query(name, dnsclass, type, id, rd, buf, buflen, 0); -} diff --git a/lib/c-ares-1.19.1/src/lib/ares_nowarn.c b/lib/c-ares-1.19.1/src/lib/ares_nowarn.c deleted file mode 100644 index f63d9135ecc..00000000000 --- a/lib/c-ares-1.19.1/src/lib/ares_nowarn.c +++ /dev/null @@ -1,260 +0,0 @@ - -/* Copyright (C) 2010-2013 by Daniel Stenberg - * - * 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. - */ - - -#include "ares_setup.h" - -#ifdef HAVE_ASSERT_H -# include -#endif - -#ifdef HAVE_LIMITS_H -#include -#endif - -#if defined(__INTEL_COMPILER) && defined(__unix__) - -#ifdef HAVE_NETINET_IN_H -# include -#endif -#ifdef HAVE_ARPA_INET_H -# include -#endif - -#endif /* __INTEL_COMPILER && __unix__ */ - -#define BUILDING_ARES_NOWARN_C 1 - -#include "ares_nowarn.h" - -#ifndef HAVE_LIMITS_H -/* systems without we guess have 16 bit shorts, 32bit ints and - 32bit longs */ -# define CARES_MASK_SSHORT 0x7FFF -# define CARES_MASK_USHORT 0xFFFF -# define CARES_MASK_SINT 0x7FFFFFFF -# define CARES_MASK_UINT 0xFFFFFFFF -# define CARES_MASK_SLONG 0x7FFFFFFFL -# define CARES_MASK_ULONG 0xFFFFFFFFUL -#else -# define CARES_MASK_SSHORT SHRT_MAX -# define CARES_MASK_USHORT USHRT_MAX -# define CARES_MASK_SINT INT_MAX -# define CARES_MASK_UINT UINT_MAX -# define CARES_MASK_SLONG LONG_MAX -# define CARES_MASK_ULONG ULONG_MAX -#endif - -/* -** unsigned size_t to signed long -*/ - -long aresx_uztosl(size_t uznum) -{ -#ifdef __INTEL_COMPILER -# pragma warning(push) -# pragma warning(disable:810) /* conversion may lose significant bits */ -#endif - - return (long)(uznum & (size_t) CARES_MASK_SLONG); - -#ifdef __INTEL_COMPILER -# pragma warning(pop) -#endif -} - -/* -** unsigned size_t to signed int -*/ - -int aresx_uztosi(size_t uznum) -{ -#ifdef __INTEL_COMPILER -# pragma warning(push) -# pragma warning(disable:810) /* conversion may lose significant bits */ -#endif - - return (int)(uznum & (size_t) CARES_MASK_SINT); - -#ifdef __INTEL_COMPILER -# pragma warning(pop) -#endif -} - -/* -** unsigned size_t to signed short -*/ - -short aresx_uztoss(size_t uznum) -{ -#ifdef __INTEL_COMPILER -# pragma warning(push) -# pragma warning(disable:810) /* conversion may lose significant bits */ -#endif - - return (short)(uznum & (size_t) CARES_MASK_SSHORT); - -#ifdef __INTEL_COMPILER -# pragma warning(pop) -#endif -} - -/* -** signed int to signed short -*/ - -short aresx_sitoss(int sinum) -{ -#ifdef __INTEL_COMPILER -# pragma warning(push) -# pragma warning(disable:810) /* conversion may lose significant bits */ -#endif - - DEBUGASSERT(sinum >= 0); - return (short)(sinum & (int) CARES_MASK_SSHORT); - -#ifdef __INTEL_COMPILER -# pragma warning(pop) -#endif -} - -/* -** signed long to signed int -*/ - -int aresx_sltosi(long slnum) -{ -#ifdef __INTEL_COMPILER -# pragma warning(push) -# pragma warning(disable:810) /* conversion may lose significant bits */ -#endif - - DEBUGASSERT(slnum >= 0); - return (int)(slnum & (long) CARES_MASK_SINT); - -#ifdef __INTEL_COMPILER -# pragma warning(pop) -#endif -} - -/* -** signed ares_ssize_t to signed int -*/ - -int aresx_sztosi(ares_ssize_t sznum) -{ -#ifdef __INTEL_COMPILER -# pragma warning(push) -# pragma warning(disable:810) /* conversion may lose significant bits */ -#endif - - DEBUGASSERT(sznum >= 0); - return (int)(sznum & (ares_ssize_t) CARES_MASK_SINT); - -#ifdef __INTEL_COMPILER -# pragma warning(pop) -#endif -} - -/* -** signed ares_ssize_t to unsigned int -*/ - -unsigned int aresx_sztoui(ares_ssize_t sznum) -{ -#ifdef __INTEL_COMPILER -# pragma warning(push) -# pragma warning(disable:810) /* conversion may lose significant bits */ -#endif - - DEBUGASSERT(sznum >= 0); - return (unsigned int)(sznum & (ares_ssize_t) CARES_MASK_UINT); - -#ifdef __INTEL_COMPILER -# pragma warning(pop) -#endif -} - -/* -** signed int to unsigned short -*/ - -unsigned short aresx_sitous(int sinum) -{ -#ifdef __INTEL_COMPILER -# pragma warning(push) -# pragma warning(disable:810) /* conversion may lose significant bits */ -#endif - - DEBUGASSERT(sinum >= 0); - return (unsigned short)(sinum & (int) CARES_MASK_USHORT); - -#ifdef __INTEL_COMPILER -# pragma warning(pop) -#endif -} - -#if defined(__INTEL_COMPILER) && defined(__unix__) - -int aresx_FD_ISSET(int fd, fd_set *fdset) -{ - #pragma warning(push) - #pragma warning(disable:1469) /* clobber ignored */ - return FD_ISSET(fd, fdset); - #pragma warning(pop) -} - -void aresx_FD_SET(int fd, fd_set *fdset) -{ - #pragma warning(push) - #pragma warning(disable:1469) /* clobber ignored */ - FD_SET(fd, fdset); - #pragma warning(pop) -} - -void aresx_FD_ZERO(fd_set *fdset) -{ - #pragma warning(push) - #pragma warning(disable:593) /* variable was set but never used */ - FD_ZERO(fdset); - #pragma warning(pop) -} - -unsigned short aresx_htons(unsigned short usnum) -{ -#if (__INTEL_COMPILER == 910) && defined(__i386__) - return (unsigned short)(((usnum << 8) & 0xFF00) | ((usnum >> 8) & 0x00FF)); -#else - #pragma warning(push) - #pragma warning(disable:810) /* conversion may lose significant bits */ - return htons(usnum); - #pragma warning(pop) -#endif -} - -unsigned short aresx_ntohs(unsigned short usnum) -{ -#if (__INTEL_COMPILER == 910) && defined(__i386__) - return (unsigned short)(((usnum << 8) & 0xFF00) | ((usnum >> 8) & 0x00FF)); -#else - #pragma warning(push) - #pragma warning(disable:810) /* conversion may lose significant bits */ - return ntohs(usnum); - #pragma warning(pop) -#endif -} - -#endif /* __INTEL_COMPILER && __unix__ */ diff --git a/lib/c-ares-1.19.1/src/lib/ares_nowarn.h b/lib/c-ares-1.19.1/src/lib/ares_nowarn.h deleted file mode 100644 index 505e6220981..00000000000 --- a/lib/c-ares-1.19.1/src/lib/ares_nowarn.h +++ /dev/null @@ -1,61 +0,0 @@ -#ifndef HEADER_CARES_NOWARN_H -#define HEADER_CARES_NOWARN_H - - -/* Copyright (C) 2010-2012 by Daniel Stenberg - * - * 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. - */ - -long aresx_uztosl(size_t uznum); -int aresx_uztosi(size_t uznum); -short aresx_uztoss(size_t uznum); - -short aresx_sitoss(int sinum); - -int aresx_sltosi(long slnum); - -int aresx_sztosi(ares_ssize_t sznum); - -unsigned int aresx_sztoui(ares_ssize_t sznum); - -unsigned short aresx_sitous(int sinum); - -#if defined(__INTEL_COMPILER) && defined(__unix__) - -int aresx_FD_ISSET(int fd, fd_set *fdset); - -void aresx_FD_SET(int fd, fd_set *fdset); - -void aresx_FD_ZERO(fd_set *fdset); - -unsigned short aresx_htons(unsigned short usnum); - -unsigned short aresx_ntohs(unsigned short usnum); - -#ifndef BUILDING_ARES_NOWARN_C -# undef FD_ISSET -# define FD_ISSET(a,b) aresx_FD_ISSET((a),(b)) -# undef FD_SET -# define FD_SET(a,b) aresx_FD_SET((a),(b)) -# undef FD_ZERO -# define FD_ZERO(a) aresx_FD_ZERO((a)) -# undef htons -# define htons(a) aresx_htons((a)) -# undef ntohs -# define ntohs(a) aresx_ntohs((a)) -#endif - -#endif /* __INTEL_COMPILER && __unix__ */ - -#endif /* HEADER_CARES_NOWARN_H */ diff --git a/lib/c-ares-1.19.1/src/lib/ares_options.c b/lib/c-ares-1.19.1/src/lib/ares_options.c deleted file mode 100644 index de49de46259..00000000000 --- a/lib/c-ares-1.19.1/src/lib/ares_options.c +++ /dev/null @@ -1,406 +0,0 @@ - -/* Copyright 1998 by the Massachusetts Institute of Technology. - * Copyright (C) 2008-2013 by Daniel Stenberg - * - * 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. - */ - - -#include "ares_setup.h" - -#ifdef HAVE_ARPA_INET_H -# include -#endif - -#include "ares.h" -#include "ares_data.h" -#include "ares_inet_net_pton.h" -#include "ares_private.h" - - -int ares_get_servers(ares_channel channel, - struct ares_addr_node **servers) -{ - struct ares_addr_node *srvr_head = NULL; - struct ares_addr_node *srvr_last = NULL; - struct ares_addr_node *srvr_curr; - int status = ARES_SUCCESS; - int i; - - if (!channel) - return ARES_ENODATA; - - for (i = 0; i < channel->nservers; i++) - { - /* Allocate storage for this server node appending it to the list */ - srvr_curr = ares_malloc_data(ARES_DATATYPE_ADDR_NODE); - if (!srvr_curr) - { - status = ARES_ENOMEM; - break; - } - if (srvr_last) - { - srvr_last->next = srvr_curr; - } - else - { - srvr_head = srvr_curr; - } - srvr_last = srvr_curr; - - /* Fill this server node data */ - srvr_curr->family = channel->servers[i].addr.family; - if (srvr_curr->family == AF_INET) - memcpy(&srvr_curr->addrV4, &channel->servers[i].addr.addrV4, - sizeof(srvr_curr->addrV4)); - else - memcpy(&srvr_curr->addrV6, &channel->servers[i].addr.addrV6, - sizeof(srvr_curr->addrV6)); - } - - if (status != ARES_SUCCESS) - { - if (srvr_head) - { - ares_free_data(srvr_head); - srvr_head = NULL; - } - } - - *servers = srvr_head; - - return status; -} - -int ares_get_servers_ports(ares_channel channel, - struct ares_addr_port_node **servers) -{ - struct ares_addr_port_node *srvr_head = NULL; - struct ares_addr_port_node *srvr_last = NULL; - struct ares_addr_port_node *srvr_curr; - int status = ARES_SUCCESS; - int i; - - if (!channel) - return ARES_ENODATA; - - for (i = 0; i < channel->nservers; i++) - { - /* Allocate storage for this server node appending it to the list */ - srvr_curr = ares_malloc_data(ARES_DATATYPE_ADDR_PORT_NODE); - if (!srvr_curr) - { - status = ARES_ENOMEM; - break; - } - if (srvr_last) - { - srvr_last->next = srvr_curr; - } - else - { - srvr_head = srvr_curr; - } - srvr_last = srvr_curr; - - /* Fill this server node data */ - srvr_curr->family = channel->servers[i].addr.family; - srvr_curr->udp_port = ntohs((unsigned short)channel->servers[i].addr.udp_port); - srvr_curr->tcp_port = ntohs((unsigned short)channel->servers[i].addr.tcp_port); - if (srvr_curr->family == AF_INET) - memcpy(&srvr_curr->addrV4, &channel->servers[i].addr.addrV4, - sizeof(srvr_curr->addrV4)); - else - memcpy(&srvr_curr->addrV6, &channel->servers[i].addr.addrV6, - sizeof(srvr_curr->addrV6)); - } - - if (status != ARES_SUCCESS) - { - if (srvr_head) - { - ares_free_data(srvr_head); - srvr_head = NULL; - } - } - - *servers = srvr_head; - - return status; -} - -int ares_set_servers(ares_channel channel, - struct ares_addr_node *servers) -{ - struct ares_addr_node *srvr; - int num_srvrs = 0; - int i; - - if (ares_library_initialized() != ARES_SUCCESS) - return ARES_ENOTINITIALIZED; /* LCOV_EXCL_LINE: n/a on non-WinSock */ - - if (!channel) - return ARES_ENODATA; - - if (!ares__is_list_empty(&channel->all_queries)) - return ARES_ENOTIMP; - - ares__destroy_servers_state(channel); - - for (srvr = servers; srvr; srvr = srvr->next) - { - num_srvrs++; - } - - if (num_srvrs > 0) - { - /* Allocate storage for servers state */ - channel->servers = ares_malloc(num_srvrs * sizeof(struct server_state)); - if (!channel->servers) - { - return ARES_ENOMEM; - } - channel->nservers = num_srvrs; - /* Fill servers state address data */ - for (i = 0, srvr = servers; srvr; i++, srvr = srvr->next) - { - channel->servers[i].addr.family = srvr->family; - channel->servers[i].addr.udp_port = 0; - channel->servers[i].addr.tcp_port = 0; - if (srvr->family == AF_INET) - memcpy(&channel->servers[i].addr.addrV4, &srvr->addrV4, - sizeof(srvr->addrV4)); - else - memcpy(&channel->servers[i].addr.addrV6, &srvr->addrV6, - sizeof(srvr->addrV6)); - } - /* Initialize servers state remaining data */ - ares__init_servers_state(channel); - } - - return ARES_SUCCESS; -} - -int ares_set_servers_ports(ares_channel channel, - struct ares_addr_port_node *servers) -{ - struct ares_addr_port_node *srvr; - int num_srvrs = 0; - int i; - - if (ares_library_initialized() != ARES_SUCCESS) - return ARES_ENOTINITIALIZED; /* LCOV_EXCL_LINE: n/a on non-WinSock */ - - if (!channel) - return ARES_ENODATA; - - if (!ares__is_list_empty(&channel->all_queries)) - return ARES_ENOTIMP; - - ares__destroy_servers_state(channel); - - for (srvr = servers; srvr; srvr = srvr->next) - { - num_srvrs++; - } - - if (num_srvrs > 0) - { - /* Allocate storage for servers state */ - channel->servers = ares_malloc(num_srvrs * sizeof(struct server_state)); - if (!channel->servers) - { - return ARES_ENOMEM; - } - channel->nservers = num_srvrs; - /* Fill servers state address data */ - for (i = 0, srvr = servers; srvr; i++, srvr = srvr->next) - { - channel->servers[i].addr.family = srvr->family; - channel->servers[i].addr.udp_port = htons((unsigned short)srvr->udp_port); - channel->servers[i].addr.tcp_port = htons((unsigned short)srvr->tcp_port); - if (srvr->family == AF_INET) - memcpy(&channel->servers[i].addr.addrV4, &srvr->addrV4, - sizeof(srvr->addrV4)); - else - memcpy(&channel->servers[i].addr.addrV6, &srvr->addrV6, - sizeof(srvr->addrV6)); - } - /* Initialize servers state remaining data */ - ares__init_servers_state(channel); - } - - return ARES_SUCCESS; -} - -/* Incomming string format: host[:port][,host[:port]]... */ -/* IPv6 addresses with ports require square brackets [fe80::1%lo0]:53 */ -static int set_servers_csv(ares_channel channel, - const char* _csv, int use_port) -{ - size_t i; - char* csv = NULL; - char* ptr; - char* start_host; - int cc = 0; - int rv = ARES_SUCCESS; - struct ares_addr_port_node *servers = NULL; - struct ares_addr_port_node *last = NULL; - - if (ares_library_initialized() != ARES_SUCCESS) - return ARES_ENOTINITIALIZED; /* LCOV_EXCL_LINE: n/a on non-WinSock */ - - if (!channel) - return ARES_ENODATA; - - i = strlen(_csv); - if (i == 0) - return ARES_SUCCESS; /* blank all servers */ - - csv = ares_malloc(i + 2); - if (!csv) - return ARES_ENOMEM; - - strcpy(csv, _csv); - if (csv[i-1] != ',') { /* make parsing easier by ensuring ending ',' */ - csv[i] = ','; - csv[i+1] = 0; - } - - start_host = csv; - for (ptr = csv; *ptr; ptr++) { - if (*ptr == ':') { - /* count colons to determine if we have an IPv6 number or IPv4 with - port */ - cc++; - } - else if (*ptr == '[') { - /* move start_host if an open square bracket is found wrapping an IPv6 - address */ - start_host = ptr + 1; - } - else if (*ptr == ',') { - char* pp = ptr - 1; - char* p = ptr; - int port = 0; - struct in_addr in4; - struct ares_in6_addr in6; - struct ares_addr_port_node *s = NULL; - - *ptr = 0; /* null terminate host:port string */ - /* Got an entry..see if the port was specified. */ - if (cc > 0) { - while (pp > start_host) { - /* a single close square bracket followed by a colon, ']:' indicates - an IPv6 address with port */ - if ((*pp == ']') && (*p == ':')) - break; /* found port */ - /* a single colon, ':' indicates an IPv4 address with port */ - if ((*pp == ':') && (cc == 1)) - break; /* found port */ - if (!(ISDIGIT(*pp) || (*pp == ':'))) { - /* Found end of digits before we found :, so wasn't a port */ - /* must allow ':' for IPv6 case of ']:' indicates we found a port */ - pp = p = ptr; - break; - } - pp--; - p--; - } - if ((pp != start_host) && ((pp + 1) < ptr)) { - /* Found it. Parse over the port number */ - /* when an IPv6 address is wrapped with square brackets the port - starts at pp + 2 */ - if (*pp == ']') - p++; /* move p before ':' */ - /* p will point to the start of the port */ - port = (int)strtol(p, NULL, 10); - *pp = 0; /* null terminate host */ - } - } - /* resolve host, try ipv4 first, rslt is in network byte order */ - rv = ares_inet_pton(AF_INET, start_host, &in4); - if (!rv) { - /* Ok, try IPv6 then */ - rv = ares_inet_pton(AF_INET6, start_host, &in6); - if (!rv) { - rv = ARES_EBADSTR; - goto out; - } - /* was ipv6, add new server */ - s = ares_malloc(sizeof(*s)); - if (!s) { - rv = ARES_ENOMEM; - goto out; - } - s->family = AF_INET6; - memcpy(&s->addr, &in6, sizeof(struct ares_in6_addr)); - } - else { - /* was ipv4, add new server */ - s = ares_malloc(sizeof(*s)); - if (!s) { - rv = ARES_ENOMEM; - goto out; - } - s->family = AF_INET; - memcpy(&s->addr, &in4, sizeof(struct in_addr)); - } - if (s) { - s->udp_port = use_port ? port: 0; - s->tcp_port = s->udp_port; - s->next = NULL; - if (last) { - last->next = s; - /* need to move last to maintain the linked list */ - last = last->next; - } - else { - servers = s; - last = s; - } - } - - /* Set up for next one */ - start_host = ptr + 1; - cc = 0; - } - } - - rv = ares_set_servers_ports(channel, servers); - - out: - if (csv) - ares_free(csv); - while (servers) { - struct ares_addr_port_node *s = servers; - servers = servers->next; - ares_free(s); - } - - return rv; -} - -int ares_set_servers_csv(ares_channel channel, - const char* _csv) -{ - return set_servers_csv(channel, _csv, FALSE); -} - -int ares_set_servers_ports_csv(ares_channel channel, - const char* _csv) -{ - return set_servers_csv(channel, _csv, TRUE); -} - diff --git a/lib/c-ares-1.19.1/src/lib/ares_parse_a_reply.c b/lib/c-ares-1.19.1/src/lib/ares_parse_a_reply.c deleted file mode 100644 index ee903c7510e..00000000000 --- a/lib/c-ares-1.19.1/src/lib/ares_parse_a_reply.c +++ /dev/null @@ -1,90 +0,0 @@ - -/* Copyright 1998 by the Massachusetts Institute of Technology. - * Copyright (C) 2019 by Andrew Selivanov - * - * 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. - */ - -#include "ares_setup.h" - -#ifdef HAVE_NETINET_IN_H -# include -#endif -#ifdef HAVE_NETDB_H -# include -#endif -#ifdef HAVE_ARPA_INET_H -# include -#endif - -#include "ares_nameser.h" - -#ifdef HAVE_STRINGS_H -# include -#endif - -#ifdef HAVE_LIMITS_H -# include -#endif - -#include "ares.h" -#include "ares_dns.h" -#include "ares_private.h" - -int ares_parse_a_reply(const unsigned char *abuf, int alen, - struct hostent **host, struct ares_addrttl *addrttls, - int *naddrttls) -{ - struct ares_addrinfo ai; - char *question_hostname = NULL; - int status; - int req_naddrttls = 0; - - if (naddrttls) - { - req_naddrttls = *naddrttls; - *naddrttls = 0; - } - - memset(&ai, 0, sizeof(ai)); - - status = ares__parse_into_addrinfo(abuf, alen, 0, 0, &ai); - if (status != ARES_SUCCESS && status != ARES_ENODATA) - { - goto fail; - } - - if (host != NULL) - { - status = ares__addrinfo2hostent(&ai, AF_INET, host); - if (status != ARES_SUCCESS && status != ARES_ENODATA) - { - goto fail; - } - } - - if (addrttls != NULL && req_naddrttls) - { - ares__addrinfo2addrttl(&ai, AF_INET, req_naddrttls, addrttls, - NULL, naddrttls); - } - - -fail: - ares__freeaddrinfo_cnames(ai.cnames); - ares__freeaddrinfo_nodes(ai.nodes); - ares_free(ai.name); - ares_free(question_hostname); - - return status; -} diff --git a/lib/c-ares-1.19.1/src/lib/ares_parse_aaaa_reply.c b/lib/c-ares-1.19.1/src/lib/ares_parse_aaaa_reply.c deleted file mode 100644 index 091065d3176..00000000000 --- a/lib/c-ares-1.19.1/src/lib/ares_parse_aaaa_reply.c +++ /dev/null @@ -1,92 +0,0 @@ - -/* Copyright 1998 by the Massachusetts Institute of Technology. - * Copyright 2005 Dominick Meglio - * Copyright (C) 2019 by Andrew Selivanov - * - * 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. - */ - -#include "ares_setup.h" - -#ifdef HAVE_NETINET_IN_H -# include -#endif -#ifdef HAVE_NETDB_H -# include -#endif -#ifdef HAVE_ARPA_INET_H -# include -#endif - -#include "ares_nameser.h" - -#ifdef HAVE_STRINGS_H -# include -#endif - -#ifdef HAVE_LIMITS_H -# include -#endif - -#include "ares.h" -#include "ares_dns.h" -#include "ares_inet_net_pton.h" -#include "ares_private.h" - -int ares_parse_aaaa_reply(const unsigned char *abuf, int alen, - struct hostent **host, struct ares_addr6ttl *addrttls, - int *naddrttls) -{ - struct ares_addrinfo ai; - char *question_hostname = NULL; - int status; - int req_naddrttls = 0; - - if (naddrttls) - { - req_naddrttls = *naddrttls; - *naddrttls = 0; - } - - memset(&ai, 0, sizeof(ai)); - - status = ares__parse_into_addrinfo(abuf, alen, 0, 0, &ai); - if (status != ARES_SUCCESS && status != ARES_ENODATA) - { - goto fail; - } - - if (host != NULL) - { - status = ares__addrinfo2hostent(&ai, AF_INET6, host); - if (status != ARES_SUCCESS && status != ARES_ENODATA) - { - goto fail; - } - } - - if (addrttls != NULL && req_naddrttls) - { - ares__addrinfo2addrttl(&ai, AF_INET6, req_naddrttls, NULL, - addrttls, naddrttls); - } - -fail: - ares__freeaddrinfo_cnames(ai.cnames); - ares__freeaddrinfo_nodes(ai.nodes); - ares_free(question_hostname); - ares_free(ai.name); - - return status; -} - diff --git a/lib/c-ares-1.19.1/src/lib/ares_parse_caa_reply.c b/lib/c-ares-1.19.1/src/lib/ares_parse_caa_reply.c deleted file mode 100644 index f6d4d3c61f4..00000000000 --- a/lib/c-ares-1.19.1/src/lib/ares_parse_caa_reply.c +++ /dev/null @@ -1,199 +0,0 @@ - -/* Copyright 2020 by - * - * 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. - */ - -#include "ares_setup.h" - -#ifdef HAVE_NETINET_IN_H -# include -#endif -#ifdef HAVE_NETDB_H -# include -#endif -#ifdef HAVE_ARPA_INET_H -# include -#endif - -#include "ares_nameser.h" - -#ifdef HAVE_STRINGS_H -# include -#endif - -#include "ares.h" -#include "ares_dns.h" -#include "ares_data.h" -#include "ares_private.h" - -int -ares_parse_caa_reply (const unsigned char *abuf, int alen, - struct ares_caa_reply **caa_out) -{ - unsigned int qdcount, ancount, i; - const unsigned char *aptr; - const unsigned char *strptr; - int status, rr_type, rr_class, rr_len; - long len; - char *hostname = NULL, *rr_name = NULL; - struct ares_caa_reply *caa_head = NULL; - struct ares_caa_reply *caa_last = NULL; - struct ares_caa_reply *caa_curr; - - /* Set *caa_out to NULL for all failure cases. */ - *caa_out = NULL; - - /* Give up if abuf doesn't have room for a header. */ - if (alen < HFIXEDSZ) - return ARES_EBADRESP; - - /* Fetch the question and answer count from the header. */ - qdcount = DNS_HEADER_QDCOUNT (abuf); - ancount = DNS_HEADER_ANCOUNT (abuf); - if (qdcount != 1) - return ARES_EBADRESP; - if (ancount == 0) - return ARES_ENODATA; - - /* Expand the name from the question, and skip past the question. */ - aptr = abuf + HFIXEDSZ; - status = ares_expand_name (aptr, abuf, alen, &hostname, &len); - if (status != ARES_SUCCESS) - return status; - - if (aptr + len + QFIXEDSZ > abuf + alen) - { - ares_free (hostname); - return ARES_EBADRESP; - } - aptr += len + QFIXEDSZ; - - /* Examine each answer resource record (RR) in turn. */ - for (i = 0; i < ancount; i++) - { - /* Decode the RR up to the data field. */ - status = ares_expand_name (aptr, abuf, alen, &rr_name, &len); - if (status != ARES_SUCCESS) - { - break; - } - aptr += len; - if (aptr + RRFIXEDSZ > abuf + alen) - { - status = ARES_EBADRESP; - break; - } - rr_type = DNS_RR_TYPE (aptr); - rr_class = DNS_RR_CLASS (aptr); - rr_len = DNS_RR_LEN (aptr); - aptr += RRFIXEDSZ; - if (aptr + rr_len > abuf + alen) - { - status = ARES_EBADRESP; - break; - } - - /* Check if we are really looking at a CAA record */ - if ((rr_class == C_IN || rr_class == C_CHAOS) && rr_type == T_CAA) - { - strptr = aptr; - - /* Allocate storage for this CAA answer appending it to the list */ - caa_curr = ares_malloc_data(ARES_DATATYPE_CAA_REPLY); - if (!caa_curr) - { - status = ARES_ENOMEM; - break; - } - if (caa_last) - { - caa_last->next = caa_curr; - } - else - { - caa_head = caa_curr; - } - caa_last = caa_curr; - if (rr_len < 2) - { - status = ARES_EBADRESP; - break; - } - caa_curr->critical = (int)*strptr++; - caa_curr->plength = (int)*strptr++; - if (caa_curr->plength <= 0 || (int)caa_curr->plength >= rr_len - 2) - { - status = ARES_EBADRESP; - break; - } - caa_curr->property = ares_malloc (caa_curr->plength + 1/* Including null byte */); - if (caa_curr->property == NULL) - { - status = ARES_ENOMEM; - break; - } - memcpy ((char *) caa_curr->property, strptr, caa_curr->plength); - /* Make sure we NULL-terminate */ - caa_curr->property[caa_curr->plength] = 0; - strptr += caa_curr->plength; - - caa_curr->length = rr_len - caa_curr->plength - 2; - if (caa_curr->length <= 0) - { - status = ARES_EBADRESP; - break; - } - caa_curr->value = ares_malloc (caa_curr->length + 1/* Including null byte */); - if (caa_curr->value == NULL) - { - status = ARES_ENOMEM; - break; - } - memcpy ((char *) caa_curr->value, strptr, caa_curr->length); - /* Make sure we NULL-terminate */ - caa_curr->value[caa_curr->length] = 0; - } - - /* Propagate any failures */ - if (status != ARES_SUCCESS) - { - break; - } - - /* Don't lose memory in the next iteration */ - ares_free (rr_name); - rr_name = NULL; - - /* Move on to the next record */ - aptr += rr_len; - } - - if (hostname) - ares_free (hostname); - if (rr_name) - ares_free (rr_name); - - /* clean up on error */ - if (status != ARES_SUCCESS) - { - if (caa_head) - ares_free_data (caa_head); - return status; - } - - /* everything looks fine, return the data */ - *caa_out = caa_head; - - return ARES_SUCCESS; -} diff --git a/lib/c-ares-1.19.1/src/lib/ares_parse_mx_reply.c b/lib/c-ares-1.19.1/src/lib/ares_parse_mx_reply.c deleted file mode 100644 index a497f558738..00000000000 --- a/lib/c-ares-1.19.1/src/lib/ares_parse_mx_reply.c +++ /dev/null @@ -1,164 +0,0 @@ - -/* Copyright 1998 by the Massachusetts Institute of Technology. - * Copyright (C) 2010 Jeremy Lal - * - * 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. - */ - -#include "ares_setup.h" - -#ifdef HAVE_NETINET_IN_H -# include -#endif -#ifdef HAVE_NETDB_H -# include -#endif -#ifdef HAVE_ARPA_INET_H -# include -#endif - -#include "ares_nameser.h" - -#include "ares.h" -#include "ares_dns.h" -#include "ares_data.h" -#include "ares_private.h" - -int -ares_parse_mx_reply (const unsigned char *abuf, int alen, - struct ares_mx_reply **mx_out) -{ - unsigned int qdcount, ancount, i; - const unsigned char *aptr, *vptr; - int status, rr_type, rr_class, rr_len; - long len; - char *hostname = NULL, *rr_name = NULL; - struct ares_mx_reply *mx_head = NULL; - struct ares_mx_reply *mx_last = NULL; - struct ares_mx_reply *mx_curr; - - /* Set *mx_out to NULL for all failure cases. */ - *mx_out = NULL; - - /* Give up if abuf doesn't have room for a header. */ - if (alen < HFIXEDSZ) - return ARES_EBADRESP; - - /* Fetch the question and answer count from the header. */ - qdcount = DNS_HEADER_QDCOUNT (abuf); - ancount = DNS_HEADER_ANCOUNT (abuf); - if (qdcount != 1) - return ARES_EBADRESP; - if (ancount == 0) - return ARES_ENODATA; - - /* Expand the name from the question, and skip past the question. */ - aptr = abuf + HFIXEDSZ; - status = ares_expand_name (aptr, abuf, alen, &hostname, &len); - if (status != ARES_SUCCESS) - return status; - - if (aptr + len + QFIXEDSZ > abuf + alen) - { - ares_free (hostname); - return ARES_EBADRESP; - } - aptr += len + QFIXEDSZ; - - /* Examine each answer resource record (RR) in turn. */ - for (i = 0; i < ancount; i++) - { - /* Decode the RR up to the data field. */ - status = ares_expand_name (aptr, abuf, alen, &rr_name, &len); - if (status != ARES_SUCCESS) - { - break; - } - aptr += len; - if (aptr + RRFIXEDSZ > abuf + alen) - { - status = ARES_EBADRESP; - break; - } - rr_type = DNS_RR_TYPE (aptr); - rr_class = DNS_RR_CLASS (aptr); - rr_len = DNS_RR_LEN (aptr); - aptr += RRFIXEDSZ; - if (aptr + rr_len > abuf + alen) - { - status = ARES_EBADRESP; - break; - } - - /* Check if we are really looking at a MX record */ - if (rr_class == C_IN && rr_type == T_MX) - { - /* parse the MX record itself */ - if (rr_len < 2) - { - status = ARES_EBADRESP; - break; - } - - /* Allocate storage for this MX answer appending it to the list */ - mx_curr = ares_malloc_data(ARES_DATATYPE_MX_REPLY); - if (!mx_curr) - { - status = ARES_ENOMEM; - break; - } - if (mx_last) - { - mx_last->next = mx_curr; - } - else - { - mx_head = mx_curr; - } - mx_last = mx_curr; - - vptr = aptr; - mx_curr->priority = DNS__16BIT(vptr); - vptr += sizeof(unsigned short); - - status = ares_expand_name (vptr, abuf, alen, &mx_curr->host, &len); - if (status != ARES_SUCCESS) - break; - } - - /* Don't lose memory in the next iteration */ - ares_free (rr_name); - rr_name = NULL; - - /* Move on to the next record */ - aptr += rr_len; - } - - if (hostname) - ares_free (hostname); - if (rr_name) - ares_free (rr_name); - - /* clean up on error */ - if (status != ARES_SUCCESS) - { - if (mx_head) - ares_free_data (mx_head); - return status; - } - - /* everything looks fine, return the data */ - *mx_out = mx_head; - - return ARES_SUCCESS; -} diff --git a/lib/c-ares-1.19.1/src/lib/ares_parse_naptr_reply.c b/lib/c-ares-1.19.1/src/lib/ares_parse_naptr_reply.c deleted file mode 100644 index dd984c0fea8..00000000000 --- a/lib/c-ares-1.19.1/src/lib/ares_parse_naptr_reply.c +++ /dev/null @@ -1,183 +0,0 @@ - -/* Copyright 1998 by the Massachusetts Institute of Technology. - * Copyright (C) 2009 by Jakub Hrozek - * - * 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. - */ - -#include "ares_setup.h" - -#ifdef HAVE_NETINET_IN_H -# include -#endif -#ifdef HAVE_NETDB_H -# include -#endif -#ifdef HAVE_ARPA_INET_H -# include -#endif - -#include "ares_nameser.h" - -#include "ares.h" -#include "ares_dns.h" -#include "ares_data.h" -#include "ares_private.h" - -int -ares_parse_naptr_reply (const unsigned char *abuf, int alen, - struct ares_naptr_reply **naptr_out) -{ - unsigned int qdcount, ancount, i; - const unsigned char *aptr, *vptr; - int status, rr_type, rr_class, rr_len; - long len; - char *hostname = NULL, *rr_name = NULL; - struct ares_naptr_reply *naptr_head = NULL; - struct ares_naptr_reply *naptr_last = NULL; - struct ares_naptr_reply *naptr_curr; - - /* Set *naptr_out to NULL for all failure cases. */ - *naptr_out = NULL; - - /* Give up if abuf doesn't have room for a header. */ - if (alen < HFIXEDSZ) - return ARES_EBADRESP; - - /* Fetch the question and answer count from the header. */ - qdcount = DNS_HEADER_QDCOUNT (abuf); - ancount = DNS_HEADER_ANCOUNT (abuf); - if (qdcount != 1) - return ARES_EBADRESP; - if (ancount == 0) - return ARES_ENODATA; - - /* Expand the name from the question, and skip past the question. */ - aptr = abuf + HFIXEDSZ; - status = ares_expand_name (aptr, abuf, alen, &hostname, &len); - if (status != ARES_SUCCESS) - return status; - - if (aptr + len + QFIXEDSZ > abuf + alen) - { - ares_free (hostname); - return ARES_EBADRESP; - } - aptr += len + QFIXEDSZ; - - /* Examine each answer resource record (RR) in turn. */ - for (i = 0; i < ancount; i++) - { - /* Decode the RR up to the data field. */ - status = ares_expand_name (aptr, abuf, alen, &rr_name, &len); - if (status != ARES_SUCCESS) - { - break; - } - aptr += len; - if (aptr + RRFIXEDSZ > abuf + alen) - { - status = ARES_EBADRESP; - break; - } - rr_type = DNS_RR_TYPE (aptr); - rr_class = DNS_RR_CLASS (aptr); - rr_len = DNS_RR_LEN (aptr); - aptr += RRFIXEDSZ; - if (aptr + rr_len > abuf + alen) - { - status = ARES_EBADRESP; - break; - } - - /* Check if we are really looking at a NAPTR record */ - if (rr_class == C_IN && rr_type == T_NAPTR) - { - /* parse the NAPTR record itself */ - - /* RR must contain at least 7 bytes = 2 x int16 + 3 x name */ - if (rr_len < 7) - { - status = ARES_EBADRESP; - break; - } - - /* Allocate storage for this NAPTR answer appending it to the list */ - naptr_curr = ares_malloc_data(ARES_DATATYPE_NAPTR_REPLY); - if (!naptr_curr) - { - status = ARES_ENOMEM; - break; - } - if (naptr_last) - { - naptr_last->next = naptr_curr; - } - else - { - naptr_head = naptr_curr; - } - naptr_last = naptr_curr; - - vptr = aptr; - naptr_curr->order = DNS__16BIT(vptr); - vptr += sizeof(unsigned short); - naptr_curr->preference = DNS__16BIT(vptr); - vptr += sizeof(unsigned short); - - status = ares_expand_string(vptr, abuf, alen, &naptr_curr->flags, &len); - if (status != ARES_SUCCESS) - break; - vptr += len; - - status = ares_expand_string(vptr, abuf, alen, &naptr_curr->service, &len); - if (status != ARES_SUCCESS) - break; - vptr += len; - - status = ares_expand_string(vptr, abuf, alen, &naptr_curr->regexp, &len); - if (status != ARES_SUCCESS) - break; - vptr += len; - - status = ares_expand_name(vptr, abuf, alen, &naptr_curr->replacement, &len); - if (status != ARES_SUCCESS) - break; - } - - /* Don't lose memory in the next iteration */ - ares_free (rr_name); - rr_name = NULL; - - /* Move on to the next record */ - aptr += rr_len; - } - - if (hostname) - ares_free (hostname); - if (rr_name) - ares_free (rr_name); - - /* clean up on error */ - if (status != ARES_SUCCESS) - { - if (naptr_head) - ares_free_data (naptr_head); - return status; - } - - /* everything looks fine, return the data */ - *naptr_out = naptr_head; - - return ARES_SUCCESS; -} diff --git a/lib/c-ares-1.19.1/src/lib/ares_parse_ns_reply.c b/lib/c-ares-1.19.1/src/lib/ares_parse_ns_reply.c deleted file mode 100644 index 47d12994c96..00000000000 --- a/lib/c-ares-1.19.1/src/lib/ares_parse_ns_reply.c +++ /dev/null @@ -1,177 +0,0 @@ -/* Copyright 1998 by the Massachusetts Institute of Technology. - * - * 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. - */ - -/* - * ares_parse_ns_reply created by Vlad Dinulescu - * on behalf of AVIRA Gmbh - http://www.avira.com - */ - -#include "ares_setup.h" - -#ifdef HAVE_NETINET_IN_H -# include -#endif -#ifdef HAVE_NETDB_H -# include -#endif -#ifdef HAVE_ARPA_INET_H -# include -#endif - -#include "ares_nameser.h" - -#include "ares.h" -#include "ares_dns.h" -#include "ares_private.h" - -int ares_parse_ns_reply( const unsigned char* abuf, int alen, - struct hostent** host ) -{ - unsigned int qdcount, ancount; - int status, i, rr_type, rr_class, rr_len; - int nameservers_num; - long len; - const unsigned char *aptr; - char* hostname, *rr_name, *rr_data, **nameservers; - struct hostent *hostent; - - /* Set *host to NULL for all failure cases. */ - *host = NULL; - - /* Give up if abuf doesn't have room for a header. */ - if ( alen < HFIXEDSZ ) - return ARES_EBADRESP; - - /* Fetch the question and answer count from the header. */ - qdcount = DNS_HEADER_QDCOUNT( abuf ); - ancount = DNS_HEADER_ANCOUNT( abuf ); - if ( qdcount != 1 ) - return ARES_EBADRESP; - - /* Expand the name from the question, and skip past the question. */ - aptr = abuf + HFIXEDSZ; - status = ares__expand_name_for_response( aptr, abuf, alen, &hostname, &len, 0); - if ( status != ARES_SUCCESS ) - return status; - if ( aptr + len + QFIXEDSZ > abuf + alen ) - { - ares_free( hostname ); - return ARES_EBADRESP; - } - aptr += len + QFIXEDSZ; - - /* Allocate nameservers array; ancount gives an upper bound */ - nameservers = ares_malloc( ( ancount + 1 ) * sizeof( char * ) ); - if ( !nameservers ) - { - ares_free( hostname ); - return ARES_ENOMEM; - } - nameservers_num = 0; - - /* Examine each answer resource record (RR) in turn. */ - for ( i = 0; i < ( int ) ancount; i++ ) - { - /* Decode the RR up to the data field. */ - status = ares__expand_name_for_response( aptr, abuf, alen, &rr_name, &len, 0); - if ( status != ARES_SUCCESS ) - break; - aptr += len; - if ( aptr + RRFIXEDSZ > abuf + alen ) - { - status = ARES_EBADRESP; - ares_free(rr_name); - break; - } - rr_type = DNS_RR_TYPE( aptr ); - rr_class = DNS_RR_CLASS( aptr ); - rr_len = DNS_RR_LEN( aptr ); - aptr += RRFIXEDSZ; - if (aptr + rr_len > abuf + alen) - { - ares_free(rr_name); - status = ARES_EBADRESP; - break; - } - - if ( rr_class == C_IN && rr_type == T_NS ) - { - /* Decode the RR data and add it to the nameservers list */ - status = ares__expand_name_for_response( aptr, abuf, alen, &rr_data, - &len, 1); - if ( status != ARES_SUCCESS ) - { - ares_free(rr_name); - break; - } - - nameservers[nameservers_num] = ares_malloc(strlen(rr_data)+1); - - if (nameservers[nameservers_num]==NULL) - { - ares_free(rr_name); - ares_free(rr_data); - status=ARES_ENOMEM; - break; - } - strcpy(nameservers[nameservers_num],rr_data); - ares_free(rr_data); - - nameservers_num++; - } - - ares_free( rr_name ); - - aptr += rr_len; - if ( aptr > abuf + alen ) - { /* LCOV_EXCL_START: already checked above */ - status = ARES_EBADRESP; - break; - } /* LCOV_EXCL_STOP */ - } - - if ( status == ARES_SUCCESS && nameservers_num == 0 ) - { - status = ARES_ENODATA; - } - if ( status == ARES_SUCCESS ) - { - /* We got our answer. Allocate memory to build the host entry. */ - nameservers[nameservers_num] = NULL; - hostent = ares_malloc( sizeof( struct hostent ) ); - if ( hostent ) - { - hostent->h_addr_list = ares_malloc( 1 * sizeof( char * ) ); - if ( hostent->h_addr_list ) - { - /* Fill in the hostent and return successfully. */ - hostent->h_name = hostname; - hostent->h_aliases = nameservers; - hostent->h_addrtype = AF_INET; - hostent->h_length = sizeof( struct in_addr ); - hostent->h_addr_list[0] = NULL; - *host = hostent; - return ARES_SUCCESS; - } - ares_free( hostent ); - } - status = ARES_ENOMEM; - } - for ( i = 0; i < nameservers_num; i++ ) - ares_free( nameservers[i] ); - ares_free( nameservers ); - ares_free( hostname ); - return status; -} diff --git a/lib/c-ares-1.19.1/src/lib/ares_parse_ptr_reply.c b/lib/c-ares-1.19.1/src/lib/ares_parse_ptr_reply.c deleted file mode 100644 index ae78edf1951..00000000000 --- a/lib/c-ares-1.19.1/src/lib/ares_parse_ptr_reply.c +++ /dev/null @@ -1,228 +0,0 @@ - -/* Copyright 1998 by the Massachusetts Institute of Technology. - * - * 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. - */ - -#include "ares_setup.h" - -#ifdef HAVE_NETINET_IN_H -# include -#endif -#ifdef HAVE_NETDB_H -# include -#endif - -#include "ares_nameser.h" - -#ifdef HAVE_STRINGS_H -# include -#endif - -#include "ares.h" -#include "ares_dns.h" -#include "ares_nowarn.h" -#include "ares_private.h" - -int ares_parse_ptr_reply(const unsigned char *abuf, int alen, const void *addr, - int addrlen, int family, struct hostent **host) -{ - unsigned int qdcount, ancount; - int status, i, rr_type, rr_class, rr_len; - long len; - const unsigned char *aptr; - char *ptrname, *hostname, *rr_name, *rr_data; - struct hostent *hostent = NULL; - int aliascnt = 0; - int alias_alloc = 8; - char ** aliases; - size_t rr_data_len; - - /* Set *host to NULL for all failure cases. */ - *host = NULL; - - /* Give up if abuf doesn't have room for a header. */ - if (alen < HFIXEDSZ) - return ARES_EBADRESP; - - /* Fetch the question and answer count from the header. */ - qdcount = DNS_HEADER_QDCOUNT(abuf); - ancount = DNS_HEADER_ANCOUNT(abuf); - if (qdcount != 1) - return ARES_EBADRESP; - - /* Expand the name from the question, and skip past the question. */ - aptr = abuf + HFIXEDSZ; - status = ares__expand_name_for_response(aptr, abuf, alen, &ptrname, &len, 0); - if (status != ARES_SUCCESS) - return status; - if (aptr + len + QFIXEDSZ > abuf + alen) - { - ares_free(ptrname); - return ARES_EBADRESP; - } - aptr += len + QFIXEDSZ; - - /* Examine each answer resource record (RR) in turn. */ - hostname = NULL; - aliases = ares_malloc(alias_alloc * sizeof(char *)); - if (!aliases) - { - ares_free(ptrname); - return ARES_ENOMEM; - } - for (i = 0; i < (int)ancount; i++) - { - /* Decode the RR up to the data field. */ - status = ares__expand_name_for_response(aptr, abuf, alen, &rr_name, &len, 0); - if (status != ARES_SUCCESS) - break; - aptr += len; - if (aptr + RRFIXEDSZ > abuf + alen) - { - ares_free(rr_name); - status = ARES_EBADRESP; - break; - } - rr_type = DNS_RR_TYPE(aptr); - rr_class = DNS_RR_CLASS(aptr); - rr_len = DNS_RR_LEN(aptr); - aptr += RRFIXEDSZ; - if (aptr + rr_len > abuf + alen) - { - ares_free(rr_name); - status = ARES_EBADRESP; - break; - } - - if (rr_class == C_IN && rr_type == T_PTR - && strcasecmp(rr_name, ptrname) == 0) - { - /* Decode the RR data and set hostname to it. */ - status = ares__expand_name_for_response(aptr, abuf, alen, &rr_data, - &len, 1); - if (status != ARES_SUCCESS) - { - ares_free(rr_name); - break; - } - if (hostname) - ares_free(hostname); - hostname = rr_data; - rr_data_len = strlen(rr_data)+1; - aliases[aliascnt] = ares_malloc(rr_data_len * sizeof(char)); - if (!aliases[aliascnt]) - { - ares_free(rr_name); - status = ARES_ENOMEM; - break; - } - strncpy(aliases[aliascnt], rr_data, rr_data_len); - aliascnt++; - if (aliascnt >= alias_alloc) { - char **ptr; - alias_alloc *= 2; - ptr = ares_realloc(aliases, alias_alloc * sizeof(char *)); - if(!ptr) { - ares_free(rr_name); - status = ARES_ENOMEM; - break; - } - aliases = ptr; - } - } - - if (rr_class == C_IN && rr_type == T_CNAME) - { - /* Decode the RR data and replace ptrname with it. */ - status = ares__expand_name_for_response(aptr, abuf, alen, &rr_data, - &len, 1); - if (status != ARES_SUCCESS) - { - ares_free(rr_name); - break; - } - ares_free(ptrname); - ptrname = rr_data; - } - - ares_free(rr_name); - aptr += rr_len; - if (aptr > abuf + alen) - { /* LCOV_EXCL_START: already checked above */ - status = ARES_EBADRESP; - break; - } /* LCOV_EXCL_STOP */ - } - - if (status == ARES_SUCCESS && !hostname) - status = ARES_ENODATA; - if (status == ARES_SUCCESS) - { - /* If we don't reach the end, we must have failed due to out of memory */ - status = ARES_ENOMEM; - - /* We got our answer. Allocate memory to build the host entry. */ - hostent = ares_malloc(sizeof(*hostent)); - if (!hostent) - goto fail; - - /* If we don't memset here, cleanups may fail */ - memset(hostent, 0, sizeof(*hostent)); - - hostent->h_addr_list = ares_malloc(2 * sizeof(char *)); - if (!hostent->h_addr_list) - goto fail; - - - if (addr && addrlen) { - hostent->h_addr_list[0] = ares_malloc(addrlen); - if (!hostent->h_addr_list[0]) - goto fail; - } else { - hostent->h_addr_list[0] = NULL; - } - - hostent->h_aliases = ares_malloc((aliascnt+1) * sizeof (char *)); - if (!hostent->h_aliases) - goto fail; - - /* Fill in the hostent and return successfully. */ - hostent->h_name = hostname; - for (i=0 ; ih_aliases[i] = aliases[i]; - hostent->h_aliases[aliascnt] = NULL; - hostent->h_addrtype = aresx_sitoss(family); - hostent->h_length = aresx_sitoss(addrlen); - if (addr && addrlen) - memcpy(hostent->h_addr_list[0], addr, addrlen); - hostent->h_addr_list[1] = NULL; - *host = hostent; - ares_free(aliases); - ares_free(ptrname); - - return ARES_SUCCESS; - } - -fail: - ares_free_hostent(hostent); - - for (i=0 ; i - * - * 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. - */ - -#include "ares_setup.h" - -#ifdef HAVE_NETINET_IN_H -# include -#endif -#ifdef HAVE_NETDB_H -# include -#endif -#ifdef HAVE_ARPA_INET_H -# include -#endif - -#include "ares_nameser.h" - -#include "ares.h" -#include "ares_dns.h" -#include "ares_data.h" -#include "ares_private.h" - -int -ares_parse_soa_reply(const unsigned char *abuf, int alen, - struct ares_soa_reply **soa_out) -{ - const unsigned char *aptr; - long len; - char *qname = NULL, *rr_name = NULL; - struct ares_soa_reply *soa = NULL; - int qdcount, ancount, qclass; - int status, i, rr_type, rr_class, rr_len; - - if (alen < HFIXEDSZ) - return ARES_EBADRESP; - - /* parse message header */ - qdcount = DNS_HEADER_QDCOUNT(abuf); - ancount = DNS_HEADER_ANCOUNT(abuf); - - if (qdcount != 1) - return ARES_EBADRESP; - if (ancount == 0) - return ARES_EBADRESP; - - aptr = abuf + HFIXEDSZ; - - /* query name */ - status = ares__expand_name_for_response(aptr, abuf, alen, &qname, &len, 0); - if (status != ARES_SUCCESS) - goto failed_stat; - - if (alen <= len + HFIXEDSZ + 1) - goto failed; - aptr += len; - - qclass = DNS_QUESTION_TYPE(aptr); - - /* skip qtype & qclass */ - if (aptr + QFIXEDSZ > abuf + alen) - goto failed; - aptr += QFIXEDSZ; - - /* qclass of SOA with multiple answers */ - if (qclass == T_SOA && ancount > 1) - goto failed; - - /* examine all the records, break and return if found soa */ - for (i = 0; i < ancount; i++) - { - rr_name = NULL; - status = ares__expand_name_for_response (aptr, abuf, alen, &rr_name, &len, 0); - if (status != ARES_SUCCESS) - { - ares_free(rr_name); - goto failed_stat; - } - - aptr += len; - if ( aptr + RRFIXEDSZ > abuf + alen ) - { - ares_free(rr_name); - status = ARES_EBADRESP; - goto failed_stat; - } - rr_type = DNS_RR_TYPE( aptr ); - rr_class = DNS_RR_CLASS( aptr ); - rr_len = DNS_RR_LEN( aptr ); - aptr += RRFIXEDSZ; - if (aptr + rr_len > abuf + alen) - { - ares_free(rr_name); - status = ARES_EBADRESP; - goto failed_stat; - } - if ( rr_class == C_IN && rr_type == T_SOA ) - { - /* allocate result struct */ - soa = ares_malloc_data(ARES_DATATYPE_SOA_REPLY); - if (!soa) - { - ares_free(rr_name); - status = ARES_ENOMEM; - goto failed_stat; - } - - /* nsname */ - status = ares__expand_name_for_response(aptr, abuf, alen, &soa->nsname, - &len, 0); - if (status != ARES_SUCCESS) - { - ares_free(rr_name); - goto failed_stat; - } - aptr += len; - - /* hostmaster */ - status = ares__expand_name_for_response(aptr, abuf, alen, - &soa->hostmaster, &len, 0); - if (status != ARES_SUCCESS) - { - ares_free(rr_name); - goto failed_stat; - } - aptr += len; - - /* integer fields */ - if (aptr + 5 * 4 > abuf + alen) - { - ares_free(rr_name); - goto failed; - } - soa->serial = DNS__32BIT(aptr + 0 * 4); - soa->refresh = DNS__32BIT(aptr + 1 * 4); - soa->retry = DNS__32BIT(aptr + 2 * 4); - soa->expire = DNS__32BIT(aptr + 3 * 4); - soa->minttl = DNS__32BIT(aptr + 4 * 4); - - ares_free(qname); - ares_free(rr_name); - - *soa_out = soa; - - return ARES_SUCCESS; - } - aptr += rr_len; - - ares_free(rr_name); - - if (aptr > abuf + alen) - goto failed_stat; - } - /* no SOA record found */ - status = ARES_EBADRESP; - goto failed_stat; -failed: - status = ARES_EBADRESP; - -failed_stat: - if (soa) - ares_free_data(soa); - if (qname) - ares_free(qname); - return status; -} diff --git a/lib/c-ares-1.19.1/src/lib/ares_parse_srv_reply.c b/lib/c-ares-1.19.1/src/lib/ares_parse_srv_reply.c deleted file mode 100644 index 0d8f4d2098b..00000000000 --- a/lib/c-ares-1.19.1/src/lib/ares_parse_srv_reply.c +++ /dev/null @@ -1,168 +0,0 @@ - -/* Copyright 1998 by the Massachusetts Institute of Technology. - * Copyright (C) 2009 by Jakub Hrozek - * - * 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. - */ - -#include "ares_setup.h" - -#ifdef HAVE_NETINET_IN_H -# include -#endif -#ifdef HAVE_NETDB_H -# include -#endif -#ifdef HAVE_ARPA_INET_H -# include -#endif - -#include "ares_nameser.h" - -#include "ares.h" -#include "ares_dns.h" -#include "ares_data.h" -#include "ares_private.h" - -int -ares_parse_srv_reply (const unsigned char *abuf, int alen, - struct ares_srv_reply **srv_out) -{ - unsigned int qdcount, ancount, i; - const unsigned char *aptr, *vptr; - int status, rr_type, rr_class, rr_len; - long len; - char *hostname = NULL, *rr_name = NULL; - struct ares_srv_reply *srv_head = NULL; - struct ares_srv_reply *srv_last = NULL; - struct ares_srv_reply *srv_curr; - - /* Set *srv_out to NULL for all failure cases. */ - *srv_out = NULL; - - /* Give up if abuf doesn't have room for a header. */ - if (alen < HFIXEDSZ) - return ARES_EBADRESP; - - /* Fetch the question and answer count from the header. */ - qdcount = DNS_HEADER_QDCOUNT (abuf); - ancount = DNS_HEADER_ANCOUNT (abuf); - if (qdcount != 1) - return ARES_EBADRESP; - if (ancount == 0) - return ARES_ENODATA; - - /* Expand the name from the question, and skip past the question. */ - aptr = abuf + HFIXEDSZ; - status = ares_expand_name (aptr, abuf, alen, &hostname, &len); - if (status != ARES_SUCCESS) - return status; - - if (aptr + len + QFIXEDSZ > abuf + alen) - { - ares_free (hostname); - return ARES_EBADRESP; - } - aptr += len + QFIXEDSZ; - - /* Examine each answer resource record (RR) in turn. */ - for (i = 0; i < ancount; i++) - { - /* Decode the RR up to the data field. */ - status = ares_expand_name (aptr, abuf, alen, &rr_name, &len); - if (status != ARES_SUCCESS) - { - break; - } - aptr += len; - if (aptr + RRFIXEDSZ > abuf + alen) - { - status = ARES_EBADRESP; - break; - } - rr_type = DNS_RR_TYPE (aptr); - rr_class = DNS_RR_CLASS (aptr); - rr_len = DNS_RR_LEN (aptr); - aptr += RRFIXEDSZ; - if (aptr + rr_len > abuf + alen) - { - status = ARES_EBADRESP; - break; - } - - /* Check if we are really looking at a SRV record */ - if (rr_class == C_IN && rr_type == T_SRV) - { - /* parse the SRV record itself */ - if (rr_len < 6) - { - status = ARES_EBADRESP; - break; - } - - /* Allocate storage for this SRV answer appending it to the list */ - srv_curr = ares_malloc_data(ARES_DATATYPE_SRV_REPLY); - if (!srv_curr) - { - status = ARES_ENOMEM; - break; - } - if (srv_last) - { - srv_last->next = srv_curr; - } - else - { - srv_head = srv_curr; - } - srv_last = srv_curr; - - vptr = aptr; - srv_curr->priority = DNS__16BIT(vptr); - vptr += sizeof(unsigned short); - srv_curr->weight = DNS__16BIT(vptr); - vptr += sizeof(unsigned short); - srv_curr->port = DNS__16BIT(vptr); - vptr += sizeof(unsigned short); - - status = ares_expand_name (vptr, abuf, alen, &srv_curr->host, &len); - if (status != ARES_SUCCESS) - break; - } - - /* Don't lose memory in the next iteration */ - ares_free (rr_name); - rr_name = NULL; - - /* Move on to the next record */ - aptr += rr_len; - } - - if (hostname) - ares_free (hostname); - if (rr_name) - ares_free (rr_name); - - /* clean up on error */ - if (status != ARES_SUCCESS) - { - if (srv_head) - ares_free_data (srv_head); - return status; - } - - /* everything looks fine, return the data */ - *srv_out = srv_head; - - return ARES_SUCCESS; -} diff --git a/lib/c-ares-1.19.1/src/lib/ares_parse_txt_reply.c b/lib/c-ares-1.19.1/src/lib/ares_parse_txt_reply.c deleted file mode 100644 index 6848a092bbc..00000000000 --- a/lib/c-ares-1.19.1/src/lib/ares_parse_txt_reply.c +++ /dev/null @@ -1,214 +0,0 @@ - -/* Copyright 1998 by the Massachusetts Institute of Technology. - * Copyright (C) 2009 by Jakub Hrozek - * - * 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. - */ - -#include "ares_setup.h" - -#ifdef HAVE_NETINET_IN_H -# include -#endif -#ifdef HAVE_NETDB_H -# include -#endif -#ifdef HAVE_ARPA_INET_H -# include -#endif - -#include "ares_nameser.h" - -#ifdef HAVE_STRINGS_H -# include -#endif - -#include "ares.h" -#include "ares_dns.h" -#include "ares_data.h" -#include "ares_private.h" - -static int -ares__parse_txt_reply (const unsigned char *abuf, int alen, - int ex, void **txt_out) -{ - size_t substr_len; - unsigned int qdcount, ancount, i; - const unsigned char *aptr; - const unsigned char *strptr; - int status, rr_type, rr_class, rr_len; - long len; - char *hostname = NULL, *rr_name = NULL; - struct ares_txt_ext *txt_head = NULL; - struct ares_txt_ext *txt_last = NULL; - struct ares_txt_ext *txt_curr; - - /* Set *txt_out to NULL for all failure cases. */ - *txt_out = NULL; - - /* Give up if abuf doesn't have room for a header. */ - if (alen < HFIXEDSZ) - return ARES_EBADRESP; - - /* Fetch the question and answer count from the header. */ - qdcount = DNS_HEADER_QDCOUNT (abuf); - ancount = DNS_HEADER_ANCOUNT (abuf); - if (qdcount != 1) - return ARES_EBADRESP; - if (ancount == 0) - return ARES_ENODATA; - - /* Expand the name from the question, and skip past the question. */ - aptr = abuf + HFIXEDSZ; - status = ares_expand_name (aptr, abuf, alen, &hostname, &len); - if (status != ARES_SUCCESS) - return status; - - if (aptr + len + QFIXEDSZ > abuf + alen) - { - ares_free (hostname); - return ARES_EBADRESP; - } - aptr += len + QFIXEDSZ; - - /* Examine each answer resource record (RR) in turn. */ - for (i = 0; i < ancount; i++) - { - /* Decode the RR up to the data field. */ - status = ares_expand_name (aptr, abuf, alen, &rr_name, &len); - if (status != ARES_SUCCESS) - { - break; - } - aptr += len; - if (aptr + RRFIXEDSZ > abuf + alen) - { - status = ARES_EBADRESP; - break; - } - rr_type = DNS_RR_TYPE (aptr); - rr_class = DNS_RR_CLASS (aptr); - rr_len = DNS_RR_LEN (aptr); - aptr += RRFIXEDSZ; - if (aptr + rr_len > abuf + alen) - { - status = ARES_EBADRESP; - break; - } - - /* Check if we are really looking at a TXT record */ - if ((rr_class == C_IN || rr_class == C_CHAOS) && rr_type == T_TXT) - { - /* - * There may be multiple substrings in a single TXT record. Each - * substring may be up to 255 characters in length, with a - * "length byte" indicating the size of the substring payload. - * RDATA contains both the length-bytes and payloads of all - * substrings contained therein. - */ - - strptr = aptr; - while (strptr < (aptr + rr_len)) - { - substr_len = (unsigned char)*strptr; - if (strptr + substr_len + 1 > aptr + rr_len) - { - status = ARES_EBADRESP; - break; - } - - /* Allocate storage for this TXT answer appending it to the list */ - txt_curr = ares_malloc_data(ex ? ARES_DATATYPE_TXT_EXT : - ARES_DATATYPE_TXT_REPLY); - if (!txt_curr) - { - status = ARES_ENOMEM; - break; - } - if (txt_last) - { - txt_last->next = txt_curr; - } - else - { - txt_head = txt_curr; - } - txt_last = txt_curr; - - if (ex) - txt_curr->record_start = (strptr == aptr); - txt_curr->length = substr_len; - txt_curr->txt = ares_malloc (substr_len + 1/* Including null byte */); - if (txt_curr->txt == NULL) - { - status = ARES_ENOMEM; - break; - } - - ++strptr; - memcpy ((char *) txt_curr->txt, strptr, substr_len); - - /* Make sure we NULL-terminate */ - txt_curr->txt[substr_len] = 0; - - strptr += substr_len; - } - } - - /* Propagate any failures */ - if (status != ARES_SUCCESS) - { - break; - } - - /* Don't lose memory in the next iteration */ - ares_free (rr_name); - rr_name = NULL; - - /* Move on to the next record */ - aptr += rr_len; - } - - if (hostname) - ares_free (hostname); - if (rr_name) - ares_free (rr_name); - - /* clean up on error */ - if (status != ARES_SUCCESS) - { - if (txt_head) - ares_free_data (txt_head); - return status; - } - - /* everything looks fine, return the data */ - *txt_out = txt_head; - - return ARES_SUCCESS; -} - -int -ares_parse_txt_reply (const unsigned char *abuf, int alen, - struct ares_txt_reply **txt_out) -{ - return ares__parse_txt_reply(abuf, alen, 0, (void **) txt_out); -} - - -int -ares_parse_txt_reply_ext (const unsigned char *abuf, int alen, - struct ares_txt_ext **txt_out) -{ - return ares__parse_txt_reply(abuf, alen, 1, (void **) txt_out); -} diff --git a/lib/c-ares-1.19.1/src/lib/ares_parse_uri_reply.c b/lib/c-ares-1.19.1/src/lib/ares_parse_uri_reply.c deleted file mode 100644 index d79b5c4d85c..00000000000 --- a/lib/c-ares-1.19.1/src/lib/ares_parse_uri_reply.c +++ /dev/null @@ -1,184 +0,0 @@ - -/* Copyright 1998 by the Massachusetts Institute of Technology. - * Copyright (C) 2009 by Jakub Hrozek - * - * 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. - */ - -#include "ares_setup.h" - -#ifdef HAVE_NETINET_IN_H -# include -#endif -#ifdef HAVE_NETDB_H -# include -#endif -#ifdef HAVE_ARPA_INET_H -# include -#endif - -#include "ares_nameser.h" - -#include "ares.h" -#include "ares_dns.h" -#include "ares_data.h" -#include "ares_private.h" - -/* AIX portability check */ -#ifndef T_URI -# define T_URI 256 /* uri selection */ -#endif - -int -ares_parse_uri_reply (const unsigned char *abuf, int alen, - struct ares_uri_reply **uri_out) -{ - unsigned int qdcount, ancount, i; - const unsigned char *aptr, *vptr; - int status, rr_type, rr_class, rr_len, rr_ttl; - long len; - char *uri_str = NULL, *rr_name = NULL; - struct ares_uri_reply *uri_head = NULL; - struct ares_uri_reply *uri_last = NULL; - struct ares_uri_reply *uri_curr; - - /* Set *uri_out to NULL for all failure cases. */ - *uri_out = NULL; - - /* Give up if abuf doesn't have room for a header. */ - if (alen < HFIXEDSZ){ - return ARES_EBADRESP; - } - - /* Fetch the question and answer count from the header. */ - qdcount = DNS_HEADER_QDCOUNT (abuf); - ancount = DNS_HEADER_ANCOUNT (abuf); - if (qdcount != 1) { - return ARES_EBADRESP; - } - if (ancount == 0) { - return ARES_ENODATA; - } - /* Expand the name from the question, and skip past the question. */ - aptr = abuf + HFIXEDSZ; - - status = ares_expand_name (aptr, abuf, alen, &uri_str, &len); - if (status != ARES_SUCCESS){ - return status; - } - if (aptr + len + QFIXEDSZ > abuf + alen) - { - ares_free (uri_str); - return ARES_EBADRESP; - } - aptr += len + QFIXEDSZ; - - /* Examine each answer resource record (RR) in turn. */ - for (i = 0; i < ancount; i++) - { - /* Decode the RR up to the data field. */ - status = ares_expand_name (aptr, abuf, alen, &rr_name, &len); - if (status != ARES_SUCCESS) - { - break; - } - aptr += len; - if (aptr + RRFIXEDSZ > abuf + alen) - { - status = ARES_EBADRESP; - break; - } - - rr_type = DNS_RR_TYPE (aptr); - rr_class = DNS_RR_CLASS (aptr); - rr_ttl = DNS_RR_TTL(aptr); - rr_len = DNS_RR_LEN (aptr); - aptr += RRFIXEDSZ; - - if (aptr + rr_len > abuf + alen) - { - status = ARES_EBADRESP; - break; - } - - /* Check if we are really looking at a URI record */ - if (rr_class == C_IN && rr_type == T_URI) - { - /* parse the URI record itself */ - if (rr_len < 5) - { - status = ARES_EBADRESP; - break; - } - /* Allocate storage for this URI answer appending it to the list */ - uri_curr = ares_malloc_data(ARES_DATATYPE_URI_REPLY); - if (!uri_curr) - { - status = ARES_ENOMEM; - break; - } - if (uri_last) - { - uri_last->next = uri_curr; - } - else - { - uri_head = uri_curr; - } - uri_last = uri_curr; - - vptr = aptr; - uri_curr->priority = DNS__16BIT(vptr); - vptr += sizeof(unsigned short); - uri_curr->weight = DNS__16BIT(vptr); - vptr += sizeof(unsigned short); - uri_curr->uri = (char *)ares_malloc(rr_len-3); - if (!uri_curr->uri) - { - status = ARES_ENOMEM; - break; - } - uri_curr->uri = strncpy(uri_curr->uri, (const char *)vptr, rr_len-4); - uri_curr->uri[rr_len-4]='\0'; - uri_curr->ttl = rr_ttl; - - if (status != ARES_SUCCESS) - break; - } - - /* Don't lose memory in the next iteration */ - ares_free (rr_name); - rr_name = NULL; - - /* Move on to the next record */ - aptr += rr_len; - } - - if (uri_str) - ares_free (uri_str); - if (rr_name) - ares_free (rr_name); - - /* clean up on error */ - if (status != ARES_SUCCESS) - { - if (uri_head) - ares_free_data (uri_head); - return status; - } - - /* everything looks fine, return the data */ - *uri_out = uri_head; - - return ARES_SUCCESS; -} diff --git a/lib/c-ares-1.19.1/src/lib/ares_platform.c b/lib/c-ares-1.19.1/src/lib/ares_platform.c deleted file mode 100644 index 6c749dccb24..00000000000 --- a/lib/c-ares-1.19.1/src/lib/ares_platform.c +++ /dev/null @@ -1,11042 +0,0 @@ - - -/* Copyright 1998 by the Massachusetts Institute of Technology. - * Copyright (C) 2004 - 2011 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. - */ - -#include "ares_setup.h" - -#include "ares.h" -#include "ares_platform.h" -#include "ares_nowarn.h" -#include "ares_private.h" - -#if defined(WIN32) && !defined(MSDOS) - -#define V_PLATFORM_WIN32s 0 -#define V_PLATFORM_WIN32_WINDOWS 1 -#define V_PLATFORM_WIN32_NT 2 -#define V_PLATFORM_WIN32_CE 3 - -win_platform ares__getplatform(void) -{ - OSVERSIONINFOEX OsvEx; - - memset(&OsvEx, 0, sizeof(OsvEx)); - OsvEx.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); -#ifdef _MSC_VER -#pragma warning(push) -#pragma warning(disable:4996) /* warning C4996: 'GetVersionExW': was declared deprecated */ -#endif - if (!GetVersionEx((void *)&OsvEx)) - { - memset(&OsvEx, 0, sizeof(OsvEx)); - OsvEx.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); - if (!GetVersionEx((void *)&OsvEx)) - return WIN_UNKNOWN; - } -#ifdef _MSC_VER -#pragma warning(pop) -#endif - - switch(OsvEx.dwPlatformId) - { - case V_PLATFORM_WIN32s: - return WIN_3X; - - case V_PLATFORM_WIN32_WINDOWS: - return WIN_9X; - - case V_PLATFORM_WIN32_NT: - return WIN_NT; - - case V_PLATFORM_WIN32_CE: - return WIN_CE; - - default: - return WIN_UNKNOWN; - } -} - -#endif /* WIN32 && ! MSDOS */ - -#if defined(_WIN32_WCE) - -/* IANA Well Known Ports are in range 0-1023 */ -#define USE_IANA_WELL_KNOWN_PORTS 1 - -/* IANA Registered Ports are in range 1024-49151 */ -#define USE_IANA_REGISTERED_PORTS 1 - -struct pvt_servent { - char *s_name; - char **s_aliases; - unsigned short s_port; - char *s_proto; -}; - -/* - * Ref: http://www.iana.org/assignments/port-numbers - */ - -static struct pvt_servent IANAports[] = { -#ifdef USE_IANA_WELL_KNOWN_PORTS -{"tcpmux", {NULL}, 1, "tcp"}, -{"tcpmux", {NULL}, 1, "udp"}, -{"compressnet", {NULL}, 2, "tcp"}, -{"compressnet", {NULL}, 2, "udp"}, -{"compressnet", {NULL}, 3, "tcp"}, -{"compressnet", {NULL}, 3, "udp"}, -{"rje", {NULL}, 5, "tcp"}, -{"rje", {NULL}, 5, "udp"}, -{"echo", {NULL}, 7, "tcp"}, -{"echo", {NULL}, 7, "udp"}, -{"discard", {NULL}, 9, "tcp"}, -{"discard", {NULL}, 9, "udp"}, -{"discard", {NULL}, 9, "sctp"}, -{"discard", {NULL}, 9, "dccp"}, -{"systat", {NULL}, 11, "tcp"}, -{"systat", {NULL}, 11, "udp"}, -{"daytime", {NULL}, 13, "tcp"}, -{"daytime", {NULL}, 13, "udp"}, -{"qotd", {NULL}, 17, "tcp"}, -{"qotd", {NULL}, 17, "udp"}, -{"msp", {NULL}, 18, "tcp"}, -{"msp", {NULL}, 18, "udp"}, -{"chargen", {NULL}, 19, "tcp"}, -{"chargen", {NULL}, 19, "udp"}, -{"ftp-data", {NULL}, 20, "tcp"}, -{"ftp-data", {NULL}, 20, "udp"}, -{"ftp-data", {NULL}, 20, "sctp"}, -{"ftp", {NULL}, 21, "tcp"}, -{"ftp", {NULL}, 21, "udp"}, -{"ftp", {NULL}, 21, "sctp"}, -{"ssh", {NULL}, 22, "tcp"}, -{"ssh", {NULL}, 22, "udp"}, -{"ssh", {NULL}, 22, "sctp"}, -{"telnet", {NULL}, 23, "tcp"}, -{"telnet", {NULL}, 23, "udp"}, -{"smtp", {NULL}, 25, "tcp"}, -{"smtp", {NULL}, 25, "udp"}, -{"nsw-fe", {NULL}, 27, "tcp"}, -{"nsw-fe", {NULL}, 27, "udp"}, -{"msg-icp", {NULL}, 29, "tcp"}, -{"msg-icp", {NULL}, 29, "udp"}, -{"msg-auth", {NULL}, 31, "tcp"}, -{"msg-auth", {NULL}, 31, "udp"}, -{"dsp", {NULL}, 33, "tcp"}, -{"dsp", {NULL}, 33, "udp"}, -{"time", {NULL}, 37, "tcp"}, -{"time", {NULL}, 37, "udp"}, -{"rap", {NULL}, 38, "tcp"}, -{"rap", {NULL}, 38, "udp"}, -{"rlp", {NULL}, 39, "tcp"}, -{"rlp", {NULL}, 39, "udp"}, -{"graphics", {NULL}, 41, "tcp"}, -{"graphics", {NULL}, 41, "udp"}, -{"name", {NULL}, 42, "tcp"}, -{"name", {NULL}, 42, "udp"}, -{"nameserver", {NULL}, 42, "tcp"}, -{"nameserver", {NULL}, 42, "udp"}, -{"nicname", {NULL}, 43, "tcp"}, -{"nicname", {NULL}, 43, "udp"}, -{"mpm-flags", {NULL}, 44, "tcp"}, -{"mpm-flags", {NULL}, 44, "udp"}, -{"mpm", {NULL}, 45, "tcp"}, -{"mpm", {NULL}, 45, "udp"}, -{"mpm-snd", {NULL}, 46, "tcp"}, -{"mpm-snd", {NULL}, 46, "udp"}, -{"ni-ftp", {NULL}, 47, "tcp"}, -{"ni-ftp", {NULL}, 47, "udp"}, -{"auditd", {NULL}, 48, "tcp"}, -{"auditd", {NULL}, 48, "udp"}, -{"tacacs", {NULL}, 49, "tcp"}, -{"tacacs", {NULL}, 49, "udp"}, -{"re-mail-ck", {NULL}, 50, "tcp"}, -{"re-mail-ck", {NULL}, 50, "udp"}, -{"la-maint", {NULL}, 51, "tcp"}, -{"la-maint", {NULL}, 51, "udp"}, -{"xns-time", {NULL}, 52, "tcp"}, -{"xns-time", {NULL}, 52, "udp"}, -{"domain", {NULL}, 53, "tcp"}, -{"domain", {NULL}, 53, "udp"}, -{"xns-ch", {NULL}, 54, "tcp"}, -{"xns-ch", {NULL}, 54, "udp"}, -{"isi-gl", {NULL}, 55, "tcp"}, -{"isi-gl", {NULL}, 55, "udp"}, -{"xns-auth", {NULL}, 56, "tcp"}, -{"xns-auth", {NULL}, 56, "udp"}, -{"xns-mail", {NULL}, 58, "tcp"}, -{"xns-mail", {NULL}, 58, "udp"}, -{"ni-mail", {NULL}, 61, "tcp"}, -{"ni-mail", {NULL}, 61, "udp"}, -{"acas", {NULL}, 62, "tcp"}, -{"acas", {NULL}, 62, "udp"}, -{"whois++", {NULL}, 63, "tcp"}, -{"whois++", {NULL}, 63, "udp"}, -{"covia", {NULL}, 64, "tcp"}, -{"covia", {NULL}, 64, "udp"}, -{"tacacs-ds", {NULL}, 65, "tcp"}, -{"tacacs-ds", {NULL}, 65, "udp"}, -{"sql*net", {NULL}, 66, "tcp"}, -{"sql*net", {NULL}, 66, "udp"}, -{"bootps", {NULL}, 67, "tcp"}, -{"bootps", {NULL}, 67, "udp"}, -{"bootpc", {NULL}, 68, "tcp"}, -{"bootpc", {NULL}, 68, "udp"}, -{"tftp", {NULL}, 69, "tcp"}, -{"tftp", {NULL}, 69, "udp"}, -{"gopher", {NULL}, 70, "tcp"}, -{"gopher", {NULL}, 70, "udp"}, -{"netrjs-1", {NULL}, 71, "tcp"}, -{"netrjs-1", {NULL}, 71, "udp"}, -{"netrjs-2", {NULL}, 72, "tcp"}, -{"netrjs-2", {NULL}, 72, "udp"}, -{"netrjs-3", {NULL}, 73, "tcp"}, -{"netrjs-3", {NULL}, 73, "udp"}, -{"netrjs-4", {NULL}, 74, "tcp"}, -{"netrjs-4", {NULL}, 74, "udp"}, -{"deos", {NULL}, 76, "tcp"}, -{"deos", {NULL}, 76, "udp"}, -{"vettcp", {NULL}, 78, "tcp"}, -{"vettcp", {NULL}, 78, "udp"}, -{"finger", {NULL}, 79, "tcp"}, -{"finger", {NULL}, 79, "udp"}, -{"http", {NULL}, 80, "tcp"}, -{"http", {NULL}, 80, "udp"}, -{"www", {NULL}, 80, "tcp"}, -{"www", {NULL}, 80, "udp"}, -{"www-http", {NULL}, 80, "tcp"}, -{"www-http", {NULL}, 80, "udp"}, -{"http", {NULL}, 80, "sctp"}, -{"xfer", {NULL}, 82, "tcp"}, -{"xfer", {NULL}, 82, "udp"}, -{"mit-ml-dev", {NULL}, 83, "tcp"}, -{"mit-ml-dev", {NULL}, 83, "udp"}, -{"ctf", {NULL}, 84, "tcp"}, -{"ctf", {NULL}, 84, "udp"}, -{"mit-ml-dev", {NULL}, 85, "tcp"}, -{"mit-ml-dev", {NULL}, 85, "udp"}, -{"mfcobol", {NULL}, 86, "tcp"}, -{"mfcobol", {NULL}, 86, "udp"}, -{"kerberos", {NULL}, 88, "tcp"}, -{"kerberos", {NULL}, 88, "udp"}, -{"su-mit-tg", {NULL}, 89, "tcp"}, -{"su-mit-tg", {NULL}, 89, "udp"}, -{"dnsix", {NULL}, 90, "tcp"}, -{"dnsix", {NULL}, 90, "udp"}, -{"mit-dov", {NULL}, 91, "tcp"}, -{"mit-dov", {NULL}, 91, "udp"}, -{"npp", {NULL}, 92, "tcp"}, -{"npp", {NULL}, 92, "udp"}, -{"dcp", {NULL}, 93, "tcp"}, -{"dcp", {NULL}, 93, "udp"}, -{"objcall", {NULL}, 94, "tcp"}, -{"objcall", {NULL}, 94, "udp"}, -{"supdup", {NULL}, 95, "tcp"}, -{"supdup", {NULL}, 95, "udp"}, -{"dixie", {NULL}, 96, "tcp"}, -{"dixie", {NULL}, 96, "udp"}, -{"swift-rvf", {NULL}, 97, "tcp"}, -{"swift-rvf", {NULL}, 97, "udp"}, -{"tacnews", {NULL}, 98, "tcp"}, -{"tacnews", {NULL}, 98, "udp"}, -{"metagram", {NULL}, 99, "tcp"}, -{"metagram", {NULL}, 99, "udp"}, -{"newacct", {NULL}, 100, "tcp"}, -{"hostname", {NULL}, 101, "tcp"}, -{"hostname", {NULL}, 101, "udp"}, -{"iso-tsap", {NULL}, 102, "tcp"}, -{"iso-tsap", {NULL}, 102, "udp"}, -{"gppitnp", {NULL}, 103, "tcp"}, -{"gppitnp", {NULL}, 103, "udp"}, -{"acr-nema", {NULL}, 104, "tcp"}, -{"acr-nema", {NULL}, 104, "udp"}, -{"cso", {NULL}, 105, "tcp"}, -{"cso", {NULL}, 105, "udp"}, -{"csnet-ns", {NULL}, 105, "tcp"}, -{"csnet-ns", {NULL}, 105, "udp"}, -{"3com-tsmux", {NULL}, 106, "tcp"}, -{"3com-tsmux", {NULL}, 106, "udp"}, -{"rtelnet", {NULL}, 107, "tcp"}, -{"rtelnet", {NULL}, 107, "udp"}, -{"snagas", {NULL}, 108, "tcp"}, -{"snagas", {NULL}, 108, "udp"}, -{"pop2", {NULL}, 109, "tcp"}, -{"pop2", {NULL}, 109, "udp"}, -{"pop3", {NULL}, 110, "tcp"}, -{"pop3", {NULL}, 110, "udp"}, -{"sunrpc", {NULL}, 111, "tcp"}, -{"sunrpc", {NULL}, 111, "udp"}, -{"mcidas", {NULL}, 112, "tcp"}, -{"mcidas", {NULL}, 112, "udp"}, -{"ident", {NULL}, 113, "tcp"}, -{"auth", {NULL}, 113, "tcp"}, -{"auth", {NULL}, 113, "udp"}, -{"sftp", {NULL}, 115, "tcp"}, -{"sftp", {NULL}, 115, "udp"}, -{"ansanotify", {NULL}, 116, "tcp"}, -{"ansanotify", {NULL}, 116, "udp"}, -{"uucp-path", {NULL}, 117, "tcp"}, -{"uucp-path", {NULL}, 117, "udp"}, -{"sqlserv", {NULL}, 118, "tcp"}, -{"sqlserv", {NULL}, 118, "udp"}, -{"nntp", {NULL}, 119, "tcp"}, -{"nntp", {NULL}, 119, "udp"}, -{"cfdptkt", {NULL}, 120, "tcp"}, -{"cfdptkt", {NULL}, 120, "udp"}, -{"erpc", {NULL}, 121, "tcp"}, -{"erpc", {NULL}, 121, "udp"}, -{"smakynet", {NULL}, 122, "tcp"}, -{"smakynet", {NULL}, 122, "udp"}, -{"ntp", {NULL}, 123, "tcp"}, -{"ntp", {NULL}, 123, "udp"}, -{"ansatrader", {NULL}, 124, "tcp"}, -{"ansatrader", {NULL}, 124, "udp"}, -{"locus-map", {NULL}, 125, "tcp"}, -{"locus-map", {NULL}, 125, "udp"}, -{"nxedit", {NULL}, 126, "tcp"}, -{"nxedit", {NULL}, 126, "udp"}, -{"locus-con", {NULL}, 127, "tcp"}, -{"locus-con", {NULL}, 127, "udp"}, -{"gss-xlicen", {NULL}, 128, "tcp"}, -{"gss-xlicen", {NULL}, 128, "udp"}, -{"pwdgen", {NULL}, 129, "tcp"}, -{"pwdgen", {NULL}, 129, "udp"}, -{"cisco-fna", {NULL}, 130, "tcp"}, -{"cisco-fna", {NULL}, 130, "udp"}, -{"cisco-tna", {NULL}, 131, "tcp"}, -{"cisco-tna", {NULL}, 131, "udp"}, -{"cisco-sys", {NULL}, 132, "tcp"}, -{"cisco-sys", {NULL}, 132, "udp"}, -{"statsrv", {NULL}, 133, "tcp"}, -{"statsrv", {NULL}, 133, "udp"}, -{"ingres-net", {NULL}, 134, "tcp"}, -{"ingres-net", {NULL}, 134, "udp"}, -{"epmap", {NULL}, 135, "tcp"}, -{"epmap", {NULL}, 135, "udp"}, -{"profile", {NULL}, 136, "tcp"}, -{"profile", {NULL}, 136, "udp"}, -{"netbios-ns", {NULL}, 137, "tcp"}, -{"netbios-ns", {NULL}, 137, "udp"}, -{"netbios-dgm", {NULL}, 138, "tcp"}, -{"netbios-dgm", {NULL}, 138, "udp"}, -{"netbios-ssn", {NULL}, 139, "tcp"}, -{"netbios-ssn", {NULL}, 139, "udp"}, -{"emfis-data", {NULL}, 140, "tcp"}, -{"emfis-data", {NULL}, 140, "udp"}, -{"emfis-cntl", {NULL}, 141, "tcp"}, -{"emfis-cntl", {NULL}, 141, "udp"}, -{"bl-idm", {NULL}, 142, "tcp"}, -{"bl-idm", {NULL}, 142, "udp"}, -{"imap", {NULL}, 143, "tcp"}, -{"imap", {NULL}, 143, "udp"}, -{"uma", {NULL}, 144, "tcp"}, -{"uma", {NULL}, 144, "udp"}, -{"uaac", {NULL}, 145, "tcp"}, -{"uaac", {NULL}, 145, "udp"}, -{"iso-tp0", {NULL}, 146, "tcp"}, -{"iso-tp0", {NULL}, 146, "udp"}, -{"iso-ip", {NULL}, 147, "tcp"}, -{"iso-ip", {NULL}, 147, "udp"}, -{"jargon", {NULL}, 148, "tcp"}, -{"jargon", {NULL}, 148, "udp"}, -{"aed-512", {NULL}, 149, "tcp"}, -{"aed-512", {NULL}, 149, "udp"}, -{"sql-net", {NULL}, 150, "tcp"}, -{"sql-net", {NULL}, 150, "udp"}, -{"hems", {NULL}, 151, "tcp"}, -{"hems", {NULL}, 151, "udp"}, -{"bftp", {NULL}, 152, "tcp"}, -{"bftp", {NULL}, 152, "udp"}, -{"sgmp", {NULL}, 153, "tcp"}, -{"sgmp", {NULL}, 153, "udp"}, -{"netsc-prod", {NULL}, 154, "tcp"}, -{"netsc-prod", {NULL}, 154, "udp"}, -{"netsc-dev", {NULL}, 155, "tcp"}, -{"netsc-dev", {NULL}, 155, "udp"}, -{"sqlsrv", {NULL}, 156, "tcp"}, -{"sqlsrv", {NULL}, 156, "udp"}, -{"knet-cmp", {NULL}, 157, "tcp"}, -{"knet-cmp", {NULL}, 157, "udp"}, -{"pcmail-srv", {NULL}, 158, "tcp"}, -{"pcmail-srv", {NULL}, 158, "udp"}, -{"nss-routing", {NULL}, 159, "tcp"}, -{"nss-routing", {NULL}, 159, "udp"}, -{"sgmp-traps", {NULL}, 160, "tcp"}, -{"sgmp-traps", {NULL}, 160, "udp"}, -{"snmp", {NULL}, 161, "tcp"}, -{"snmp", {NULL}, 161, "udp"}, -{"snmptrap", {NULL}, 162, "tcp"}, -{"snmptrap", {NULL}, 162, "udp"}, -{"cmip-man", {NULL}, 163, "tcp"}, -{"cmip-man", {NULL}, 163, "udp"}, -{"cmip-agent", {NULL}, 164, "tcp"}, -{"cmip-agent", {NULL}, 164, "udp"}, -{"xns-courier", {NULL}, 165, "tcp"}, -{"xns-courier", {NULL}, 165, "udp"}, -{"s-net", {NULL}, 166, "tcp"}, -{"s-net", {NULL}, 166, "udp"}, -{"namp", {NULL}, 167, "tcp"}, -{"namp", {NULL}, 167, "udp"}, -{"rsvd", {NULL}, 168, "tcp"}, -{"rsvd", {NULL}, 168, "udp"}, -{"send", {NULL}, 169, "tcp"}, -{"send", {NULL}, 169, "udp"}, -{"print-srv", {NULL}, 170, "tcp"}, -{"print-srv", {NULL}, 170, "udp"}, -{"multiplex", {NULL}, 171, "tcp"}, -{"multiplex", {NULL}, 171, "udp"}, -{"cl/1", {NULL}, 172, "tcp"}, -{"cl/1", {NULL}, 172, "udp"}, -{"xyplex-mux", {NULL}, 173, "tcp"}, -{"xyplex-mux", {NULL}, 173, "udp"}, -{"mailq", {NULL}, 174, "tcp"}, -{"mailq", {NULL}, 174, "udp"}, -{"vmnet", {NULL}, 175, "tcp"}, -{"vmnet", {NULL}, 175, "udp"}, -{"genrad-mux", {NULL}, 176, "tcp"}, -{"genrad-mux", {NULL}, 176, "udp"}, -{"xdmcp", {NULL}, 177, "tcp"}, -{"xdmcp", {NULL}, 177, "udp"}, -{"nextstep", {NULL}, 178, "tcp"}, -{"nextstep", {NULL}, 178, "udp"}, -{"bgp", {NULL}, 179, "tcp"}, -{"bgp", {NULL}, 179, "udp"}, -{"bgp", {NULL}, 179, "sctp"}, -{"ris", {NULL}, 180, "tcp"}, -{"ris", {NULL}, 180, "udp"}, -{"unify", {NULL}, 181, "tcp"}, -{"unify", {NULL}, 181, "udp"}, -{"audit", {NULL}, 182, "tcp"}, -{"audit", {NULL}, 182, "udp"}, -{"ocbinder", {NULL}, 183, "tcp"}, -{"ocbinder", {NULL}, 183, "udp"}, -{"ocserver", {NULL}, 184, "tcp"}, -{"ocserver", {NULL}, 184, "udp"}, -{"remote-kis", {NULL}, 185, "tcp"}, -{"remote-kis", {NULL}, 185, "udp"}, -{"kis", {NULL}, 186, "tcp"}, -{"kis", {NULL}, 186, "udp"}, -{"aci", {NULL}, 187, "tcp"}, -{"aci", {NULL}, 187, "udp"}, -{"mumps", {NULL}, 188, "tcp"}, -{"mumps", {NULL}, 188, "udp"}, -{"qft", {NULL}, 189, "tcp"}, -{"qft", {NULL}, 189, "udp"}, -{"gacp", {NULL}, 190, "tcp"}, -{"gacp", {NULL}, 190, "udp"}, -{"prospero", {NULL}, 191, "tcp"}, -{"prospero", {NULL}, 191, "udp"}, -{"osu-nms", {NULL}, 192, "tcp"}, -{"osu-nms", {NULL}, 192, "udp"}, -{"srmp", {NULL}, 193, "tcp"}, -{"srmp", {NULL}, 193, "udp"}, -{"irc", {NULL}, 194, "tcp"}, -{"irc", {NULL}, 194, "udp"}, -{"dn6-nlm-aud", {NULL}, 195, "tcp"}, -{"dn6-nlm-aud", {NULL}, 195, "udp"}, -{"dn6-smm-red", {NULL}, 196, "tcp"}, -{"dn6-smm-red", {NULL}, 196, "udp"}, -{"dls", {NULL}, 197, "tcp"}, -{"dls", {NULL}, 197, "udp"}, -{"dls-mon", {NULL}, 198, "tcp"}, -{"dls-mon", {NULL}, 198, "udp"}, -{"smux", {NULL}, 199, "tcp"}, -{"smux", {NULL}, 199, "udp"}, -{"src", {NULL}, 200, "tcp"}, -{"src", {NULL}, 200, "udp"}, -{"at-rtmp", {NULL}, 201, "tcp"}, -{"at-rtmp", {NULL}, 201, "udp"}, -{"at-nbp", {NULL}, 202, "tcp"}, -{"at-nbp", {NULL}, 202, "udp"}, -{"at-3", {NULL}, 203, "tcp"}, -{"at-3", {NULL}, 203, "udp"}, -{"at-echo", {NULL}, 204, "tcp"}, -{"at-echo", {NULL}, 204, "udp"}, -{"at-5", {NULL}, 205, "tcp"}, -{"at-5", {NULL}, 205, "udp"}, -{"at-zis", {NULL}, 206, "tcp"}, -{"at-zis", {NULL}, 206, "udp"}, -{"at-7", {NULL}, 207, "tcp"}, -{"at-7", {NULL}, 207, "udp"}, -{"at-8", {NULL}, 208, "tcp"}, -{"at-8", {NULL}, 208, "udp"}, -{"qmtp", {NULL}, 209, "tcp"}, -{"qmtp", {NULL}, 209, "udp"}, -{"z39.50", {NULL}, 210, "tcp"}, -{"z39.50", {NULL}, 210, "udp"}, -{"914c/g", {NULL}, 211, "tcp"}, -{"914c/g", {NULL}, 211, "udp"}, -{"anet", {NULL}, 212, "tcp"}, -{"anet", {NULL}, 212, "udp"}, -{"ipx", {NULL}, 213, "tcp"}, -{"ipx", {NULL}, 213, "udp"}, -{"vmpwscs", {NULL}, 214, "tcp"}, -{"vmpwscs", {NULL}, 214, "udp"}, -{"softpc", {NULL}, 215, "tcp"}, -{"softpc", {NULL}, 215, "udp"}, -{"CAIlic", {NULL}, 216, "tcp"}, -{"CAIlic", {NULL}, 216, "udp"}, -{"dbase", {NULL}, 217, "tcp"}, -{"dbase", {NULL}, 217, "udp"}, -{"mpp", {NULL}, 218, "tcp"}, -{"mpp", {NULL}, 218, "udp"}, -{"uarps", {NULL}, 219, "tcp"}, -{"uarps", {NULL}, 219, "udp"}, -{"imap3", {NULL}, 220, "tcp"}, -{"imap3", {NULL}, 220, "udp"}, -{"fln-spx", {NULL}, 221, "tcp"}, -{"fln-spx", {NULL}, 221, "udp"}, -{"rsh-spx", {NULL}, 222, "tcp"}, -{"rsh-spx", {NULL}, 222, "udp"}, -{"cdc", {NULL}, 223, "tcp"}, -{"cdc", {NULL}, 223, "udp"}, -{"masqdialer", {NULL}, 224, "tcp"}, -{"masqdialer", {NULL}, 224, "udp"}, -{"direct", {NULL}, 242, "tcp"}, -{"direct", {NULL}, 242, "udp"}, -{"sur-meas", {NULL}, 243, "tcp"}, -{"sur-meas", {NULL}, 243, "udp"}, -{"inbusiness", {NULL}, 244, "tcp"}, -{"inbusiness", {NULL}, 244, "udp"}, -{"link", {NULL}, 245, "tcp"}, -{"link", {NULL}, 245, "udp"}, -{"dsp3270", {NULL}, 246, "tcp"}, -{"dsp3270", {NULL}, 246, "udp"}, -{"subntbcst_tftp", {NULL}, 247, "tcp"}, -{"subntbcst_tftp", {NULL}, 247, "udp"}, -{"bhfhs", {NULL}, 248, "tcp"}, -{"bhfhs", {NULL}, 248, "udp"}, -{"rap", {NULL}, 256, "tcp"}, -{"rap", {NULL}, 256, "udp"}, -{"set", {NULL}, 257, "tcp"}, -{"set", {NULL}, 257, "udp"}, -{"esro-gen", {NULL}, 259, "tcp"}, -{"esro-gen", {NULL}, 259, "udp"}, -{"openport", {NULL}, 260, "tcp"}, -{"openport", {NULL}, 260, "udp"}, -{"nsiiops", {NULL}, 261, "tcp"}, -{"nsiiops", {NULL}, 261, "udp"}, -{"arcisdms", {NULL}, 262, "tcp"}, -{"arcisdms", {NULL}, 262, "udp"}, -{"hdap", {NULL}, 263, "tcp"}, -{"hdap", {NULL}, 263, "udp"}, -{"bgmp", {NULL}, 264, "tcp"}, -{"bgmp", {NULL}, 264, "udp"}, -{"x-bone-ctl", {NULL}, 265, "tcp"}, -{"x-bone-ctl", {NULL}, 265, "udp"}, -{"sst", {NULL}, 266, "tcp"}, -{"sst", {NULL}, 266, "udp"}, -{"td-service", {NULL}, 267, "tcp"}, -{"td-service", {NULL}, 267, "udp"}, -{"td-replica", {NULL}, 268, "tcp"}, -{"td-replica", {NULL}, 268, "udp"}, -{"manet", {NULL}, 269, "tcp"}, -{"manet", {NULL}, 269, "udp"}, -{"gist", {NULL}, 270, "udp"}, -{"http-mgmt", {NULL}, 280, "tcp"}, -{"http-mgmt", {NULL}, 280, "udp"}, -{"personal-link", {NULL}, 281, "tcp"}, -{"personal-link", {NULL}, 281, "udp"}, -{"cableport-ax", {NULL}, 282, "tcp"}, -{"cableport-ax", {NULL}, 282, "udp"}, -{"rescap", {NULL}, 283, "tcp"}, -{"rescap", {NULL}, 283, "udp"}, -{"corerjd", {NULL}, 284, "tcp"}, -{"corerjd", {NULL}, 284, "udp"}, -{"fxp", {NULL}, 286, "tcp"}, -{"fxp", {NULL}, 286, "udp"}, -{"k-block", {NULL}, 287, "tcp"}, -{"k-block", {NULL}, 287, "udp"}, -{"novastorbakcup", {NULL}, 308, "tcp"}, -{"novastorbakcup", {NULL}, 308, "udp"}, -{"entrusttime", {NULL}, 309, "tcp"}, -{"entrusttime", {NULL}, 309, "udp"}, -{"bhmds", {NULL}, 310, "tcp"}, -{"bhmds", {NULL}, 310, "udp"}, -{"asip-webadmin", {NULL}, 311, "tcp"}, -{"asip-webadmin", {NULL}, 311, "udp"}, -{"vslmp", {NULL}, 312, "tcp"}, -{"vslmp", {NULL}, 312, "udp"}, -{"magenta-logic", {NULL}, 313, "tcp"}, -{"magenta-logic", {NULL}, 313, "udp"}, -{"opalis-robot", {NULL}, 314, "tcp"}, -{"opalis-robot", {NULL}, 314, "udp"}, -{"dpsi", {NULL}, 315, "tcp"}, -{"dpsi", {NULL}, 315, "udp"}, -{"decauth", {NULL}, 316, "tcp"}, -{"decauth", {NULL}, 316, "udp"}, -{"zannet", {NULL}, 317, "tcp"}, -{"zannet", {NULL}, 317, "udp"}, -{"pkix-timestamp", {NULL}, 318, "tcp"}, -{"pkix-timestamp", {NULL}, 318, "udp"}, -{"ptp-event", {NULL}, 319, "tcp"}, -{"ptp-event", {NULL}, 319, "udp"}, -{"ptp-general", {NULL}, 320, "tcp"}, -{"ptp-general", {NULL}, 320, "udp"}, -{"pip", {NULL}, 321, "tcp"}, -{"pip", {NULL}, 321, "udp"}, -{"rtsps", {NULL}, 322, "tcp"}, -{"rtsps", {NULL}, 322, "udp"}, -{"texar", {NULL}, 333, "tcp"}, -{"texar", {NULL}, 333, "udp"}, -{"pdap", {NULL}, 344, "tcp"}, -{"pdap", {NULL}, 344, "udp"}, -{"pawserv", {NULL}, 345, "tcp"}, -{"pawserv", {NULL}, 345, "udp"}, -{"zserv", {NULL}, 346, "tcp"}, -{"zserv", {NULL}, 346, "udp"}, -{"fatserv", {NULL}, 347, "tcp"}, -{"fatserv", {NULL}, 347, "udp"}, -{"csi-sgwp", {NULL}, 348, "tcp"}, -{"csi-sgwp", {NULL}, 348, "udp"}, -{"mftp", {NULL}, 349, "tcp"}, -{"mftp", {NULL}, 349, "udp"}, -{"matip-type-a", {NULL}, 350, "tcp"}, -{"matip-type-a", {NULL}, 350, "udp"}, -{"matip-type-b", {NULL}, 351, "tcp"}, -{"matip-type-b", {NULL}, 351, "udp"}, -{"bhoetty", {NULL}, 351, "tcp"}, -{"bhoetty", {NULL}, 351, "udp"}, -{"dtag-ste-sb", {NULL}, 352, "tcp"}, -{"dtag-ste-sb", {NULL}, 352, "udp"}, -{"bhoedap4", {NULL}, 352, "tcp"}, -{"bhoedap4", {NULL}, 352, "udp"}, -{"ndsauth", {NULL}, 353, "tcp"}, -{"ndsauth", {NULL}, 353, "udp"}, -{"bh611", {NULL}, 354, "tcp"}, -{"bh611", {NULL}, 354, "udp"}, -{"datex-asn", {NULL}, 355, "tcp"}, -{"datex-asn", {NULL}, 355, "udp"}, -{"cloanto-net-1", {NULL}, 356, "tcp"}, -{"cloanto-net-1", {NULL}, 356, "udp"}, -{"bhevent", {NULL}, 357, "tcp"}, -{"bhevent", {NULL}, 357, "udp"}, -{"shrinkwrap", {NULL}, 358, "tcp"}, -{"shrinkwrap", {NULL}, 358, "udp"}, -{"nsrmp", {NULL}, 359, "tcp"}, -{"nsrmp", {NULL}, 359, "udp"}, -{"scoi2odialog", {NULL}, 360, "tcp"}, -{"scoi2odialog", {NULL}, 360, "udp"}, -{"semantix", {NULL}, 361, "tcp"}, -{"semantix", {NULL}, 361, "udp"}, -{"srssend", {NULL}, 362, "tcp"}, -{"srssend", {NULL}, 362, "udp"}, -{"rsvp_tunnel", {NULL}, 363, "tcp"}, -{"rsvp_tunnel", {NULL}, 363, "udp"}, -{"aurora-cmgr", {NULL}, 364, "tcp"}, -{"aurora-cmgr", {NULL}, 364, "udp"}, -{"dtk", {NULL}, 365, "tcp"}, -{"dtk", {NULL}, 365, "udp"}, -{"odmr", {NULL}, 366, "tcp"}, -{"odmr", {NULL}, 366, "udp"}, -{"mortgageware", {NULL}, 367, "tcp"}, -{"mortgageware", {NULL}, 367, "udp"}, -{"qbikgdp", {NULL}, 368, "tcp"}, -{"qbikgdp", {NULL}, 368, "udp"}, -{"rpc2portmap", {NULL}, 369, "tcp"}, -{"rpc2portmap", {NULL}, 369, "udp"}, -{"codaauth2", {NULL}, 370, "tcp"}, -{"codaauth2", {NULL}, 370, "udp"}, -{"clearcase", {NULL}, 371, "tcp"}, -{"clearcase", {NULL}, 371, "udp"}, -{"ulistproc", {NULL}, 372, "tcp"}, -{"ulistproc", {NULL}, 372, "udp"}, -{"legent-1", {NULL}, 373, "tcp"}, -{"legent-1", {NULL}, 373, "udp"}, -{"legent-2", {NULL}, 374, "tcp"}, -{"legent-2", {NULL}, 374, "udp"}, -{"hassle", {NULL}, 375, "tcp"}, -{"hassle", {NULL}, 375, "udp"}, -{"nip", {NULL}, 376, "tcp"}, -{"nip", {NULL}, 376, "udp"}, -{"tnETOS", {NULL}, 377, "tcp"}, -{"tnETOS", {NULL}, 377, "udp"}, -{"dsETOS", {NULL}, 378, "tcp"}, -{"dsETOS", {NULL}, 378, "udp"}, -{"is99c", {NULL}, 379, "tcp"}, -{"is99c", {NULL}, 379, "udp"}, -{"is99s", {NULL}, 380, "tcp"}, -{"is99s", {NULL}, 380, "udp"}, -{"hp-collector", {NULL}, 381, "tcp"}, -{"hp-collector", {NULL}, 381, "udp"}, -{"hp-managed-node", {NULL}, 382, "tcp"}, -{"hp-managed-node", {NULL}, 382, "udp"}, -{"hp-alarm-mgr", {NULL}, 383, "tcp"}, -{"hp-alarm-mgr", {NULL}, 383, "udp"}, -{"arns", {NULL}, 384, "tcp"}, -{"arns", {NULL}, 384, "udp"}, -{"ibm-app", {NULL}, 385, "tcp"}, -{"ibm-app", {NULL}, 385, "udp"}, -{"asa", {NULL}, 386, "tcp"}, -{"asa", {NULL}, 386, "udp"}, -{"aurp", {NULL}, 387, "tcp"}, -{"aurp", {NULL}, 387, "udp"}, -{"unidata-ldm", {NULL}, 388, "tcp"}, -{"unidata-ldm", {NULL}, 388, "udp"}, -{"ldap", {NULL}, 389, "tcp"}, -{"ldap", {NULL}, 389, "udp"}, -{"uis", {NULL}, 390, "tcp"}, -{"uis", {NULL}, 390, "udp"}, -{"synotics-relay", {NULL}, 391, "tcp"}, -{"synotics-relay", {NULL}, 391, "udp"}, -{"synotics-broker", {NULL}, 392, "tcp"}, -{"synotics-broker", {NULL}, 392, "udp"}, -{"meta5", {NULL}, 393, "tcp"}, -{"meta5", {NULL}, 393, "udp"}, -{"embl-ndt", {NULL}, 394, "tcp"}, -{"embl-ndt", {NULL}, 394, "udp"}, -{"netcp", {NULL}, 395, "tcp"}, -{"netcp", {NULL}, 395, "udp"}, -{"netware-ip", {NULL}, 396, "tcp"}, -{"netware-ip", {NULL}, 396, "udp"}, -{"mptn", {NULL}, 397, "tcp"}, -{"mptn", {NULL}, 397, "udp"}, -{"kryptolan", {NULL}, 398, "tcp"}, -{"kryptolan", {NULL}, 398, "udp"}, -{"iso-tsap-c2", {NULL}, 399, "tcp"}, -{"iso-tsap-c2", {NULL}, 399, "udp"}, -{"osb-sd", {NULL}, 400, "tcp"}, -{"osb-sd", {NULL}, 400, "udp"}, -{"ups", {NULL}, 401, "tcp"}, -{"ups", {NULL}, 401, "udp"}, -{"genie", {NULL}, 402, "tcp"}, -{"genie", {NULL}, 402, "udp"}, -{"decap", {NULL}, 403, "tcp"}, -{"decap", {NULL}, 403, "udp"}, -{"nced", {NULL}, 404, "tcp"}, -{"nced", {NULL}, 404, "udp"}, -{"ncld", {NULL}, 405, "tcp"}, -{"ncld", {NULL}, 405, "udp"}, -{"imsp", {NULL}, 406, "tcp"}, -{"imsp", {NULL}, 406, "udp"}, -{"timbuktu", {NULL}, 407, "tcp"}, -{"timbuktu", {NULL}, 407, "udp"}, -{"prm-sm", {NULL}, 408, "tcp"}, -{"prm-sm", {NULL}, 408, "udp"}, -{"prm-nm", {NULL}, 409, "tcp"}, -{"prm-nm", {NULL}, 409, "udp"}, -{"decladebug", {NULL}, 410, "tcp"}, -{"decladebug", {NULL}, 410, "udp"}, -{"rmt", {NULL}, 411, "tcp"}, -{"rmt", {NULL}, 411, "udp"}, -{"synoptics-trap", {NULL}, 412, "tcp"}, -{"synoptics-trap", {NULL}, 412, "udp"}, -{"smsp", {NULL}, 413, "tcp"}, -{"smsp", {NULL}, 413, "udp"}, -{"infoseek", {NULL}, 414, "tcp"}, -{"infoseek", {NULL}, 414, "udp"}, -{"bnet", {NULL}, 415, "tcp"}, -{"bnet", {NULL}, 415, "udp"}, -{"silverplatter", {NULL}, 416, "tcp"}, -{"silverplatter", {NULL}, 416, "udp"}, -{"onmux", {NULL}, 417, "tcp"}, -{"onmux", {NULL}, 417, "udp"}, -{"hyper-g", {NULL}, 418, "tcp"}, -{"hyper-g", {NULL}, 418, "udp"}, -{"ariel1", {NULL}, 419, "tcp"}, -{"ariel1", {NULL}, 419, "udp"}, -{"smpte", {NULL}, 420, "tcp"}, -{"smpte", {NULL}, 420, "udp"}, -{"ariel2", {NULL}, 421, "tcp"}, -{"ariel2", {NULL}, 421, "udp"}, -{"ariel3", {NULL}, 422, "tcp"}, -{"ariel3", {NULL}, 422, "udp"}, -{"opc-job-start", {NULL}, 423, "tcp"}, -{"opc-job-start", {NULL}, 423, "udp"}, -{"opc-job-track", {NULL}, 424, "tcp"}, -{"opc-job-track", {NULL}, 424, "udp"}, -{"icad-el", {NULL}, 425, "tcp"}, -{"icad-el", {NULL}, 425, "udp"}, -{"smartsdp", {NULL}, 426, "tcp"}, -{"smartsdp", {NULL}, 426, "udp"}, -{"svrloc", {NULL}, 427, "tcp"}, -{"svrloc", {NULL}, 427, "udp"}, -{"ocs_cmu", {NULL}, 428, "tcp"}, -{"ocs_cmu", {NULL}, 428, "udp"}, -{"ocs_amu", {NULL}, 429, "tcp"}, -{"ocs_amu", {NULL}, 429, "udp"}, -{"utmpsd", {NULL}, 430, "tcp"}, -{"utmpsd", {NULL}, 430, "udp"}, -{"utmpcd", {NULL}, 431, "tcp"}, -{"utmpcd", {NULL}, 431, "udp"}, -{"iasd", {NULL}, 432, "tcp"}, -{"iasd", {NULL}, 432, "udp"}, -{"nnsp", {NULL}, 433, "tcp"}, -{"nnsp", {NULL}, 433, "udp"}, -{"mobileip-agent", {NULL}, 434, "tcp"}, -{"mobileip-agent", {NULL}, 434, "udp"}, -{"mobilip-mn", {NULL}, 435, "tcp"}, -{"mobilip-mn", {NULL}, 435, "udp"}, -{"dna-cml", {NULL}, 436, "tcp"}, -{"dna-cml", {NULL}, 436, "udp"}, -{"comscm", {NULL}, 437, "tcp"}, -{"comscm", {NULL}, 437, "udp"}, -{"dsfgw", {NULL}, 438, "tcp"}, -{"dsfgw", {NULL}, 438, "udp"}, -{"dasp", {NULL}, 439, "tcp"}, -{"dasp", {NULL}, 439, "udp"}, -{"sgcp", {NULL}, 440, "tcp"}, -{"sgcp", {NULL}, 440, "udp"}, -{"decvms-sysmgt", {NULL}, 441, "tcp"}, -{"decvms-sysmgt", {NULL}, 441, "udp"}, -{"cvc_hostd", {NULL}, 442, "tcp"}, -{"cvc_hostd", {NULL}, 442, "udp"}, -{"https", {NULL}, 443, "tcp"}, -{"https", {NULL}, 443, "udp"}, -{"https", {NULL}, 443, "sctp"}, -{"snpp", {NULL}, 444, "tcp"}, -{"snpp", {NULL}, 444, "udp"}, -{"microsoft-ds", {NULL}, 445, "tcp"}, -{"microsoft-ds", {NULL}, 445, "udp"}, -{"ddm-rdb", {NULL}, 446, "tcp"}, -{"ddm-rdb", {NULL}, 446, "udp"}, -{"ddm-dfm", {NULL}, 447, "tcp"}, -{"ddm-dfm", {NULL}, 447, "udp"}, -{"ddm-ssl", {NULL}, 448, "tcp"}, -{"ddm-ssl", {NULL}, 448, "udp"}, -{"as-servermap", {NULL}, 449, "tcp"}, -{"as-servermap", {NULL}, 449, "udp"}, -{"tserver", {NULL}, 450, "tcp"}, -{"tserver", {NULL}, 450, "udp"}, -{"sfs-smp-net", {NULL}, 451, "tcp"}, -{"sfs-smp-net", {NULL}, 451, "udp"}, -{"sfs-config", {NULL}, 452, "tcp"}, -{"sfs-config", {NULL}, 452, "udp"}, -{"creativeserver", {NULL}, 453, "tcp"}, -{"creativeserver", {NULL}, 453, "udp"}, -{"contentserver", {NULL}, 454, "tcp"}, -{"contentserver", {NULL}, 454, "udp"}, -{"creativepartnr", {NULL}, 455, "tcp"}, -{"creativepartnr", {NULL}, 455, "udp"}, -{"macon-tcp", {NULL}, 456, "tcp"}, -{"macon-udp", {NULL}, 456, "udp"}, -{"scohelp", {NULL}, 457, "tcp"}, -{"scohelp", {NULL}, 457, "udp"}, -{"appleqtc", {NULL}, 458, "tcp"}, -{"appleqtc", {NULL}, 458, "udp"}, -{"ampr-rcmd", {NULL}, 459, "tcp"}, -{"ampr-rcmd", {NULL}, 459, "udp"}, -{"skronk", {NULL}, 460, "tcp"}, -{"skronk", {NULL}, 460, "udp"}, -{"datasurfsrv", {NULL}, 461, "tcp"}, -{"datasurfsrv", {NULL}, 461, "udp"}, -{"datasurfsrvsec", {NULL}, 462, "tcp"}, -{"datasurfsrvsec", {NULL}, 462, "udp"}, -{"alpes", {NULL}, 463, "tcp"}, -{"alpes", {NULL}, 463, "udp"}, -{"kpasswd", {NULL}, 464, "tcp"}, -{"kpasswd", {NULL}, 464, "udp"}, -{"urd", {NULL}, 465, "tcp"}, -{"igmpv3lite", {NULL}, 465, "udp"}, -{"digital-vrc", {NULL}, 466, "tcp"}, -{"digital-vrc", {NULL}, 466, "udp"}, -{"mylex-mapd", {NULL}, 467, "tcp"}, -{"mylex-mapd", {NULL}, 467, "udp"}, -{"photuris", {NULL}, 468, "tcp"}, -{"photuris", {NULL}, 468, "udp"}, -{"rcp", {NULL}, 469, "tcp"}, -{"rcp", {NULL}, 469, "udp"}, -{"scx-proxy", {NULL}, 470, "tcp"}, -{"scx-proxy", {NULL}, 470, "udp"}, -{"mondex", {NULL}, 471, "tcp"}, -{"mondex", {NULL}, 471, "udp"}, -{"ljk-login", {NULL}, 472, "tcp"}, -{"ljk-login", {NULL}, 472, "udp"}, -{"hybrid-pop", {NULL}, 473, "tcp"}, -{"hybrid-pop", {NULL}, 473, "udp"}, -{"tn-tl-w1", {NULL}, 474, "tcp"}, -{"tn-tl-w2", {NULL}, 474, "udp"}, -{"tcpnethaspsrv", {NULL}, 475, "tcp"}, -{"tcpnethaspsrv", {NULL}, 475, "udp"}, -{"tn-tl-fd1", {NULL}, 476, "tcp"}, -{"tn-tl-fd1", {NULL}, 476, "udp"}, -{"ss7ns", {NULL}, 477, "tcp"}, -{"ss7ns", {NULL}, 477, "udp"}, -{"spsc", {NULL}, 478, "tcp"}, -{"spsc", {NULL}, 478, "udp"}, -{"iafserver", {NULL}, 479, "tcp"}, -{"iafserver", {NULL}, 479, "udp"}, -{"iafdbase", {NULL}, 480, "tcp"}, -{"iafdbase", {NULL}, 480, "udp"}, -{"ph", {NULL}, 481, "tcp"}, -{"ph", {NULL}, 481, "udp"}, -{"bgs-nsi", {NULL}, 482, "tcp"}, -{"bgs-nsi", {NULL}, 482, "udp"}, -{"ulpnet", {NULL}, 483, "tcp"}, -{"ulpnet", {NULL}, 483, "udp"}, -{"integra-sme", {NULL}, 484, "tcp"}, -{"integra-sme", {NULL}, 484, "udp"}, -{"powerburst", {NULL}, 485, "tcp"}, -{"powerburst", {NULL}, 485, "udp"}, -{"avian", {NULL}, 486, "tcp"}, -{"avian", {NULL}, 486, "udp"}, -{"saft", {NULL}, 487, "tcp"}, -{"saft", {NULL}, 487, "udp"}, -{"gss-http", {NULL}, 488, "tcp"}, -{"gss-http", {NULL}, 488, "udp"}, -{"nest-protocol", {NULL}, 489, "tcp"}, -{"nest-protocol", {NULL}, 489, "udp"}, -{"micom-pfs", {NULL}, 490, "tcp"}, -{"micom-pfs", {NULL}, 490, "udp"}, -{"go-login", {NULL}, 491, "tcp"}, -{"go-login", {NULL}, 491, "udp"}, -{"ticf-1", {NULL}, 492, "tcp"}, -{"ticf-1", {NULL}, 492, "udp"}, -{"ticf-2", {NULL}, 493, "tcp"}, -{"ticf-2", {NULL}, 493, "udp"}, -{"pov-ray", {NULL}, 494, "tcp"}, -{"pov-ray", {NULL}, 494, "udp"}, -{"intecourier", {NULL}, 495, "tcp"}, -{"intecourier", {NULL}, 495, "udp"}, -{"pim-rp-disc", {NULL}, 496, "tcp"}, -{"pim-rp-disc", {NULL}, 496, "udp"}, -{"dantz", {NULL}, 497, "tcp"}, -{"dantz", {NULL}, 497, "udp"}, -{"siam", {NULL}, 498, "tcp"}, -{"siam", {NULL}, 498, "udp"}, -{"iso-ill", {NULL}, 499, "tcp"}, -{"iso-ill", {NULL}, 499, "udp"}, -{"isakmp", {NULL}, 500, "tcp"}, -{"isakmp", {NULL}, 500, "udp"}, -{"stmf", {NULL}, 501, "tcp"}, -{"stmf", {NULL}, 501, "udp"}, -{"asa-appl-proto", {NULL}, 502, "tcp"}, -{"asa-appl-proto", {NULL}, 502, "udp"}, -{"intrinsa", {NULL}, 503, "tcp"}, -{"intrinsa", {NULL}, 503, "udp"}, -{"citadel", {NULL}, 504, "tcp"}, -{"citadel", {NULL}, 504, "udp"}, -{"mailbox-lm", {NULL}, 505, "tcp"}, -{"mailbox-lm", {NULL}, 505, "udp"}, -{"ohimsrv", {NULL}, 506, "tcp"}, -{"ohimsrv", {NULL}, 506, "udp"}, -{"crs", {NULL}, 507, "tcp"}, -{"crs", {NULL}, 507, "udp"}, -{"xvttp", {NULL}, 508, "tcp"}, -{"xvttp", {NULL}, 508, "udp"}, -{"snare", {NULL}, 509, "tcp"}, -{"snare", {NULL}, 509, "udp"}, -{"fcp", {NULL}, 510, "tcp"}, -{"fcp", {NULL}, 510, "udp"}, -{"passgo", {NULL}, 511, "tcp"}, -{"passgo", {NULL}, 511, "udp"}, -{"exec", {NULL}, 512, "tcp"}, -{"comsat", {NULL}, 512, "udp"}, -{"biff", {NULL}, 512, "udp"}, -{"login", {NULL}, 513, "tcp"}, -{"who", {NULL}, 513, "udp"}, -{"shell", {NULL}, 514, "tcp"}, -{"syslog", {NULL}, 514, "udp"}, -{"printer", {NULL}, 515, "tcp"}, -{"printer", {NULL}, 515, "udp"}, -{"videotex", {NULL}, 516, "tcp"}, -{"videotex", {NULL}, 516, "udp"}, -{"talk", {NULL}, 517, "tcp"}, -{"talk", {NULL}, 517, "udp"}, -{"ntalk", {NULL}, 518, "tcp"}, -{"ntalk", {NULL}, 518, "udp"}, -{"utime", {NULL}, 519, "tcp"}, -{"utime", {NULL}, 519, "udp"}, -{"efs", {NULL}, 520, "tcp"}, -{"router", {NULL}, 520, "udp"}, -{"ripng", {NULL}, 521, "tcp"}, -{"ripng", {NULL}, 521, "udp"}, -{"ulp", {NULL}, 522, "tcp"}, -{"ulp", {NULL}, 522, "udp"}, -{"ibm-db2", {NULL}, 523, "tcp"}, -{"ibm-db2", {NULL}, 523, "udp"}, -{"ncp", {NULL}, 524, "tcp"}, -{"ncp", {NULL}, 524, "udp"}, -{"timed", {NULL}, 525, "tcp"}, -{"timed", {NULL}, 525, "udp"}, -{"tempo", {NULL}, 526, "tcp"}, -{"tempo", {NULL}, 526, "udp"}, -{"stx", {NULL}, 527, "tcp"}, -{"stx", {NULL}, 527, "udp"}, -{"custix", {NULL}, 528, "tcp"}, -{"custix", {NULL}, 528, "udp"}, -{"irc-serv", {NULL}, 529, "tcp"}, -{"irc-serv", {NULL}, 529, "udp"}, -{"courier", {NULL}, 530, "tcp"}, -{"courier", {NULL}, 530, "udp"}, -{"conference", {NULL}, 531, "tcp"}, -{"conference", {NULL}, 531, "udp"}, -{"netnews", {NULL}, 532, "tcp"}, -{"netnews", {NULL}, 532, "udp"}, -{"netwall", {NULL}, 533, "tcp"}, -{"netwall", {NULL}, 533, "udp"}, -{"windream", {NULL}, 534, "tcp"}, -{"windream", {NULL}, 534, "udp"}, -{"iiop", {NULL}, 535, "tcp"}, -{"iiop", {NULL}, 535, "udp"}, -{"opalis-rdv", {NULL}, 536, "tcp"}, -{"opalis-rdv", {NULL}, 536, "udp"}, -{"nmsp", {NULL}, 537, "tcp"}, -{"nmsp", {NULL}, 537, "udp"}, -{"gdomap", {NULL}, 538, "tcp"}, -{"gdomap", {NULL}, 538, "udp"}, -{"apertus-ldp", {NULL}, 539, "tcp"}, -{"apertus-ldp", {NULL}, 539, "udp"}, -{"uucp", {NULL}, 540, "tcp"}, -{"uucp", {NULL}, 540, "udp"}, -{"uucp-rlogin", {NULL}, 541, "tcp"}, -{"uucp-rlogin", {NULL}, 541, "udp"}, -{"commerce", {NULL}, 542, "tcp"}, -{"commerce", {NULL}, 542, "udp"}, -{"klogin", {NULL}, 543, "tcp"}, -{"klogin", {NULL}, 543, "udp"}, -{"kshell", {NULL}, 544, "tcp"}, -{"kshell", {NULL}, 544, "udp"}, -{"appleqtcsrvr", {NULL}, 545, "tcp"}, -{"appleqtcsrvr", {NULL}, 545, "udp"}, -{"dhcpv6-client", {NULL}, 546, "tcp"}, -{"dhcpv6-client", {NULL}, 546, "udp"}, -{"dhcpv6-server", {NULL}, 547, "tcp"}, -{"dhcpv6-server", {NULL}, 547, "udp"}, -{"afpovertcp", {NULL}, 548, "tcp"}, -{"afpovertcp", {NULL}, 548, "udp"}, -{"idfp", {NULL}, 549, "tcp"}, -{"idfp", {NULL}, 549, "udp"}, -{"new-rwho", {NULL}, 550, "tcp"}, -{"new-rwho", {NULL}, 550, "udp"}, -{"cybercash", {NULL}, 551, "tcp"}, -{"cybercash", {NULL}, 551, "udp"}, -{"devshr-nts", {NULL}, 552, "tcp"}, -{"devshr-nts", {NULL}, 552, "udp"}, -{"pirp", {NULL}, 553, "tcp"}, -{"pirp", {NULL}, 553, "udp"}, -{"rtsp", {NULL}, 554, "tcp"}, -{"rtsp", {NULL}, 554, "udp"}, -{"dsf", {NULL}, 555, "tcp"}, -{"dsf", {NULL}, 555, "udp"}, -{"remotefs", {NULL}, 556, "tcp"}, -{"remotefs", {NULL}, 556, "udp"}, -{"openvms-sysipc", {NULL}, 557, "tcp"}, -{"openvms-sysipc", {NULL}, 557, "udp"}, -{"sdnskmp", {NULL}, 558, "tcp"}, -{"sdnskmp", {NULL}, 558, "udp"}, -{"teedtap", {NULL}, 559, "tcp"}, -{"teedtap", {NULL}, 559, "udp"}, -{"rmonitor", {NULL}, 560, "tcp"}, -{"rmonitor", {NULL}, 560, "udp"}, -{"monitor", {NULL}, 561, "tcp"}, -{"monitor", {NULL}, 561, "udp"}, -{"chshell", {NULL}, 562, "tcp"}, -{"chshell", {NULL}, 562, "udp"}, -{"nntps", {NULL}, 563, "tcp"}, -{"nntps", {NULL}, 563, "udp"}, -{"9pfs", {NULL}, 564, "tcp"}, -{"9pfs", {NULL}, 564, "udp"}, -{"whoami", {NULL}, 565, "tcp"}, -{"whoami", {NULL}, 565, "udp"}, -{"streettalk", {NULL}, 566, "tcp"}, -{"streettalk", {NULL}, 566, "udp"}, -{"banyan-rpc", {NULL}, 567, "tcp"}, -{"banyan-rpc", {NULL}, 567, "udp"}, -{"ms-shuttle", {NULL}, 568, "tcp"}, -{"ms-shuttle", {NULL}, 568, "udp"}, -{"ms-rome", {NULL}, 569, "tcp"}, -{"ms-rome", {NULL}, 569, "udp"}, -{"meter", {NULL}, 570, "tcp"}, -{"meter", {NULL}, 570, "udp"}, -{"meter", {NULL}, 571, "tcp"}, -{"meter", {NULL}, 571, "udp"}, -{"sonar", {NULL}, 572, "tcp"}, -{"sonar", {NULL}, 572, "udp"}, -{"banyan-vip", {NULL}, 573, "tcp"}, -{"banyan-vip", {NULL}, 573, "udp"}, -{"ftp-agent", {NULL}, 574, "tcp"}, -{"ftp-agent", {NULL}, 574, "udp"}, -{"vemmi", {NULL}, 575, "tcp"}, -{"vemmi", {NULL}, 575, "udp"}, -{"ipcd", {NULL}, 576, "tcp"}, -{"ipcd", {NULL}, 576, "udp"}, -{"vnas", {NULL}, 577, "tcp"}, -{"vnas", {NULL}, 577, "udp"}, -{"ipdd", {NULL}, 578, "tcp"}, -{"ipdd", {NULL}, 578, "udp"}, -{"decbsrv", {NULL}, 579, "tcp"}, -{"decbsrv", {NULL}, 579, "udp"}, -{"sntp-heartbeat", {NULL}, 580, "tcp"}, -{"sntp-heartbeat", {NULL}, 580, "udp"}, -{"bdp", {NULL}, 581, "tcp"}, -{"bdp", {NULL}, 581, "udp"}, -{"scc-security", {NULL}, 582, "tcp"}, -{"scc-security", {NULL}, 582, "udp"}, -{"philips-vc", {NULL}, 583, "tcp"}, -{"philips-vc", {NULL}, 583, "udp"}, -{"keyserver", {NULL}, 584, "tcp"}, -{"keyserver", {NULL}, 584, "udp"}, -{"password-chg", {NULL}, 586, "tcp"}, -{"password-chg", {NULL}, 586, "udp"}, -{"submission", {NULL}, 587, "tcp"}, -{"submission", {NULL}, 587, "udp"}, -{"cal", {NULL}, 588, "tcp"}, -{"cal", {NULL}, 588, "udp"}, -{"eyelink", {NULL}, 589, "tcp"}, -{"eyelink", {NULL}, 589, "udp"}, -{"tns-cml", {NULL}, 590, "tcp"}, -{"tns-cml", {NULL}, 590, "udp"}, -{"http-alt", {NULL}, 591, "tcp"}, -{"http-alt", {NULL}, 591, "udp"}, -{"eudora-set", {NULL}, 592, "tcp"}, -{"eudora-set", {NULL}, 592, "udp"}, -{"http-rpc-epmap", {NULL}, 593, "tcp"}, -{"http-rpc-epmap", {NULL}, 593, "udp"}, -{"tpip", {NULL}, 594, "tcp"}, -{"tpip", {NULL}, 594, "udp"}, -{"cab-protocol", {NULL}, 595, "tcp"}, -{"cab-protocol", {NULL}, 595, "udp"}, -{"smsd", {NULL}, 596, "tcp"}, -{"smsd", {NULL}, 596, "udp"}, -{"ptcnameservice", {NULL}, 597, "tcp"}, -{"ptcnameservice", {NULL}, 597, "udp"}, -{"sco-websrvrmg3", {NULL}, 598, "tcp"}, -{"sco-websrvrmg3", {NULL}, 598, "udp"}, -{"acp", {NULL}, 599, "tcp"}, -{"acp", {NULL}, 599, "udp"}, -{"ipcserver", {NULL}, 600, "tcp"}, -{"ipcserver", {NULL}, 600, "udp"}, -{"syslog-conn", {NULL}, 601, "tcp"}, -{"syslog-conn", {NULL}, 601, "udp"}, -{"xmlrpc-beep", {NULL}, 602, "tcp"}, -{"xmlrpc-beep", {NULL}, 602, "udp"}, -{"idxp", {NULL}, 603, "tcp"}, -{"idxp", {NULL}, 603, "udp"}, -{"tunnel", {NULL}, 604, "tcp"}, -{"tunnel", {NULL}, 604, "udp"}, -{"soap-beep", {NULL}, 605, "tcp"}, -{"soap-beep", {NULL}, 605, "udp"}, -{"urm", {NULL}, 606, "tcp"}, -{"urm", {NULL}, 606, "udp"}, -{"nqs", {NULL}, 607, "tcp"}, -{"nqs", {NULL}, 607, "udp"}, -{"sift-uft", {NULL}, 608, "tcp"}, -{"sift-uft", {NULL}, 608, "udp"}, -{"npmp-trap", {NULL}, 609, "tcp"}, -{"npmp-trap", {NULL}, 609, "udp"}, -{"npmp-local", {NULL}, 610, "tcp"}, -{"npmp-local", {NULL}, 610, "udp"}, -{"npmp-gui", {NULL}, 611, "tcp"}, -{"npmp-gui", {NULL}, 611, "udp"}, -{"hmmp-ind", {NULL}, 612, "tcp"}, -{"hmmp-ind", {NULL}, 612, "udp"}, -{"hmmp-op", {NULL}, 613, "tcp"}, -{"hmmp-op", {NULL}, 613, "udp"}, -{"sshell", {NULL}, 614, "tcp"}, -{"sshell", {NULL}, 614, "udp"}, -{"sco-inetmgr", {NULL}, 615, "tcp"}, -{"sco-inetmgr", {NULL}, 615, "udp"}, -{"sco-sysmgr", {NULL}, 616, "tcp"}, -{"sco-sysmgr", {NULL}, 616, "udp"}, -{"sco-dtmgr", {NULL}, 617, "tcp"}, -{"sco-dtmgr", {NULL}, 617, "udp"}, -{"dei-icda", {NULL}, 618, "tcp"}, -{"dei-icda", {NULL}, 618, "udp"}, -{"compaq-evm", {NULL}, 619, "tcp"}, -{"compaq-evm", {NULL}, 619, "udp"}, -{"sco-websrvrmgr", {NULL}, 620, "tcp"}, -{"sco-websrvrmgr", {NULL}, 620, "udp"}, -{"escp-ip", {NULL}, 621, "tcp"}, -{"escp-ip", {NULL}, 621, "udp"}, -{"collaborator", {NULL}, 622, "tcp"}, -{"collaborator", {NULL}, 622, "udp"}, -{"oob-ws-http", {NULL}, 623, "tcp"}, -{"asf-rmcp", {NULL}, 623, "udp"}, -{"cryptoadmin", {NULL}, 624, "tcp"}, -{"cryptoadmin", {NULL}, 624, "udp"}, -{"dec_dlm", {NULL}, 625, "tcp"}, -{"dec_dlm", {NULL}, 625, "udp"}, -{"asia", {NULL}, 626, "tcp"}, -{"asia", {NULL}, 626, "udp"}, -{"passgo-tivoli", {NULL}, 627, "tcp"}, -{"passgo-tivoli", {NULL}, 627, "udp"}, -{"qmqp", {NULL}, 628, "tcp"}, -{"qmqp", {NULL}, 628, "udp"}, -{"3com-amp3", {NULL}, 629, "tcp"}, -{"3com-amp3", {NULL}, 629, "udp"}, -{"rda", {NULL}, 630, "tcp"}, -{"rda", {NULL}, 630, "udp"}, -{"ipp", {NULL}, 631, "tcp"}, -{"ipp", {NULL}, 631, "udp"}, -{"bmpp", {NULL}, 632, "tcp"}, -{"bmpp", {NULL}, 632, "udp"}, -{"servstat", {NULL}, 633, "tcp"}, -{"servstat", {NULL}, 633, "udp"}, -{"ginad", {NULL}, 634, "tcp"}, -{"ginad", {NULL}, 634, "udp"}, -{"rlzdbase", {NULL}, 635, "tcp"}, -{"rlzdbase", {NULL}, 635, "udp"}, -{"ldaps", {NULL}, 636, "tcp"}, -{"ldaps", {NULL}, 636, "udp"}, -{"lanserver", {NULL}, 637, "tcp"}, -{"lanserver", {NULL}, 637, "udp"}, -{"mcns-sec", {NULL}, 638, "tcp"}, -{"mcns-sec", {NULL}, 638, "udp"}, -{"msdp", {NULL}, 639, "tcp"}, -{"msdp", {NULL}, 639, "udp"}, -{"entrust-sps", {NULL}, 640, "tcp"}, -{"entrust-sps", {NULL}, 640, "udp"}, -{"repcmd", {NULL}, 641, "tcp"}, -{"repcmd", {NULL}, 641, "udp"}, -{"esro-emsdp", {NULL}, 642, "tcp"}, -{"esro-emsdp", {NULL}, 642, "udp"}, -{"sanity", {NULL}, 643, "tcp"}, -{"sanity", {NULL}, 643, "udp"}, -{"dwr", {NULL}, 644, "tcp"}, -{"dwr", {NULL}, 644, "udp"}, -{"pssc", {NULL}, 645, "tcp"}, -{"pssc", {NULL}, 645, "udp"}, -{"ldp", {NULL}, 646, "tcp"}, -{"ldp", {NULL}, 646, "udp"}, -{"dhcp-failover", {NULL}, 647, "tcp"}, -{"dhcp-failover", {NULL}, 647, "udp"}, -{"rrp", {NULL}, 648, "tcp"}, -{"rrp", {NULL}, 648, "udp"}, -{"cadview-3d", {NULL}, 649, "tcp"}, -{"cadview-3d", {NULL}, 649, "udp"}, -{"obex", {NULL}, 650, "tcp"}, -{"obex", {NULL}, 650, "udp"}, -{"ieee-mms", {NULL}, 651, "tcp"}, -{"ieee-mms", {NULL}, 651, "udp"}, -{"hello-port", {NULL}, 652, "tcp"}, -{"hello-port", {NULL}, 652, "udp"}, -{"repscmd", {NULL}, 653, "tcp"}, -{"repscmd", {NULL}, 653, "udp"}, -{"aodv", {NULL}, 654, "tcp"}, -{"aodv", {NULL}, 654, "udp"}, -{"tinc", {NULL}, 655, "tcp"}, -{"tinc", {NULL}, 655, "udp"}, -{"spmp", {NULL}, 656, "tcp"}, -{"spmp", {NULL}, 656, "udp"}, -{"rmc", {NULL}, 657, "tcp"}, -{"rmc", {NULL}, 657, "udp"}, -{"tenfold", {NULL}, 658, "tcp"}, -{"tenfold", {NULL}, 658, "udp"}, -{"mac-srvr-admin", {NULL}, 660, "tcp"}, -{"mac-srvr-admin", {NULL}, 660, "udp"}, -{"hap", {NULL}, 661, "tcp"}, -{"hap", {NULL}, 661, "udp"}, -{"pftp", {NULL}, 662, "tcp"}, -{"pftp", {NULL}, 662, "udp"}, -{"purenoise", {NULL}, 663, "tcp"}, -{"purenoise", {NULL}, 663, "udp"}, -{"oob-ws-https", {NULL}, 664, "tcp"}, -{"asf-secure-rmcp", {NULL}, 664, "udp"}, -{"sun-dr", {NULL}, 665, "tcp"}, -{"sun-dr", {NULL}, 665, "udp"}, -{"mdqs", {NULL}, 666, "tcp"}, -{"mdqs", {NULL}, 666, "udp"}, -{"doom", {NULL}, 666, "tcp"}, -{"doom", {NULL}, 666, "udp"}, -{"disclose", {NULL}, 667, "tcp"}, -{"disclose", {NULL}, 667, "udp"}, -{"mecomm", {NULL}, 668, "tcp"}, -{"mecomm", {NULL}, 668, "udp"}, -{"meregister", {NULL}, 669, "tcp"}, -{"meregister", {NULL}, 669, "udp"}, -{"vacdsm-sws", {NULL}, 670, "tcp"}, -{"vacdsm-sws", {NULL}, 670, "udp"}, -{"vacdsm-app", {NULL}, 671, "tcp"}, -{"vacdsm-app", {NULL}, 671, "udp"}, -{"vpps-qua", {NULL}, 672, "tcp"}, -{"vpps-qua", {NULL}, 672, "udp"}, -{"cimplex", {NULL}, 673, "tcp"}, -{"cimplex", {NULL}, 673, "udp"}, -{"acap", {NULL}, 674, "tcp"}, -{"acap", {NULL}, 674, "udp"}, -{"dctp", {NULL}, 675, "tcp"}, -{"dctp", {NULL}, 675, "udp"}, -{"vpps-via", {NULL}, 676, "tcp"}, -{"vpps-via", {NULL}, 676, "udp"}, -{"vpp", {NULL}, 677, "tcp"}, -{"vpp", {NULL}, 677, "udp"}, -{"ggf-ncp", {NULL}, 678, "tcp"}, -{"ggf-ncp", {NULL}, 678, "udp"}, -{"mrm", {NULL}, 679, "tcp"}, -{"mrm", {NULL}, 679, "udp"}, -{"entrust-aaas", {NULL}, 680, "tcp"}, -{"entrust-aaas", {NULL}, 680, "udp"}, -{"entrust-aams", {NULL}, 681, "tcp"}, -{"entrust-aams", {NULL}, 681, "udp"}, -{"xfr", {NULL}, 682, "tcp"}, -{"xfr", {NULL}, 682, "udp"}, -{"corba-iiop", {NULL}, 683, "tcp"}, -{"corba-iiop", {NULL}, 683, "udp"}, -{"corba-iiop-ssl", {NULL}, 684, "tcp"}, -{"corba-iiop-ssl", {NULL}, 684, "udp"}, -{"mdc-portmapper", {NULL}, 685, "tcp"}, -{"mdc-portmapper", {NULL}, 685, "udp"}, -{"hcp-wismar", {NULL}, 686, "tcp"}, -{"hcp-wismar", {NULL}, 686, "udp"}, -{"asipregistry", {NULL}, 687, "tcp"}, -{"asipregistry", {NULL}, 687, "udp"}, -{"realm-rusd", {NULL}, 688, "tcp"}, -{"realm-rusd", {NULL}, 688, "udp"}, -{"nmap", {NULL}, 689, "tcp"}, -{"nmap", {NULL}, 689, "udp"}, -{"vatp", {NULL}, 690, "tcp"}, -{"vatp", {NULL}, 690, "udp"}, -{"msexch-routing", {NULL}, 691, "tcp"}, -{"msexch-routing", {NULL}, 691, "udp"}, -{"hyperwave-isp", {NULL}, 692, "tcp"}, -{"hyperwave-isp", {NULL}, 692, "udp"}, -{"connendp", {NULL}, 693, "tcp"}, -{"connendp", {NULL}, 693, "udp"}, -{"ha-cluster", {NULL}, 694, "tcp"}, -{"ha-cluster", {NULL}, 694, "udp"}, -{"ieee-mms-ssl", {NULL}, 695, "tcp"}, -{"ieee-mms-ssl", {NULL}, 695, "udp"}, -{"rushd", {NULL}, 696, "tcp"}, -{"rushd", {NULL}, 696, "udp"}, -{"uuidgen", {NULL}, 697, "tcp"}, -{"uuidgen", {NULL}, 697, "udp"}, -{"olsr", {NULL}, 698, "tcp"}, -{"olsr", {NULL}, 698, "udp"}, -{"accessnetwork", {NULL}, 699, "tcp"}, -{"accessnetwork", {NULL}, 699, "udp"}, -{"epp", {NULL}, 700, "tcp"}, -{"epp", {NULL}, 700, "udp"}, -{"lmp", {NULL}, 701, "tcp"}, -{"lmp", {NULL}, 701, "udp"}, -{"iris-beep", {NULL}, 702, "tcp"}, -{"iris-beep", {NULL}, 702, "udp"}, -{"elcsd", {NULL}, 704, "tcp"}, -{"elcsd", {NULL}, 704, "udp"}, -{"agentx", {NULL}, 705, "tcp"}, -{"agentx", {NULL}, 705, "udp"}, -{"silc", {NULL}, 706, "tcp"}, -{"silc", {NULL}, 706, "udp"}, -{"borland-dsj", {NULL}, 707, "tcp"}, -{"borland-dsj", {NULL}, 707, "udp"}, -{"entrust-kmsh", {NULL}, 709, "tcp"}, -{"entrust-kmsh", {NULL}, 709, "udp"}, -{"entrust-ash", {NULL}, 710, "tcp"}, -{"entrust-ash", {NULL}, 710, "udp"}, -{"cisco-tdp", {NULL}, 711, "tcp"}, -{"cisco-tdp", {NULL}, 711, "udp"}, -{"tbrpf", {NULL}, 712, "tcp"}, -{"tbrpf", {NULL}, 712, "udp"}, -{"iris-xpc", {NULL}, 713, "tcp"}, -{"iris-xpc", {NULL}, 713, "udp"}, -{"iris-xpcs", {NULL}, 714, "tcp"}, -{"iris-xpcs", {NULL}, 714, "udp"}, -{"iris-lwz", {NULL}, 715, "tcp"}, -{"iris-lwz", {NULL}, 715, "udp"}, -{"pana", {NULL}, 716, "udp"}, -{"netviewdm1", {NULL}, 729, "tcp"}, -{"netviewdm1", {NULL}, 729, "udp"}, -{"netviewdm2", {NULL}, 730, "tcp"}, -{"netviewdm2", {NULL}, 730, "udp"}, -{"netviewdm3", {NULL}, 731, "tcp"}, -{"netviewdm3", {NULL}, 731, "udp"}, -{"netgw", {NULL}, 741, "tcp"}, -{"netgw", {NULL}, 741, "udp"}, -{"netrcs", {NULL}, 742, "tcp"}, -{"netrcs", {NULL}, 742, "udp"}, -{"flexlm", {NULL}, 744, "tcp"}, -{"flexlm", {NULL}, 744, "udp"}, -{"fujitsu-dev", {NULL}, 747, "tcp"}, -{"fujitsu-dev", {NULL}, 747, "udp"}, -{"ris-cm", {NULL}, 748, "tcp"}, -{"ris-cm", {NULL}, 748, "udp"}, -{"kerberos-adm", {NULL}, 749, "tcp"}, -{"kerberos-adm", {NULL}, 749, "udp"}, -{"rfile", {NULL}, 750, "tcp"}, -{"loadav", {NULL}, 750, "udp"}, -{"kerberos-iv", {NULL}, 750, "udp"}, -{"pump", {NULL}, 751, "tcp"}, -{"pump", {NULL}, 751, "udp"}, -{"qrh", {NULL}, 752, "tcp"}, -{"qrh", {NULL}, 752, "udp"}, -{"rrh", {NULL}, 753, "tcp"}, -{"rrh", {NULL}, 753, "udp"}, -{"tell", {NULL}, 754, "tcp"}, -{"tell", {NULL}, 754, "udp"}, -{"nlogin", {NULL}, 758, "tcp"}, -{"nlogin", {NULL}, 758, "udp"}, -{"con", {NULL}, 759, "tcp"}, -{"con", {NULL}, 759, "udp"}, -{"ns", {NULL}, 760, "tcp"}, -{"ns", {NULL}, 760, "udp"}, -{"rxe", {NULL}, 761, "tcp"}, -{"rxe", {NULL}, 761, "udp"}, -{"quotad", {NULL}, 762, "tcp"}, -{"quotad", {NULL}, 762, "udp"}, -{"cycleserv", {NULL}, 763, "tcp"}, -{"cycleserv", {NULL}, 763, "udp"}, -{"omserv", {NULL}, 764, "tcp"}, -{"omserv", {NULL}, 764, "udp"}, -{"webster", {NULL}, 765, "tcp"}, -{"webster", {NULL}, 765, "udp"}, -{"phonebook", {NULL}, 767, "tcp"}, -{"phonebook", {NULL}, 767, "udp"}, -{"vid", {NULL}, 769, "tcp"}, -{"vid", {NULL}, 769, "udp"}, -{"cadlock", {NULL}, 770, "tcp"}, -{"cadlock", {NULL}, 770, "udp"}, -{"rtip", {NULL}, 771, "tcp"}, -{"rtip", {NULL}, 771, "udp"}, -{"cycleserv2", {NULL}, 772, "tcp"}, -{"cycleserv2", {NULL}, 772, "udp"}, -{"submit", {NULL}, 773, "tcp"}, -{"notify", {NULL}, 773, "udp"}, -{"rpasswd", {NULL}, 774, "tcp"}, -{"acmaint_dbd", {NULL}, 774, "udp"}, -{"entomb", {NULL}, 775, "tcp"}, -{"acmaint_transd", {NULL}, 775, "udp"}, -{"wpages", {NULL}, 776, "tcp"}, -{"wpages", {NULL}, 776, "udp"}, -{"multiling-http", {NULL}, 777, "tcp"}, -{"multiling-http", {NULL}, 777, "udp"}, -{"wpgs", {NULL}, 780, "tcp"}, -{"wpgs", {NULL}, 780, "udp"}, -{"mdbs_daemon", {NULL}, 800, "tcp"}, -{"mdbs_daemon", {NULL}, 800, "udp"}, -{"device", {NULL}, 801, "tcp"}, -{"device", {NULL}, 801, "udp"}, -{"fcp-udp", {NULL}, 810, "tcp"}, -{"fcp-udp", {NULL}, 810, "udp"}, -{"itm-mcell-s", {NULL}, 828, "tcp"}, -{"itm-mcell-s", {NULL}, 828, "udp"}, -{"pkix-3-ca-ra", {NULL}, 829, "tcp"}, -{"pkix-3-ca-ra", {NULL}, 829, "udp"}, -{"netconf-ssh", {NULL}, 830, "tcp"}, -{"netconf-ssh", {NULL}, 830, "udp"}, -{"netconf-beep", {NULL}, 831, "tcp"}, -{"netconf-beep", {NULL}, 831, "udp"}, -{"netconfsoaphttp", {NULL}, 832, "tcp"}, -{"netconfsoaphttp", {NULL}, 832, "udp"}, -{"netconfsoapbeep", {NULL}, 833, "tcp"}, -{"netconfsoapbeep", {NULL}, 833, "udp"}, -{"dhcp-failover2", {NULL}, 847, "tcp"}, -{"dhcp-failover2", {NULL}, 847, "udp"}, -{"gdoi", {NULL}, 848, "tcp"}, -{"gdoi", {NULL}, 848, "udp"}, -{"iscsi", {NULL}, 860, "tcp"}, -{"iscsi", {NULL}, 860, "udp"}, -{"owamp-control", {NULL}, 861, "tcp"}, -{"owamp-control", {NULL}, 861, "udp"}, -{"twamp-control", {NULL}, 862, "tcp"}, -{"twamp-control", {NULL}, 862, "udp"}, -{"rsync", {NULL}, 873, "tcp"}, -{"rsync", {NULL}, 873, "udp"}, -{"iclcnet-locate", {NULL}, 886, "tcp"}, -{"iclcnet-locate", {NULL}, 886, "udp"}, -{"iclcnet_svinfo", {NULL}, 887, "tcp"}, -{"iclcnet_svinfo", {NULL}, 887, "udp"}, -{"accessbuilder", {NULL}, 888, "tcp"}, -{"accessbuilder", {NULL}, 888, "udp"}, -{"cddbp", {NULL}, 888, "tcp"}, -{"omginitialrefs", {NULL}, 900, "tcp"}, -{"omginitialrefs", {NULL}, 900, "udp"}, -{"smpnameres", {NULL}, 901, "tcp"}, -{"smpnameres", {NULL}, 901, "udp"}, -{"ideafarm-door", {NULL}, 902, "tcp"}, -{"ideafarm-door", {NULL}, 902, "udp"}, -{"ideafarm-panic", {NULL}, 903, "tcp"}, -{"ideafarm-panic", {NULL}, 903, "udp"}, -{"kink", {NULL}, 910, "tcp"}, -{"kink", {NULL}, 910, "udp"}, -{"xact-backup", {NULL}, 911, "tcp"}, -{"xact-backup", {NULL}, 911, "udp"}, -{"apex-mesh", {NULL}, 912, "tcp"}, -{"apex-mesh", {NULL}, 912, "udp"}, -{"apex-edge", {NULL}, 913, "tcp"}, -{"apex-edge", {NULL}, 913, "udp"}, -{"ftps-data", {NULL}, 989, "tcp"}, -{"ftps-data", {NULL}, 989, "udp"}, -{"ftps", {NULL}, 990, "tcp"}, -{"ftps", {NULL}, 990, "udp"}, -{"nas", {NULL}, 991, "tcp"}, -{"nas", {NULL}, 991, "udp"}, -{"telnets", {NULL}, 992, "tcp"}, -{"telnets", {NULL}, 992, "udp"}, -{"imaps", {NULL}, 993, "tcp"}, -{"imaps", {NULL}, 993, "udp"}, -{"ircs", {NULL}, 994, "tcp"}, -{"ircs", {NULL}, 994, "udp"}, -{"pop3s", {NULL}, 995, "tcp"}, -{"pop3s", {NULL}, 995, "udp"}, -{"vsinet", {NULL}, 996, "tcp"}, -{"vsinet", {NULL}, 996, "udp"}, -{"maitrd", {NULL}, 997, "tcp"}, -{"maitrd", {NULL}, 997, "udp"}, -{"busboy", {NULL}, 998, "tcp"}, -{"puparp", {NULL}, 998, "udp"}, -{"garcon", {NULL}, 999, "tcp"}, -{"applix", {NULL}, 999, "udp"}, -{"puprouter", {NULL}, 999, "tcp"}, -{"puprouter", {NULL}, 999, "udp"}, -{"cadlock2", {NULL}, 1000, "tcp"}, -{"cadlock2", {NULL}, 1000, "udp"}, -{"surf", {NULL}, 1010, "tcp"}, -{"surf", {NULL}, 1010, "udp"}, -{"exp1", {NULL}, 1021, "tcp"}, -{"exp1", {NULL}, 1021, "udp"}, -{"exp2", {NULL}, 1022, "tcp"}, -{"exp2", {NULL}, 1022, "udp"}, -#endif /* USE_IANA_WELL_KNOWN_PORTS */ -#ifdef USE_IANA_REGISTERED_PORTS -{"blackjack", {NULL}, 1025, "tcp"}, -{"blackjack", {NULL}, 1025, "udp"}, -{"cap", {NULL}, 1026, "tcp"}, -{"cap", {NULL}, 1026, "udp"}, -{"solid-mux", {NULL}, 1029, "tcp"}, -{"solid-mux", {NULL}, 1029, "udp"}, -{"iad1", {NULL}, 1030, "tcp"}, -{"iad1", {NULL}, 1030, "udp"}, -{"iad2", {NULL}, 1031, "tcp"}, -{"iad2", {NULL}, 1031, "udp"}, -{"iad3", {NULL}, 1032, "tcp"}, -{"iad3", {NULL}, 1032, "udp"}, -{"netinfo-local", {NULL}, 1033, "tcp"}, -{"netinfo-local", {NULL}, 1033, "udp"}, -{"activesync", {NULL}, 1034, "tcp"}, -{"activesync", {NULL}, 1034, "udp"}, -{"mxxrlogin", {NULL}, 1035, "tcp"}, -{"mxxrlogin", {NULL}, 1035, "udp"}, -{"nsstp", {NULL}, 1036, "tcp"}, -{"nsstp", {NULL}, 1036, "udp"}, -{"ams", {NULL}, 1037, "tcp"}, -{"ams", {NULL}, 1037, "udp"}, -{"mtqp", {NULL}, 1038, "tcp"}, -{"mtqp", {NULL}, 1038, "udp"}, -{"sbl", {NULL}, 1039, "tcp"}, -{"sbl", {NULL}, 1039, "udp"}, -{"netarx", {NULL}, 1040, "tcp"}, -{"netarx", {NULL}, 1040, "udp"}, -{"danf-ak2", {NULL}, 1041, "tcp"}, -{"danf-ak2", {NULL}, 1041, "udp"}, -{"afrog", {NULL}, 1042, "tcp"}, -{"afrog", {NULL}, 1042, "udp"}, -{"boinc-client", {NULL}, 1043, "tcp"}, -{"boinc-client", {NULL}, 1043, "udp"}, -{"dcutility", {NULL}, 1044, "tcp"}, -{"dcutility", {NULL}, 1044, "udp"}, -{"fpitp", {NULL}, 1045, "tcp"}, -{"fpitp", {NULL}, 1045, "udp"}, -{"wfremotertm", {NULL}, 1046, "tcp"}, -{"wfremotertm", {NULL}, 1046, "udp"}, -{"neod1", {NULL}, 1047, "tcp"}, -{"neod1", {NULL}, 1047, "udp"}, -{"neod2", {NULL}, 1048, "tcp"}, -{"neod2", {NULL}, 1048, "udp"}, -{"td-postman", {NULL}, 1049, "tcp"}, -{"td-postman", {NULL}, 1049, "udp"}, -{"cma", {NULL}, 1050, "tcp"}, -{"cma", {NULL}, 1050, "udp"}, -{"optima-vnet", {NULL}, 1051, "tcp"}, -{"optima-vnet", {NULL}, 1051, "udp"}, -{"ddt", {NULL}, 1052, "tcp"}, -{"ddt", {NULL}, 1052, "udp"}, -{"remote-as", {NULL}, 1053, "tcp"}, -{"remote-as", {NULL}, 1053, "udp"}, -{"brvread", {NULL}, 1054, "tcp"}, -{"brvread", {NULL}, 1054, "udp"}, -{"ansyslmd", {NULL}, 1055, "tcp"}, -{"ansyslmd", {NULL}, 1055, "udp"}, -{"vfo", {NULL}, 1056, "tcp"}, -{"vfo", {NULL}, 1056, "udp"}, -{"startron", {NULL}, 1057, "tcp"}, -{"startron", {NULL}, 1057, "udp"}, -{"nim", {NULL}, 1058, "tcp"}, -{"nim", {NULL}, 1058, "udp"}, -{"nimreg", {NULL}, 1059, "tcp"}, -{"nimreg", {NULL}, 1059, "udp"}, -{"polestar", {NULL}, 1060, "tcp"}, -{"polestar", {NULL}, 1060, "udp"}, -{"kiosk", {NULL}, 1061, "tcp"}, -{"kiosk", {NULL}, 1061, "udp"}, -{"veracity", {NULL}, 1062, "tcp"}, -{"veracity", {NULL}, 1062, "udp"}, -{"kyoceranetdev", {NULL}, 1063, "tcp"}, -{"kyoceranetdev", {NULL}, 1063, "udp"}, -{"jstel", {NULL}, 1064, "tcp"}, -{"jstel", {NULL}, 1064, "udp"}, -{"syscomlan", {NULL}, 1065, "tcp"}, -{"syscomlan", {NULL}, 1065, "udp"}, -{"fpo-fns", {NULL}, 1066, "tcp"}, -{"fpo-fns", {NULL}, 1066, "udp"}, -{"instl_boots", {NULL}, 1067, "tcp"}, -{"instl_boots", {NULL}, 1067, "udp"}, -{"instl_bootc", {NULL}, 1068, "tcp"}, -{"instl_bootc", {NULL}, 1068, "udp"}, -{"cognex-insight", {NULL}, 1069, "tcp"}, -{"cognex-insight", {NULL}, 1069, "udp"}, -{"gmrupdateserv", {NULL}, 1070, "tcp"}, -{"gmrupdateserv", {NULL}, 1070, "udp"}, -{"bsquare-voip", {NULL}, 1071, "tcp"}, -{"bsquare-voip", {NULL}, 1071, "udp"}, -{"cardax", {NULL}, 1072, "tcp"}, -{"cardax", {NULL}, 1072, "udp"}, -{"bridgecontrol", {NULL}, 1073, "tcp"}, -{"bridgecontrol", {NULL}, 1073, "udp"}, -{"warmspotMgmt", {NULL}, 1074, "tcp"}, -{"warmspotMgmt", {NULL}, 1074, "udp"}, -{"rdrmshc", {NULL}, 1075, "tcp"}, -{"rdrmshc", {NULL}, 1075, "udp"}, -{"dab-sti-c", {NULL}, 1076, "tcp"}, -{"dab-sti-c", {NULL}, 1076, "udp"}, -{"imgames", {NULL}, 1077, "tcp"}, -{"imgames", {NULL}, 1077, "udp"}, -{"avocent-proxy", {NULL}, 1078, "tcp"}, -{"avocent-proxy", {NULL}, 1078, "udp"}, -{"asprovatalk", {NULL}, 1079, "tcp"}, -{"asprovatalk", {NULL}, 1079, "udp"}, -{"socks", {NULL}, 1080, "tcp"}, -{"socks", {NULL}, 1080, "udp"}, -{"pvuniwien", {NULL}, 1081, "tcp"}, -{"pvuniwien", {NULL}, 1081, "udp"}, -{"amt-esd-prot", {NULL}, 1082, "tcp"}, -{"amt-esd-prot", {NULL}, 1082, "udp"}, -{"ansoft-lm-1", {NULL}, 1083, "tcp"}, -{"ansoft-lm-1", {NULL}, 1083, "udp"}, -{"ansoft-lm-2", {NULL}, 1084, "tcp"}, -{"ansoft-lm-2", {NULL}, 1084, "udp"}, -{"webobjects", {NULL}, 1085, "tcp"}, -{"webobjects", {NULL}, 1085, "udp"}, -{"cplscrambler-lg", {NULL}, 1086, "tcp"}, -{"cplscrambler-lg", {NULL}, 1086, "udp"}, -{"cplscrambler-in", {NULL}, 1087, "tcp"}, -{"cplscrambler-in", {NULL}, 1087, "udp"}, -{"cplscrambler-al", {NULL}, 1088, "tcp"}, -{"cplscrambler-al", {NULL}, 1088, "udp"}, -{"ff-annunc", {NULL}, 1089, "tcp"}, -{"ff-annunc", {NULL}, 1089, "udp"}, -{"ff-fms", {NULL}, 1090, "tcp"}, -{"ff-fms", {NULL}, 1090, "udp"}, -{"ff-sm", {NULL}, 1091, "tcp"}, -{"ff-sm", {NULL}, 1091, "udp"}, -{"obrpd", {NULL}, 1092, "tcp"}, -{"obrpd", {NULL}, 1092, "udp"}, -{"proofd", {NULL}, 1093, "tcp"}, -{"proofd", {NULL}, 1093, "udp"}, -{"rootd", {NULL}, 1094, "tcp"}, -{"rootd", {NULL}, 1094, "udp"}, -{"nicelink", {NULL}, 1095, "tcp"}, -{"nicelink", {NULL}, 1095, "udp"}, -{"cnrprotocol", {NULL}, 1096, "tcp"}, -{"cnrprotocol", {NULL}, 1096, "udp"}, -{"sunclustermgr", {NULL}, 1097, "tcp"}, -{"sunclustermgr", {NULL}, 1097, "udp"}, -{"rmiactivation", {NULL}, 1098, "tcp"}, -{"rmiactivation", {NULL}, 1098, "udp"}, -{"rmiregistry", {NULL}, 1099, "tcp"}, -{"rmiregistry", {NULL}, 1099, "udp"}, -{"mctp", {NULL}, 1100, "tcp"}, -{"mctp", {NULL}, 1100, "udp"}, -{"pt2-discover", {NULL}, 1101, "tcp"}, -{"pt2-discover", {NULL}, 1101, "udp"}, -{"adobeserver-1", {NULL}, 1102, "tcp"}, -{"adobeserver-1", {NULL}, 1102, "udp"}, -{"adobeserver-2", {NULL}, 1103, "tcp"}, -{"adobeserver-2", {NULL}, 1103, "udp"}, -{"xrl", {NULL}, 1104, "tcp"}, -{"xrl", {NULL}, 1104, "udp"}, -{"ftranhc", {NULL}, 1105, "tcp"}, -{"ftranhc", {NULL}, 1105, "udp"}, -{"isoipsigport-1", {NULL}, 1106, "tcp"}, -{"isoipsigport-1", {NULL}, 1106, "udp"}, -{"isoipsigport-2", {NULL}, 1107, "tcp"}, -{"isoipsigport-2", {NULL}, 1107, "udp"}, -{"ratio-adp", {NULL}, 1108, "tcp"}, -{"ratio-adp", {NULL}, 1108, "udp"}, -{"webadmstart", {NULL}, 1110, "tcp"}, -{"nfsd-keepalive", {NULL}, 1110, "udp"}, -{"lmsocialserver", {NULL}, 1111, "tcp"}, -{"lmsocialserver", {NULL}, 1111, "udp"}, -{"icp", {NULL}, 1112, "tcp"}, -{"icp", {NULL}, 1112, "udp"}, -{"ltp-deepspace", {NULL}, 1113, "tcp"}, -{"ltp-deepspace", {NULL}, 1113, "udp"}, -{"mini-sql", {NULL}, 1114, "tcp"}, -{"mini-sql", {NULL}, 1114, "udp"}, -{"ardus-trns", {NULL}, 1115, "tcp"}, -{"ardus-trns", {NULL}, 1115, "udp"}, -{"ardus-cntl", {NULL}, 1116, "tcp"}, -{"ardus-cntl", {NULL}, 1116, "udp"}, -{"ardus-mtrns", {NULL}, 1117, "tcp"}, -{"ardus-mtrns", {NULL}, 1117, "udp"}, -{"sacred", {NULL}, 1118, "tcp"}, -{"sacred", {NULL}, 1118, "udp"}, -{"bnetgame", {NULL}, 1119, "tcp"}, -{"bnetgame", {NULL}, 1119, "udp"}, -{"bnetfile", {NULL}, 1120, "tcp"}, -{"bnetfile", {NULL}, 1120, "udp"}, -{"rmpp", {NULL}, 1121, "tcp"}, -{"rmpp", {NULL}, 1121, "udp"}, -{"availant-mgr", {NULL}, 1122, "tcp"}, -{"availant-mgr", {NULL}, 1122, "udp"}, -{"murray", {NULL}, 1123, "tcp"}, -{"murray", {NULL}, 1123, "udp"}, -{"hpvmmcontrol", {NULL}, 1124, "tcp"}, -{"hpvmmcontrol", {NULL}, 1124, "udp"}, -{"hpvmmagent", {NULL}, 1125, "tcp"}, -{"hpvmmagent", {NULL}, 1125, "udp"}, -{"hpvmmdata", {NULL}, 1126, "tcp"}, -{"hpvmmdata", {NULL}, 1126, "udp"}, -{"kwdb-commn", {NULL}, 1127, "tcp"}, -{"kwdb-commn", {NULL}, 1127, "udp"}, -{"saphostctrl", {NULL}, 1128, "tcp"}, -{"saphostctrl", {NULL}, 1128, "udp"}, -{"saphostctrls", {NULL}, 1129, "tcp"}, -{"saphostctrls", {NULL}, 1129, "udp"}, -{"casp", {NULL}, 1130, "tcp"}, -{"casp", {NULL}, 1130, "udp"}, -{"caspssl", {NULL}, 1131, "tcp"}, -{"caspssl", {NULL}, 1131, "udp"}, -{"kvm-via-ip", {NULL}, 1132, "tcp"}, -{"kvm-via-ip", {NULL}, 1132, "udp"}, -{"dfn", {NULL}, 1133, "tcp"}, -{"dfn", {NULL}, 1133, "udp"}, -{"aplx", {NULL}, 1134, "tcp"}, -{"aplx", {NULL}, 1134, "udp"}, -{"omnivision", {NULL}, 1135, "tcp"}, -{"omnivision", {NULL}, 1135, "udp"}, -{"hhb-gateway", {NULL}, 1136, "tcp"}, -{"hhb-gateway", {NULL}, 1136, "udp"}, -{"trim", {NULL}, 1137, "tcp"}, -{"trim", {NULL}, 1137, "udp"}, -{"encrypted_admin", {NULL}, 1138, "tcp"}, -{"encrypted_admin", {NULL}, 1138, "udp"}, -{"evm", {NULL}, 1139, "tcp"}, -{"evm", {NULL}, 1139, "udp"}, -{"autonoc", {NULL}, 1140, "tcp"}, -{"autonoc", {NULL}, 1140, "udp"}, -{"mxomss", {NULL}, 1141, "tcp"}, -{"mxomss", {NULL}, 1141, "udp"}, -{"edtools", {NULL}, 1142, "tcp"}, -{"edtools", {NULL}, 1142, "udp"}, -{"imyx", {NULL}, 1143, "tcp"}, -{"imyx", {NULL}, 1143, "udp"}, -{"fuscript", {NULL}, 1144, "tcp"}, -{"fuscript", {NULL}, 1144, "udp"}, -{"x9-icue", {NULL}, 1145, "tcp"}, -{"x9-icue", {NULL}, 1145, "udp"}, -{"audit-transfer", {NULL}, 1146, "tcp"}, -{"audit-transfer", {NULL}, 1146, "udp"}, -{"capioverlan", {NULL}, 1147, "tcp"}, -{"capioverlan", {NULL}, 1147, "udp"}, -{"elfiq-repl", {NULL}, 1148, "tcp"}, -{"elfiq-repl", {NULL}, 1148, "udp"}, -{"bvtsonar", {NULL}, 1149, "tcp"}, -{"bvtsonar", {NULL}, 1149, "udp"}, -{"blaze", {NULL}, 1150, "tcp"}, -{"blaze", {NULL}, 1150, "udp"}, -{"unizensus", {NULL}, 1151, "tcp"}, -{"unizensus", {NULL}, 1151, "udp"}, -{"winpoplanmess", {NULL}, 1152, "tcp"}, -{"winpoplanmess", {NULL}, 1152, "udp"}, -{"c1222-acse", {NULL}, 1153, "tcp"}, -{"c1222-acse", {NULL}, 1153, "udp"}, -{"resacommunity", {NULL}, 1154, "tcp"}, -{"resacommunity", {NULL}, 1154, "udp"}, -{"nfa", {NULL}, 1155, "tcp"}, -{"nfa", {NULL}, 1155, "udp"}, -{"iascontrol-oms", {NULL}, 1156, "tcp"}, -{"iascontrol-oms", {NULL}, 1156, "udp"}, -{"iascontrol", {NULL}, 1157, "tcp"}, -{"iascontrol", {NULL}, 1157, "udp"}, -{"dbcontrol-oms", {NULL}, 1158, "tcp"}, -{"dbcontrol-oms", {NULL}, 1158, "udp"}, -{"oracle-oms", {NULL}, 1159, "tcp"}, -{"oracle-oms", {NULL}, 1159, "udp"}, -{"olsv", {NULL}, 1160, "tcp"}, -{"olsv", {NULL}, 1160, "udp"}, -{"health-polling", {NULL}, 1161, "tcp"}, -{"health-polling", {NULL}, 1161, "udp"}, -{"health-trap", {NULL}, 1162, "tcp"}, -{"health-trap", {NULL}, 1162, "udp"}, -{"sddp", {NULL}, 1163, "tcp"}, -{"sddp", {NULL}, 1163, "udp"}, -{"qsm-proxy", {NULL}, 1164, "tcp"}, -{"qsm-proxy", {NULL}, 1164, "udp"}, -{"qsm-gui", {NULL}, 1165, "tcp"}, -{"qsm-gui", {NULL}, 1165, "udp"}, -{"qsm-remote", {NULL}, 1166, "tcp"}, -{"qsm-remote", {NULL}, 1166, "udp"}, -{"cisco-ipsla", {NULL}, 1167, "tcp"}, -{"cisco-ipsla", {NULL}, 1167, "udp"}, -{"cisco-ipsla", {NULL}, 1167, "sctp"}, -{"vchat", {NULL}, 1168, "tcp"}, -{"vchat", {NULL}, 1168, "udp"}, -{"tripwire", {NULL}, 1169, "tcp"}, -{"tripwire", {NULL}, 1169, "udp"}, -{"atc-lm", {NULL}, 1170, "tcp"}, -{"atc-lm", {NULL}, 1170, "udp"}, -{"atc-appserver", {NULL}, 1171, "tcp"}, -{"atc-appserver", {NULL}, 1171, "udp"}, -{"dnap", {NULL}, 1172, "tcp"}, -{"dnap", {NULL}, 1172, "udp"}, -{"d-cinema-rrp", {NULL}, 1173, "tcp"}, -{"d-cinema-rrp", {NULL}, 1173, "udp"}, -{"fnet-remote-ui", {NULL}, 1174, "tcp"}, -{"fnet-remote-ui", {NULL}, 1174, "udp"}, -{"dossier", {NULL}, 1175, "tcp"}, -{"dossier", {NULL}, 1175, "udp"}, -{"indigo-server", {NULL}, 1176, "tcp"}, -{"indigo-server", {NULL}, 1176, "udp"}, -{"dkmessenger", {NULL}, 1177, "tcp"}, -{"dkmessenger", {NULL}, 1177, "udp"}, -{"sgi-storman", {NULL}, 1178, "tcp"}, -{"sgi-storman", {NULL}, 1178, "udp"}, -{"b2n", {NULL}, 1179, "tcp"}, -{"b2n", {NULL}, 1179, "udp"}, -{"mc-client", {NULL}, 1180, "tcp"}, -{"mc-client", {NULL}, 1180, "udp"}, -{"3comnetman", {NULL}, 1181, "tcp"}, -{"3comnetman", {NULL}, 1181, "udp"}, -{"accelenet", {NULL}, 1182, "tcp"}, -{"accelenet-data", {NULL}, 1182, "udp"}, -{"llsurfup-http", {NULL}, 1183, "tcp"}, -{"llsurfup-http", {NULL}, 1183, "udp"}, -{"llsurfup-https", {NULL}, 1184, "tcp"}, -{"llsurfup-https", {NULL}, 1184, "udp"}, -{"catchpole", {NULL}, 1185, "tcp"}, -{"catchpole", {NULL}, 1185, "udp"}, -{"mysql-cluster", {NULL}, 1186, "tcp"}, -{"mysql-cluster", {NULL}, 1186, "udp"}, -{"alias", {NULL}, 1187, "tcp"}, -{"alias", {NULL}, 1187, "udp"}, -{"hp-webadmin", {NULL}, 1188, "tcp"}, -{"hp-webadmin", {NULL}, 1188, "udp"}, -{"unet", {NULL}, 1189, "tcp"}, -{"unet", {NULL}, 1189, "udp"}, -{"commlinx-avl", {NULL}, 1190, "tcp"}, -{"commlinx-avl", {NULL}, 1190, "udp"}, -{"gpfs", {NULL}, 1191, "tcp"}, -{"gpfs", {NULL}, 1191, "udp"}, -{"caids-sensor", {NULL}, 1192, "tcp"}, -{"caids-sensor", {NULL}, 1192, "udp"}, -{"fiveacross", {NULL}, 1193, "tcp"}, -{"fiveacross", {NULL}, 1193, "udp"}, -{"openvpn", {NULL}, 1194, "tcp"}, -{"openvpn", {NULL}, 1194, "udp"}, -{"rsf-1", {NULL}, 1195, "tcp"}, -{"rsf-1", {NULL}, 1195, "udp"}, -{"netmagic", {NULL}, 1196, "tcp"}, -{"netmagic", {NULL}, 1196, "udp"}, -{"carrius-rshell", {NULL}, 1197, "tcp"}, -{"carrius-rshell", {NULL}, 1197, "udp"}, -{"cajo-discovery", {NULL}, 1198, "tcp"}, -{"cajo-discovery", {NULL}, 1198, "udp"}, -{"dmidi", {NULL}, 1199, "tcp"}, -{"dmidi", {NULL}, 1199, "udp"}, -{"scol", {NULL}, 1200, "tcp"}, -{"scol", {NULL}, 1200, "udp"}, -{"nucleus-sand", {NULL}, 1201, "tcp"}, -{"nucleus-sand", {NULL}, 1201, "udp"}, -{"caiccipc", {NULL}, 1202, "tcp"}, -{"caiccipc", {NULL}, 1202, "udp"}, -{"ssslic-mgr", {NULL}, 1203, "tcp"}, -{"ssslic-mgr", {NULL}, 1203, "udp"}, -{"ssslog-mgr", {NULL}, 1204, "tcp"}, -{"ssslog-mgr", {NULL}, 1204, "udp"}, -{"accord-mgc", {NULL}, 1205, "tcp"}, -{"accord-mgc", {NULL}, 1205, "udp"}, -{"anthony-data", {NULL}, 1206, "tcp"}, -{"anthony-data", {NULL}, 1206, "udp"}, -{"metasage", {NULL}, 1207, "tcp"}, -{"metasage", {NULL}, 1207, "udp"}, -{"seagull-ais", {NULL}, 1208, "tcp"}, -{"seagull-ais", {NULL}, 1208, "udp"}, -{"ipcd3", {NULL}, 1209, "tcp"}, -{"ipcd3", {NULL}, 1209, "udp"}, -{"eoss", {NULL}, 1210, "tcp"}, -{"eoss", {NULL}, 1210, "udp"}, -{"groove-dpp", {NULL}, 1211, "tcp"}, -{"groove-dpp", {NULL}, 1211, "udp"}, -{"lupa", {NULL}, 1212, "tcp"}, -{"lupa", {NULL}, 1212, "udp"}, -{"mpc-lifenet", {NULL}, 1213, "tcp"}, -{"mpc-lifenet", {NULL}, 1213, "udp"}, -{"kazaa", {NULL}, 1214, "tcp"}, -{"kazaa", {NULL}, 1214, "udp"}, -{"scanstat-1", {NULL}, 1215, "tcp"}, -{"scanstat-1", {NULL}, 1215, "udp"}, -{"etebac5", {NULL}, 1216, "tcp"}, -{"etebac5", {NULL}, 1216, "udp"}, -{"hpss-ndapi", {NULL}, 1217, "tcp"}, -{"hpss-ndapi", {NULL}, 1217, "udp"}, -{"aeroflight-ads", {NULL}, 1218, "tcp"}, -{"aeroflight-ads", {NULL}, 1218, "udp"}, -{"aeroflight-ret", {NULL}, 1219, "tcp"}, -{"aeroflight-ret", {NULL}, 1219, "udp"}, -{"qt-serveradmin", {NULL}, 1220, "tcp"}, -{"qt-serveradmin", {NULL}, 1220, "udp"}, -{"sweetware-apps", {NULL}, 1221, "tcp"}, -{"sweetware-apps", {NULL}, 1221, "udp"}, -{"nerv", {NULL}, 1222, "tcp"}, -{"nerv", {NULL}, 1222, "udp"}, -{"tgp", {NULL}, 1223, "tcp"}, -{"tgp", {NULL}, 1223, "udp"}, -{"vpnz", {NULL}, 1224, "tcp"}, -{"vpnz", {NULL}, 1224, "udp"}, -{"slinkysearch", {NULL}, 1225, "tcp"}, -{"slinkysearch", {NULL}, 1225, "udp"}, -{"stgxfws", {NULL}, 1226, "tcp"}, -{"stgxfws", {NULL}, 1226, "udp"}, -{"dns2go", {NULL}, 1227, "tcp"}, -{"dns2go", {NULL}, 1227, "udp"}, -{"florence", {NULL}, 1228, "tcp"}, -{"florence", {NULL}, 1228, "udp"}, -{"zented", {NULL}, 1229, "tcp"}, -{"zented", {NULL}, 1229, "udp"}, -{"periscope", {NULL}, 1230, "tcp"}, -{"periscope", {NULL}, 1230, "udp"}, -{"menandmice-lpm", {NULL}, 1231, "tcp"}, -{"menandmice-lpm", {NULL}, 1231, "udp"}, -{"univ-appserver", {NULL}, 1233, "tcp"}, -{"univ-appserver", {NULL}, 1233, "udp"}, -{"search-agent", {NULL}, 1234, "tcp"}, -{"search-agent", {NULL}, 1234, "udp"}, -{"mosaicsyssvc1", {NULL}, 1235, "tcp"}, -{"mosaicsyssvc1", {NULL}, 1235, "udp"}, -{"bvcontrol", {NULL}, 1236, "tcp"}, -{"bvcontrol", {NULL}, 1236, "udp"}, -{"tsdos390", {NULL}, 1237, "tcp"}, -{"tsdos390", {NULL}, 1237, "udp"}, -{"hacl-qs", {NULL}, 1238, "tcp"}, -{"hacl-qs", {NULL}, 1238, "udp"}, -{"nmsd", {NULL}, 1239, "tcp"}, -{"nmsd", {NULL}, 1239, "udp"}, -{"instantia", {NULL}, 1240, "tcp"}, -{"instantia", {NULL}, 1240, "udp"}, -{"nessus", {NULL}, 1241, "tcp"}, -{"nessus", {NULL}, 1241, "udp"}, -{"nmasoverip", {NULL}, 1242, "tcp"}, -{"nmasoverip", {NULL}, 1242, "udp"}, -{"serialgateway", {NULL}, 1243, "tcp"}, -{"serialgateway", {NULL}, 1243, "udp"}, -{"isbconference1", {NULL}, 1244, "tcp"}, -{"isbconference1", {NULL}, 1244, "udp"}, -{"isbconference2", {NULL}, 1245, "tcp"}, -{"isbconference2", {NULL}, 1245, "udp"}, -{"payrouter", {NULL}, 1246, "tcp"}, -{"payrouter", {NULL}, 1246, "udp"}, -{"visionpyramid", {NULL}, 1247, "tcp"}, -{"visionpyramid", {NULL}, 1247, "udp"}, -{"hermes", {NULL}, 1248, "tcp"}, -{"hermes", {NULL}, 1248, "udp"}, -{"mesavistaco", {NULL}, 1249, "tcp"}, -{"mesavistaco", {NULL}, 1249, "udp"}, -{"swldy-sias", {NULL}, 1250, "tcp"}, -{"swldy-sias", {NULL}, 1250, "udp"}, -{"servergraph", {NULL}, 1251, "tcp"}, -{"servergraph", {NULL}, 1251, "udp"}, -{"bspne-pcc", {NULL}, 1252, "tcp"}, -{"bspne-pcc", {NULL}, 1252, "udp"}, -{"q55-pcc", {NULL}, 1253, "tcp"}, -{"q55-pcc", {NULL}, 1253, "udp"}, -{"de-noc", {NULL}, 1254, "tcp"}, -{"de-noc", {NULL}, 1254, "udp"}, -{"de-cache-query", {NULL}, 1255, "tcp"}, -{"de-cache-query", {NULL}, 1255, "udp"}, -{"de-server", {NULL}, 1256, "tcp"}, -{"de-server", {NULL}, 1256, "udp"}, -{"shockwave2", {NULL}, 1257, "tcp"}, -{"shockwave2", {NULL}, 1257, "udp"}, -{"opennl", {NULL}, 1258, "tcp"}, -{"opennl", {NULL}, 1258, "udp"}, -{"opennl-voice", {NULL}, 1259, "tcp"}, -{"opennl-voice", {NULL}, 1259, "udp"}, -{"ibm-ssd", {NULL}, 1260, "tcp"}, -{"ibm-ssd", {NULL}, 1260, "udp"}, -{"mpshrsv", {NULL}, 1261, "tcp"}, -{"mpshrsv", {NULL}, 1261, "udp"}, -{"qnts-orb", {NULL}, 1262, "tcp"}, -{"qnts-orb", {NULL}, 1262, "udp"}, -{"dka", {NULL}, 1263, "tcp"}, -{"dka", {NULL}, 1263, "udp"}, -{"prat", {NULL}, 1264, "tcp"}, -{"prat", {NULL}, 1264, "udp"}, -{"dssiapi", {NULL}, 1265, "tcp"}, -{"dssiapi", {NULL}, 1265, "udp"}, -{"dellpwrappks", {NULL}, 1266, "tcp"}, -{"dellpwrappks", {NULL}, 1266, "udp"}, -{"epc", {NULL}, 1267, "tcp"}, -{"epc", {NULL}, 1267, "udp"}, -{"propel-msgsys", {NULL}, 1268, "tcp"}, -{"propel-msgsys", {NULL}, 1268, "udp"}, -{"watilapp", {NULL}, 1269, "tcp"}, -{"watilapp", {NULL}, 1269, "udp"}, -{"opsmgr", {NULL}, 1270, "tcp"}, -{"opsmgr", {NULL}, 1270, "udp"}, -{"excw", {NULL}, 1271, "tcp"}, -{"excw", {NULL}, 1271, "udp"}, -{"cspmlockmgr", {NULL}, 1272, "tcp"}, -{"cspmlockmgr", {NULL}, 1272, "udp"}, -{"emc-gateway", {NULL}, 1273, "tcp"}, -{"emc-gateway", {NULL}, 1273, "udp"}, -{"t1distproc", {NULL}, 1274, "tcp"}, -{"t1distproc", {NULL}, 1274, "udp"}, -{"ivcollector", {NULL}, 1275, "tcp"}, -{"ivcollector", {NULL}, 1275, "udp"}, -{"ivmanager", {NULL}, 1276, "tcp"}, -{"ivmanager", {NULL}, 1276, "udp"}, -{"miva-mqs", {NULL}, 1277, "tcp"}, -{"miva-mqs", {NULL}, 1277, "udp"}, -{"dellwebadmin-1", {NULL}, 1278, "tcp"}, -{"dellwebadmin-1", {NULL}, 1278, "udp"}, -{"dellwebadmin-2", {NULL}, 1279, "tcp"}, -{"dellwebadmin-2", {NULL}, 1279, "udp"}, -{"pictrography", {NULL}, 1280, "tcp"}, -{"pictrography", {NULL}, 1280, "udp"}, -{"healthd", {NULL}, 1281, "tcp"}, -{"healthd", {NULL}, 1281, "udp"}, -{"emperion", {NULL}, 1282, "tcp"}, -{"emperion", {NULL}, 1282, "udp"}, -{"productinfo", {NULL}, 1283, "tcp"}, -{"productinfo", {NULL}, 1283, "udp"}, -{"iee-qfx", {NULL}, 1284, "tcp"}, -{"iee-qfx", {NULL}, 1284, "udp"}, -{"neoiface", {NULL}, 1285, "tcp"}, -{"neoiface", {NULL}, 1285, "udp"}, -{"netuitive", {NULL}, 1286, "tcp"}, -{"netuitive", {NULL}, 1286, "udp"}, -{"routematch", {NULL}, 1287, "tcp"}, -{"routematch", {NULL}, 1287, "udp"}, -{"navbuddy", {NULL}, 1288, "tcp"}, -{"navbuddy", {NULL}, 1288, "udp"}, -{"jwalkserver", {NULL}, 1289, "tcp"}, -{"jwalkserver", {NULL}, 1289, "udp"}, -{"winjaserver", {NULL}, 1290, "tcp"}, -{"winjaserver", {NULL}, 1290, "udp"}, -{"seagulllms", {NULL}, 1291, "tcp"}, -{"seagulllms", {NULL}, 1291, "udp"}, -{"dsdn", {NULL}, 1292, "tcp"}, -{"dsdn", {NULL}, 1292, "udp"}, -{"pkt-krb-ipsec", {NULL}, 1293, "tcp"}, -{"pkt-krb-ipsec", {NULL}, 1293, "udp"}, -{"cmmdriver", {NULL}, 1294, "tcp"}, -{"cmmdriver", {NULL}, 1294, "udp"}, -{"ehtp", {NULL}, 1295, "tcp"}, -{"ehtp", {NULL}, 1295, "udp"}, -{"dproxy", {NULL}, 1296, "tcp"}, -{"dproxy", {NULL}, 1296, "udp"}, -{"sdproxy", {NULL}, 1297, "tcp"}, -{"sdproxy", {NULL}, 1297, "udp"}, -{"lpcp", {NULL}, 1298, "tcp"}, -{"lpcp", {NULL}, 1298, "udp"}, -{"hp-sci", {NULL}, 1299, "tcp"}, -{"hp-sci", {NULL}, 1299, "udp"}, -{"h323hostcallsc", {NULL}, 1300, "tcp"}, -{"h323hostcallsc", {NULL}, 1300, "udp"}, -{"ci3-software-1", {NULL}, 1301, "tcp"}, -{"ci3-software-1", {NULL}, 1301, "udp"}, -{"ci3-software-2", {NULL}, 1302, "tcp"}, -{"ci3-software-2", {NULL}, 1302, "udp"}, -{"sftsrv", {NULL}, 1303, "tcp"}, -{"sftsrv", {NULL}, 1303, "udp"}, -{"boomerang", {NULL}, 1304, "tcp"}, -{"boomerang", {NULL}, 1304, "udp"}, -{"pe-mike", {NULL}, 1305, "tcp"}, -{"pe-mike", {NULL}, 1305, "udp"}, -{"re-conn-proto", {NULL}, 1306, "tcp"}, -{"re-conn-proto", {NULL}, 1306, "udp"}, -{"pacmand", {NULL}, 1307, "tcp"}, -{"pacmand", {NULL}, 1307, "udp"}, -{"odsi", {NULL}, 1308, "tcp"}, -{"odsi", {NULL}, 1308, "udp"}, -{"jtag-server", {NULL}, 1309, "tcp"}, -{"jtag-server", {NULL}, 1309, "udp"}, -{"husky", {NULL}, 1310, "tcp"}, -{"husky", {NULL}, 1310, "udp"}, -{"rxmon", {NULL}, 1311, "tcp"}, -{"rxmon", {NULL}, 1311, "udp"}, -{"sti-envision", {NULL}, 1312, "tcp"}, -{"sti-envision", {NULL}, 1312, "udp"}, -{"bmc_patroldb", {NULL}, 1313, "tcp"}, -{"bmc_patroldb", {NULL}, 1313, "udp"}, -{"pdps", {NULL}, 1314, "tcp"}, -{"pdps", {NULL}, 1314, "udp"}, -{"els", {NULL}, 1315, "tcp"}, -{"els", {NULL}, 1315, "udp"}, -{"exbit-escp", {NULL}, 1316, "tcp"}, -{"exbit-escp", {NULL}, 1316, "udp"}, -{"vrts-ipcserver", {NULL}, 1317, "tcp"}, -{"vrts-ipcserver", {NULL}, 1317, "udp"}, -{"krb5gatekeeper", {NULL}, 1318, "tcp"}, -{"krb5gatekeeper", {NULL}, 1318, "udp"}, -{"amx-icsp", {NULL}, 1319, "tcp"}, -{"amx-icsp", {NULL}, 1319, "udp"}, -{"amx-axbnet", {NULL}, 1320, "tcp"}, -{"amx-axbnet", {NULL}, 1320, "udp"}, -{"pip", {NULL}, 1321, "tcp"}, -{"pip", {NULL}, 1321, "udp"}, -{"novation", {NULL}, 1322, "tcp"}, -{"novation", {NULL}, 1322, "udp"}, -{"brcd", {NULL}, 1323, "tcp"}, -{"brcd", {NULL}, 1323, "udp"}, -{"delta-mcp", {NULL}, 1324, "tcp"}, -{"delta-mcp", {NULL}, 1324, "udp"}, -{"dx-instrument", {NULL}, 1325, "tcp"}, -{"dx-instrument", {NULL}, 1325, "udp"}, -{"wimsic", {NULL}, 1326, "tcp"}, -{"wimsic", {NULL}, 1326, "udp"}, -{"ultrex", {NULL}, 1327, "tcp"}, -{"ultrex", {NULL}, 1327, "udp"}, -{"ewall", {NULL}, 1328, "tcp"}, -{"ewall", {NULL}, 1328, "udp"}, -{"netdb-export", {NULL}, 1329, "tcp"}, -{"netdb-export", {NULL}, 1329, "udp"}, -{"streetperfect", {NULL}, 1330, "tcp"}, -{"streetperfect", {NULL}, 1330, "udp"}, -{"intersan", {NULL}, 1331, "tcp"}, -{"intersan", {NULL}, 1331, "udp"}, -{"pcia-rxp-b", {NULL}, 1332, "tcp"}, -{"pcia-rxp-b", {NULL}, 1332, "udp"}, -{"passwrd-policy", {NULL}, 1333, "tcp"}, -{"passwrd-policy", {NULL}, 1333, "udp"}, -{"writesrv", {NULL}, 1334, "tcp"}, -{"writesrv", {NULL}, 1334, "udp"}, -{"digital-notary", {NULL}, 1335, "tcp"}, -{"digital-notary", {NULL}, 1335, "udp"}, -{"ischat", {NULL}, 1336, "tcp"}, -{"ischat", {NULL}, 1336, "udp"}, -{"menandmice-dns", {NULL}, 1337, "tcp"}, -{"menandmice-dns", {NULL}, 1337, "udp"}, -{"wmc-log-svc", {NULL}, 1338, "tcp"}, -{"wmc-log-svc", {NULL}, 1338, "udp"}, -{"kjtsiteserver", {NULL}, 1339, "tcp"}, -{"kjtsiteserver", {NULL}, 1339, "udp"}, -{"naap", {NULL}, 1340, "tcp"}, -{"naap", {NULL}, 1340, "udp"}, -{"qubes", {NULL}, 1341, "tcp"}, -{"qubes", {NULL}, 1341, "udp"}, -{"esbroker", {NULL}, 1342, "tcp"}, -{"esbroker", {NULL}, 1342, "udp"}, -{"re101", {NULL}, 1343, "tcp"}, -{"re101", {NULL}, 1343, "udp"}, -{"icap", {NULL}, 1344, "tcp"}, -{"icap", {NULL}, 1344, "udp"}, -{"vpjp", {NULL}, 1345, "tcp"}, -{"vpjp", {NULL}, 1345, "udp"}, -{"alta-ana-lm", {NULL}, 1346, "tcp"}, -{"alta-ana-lm", {NULL}, 1346, "udp"}, -{"bbn-mmc", {NULL}, 1347, "tcp"}, -{"bbn-mmc", {NULL}, 1347, "udp"}, -{"bbn-mmx", {NULL}, 1348, "tcp"}, -{"bbn-mmx", {NULL}, 1348, "udp"}, -{"sbook", {NULL}, 1349, "tcp"}, -{"sbook", {NULL}, 1349, "udp"}, -{"editbench", {NULL}, 1350, "tcp"}, -{"editbench", {NULL}, 1350, "udp"}, -{"equationbuilder", {NULL}, 1351, "tcp"}, -{"equationbuilder", {NULL}, 1351, "udp"}, -{"lotusnote", {NULL}, 1352, "tcp"}, -{"lotusnote", {NULL}, 1352, "udp"}, -{"relief", {NULL}, 1353, "tcp"}, -{"relief", {NULL}, 1353, "udp"}, -{"XSIP-network", {NULL}, 1354, "tcp"}, -{"XSIP-network", {NULL}, 1354, "udp"}, -{"intuitive-edge", {NULL}, 1355, "tcp"}, -{"intuitive-edge", {NULL}, 1355, "udp"}, -{"cuillamartin", {NULL}, 1356, "tcp"}, -{"cuillamartin", {NULL}, 1356, "udp"}, -{"pegboard", {NULL}, 1357, "tcp"}, -{"pegboard", {NULL}, 1357, "udp"}, -{"connlcli", {NULL}, 1358, "tcp"}, -{"connlcli", {NULL}, 1358, "udp"}, -{"ftsrv", {NULL}, 1359, "tcp"}, -{"ftsrv", {NULL}, 1359, "udp"}, -{"mimer", {NULL}, 1360, "tcp"}, -{"mimer", {NULL}, 1360, "udp"}, -{"linx", {NULL}, 1361, "tcp"}, -{"linx", {NULL}, 1361, "udp"}, -{"timeflies", {NULL}, 1362, "tcp"}, -{"timeflies", {NULL}, 1362, "udp"}, -{"ndm-requester", {NULL}, 1363, "tcp"}, -{"ndm-requester", {NULL}, 1363, "udp"}, -{"ndm-server", {NULL}, 1364, "tcp"}, -{"ndm-server", {NULL}, 1364, "udp"}, -{"adapt-sna", {NULL}, 1365, "tcp"}, -{"adapt-sna", {NULL}, 1365, "udp"}, -{"netware-csp", {NULL}, 1366, "tcp"}, -{"netware-csp", {NULL}, 1366, "udp"}, -{"dcs", {NULL}, 1367, "tcp"}, -{"dcs", {NULL}, 1367, "udp"}, -{"screencast", {NULL}, 1368, "tcp"}, -{"screencast", {NULL}, 1368, "udp"}, -{"gv-us", {NULL}, 1369, "tcp"}, -{"gv-us", {NULL}, 1369, "udp"}, -{"us-gv", {NULL}, 1370, "tcp"}, -{"us-gv", {NULL}, 1370, "udp"}, -{"fc-cli", {NULL}, 1371, "tcp"}, -{"fc-cli", {NULL}, 1371, "udp"}, -{"fc-ser", {NULL}, 1372, "tcp"}, -{"fc-ser", {NULL}, 1372, "udp"}, -{"chromagrafx", {NULL}, 1373, "tcp"}, -{"chromagrafx", {NULL}, 1373, "udp"}, -{"molly", {NULL}, 1374, "tcp"}, -{"molly", {NULL}, 1374, "udp"}, -{"bytex", {NULL}, 1375, "tcp"}, -{"bytex", {NULL}, 1375, "udp"}, -{"ibm-pps", {NULL}, 1376, "tcp"}, -{"ibm-pps", {NULL}, 1376, "udp"}, -{"cichlid", {NULL}, 1377, "tcp"}, -{"cichlid", {NULL}, 1377, "udp"}, -{"elan", {NULL}, 1378, "tcp"}, -{"elan", {NULL}, 1378, "udp"}, -{"dbreporter", {NULL}, 1379, "tcp"}, -{"dbreporter", {NULL}, 1379, "udp"}, -{"telesis-licman", {NULL}, 1380, "tcp"}, -{"telesis-licman", {NULL}, 1380, "udp"}, -{"apple-licman", {NULL}, 1381, "tcp"}, -{"apple-licman", {NULL}, 1381, "udp"}, -{"udt_os", {NULL}, 1382, "tcp"}, -{"udt_os", {NULL}, 1382, "udp"}, -{"gwha", {NULL}, 1383, "tcp"}, -{"gwha", {NULL}, 1383, "udp"}, -{"os-licman", {NULL}, 1384, "tcp"}, -{"os-licman", {NULL}, 1384, "udp"}, -{"atex_elmd", {NULL}, 1385, "tcp"}, -{"atex_elmd", {NULL}, 1385, "udp"}, -{"checksum", {NULL}, 1386, "tcp"}, -{"checksum", {NULL}, 1386, "udp"}, -{"cadsi-lm", {NULL}, 1387, "tcp"}, -{"cadsi-lm", {NULL}, 1387, "udp"}, -{"objective-dbc", {NULL}, 1388, "tcp"}, -{"objective-dbc", {NULL}, 1388, "udp"}, -{"iclpv-dm", {NULL}, 1389, "tcp"}, -{"iclpv-dm", {NULL}, 1389, "udp"}, -{"iclpv-sc", {NULL}, 1390, "tcp"}, -{"iclpv-sc", {NULL}, 1390, "udp"}, -{"iclpv-sas", {NULL}, 1391, "tcp"}, -{"iclpv-sas", {NULL}, 1391, "udp"}, -{"iclpv-pm", {NULL}, 1392, "tcp"}, -{"iclpv-pm", {NULL}, 1392, "udp"}, -{"iclpv-nls", {NULL}, 1393, "tcp"}, -{"iclpv-nls", {NULL}, 1393, "udp"}, -{"iclpv-nlc", {NULL}, 1394, "tcp"}, -{"iclpv-nlc", {NULL}, 1394, "udp"}, -{"iclpv-wsm", {NULL}, 1395, "tcp"}, -{"iclpv-wsm", {NULL}, 1395, "udp"}, -{"dvl-activemail", {NULL}, 1396, "tcp"}, -{"dvl-activemail", {NULL}, 1396, "udp"}, -{"audio-activmail", {NULL}, 1397, "tcp"}, -{"audio-activmail", {NULL}, 1397, "udp"}, -{"video-activmail", {NULL}, 1398, "tcp"}, -{"video-activmail", {NULL}, 1398, "udp"}, -{"cadkey-licman", {NULL}, 1399, "tcp"}, -{"cadkey-licman", {NULL}, 1399, "udp"}, -{"cadkey-tablet", {NULL}, 1400, "tcp"}, -{"cadkey-tablet", {NULL}, 1400, "udp"}, -{"goldleaf-licman", {NULL}, 1401, "tcp"}, -{"goldleaf-licman", {NULL}, 1401, "udp"}, -{"prm-sm-np", {NULL}, 1402, "tcp"}, -{"prm-sm-np", {NULL}, 1402, "udp"}, -{"prm-nm-np", {NULL}, 1403, "tcp"}, -{"prm-nm-np", {NULL}, 1403, "udp"}, -{"igi-lm", {NULL}, 1404, "tcp"}, -{"igi-lm", {NULL}, 1404, "udp"}, -{"ibm-res", {NULL}, 1405, "tcp"}, -{"ibm-res", {NULL}, 1405, "udp"}, -{"netlabs-lm", {NULL}, 1406, "tcp"}, -{"netlabs-lm", {NULL}, 1406, "udp"}, -{"dbsa-lm", {NULL}, 1407, "tcp"}, -{"dbsa-lm", {NULL}, 1407, "udp"}, -{"sophia-lm", {NULL}, 1408, "tcp"}, -{"sophia-lm", {NULL}, 1408, "udp"}, -{"here-lm", {NULL}, 1409, "tcp"}, -{"here-lm", {NULL}, 1409, "udp"}, -{"hiq", {NULL}, 1410, "tcp"}, -{"hiq", {NULL}, 1410, "udp"}, -{"af", {NULL}, 1411, "tcp"}, -{"af", {NULL}, 1411, "udp"}, -{"innosys", {NULL}, 1412, "tcp"}, -{"innosys", {NULL}, 1412, "udp"}, -{"innosys-acl", {NULL}, 1413, "tcp"}, -{"innosys-acl", {NULL}, 1413, "udp"}, -{"ibm-mqseries", {NULL}, 1414, "tcp"}, -{"ibm-mqseries", {NULL}, 1414, "udp"}, -{"dbstar", {NULL}, 1415, "tcp"}, -{"dbstar", {NULL}, 1415, "udp"}, -{"novell-lu6.2", {NULL}, 1416, "tcp"}, -{"novell-lu6.2", {NULL}, 1416, "udp"}, -{"timbuktu-srv1", {NULL}, 1417, "tcp"}, -{"timbuktu-srv1", {NULL}, 1417, "udp"}, -{"timbuktu-srv2", {NULL}, 1418, "tcp"}, -{"timbuktu-srv2", {NULL}, 1418, "udp"}, -{"timbuktu-srv3", {NULL}, 1419, "tcp"}, -{"timbuktu-srv3", {NULL}, 1419, "udp"}, -{"timbuktu-srv4", {NULL}, 1420, "tcp"}, -{"timbuktu-srv4", {NULL}, 1420, "udp"}, -{"gandalf-lm", {NULL}, 1421, "tcp"}, -{"gandalf-lm", {NULL}, 1421, "udp"}, -{"autodesk-lm", {NULL}, 1422, "tcp"}, -{"autodesk-lm", {NULL}, 1422, "udp"}, -{"essbase", {NULL}, 1423, "tcp"}, -{"essbase", {NULL}, 1423, "udp"}, -{"hybrid", {NULL}, 1424, "tcp"}, -{"hybrid", {NULL}, 1424, "udp"}, -{"zion-lm", {NULL}, 1425, "tcp"}, -{"zion-lm", {NULL}, 1425, "udp"}, -{"sais", {NULL}, 1426, "tcp"}, -{"sais", {NULL}, 1426, "udp"}, -{"mloadd", {NULL}, 1427, "tcp"}, -{"mloadd", {NULL}, 1427, "udp"}, -{"informatik-lm", {NULL}, 1428, "tcp"}, -{"informatik-lm", {NULL}, 1428, "udp"}, -{"nms", {NULL}, 1429, "tcp"}, -{"nms", {NULL}, 1429, "udp"}, -{"tpdu", {NULL}, 1430, "tcp"}, -{"tpdu", {NULL}, 1430, "udp"}, -{"rgtp", {NULL}, 1431, "tcp"}, -{"rgtp", {NULL}, 1431, "udp"}, -{"blueberry-lm", {NULL}, 1432, "tcp"}, -{"blueberry-lm", {NULL}, 1432, "udp"}, -{"ms-sql-s", {NULL}, 1433, "tcp"}, -{"ms-sql-s", {NULL}, 1433, "udp"}, -{"ms-sql-m", {NULL}, 1434, "tcp"}, -{"ms-sql-m", {NULL}, 1434, "udp"}, -{"ibm-cics", {NULL}, 1435, "tcp"}, -{"ibm-cics", {NULL}, 1435, "udp"}, -{"saism", {NULL}, 1436, "tcp"}, -{"saism", {NULL}, 1436, "udp"}, -{"tabula", {NULL}, 1437, "tcp"}, -{"tabula", {NULL}, 1437, "udp"}, -{"eicon-server", {NULL}, 1438, "tcp"}, -{"eicon-server", {NULL}, 1438, "udp"}, -{"eicon-x25", {NULL}, 1439, "tcp"}, -{"eicon-x25", {NULL}, 1439, "udp"}, -{"eicon-slp", {NULL}, 1440, "tcp"}, -{"eicon-slp", {NULL}, 1440, "udp"}, -{"cadis-1", {NULL}, 1441, "tcp"}, -{"cadis-1", {NULL}, 1441, "udp"}, -{"cadis-2", {NULL}, 1442, "tcp"}, -{"cadis-2", {NULL}, 1442, "udp"}, -{"ies-lm", {NULL}, 1443, "tcp"}, -{"ies-lm", {NULL}, 1443, "udp"}, -{"marcam-lm", {NULL}, 1444, "tcp"}, -{"marcam-lm", {NULL}, 1444, "udp"}, -{"proxima-lm", {NULL}, 1445, "tcp"}, -{"proxima-lm", {NULL}, 1445, "udp"}, -{"ora-lm", {NULL}, 1446, "tcp"}, -{"ora-lm", {NULL}, 1446, "udp"}, -{"apri-lm", {NULL}, 1447, "tcp"}, -{"apri-lm", {NULL}, 1447, "udp"}, -{"oc-lm", {NULL}, 1448, "tcp"}, -{"oc-lm", {NULL}, 1448, "udp"}, -{"peport", {NULL}, 1449, "tcp"}, -{"peport", {NULL}, 1449, "udp"}, -{"dwf", {NULL}, 1450, "tcp"}, -{"dwf", {NULL}, 1450, "udp"}, -{"infoman", {NULL}, 1451, "tcp"}, -{"infoman", {NULL}, 1451, "udp"}, -{"gtegsc-lm", {NULL}, 1452, "tcp"}, -{"gtegsc-lm", {NULL}, 1452, "udp"}, -{"genie-lm", {NULL}, 1453, "tcp"}, -{"genie-lm", {NULL}, 1453, "udp"}, -{"interhdl_elmd", {NULL}, 1454, "tcp"}, -{"interhdl_elmd", {NULL}, 1454, "udp"}, -{"esl-lm", {NULL}, 1455, "tcp"}, -{"esl-lm", {NULL}, 1455, "udp"}, -{"dca", {NULL}, 1456, "tcp"}, -{"dca", {NULL}, 1456, "udp"}, -{"valisys-lm", {NULL}, 1457, "tcp"}, -{"valisys-lm", {NULL}, 1457, "udp"}, -{"nrcabq-lm", {NULL}, 1458, "tcp"}, -{"nrcabq-lm", {NULL}, 1458, "udp"}, -{"proshare1", {NULL}, 1459, "tcp"}, -{"proshare1", {NULL}, 1459, "udp"}, -{"proshare2", {NULL}, 1460, "tcp"}, -{"proshare2", {NULL}, 1460, "udp"}, -{"ibm_wrless_lan", {NULL}, 1461, "tcp"}, -{"ibm_wrless_lan", {NULL}, 1461, "udp"}, -{"world-lm", {NULL}, 1462, "tcp"}, -{"world-lm", {NULL}, 1462, "udp"}, -{"nucleus", {NULL}, 1463, "tcp"}, -{"nucleus", {NULL}, 1463, "udp"}, -{"msl_lmd", {NULL}, 1464, "tcp"}, -{"msl_lmd", {NULL}, 1464, "udp"}, -{"pipes", {NULL}, 1465, "tcp"}, -{"pipes", {NULL}, 1465, "udp"}, -{"oceansoft-lm", {NULL}, 1466, "tcp"}, -{"oceansoft-lm", {NULL}, 1466, "udp"}, -{"csdmbase", {NULL}, 1467, "tcp"}, -{"csdmbase", {NULL}, 1467, "udp"}, -{"csdm", {NULL}, 1468, "tcp"}, -{"csdm", {NULL}, 1468, "udp"}, -{"aal-lm", {NULL}, 1469, "tcp"}, -{"aal-lm", {NULL}, 1469, "udp"}, -{"uaiact", {NULL}, 1470, "tcp"}, -{"uaiact", {NULL}, 1470, "udp"}, -{"csdmbase", {NULL}, 1471, "tcp"}, -{"csdmbase", {NULL}, 1471, "udp"}, -{"csdm", {NULL}, 1472, "tcp"}, -{"csdm", {NULL}, 1472, "udp"}, -{"openmath", {NULL}, 1473, "tcp"}, -{"openmath", {NULL}, 1473, "udp"}, -{"telefinder", {NULL}, 1474, "tcp"}, -{"telefinder", {NULL}, 1474, "udp"}, -{"taligent-lm", {NULL}, 1475, "tcp"}, -{"taligent-lm", {NULL}, 1475, "udp"}, -{"clvm-cfg", {NULL}, 1476, "tcp"}, -{"clvm-cfg", {NULL}, 1476, "udp"}, -{"ms-sna-server", {NULL}, 1477, "tcp"}, -{"ms-sna-server", {NULL}, 1477, "udp"}, -{"ms-sna-base", {NULL}, 1478, "tcp"}, -{"ms-sna-base", {NULL}, 1478, "udp"}, -{"dberegister", {NULL}, 1479, "tcp"}, -{"dberegister", {NULL}, 1479, "udp"}, -{"pacerforum", {NULL}, 1480, "tcp"}, -{"pacerforum", {NULL}, 1480, "udp"}, -{"airs", {NULL}, 1481, "tcp"}, -{"airs", {NULL}, 1481, "udp"}, -{"miteksys-lm", {NULL}, 1482, "tcp"}, -{"miteksys-lm", {NULL}, 1482, "udp"}, -{"afs", {NULL}, 1483, "tcp"}, -{"afs", {NULL}, 1483, "udp"}, -{"confluent", {NULL}, 1484, "tcp"}, -{"confluent", {NULL}, 1484, "udp"}, -{"lansource", {NULL}, 1485, "tcp"}, -{"lansource", {NULL}, 1485, "udp"}, -{"nms_topo_serv", {NULL}, 1486, "tcp"}, -{"nms_topo_serv", {NULL}, 1486, "udp"}, -{"localinfosrvr", {NULL}, 1487, "tcp"}, -{"localinfosrvr", {NULL}, 1487, "udp"}, -{"docstor", {NULL}, 1488, "tcp"}, -{"docstor", {NULL}, 1488, "udp"}, -{"dmdocbroker", {NULL}, 1489, "tcp"}, -{"dmdocbroker", {NULL}, 1489, "udp"}, -{"insitu-conf", {NULL}, 1490, "tcp"}, -{"insitu-conf", {NULL}, 1490, "udp"}, -{"stone-design-1", {NULL}, 1492, "tcp"}, -{"stone-design-1", {NULL}, 1492, "udp"}, -{"netmap_lm", {NULL}, 1493, "tcp"}, -{"netmap_lm", {NULL}, 1493, "udp"}, -{"ica", {NULL}, 1494, "tcp"}, -{"ica", {NULL}, 1494, "udp"}, -{"cvc", {NULL}, 1495, "tcp"}, -{"cvc", {NULL}, 1495, "udp"}, -{"liberty-lm", {NULL}, 1496, "tcp"}, -{"liberty-lm", {NULL}, 1496, "udp"}, -{"rfx-lm", {NULL}, 1497, "tcp"}, -{"rfx-lm", {NULL}, 1497, "udp"}, -{"sybase-sqlany", {NULL}, 1498, "tcp"}, -{"sybase-sqlany", {NULL}, 1498, "udp"}, -{"fhc", {NULL}, 1499, "tcp"}, -{"fhc", {NULL}, 1499, "udp"}, -{"vlsi-lm", {NULL}, 1500, "tcp"}, -{"vlsi-lm", {NULL}, 1500, "udp"}, -{"saiscm", {NULL}, 1501, "tcp"}, -{"saiscm", {NULL}, 1501, "udp"}, -{"shivadiscovery", {NULL}, 1502, "tcp"}, -{"shivadiscovery", {NULL}, 1502, "udp"}, -{"imtc-mcs", {NULL}, 1503, "tcp"}, -{"imtc-mcs", {NULL}, 1503, "udp"}, -{"evb-elm", {NULL}, 1504, "tcp"}, -{"evb-elm", {NULL}, 1504, "udp"}, -{"funkproxy", {NULL}, 1505, "tcp"}, -{"funkproxy", {NULL}, 1505, "udp"}, -{"utcd", {NULL}, 1506, "tcp"}, -{"utcd", {NULL}, 1506, "udp"}, -{"symplex", {NULL}, 1507, "tcp"}, -{"symplex", {NULL}, 1507, "udp"}, -{"diagmond", {NULL}, 1508, "tcp"}, -{"diagmond", {NULL}, 1508, "udp"}, -{"robcad-lm", {NULL}, 1509, "tcp"}, -{"robcad-lm", {NULL}, 1509, "udp"}, -{"mvx-lm", {NULL}, 1510, "tcp"}, -{"mvx-lm", {NULL}, 1510, "udp"}, -{"3l-l1", {NULL}, 1511, "tcp"}, -{"3l-l1", {NULL}, 1511, "udp"}, -{"wins", {NULL}, 1512, "tcp"}, -{"wins", {NULL}, 1512, "udp"}, -{"fujitsu-dtc", {NULL}, 1513, "tcp"}, -{"fujitsu-dtc", {NULL}, 1513, "udp"}, -{"fujitsu-dtcns", {NULL}, 1514, "tcp"}, -{"fujitsu-dtcns", {NULL}, 1514, "udp"}, -{"ifor-protocol", {NULL}, 1515, "tcp"}, -{"ifor-protocol", {NULL}, 1515, "udp"}, -{"vpad", {NULL}, 1516, "tcp"}, -{"vpad", {NULL}, 1516, "udp"}, -{"vpac", {NULL}, 1517, "tcp"}, -{"vpac", {NULL}, 1517, "udp"}, -{"vpvd", {NULL}, 1518, "tcp"}, -{"vpvd", {NULL}, 1518, "udp"}, -{"vpvc", {NULL}, 1519, "tcp"}, -{"vpvc", {NULL}, 1519, "udp"}, -{"atm-zip-office", {NULL}, 1520, "tcp"}, -{"atm-zip-office", {NULL}, 1520, "udp"}, -{"ncube-lm", {NULL}, 1521, "tcp"}, -{"ncube-lm", {NULL}, 1521, "udp"}, -{"ricardo-lm", {NULL}, 1522, "tcp"}, -{"ricardo-lm", {NULL}, 1522, "udp"}, -{"cichild-lm", {NULL}, 1523, "tcp"}, -{"cichild-lm", {NULL}, 1523, "udp"}, -{"ingreslock", {NULL}, 1524, "tcp"}, -{"ingreslock", {NULL}, 1524, "udp"}, -{"orasrv", {NULL}, 1525, "tcp"}, -{"orasrv", {NULL}, 1525, "udp"}, -{"prospero-np", {NULL}, 1525, "tcp"}, -{"prospero-np", {NULL}, 1525, "udp"}, -{"pdap-np", {NULL}, 1526, "tcp"}, -{"pdap-np", {NULL}, 1526, "udp"}, -{"tlisrv", {NULL}, 1527, "tcp"}, -{"tlisrv", {NULL}, 1527, "udp"}, -{"coauthor", {NULL}, 1529, "tcp"}, -{"coauthor", {NULL}, 1529, "udp"}, -{"rap-service", {NULL}, 1530, "tcp"}, -{"rap-service", {NULL}, 1530, "udp"}, -{"rap-listen", {NULL}, 1531, "tcp"}, -{"rap-listen", {NULL}, 1531, "udp"}, -{"miroconnect", {NULL}, 1532, "tcp"}, -{"miroconnect", {NULL}, 1532, "udp"}, -{"virtual-places", {NULL}, 1533, "tcp"}, -{"virtual-places", {NULL}, 1533, "udp"}, -{"micromuse-lm", {NULL}, 1534, "tcp"}, -{"micromuse-lm", {NULL}, 1534, "udp"}, -{"ampr-info", {NULL}, 1535, "tcp"}, -{"ampr-info", {NULL}, 1535, "udp"}, -{"ampr-inter", {NULL}, 1536, "tcp"}, -{"ampr-inter", {NULL}, 1536, "udp"}, -{"sdsc-lm", {NULL}, 1537, "tcp"}, -{"sdsc-lm", {NULL}, 1537, "udp"}, -{"3ds-lm", {NULL}, 1538, "tcp"}, -{"3ds-lm", {NULL}, 1538, "udp"}, -{"intellistor-lm", {NULL}, 1539, "tcp"}, -{"intellistor-lm", {NULL}, 1539, "udp"}, -{"rds", {NULL}, 1540, "tcp"}, -{"rds", {NULL}, 1540, "udp"}, -{"rds2", {NULL}, 1541, "tcp"}, -{"rds2", {NULL}, 1541, "udp"}, -{"gridgen-elmd", {NULL}, 1542, "tcp"}, -{"gridgen-elmd", {NULL}, 1542, "udp"}, -{"simba-cs", {NULL}, 1543, "tcp"}, -{"simba-cs", {NULL}, 1543, "udp"}, -{"aspeclmd", {NULL}, 1544, "tcp"}, -{"aspeclmd", {NULL}, 1544, "udp"}, -{"vistium-share", {NULL}, 1545, "tcp"}, -{"vistium-share", {NULL}, 1545, "udp"}, -{"abbaccuray", {NULL}, 1546, "tcp"}, -{"abbaccuray", {NULL}, 1546, "udp"}, -{"laplink", {NULL}, 1547, "tcp"}, -{"laplink", {NULL}, 1547, "udp"}, -{"axon-lm", {NULL}, 1548, "tcp"}, -{"axon-lm", {NULL}, 1548, "udp"}, -{"shivahose", {NULL}, 1549, "tcp"}, -{"shivasound", {NULL}, 1549, "udp"}, -{"3m-image-lm", {NULL}, 1550, "tcp"}, -{"3m-image-lm", {NULL}, 1550, "udp"}, -{"hecmtl-db", {NULL}, 1551, "tcp"}, -{"hecmtl-db", {NULL}, 1551, "udp"}, -{"pciarray", {NULL}, 1552, "tcp"}, -{"pciarray", {NULL}, 1552, "udp"}, -{"sna-cs", {NULL}, 1553, "tcp"}, -{"sna-cs", {NULL}, 1553, "udp"}, -{"caci-lm", {NULL}, 1554, "tcp"}, -{"caci-lm", {NULL}, 1554, "udp"}, -{"livelan", {NULL}, 1555, "tcp"}, -{"livelan", {NULL}, 1555, "udp"}, -{"veritas_pbx", {NULL}, 1556, "tcp"}, -{"veritas_pbx", {NULL}, 1556, "udp"}, -{"arbortext-lm", {NULL}, 1557, "tcp"}, -{"arbortext-lm", {NULL}, 1557, "udp"}, -{"xingmpeg", {NULL}, 1558, "tcp"}, -{"xingmpeg", {NULL}, 1558, "udp"}, -{"web2host", {NULL}, 1559, "tcp"}, -{"web2host", {NULL}, 1559, "udp"}, -{"asci-val", {NULL}, 1560, "tcp"}, -{"asci-val", {NULL}, 1560, "udp"}, -{"facilityview", {NULL}, 1561, "tcp"}, -{"facilityview", {NULL}, 1561, "udp"}, -{"pconnectmgr", {NULL}, 1562, "tcp"}, -{"pconnectmgr", {NULL}, 1562, "udp"}, -{"cadabra-lm", {NULL}, 1563, "tcp"}, -{"cadabra-lm", {NULL}, 1563, "udp"}, -{"pay-per-view", {NULL}, 1564, "tcp"}, -{"pay-per-view", {NULL}, 1564, "udp"}, -{"winddlb", {NULL}, 1565, "tcp"}, -{"winddlb", {NULL}, 1565, "udp"}, -{"corelvideo", {NULL}, 1566, "tcp"}, -{"corelvideo", {NULL}, 1566, "udp"}, -{"jlicelmd", {NULL}, 1567, "tcp"}, -{"jlicelmd", {NULL}, 1567, "udp"}, -{"tsspmap", {NULL}, 1568, "tcp"}, -{"tsspmap", {NULL}, 1568, "udp"}, -{"ets", {NULL}, 1569, "tcp"}, -{"ets", {NULL}, 1569, "udp"}, -{"orbixd", {NULL}, 1570, "tcp"}, -{"orbixd", {NULL}, 1570, "udp"}, -{"rdb-dbs-disp", {NULL}, 1571, "tcp"}, -{"rdb-dbs-disp", {NULL}, 1571, "udp"}, -{"chip-lm", {NULL}, 1572, "tcp"}, -{"chip-lm", {NULL}, 1572, "udp"}, -{"itscomm-ns", {NULL}, 1573, "tcp"}, -{"itscomm-ns", {NULL}, 1573, "udp"}, -{"mvel-lm", {NULL}, 1574, "tcp"}, -{"mvel-lm", {NULL}, 1574, "udp"}, -{"oraclenames", {NULL}, 1575, "tcp"}, -{"oraclenames", {NULL}, 1575, "udp"}, -{"moldflow-lm", {NULL}, 1576, "tcp"}, -{"moldflow-lm", {NULL}, 1576, "udp"}, -{"hypercube-lm", {NULL}, 1577, "tcp"}, -{"hypercube-lm", {NULL}, 1577, "udp"}, -{"jacobus-lm", {NULL}, 1578, "tcp"}, -{"jacobus-lm", {NULL}, 1578, "udp"}, -{"ioc-sea-lm", {NULL}, 1579, "tcp"}, -{"ioc-sea-lm", {NULL}, 1579, "udp"}, -{"tn-tl-r1", {NULL}, 1580, "tcp"}, -{"tn-tl-r2", {NULL}, 1580, "udp"}, -{"mil-2045-47001", {NULL}, 1581, "tcp"}, -{"mil-2045-47001", {NULL}, 1581, "udp"}, -{"msims", {NULL}, 1582, "tcp"}, -{"msims", {NULL}, 1582, "udp"}, -{"simbaexpress", {NULL}, 1583, "tcp"}, -{"simbaexpress", {NULL}, 1583, "udp"}, -{"tn-tl-fd2", {NULL}, 1584, "tcp"}, -{"tn-tl-fd2", {NULL}, 1584, "udp"}, -{"intv", {NULL}, 1585, "tcp"}, -{"intv", {NULL}, 1585, "udp"}, -{"ibm-abtact", {NULL}, 1586, "tcp"}, -{"ibm-abtact", {NULL}, 1586, "udp"}, -{"pra_elmd", {NULL}, 1587, "tcp"}, -{"pra_elmd", {NULL}, 1587, "udp"}, -{"triquest-lm", {NULL}, 1588, "tcp"}, -{"triquest-lm", {NULL}, 1588, "udp"}, -{"vqp", {NULL}, 1589, "tcp"}, -{"vqp", {NULL}, 1589, "udp"}, -{"gemini-lm", {NULL}, 1590, "tcp"}, -{"gemini-lm", {NULL}, 1590, "udp"}, -{"ncpm-pm", {NULL}, 1591, "tcp"}, -{"ncpm-pm", {NULL}, 1591, "udp"}, -{"commonspace", {NULL}, 1592, "tcp"}, -{"commonspace", {NULL}, 1592, "udp"}, -{"mainsoft-lm", {NULL}, 1593, "tcp"}, -{"mainsoft-lm", {NULL}, 1593, "udp"}, -{"sixtrak", {NULL}, 1594, "tcp"}, -{"sixtrak", {NULL}, 1594, "udp"}, -{"radio", {NULL}, 1595, "tcp"}, -{"radio", {NULL}, 1595, "udp"}, -{"radio-sm", {NULL}, 1596, "tcp"}, -{"radio-bc", {NULL}, 1596, "udp"}, -{"orbplus-iiop", {NULL}, 1597, "tcp"}, -{"orbplus-iiop", {NULL}, 1597, "udp"}, -{"picknfs", {NULL}, 1598, "tcp"}, -{"picknfs", {NULL}, 1598, "udp"}, -{"simbaservices", {NULL}, 1599, "tcp"}, -{"simbaservices", {NULL}, 1599, "udp"}, -{"issd", {NULL}, 1600, "tcp"}, -{"issd", {NULL}, 1600, "udp"}, -{"aas", {NULL}, 1601, "tcp"}, -{"aas", {NULL}, 1601, "udp"}, -{"inspect", {NULL}, 1602, "tcp"}, -{"inspect", {NULL}, 1602, "udp"}, -{"picodbc", {NULL}, 1603, "tcp"}, -{"picodbc", {NULL}, 1603, "udp"}, -{"icabrowser", {NULL}, 1604, "tcp"}, -{"icabrowser", {NULL}, 1604, "udp"}, -{"slp", {NULL}, 1605, "tcp"}, -{"slp", {NULL}, 1605, "udp"}, -{"slm-api", {NULL}, 1606, "tcp"}, -{"slm-api", {NULL}, 1606, "udp"}, -{"stt", {NULL}, 1607, "tcp"}, -{"stt", {NULL}, 1607, "udp"}, -{"smart-lm", {NULL}, 1608, "tcp"}, -{"smart-lm", {NULL}, 1608, "udp"}, -{"isysg-lm", {NULL}, 1609, "tcp"}, -{"isysg-lm", {NULL}, 1609, "udp"}, -{"taurus-wh", {NULL}, 1610, "tcp"}, -{"taurus-wh", {NULL}, 1610, "udp"}, -{"ill", {NULL}, 1611, "tcp"}, -{"ill", {NULL}, 1611, "udp"}, -{"netbill-trans", {NULL}, 1612, "tcp"}, -{"netbill-trans", {NULL}, 1612, "udp"}, -{"netbill-keyrep", {NULL}, 1613, "tcp"}, -{"netbill-keyrep", {NULL}, 1613, "udp"}, -{"netbill-cred", {NULL}, 1614, "tcp"}, -{"netbill-cred", {NULL}, 1614, "udp"}, -{"netbill-auth", {NULL}, 1615, "tcp"}, -{"netbill-auth", {NULL}, 1615, "udp"}, -{"netbill-prod", {NULL}, 1616, "tcp"}, -{"netbill-prod", {NULL}, 1616, "udp"}, -{"nimrod-agent", {NULL}, 1617, "tcp"}, -{"nimrod-agent", {NULL}, 1617, "udp"}, -{"skytelnet", {NULL}, 1618, "tcp"}, -{"skytelnet", {NULL}, 1618, "udp"}, -{"xs-openstorage", {NULL}, 1619, "tcp"}, -{"xs-openstorage", {NULL}, 1619, "udp"}, -{"faxportwinport", {NULL}, 1620, "tcp"}, -{"faxportwinport", {NULL}, 1620, "udp"}, -{"softdataphone", {NULL}, 1621, "tcp"}, -{"softdataphone", {NULL}, 1621, "udp"}, -{"ontime", {NULL}, 1622, "tcp"}, -{"ontime", {NULL}, 1622, "udp"}, -{"jaleosnd", {NULL}, 1623, "tcp"}, -{"jaleosnd", {NULL}, 1623, "udp"}, -{"udp-sr-port", {NULL}, 1624, "tcp"}, -{"udp-sr-port", {NULL}, 1624, "udp"}, -{"svs-omagent", {NULL}, 1625, "tcp"}, -{"svs-omagent", {NULL}, 1625, "udp"}, -{"shockwave", {NULL}, 1626, "tcp"}, -{"shockwave", {NULL}, 1626, "udp"}, -{"t128-gateway", {NULL}, 1627, "tcp"}, -{"t128-gateway", {NULL}, 1627, "udp"}, -{"lontalk-norm", {NULL}, 1628, "tcp"}, -{"lontalk-norm", {NULL}, 1628, "udp"}, -{"lontalk-urgnt", {NULL}, 1629, "tcp"}, -{"lontalk-urgnt", {NULL}, 1629, "udp"}, -{"oraclenet8cman", {NULL}, 1630, "tcp"}, -{"oraclenet8cman", {NULL}, 1630, "udp"}, -{"visitview", {NULL}, 1631, "tcp"}, -{"visitview", {NULL}, 1631, "udp"}, -{"pammratc", {NULL}, 1632, "tcp"}, -{"pammratc", {NULL}, 1632, "udp"}, -{"pammrpc", {NULL}, 1633, "tcp"}, -{"pammrpc", {NULL}, 1633, "udp"}, -{"loaprobe", {NULL}, 1634, "tcp"}, -{"loaprobe", {NULL}, 1634, "udp"}, -{"edb-server1", {NULL}, 1635, "tcp"}, -{"edb-server1", {NULL}, 1635, "udp"}, -{"isdc", {NULL}, 1636, "tcp"}, -{"isdc", {NULL}, 1636, "udp"}, -{"islc", {NULL}, 1637, "tcp"}, -{"islc", {NULL}, 1637, "udp"}, -{"ismc", {NULL}, 1638, "tcp"}, -{"ismc", {NULL}, 1638, "udp"}, -{"cert-initiator", {NULL}, 1639, "tcp"}, -{"cert-initiator", {NULL}, 1639, "udp"}, -{"cert-responder", {NULL}, 1640, "tcp"}, -{"cert-responder", {NULL}, 1640, "udp"}, -{"invision", {NULL}, 1641, "tcp"}, -{"invision", {NULL}, 1641, "udp"}, -{"isis-am", {NULL}, 1642, "tcp"}, -{"isis-am", {NULL}, 1642, "udp"}, -{"isis-ambc", {NULL}, 1643, "tcp"}, -{"isis-ambc", {NULL}, 1643, "udp"}, -{"saiseh", {NULL}, 1644, "tcp"}, -{"sightline", {NULL}, 1645, "tcp"}, -{"sightline", {NULL}, 1645, "udp"}, -{"sa-msg-port", {NULL}, 1646, "tcp"}, -{"sa-msg-port", {NULL}, 1646, "udp"}, -{"rsap", {NULL}, 1647, "tcp"}, -{"rsap", {NULL}, 1647, "udp"}, -{"concurrent-lm", {NULL}, 1648, "tcp"}, -{"concurrent-lm", {NULL}, 1648, "udp"}, -{"kermit", {NULL}, 1649, "tcp"}, -{"kermit", {NULL}, 1649, "udp"}, -{"nkd", {NULL}, 1650, "tcp"}, -{"nkd", {NULL}, 1650, "udp"}, -{"shiva_confsrvr", {NULL}, 1651, "tcp"}, -{"shiva_confsrvr", {NULL}, 1651, "udp"}, -{"xnmp", {NULL}, 1652, "tcp"}, -{"xnmp", {NULL}, 1652, "udp"}, -{"alphatech-lm", {NULL}, 1653, "tcp"}, -{"alphatech-lm", {NULL}, 1653, "udp"}, -{"stargatealerts", {NULL}, 1654, "tcp"}, -{"stargatealerts", {NULL}, 1654, "udp"}, -{"dec-mbadmin", {NULL}, 1655, "tcp"}, -{"dec-mbadmin", {NULL}, 1655, "udp"}, -{"dec-mbadmin-h", {NULL}, 1656, "tcp"}, -{"dec-mbadmin-h", {NULL}, 1656, "udp"}, -{"fujitsu-mmpdc", {NULL}, 1657, "tcp"}, -{"fujitsu-mmpdc", {NULL}, 1657, "udp"}, -{"sixnetudr", {NULL}, 1658, "tcp"}, -{"sixnetudr", {NULL}, 1658, "udp"}, -{"sg-lm", {NULL}, 1659, "tcp"}, -{"sg-lm", {NULL}, 1659, "udp"}, -{"skip-mc-gikreq", {NULL}, 1660, "tcp"}, -{"skip-mc-gikreq", {NULL}, 1660, "udp"}, -{"netview-aix-1", {NULL}, 1661, "tcp"}, -{"netview-aix-1", {NULL}, 1661, "udp"}, -{"netview-aix-2", {NULL}, 1662, "tcp"}, -{"netview-aix-2", {NULL}, 1662, "udp"}, -{"netview-aix-3", {NULL}, 1663, "tcp"}, -{"netview-aix-3", {NULL}, 1663, "udp"}, -{"netview-aix-4", {NULL}, 1664, "tcp"}, -{"netview-aix-4", {NULL}, 1664, "udp"}, -{"netview-aix-5", {NULL}, 1665, "tcp"}, -{"netview-aix-5", {NULL}, 1665, "udp"}, -{"netview-aix-6", {NULL}, 1666, "tcp"}, -{"netview-aix-6", {NULL}, 1666, "udp"}, -{"netview-aix-7", {NULL}, 1667, "tcp"}, -{"netview-aix-7", {NULL}, 1667, "udp"}, -{"netview-aix-8", {NULL}, 1668, "tcp"}, -{"netview-aix-8", {NULL}, 1668, "udp"}, -{"netview-aix-9", {NULL}, 1669, "tcp"}, -{"netview-aix-9", {NULL}, 1669, "udp"}, -{"netview-aix-10", {NULL}, 1670, "tcp"}, -{"netview-aix-10", {NULL}, 1670, "udp"}, -{"netview-aix-11", {NULL}, 1671, "tcp"}, -{"netview-aix-11", {NULL}, 1671, "udp"}, -{"netview-aix-12", {NULL}, 1672, "tcp"}, -{"netview-aix-12", {NULL}, 1672, "udp"}, -{"proshare-mc-1", {NULL}, 1673, "tcp"}, -{"proshare-mc-1", {NULL}, 1673, "udp"}, -{"proshare-mc-2", {NULL}, 1674, "tcp"}, -{"proshare-mc-2", {NULL}, 1674, "udp"}, -{"pdp", {NULL}, 1675, "tcp"}, -{"pdp", {NULL}, 1675, "udp"}, -{"netcomm1", {NULL}, 1676, "tcp"}, -{"netcomm2", {NULL}, 1676, "udp"}, -{"groupwise", {NULL}, 1677, "tcp"}, -{"groupwise", {NULL}, 1677, "udp"}, -{"prolink", {NULL}, 1678, "tcp"}, -{"prolink", {NULL}, 1678, "udp"}, -{"darcorp-lm", {NULL}, 1679, "tcp"}, -{"darcorp-lm", {NULL}, 1679, "udp"}, -{"microcom-sbp", {NULL}, 1680, "tcp"}, -{"microcom-sbp", {NULL}, 1680, "udp"}, -{"sd-elmd", {NULL}, 1681, "tcp"}, -{"sd-elmd", {NULL}, 1681, "udp"}, -{"lanyon-lantern", {NULL}, 1682, "tcp"}, -{"lanyon-lantern", {NULL}, 1682, "udp"}, -{"ncpm-hip", {NULL}, 1683, "tcp"}, -{"ncpm-hip", {NULL}, 1683, "udp"}, -{"snaresecure", {NULL}, 1684, "tcp"}, -{"snaresecure", {NULL}, 1684, "udp"}, -{"n2nremote", {NULL}, 1685, "tcp"}, -{"n2nremote", {NULL}, 1685, "udp"}, -{"cvmon", {NULL}, 1686, "tcp"}, -{"cvmon", {NULL}, 1686, "udp"}, -{"nsjtp-ctrl", {NULL}, 1687, "tcp"}, -{"nsjtp-ctrl", {NULL}, 1687, "udp"}, -{"nsjtp-data", {NULL}, 1688, "tcp"}, -{"nsjtp-data", {NULL}, 1688, "udp"}, -{"firefox", {NULL}, 1689, "tcp"}, -{"firefox", {NULL}, 1689, "udp"}, -{"ng-umds", {NULL}, 1690, "tcp"}, -{"ng-umds", {NULL}, 1690, "udp"}, -{"empire-empuma", {NULL}, 1691, "tcp"}, -{"empire-empuma", {NULL}, 1691, "udp"}, -{"sstsys-lm", {NULL}, 1692, "tcp"}, -{"sstsys-lm", {NULL}, 1692, "udp"}, -{"rrirtr", {NULL}, 1693, "tcp"}, -{"rrirtr", {NULL}, 1693, "udp"}, -{"rrimwm", {NULL}, 1694, "tcp"}, -{"rrimwm", {NULL}, 1694, "udp"}, -{"rrilwm", {NULL}, 1695, "tcp"}, -{"rrilwm", {NULL}, 1695, "udp"}, -{"rrifmm", {NULL}, 1696, "tcp"}, -{"rrifmm", {NULL}, 1696, "udp"}, -{"rrisat", {NULL}, 1697, "tcp"}, -{"rrisat", {NULL}, 1697, "udp"}, -{"rsvp-encap-1", {NULL}, 1698, "tcp"}, -{"rsvp-encap-1", {NULL}, 1698, "udp"}, -{"rsvp-encap-2", {NULL}, 1699, "tcp"}, -{"rsvp-encap-2", {NULL}, 1699, "udp"}, -{"mps-raft", {NULL}, 1700, "tcp"}, -{"mps-raft", {NULL}, 1700, "udp"}, -{"l2f", {NULL}, 1701, "tcp"}, -{"l2f", {NULL}, 1701, "udp"}, -{"l2tp", {NULL}, 1701, "tcp"}, -{"l2tp", {NULL}, 1701, "udp"}, -{"deskshare", {NULL}, 1702, "tcp"}, -{"deskshare", {NULL}, 1702, "udp"}, -{"hb-engine", {NULL}, 1703, "tcp"}, -{"hb-engine", {NULL}, 1703, "udp"}, -{"bcs-broker", {NULL}, 1704, "tcp"}, -{"bcs-broker", {NULL}, 1704, "udp"}, -{"slingshot", {NULL}, 1705, "tcp"}, -{"slingshot", {NULL}, 1705, "udp"}, -{"jetform", {NULL}, 1706, "tcp"}, -{"jetform", {NULL}, 1706, "udp"}, -{"vdmplay", {NULL}, 1707, "tcp"}, -{"vdmplay", {NULL}, 1707, "udp"}, -{"gat-lmd", {NULL}, 1708, "tcp"}, -{"gat-lmd", {NULL}, 1708, "udp"}, -{"centra", {NULL}, 1709, "tcp"}, -{"centra", {NULL}, 1709, "udp"}, -{"impera", {NULL}, 1710, "tcp"}, -{"impera", {NULL}, 1710, "udp"}, -{"pptconference", {NULL}, 1711, "tcp"}, -{"pptconference", {NULL}, 1711, "udp"}, -{"registrar", {NULL}, 1712, "tcp"}, -{"registrar", {NULL}, 1712, "udp"}, -{"conferencetalk", {NULL}, 1713, "tcp"}, -{"conferencetalk", {NULL}, 1713, "udp"}, -{"sesi-lm", {NULL}, 1714, "tcp"}, -{"sesi-lm", {NULL}, 1714, "udp"}, -{"houdini-lm", {NULL}, 1715, "tcp"}, -{"houdini-lm", {NULL}, 1715, "udp"}, -{"xmsg", {NULL}, 1716, "tcp"}, -{"xmsg", {NULL}, 1716, "udp"}, -{"fj-hdnet", {NULL}, 1717, "tcp"}, -{"fj-hdnet", {NULL}, 1717, "udp"}, -{"h323gatedisc", {NULL}, 1718, "tcp"}, -{"h323gatedisc", {NULL}, 1718, "udp"}, -{"h323gatestat", {NULL}, 1719, "tcp"}, -{"h323gatestat", {NULL}, 1719, "udp"}, -{"h323hostcall", {NULL}, 1720, "tcp"}, -{"h323hostcall", {NULL}, 1720, "udp"}, -{"caicci", {NULL}, 1721, "tcp"}, -{"caicci", {NULL}, 1721, "udp"}, -{"hks-lm", {NULL}, 1722, "tcp"}, -{"hks-lm", {NULL}, 1722, "udp"}, -{"pptp", {NULL}, 1723, "tcp"}, -{"pptp", {NULL}, 1723, "udp"}, -{"csbphonemaster", {NULL}, 1724, "tcp"}, -{"csbphonemaster", {NULL}, 1724, "udp"}, -{"iden-ralp", {NULL}, 1725, "tcp"}, -{"iden-ralp", {NULL}, 1725, "udp"}, -{"iberiagames", {NULL}, 1726, "tcp"}, -{"iberiagames", {NULL}, 1726, "udp"}, -{"winddx", {NULL}, 1727, "tcp"}, -{"winddx", {NULL}, 1727, "udp"}, -{"telindus", {NULL}, 1728, "tcp"}, -{"telindus", {NULL}, 1728, "udp"}, -{"citynl", {NULL}, 1729, "tcp"}, -{"citynl", {NULL}, 1729, "udp"}, -{"roketz", {NULL}, 1730, "tcp"}, -{"roketz", {NULL}, 1730, "udp"}, -{"msiccp", {NULL}, 1731, "tcp"}, -{"msiccp", {NULL}, 1731, "udp"}, -{"proxim", {NULL}, 1732, "tcp"}, -{"proxim", {NULL}, 1732, "udp"}, -{"siipat", {NULL}, 1733, "tcp"}, -{"siipat", {NULL}, 1733, "udp"}, -{"cambertx-lm", {NULL}, 1734, "tcp"}, -{"cambertx-lm", {NULL}, 1734, "udp"}, -{"privatechat", {NULL}, 1735, "tcp"}, -{"privatechat", {NULL}, 1735, "udp"}, -{"street-stream", {NULL}, 1736, "tcp"}, -{"street-stream", {NULL}, 1736, "udp"}, -{"ultimad", {NULL}, 1737, "tcp"}, -{"ultimad", {NULL}, 1737, "udp"}, -{"gamegen1", {NULL}, 1738, "tcp"}, -{"gamegen1", {NULL}, 1738, "udp"}, -{"webaccess", {NULL}, 1739, "tcp"}, -{"webaccess", {NULL}, 1739, "udp"}, -{"encore", {NULL}, 1740, "tcp"}, -{"encore", {NULL}, 1740, "udp"}, -{"cisco-net-mgmt", {NULL}, 1741, "tcp"}, -{"cisco-net-mgmt", {NULL}, 1741, "udp"}, -{"3Com-nsd", {NULL}, 1742, "tcp"}, -{"3Com-nsd", {NULL}, 1742, "udp"}, -{"cinegrfx-lm", {NULL}, 1743, "tcp"}, -{"cinegrfx-lm", {NULL}, 1743, "udp"}, -{"ncpm-ft", {NULL}, 1744, "tcp"}, -{"ncpm-ft", {NULL}, 1744, "udp"}, -{"remote-winsock", {NULL}, 1745, "tcp"}, -{"remote-winsock", {NULL}, 1745, "udp"}, -{"ftrapid-1", {NULL}, 1746, "tcp"}, -{"ftrapid-1", {NULL}, 1746, "udp"}, -{"ftrapid-2", {NULL}, 1747, "tcp"}, -{"ftrapid-2", {NULL}, 1747, "udp"}, -{"oracle-em1", {NULL}, 1748, "tcp"}, -{"oracle-em1", {NULL}, 1748, "udp"}, -{"aspen-services", {NULL}, 1749, "tcp"}, -{"aspen-services", {NULL}, 1749, "udp"}, -{"sslp", {NULL}, 1750, "tcp"}, -{"sslp", {NULL}, 1750, "udp"}, -{"swiftnet", {NULL}, 1751, "tcp"}, -{"swiftnet", {NULL}, 1751, "udp"}, -{"lofr-lm", {NULL}, 1752, "tcp"}, -{"lofr-lm", {NULL}, 1752, "udp"}, -{"oracle-em2", {NULL}, 1754, "tcp"}, -{"oracle-em2", {NULL}, 1754, "udp"}, -{"ms-streaming", {NULL}, 1755, "tcp"}, -{"ms-streaming", {NULL}, 1755, "udp"}, -{"capfast-lmd", {NULL}, 1756, "tcp"}, -{"capfast-lmd", {NULL}, 1756, "udp"}, -{"cnhrp", {NULL}, 1757, "tcp"}, -{"cnhrp", {NULL}, 1757, "udp"}, -{"tftp-mcast", {NULL}, 1758, "tcp"}, -{"tftp-mcast", {NULL}, 1758, "udp"}, -{"spss-lm", {NULL}, 1759, "tcp"}, -{"spss-lm", {NULL}, 1759, "udp"}, -{"www-ldap-gw", {NULL}, 1760, "tcp"}, -{"www-ldap-gw", {NULL}, 1760, "udp"}, -{"cft-0", {NULL}, 1761, "tcp"}, -{"cft-0", {NULL}, 1761, "udp"}, -{"cft-1", {NULL}, 1762, "tcp"}, -{"cft-1", {NULL}, 1762, "udp"}, -{"cft-2", {NULL}, 1763, "tcp"}, -{"cft-2", {NULL}, 1763, "udp"}, -{"cft-3", {NULL}, 1764, "tcp"}, -{"cft-3", {NULL}, 1764, "udp"}, -{"cft-4", {NULL}, 1765, "tcp"}, -{"cft-4", {NULL}, 1765, "udp"}, -{"cft-5", {NULL}, 1766, "tcp"}, -{"cft-5", {NULL}, 1766, "udp"}, -{"cft-6", {NULL}, 1767, "tcp"}, -{"cft-6", {NULL}, 1767, "udp"}, -{"cft-7", {NULL}, 1768, "tcp"}, -{"cft-7", {NULL}, 1768, "udp"}, -{"bmc-net-adm", {NULL}, 1769, "tcp"}, -{"bmc-net-adm", {NULL}, 1769, "udp"}, -{"bmc-net-svc", {NULL}, 1770, "tcp"}, -{"bmc-net-svc", {NULL}, 1770, "udp"}, -{"vaultbase", {NULL}, 1771, "tcp"}, -{"vaultbase", {NULL}, 1771, "udp"}, -{"essweb-gw", {NULL}, 1772, "tcp"}, -{"essweb-gw", {NULL}, 1772, "udp"}, -{"kmscontrol", {NULL}, 1773, "tcp"}, -{"kmscontrol", {NULL}, 1773, "udp"}, -{"global-dtserv", {NULL}, 1774, "tcp"}, -{"global-dtserv", {NULL}, 1774, "udp"}, -{"femis", {NULL}, 1776, "tcp"}, -{"femis", {NULL}, 1776, "udp"}, -{"powerguardian", {NULL}, 1777, "tcp"}, -{"powerguardian", {NULL}, 1777, "udp"}, -{"prodigy-intrnet", {NULL}, 1778, "tcp"}, -{"prodigy-intrnet", {NULL}, 1778, "udp"}, -{"pharmasoft", {NULL}, 1779, "tcp"}, -{"pharmasoft", {NULL}, 1779, "udp"}, -{"dpkeyserv", {NULL}, 1780, "tcp"}, -{"dpkeyserv", {NULL}, 1780, "udp"}, -{"answersoft-lm", {NULL}, 1781, "tcp"}, -{"answersoft-lm", {NULL}, 1781, "udp"}, -{"hp-hcip", {NULL}, 1782, "tcp"}, -{"hp-hcip", {NULL}, 1782, "udp"}, -{"finle-lm", {NULL}, 1784, "tcp"}, -{"finle-lm", {NULL}, 1784, "udp"}, -{"windlm", {NULL}, 1785, "tcp"}, -{"windlm", {NULL}, 1785, "udp"}, -{"funk-logger", {NULL}, 1786, "tcp"}, -{"funk-logger", {NULL}, 1786, "udp"}, -{"funk-license", {NULL}, 1787, "tcp"}, -{"funk-license", {NULL}, 1787, "udp"}, -{"psmond", {NULL}, 1788, "tcp"}, -{"psmond", {NULL}, 1788, "udp"}, -{"hello", {NULL}, 1789, "tcp"}, -{"hello", {NULL}, 1789, "udp"}, -{"nmsp", {NULL}, 1790, "tcp"}, -{"nmsp", {NULL}, 1790, "udp"}, -{"ea1", {NULL}, 1791, "tcp"}, -{"ea1", {NULL}, 1791, "udp"}, -{"ibm-dt-2", {NULL}, 1792, "tcp"}, -{"ibm-dt-2", {NULL}, 1792, "udp"}, -{"rsc-robot", {NULL}, 1793, "tcp"}, -{"rsc-robot", {NULL}, 1793, "udp"}, -{"cera-bcm", {NULL}, 1794, "tcp"}, -{"cera-bcm", {NULL}, 1794, "udp"}, -{"dpi-proxy", {NULL}, 1795, "tcp"}, -{"dpi-proxy", {NULL}, 1795, "udp"}, -{"vocaltec-admin", {NULL}, 1796, "tcp"}, -{"vocaltec-admin", {NULL}, 1796, "udp"}, -{"uma", {NULL}, 1797, "tcp"}, -{"uma", {NULL}, 1797, "udp"}, -{"etp", {NULL}, 1798, "tcp"}, -{"etp", {NULL}, 1798, "udp"}, -{"netrisk", {NULL}, 1799, "tcp"}, -{"netrisk", {NULL}, 1799, "udp"}, -{"ansys-lm", {NULL}, 1800, "tcp"}, -{"ansys-lm", {NULL}, 1800, "udp"}, -{"msmq", {NULL}, 1801, "tcp"}, -{"msmq", {NULL}, 1801, "udp"}, -{"concomp1", {NULL}, 1802, "tcp"}, -{"concomp1", {NULL}, 1802, "udp"}, -{"hp-hcip-gwy", {NULL}, 1803, "tcp"}, -{"hp-hcip-gwy", {NULL}, 1803, "udp"}, -{"enl", {NULL}, 1804, "tcp"}, -{"enl", {NULL}, 1804, "udp"}, -{"enl-name", {NULL}, 1805, "tcp"}, -{"enl-name", {NULL}, 1805, "udp"}, -{"musiconline", {NULL}, 1806, "tcp"}, -{"musiconline", {NULL}, 1806, "udp"}, -{"fhsp", {NULL}, 1807, "tcp"}, -{"fhsp", {NULL}, 1807, "udp"}, -{"oracle-vp2", {NULL}, 1808, "tcp"}, -{"oracle-vp2", {NULL}, 1808, "udp"}, -{"oracle-vp1", {NULL}, 1809, "tcp"}, -{"oracle-vp1", {NULL}, 1809, "udp"}, -{"jerand-lm", {NULL}, 1810, "tcp"}, -{"jerand-lm", {NULL}, 1810, "udp"}, -{"scientia-sdb", {NULL}, 1811, "tcp"}, -{"scientia-sdb", {NULL}, 1811, "udp"}, -{"radius", {NULL}, 1812, "tcp"}, -{"radius", {NULL}, 1812, "udp"}, -{"radius-acct", {NULL}, 1813, "tcp"}, -{"radius-acct", {NULL}, 1813, "udp"}, -{"tdp-suite", {NULL}, 1814, "tcp"}, -{"tdp-suite", {NULL}, 1814, "udp"}, -{"mmpft", {NULL}, 1815, "tcp"}, -{"mmpft", {NULL}, 1815, "udp"}, -{"harp", {NULL}, 1816, "tcp"}, -{"harp", {NULL}, 1816, "udp"}, -{"rkb-oscs", {NULL}, 1817, "tcp"}, -{"rkb-oscs", {NULL}, 1817, "udp"}, -{"etftp", {NULL}, 1818, "tcp"}, -{"etftp", {NULL}, 1818, "udp"}, -{"plato-lm", {NULL}, 1819, "tcp"}, -{"plato-lm", {NULL}, 1819, "udp"}, -{"mcagent", {NULL}, 1820, "tcp"}, -{"mcagent", {NULL}, 1820, "udp"}, -{"donnyworld", {NULL}, 1821, "tcp"}, -{"donnyworld", {NULL}, 1821, "udp"}, -{"es-elmd", {NULL}, 1822, "tcp"}, -{"es-elmd", {NULL}, 1822, "udp"}, -{"unisys-lm", {NULL}, 1823, "tcp"}, -{"unisys-lm", {NULL}, 1823, "udp"}, -{"metrics-pas", {NULL}, 1824, "tcp"}, -{"metrics-pas", {NULL}, 1824, "udp"}, -{"direcpc-video", {NULL}, 1825, "tcp"}, -{"direcpc-video", {NULL}, 1825, "udp"}, -{"ardt", {NULL}, 1826, "tcp"}, -{"ardt", {NULL}, 1826, "udp"}, -{"asi", {NULL}, 1827, "tcp"}, -{"asi", {NULL}, 1827, "udp"}, -{"itm-mcell-u", {NULL}, 1828, "tcp"}, -{"itm-mcell-u", {NULL}, 1828, "udp"}, -{"optika-emedia", {NULL}, 1829, "tcp"}, -{"optika-emedia", {NULL}, 1829, "udp"}, -{"net8-cman", {NULL}, 1830, "tcp"}, -{"net8-cman", {NULL}, 1830, "udp"}, -{"myrtle", {NULL}, 1831, "tcp"}, -{"myrtle", {NULL}, 1831, "udp"}, -{"tht-treasure", {NULL}, 1832, "tcp"}, -{"tht-treasure", {NULL}, 1832, "udp"}, -{"udpradio", {NULL}, 1833, "tcp"}, -{"udpradio", {NULL}, 1833, "udp"}, -{"ardusuni", {NULL}, 1834, "tcp"}, -{"ardusuni", {NULL}, 1834, "udp"}, -{"ardusmul", {NULL}, 1835, "tcp"}, -{"ardusmul", {NULL}, 1835, "udp"}, -{"ste-smsc", {NULL}, 1836, "tcp"}, -{"ste-smsc", {NULL}, 1836, "udp"}, -{"csoft1", {NULL}, 1837, "tcp"}, -{"csoft1", {NULL}, 1837, "udp"}, -{"talnet", {NULL}, 1838, "tcp"}, -{"talnet", {NULL}, 1838, "udp"}, -{"netopia-vo1", {NULL}, 1839, "tcp"}, -{"netopia-vo1", {NULL}, 1839, "udp"}, -{"netopia-vo2", {NULL}, 1840, "tcp"}, -{"netopia-vo2", {NULL}, 1840, "udp"}, -{"netopia-vo3", {NULL}, 1841, "tcp"}, -{"netopia-vo3", {NULL}, 1841, "udp"}, -{"netopia-vo4", {NULL}, 1842, "tcp"}, -{"netopia-vo4", {NULL}, 1842, "udp"}, -{"netopia-vo5", {NULL}, 1843, "tcp"}, -{"netopia-vo5", {NULL}, 1843, "udp"}, -{"direcpc-dll", {NULL}, 1844, "tcp"}, -{"direcpc-dll", {NULL}, 1844, "udp"}, -{"altalink", {NULL}, 1845, "tcp"}, -{"altalink", {NULL}, 1845, "udp"}, -{"tunstall-pnc", {NULL}, 1846, "tcp"}, -{"tunstall-pnc", {NULL}, 1846, "udp"}, -{"slp-notify", {NULL}, 1847, "tcp"}, -{"slp-notify", {NULL}, 1847, "udp"}, -{"fjdocdist", {NULL}, 1848, "tcp"}, -{"fjdocdist", {NULL}, 1848, "udp"}, -{"alpha-sms", {NULL}, 1849, "tcp"}, -{"alpha-sms", {NULL}, 1849, "udp"}, -{"gsi", {NULL}, 1850, "tcp"}, -{"gsi", {NULL}, 1850, "udp"}, -{"ctcd", {NULL}, 1851, "tcp"}, -{"ctcd", {NULL}, 1851, "udp"}, -{"virtual-time", {NULL}, 1852, "tcp"}, -{"virtual-time", {NULL}, 1852, "udp"}, -{"vids-avtp", {NULL}, 1853, "tcp"}, -{"vids-avtp", {NULL}, 1853, "udp"}, -{"buddy-draw", {NULL}, 1854, "tcp"}, -{"buddy-draw", {NULL}, 1854, "udp"}, -{"fiorano-rtrsvc", {NULL}, 1855, "tcp"}, -{"fiorano-rtrsvc", {NULL}, 1855, "udp"}, -{"fiorano-msgsvc", {NULL}, 1856, "tcp"}, -{"fiorano-msgsvc", {NULL}, 1856, "udp"}, -{"datacaptor", {NULL}, 1857, "tcp"}, -{"datacaptor", {NULL}, 1857, "udp"}, -{"privateark", {NULL}, 1858, "tcp"}, -{"privateark", {NULL}, 1858, "udp"}, -{"gammafetchsvr", {NULL}, 1859, "tcp"}, -{"gammafetchsvr", {NULL}, 1859, "udp"}, -{"sunscalar-svc", {NULL}, 1860, "tcp"}, -{"sunscalar-svc", {NULL}, 1860, "udp"}, -{"lecroy-vicp", {NULL}, 1861, "tcp"}, -{"lecroy-vicp", {NULL}, 1861, "udp"}, -{"mysql-cm-agent", {NULL}, 1862, "tcp"}, -{"mysql-cm-agent", {NULL}, 1862, "udp"}, -{"msnp", {NULL}, 1863, "tcp"}, -{"msnp", {NULL}, 1863, "udp"}, -{"paradym-31port", {NULL}, 1864, "tcp"}, -{"paradym-31port", {NULL}, 1864, "udp"}, -{"entp", {NULL}, 1865, "tcp"}, -{"entp", {NULL}, 1865, "udp"}, -{"swrmi", {NULL}, 1866, "tcp"}, -{"swrmi", {NULL}, 1866, "udp"}, -{"udrive", {NULL}, 1867, "tcp"}, -{"udrive", {NULL}, 1867, "udp"}, -{"viziblebrowser", {NULL}, 1868, "tcp"}, -{"viziblebrowser", {NULL}, 1868, "udp"}, -{"transact", {NULL}, 1869, "tcp"}, -{"transact", {NULL}, 1869, "udp"}, -{"sunscalar-dns", {NULL}, 1870, "tcp"}, -{"sunscalar-dns", {NULL}, 1870, "udp"}, -{"canocentral0", {NULL}, 1871, "tcp"}, -{"canocentral0", {NULL}, 1871, "udp"}, -{"canocentral1", {NULL}, 1872, "tcp"}, -{"canocentral1", {NULL}, 1872, "udp"}, -{"fjmpjps", {NULL}, 1873, "tcp"}, -{"fjmpjps", {NULL}, 1873, "udp"}, -{"fjswapsnp", {NULL}, 1874, "tcp"}, -{"fjswapsnp", {NULL}, 1874, "udp"}, -{"westell-stats", {NULL}, 1875, "tcp"}, -{"westell-stats", {NULL}, 1875, "udp"}, -{"ewcappsrv", {NULL}, 1876, "tcp"}, -{"ewcappsrv", {NULL}, 1876, "udp"}, -{"hp-webqosdb", {NULL}, 1877, "tcp"}, -{"hp-webqosdb", {NULL}, 1877, "udp"}, -{"drmsmc", {NULL}, 1878, "tcp"}, -{"drmsmc", {NULL}, 1878, "udp"}, -{"nettgain-nms", {NULL}, 1879, "tcp"}, -{"nettgain-nms", {NULL}, 1879, "udp"}, -{"vsat-control", {NULL}, 1880, "tcp"}, -{"vsat-control", {NULL}, 1880, "udp"}, -{"ibm-mqseries2", {NULL}, 1881, "tcp"}, -{"ibm-mqseries2", {NULL}, 1881, "udp"}, -{"ecsqdmn", {NULL}, 1882, "tcp"}, -{"ecsqdmn", {NULL}, 1882, "udp"}, -{"ibm-mqisdp", {NULL}, 1883, "tcp"}, -{"ibm-mqisdp", {NULL}, 1883, "udp"}, -{"idmaps", {NULL}, 1884, "tcp"}, -{"idmaps", {NULL}, 1884, "udp"}, -{"vrtstrapserver", {NULL}, 1885, "tcp"}, -{"vrtstrapserver", {NULL}, 1885, "udp"}, -{"leoip", {NULL}, 1886, "tcp"}, -{"leoip", {NULL}, 1886, "udp"}, -{"filex-lport", {NULL}, 1887, "tcp"}, -{"filex-lport", {NULL}, 1887, "udp"}, -{"ncconfig", {NULL}, 1888, "tcp"}, -{"ncconfig", {NULL}, 1888, "udp"}, -{"unify-adapter", {NULL}, 1889, "tcp"}, -{"unify-adapter", {NULL}, 1889, "udp"}, -{"wilkenlistener", {NULL}, 1890, "tcp"}, -{"wilkenlistener", {NULL}, 1890, "udp"}, -{"childkey-notif", {NULL}, 1891, "tcp"}, -{"childkey-notif", {NULL}, 1891, "udp"}, -{"childkey-ctrl", {NULL}, 1892, "tcp"}, -{"childkey-ctrl", {NULL}, 1892, "udp"}, -{"elad", {NULL}, 1893, "tcp"}, -{"elad", {NULL}, 1893, "udp"}, -{"o2server-port", {NULL}, 1894, "tcp"}, -{"o2server-port", {NULL}, 1894, "udp"}, -{"b-novative-ls", {NULL}, 1896, "tcp"}, -{"b-novative-ls", {NULL}, 1896, "udp"}, -{"metaagent", {NULL}, 1897, "tcp"}, -{"metaagent", {NULL}, 1897, "udp"}, -{"cymtec-port", {NULL}, 1898, "tcp"}, -{"cymtec-port", {NULL}, 1898, "udp"}, -{"mc2studios", {NULL}, 1899, "tcp"}, -{"mc2studios", {NULL}, 1899, "udp"}, -{"ssdp", {NULL}, 1900, "tcp"}, -{"ssdp", {NULL}, 1900, "udp"}, -{"fjicl-tep-a", {NULL}, 1901, "tcp"}, -{"fjicl-tep-a", {NULL}, 1901, "udp"}, -{"fjicl-tep-b", {NULL}, 1902, "tcp"}, -{"fjicl-tep-b", {NULL}, 1902, "udp"}, -{"linkname", {NULL}, 1903, "tcp"}, -{"linkname", {NULL}, 1903, "udp"}, -{"fjicl-tep-c", {NULL}, 1904, "tcp"}, -{"fjicl-tep-c", {NULL}, 1904, "udp"}, -{"sugp", {NULL}, 1905, "tcp"}, -{"sugp", {NULL}, 1905, "udp"}, -{"tpmd", {NULL}, 1906, "tcp"}, -{"tpmd", {NULL}, 1906, "udp"}, -{"intrastar", {NULL}, 1907, "tcp"}, -{"intrastar", {NULL}, 1907, "udp"}, -{"dawn", {NULL}, 1908, "tcp"}, -{"dawn", {NULL}, 1908, "udp"}, -{"global-wlink", {NULL}, 1909, "tcp"}, -{"global-wlink", {NULL}, 1909, "udp"}, -{"ultrabac", {NULL}, 1910, "tcp"}, -{"ultrabac", {NULL}, 1910, "udp"}, -{"mtp", {NULL}, 1911, "tcp"}, -{"mtp", {NULL}, 1911, "udp"}, -{"rhp-iibp", {NULL}, 1912, "tcp"}, -{"rhp-iibp", {NULL}, 1912, "udp"}, -{"armadp", {NULL}, 1913, "tcp"}, -{"armadp", {NULL}, 1913, "udp"}, -{"elm-momentum", {NULL}, 1914, "tcp"}, -{"elm-momentum", {NULL}, 1914, "udp"}, -{"facelink", {NULL}, 1915, "tcp"}, -{"facelink", {NULL}, 1915, "udp"}, -{"persona", {NULL}, 1916, "tcp"}, -{"persona", {NULL}, 1916, "udp"}, -{"noagent", {NULL}, 1917, "tcp"}, -{"noagent", {NULL}, 1917, "udp"}, -{"can-nds", {NULL}, 1918, "tcp"}, -{"can-nds", {NULL}, 1918, "udp"}, -{"can-dch", {NULL}, 1919, "tcp"}, -{"can-dch", {NULL}, 1919, "udp"}, -{"can-ferret", {NULL}, 1920, "tcp"}, -{"can-ferret", {NULL}, 1920, "udp"}, -{"noadmin", {NULL}, 1921, "tcp"}, -{"noadmin", {NULL}, 1921, "udp"}, -{"tapestry", {NULL}, 1922, "tcp"}, -{"tapestry", {NULL}, 1922, "udp"}, -{"spice", {NULL}, 1923, "tcp"}, -{"spice", {NULL}, 1923, "udp"}, -{"xiip", {NULL}, 1924, "tcp"}, -{"xiip", {NULL}, 1924, "udp"}, -{"discovery-port", {NULL}, 1925, "tcp"}, -{"discovery-port", {NULL}, 1925, "udp"}, -{"egs", {NULL}, 1926, "tcp"}, -{"egs", {NULL}, 1926, "udp"}, -{"videte-cipc", {NULL}, 1927, "tcp"}, -{"videte-cipc", {NULL}, 1927, "udp"}, -{"emsd-port", {NULL}, 1928, "tcp"}, -{"emsd-port", {NULL}, 1928, "udp"}, -{"bandwiz-system", {NULL}, 1929, "tcp"}, -{"bandwiz-system", {NULL}, 1929, "udp"}, -{"driveappserver", {NULL}, 1930, "tcp"}, -{"driveappserver", {NULL}, 1930, "udp"}, -{"amdsched", {NULL}, 1931, "tcp"}, -{"amdsched", {NULL}, 1931, "udp"}, -{"ctt-broker", {NULL}, 1932, "tcp"}, -{"ctt-broker", {NULL}, 1932, "udp"}, -{"xmapi", {NULL}, 1933, "tcp"}, -{"xmapi", {NULL}, 1933, "udp"}, -{"xaapi", {NULL}, 1934, "tcp"}, -{"xaapi", {NULL}, 1934, "udp"}, -{"macromedia-fcs", {NULL}, 1935, "tcp"}, -{"macromedia-fcs", {NULL}, 1935, "udp"}, -{"jetcmeserver", {NULL}, 1936, "tcp"}, -{"jetcmeserver", {NULL}, 1936, "udp"}, -{"jwserver", {NULL}, 1937, "tcp"}, -{"jwserver", {NULL}, 1937, "udp"}, -{"jwclient", {NULL}, 1938, "tcp"}, -{"jwclient", {NULL}, 1938, "udp"}, -{"jvserver", {NULL}, 1939, "tcp"}, -{"jvserver", {NULL}, 1939, "udp"}, -{"jvclient", {NULL}, 1940, "tcp"}, -{"jvclient", {NULL}, 1940, "udp"}, -{"dic-aida", {NULL}, 1941, "tcp"}, -{"dic-aida", {NULL}, 1941, "udp"}, -{"res", {NULL}, 1942, "tcp"}, -{"res", {NULL}, 1942, "udp"}, -{"beeyond-media", {NULL}, 1943, "tcp"}, -{"beeyond-media", {NULL}, 1943, "udp"}, -{"close-combat", {NULL}, 1944, "tcp"}, -{"close-combat", {NULL}, 1944, "udp"}, -{"dialogic-elmd", {NULL}, 1945, "tcp"}, -{"dialogic-elmd", {NULL}, 1945, "udp"}, -{"tekpls", {NULL}, 1946, "tcp"}, -{"tekpls", {NULL}, 1946, "udp"}, -{"sentinelsrm", {NULL}, 1947, "tcp"}, -{"sentinelsrm", {NULL}, 1947, "udp"}, -{"eye2eye", {NULL}, 1948, "tcp"}, -{"eye2eye", {NULL}, 1948, "udp"}, -{"ismaeasdaqlive", {NULL}, 1949, "tcp"}, -{"ismaeasdaqlive", {NULL}, 1949, "udp"}, -{"ismaeasdaqtest", {NULL}, 1950, "tcp"}, -{"ismaeasdaqtest", {NULL}, 1950, "udp"}, -{"bcs-lmserver", {NULL}, 1951, "tcp"}, -{"bcs-lmserver", {NULL}, 1951, "udp"}, -{"mpnjsc", {NULL}, 1952, "tcp"}, -{"mpnjsc", {NULL}, 1952, "udp"}, -{"rapidbase", {NULL}, 1953, "tcp"}, -{"rapidbase", {NULL}, 1953, "udp"}, -{"abr-api", {NULL}, 1954, "tcp"}, -{"abr-api", {NULL}, 1954, "udp"}, -{"abr-secure", {NULL}, 1955, "tcp"}, -{"abr-secure", {NULL}, 1955, "udp"}, -{"vrtl-vmf-ds", {NULL}, 1956, "tcp"}, -{"vrtl-vmf-ds", {NULL}, 1956, "udp"}, -{"unix-status", {NULL}, 1957, "tcp"}, -{"unix-status", {NULL}, 1957, "udp"}, -{"dxadmind", {NULL}, 1958, "tcp"}, -{"dxadmind", {NULL}, 1958, "udp"}, -{"simp-all", {NULL}, 1959, "tcp"}, -{"simp-all", {NULL}, 1959, "udp"}, -{"nasmanager", {NULL}, 1960, "tcp"}, -{"nasmanager", {NULL}, 1960, "udp"}, -{"bts-appserver", {NULL}, 1961, "tcp"}, -{"bts-appserver", {NULL}, 1961, "udp"}, -{"biap-mp", {NULL}, 1962, "tcp"}, -{"biap-mp", {NULL}, 1962, "udp"}, -{"webmachine", {NULL}, 1963, "tcp"}, -{"webmachine", {NULL}, 1963, "udp"}, -{"solid-e-engine", {NULL}, 1964, "tcp"}, -{"solid-e-engine", {NULL}, 1964, "udp"}, -{"tivoli-npm", {NULL}, 1965, "tcp"}, -{"tivoli-npm", {NULL}, 1965, "udp"}, -{"slush", {NULL}, 1966, "tcp"}, -{"slush", {NULL}, 1966, "udp"}, -{"sns-quote", {NULL}, 1967, "tcp"}, -{"sns-quote", {NULL}, 1967, "udp"}, -{"lipsinc", {NULL}, 1968, "tcp"}, -{"lipsinc", {NULL}, 1968, "udp"}, -{"lipsinc1", {NULL}, 1969, "tcp"}, -{"lipsinc1", {NULL}, 1969, "udp"}, -{"netop-rc", {NULL}, 1970, "tcp"}, -{"netop-rc", {NULL}, 1970, "udp"}, -{"netop-school", {NULL}, 1971, "tcp"}, -{"netop-school", {NULL}, 1971, "udp"}, -{"intersys-cache", {NULL}, 1972, "tcp"}, -{"intersys-cache", {NULL}, 1972, "udp"}, -{"dlsrap", {NULL}, 1973, "tcp"}, -{"dlsrap", {NULL}, 1973, "udp"}, -{"drp", {NULL}, 1974, "tcp"}, -{"drp", {NULL}, 1974, "udp"}, -{"tcoflashagent", {NULL}, 1975, "tcp"}, -{"tcoflashagent", {NULL}, 1975, "udp"}, -{"tcoregagent", {NULL}, 1976, "tcp"}, -{"tcoregagent", {NULL}, 1976, "udp"}, -{"tcoaddressbook", {NULL}, 1977, "tcp"}, -{"tcoaddressbook", {NULL}, 1977, "udp"}, -{"unisql", {NULL}, 1978, "tcp"}, -{"unisql", {NULL}, 1978, "udp"}, -{"unisql-java", {NULL}, 1979, "tcp"}, -{"unisql-java", {NULL}, 1979, "udp"}, -{"pearldoc-xact", {NULL}, 1980, "tcp"}, -{"pearldoc-xact", {NULL}, 1980, "udp"}, -{"p2pq", {NULL}, 1981, "tcp"}, -{"p2pq", {NULL}, 1981, "udp"}, -{"estamp", {NULL}, 1982, "tcp"}, -{"estamp", {NULL}, 1982, "udp"}, -{"lhtp", {NULL}, 1983, "tcp"}, -{"lhtp", {NULL}, 1983, "udp"}, -{"bb", {NULL}, 1984, "tcp"}, -{"bb", {NULL}, 1984, "udp"}, -{"hsrp", {NULL}, 1985, "tcp"}, -{"hsrp", {NULL}, 1985, "udp"}, -{"licensedaemon", {NULL}, 1986, "tcp"}, -{"licensedaemon", {NULL}, 1986, "udp"}, -{"tr-rsrb-p1", {NULL}, 1987, "tcp"}, -{"tr-rsrb-p1", {NULL}, 1987, "udp"}, -{"tr-rsrb-p2", {NULL}, 1988, "tcp"}, -{"tr-rsrb-p2", {NULL}, 1988, "udp"}, -{"tr-rsrb-p3", {NULL}, 1989, "tcp"}, -{"tr-rsrb-p3", {NULL}, 1989, "udp"}, -{"mshnet", {NULL}, 1989, "tcp"}, -{"mshnet", {NULL}, 1989, "udp"}, -{"stun-p1", {NULL}, 1990, "tcp"}, -{"stun-p1", {NULL}, 1990, "udp"}, -{"stun-p2", {NULL}, 1991, "tcp"}, -{"stun-p2", {NULL}, 1991, "udp"}, -{"stun-p3", {NULL}, 1992, "tcp"}, -{"stun-p3", {NULL}, 1992, "udp"}, -{"ipsendmsg", {NULL}, 1992, "tcp"}, -{"ipsendmsg", {NULL}, 1992, "udp"}, -{"snmp-tcp-port", {NULL}, 1993, "tcp"}, -{"snmp-tcp-port", {NULL}, 1993, "udp"}, -{"stun-port", {NULL}, 1994, "tcp"}, -{"stun-port", {NULL}, 1994, "udp"}, -{"perf-port", {NULL}, 1995, "tcp"}, -{"perf-port", {NULL}, 1995, "udp"}, -{"tr-rsrb-port", {NULL}, 1996, "tcp"}, -{"tr-rsrb-port", {NULL}, 1996, "udp"}, -{"gdp-port", {NULL}, 1997, "tcp"}, -{"gdp-port", {NULL}, 1997, "udp"}, -{"x25-svc-port", {NULL}, 1998, "tcp"}, -{"x25-svc-port", {NULL}, 1998, "udp"}, -{"tcp-id-port", {NULL}, 1999, "tcp"}, -{"tcp-id-port", {NULL}, 1999, "udp"}, -{"cisco-sccp", {NULL}, 2000, "tcp"}, -{"cisco-sccp", {NULL}, 2000, "udp"}, -{"dc", {NULL}, 2001, "tcp"}, -{"wizard", {NULL}, 2001, "udp"}, -{"globe", {NULL}, 2002, "tcp"}, -{"globe", {NULL}, 2002, "udp"}, -{"brutus", {NULL}, 2003, "tcp"}, -{"brutus", {NULL}, 2003, "udp"}, -{"mailbox", {NULL}, 2004, "tcp"}, -{"emce", {NULL}, 2004, "udp"}, -{"berknet", {NULL}, 2005, "tcp"}, -{"oracle", {NULL}, 2005, "udp"}, -{"invokator", {NULL}, 2006, "tcp"}, -{"raid-cd", {NULL}, 2006, "udp"}, -{"dectalk", {NULL}, 2007, "tcp"}, -{"raid-am", {NULL}, 2007, "udp"}, -{"conf", {NULL}, 2008, "tcp"}, -{"terminaldb", {NULL}, 2008, "udp"}, -{"news", {NULL}, 2009, "tcp"}, -{"whosockami", {NULL}, 2009, "udp"}, -{"search", {NULL}, 2010, "tcp"}, -{"pipe_server", {NULL}, 2010, "udp"}, -{"raid-cc", {NULL}, 2011, "tcp"}, -{"servserv", {NULL}, 2011, "udp"}, -{"ttyinfo", {NULL}, 2012, "tcp"}, -{"raid-ac", {NULL}, 2012, "udp"}, -{"raid-am", {NULL}, 2013, "tcp"}, -{"raid-cd", {NULL}, 2013, "udp"}, -{"troff", {NULL}, 2014, "tcp"}, -{"raid-sf", {NULL}, 2014, "udp"}, -{"cypress", {NULL}, 2015, "tcp"}, -{"raid-cs", {NULL}, 2015, "udp"}, -{"bootserver", {NULL}, 2016, "tcp"}, -{"bootserver", {NULL}, 2016, "udp"}, -{"cypress-stat", {NULL}, 2017, "tcp"}, -{"bootclient", {NULL}, 2017, "udp"}, -{"terminaldb", {NULL}, 2018, "tcp"}, -{"rellpack", {NULL}, 2018, "udp"}, -{"whosockami", {NULL}, 2019, "tcp"}, -{"about", {NULL}, 2019, "udp"}, -{"xinupageserver", {NULL}, 2020, "tcp"}, -{"xinupageserver", {NULL}, 2020, "udp"}, -{"servexec", {NULL}, 2021, "tcp"}, -{"xinuexpansion1", {NULL}, 2021, "udp"}, -{"down", {NULL}, 2022, "tcp"}, -{"xinuexpansion2", {NULL}, 2022, "udp"}, -{"xinuexpansion3", {NULL}, 2023, "tcp"}, -{"xinuexpansion3", {NULL}, 2023, "udp"}, -{"xinuexpansion4", {NULL}, 2024, "tcp"}, -{"xinuexpansion4", {NULL}, 2024, "udp"}, -{"ellpack", {NULL}, 2025, "tcp"}, -{"xribs", {NULL}, 2025, "udp"}, -{"scrabble", {NULL}, 2026, "tcp"}, -{"scrabble", {NULL}, 2026, "udp"}, -{"shadowserver", {NULL}, 2027, "tcp"}, -{"shadowserver", {NULL}, 2027, "udp"}, -{"submitserver", {NULL}, 2028, "tcp"}, -{"submitserver", {NULL}, 2028, "udp"}, -{"hsrpv6", {NULL}, 2029, "tcp"}, -{"hsrpv6", {NULL}, 2029, "udp"}, -{"device2", {NULL}, 2030, "tcp"}, -{"device2", {NULL}, 2030, "udp"}, -{"mobrien-chat", {NULL}, 2031, "tcp"}, -{"mobrien-chat", {NULL}, 2031, "udp"}, -{"blackboard", {NULL}, 2032, "tcp"}, -{"blackboard", {NULL}, 2032, "udp"}, -{"glogger", {NULL}, 2033, "tcp"}, -{"glogger", {NULL}, 2033, "udp"}, -{"scoremgr", {NULL}, 2034, "tcp"}, -{"scoremgr", {NULL}, 2034, "udp"}, -{"imsldoc", {NULL}, 2035, "tcp"}, -{"imsldoc", {NULL}, 2035, "udp"}, -{"e-dpnet", {NULL}, 2036, "tcp"}, -{"e-dpnet", {NULL}, 2036, "udp"}, -{"applus", {NULL}, 2037, "tcp"}, -{"applus", {NULL}, 2037, "udp"}, -{"objectmanager", {NULL}, 2038, "tcp"}, -{"objectmanager", {NULL}, 2038, "udp"}, -{"prizma", {NULL}, 2039, "tcp"}, -{"prizma", {NULL}, 2039, "udp"}, -{"lam", {NULL}, 2040, "tcp"}, -{"lam", {NULL}, 2040, "udp"}, -{"interbase", {NULL}, 2041, "tcp"}, -{"interbase", {NULL}, 2041, "udp"}, -{"isis", {NULL}, 2042, "tcp"}, -{"isis", {NULL}, 2042, "udp"}, -{"isis-bcast", {NULL}, 2043, "tcp"}, -{"isis-bcast", {NULL}, 2043, "udp"}, -{"rimsl", {NULL}, 2044, "tcp"}, -{"rimsl", {NULL}, 2044, "udp"}, -{"cdfunc", {NULL}, 2045, "tcp"}, -{"cdfunc", {NULL}, 2045, "udp"}, -{"sdfunc", {NULL}, 2046, "tcp"}, -{"sdfunc", {NULL}, 2046, "udp"}, -{"dls", {NULL}, 2047, "tcp"}, -{"dls", {NULL}, 2047, "udp"}, -{"dls-monitor", {NULL}, 2048, "tcp"}, -{"dls-monitor", {NULL}, 2048, "udp"}, -{"shilp", {NULL}, 2049, "tcp"}, -{"shilp", {NULL}, 2049, "udp"}, -{"nfs", {NULL}, 2049, "tcp"}, -{"nfs", {NULL}, 2049, "udp"}, -{"nfs", {NULL}, 2049, "sctp"}, -{"av-emb-config", {NULL}, 2050, "tcp"}, -{"av-emb-config", {NULL}, 2050, "udp"}, -{"epnsdp", {NULL}, 2051, "tcp"}, -{"epnsdp", {NULL}, 2051, "udp"}, -{"clearvisn", {NULL}, 2052, "tcp"}, -{"clearvisn", {NULL}, 2052, "udp"}, -{"lot105-ds-upd", {NULL}, 2053, "tcp"}, -{"lot105-ds-upd", {NULL}, 2053, "udp"}, -{"weblogin", {NULL}, 2054, "tcp"}, -{"weblogin", {NULL}, 2054, "udp"}, -{"iop", {NULL}, 2055, "tcp"}, -{"iop", {NULL}, 2055, "udp"}, -{"omnisky", {NULL}, 2056, "tcp"}, -{"omnisky", {NULL}, 2056, "udp"}, -{"rich-cp", {NULL}, 2057, "tcp"}, -{"rich-cp", {NULL}, 2057, "udp"}, -{"newwavesearch", {NULL}, 2058, "tcp"}, -{"newwavesearch", {NULL}, 2058, "udp"}, -{"bmc-messaging", {NULL}, 2059, "tcp"}, -{"bmc-messaging", {NULL}, 2059, "udp"}, -{"teleniumdaemon", {NULL}, 2060, "tcp"}, -{"teleniumdaemon", {NULL}, 2060, "udp"}, -{"netmount", {NULL}, 2061, "tcp"}, -{"netmount", {NULL}, 2061, "udp"}, -{"icg-swp", {NULL}, 2062, "tcp"}, -{"icg-swp", {NULL}, 2062, "udp"}, -{"icg-bridge", {NULL}, 2063, "tcp"}, -{"icg-bridge", {NULL}, 2063, "udp"}, -{"icg-iprelay", {NULL}, 2064, "tcp"}, -{"icg-iprelay", {NULL}, 2064, "udp"}, -{"dlsrpn", {NULL}, 2065, "tcp"}, -{"dlsrpn", {NULL}, 2065, "udp"}, -{"aura", {NULL}, 2066, "tcp"}, -{"aura", {NULL}, 2066, "udp"}, -{"dlswpn", {NULL}, 2067, "tcp"}, -{"dlswpn", {NULL}, 2067, "udp"}, -{"avauthsrvprtcl", {NULL}, 2068, "tcp"}, -{"avauthsrvprtcl", {NULL}, 2068, "udp"}, -{"event-port", {NULL}, 2069, "tcp"}, -{"event-port", {NULL}, 2069, "udp"}, -{"ah-esp-encap", {NULL}, 2070, "tcp"}, -{"ah-esp-encap", {NULL}, 2070, "udp"}, -{"acp-port", {NULL}, 2071, "tcp"}, -{"acp-port", {NULL}, 2071, "udp"}, -{"msync", {NULL}, 2072, "tcp"}, -{"msync", {NULL}, 2072, "udp"}, -{"gxs-data-port", {NULL}, 2073, "tcp"}, -{"gxs-data-port", {NULL}, 2073, "udp"}, -{"vrtl-vmf-sa", {NULL}, 2074, "tcp"}, -{"vrtl-vmf-sa", {NULL}, 2074, "udp"}, -{"newlixengine", {NULL}, 2075, "tcp"}, -{"newlixengine", {NULL}, 2075, "udp"}, -{"newlixconfig", {NULL}, 2076, "tcp"}, -{"newlixconfig", {NULL}, 2076, "udp"}, -{"tsrmagt", {NULL}, 2077, "tcp"}, -{"tsrmagt", {NULL}, 2077, "udp"}, -{"tpcsrvr", {NULL}, 2078, "tcp"}, -{"tpcsrvr", {NULL}, 2078, "udp"}, -{"idware-router", {NULL}, 2079, "tcp"}, -{"idware-router", {NULL}, 2079, "udp"}, -{"autodesk-nlm", {NULL}, 2080, "tcp"}, -{"autodesk-nlm", {NULL}, 2080, "udp"}, -{"kme-trap-port", {NULL}, 2081, "tcp"}, -{"kme-trap-port", {NULL}, 2081, "udp"}, -{"infowave", {NULL}, 2082, "tcp"}, -{"infowave", {NULL}, 2082, "udp"}, -{"radsec", {NULL}, 2083, "tcp"}, -{"radsec", {NULL}, 2083, "udp"}, -{"sunclustergeo", {NULL}, 2084, "tcp"}, -{"sunclustergeo", {NULL}, 2084, "udp"}, -{"ada-cip", {NULL}, 2085, "tcp"}, -{"ada-cip", {NULL}, 2085, "udp"}, -{"gnunet", {NULL}, 2086, "tcp"}, -{"gnunet", {NULL}, 2086, "udp"}, -{"eli", {NULL}, 2087, "tcp"}, -{"eli", {NULL}, 2087, "udp"}, -{"ip-blf", {NULL}, 2088, "tcp"}, -{"ip-blf", {NULL}, 2088, "udp"}, -{"sep", {NULL}, 2089, "tcp"}, -{"sep", {NULL}, 2089, "udp"}, -{"lrp", {NULL}, 2090, "tcp"}, -{"lrp", {NULL}, 2090, "udp"}, -{"prp", {NULL}, 2091, "tcp"}, -{"prp", {NULL}, 2091, "udp"}, -{"descent3", {NULL}, 2092, "tcp"}, -{"descent3", {NULL}, 2092, "udp"}, -{"nbx-cc", {NULL}, 2093, "tcp"}, -{"nbx-cc", {NULL}, 2093, "udp"}, -{"nbx-au", {NULL}, 2094, "tcp"}, -{"nbx-au", {NULL}, 2094, "udp"}, -{"nbx-ser", {NULL}, 2095, "tcp"}, -{"nbx-ser", {NULL}, 2095, "udp"}, -{"nbx-dir", {NULL}, 2096, "tcp"}, -{"nbx-dir", {NULL}, 2096, "udp"}, -{"jetformpreview", {NULL}, 2097, "tcp"}, -{"jetformpreview", {NULL}, 2097, "udp"}, -{"dialog-port", {NULL}, 2098, "tcp"}, -{"dialog-port", {NULL}, 2098, "udp"}, -{"h2250-annex-g", {NULL}, 2099, "tcp"}, -{"h2250-annex-g", {NULL}, 2099, "udp"}, -{"amiganetfs", {NULL}, 2100, "tcp"}, -{"amiganetfs", {NULL}, 2100, "udp"}, -{"rtcm-sc104", {NULL}, 2101, "tcp"}, -{"rtcm-sc104", {NULL}, 2101, "udp"}, -{"zephyr-srv", {NULL}, 2102, "tcp"}, -{"zephyr-srv", {NULL}, 2102, "udp"}, -{"zephyr-clt", {NULL}, 2103, "tcp"}, -{"zephyr-clt", {NULL}, 2103, "udp"}, -{"zephyr-hm", {NULL}, 2104, "tcp"}, -{"zephyr-hm", {NULL}, 2104, "udp"}, -{"minipay", {NULL}, 2105, "tcp"}, -{"minipay", {NULL}, 2105, "udp"}, -{"mzap", {NULL}, 2106, "tcp"}, -{"mzap", {NULL}, 2106, "udp"}, -{"bintec-admin", {NULL}, 2107, "tcp"}, -{"bintec-admin", {NULL}, 2107, "udp"}, -{"comcam", {NULL}, 2108, "tcp"}, -{"comcam", {NULL}, 2108, "udp"}, -{"ergolight", {NULL}, 2109, "tcp"}, -{"ergolight", {NULL}, 2109, "udp"}, -{"umsp", {NULL}, 2110, "tcp"}, -{"umsp", {NULL}, 2110, "udp"}, -{"dsatp", {NULL}, 2111, "tcp"}, -{"dsatp", {NULL}, 2111, "udp"}, -{"idonix-metanet", {NULL}, 2112, "tcp"}, -{"idonix-metanet", {NULL}, 2112, "udp"}, -{"hsl-storm", {NULL}, 2113, "tcp"}, -{"hsl-storm", {NULL}, 2113, "udp"}, -{"newheights", {NULL}, 2114, "tcp"}, -{"newheights", {NULL}, 2114, "udp"}, -{"kdm", {NULL}, 2115, "tcp"}, -{"kdm", {NULL}, 2115, "udp"}, -{"ccowcmr", {NULL}, 2116, "tcp"}, -{"ccowcmr", {NULL}, 2116, "udp"}, -{"mentaclient", {NULL}, 2117, "tcp"}, -{"mentaclient", {NULL}, 2117, "udp"}, -{"mentaserver", {NULL}, 2118, "tcp"}, -{"mentaserver", {NULL}, 2118, "udp"}, -{"gsigatekeeper", {NULL}, 2119, "tcp"}, -{"gsigatekeeper", {NULL}, 2119, "udp"}, -{"qencp", {NULL}, 2120, "tcp"}, -{"qencp", {NULL}, 2120, "udp"}, -{"scientia-ssdb", {NULL}, 2121, "tcp"}, -{"scientia-ssdb", {NULL}, 2121, "udp"}, -{"caupc-remote", {NULL}, 2122, "tcp"}, -{"caupc-remote", {NULL}, 2122, "udp"}, -{"gtp-control", {NULL}, 2123, "tcp"}, -{"gtp-control", {NULL}, 2123, "udp"}, -{"elatelink", {NULL}, 2124, "tcp"}, -{"elatelink", {NULL}, 2124, "udp"}, -{"lockstep", {NULL}, 2125, "tcp"}, -{"lockstep", {NULL}, 2125, "udp"}, -{"pktcable-cops", {NULL}, 2126, "tcp"}, -{"pktcable-cops", {NULL}, 2126, "udp"}, -{"index-pc-wb", {NULL}, 2127, "tcp"}, -{"index-pc-wb", {NULL}, 2127, "udp"}, -{"net-steward", {NULL}, 2128, "tcp"}, -{"net-steward", {NULL}, 2128, "udp"}, -{"cs-live", {NULL}, 2129, "tcp"}, -{"cs-live", {NULL}, 2129, "udp"}, -{"xds", {NULL}, 2130, "tcp"}, -{"xds", {NULL}, 2130, "udp"}, -{"avantageb2b", {NULL}, 2131, "tcp"}, -{"avantageb2b", {NULL}, 2131, "udp"}, -{"solera-epmap", {NULL}, 2132, "tcp"}, -{"solera-epmap", {NULL}, 2132, "udp"}, -{"zymed-zpp", {NULL}, 2133, "tcp"}, -{"zymed-zpp", {NULL}, 2133, "udp"}, -{"avenue", {NULL}, 2134, "tcp"}, -{"avenue", {NULL}, 2134, "udp"}, -{"gris", {NULL}, 2135, "tcp"}, -{"gris", {NULL}, 2135, "udp"}, -{"appworxsrv", {NULL}, 2136, "tcp"}, -{"appworxsrv", {NULL}, 2136, "udp"}, -{"connect", {NULL}, 2137, "tcp"}, -{"connect", {NULL}, 2137, "udp"}, -{"unbind-cluster", {NULL}, 2138, "tcp"}, -{"unbind-cluster", {NULL}, 2138, "udp"}, -{"ias-auth", {NULL}, 2139, "tcp"}, -{"ias-auth", {NULL}, 2139, "udp"}, -{"ias-reg", {NULL}, 2140, "tcp"}, -{"ias-reg", {NULL}, 2140, "udp"}, -{"ias-admind", {NULL}, 2141, "tcp"}, -{"ias-admind", {NULL}, 2141, "udp"}, -{"tdmoip", {NULL}, 2142, "tcp"}, -{"tdmoip", {NULL}, 2142, "udp"}, -{"lv-jc", {NULL}, 2143, "tcp"}, -{"lv-jc", {NULL}, 2143, "udp"}, -{"lv-ffx", {NULL}, 2144, "tcp"}, -{"lv-ffx", {NULL}, 2144, "udp"}, -{"lv-pici", {NULL}, 2145, "tcp"}, -{"lv-pici", {NULL}, 2145, "udp"}, -{"lv-not", {NULL}, 2146, "tcp"}, -{"lv-not", {NULL}, 2146, "udp"}, -{"lv-auth", {NULL}, 2147, "tcp"}, -{"lv-auth", {NULL}, 2147, "udp"}, -{"veritas-ucl", {NULL}, 2148, "tcp"}, -{"veritas-ucl", {NULL}, 2148, "udp"}, -{"acptsys", {NULL}, 2149, "tcp"}, -{"acptsys", {NULL}, 2149, "udp"}, -{"dynamic3d", {NULL}, 2150, "tcp"}, -{"dynamic3d", {NULL}, 2150, "udp"}, -{"docent", {NULL}, 2151, "tcp"}, -{"docent", {NULL}, 2151, "udp"}, -{"gtp-user", {NULL}, 2152, "tcp"}, -{"gtp-user", {NULL}, 2152, "udp"}, -{"ctlptc", {NULL}, 2153, "tcp"}, -{"ctlptc", {NULL}, 2153, "udp"}, -{"stdptc", {NULL}, 2154, "tcp"}, -{"stdptc", {NULL}, 2154, "udp"}, -{"brdptc", {NULL}, 2155, "tcp"}, -{"brdptc", {NULL}, 2155, "udp"}, -{"trp", {NULL}, 2156, "tcp"}, -{"trp", {NULL}, 2156, "udp"}, -{"xnds", {NULL}, 2157, "tcp"}, -{"xnds", {NULL}, 2157, "udp"}, -{"touchnetplus", {NULL}, 2158, "tcp"}, -{"touchnetplus", {NULL}, 2158, "udp"}, -{"gdbremote", {NULL}, 2159, "tcp"}, -{"gdbremote", {NULL}, 2159, "udp"}, -{"apc-2160", {NULL}, 2160, "tcp"}, -{"apc-2160", {NULL}, 2160, "udp"}, -{"apc-2161", {NULL}, 2161, "tcp"}, -{"apc-2161", {NULL}, 2161, "udp"}, -{"navisphere", {NULL}, 2162, "tcp"}, -{"navisphere", {NULL}, 2162, "udp"}, -{"navisphere-sec", {NULL}, 2163, "tcp"}, -{"navisphere-sec", {NULL}, 2163, "udp"}, -{"ddns-v3", {NULL}, 2164, "tcp"}, -{"ddns-v3", {NULL}, 2164, "udp"}, -{"x-bone-api", {NULL}, 2165, "tcp"}, -{"x-bone-api", {NULL}, 2165, "udp"}, -{"iwserver", {NULL}, 2166, "tcp"}, -{"iwserver", {NULL}, 2166, "udp"}, -{"raw-serial", {NULL}, 2167, "tcp"}, -{"raw-serial", {NULL}, 2167, "udp"}, -{"easy-soft-mux", {NULL}, 2168, "tcp"}, -{"easy-soft-mux", {NULL}, 2168, "udp"}, -{"brain", {NULL}, 2169, "tcp"}, -{"brain", {NULL}, 2169, "udp"}, -{"eyetv", {NULL}, 2170, "tcp"}, -{"eyetv", {NULL}, 2170, "udp"}, -{"msfw-storage", {NULL}, 2171, "tcp"}, -{"msfw-storage", {NULL}, 2171, "udp"}, -{"msfw-s-storage", {NULL}, 2172, "tcp"}, -{"msfw-s-storage", {NULL}, 2172, "udp"}, -{"msfw-replica", {NULL}, 2173, "tcp"}, -{"msfw-replica", {NULL}, 2173, "udp"}, -{"msfw-array", {NULL}, 2174, "tcp"}, -{"msfw-array", {NULL}, 2174, "udp"}, -{"airsync", {NULL}, 2175, "tcp"}, -{"airsync", {NULL}, 2175, "udp"}, -{"rapi", {NULL}, 2176, "tcp"}, -{"rapi", {NULL}, 2176, "udp"}, -{"qwave", {NULL}, 2177, "tcp"}, -{"qwave", {NULL}, 2177, "udp"}, -{"bitspeer", {NULL}, 2178, "tcp"}, -{"bitspeer", {NULL}, 2178, "udp"}, -{"vmrdp", {NULL}, 2179, "tcp"}, -{"vmrdp", {NULL}, 2179, "udp"}, -{"mc-gt-srv", {NULL}, 2180, "tcp"}, -{"mc-gt-srv", {NULL}, 2180, "udp"}, -{"eforward", {NULL}, 2181, "tcp"}, -{"eforward", {NULL}, 2181, "udp"}, -{"cgn-stat", {NULL}, 2182, "tcp"}, -{"cgn-stat", {NULL}, 2182, "udp"}, -{"cgn-config", {NULL}, 2183, "tcp"}, -{"cgn-config", {NULL}, 2183, "udp"}, -{"nvd", {NULL}, 2184, "tcp"}, -{"nvd", {NULL}, 2184, "udp"}, -{"onbase-dds", {NULL}, 2185, "tcp"}, -{"onbase-dds", {NULL}, 2185, "udp"}, -{"gtaua", {NULL}, 2186, "tcp"}, -{"gtaua", {NULL}, 2186, "udp"}, -{"ssmc", {NULL}, 2187, "tcp"}, -{"ssmd", {NULL}, 2187, "udp"}, -{"tivoconnect", {NULL}, 2190, "tcp"}, -{"tivoconnect", {NULL}, 2190, "udp"}, -{"tvbus", {NULL}, 2191, "tcp"}, -{"tvbus", {NULL}, 2191, "udp"}, -{"asdis", {NULL}, 2192, "tcp"}, -{"asdis", {NULL}, 2192, "udp"}, -{"drwcs", {NULL}, 2193, "tcp"}, -{"drwcs", {NULL}, 2193, "udp"}, -{"mnp-exchange", {NULL}, 2197, "tcp"}, -{"mnp-exchange", {NULL}, 2197, "udp"}, -{"onehome-remote", {NULL}, 2198, "tcp"}, -{"onehome-remote", {NULL}, 2198, "udp"}, -{"onehome-help", {NULL}, 2199, "tcp"}, -{"onehome-help", {NULL}, 2199, "udp"}, -{"ici", {NULL}, 2200, "tcp"}, -{"ici", {NULL}, 2200, "udp"}, -{"ats", {NULL}, 2201, "tcp"}, -{"ats", {NULL}, 2201, "udp"}, -{"imtc-map", {NULL}, 2202, "tcp"}, -{"imtc-map", {NULL}, 2202, "udp"}, -{"b2-runtime", {NULL}, 2203, "tcp"}, -{"b2-runtime", {NULL}, 2203, "udp"}, -{"b2-license", {NULL}, 2204, "tcp"}, -{"b2-license", {NULL}, 2204, "udp"}, -{"jps", {NULL}, 2205, "tcp"}, -{"jps", {NULL}, 2205, "udp"}, -{"hpocbus", {NULL}, 2206, "tcp"}, -{"hpocbus", {NULL}, 2206, "udp"}, -{"hpssd", {NULL}, 2207, "tcp"}, -{"hpssd", {NULL}, 2207, "udp"}, -{"hpiod", {NULL}, 2208, "tcp"}, -{"hpiod", {NULL}, 2208, "udp"}, -{"rimf-ps", {NULL}, 2209, "tcp"}, -{"rimf-ps", {NULL}, 2209, "udp"}, -{"noaaport", {NULL}, 2210, "tcp"}, -{"noaaport", {NULL}, 2210, "udp"}, -{"emwin", {NULL}, 2211, "tcp"}, -{"emwin", {NULL}, 2211, "udp"}, -{"leecoposserver", {NULL}, 2212, "tcp"}, -{"leecoposserver", {NULL}, 2212, "udp"}, -{"kali", {NULL}, 2213, "tcp"}, -{"kali", {NULL}, 2213, "udp"}, -{"rpi", {NULL}, 2214, "tcp"}, -{"rpi", {NULL}, 2214, "udp"}, -{"ipcore", {NULL}, 2215, "tcp"}, -{"ipcore", {NULL}, 2215, "udp"}, -{"vtu-comms", {NULL}, 2216, "tcp"}, -{"vtu-comms", {NULL}, 2216, "udp"}, -{"gotodevice", {NULL}, 2217, "tcp"}, -{"gotodevice", {NULL}, 2217, "udp"}, -{"bounzza", {NULL}, 2218, "tcp"}, -{"bounzza", {NULL}, 2218, "udp"}, -{"netiq-ncap", {NULL}, 2219, "tcp"}, -{"netiq-ncap", {NULL}, 2219, "udp"}, -{"netiq", {NULL}, 2220, "tcp"}, -{"netiq", {NULL}, 2220, "udp"}, -{"rockwell-csp1", {NULL}, 2221, "tcp"}, -{"rockwell-csp1", {NULL}, 2221, "udp"}, -{"EtherNet/IP-1", {NULL}, 2222, "tcp"}, -{"EtherNet/IP-1", {NULL}, 2222, "udp"}, -{"rockwell-csp2", {NULL}, 2223, "tcp"}, -{"rockwell-csp2", {NULL}, 2223, "udp"}, -{"efi-mg", {NULL}, 2224, "tcp"}, -{"efi-mg", {NULL}, 2224, "udp"}, -{"rcip-itu", {NULL}, 2225, "tcp"}, -{"rcip-itu", {NULL}, 2225, "sctp"}, -{"di-drm", {NULL}, 2226, "tcp"}, -{"di-drm", {NULL}, 2226, "udp"}, -{"di-msg", {NULL}, 2227, "tcp"}, -{"di-msg", {NULL}, 2227, "udp"}, -{"ehome-ms", {NULL}, 2228, "tcp"}, -{"ehome-ms", {NULL}, 2228, "udp"}, -{"datalens", {NULL}, 2229, "tcp"}, -{"datalens", {NULL}, 2229, "udp"}, -{"queueadm", {NULL}, 2230, "tcp"}, -{"queueadm", {NULL}, 2230, "udp"}, -{"wimaxasncp", {NULL}, 2231, "tcp"}, -{"wimaxasncp", {NULL}, 2231, "udp"}, -{"ivs-video", {NULL}, 2232, "tcp"}, -{"ivs-video", {NULL}, 2232, "udp"}, -{"infocrypt", {NULL}, 2233, "tcp"}, -{"infocrypt", {NULL}, 2233, "udp"}, -{"directplay", {NULL}, 2234, "tcp"}, -{"directplay", {NULL}, 2234, "udp"}, -{"sercomm-wlink", {NULL}, 2235, "tcp"}, -{"sercomm-wlink", {NULL}, 2235, "udp"}, -{"nani", {NULL}, 2236, "tcp"}, -{"nani", {NULL}, 2236, "udp"}, -{"optech-port1-lm", {NULL}, 2237, "tcp"}, -{"optech-port1-lm", {NULL}, 2237, "udp"}, -{"aviva-sna", {NULL}, 2238, "tcp"}, -{"aviva-sna", {NULL}, 2238, "udp"}, -{"imagequery", {NULL}, 2239, "tcp"}, -{"imagequery", {NULL}, 2239, "udp"}, -{"recipe", {NULL}, 2240, "tcp"}, -{"recipe", {NULL}, 2240, "udp"}, -{"ivsd", {NULL}, 2241, "tcp"}, -{"ivsd", {NULL}, 2241, "udp"}, -{"foliocorp", {NULL}, 2242, "tcp"}, -{"foliocorp", {NULL}, 2242, "udp"}, -{"magicom", {NULL}, 2243, "tcp"}, -{"magicom", {NULL}, 2243, "udp"}, -{"nmsserver", {NULL}, 2244, "tcp"}, -{"nmsserver", {NULL}, 2244, "udp"}, -{"hao", {NULL}, 2245, "tcp"}, -{"hao", {NULL}, 2245, "udp"}, -{"pc-mta-addrmap", {NULL}, 2246, "tcp"}, -{"pc-mta-addrmap", {NULL}, 2246, "udp"}, -{"antidotemgrsvr", {NULL}, 2247, "tcp"}, -{"antidotemgrsvr", {NULL}, 2247, "udp"}, -{"ums", {NULL}, 2248, "tcp"}, -{"ums", {NULL}, 2248, "udp"}, -{"rfmp", {NULL}, 2249, "tcp"}, -{"rfmp", {NULL}, 2249, "udp"}, -{"remote-collab", {NULL}, 2250, "tcp"}, -{"remote-collab", {NULL}, 2250, "udp"}, -{"dif-port", {NULL}, 2251, "tcp"}, -{"dif-port", {NULL}, 2251, "udp"}, -{"njenet-ssl", {NULL}, 2252, "tcp"}, -{"njenet-ssl", {NULL}, 2252, "udp"}, -{"dtv-chan-req", {NULL}, 2253, "tcp"}, -{"dtv-chan-req", {NULL}, 2253, "udp"}, -{"seispoc", {NULL}, 2254, "tcp"}, -{"seispoc", {NULL}, 2254, "udp"}, -{"vrtp", {NULL}, 2255, "tcp"}, -{"vrtp", {NULL}, 2255, "udp"}, -{"pcc-mfp", {NULL}, 2256, "tcp"}, -{"pcc-mfp", {NULL}, 2256, "udp"}, -{"simple-tx-rx", {NULL}, 2257, "tcp"}, -{"simple-tx-rx", {NULL}, 2257, "udp"}, -{"rcts", {NULL}, 2258, "tcp"}, -{"rcts", {NULL}, 2258, "udp"}, -{"acd-pm", {NULL}, 2259, "tcp"}, -{"acd-pm", {NULL}, 2259, "udp"}, -{"apc-2260", {NULL}, 2260, "tcp"}, -{"apc-2260", {NULL}, 2260, "udp"}, -{"comotionmaster", {NULL}, 2261, "tcp"}, -{"comotionmaster", {NULL}, 2261, "udp"}, -{"comotionback", {NULL}, 2262, "tcp"}, -{"comotionback", {NULL}, 2262, "udp"}, -{"ecwcfg", {NULL}, 2263, "tcp"}, -{"ecwcfg", {NULL}, 2263, "udp"}, -{"apx500api-1", {NULL}, 2264, "tcp"}, -{"apx500api-1", {NULL}, 2264, "udp"}, -{"apx500api-2", {NULL}, 2265, "tcp"}, -{"apx500api-2", {NULL}, 2265, "udp"}, -{"mfserver", {NULL}, 2266, "tcp"}, -{"mfserver", {NULL}, 2266, "udp"}, -{"ontobroker", {NULL}, 2267, "tcp"}, -{"ontobroker", {NULL}, 2267, "udp"}, -{"amt", {NULL}, 2268, "tcp"}, -{"amt", {NULL}, 2268, "udp"}, -{"mikey", {NULL}, 2269, "tcp"}, -{"mikey", {NULL}, 2269, "udp"}, -{"starschool", {NULL}, 2270, "tcp"}, -{"starschool", {NULL}, 2270, "udp"}, -{"mmcals", {NULL}, 2271, "tcp"}, -{"mmcals", {NULL}, 2271, "udp"}, -{"mmcal", {NULL}, 2272, "tcp"}, -{"mmcal", {NULL}, 2272, "udp"}, -{"mysql-im", {NULL}, 2273, "tcp"}, -{"mysql-im", {NULL}, 2273, "udp"}, -{"pcttunnell", {NULL}, 2274, "tcp"}, -{"pcttunnell", {NULL}, 2274, "udp"}, -{"ibridge-data", {NULL}, 2275, "tcp"}, -{"ibridge-data", {NULL}, 2275, "udp"}, -{"ibridge-mgmt", {NULL}, 2276, "tcp"}, -{"ibridge-mgmt", {NULL}, 2276, "udp"}, -{"bluectrlproxy", {NULL}, 2277, "tcp"}, -{"bluectrlproxy", {NULL}, 2277, "udp"}, -{"s3db", {NULL}, 2278, "tcp"}, -{"s3db", {NULL}, 2278, "udp"}, -{"xmquery", {NULL}, 2279, "tcp"}, -{"xmquery", {NULL}, 2279, "udp"}, -{"lnvpoller", {NULL}, 2280, "tcp"}, -{"lnvpoller", {NULL}, 2280, "udp"}, -{"lnvconsole", {NULL}, 2281, "tcp"}, -{"lnvconsole", {NULL}, 2281, "udp"}, -{"lnvalarm", {NULL}, 2282, "tcp"}, -{"lnvalarm", {NULL}, 2282, "udp"}, -{"lnvstatus", {NULL}, 2283, "tcp"}, -{"lnvstatus", {NULL}, 2283, "udp"}, -{"lnvmaps", {NULL}, 2284, "tcp"}, -{"lnvmaps", {NULL}, 2284, "udp"}, -{"lnvmailmon", {NULL}, 2285, "tcp"}, -{"lnvmailmon", {NULL}, 2285, "udp"}, -{"nas-metering", {NULL}, 2286, "tcp"}, -{"nas-metering", {NULL}, 2286, "udp"}, -{"dna", {NULL}, 2287, "tcp"}, -{"dna", {NULL}, 2287, "udp"}, -{"netml", {NULL}, 2288, "tcp"}, -{"netml", {NULL}, 2288, "udp"}, -{"dict-lookup", {NULL}, 2289, "tcp"}, -{"dict-lookup", {NULL}, 2289, "udp"}, -{"sonus-logging", {NULL}, 2290, "tcp"}, -{"sonus-logging", {NULL}, 2290, "udp"}, -{"eapsp", {NULL}, 2291, "tcp"}, -{"eapsp", {NULL}, 2291, "udp"}, -{"mib-streaming", {NULL}, 2292, "tcp"}, -{"mib-streaming", {NULL}, 2292, "udp"}, -{"npdbgmngr", {NULL}, 2293, "tcp"}, -{"npdbgmngr", {NULL}, 2293, "udp"}, -{"konshus-lm", {NULL}, 2294, "tcp"}, -{"konshus-lm", {NULL}, 2294, "udp"}, -{"advant-lm", {NULL}, 2295, "tcp"}, -{"advant-lm", {NULL}, 2295, "udp"}, -{"theta-lm", {NULL}, 2296, "tcp"}, -{"theta-lm", {NULL}, 2296, "udp"}, -{"d2k-datamover1", {NULL}, 2297, "tcp"}, -{"d2k-datamover1", {NULL}, 2297, "udp"}, -{"d2k-datamover2", {NULL}, 2298, "tcp"}, -{"d2k-datamover2", {NULL}, 2298, "udp"}, -{"pc-telecommute", {NULL}, 2299, "tcp"}, -{"pc-telecommute", {NULL}, 2299, "udp"}, -{"cvmmon", {NULL}, 2300, "tcp"}, -{"cvmmon", {NULL}, 2300, "udp"}, -{"cpq-wbem", {NULL}, 2301, "tcp"}, -{"cpq-wbem", {NULL}, 2301, "udp"}, -{"binderysupport", {NULL}, 2302, "tcp"}, -{"binderysupport", {NULL}, 2302, "udp"}, -{"proxy-gateway", {NULL}, 2303, "tcp"}, -{"proxy-gateway", {NULL}, 2303, "udp"}, -{"attachmate-uts", {NULL}, 2304, "tcp"}, -{"attachmate-uts", {NULL}, 2304, "udp"}, -{"mt-scaleserver", {NULL}, 2305, "tcp"}, -{"mt-scaleserver", {NULL}, 2305, "udp"}, -{"tappi-boxnet", {NULL}, 2306, "tcp"}, -{"tappi-boxnet", {NULL}, 2306, "udp"}, -{"pehelp", {NULL}, 2307, "tcp"}, -{"pehelp", {NULL}, 2307, "udp"}, -{"sdhelp", {NULL}, 2308, "tcp"}, -{"sdhelp", {NULL}, 2308, "udp"}, -{"sdserver", {NULL}, 2309, "tcp"}, -{"sdserver", {NULL}, 2309, "udp"}, -{"sdclient", {NULL}, 2310, "tcp"}, -{"sdclient", {NULL}, 2310, "udp"}, -{"messageservice", {NULL}, 2311, "tcp"}, -{"messageservice", {NULL}, 2311, "udp"}, -{"wanscaler", {NULL}, 2312, "tcp"}, -{"wanscaler", {NULL}, 2312, "udp"}, -{"iapp", {NULL}, 2313, "tcp"}, -{"iapp", {NULL}, 2313, "udp"}, -{"cr-websystems", {NULL}, 2314, "tcp"}, -{"cr-websystems", {NULL}, 2314, "udp"}, -{"precise-sft", {NULL}, 2315, "tcp"}, -{"precise-sft", {NULL}, 2315, "udp"}, -{"sent-lm", {NULL}, 2316, "tcp"}, -{"sent-lm", {NULL}, 2316, "udp"}, -{"attachmate-g32", {NULL}, 2317, "tcp"}, -{"attachmate-g32", {NULL}, 2317, "udp"}, -{"cadencecontrol", {NULL}, 2318, "tcp"}, -{"cadencecontrol", {NULL}, 2318, "udp"}, -{"infolibria", {NULL}, 2319, "tcp"}, -{"infolibria", {NULL}, 2319, "udp"}, -{"siebel-ns", {NULL}, 2320, "tcp"}, -{"siebel-ns", {NULL}, 2320, "udp"}, -{"rdlap", {NULL}, 2321, "tcp"}, -{"rdlap", {NULL}, 2321, "udp"}, -{"ofsd", {NULL}, 2322, "tcp"}, -{"ofsd", {NULL}, 2322, "udp"}, -{"3d-nfsd", {NULL}, 2323, "tcp"}, -{"3d-nfsd", {NULL}, 2323, "udp"}, -{"cosmocall", {NULL}, 2324, "tcp"}, -{"cosmocall", {NULL}, 2324, "udp"}, -{"ansysli", {NULL}, 2325, "tcp"}, -{"ansysli", {NULL}, 2325, "udp"}, -{"idcp", {NULL}, 2326, "tcp"}, -{"idcp", {NULL}, 2326, "udp"}, -{"xingcsm", {NULL}, 2327, "tcp"}, -{"xingcsm", {NULL}, 2327, "udp"}, -{"netrix-sftm", {NULL}, 2328, "tcp"}, -{"netrix-sftm", {NULL}, 2328, "udp"}, -{"nvd", {NULL}, 2329, "tcp"}, -{"nvd", {NULL}, 2329, "udp"}, -{"tscchat", {NULL}, 2330, "tcp"}, -{"tscchat", {NULL}, 2330, "udp"}, -{"agentview", {NULL}, 2331, "tcp"}, -{"agentview", {NULL}, 2331, "udp"}, -{"rcc-host", {NULL}, 2332, "tcp"}, -{"rcc-host", {NULL}, 2332, "udp"}, -{"snapp", {NULL}, 2333, "tcp"}, -{"snapp", {NULL}, 2333, "udp"}, -{"ace-client", {NULL}, 2334, "tcp"}, -{"ace-client", {NULL}, 2334, "udp"}, -{"ace-proxy", {NULL}, 2335, "tcp"}, -{"ace-proxy", {NULL}, 2335, "udp"}, -{"appleugcontrol", {NULL}, 2336, "tcp"}, -{"appleugcontrol", {NULL}, 2336, "udp"}, -{"ideesrv", {NULL}, 2337, "tcp"}, -{"ideesrv", {NULL}, 2337, "udp"}, -{"norton-lambert", {NULL}, 2338, "tcp"}, -{"norton-lambert", {NULL}, 2338, "udp"}, -{"3com-webview", {NULL}, 2339, "tcp"}, -{"3com-webview", {NULL}, 2339, "udp"}, -{"wrs_registry", {NULL}, 2340, "tcp"}, -{"wrs_registry", {NULL}, 2340, "udp"}, -{"xiostatus", {NULL}, 2341, "tcp"}, -{"xiostatus", {NULL}, 2341, "udp"}, -{"manage-exec", {NULL}, 2342, "tcp"}, -{"manage-exec", {NULL}, 2342, "udp"}, -{"nati-logos", {NULL}, 2343, "tcp"}, -{"nati-logos", {NULL}, 2343, "udp"}, -{"fcmsys", {NULL}, 2344, "tcp"}, -{"fcmsys", {NULL}, 2344, "udp"}, -{"dbm", {NULL}, 2345, "tcp"}, -{"dbm", {NULL}, 2345, "udp"}, -{"redstorm_join", {NULL}, 2346, "tcp"}, -{"redstorm_join", {NULL}, 2346, "udp"}, -{"redstorm_find", {NULL}, 2347, "tcp"}, -{"redstorm_find", {NULL}, 2347, "udp"}, -{"redstorm_info", {NULL}, 2348, "tcp"}, -{"redstorm_info", {NULL}, 2348, "udp"}, -{"redstorm_diag", {NULL}, 2349, "tcp"}, -{"redstorm_diag", {NULL}, 2349, "udp"}, -{"psbserver", {NULL}, 2350, "tcp"}, -{"psbserver", {NULL}, 2350, "udp"}, -{"psrserver", {NULL}, 2351, "tcp"}, -{"psrserver", {NULL}, 2351, "udp"}, -{"pslserver", {NULL}, 2352, "tcp"}, -{"pslserver", {NULL}, 2352, "udp"}, -{"pspserver", {NULL}, 2353, "tcp"}, -{"pspserver", {NULL}, 2353, "udp"}, -{"psprserver", {NULL}, 2354, "tcp"}, -{"psprserver", {NULL}, 2354, "udp"}, -{"psdbserver", {NULL}, 2355, "tcp"}, -{"psdbserver", {NULL}, 2355, "udp"}, -{"gxtelmd", {NULL}, 2356, "tcp"}, -{"gxtelmd", {NULL}, 2356, "udp"}, -{"unihub-server", {NULL}, 2357, "tcp"}, -{"unihub-server", {NULL}, 2357, "udp"}, -{"futrix", {NULL}, 2358, "tcp"}, -{"futrix", {NULL}, 2358, "udp"}, -{"flukeserver", {NULL}, 2359, "tcp"}, -{"flukeserver", {NULL}, 2359, "udp"}, -{"nexstorindltd", {NULL}, 2360, "tcp"}, -{"nexstorindltd", {NULL}, 2360, "udp"}, -{"tl1", {NULL}, 2361, "tcp"}, -{"tl1", {NULL}, 2361, "udp"}, -{"digiman", {NULL}, 2362, "tcp"}, -{"digiman", {NULL}, 2362, "udp"}, -{"mediacntrlnfsd", {NULL}, 2363, "tcp"}, -{"mediacntrlnfsd", {NULL}, 2363, "udp"}, -{"oi-2000", {NULL}, 2364, "tcp"}, -{"oi-2000", {NULL}, 2364, "udp"}, -{"dbref", {NULL}, 2365, "tcp"}, -{"dbref", {NULL}, 2365, "udp"}, -{"qip-login", {NULL}, 2366, "tcp"}, -{"qip-login", {NULL}, 2366, "udp"}, -{"service-ctrl", {NULL}, 2367, "tcp"}, -{"service-ctrl", {NULL}, 2367, "udp"}, -{"opentable", {NULL}, 2368, "tcp"}, -{"opentable", {NULL}, 2368, "udp"}, -{"l3-hbmon", {NULL}, 2370, "tcp"}, -{"l3-hbmon", {NULL}, 2370, "udp"}, -{"worldwire", {NULL}, 2371, "tcp"}, -{"worldwire", {NULL}, 2371, "udp"}, -{"lanmessenger", {NULL}, 2372, "tcp"}, -{"lanmessenger", {NULL}, 2372, "udp"}, -{"remographlm", {NULL}, 2373, "tcp"}, -{"hydra", {NULL}, 2374, "tcp"}, -{"compaq-https", {NULL}, 2381, "tcp"}, -{"compaq-https", {NULL}, 2381, "udp"}, -{"ms-olap3", {NULL}, 2382, "tcp"}, -{"ms-olap3", {NULL}, 2382, "udp"}, -{"ms-olap4", {NULL}, 2383, "tcp"}, -{"ms-olap4", {NULL}, 2383, "udp"}, -{"sd-request", {NULL}, 2384, "tcp"}, -{"sd-capacity", {NULL}, 2384, "udp"}, -{"sd-data", {NULL}, 2385, "tcp"}, -{"sd-data", {NULL}, 2385, "udp"}, -{"virtualtape", {NULL}, 2386, "tcp"}, -{"virtualtape", {NULL}, 2386, "udp"}, -{"vsamredirector", {NULL}, 2387, "tcp"}, -{"vsamredirector", {NULL}, 2387, "udp"}, -{"mynahautostart", {NULL}, 2388, "tcp"}, -{"mynahautostart", {NULL}, 2388, "udp"}, -{"ovsessionmgr", {NULL}, 2389, "tcp"}, -{"ovsessionmgr", {NULL}, 2389, "udp"}, -{"rsmtp", {NULL}, 2390, "tcp"}, -{"rsmtp", {NULL}, 2390, "udp"}, -{"3com-net-mgmt", {NULL}, 2391, "tcp"}, -{"3com-net-mgmt", {NULL}, 2391, "udp"}, -{"tacticalauth", {NULL}, 2392, "tcp"}, -{"tacticalauth", {NULL}, 2392, "udp"}, -{"ms-olap1", {NULL}, 2393, "tcp"}, -{"ms-olap1", {NULL}, 2393, "udp"}, -{"ms-olap2", {NULL}, 2394, "tcp"}, -{"ms-olap2", {NULL}, 2394, "udp"}, -{"lan900_remote", {NULL}, 2395, "tcp"}, -{"lan900_remote", {NULL}, 2395, "udp"}, -{"wusage", {NULL}, 2396, "tcp"}, -{"wusage", {NULL}, 2396, "udp"}, -{"ncl", {NULL}, 2397, "tcp"}, -{"ncl", {NULL}, 2397, "udp"}, -{"orbiter", {NULL}, 2398, "tcp"}, -{"orbiter", {NULL}, 2398, "udp"}, -{"fmpro-fdal", {NULL}, 2399, "tcp"}, -{"fmpro-fdal", {NULL}, 2399, "udp"}, -{"opequus-server", {NULL}, 2400, "tcp"}, -{"opequus-server", {NULL}, 2400, "udp"}, -{"cvspserver", {NULL}, 2401, "tcp"}, -{"cvspserver", {NULL}, 2401, "udp"}, -{"taskmaster2000", {NULL}, 2402, "tcp"}, -{"taskmaster2000", {NULL}, 2402, "udp"}, -{"taskmaster2000", {NULL}, 2403, "tcp"}, -{"taskmaster2000", {NULL}, 2403, "udp"}, -{"iec-104", {NULL}, 2404, "tcp"}, -{"iec-104", {NULL}, 2404, "udp"}, -{"trc-netpoll", {NULL}, 2405, "tcp"}, -{"trc-netpoll", {NULL}, 2405, "udp"}, -{"jediserver", {NULL}, 2406, "tcp"}, -{"jediserver", {NULL}, 2406, "udp"}, -{"orion", {NULL}, 2407, "tcp"}, -{"orion", {NULL}, 2407, "udp"}, -{"optimanet", {NULL}, 2408, "tcp"}, -{"optimanet", {NULL}, 2408, "udp"}, -{"sns-protocol", {NULL}, 2409, "tcp"}, -{"sns-protocol", {NULL}, 2409, "udp"}, -{"vrts-registry", {NULL}, 2410, "tcp"}, -{"vrts-registry", {NULL}, 2410, "udp"}, -{"netwave-ap-mgmt", {NULL}, 2411, "tcp"}, -{"netwave-ap-mgmt", {NULL}, 2411, "udp"}, -{"cdn", {NULL}, 2412, "tcp"}, -{"cdn", {NULL}, 2412, "udp"}, -{"orion-rmi-reg", {NULL}, 2413, "tcp"}, -{"orion-rmi-reg", {NULL}, 2413, "udp"}, -{"beeyond", {NULL}, 2414, "tcp"}, -{"beeyond", {NULL}, 2414, "udp"}, -{"codima-rtp", {NULL}, 2415, "tcp"}, -{"codima-rtp", {NULL}, 2415, "udp"}, -{"rmtserver", {NULL}, 2416, "tcp"}, -{"rmtserver", {NULL}, 2416, "udp"}, -{"composit-server", {NULL}, 2417, "tcp"}, -{"composit-server", {NULL}, 2417, "udp"}, -{"cas", {NULL}, 2418, "tcp"}, -{"cas", {NULL}, 2418, "udp"}, -{"attachmate-s2s", {NULL}, 2419, "tcp"}, -{"attachmate-s2s", {NULL}, 2419, "udp"}, -{"dslremote-mgmt", {NULL}, 2420, "tcp"}, -{"dslremote-mgmt", {NULL}, 2420, "udp"}, -{"g-talk", {NULL}, 2421, "tcp"}, -{"g-talk", {NULL}, 2421, "udp"}, -{"crmsbits", {NULL}, 2422, "tcp"}, -{"crmsbits", {NULL}, 2422, "udp"}, -{"rnrp", {NULL}, 2423, "tcp"}, -{"rnrp", {NULL}, 2423, "udp"}, -{"kofax-svr", {NULL}, 2424, "tcp"}, -{"kofax-svr", {NULL}, 2424, "udp"}, -{"fjitsuappmgr", {NULL}, 2425, "tcp"}, -{"fjitsuappmgr", {NULL}, 2425, "udp"}, -{"mgcp-gateway", {NULL}, 2427, "tcp"}, -{"mgcp-gateway", {NULL}, 2427, "udp"}, -{"ott", {NULL}, 2428, "tcp"}, -{"ott", {NULL}, 2428, "udp"}, -{"ft-role", {NULL}, 2429, "tcp"}, -{"ft-role", {NULL}, 2429, "udp"}, -{"venus", {NULL}, 2430, "tcp"}, -{"venus", {NULL}, 2430, "udp"}, -{"venus-se", {NULL}, 2431, "tcp"}, -{"venus-se", {NULL}, 2431, "udp"}, -{"codasrv", {NULL}, 2432, "tcp"}, -{"codasrv", {NULL}, 2432, "udp"}, -{"codasrv-se", {NULL}, 2433, "tcp"}, -{"codasrv-se", {NULL}, 2433, "udp"}, -{"pxc-epmap", {NULL}, 2434, "tcp"}, -{"pxc-epmap", {NULL}, 2434, "udp"}, -{"optilogic", {NULL}, 2435, "tcp"}, -{"optilogic", {NULL}, 2435, "udp"}, -{"topx", {NULL}, 2436, "tcp"}, -{"topx", {NULL}, 2436, "udp"}, -{"unicontrol", {NULL}, 2437, "tcp"}, -{"unicontrol", {NULL}, 2437, "udp"}, -{"msp", {NULL}, 2438, "tcp"}, -{"msp", {NULL}, 2438, "udp"}, -{"sybasedbsynch", {NULL}, 2439, "tcp"}, -{"sybasedbsynch", {NULL}, 2439, "udp"}, -{"spearway", {NULL}, 2440, "tcp"}, -{"spearway", {NULL}, 2440, "udp"}, -{"pvsw-inet", {NULL}, 2441, "tcp"}, -{"pvsw-inet", {NULL}, 2441, "udp"}, -{"netangel", {NULL}, 2442, "tcp"}, -{"netangel", {NULL}, 2442, "udp"}, -{"powerclientcsf", {NULL}, 2443, "tcp"}, -{"powerclientcsf", {NULL}, 2443, "udp"}, -{"btpp2sectrans", {NULL}, 2444, "tcp"}, -{"btpp2sectrans", {NULL}, 2444, "udp"}, -{"dtn1", {NULL}, 2445, "tcp"}, -{"dtn1", {NULL}, 2445, "udp"}, -{"bues_service", {NULL}, 2446, "tcp"}, -{"bues_service", {NULL}, 2446, "udp"}, -{"ovwdb", {NULL}, 2447, "tcp"}, -{"ovwdb", {NULL}, 2447, "udp"}, -{"hpppssvr", {NULL}, 2448, "tcp"}, -{"hpppssvr", {NULL}, 2448, "udp"}, -{"ratl", {NULL}, 2449, "tcp"}, -{"ratl", {NULL}, 2449, "udp"}, -{"netadmin", {NULL}, 2450, "tcp"}, -{"netadmin", {NULL}, 2450, "udp"}, -{"netchat", {NULL}, 2451, "tcp"}, -{"netchat", {NULL}, 2451, "udp"}, -{"snifferclient", {NULL}, 2452, "tcp"}, -{"snifferclient", {NULL}, 2452, "udp"}, -{"madge-ltd", {NULL}, 2453, "tcp"}, -{"madge-ltd", {NULL}, 2453, "udp"}, -{"indx-dds", {NULL}, 2454, "tcp"}, -{"indx-dds", {NULL}, 2454, "udp"}, -{"wago-io-system", {NULL}, 2455, "tcp"}, -{"wago-io-system", {NULL}, 2455, "udp"}, -{"altav-remmgt", {NULL}, 2456, "tcp"}, -{"altav-remmgt", {NULL}, 2456, "udp"}, -{"rapido-ip", {NULL}, 2457, "tcp"}, -{"rapido-ip", {NULL}, 2457, "udp"}, -{"griffin", {NULL}, 2458, "tcp"}, -{"griffin", {NULL}, 2458, "udp"}, -{"community", {NULL}, 2459, "tcp"}, -{"community", {NULL}, 2459, "udp"}, -{"ms-theater", {NULL}, 2460, "tcp"}, -{"ms-theater", {NULL}, 2460, "udp"}, -{"qadmifoper", {NULL}, 2461, "tcp"}, -{"qadmifoper", {NULL}, 2461, "udp"}, -{"qadmifevent", {NULL}, 2462, "tcp"}, -{"qadmifevent", {NULL}, 2462, "udp"}, -{"lsi-raid-mgmt", {NULL}, 2463, "tcp"}, -{"lsi-raid-mgmt", {NULL}, 2463, "udp"}, -{"direcpc-si", {NULL}, 2464, "tcp"}, -{"direcpc-si", {NULL}, 2464, "udp"}, -{"lbm", {NULL}, 2465, "tcp"}, -{"lbm", {NULL}, 2465, "udp"}, -{"lbf", {NULL}, 2466, "tcp"}, -{"lbf", {NULL}, 2466, "udp"}, -{"high-criteria", {NULL}, 2467, "tcp"}, -{"high-criteria", {NULL}, 2467, "udp"}, -{"qip-msgd", {NULL}, 2468, "tcp"}, -{"qip-msgd", {NULL}, 2468, "udp"}, -{"mti-tcs-comm", {NULL}, 2469, "tcp"}, -{"mti-tcs-comm", {NULL}, 2469, "udp"}, -{"taskman-port", {NULL}, 2470, "tcp"}, -{"taskman-port", {NULL}, 2470, "udp"}, -{"seaodbc", {NULL}, 2471, "tcp"}, -{"seaodbc", {NULL}, 2471, "udp"}, -{"c3", {NULL}, 2472, "tcp"}, -{"c3", {NULL}, 2472, "udp"}, -{"aker-cdp", {NULL}, 2473, "tcp"}, -{"aker-cdp", {NULL}, 2473, "udp"}, -{"vitalanalysis", {NULL}, 2474, "tcp"}, -{"vitalanalysis", {NULL}, 2474, "udp"}, -{"ace-server", {NULL}, 2475, "tcp"}, -{"ace-server", {NULL}, 2475, "udp"}, -{"ace-svr-prop", {NULL}, 2476, "tcp"}, -{"ace-svr-prop", {NULL}, 2476, "udp"}, -{"ssm-cvs", {NULL}, 2477, "tcp"}, -{"ssm-cvs", {NULL}, 2477, "udp"}, -{"ssm-cssps", {NULL}, 2478, "tcp"}, -{"ssm-cssps", {NULL}, 2478, "udp"}, -{"ssm-els", {NULL}, 2479, "tcp"}, -{"ssm-els", {NULL}, 2479, "udp"}, -{"powerexchange", {NULL}, 2480, "tcp"}, -{"powerexchange", {NULL}, 2480, "udp"}, -{"giop", {NULL}, 2481, "tcp"}, -{"giop", {NULL}, 2481, "udp"}, -{"giop-ssl", {NULL}, 2482, "tcp"}, -{"giop-ssl", {NULL}, 2482, "udp"}, -{"ttc", {NULL}, 2483, "tcp"}, -{"ttc", {NULL}, 2483, "udp"}, -{"ttc-ssl", {NULL}, 2484, "tcp"}, -{"ttc-ssl", {NULL}, 2484, "udp"}, -{"netobjects1", {NULL}, 2485, "tcp"}, -{"netobjects1", {NULL}, 2485, "udp"}, -{"netobjects2", {NULL}, 2486, "tcp"}, -{"netobjects2", {NULL}, 2486, "udp"}, -{"pns", {NULL}, 2487, "tcp"}, -{"pns", {NULL}, 2487, "udp"}, -{"moy-corp", {NULL}, 2488, "tcp"}, -{"moy-corp", {NULL}, 2488, "udp"}, -{"tsilb", {NULL}, 2489, "tcp"}, -{"tsilb", {NULL}, 2489, "udp"}, -{"qip-qdhcp", {NULL}, 2490, "tcp"}, -{"qip-qdhcp", {NULL}, 2490, "udp"}, -{"conclave-cpp", {NULL}, 2491, "tcp"}, -{"conclave-cpp", {NULL}, 2491, "udp"}, -{"groove", {NULL}, 2492, "tcp"}, -{"groove", {NULL}, 2492, "udp"}, -{"talarian-mqs", {NULL}, 2493, "tcp"}, -{"talarian-mqs", {NULL}, 2493, "udp"}, -{"bmc-ar", {NULL}, 2494, "tcp"}, -{"bmc-ar", {NULL}, 2494, "udp"}, -{"fast-rem-serv", {NULL}, 2495, "tcp"}, -{"fast-rem-serv", {NULL}, 2495, "udp"}, -{"dirgis", {NULL}, 2496, "tcp"}, -{"dirgis", {NULL}, 2496, "udp"}, -{"quaddb", {NULL}, 2497, "tcp"}, -{"quaddb", {NULL}, 2497, "udp"}, -{"odn-castraq", {NULL}, 2498, "tcp"}, -{"odn-castraq", {NULL}, 2498, "udp"}, -{"unicontrol", {NULL}, 2499, "tcp"}, -{"unicontrol", {NULL}, 2499, "udp"}, -{"rtsserv", {NULL}, 2500, "tcp"}, -{"rtsserv", {NULL}, 2500, "udp"}, -{"rtsclient", {NULL}, 2501, "tcp"}, -{"rtsclient", {NULL}, 2501, "udp"}, -{"kentrox-prot", {NULL}, 2502, "tcp"}, -{"kentrox-prot", {NULL}, 2502, "udp"}, -{"nms-dpnss", {NULL}, 2503, "tcp"}, -{"nms-dpnss", {NULL}, 2503, "udp"}, -{"wlbs", {NULL}, 2504, "tcp"}, -{"wlbs", {NULL}, 2504, "udp"}, -{"ppcontrol", {NULL}, 2505, "tcp"}, -{"ppcontrol", {NULL}, 2505, "udp"}, -{"jbroker", {NULL}, 2506, "tcp"}, -{"jbroker", {NULL}, 2506, "udp"}, -{"spock", {NULL}, 2507, "tcp"}, -{"spock", {NULL}, 2507, "udp"}, -{"jdatastore", {NULL}, 2508, "tcp"}, -{"jdatastore", {NULL}, 2508, "udp"}, -{"fjmpss", {NULL}, 2509, "tcp"}, -{"fjmpss", {NULL}, 2509, "udp"}, -{"fjappmgrbulk", {NULL}, 2510, "tcp"}, -{"fjappmgrbulk", {NULL}, 2510, "udp"}, -{"metastorm", {NULL}, 2511, "tcp"}, -{"metastorm", {NULL}, 2511, "udp"}, -{"citrixima", {NULL}, 2512, "tcp"}, -{"citrixima", {NULL}, 2512, "udp"}, -{"citrixadmin", {NULL}, 2513, "tcp"}, -{"citrixadmin", {NULL}, 2513, "udp"}, -{"facsys-ntp", {NULL}, 2514, "tcp"}, -{"facsys-ntp", {NULL}, 2514, "udp"}, -{"facsys-router", {NULL}, 2515, "tcp"}, -{"facsys-router", {NULL}, 2515, "udp"}, -{"maincontrol", {NULL}, 2516, "tcp"}, -{"maincontrol", {NULL}, 2516, "udp"}, -{"call-sig-trans", {NULL}, 2517, "tcp"}, -{"call-sig-trans", {NULL}, 2517, "udp"}, -{"willy", {NULL}, 2518, "tcp"}, -{"willy", {NULL}, 2518, "udp"}, -{"globmsgsvc", {NULL}, 2519, "tcp"}, -{"globmsgsvc", {NULL}, 2519, "udp"}, -{"pvsw", {NULL}, 2520, "tcp"}, -{"pvsw", {NULL}, 2520, "udp"}, -{"adaptecmgr", {NULL}, 2521, "tcp"}, -{"adaptecmgr", {NULL}, 2521, "udp"}, -{"windb", {NULL}, 2522, "tcp"}, -{"windb", {NULL}, 2522, "udp"}, -{"qke-llc-v3", {NULL}, 2523, "tcp"}, -{"qke-llc-v3", {NULL}, 2523, "udp"}, -{"optiwave-lm", {NULL}, 2524, "tcp"}, -{"optiwave-lm", {NULL}, 2524, "udp"}, -{"ms-v-worlds", {NULL}, 2525, "tcp"}, -{"ms-v-worlds", {NULL}, 2525, "udp"}, -{"ema-sent-lm", {NULL}, 2526, "tcp"}, -{"ema-sent-lm", {NULL}, 2526, "udp"}, -{"iqserver", {NULL}, 2527, "tcp"}, -{"iqserver", {NULL}, 2527, "udp"}, -{"ncr_ccl", {NULL}, 2528, "tcp"}, -{"ncr_ccl", {NULL}, 2528, "udp"}, -{"utsftp", {NULL}, 2529, "tcp"}, -{"utsftp", {NULL}, 2529, "udp"}, -{"vrcommerce", {NULL}, 2530, "tcp"}, -{"vrcommerce", {NULL}, 2530, "udp"}, -{"ito-e-gui", {NULL}, 2531, "tcp"}, -{"ito-e-gui", {NULL}, 2531, "udp"}, -{"ovtopmd", {NULL}, 2532, "tcp"}, -{"ovtopmd", {NULL}, 2532, "udp"}, -{"snifferserver", {NULL}, 2533, "tcp"}, -{"snifferserver", {NULL}, 2533, "udp"}, -{"combox-web-acc", {NULL}, 2534, "tcp"}, -{"combox-web-acc", {NULL}, 2534, "udp"}, -{"madcap", {NULL}, 2535, "tcp"}, -{"madcap", {NULL}, 2535, "udp"}, -{"btpp2audctr1", {NULL}, 2536, "tcp"}, -{"btpp2audctr1", {NULL}, 2536, "udp"}, -{"upgrade", {NULL}, 2537, "tcp"}, -{"upgrade", {NULL}, 2537, "udp"}, -{"vnwk-prapi", {NULL}, 2538, "tcp"}, -{"vnwk-prapi", {NULL}, 2538, "udp"}, -{"vsiadmin", {NULL}, 2539, "tcp"}, -{"vsiadmin", {NULL}, 2539, "udp"}, -{"lonworks", {NULL}, 2540, "tcp"}, -{"lonworks", {NULL}, 2540, "udp"}, -{"lonworks2", {NULL}, 2541, "tcp"}, -{"lonworks2", {NULL}, 2541, "udp"}, -{"udrawgraph", {NULL}, 2542, "tcp"}, -{"udrawgraph", {NULL}, 2542, "udp"}, -{"reftek", {NULL}, 2543, "tcp"}, -{"reftek", {NULL}, 2543, "udp"}, -{"novell-zen", {NULL}, 2544, "tcp"}, -{"novell-zen", {NULL}, 2544, "udp"}, -{"sis-emt", {NULL}, 2545, "tcp"}, -{"sis-emt", {NULL}, 2545, "udp"}, -{"vytalvaultbrtp", {NULL}, 2546, "tcp"}, -{"vytalvaultbrtp", {NULL}, 2546, "udp"}, -{"vytalvaultvsmp", {NULL}, 2547, "tcp"}, -{"vytalvaultvsmp", {NULL}, 2547, "udp"}, -{"vytalvaultpipe", {NULL}, 2548, "tcp"}, -{"vytalvaultpipe", {NULL}, 2548, "udp"}, -{"ipass", {NULL}, 2549, "tcp"}, -{"ipass", {NULL}, 2549, "udp"}, -{"ads", {NULL}, 2550, "tcp"}, -{"ads", {NULL}, 2550, "udp"}, -{"isg-uda-server", {NULL}, 2551, "tcp"}, -{"isg-uda-server", {NULL}, 2551, "udp"}, -{"call-logging", {NULL}, 2552, "tcp"}, -{"call-logging", {NULL}, 2552, "udp"}, -{"efidiningport", {NULL}, 2553, "tcp"}, -{"efidiningport", {NULL}, 2553, "udp"}, -{"vcnet-link-v10", {NULL}, 2554, "tcp"}, -{"vcnet-link-v10", {NULL}, 2554, "udp"}, -{"compaq-wcp", {NULL}, 2555, "tcp"}, -{"compaq-wcp", {NULL}, 2555, "udp"}, -{"nicetec-nmsvc", {NULL}, 2556, "tcp"}, -{"nicetec-nmsvc", {NULL}, 2556, "udp"}, -{"nicetec-mgmt", {NULL}, 2557, "tcp"}, -{"nicetec-mgmt", {NULL}, 2557, "udp"}, -{"pclemultimedia", {NULL}, 2558, "tcp"}, -{"pclemultimedia", {NULL}, 2558, "udp"}, -{"lstp", {NULL}, 2559, "tcp"}, -{"lstp", {NULL}, 2559, "udp"}, -{"labrat", {NULL}, 2560, "tcp"}, -{"labrat", {NULL}, 2560, "udp"}, -{"mosaixcc", {NULL}, 2561, "tcp"}, -{"mosaixcc", {NULL}, 2561, "udp"}, -{"delibo", {NULL}, 2562, "tcp"}, -{"delibo", {NULL}, 2562, "udp"}, -{"cti-redwood", {NULL}, 2563, "tcp"}, -{"cti-redwood", {NULL}, 2563, "udp"}, -{"hp-3000-telnet", {NULL}, 2564, "tcp"}, -{"coord-svr", {NULL}, 2565, "tcp"}, -{"coord-svr", {NULL}, 2565, "udp"}, -{"pcs-pcw", {NULL}, 2566, "tcp"}, -{"pcs-pcw", {NULL}, 2566, "udp"}, -{"clp", {NULL}, 2567, "tcp"}, -{"clp", {NULL}, 2567, "udp"}, -{"spamtrap", {NULL}, 2568, "tcp"}, -{"spamtrap", {NULL}, 2568, "udp"}, -{"sonuscallsig", {NULL}, 2569, "tcp"}, -{"sonuscallsig", {NULL}, 2569, "udp"}, -{"hs-port", {NULL}, 2570, "tcp"}, -{"hs-port", {NULL}, 2570, "udp"}, -{"cecsvc", {NULL}, 2571, "tcp"}, -{"cecsvc", {NULL}, 2571, "udp"}, -{"ibp", {NULL}, 2572, "tcp"}, -{"ibp", {NULL}, 2572, "udp"}, -{"trustestablish", {NULL}, 2573, "tcp"}, -{"trustestablish", {NULL}, 2573, "udp"}, -{"blockade-bpsp", {NULL}, 2574, "tcp"}, -{"blockade-bpsp", {NULL}, 2574, "udp"}, -{"hl7", {NULL}, 2575, "tcp"}, -{"hl7", {NULL}, 2575, "udp"}, -{"tclprodebugger", {NULL}, 2576, "tcp"}, -{"tclprodebugger", {NULL}, 2576, "udp"}, -{"scipticslsrvr", {NULL}, 2577, "tcp"}, -{"scipticslsrvr", {NULL}, 2577, "udp"}, -{"rvs-isdn-dcp", {NULL}, 2578, "tcp"}, -{"rvs-isdn-dcp", {NULL}, 2578, "udp"}, -{"mpfoncl", {NULL}, 2579, "tcp"}, -{"mpfoncl", {NULL}, 2579, "udp"}, -{"tributary", {NULL}, 2580, "tcp"}, -{"tributary", {NULL}, 2580, "udp"}, -{"argis-te", {NULL}, 2581, "tcp"}, -{"argis-te", {NULL}, 2581, "udp"}, -{"argis-ds", {NULL}, 2582, "tcp"}, -{"argis-ds", {NULL}, 2582, "udp"}, -{"mon", {NULL}, 2583, "tcp"}, -{"mon", {NULL}, 2583, "udp"}, -{"cyaserv", {NULL}, 2584, "tcp"}, -{"cyaserv", {NULL}, 2584, "udp"}, -{"netx-server", {NULL}, 2585, "tcp"}, -{"netx-server", {NULL}, 2585, "udp"}, -{"netx-agent", {NULL}, 2586, "tcp"}, -{"netx-agent", {NULL}, 2586, "udp"}, -{"masc", {NULL}, 2587, "tcp"}, -{"masc", {NULL}, 2587, "udp"}, -{"privilege", {NULL}, 2588, "tcp"}, -{"privilege", {NULL}, 2588, "udp"}, -{"quartus-tcl", {NULL}, 2589, "tcp"}, -{"quartus-tcl", {NULL}, 2589, "udp"}, -{"idotdist", {NULL}, 2590, "tcp"}, -{"idotdist", {NULL}, 2590, "udp"}, -{"maytagshuffle", {NULL}, 2591, "tcp"}, -{"maytagshuffle", {NULL}, 2591, "udp"}, -{"netrek", {NULL}, 2592, "tcp"}, -{"netrek", {NULL}, 2592, "udp"}, -{"mns-mail", {NULL}, 2593, "tcp"}, -{"mns-mail", {NULL}, 2593, "udp"}, -{"dts", {NULL}, 2594, "tcp"}, -{"dts", {NULL}, 2594, "udp"}, -{"worldfusion1", {NULL}, 2595, "tcp"}, -{"worldfusion1", {NULL}, 2595, "udp"}, -{"worldfusion2", {NULL}, 2596, "tcp"}, -{"worldfusion2", {NULL}, 2596, "udp"}, -{"homesteadglory", {NULL}, 2597, "tcp"}, -{"homesteadglory", {NULL}, 2597, "udp"}, -{"citriximaclient", {NULL}, 2598, "tcp"}, -{"citriximaclient", {NULL}, 2598, "udp"}, -{"snapd", {NULL}, 2599, "tcp"}, -{"snapd", {NULL}, 2599, "udp"}, -{"hpstgmgr", {NULL}, 2600, "tcp"}, -{"hpstgmgr", {NULL}, 2600, "udp"}, -{"discp-client", {NULL}, 2601, "tcp"}, -{"discp-client", {NULL}, 2601, "udp"}, -{"discp-server", {NULL}, 2602, "tcp"}, -{"discp-server", {NULL}, 2602, "udp"}, -{"servicemeter", {NULL}, 2603, "tcp"}, -{"servicemeter", {NULL}, 2603, "udp"}, -{"nsc-ccs", {NULL}, 2604, "tcp"}, -{"nsc-ccs", {NULL}, 2604, "udp"}, -{"nsc-posa", {NULL}, 2605, "tcp"}, -{"nsc-posa", {NULL}, 2605, "udp"}, -{"netmon", {NULL}, 2606, "tcp"}, -{"netmon", {NULL}, 2606, "udp"}, -{"connection", {NULL}, 2607, "tcp"}, -{"connection", {NULL}, 2607, "udp"}, -{"wag-service", {NULL}, 2608, "tcp"}, -{"wag-service", {NULL}, 2608, "udp"}, -{"system-monitor", {NULL}, 2609, "tcp"}, -{"system-monitor", {NULL}, 2609, "udp"}, -{"versa-tek", {NULL}, 2610, "tcp"}, -{"versa-tek", {NULL}, 2610, "udp"}, -{"lionhead", {NULL}, 2611, "tcp"}, -{"lionhead", {NULL}, 2611, "udp"}, -{"qpasa-agent", {NULL}, 2612, "tcp"}, -{"qpasa-agent", {NULL}, 2612, "udp"}, -{"smntubootstrap", {NULL}, 2613, "tcp"}, -{"smntubootstrap", {NULL}, 2613, "udp"}, -{"neveroffline", {NULL}, 2614, "tcp"}, -{"neveroffline", {NULL}, 2614, "udp"}, -{"firepower", {NULL}, 2615, "tcp"}, -{"firepower", {NULL}, 2615, "udp"}, -{"appswitch-emp", {NULL}, 2616, "tcp"}, -{"appswitch-emp", {NULL}, 2616, "udp"}, -{"cmadmin", {NULL}, 2617, "tcp"}, -{"cmadmin", {NULL}, 2617, "udp"}, -{"priority-e-com", {NULL}, 2618, "tcp"}, -{"priority-e-com", {NULL}, 2618, "udp"}, -{"bruce", {NULL}, 2619, "tcp"}, -{"bruce", {NULL}, 2619, "udp"}, -{"lpsrecommender", {NULL}, 2620, "tcp"}, -{"lpsrecommender", {NULL}, 2620, "udp"}, -{"miles-apart", {NULL}, 2621, "tcp"}, -{"miles-apart", {NULL}, 2621, "udp"}, -{"metricadbc", {NULL}, 2622, "tcp"}, -{"metricadbc", {NULL}, 2622, "udp"}, -{"lmdp", {NULL}, 2623, "tcp"}, -{"lmdp", {NULL}, 2623, "udp"}, -{"aria", {NULL}, 2624, "tcp"}, -{"aria", {NULL}, 2624, "udp"}, -{"blwnkl-port", {NULL}, 2625, "tcp"}, -{"blwnkl-port", {NULL}, 2625, "udp"}, -{"gbjd816", {NULL}, 2626, "tcp"}, -{"gbjd816", {NULL}, 2626, "udp"}, -{"moshebeeri", {NULL}, 2627, "tcp"}, -{"moshebeeri", {NULL}, 2627, "udp"}, -{"dict", {NULL}, 2628, "tcp"}, -{"dict", {NULL}, 2628, "udp"}, -{"sitaraserver", {NULL}, 2629, "tcp"}, -{"sitaraserver", {NULL}, 2629, "udp"}, -{"sitaramgmt", {NULL}, 2630, "tcp"}, -{"sitaramgmt", {NULL}, 2630, "udp"}, -{"sitaradir", {NULL}, 2631, "tcp"}, -{"sitaradir", {NULL}, 2631, "udp"}, -{"irdg-post", {NULL}, 2632, "tcp"}, -{"irdg-post", {NULL}, 2632, "udp"}, -{"interintelli", {NULL}, 2633, "tcp"}, -{"interintelli", {NULL}, 2633, "udp"}, -{"pk-electronics", {NULL}, 2634, "tcp"}, -{"pk-electronics", {NULL}, 2634, "udp"}, -{"backburner", {NULL}, 2635, "tcp"}, -{"backburner", {NULL}, 2635, "udp"}, -{"solve", {NULL}, 2636, "tcp"}, -{"solve", {NULL}, 2636, "udp"}, -{"imdocsvc", {NULL}, 2637, "tcp"}, -{"imdocsvc", {NULL}, 2637, "udp"}, -{"sybaseanywhere", {NULL}, 2638, "tcp"}, -{"sybaseanywhere", {NULL}, 2638, "udp"}, -{"aminet", {NULL}, 2639, "tcp"}, -{"aminet", {NULL}, 2639, "udp"}, -{"sai_sentlm", {NULL}, 2640, "tcp"}, -{"sai_sentlm", {NULL}, 2640, "udp"}, -{"hdl-srv", {NULL}, 2641, "tcp"}, -{"hdl-srv", {NULL}, 2641, "udp"}, -{"tragic", {NULL}, 2642, "tcp"}, -{"tragic", {NULL}, 2642, "udp"}, -{"gte-samp", {NULL}, 2643, "tcp"}, -{"gte-samp", {NULL}, 2643, "udp"}, -{"travsoft-ipx-t", {NULL}, 2644, "tcp"}, -{"travsoft-ipx-t", {NULL}, 2644, "udp"}, -{"novell-ipx-cmd", {NULL}, 2645, "tcp"}, -{"novell-ipx-cmd", {NULL}, 2645, "udp"}, -{"and-lm", {NULL}, 2646, "tcp"}, -{"and-lm", {NULL}, 2646, "udp"}, -{"syncserver", {NULL}, 2647, "tcp"}, -{"syncserver", {NULL}, 2647, "udp"}, -{"upsnotifyprot", {NULL}, 2648, "tcp"}, -{"upsnotifyprot", {NULL}, 2648, "udp"}, -{"vpsipport", {NULL}, 2649, "tcp"}, -{"vpsipport", {NULL}, 2649, "udp"}, -{"eristwoguns", {NULL}, 2650, "tcp"}, -{"eristwoguns", {NULL}, 2650, "udp"}, -{"ebinsite", {NULL}, 2651, "tcp"}, -{"ebinsite", {NULL}, 2651, "udp"}, -{"interpathpanel", {NULL}, 2652, "tcp"}, -{"interpathpanel", {NULL}, 2652, "udp"}, -{"sonus", {NULL}, 2653, "tcp"}, -{"sonus", {NULL}, 2653, "udp"}, -{"corel_vncadmin", {NULL}, 2654, "tcp"}, -{"corel_vncadmin", {NULL}, 2654, "udp"}, -{"unglue", {NULL}, 2655, "tcp"}, -{"unglue", {NULL}, 2655, "udp"}, -{"kana", {NULL}, 2656, "tcp"}, -{"kana", {NULL}, 2656, "udp"}, -{"sns-dispatcher", {NULL}, 2657, "tcp"}, -{"sns-dispatcher", {NULL}, 2657, "udp"}, -{"sns-admin", {NULL}, 2658, "tcp"}, -{"sns-admin", {NULL}, 2658, "udp"}, -{"sns-query", {NULL}, 2659, "tcp"}, -{"sns-query", {NULL}, 2659, "udp"}, -{"gcmonitor", {NULL}, 2660, "tcp"}, -{"gcmonitor", {NULL}, 2660, "udp"}, -{"olhost", {NULL}, 2661, "tcp"}, -{"olhost", {NULL}, 2661, "udp"}, -{"bintec-capi", {NULL}, 2662, "tcp"}, -{"bintec-capi", {NULL}, 2662, "udp"}, -{"bintec-tapi", {NULL}, 2663, "tcp"}, -{"bintec-tapi", {NULL}, 2663, "udp"}, -{"patrol-mq-gm", {NULL}, 2664, "tcp"}, -{"patrol-mq-gm", {NULL}, 2664, "udp"}, -{"patrol-mq-nm", {NULL}, 2665, "tcp"}, -{"patrol-mq-nm", {NULL}, 2665, "udp"}, -{"extensis", {NULL}, 2666, "tcp"}, -{"extensis", {NULL}, 2666, "udp"}, -{"alarm-clock-s", {NULL}, 2667, "tcp"}, -{"alarm-clock-s", {NULL}, 2667, "udp"}, -{"alarm-clock-c", {NULL}, 2668, "tcp"}, -{"alarm-clock-c", {NULL}, 2668, "udp"}, -{"toad", {NULL}, 2669, "tcp"}, -{"toad", {NULL}, 2669, "udp"}, -{"tve-announce", {NULL}, 2670, "tcp"}, -{"tve-announce", {NULL}, 2670, "udp"}, -{"newlixreg", {NULL}, 2671, "tcp"}, -{"newlixreg", {NULL}, 2671, "udp"}, -{"nhserver", {NULL}, 2672, "tcp"}, -{"nhserver", {NULL}, 2672, "udp"}, -{"firstcall42", {NULL}, 2673, "tcp"}, -{"firstcall42", {NULL}, 2673, "udp"}, -{"ewnn", {NULL}, 2674, "tcp"}, -{"ewnn", {NULL}, 2674, "udp"}, -{"ttc-etap", {NULL}, 2675, "tcp"}, -{"ttc-etap", {NULL}, 2675, "udp"}, -{"simslink", {NULL}, 2676, "tcp"}, -{"simslink", {NULL}, 2676, "udp"}, -{"gadgetgate1way", {NULL}, 2677, "tcp"}, -{"gadgetgate1way", {NULL}, 2677, "udp"}, -{"gadgetgate2way", {NULL}, 2678, "tcp"}, -{"gadgetgate2way", {NULL}, 2678, "udp"}, -{"syncserverssl", {NULL}, 2679, "tcp"}, -{"syncserverssl", {NULL}, 2679, "udp"}, -{"pxc-sapxom", {NULL}, 2680, "tcp"}, -{"pxc-sapxom", {NULL}, 2680, "udp"}, -{"mpnjsomb", {NULL}, 2681, "tcp"}, -{"mpnjsomb", {NULL}, 2681, "udp"}, -{"ncdloadbalance", {NULL}, 2683, "tcp"}, -{"ncdloadbalance", {NULL}, 2683, "udp"}, -{"mpnjsosv", {NULL}, 2684, "tcp"}, -{"mpnjsosv", {NULL}, 2684, "udp"}, -{"mpnjsocl", {NULL}, 2685, "tcp"}, -{"mpnjsocl", {NULL}, 2685, "udp"}, -{"mpnjsomg", {NULL}, 2686, "tcp"}, -{"mpnjsomg", {NULL}, 2686, "udp"}, -{"pq-lic-mgmt", {NULL}, 2687, "tcp"}, -{"pq-lic-mgmt", {NULL}, 2687, "udp"}, -{"md-cg-http", {NULL}, 2688, "tcp"}, -{"md-cg-http", {NULL}, 2688, "udp"}, -{"fastlynx", {NULL}, 2689, "tcp"}, -{"fastlynx", {NULL}, 2689, "udp"}, -{"hp-nnm-data", {NULL}, 2690, "tcp"}, -{"hp-nnm-data", {NULL}, 2690, "udp"}, -{"itinternet", {NULL}, 2691, "tcp"}, -{"itinternet", {NULL}, 2691, "udp"}, -{"admins-lms", {NULL}, 2692, "tcp"}, -{"admins-lms", {NULL}, 2692, "udp"}, -{"pwrsevent", {NULL}, 2694, "tcp"}, -{"pwrsevent", {NULL}, 2694, "udp"}, -{"vspread", {NULL}, 2695, "tcp"}, -{"vspread", {NULL}, 2695, "udp"}, -{"unifyadmin", {NULL}, 2696, "tcp"}, -{"unifyadmin", {NULL}, 2696, "udp"}, -{"oce-snmp-trap", {NULL}, 2697, "tcp"}, -{"oce-snmp-trap", {NULL}, 2697, "udp"}, -{"mck-ivpip", {NULL}, 2698, "tcp"}, -{"mck-ivpip", {NULL}, 2698, "udp"}, -{"csoft-plusclnt", {NULL}, 2699, "tcp"}, -{"csoft-plusclnt", {NULL}, 2699, "udp"}, -{"tqdata", {NULL}, 2700, "tcp"}, -{"tqdata", {NULL}, 2700, "udp"}, -{"sms-rcinfo", {NULL}, 2701, "tcp"}, -{"sms-rcinfo", {NULL}, 2701, "udp"}, -{"sms-xfer", {NULL}, 2702, "tcp"}, -{"sms-xfer", {NULL}, 2702, "udp"}, -{"sms-chat", {NULL}, 2703, "tcp"}, -{"sms-chat", {NULL}, 2703, "udp"}, -{"sms-remctrl", {NULL}, 2704, "tcp"}, -{"sms-remctrl", {NULL}, 2704, "udp"}, -{"sds-admin", {NULL}, 2705, "tcp"}, -{"sds-admin", {NULL}, 2705, "udp"}, -{"ncdmirroring", {NULL}, 2706, "tcp"}, -{"ncdmirroring", {NULL}, 2706, "udp"}, -{"emcsymapiport", {NULL}, 2707, "tcp"}, -{"emcsymapiport", {NULL}, 2707, "udp"}, -{"banyan-net", {NULL}, 2708, "tcp"}, -{"banyan-net", {NULL}, 2708, "udp"}, -{"supermon", {NULL}, 2709, "tcp"}, -{"supermon", {NULL}, 2709, "udp"}, -{"sso-service", {NULL}, 2710, "tcp"}, -{"sso-service", {NULL}, 2710, "udp"}, -{"sso-control", {NULL}, 2711, "tcp"}, -{"sso-control", {NULL}, 2711, "udp"}, -{"aocp", {NULL}, 2712, "tcp"}, -{"aocp", {NULL}, 2712, "udp"}, -{"raventbs", {NULL}, 2713, "tcp"}, -{"raventbs", {NULL}, 2713, "udp"}, -{"raventdm", {NULL}, 2714, "tcp"}, -{"raventdm", {NULL}, 2714, "udp"}, -{"hpstgmgr2", {NULL}, 2715, "tcp"}, -{"hpstgmgr2", {NULL}, 2715, "udp"}, -{"inova-ip-disco", {NULL}, 2716, "tcp"}, -{"inova-ip-disco", {NULL}, 2716, "udp"}, -{"pn-requester", {NULL}, 2717, "tcp"}, -{"pn-requester", {NULL}, 2717, "udp"}, -{"pn-requester2", {NULL}, 2718, "tcp"}, -{"pn-requester2", {NULL}, 2718, "udp"}, -{"scan-change", {NULL}, 2719, "tcp"}, -{"scan-change", {NULL}, 2719, "udp"}, -{"wkars", {NULL}, 2720, "tcp"}, -{"wkars", {NULL}, 2720, "udp"}, -{"smart-diagnose", {NULL}, 2721, "tcp"}, -{"smart-diagnose", {NULL}, 2721, "udp"}, -{"proactivesrvr", {NULL}, 2722, "tcp"}, -{"proactivesrvr", {NULL}, 2722, "udp"}, -{"watchdog-nt", {NULL}, 2723, "tcp"}, -{"watchdog-nt", {NULL}, 2723, "udp"}, -{"qotps", {NULL}, 2724, "tcp"}, -{"qotps", {NULL}, 2724, "udp"}, -{"msolap-ptp2", {NULL}, 2725, "tcp"}, -{"msolap-ptp2", {NULL}, 2725, "udp"}, -{"tams", {NULL}, 2726, "tcp"}, -{"tams", {NULL}, 2726, "udp"}, -{"mgcp-callagent", {NULL}, 2727, "tcp"}, -{"mgcp-callagent", {NULL}, 2727, "udp"}, -{"sqdr", {NULL}, 2728, "tcp"}, -{"sqdr", {NULL}, 2728, "udp"}, -{"tcim-control", {NULL}, 2729, "tcp"}, -{"tcim-control", {NULL}, 2729, "udp"}, -{"nec-raidplus", {NULL}, 2730, "tcp"}, -{"nec-raidplus", {NULL}, 2730, "udp"}, -{"fyre-messanger", {NULL}, 2731, "tcp"}, -{"fyre-messanger", {NULL}, 2731, "udp"}, -{"g5m", {NULL}, 2732, "tcp"}, -{"g5m", {NULL}, 2732, "udp"}, -{"signet-ctf", {NULL}, 2733, "tcp"}, -{"signet-ctf", {NULL}, 2733, "udp"}, -{"ccs-software", {NULL}, 2734, "tcp"}, -{"ccs-software", {NULL}, 2734, "udp"}, -{"netiq-mc", {NULL}, 2735, "tcp"}, -{"netiq-mc", {NULL}, 2735, "udp"}, -{"radwiz-nms-srv", {NULL}, 2736, "tcp"}, -{"radwiz-nms-srv", {NULL}, 2736, "udp"}, -{"srp-feedback", {NULL}, 2737, "tcp"}, -{"srp-feedback", {NULL}, 2737, "udp"}, -{"ndl-tcp-ois-gw", {NULL}, 2738, "tcp"}, -{"ndl-tcp-ois-gw", {NULL}, 2738, "udp"}, -{"tn-timing", {NULL}, 2739, "tcp"}, -{"tn-timing", {NULL}, 2739, "udp"}, -{"alarm", {NULL}, 2740, "tcp"}, -{"alarm", {NULL}, 2740, "udp"}, -{"tsb", {NULL}, 2741, "tcp"}, -{"tsb", {NULL}, 2741, "udp"}, -{"tsb2", {NULL}, 2742, "tcp"}, -{"tsb2", {NULL}, 2742, "udp"}, -{"murx", {NULL}, 2743, "tcp"}, -{"murx", {NULL}, 2743, "udp"}, -{"honyaku", {NULL}, 2744, "tcp"}, -{"honyaku", {NULL}, 2744, "udp"}, -{"urbisnet", {NULL}, 2745, "tcp"}, -{"urbisnet", {NULL}, 2745, "udp"}, -{"cpudpencap", {NULL}, 2746, "tcp"}, -{"cpudpencap", {NULL}, 2746, "udp"}, -{"fjippol-swrly", {NULL}, 2747, "tcp"}, -{"fjippol-swrly", {NULL}, 2747, "udp"}, -{"fjippol-polsvr", {NULL}, 2748, "tcp"}, -{"fjippol-polsvr", {NULL}, 2748, "udp"}, -{"fjippol-cnsl", {NULL}, 2749, "tcp"}, -{"fjippol-cnsl", {NULL}, 2749, "udp"}, -{"fjippol-port1", {NULL}, 2750, "tcp"}, -{"fjippol-port1", {NULL}, 2750, "udp"}, -{"fjippol-port2", {NULL}, 2751, "tcp"}, -{"fjippol-port2", {NULL}, 2751, "udp"}, -{"rsisysaccess", {NULL}, 2752, "tcp"}, -{"rsisysaccess", {NULL}, 2752, "udp"}, -{"de-spot", {NULL}, 2753, "tcp"}, -{"de-spot", {NULL}, 2753, "udp"}, -{"apollo-cc", {NULL}, 2754, "tcp"}, -{"apollo-cc", {NULL}, 2754, "udp"}, -{"expresspay", {NULL}, 2755, "tcp"}, -{"expresspay", {NULL}, 2755, "udp"}, -{"simplement-tie", {NULL}, 2756, "tcp"}, -{"simplement-tie", {NULL}, 2756, "udp"}, -{"cnrp", {NULL}, 2757, "tcp"}, -{"cnrp", {NULL}, 2757, "udp"}, -{"apollo-status", {NULL}, 2758, "tcp"}, -{"apollo-status", {NULL}, 2758, "udp"}, -{"apollo-gms", {NULL}, 2759, "tcp"}, -{"apollo-gms", {NULL}, 2759, "udp"}, -{"sabams", {NULL}, 2760, "tcp"}, -{"sabams", {NULL}, 2760, "udp"}, -{"dicom-iscl", {NULL}, 2761, "tcp"}, -{"dicom-iscl", {NULL}, 2761, "udp"}, -{"dicom-tls", {NULL}, 2762, "tcp"}, -{"dicom-tls", {NULL}, 2762, "udp"}, -{"desktop-dna", {NULL}, 2763, "tcp"}, -{"desktop-dna", {NULL}, 2763, "udp"}, -{"data-insurance", {NULL}, 2764, "tcp"}, -{"data-insurance", {NULL}, 2764, "udp"}, -{"qip-audup", {NULL}, 2765, "tcp"}, -{"qip-audup", {NULL}, 2765, "udp"}, -{"compaq-scp", {NULL}, 2766, "tcp"}, -{"compaq-scp", {NULL}, 2766, "udp"}, -{"uadtc", {NULL}, 2767, "tcp"}, -{"uadtc", {NULL}, 2767, "udp"}, -{"uacs", {NULL}, 2768, "tcp"}, -{"uacs", {NULL}, 2768, "udp"}, -{"exce", {NULL}, 2769, "tcp"}, -{"exce", {NULL}, 2769, "udp"}, -{"veronica", {NULL}, 2770, "tcp"}, -{"veronica", {NULL}, 2770, "udp"}, -{"vergencecm", {NULL}, 2771, "tcp"}, -{"vergencecm", {NULL}, 2771, "udp"}, -{"auris", {NULL}, 2772, "tcp"}, -{"auris", {NULL}, 2772, "udp"}, -{"rbakcup1", {NULL}, 2773, "tcp"}, -{"rbakcup1", {NULL}, 2773, "udp"}, -{"rbakcup2", {NULL}, 2774, "tcp"}, -{"rbakcup2", {NULL}, 2774, "udp"}, -{"smpp", {NULL}, 2775, "tcp"}, -{"smpp", {NULL}, 2775, "udp"}, -{"ridgeway1", {NULL}, 2776, "tcp"}, -{"ridgeway1", {NULL}, 2776, "udp"}, -{"ridgeway2", {NULL}, 2777, "tcp"}, -{"ridgeway2", {NULL}, 2777, "udp"}, -{"gwen-sonya", {NULL}, 2778, "tcp"}, -{"gwen-sonya", {NULL}, 2778, "udp"}, -{"lbc-sync", {NULL}, 2779, "tcp"}, -{"lbc-sync", {NULL}, 2779, "udp"}, -{"lbc-control", {NULL}, 2780, "tcp"}, -{"lbc-control", {NULL}, 2780, "udp"}, -{"whosells", {NULL}, 2781, "tcp"}, -{"whosells", {NULL}, 2781, "udp"}, -{"everydayrc", {NULL}, 2782, "tcp"}, -{"everydayrc", {NULL}, 2782, "udp"}, -{"aises", {NULL}, 2783, "tcp"}, -{"aises", {NULL}, 2783, "udp"}, -{"www-dev", {NULL}, 2784, "tcp"}, -{"www-dev", {NULL}, 2784, "udp"}, -{"aic-np", {NULL}, 2785, "tcp"}, -{"aic-np", {NULL}, 2785, "udp"}, -{"aic-oncrpc", {NULL}, 2786, "tcp"}, -{"aic-oncrpc", {NULL}, 2786, "udp"}, -{"piccolo", {NULL}, 2787, "tcp"}, -{"piccolo", {NULL}, 2787, "udp"}, -{"fryeserv", {NULL}, 2788, "tcp"}, -{"fryeserv", {NULL}, 2788, "udp"}, -{"media-agent", {NULL}, 2789, "tcp"}, -{"media-agent", {NULL}, 2789, "udp"}, -{"plgproxy", {NULL}, 2790, "tcp"}, -{"plgproxy", {NULL}, 2790, "udp"}, -{"mtport-regist", {NULL}, 2791, "tcp"}, -{"mtport-regist", {NULL}, 2791, "udp"}, -{"f5-globalsite", {NULL}, 2792, "tcp"}, -{"f5-globalsite", {NULL}, 2792, "udp"}, -{"initlsmsad", {NULL}, 2793, "tcp"}, -{"initlsmsad", {NULL}, 2793, "udp"}, -{"livestats", {NULL}, 2795, "tcp"}, -{"livestats", {NULL}, 2795, "udp"}, -{"ac-tech", {NULL}, 2796, "tcp"}, -{"ac-tech", {NULL}, 2796, "udp"}, -{"esp-encap", {NULL}, 2797, "tcp"}, -{"esp-encap", {NULL}, 2797, "udp"}, -{"tmesis-upshot", {NULL}, 2798, "tcp"}, -{"tmesis-upshot", {NULL}, 2798, "udp"}, -{"icon-discover", {NULL}, 2799, "tcp"}, -{"icon-discover", {NULL}, 2799, "udp"}, -{"acc-raid", {NULL}, 2800, "tcp"}, -{"acc-raid", {NULL}, 2800, "udp"}, -{"igcp", {NULL}, 2801, "tcp"}, -{"igcp", {NULL}, 2801, "udp"}, -{"veritas-tcp1", {NULL}, 2802, "tcp"}, -{"veritas-udp1", {NULL}, 2802, "udp"}, -{"btprjctrl", {NULL}, 2803, "tcp"}, -{"btprjctrl", {NULL}, 2803, "udp"}, -{"dvr-esm", {NULL}, 2804, "tcp"}, -{"dvr-esm", {NULL}, 2804, "udp"}, -{"wta-wsp-s", {NULL}, 2805, "tcp"}, -{"wta-wsp-s", {NULL}, 2805, "udp"}, -{"cspuni", {NULL}, 2806, "tcp"}, -{"cspuni", {NULL}, 2806, "udp"}, -{"cspmulti", {NULL}, 2807, "tcp"}, -{"cspmulti", {NULL}, 2807, "udp"}, -{"j-lan-p", {NULL}, 2808, "tcp"}, -{"j-lan-p", {NULL}, 2808, "udp"}, -{"corbaloc", {NULL}, 2809, "tcp"}, -{"corbaloc", {NULL}, 2809, "udp"}, -{"netsteward", {NULL}, 2810, "tcp"}, -{"netsteward", {NULL}, 2810, "udp"}, -{"gsiftp", {NULL}, 2811, "tcp"}, -{"gsiftp", {NULL}, 2811, "udp"}, -{"atmtcp", {NULL}, 2812, "tcp"}, -{"atmtcp", {NULL}, 2812, "udp"}, -{"llm-pass", {NULL}, 2813, "tcp"}, -{"llm-pass", {NULL}, 2813, "udp"}, -{"llm-csv", {NULL}, 2814, "tcp"}, -{"llm-csv", {NULL}, 2814, "udp"}, -{"lbc-measure", {NULL}, 2815, "tcp"}, -{"lbc-measure", {NULL}, 2815, "udp"}, -{"lbc-watchdog", {NULL}, 2816, "tcp"}, -{"lbc-watchdog", {NULL}, 2816, "udp"}, -{"nmsigport", {NULL}, 2817, "tcp"}, -{"nmsigport", {NULL}, 2817, "udp"}, -{"rmlnk", {NULL}, 2818, "tcp"}, -{"rmlnk", {NULL}, 2818, "udp"}, -{"fc-faultnotify", {NULL}, 2819, "tcp"}, -{"fc-faultnotify", {NULL}, 2819, "udp"}, -{"univision", {NULL}, 2820, "tcp"}, -{"univision", {NULL}, 2820, "udp"}, -{"vrts-at-port", {NULL}, 2821, "tcp"}, -{"vrts-at-port", {NULL}, 2821, "udp"}, -{"ka0wuc", {NULL}, 2822, "tcp"}, -{"ka0wuc", {NULL}, 2822, "udp"}, -{"cqg-netlan", {NULL}, 2823, "tcp"}, -{"cqg-netlan", {NULL}, 2823, "udp"}, -{"cqg-netlan-1", {NULL}, 2824, "tcp"}, -{"cqg-netlan-1", {NULL}, 2824, "udp"}, -{"slc-systemlog", {NULL}, 2826, "tcp"}, -{"slc-systemlog", {NULL}, 2826, "udp"}, -{"slc-ctrlrloops", {NULL}, 2827, "tcp"}, -{"slc-ctrlrloops", {NULL}, 2827, "udp"}, -{"itm-lm", {NULL}, 2828, "tcp"}, -{"itm-lm", {NULL}, 2828, "udp"}, -{"silkp1", {NULL}, 2829, "tcp"}, -{"silkp1", {NULL}, 2829, "udp"}, -{"silkp2", {NULL}, 2830, "tcp"}, -{"silkp2", {NULL}, 2830, "udp"}, -{"silkp3", {NULL}, 2831, "tcp"}, -{"silkp3", {NULL}, 2831, "udp"}, -{"silkp4", {NULL}, 2832, "tcp"}, -{"silkp4", {NULL}, 2832, "udp"}, -{"glishd", {NULL}, 2833, "tcp"}, -{"glishd", {NULL}, 2833, "udp"}, -{"evtp", {NULL}, 2834, "tcp"}, -{"evtp", {NULL}, 2834, "udp"}, -{"evtp-data", {NULL}, 2835, "tcp"}, -{"evtp-data", {NULL}, 2835, "udp"}, -{"catalyst", {NULL}, 2836, "tcp"}, -{"catalyst", {NULL}, 2836, "udp"}, -{"repliweb", {NULL}, 2837, "tcp"}, -{"repliweb", {NULL}, 2837, "udp"}, -{"starbot", {NULL}, 2838, "tcp"}, -{"starbot", {NULL}, 2838, "udp"}, -{"nmsigport", {NULL}, 2839, "tcp"}, -{"nmsigport", {NULL}, 2839, "udp"}, -{"l3-exprt", {NULL}, 2840, "tcp"}, -{"l3-exprt", {NULL}, 2840, "udp"}, -{"l3-ranger", {NULL}, 2841, "tcp"}, -{"l3-ranger", {NULL}, 2841, "udp"}, -{"l3-hawk", {NULL}, 2842, "tcp"}, -{"l3-hawk", {NULL}, 2842, "udp"}, -{"pdnet", {NULL}, 2843, "tcp"}, -{"pdnet", {NULL}, 2843, "udp"}, -{"bpcp-poll", {NULL}, 2844, "tcp"}, -{"bpcp-poll", {NULL}, 2844, "udp"}, -{"bpcp-trap", {NULL}, 2845, "tcp"}, -{"bpcp-trap", {NULL}, 2845, "udp"}, -{"aimpp-hello", {NULL}, 2846, "tcp"}, -{"aimpp-hello", {NULL}, 2846, "udp"}, -{"aimpp-port-req", {NULL}, 2847, "tcp"}, -{"aimpp-port-req", {NULL}, 2847, "udp"}, -{"amt-blc-port", {NULL}, 2848, "tcp"}, -{"amt-blc-port", {NULL}, 2848, "udp"}, -{"fxp", {NULL}, 2849, "tcp"}, -{"fxp", {NULL}, 2849, "udp"}, -{"metaconsole", {NULL}, 2850, "tcp"}, -{"metaconsole", {NULL}, 2850, "udp"}, -{"webemshttp", {NULL}, 2851, "tcp"}, -{"webemshttp", {NULL}, 2851, "udp"}, -{"bears-01", {NULL}, 2852, "tcp"}, -{"bears-01", {NULL}, 2852, "udp"}, -{"ispipes", {NULL}, 2853, "tcp"}, -{"ispipes", {NULL}, 2853, "udp"}, -{"infomover", {NULL}, 2854, "tcp"}, -{"infomover", {NULL}, 2854, "udp"}, -{"msrp", {NULL}, 2855, "tcp"}, -{"msrp", {NULL}, 2855, "udp"}, -{"cesdinv", {NULL}, 2856, "tcp"}, -{"cesdinv", {NULL}, 2856, "udp"}, -{"simctlp", {NULL}, 2857, "tcp"}, -{"simctlp", {NULL}, 2857, "udp"}, -{"ecnp", {NULL}, 2858, "tcp"}, -{"ecnp", {NULL}, 2858, "udp"}, -{"activememory", {NULL}, 2859, "tcp"}, -{"activememory", {NULL}, 2859, "udp"}, -{"dialpad-voice1", {NULL}, 2860, "tcp"}, -{"dialpad-voice1", {NULL}, 2860, "udp"}, -{"dialpad-voice2", {NULL}, 2861, "tcp"}, -{"dialpad-voice2", {NULL}, 2861, "udp"}, -{"ttg-protocol", {NULL}, 2862, "tcp"}, -{"ttg-protocol", {NULL}, 2862, "udp"}, -{"sonardata", {NULL}, 2863, "tcp"}, -{"sonardata", {NULL}, 2863, "udp"}, -{"astromed-main", {NULL}, 2864, "tcp"}, -{"astromed-main", {NULL}, 2864, "udp"}, -{"pit-vpn", {NULL}, 2865, "tcp"}, -{"pit-vpn", {NULL}, 2865, "udp"}, -{"iwlistener", {NULL}, 2866, "tcp"}, -{"iwlistener", {NULL}, 2866, "udp"}, -{"esps-portal", {NULL}, 2867, "tcp"}, -{"esps-portal", {NULL}, 2867, "udp"}, -{"npep-messaging", {NULL}, 2868, "tcp"}, -{"npep-messaging", {NULL}, 2868, "udp"}, -{"icslap", {NULL}, 2869, "tcp"}, -{"icslap", {NULL}, 2869, "udp"}, -{"daishi", {NULL}, 2870, "tcp"}, -{"daishi", {NULL}, 2870, "udp"}, -{"msi-selectplay", {NULL}, 2871, "tcp"}, -{"msi-selectplay", {NULL}, 2871, "udp"}, -{"radix", {NULL}, 2872, "tcp"}, -{"radix", {NULL}, 2872, "udp"}, -{"dxmessagebase1", {NULL}, 2874, "tcp"}, -{"dxmessagebase1", {NULL}, 2874, "udp"}, -{"dxmessagebase2", {NULL}, 2875, "tcp"}, -{"dxmessagebase2", {NULL}, 2875, "udp"}, -{"sps-tunnel", {NULL}, 2876, "tcp"}, -{"sps-tunnel", {NULL}, 2876, "udp"}, -{"bluelance", {NULL}, 2877, "tcp"}, -{"bluelance", {NULL}, 2877, "udp"}, -{"aap", {NULL}, 2878, "tcp"}, -{"aap", {NULL}, 2878, "udp"}, -{"ucentric-ds", {NULL}, 2879, "tcp"}, -{"ucentric-ds", {NULL}, 2879, "udp"}, -{"synapse", {NULL}, 2880, "tcp"}, -{"synapse", {NULL}, 2880, "udp"}, -{"ndsp", {NULL}, 2881, "tcp"}, -{"ndsp", {NULL}, 2881, "udp"}, -{"ndtp", {NULL}, 2882, "tcp"}, -{"ndtp", {NULL}, 2882, "udp"}, -{"ndnp", {NULL}, 2883, "tcp"}, -{"ndnp", {NULL}, 2883, "udp"}, -{"flashmsg", {NULL}, 2884, "tcp"}, -{"flashmsg", {NULL}, 2884, "udp"}, -{"topflow", {NULL}, 2885, "tcp"}, -{"topflow", {NULL}, 2885, "udp"}, -{"responselogic", {NULL}, 2886, "tcp"}, -{"responselogic", {NULL}, 2886, "udp"}, -{"aironetddp", {NULL}, 2887, "tcp"}, -{"aironetddp", {NULL}, 2887, "udp"}, -{"spcsdlobby", {NULL}, 2888, "tcp"}, -{"spcsdlobby", {NULL}, 2888, "udp"}, -{"rsom", {NULL}, 2889, "tcp"}, -{"rsom", {NULL}, 2889, "udp"}, -{"cspclmulti", {NULL}, 2890, "tcp"}, -{"cspclmulti", {NULL}, 2890, "udp"}, -{"cinegrfx-elmd", {NULL}, 2891, "tcp"}, -{"cinegrfx-elmd", {NULL}, 2891, "udp"}, -{"snifferdata", {NULL}, 2892, "tcp"}, -{"snifferdata", {NULL}, 2892, "udp"}, -{"vseconnector", {NULL}, 2893, "tcp"}, -{"vseconnector", {NULL}, 2893, "udp"}, -{"abacus-remote", {NULL}, 2894, "tcp"}, -{"abacus-remote", {NULL}, 2894, "udp"}, -{"natuslink", {NULL}, 2895, "tcp"}, -{"natuslink", {NULL}, 2895, "udp"}, -{"ecovisiong6-1", {NULL}, 2896, "tcp"}, -{"ecovisiong6-1", {NULL}, 2896, "udp"}, -{"citrix-rtmp", {NULL}, 2897, "tcp"}, -{"citrix-rtmp", {NULL}, 2897, "udp"}, -{"appliance-cfg", {NULL}, 2898, "tcp"}, -{"appliance-cfg", {NULL}, 2898, "udp"}, -{"powergemplus", {NULL}, 2899, "tcp"}, -{"powergemplus", {NULL}, 2899, "udp"}, -{"quicksuite", {NULL}, 2900, "tcp"}, -{"quicksuite", {NULL}, 2900, "udp"}, -{"allstorcns", {NULL}, 2901, "tcp"}, -{"allstorcns", {NULL}, 2901, "udp"}, -{"netaspi", {NULL}, 2902, "tcp"}, -{"netaspi", {NULL}, 2902, "udp"}, -{"suitcase", {NULL}, 2903, "tcp"}, -{"suitcase", {NULL}, 2903, "udp"}, -{"m2ua", {NULL}, 2904, "tcp"}, -{"m2ua", {NULL}, 2904, "udp"}, -{"m2ua", {NULL}, 2904, "sctp"}, -{"m3ua", {NULL}, 2905, "tcp"}, -{"m3ua", {NULL}, 2905, "sctp"}, -{"caller9", {NULL}, 2906, "tcp"}, -{"caller9", {NULL}, 2906, "udp"}, -{"webmethods-b2b", {NULL}, 2907, "tcp"}, -{"webmethods-b2b", {NULL}, 2907, "udp"}, -{"mao", {NULL}, 2908, "tcp"}, -{"mao", {NULL}, 2908, "udp"}, -{"funk-dialout", {NULL}, 2909, "tcp"}, -{"funk-dialout", {NULL}, 2909, "udp"}, -{"tdaccess", {NULL}, 2910, "tcp"}, -{"tdaccess", {NULL}, 2910, "udp"}, -{"blockade", {NULL}, 2911, "tcp"}, -{"blockade", {NULL}, 2911, "udp"}, -{"epicon", {NULL}, 2912, "tcp"}, -{"epicon", {NULL}, 2912, "udp"}, -{"boosterware", {NULL}, 2913, "tcp"}, -{"boosterware", {NULL}, 2913, "udp"}, -{"gamelobby", {NULL}, 2914, "tcp"}, -{"gamelobby", {NULL}, 2914, "udp"}, -{"tksocket", {NULL}, 2915, "tcp"}, -{"tksocket", {NULL}, 2915, "udp"}, -{"elvin_server", {NULL}, 2916, "tcp"}, -{"elvin_server", {NULL}, 2916, "udp"}, -{"elvin_client", {NULL}, 2917, "tcp"}, -{"elvin_client", {NULL}, 2917, "udp"}, -{"kastenchasepad", {NULL}, 2918, "tcp"}, -{"kastenchasepad", {NULL}, 2918, "udp"}, -{"roboer", {NULL}, 2919, "tcp"}, -{"roboer", {NULL}, 2919, "udp"}, -{"roboeda", {NULL}, 2920, "tcp"}, -{"roboeda", {NULL}, 2920, "udp"}, -{"cesdcdman", {NULL}, 2921, "tcp"}, -{"cesdcdman", {NULL}, 2921, "udp"}, -{"cesdcdtrn", {NULL}, 2922, "tcp"}, -{"cesdcdtrn", {NULL}, 2922, "udp"}, -{"wta-wsp-wtp-s", {NULL}, 2923, "tcp"}, -{"wta-wsp-wtp-s", {NULL}, 2923, "udp"}, -{"precise-vip", {NULL}, 2924, "tcp"}, -{"precise-vip", {NULL}, 2924, "udp"}, -{"mobile-file-dl", {NULL}, 2926, "tcp"}, -{"mobile-file-dl", {NULL}, 2926, "udp"}, -{"unimobilectrl", {NULL}, 2927, "tcp"}, -{"unimobilectrl", {NULL}, 2927, "udp"}, -{"redstone-cpss", {NULL}, 2928, "tcp"}, -{"redstone-cpss", {NULL}, 2928, "udp"}, -{"amx-webadmin", {NULL}, 2929, "tcp"}, -{"amx-webadmin", {NULL}, 2929, "udp"}, -{"amx-weblinx", {NULL}, 2930, "tcp"}, -{"amx-weblinx", {NULL}, 2930, "udp"}, -{"circle-x", {NULL}, 2931, "tcp"}, -{"circle-x", {NULL}, 2931, "udp"}, -{"incp", {NULL}, 2932, "tcp"}, -{"incp", {NULL}, 2932, "udp"}, -{"4-tieropmgw", {NULL}, 2933, "tcp"}, -{"4-tieropmgw", {NULL}, 2933, "udp"}, -{"4-tieropmcli", {NULL}, 2934, "tcp"}, -{"4-tieropmcli", {NULL}, 2934, "udp"}, -{"qtp", {NULL}, 2935, "tcp"}, -{"qtp", {NULL}, 2935, "udp"}, -{"otpatch", {NULL}, 2936, "tcp"}, -{"otpatch", {NULL}, 2936, "udp"}, -{"pnaconsult-lm", {NULL}, 2937, "tcp"}, -{"pnaconsult-lm", {NULL}, 2937, "udp"}, -{"sm-pas-1", {NULL}, 2938, "tcp"}, -{"sm-pas-1", {NULL}, 2938, "udp"}, -{"sm-pas-2", {NULL}, 2939, "tcp"}, -{"sm-pas-2", {NULL}, 2939, "udp"}, -{"sm-pas-3", {NULL}, 2940, "tcp"}, -{"sm-pas-3", {NULL}, 2940, "udp"}, -{"sm-pas-4", {NULL}, 2941, "tcp"}, -{"sm-pas-4", {NULL}, 2941, "udp"}, -{"sm-pas-5", {NULL}, 2942, "tcp"}, -{"sm-pas-5", {NULL}, 2942, "udp"}, -{"ttnrepository", {NULL}, 2943, "tcp"}, -{"ttnrepository", {NULL}, 2943, "udp"}, -{"megaco-h248", {NULL}, 2944, "tcp"}, -{"megaco-h248", {NULL}, 2944, "udp"}, -{"megaco-h248", {NULL}, 2944, "sctp"}, -{"h248-binary", {NULL}, 2945, "tcp"}, -{"h248-binary", {NULL}, 2945, "udp"}, -{"h248-binary", {NULL}, 2945, "sctp"}, -{"fjsvmpor", {NULL}, 2946, "tcp"}, -{"fjsvmpor", {NULL}, 2946, "udp"}, -{"gpsd", {NULL}, 2947, "tcp"}, -{"gpsd", {NULL}, 2947, "udp"}, -{"wap-push", {NULL}, 2948, "tcp"}, -{"wap-push", {NULL}, 2948, "udp"}, -{"wap-pushsecure", {NULL}, 2949, "tcp"}, -{"wap-pushsecure", {NULL}, 2949, "udp"}, -{"esip", {NULL}, 2950, "tcp"}, -{"esip", {NULL}, 2950, "udp"}, -{"ottp", {NULL}, 2951, "tcp"}, -{"ottp", {NULL}, 2951, "udp"}, -{"mpfwsas", {NULL}, 2952, "tcp"}, -{"mpfwsas", {NULL}, 2952, "udp"}, -{"ovalarmsrv", {NULL}, 2953, "tcp"}, -{"ovalarmsrv", {NULL}, 2953, "udp"}, -{"ovalarmsrv-cmd", {NULL}, 2954, "tcp"}, -{"ovalarmsrv-cmd", {NULL}, 2954, "udp"}, -{"csnotify", {NULL}, 2955, "tcp"}, -{"csnotify", {NULL}, 2955, "udp"}, -{"ovrimosdbman", {NULL}, 2956, "tcp"}, -{"ovrimosdbman", {NULL}, 2956, "udp"}, -{"jmact5", {NULL}, 2957, "tcp"}, -{"jmact5", {NULL}, 2957, "udp"}, -{"jmact6", {NULL}, 2958, "tcp"}, -{"jmact6", {NULL}, 2958, "udp"}, -{"rmopagt", {NULL}, 2959, "tcp"}, -{"rmopagt", {NULL}, 2959, "udp"}, -{"dfoxserver", {NULL}, 2960, "tcp"}, -{"dfoxserver", {NULL}, 2960, "udp"}, -{"boldsoft-lm", {NULL}, 2961, "tcp"}, -{"boldsoft-lm", {NULL}, 2961, "udp"}, -{"iph-policy-cli", {NULL}, 2962, "tcp"}, -{"iph-policy-cli", {NULL}, 2962, "udp"}, -{"iph-policy-adm", {NULL}, 2963, "tcp"}, -{"iph-policy-adm", {NULL}, 2963, "udp"}, -{"bullant-srap", {NULL}, 2964, "tcp"}, -{"bullant-srap", {NULL}, 2964, "udp"}, -{"bullant-rap", {NULL}, 2965, "tcp"}, -{"bullant-rap", {NULL}, 2965, "udp"}, -{"idp-infotrieve", {NULL}, 2966, "tcp"}, -{"idp-infotrieve", {NULL}, 2966, "udp"}, -{"ssc-agent", {NULL}, 2967, "tcp"}, -{"ssc-agent", {NULL}, 2967, "udp"}, -{"enpp", {NULL}, 2968, "tcp"}, -{"enpp", {NULL}, 2968, "udp"}, -{"essp", {NULL}, 2969, "tcp"}, -{"essp", {NULL}, 2969, "udp"}, -{"index-net", {NULL}, 2970, "tcp"}, -{"index-net", {NULL}, 2970, "udp"}, -{"netclip", {NULL}, 2971, "tcp"}, -{"netclip", {NULL}, 2971, "udp"}, -{"pmsm-webrctl", {NULL}, 2972, "tcp"}, -{"pmsm-webrctl", {NULL}, 2972, "udp"}, -{"svnetworks", {NULL}, 2973, "tcp"}, -{"svnetworks", {NULL}, 2973, "udp"}, -{"signal", {NULL}, 2974, "tcp"}, -{"signal", {NULL}, 2974, "udp"}, -{"fjmpcm", {NULL}, 2975, "tcp"}, -{"fjmpcm", {NULL}, 2975, "udp"}, -{"cns-srv-port", {NULL}, 2976, "tcp"}, -{"cns-srv-port", {NULL}, 2976, "udp"}, -{"ttc-etap-ns", {NULL}, 2977, "tcp"}, -{"ttc-etap-ns", {NULL}, 2977, "udp"}, -{"ttc-etap-ds", {NULL}, 2978, "tcp"}, -{"ttc-etap-ds", {NULL}, 2978, "udp"}, -{"h263-video", {NULL}, 2979, "tcp"}, -{"h263-video", {NULL}, 2979, "udp"}, -{"wimd", {NULL}, 2980, "tcp"}, -{"wimd", {NULL}, 2980, "udp"}, -{"mylxamport", {NULL}, 2981, "tcp"}, -{"mylxamport", {NULL}, 2981, "udp"}, -{"iwb-whiteboard", {NULL}, 2982, "tcp"}, -{"iwb-whiteboard", {NULL}, 2982, "udp"}, -{"netplan", {NULL}, 2983, "tcp"}, -{"netplan", {NULL}, 2983, "udp"}, -{"hpidsadmin", {NULL}, 2984, "tcp"}, -{"hpidsadmin", {NULL}, 2984, "udp"}, -{"hpidsagent", {NULL}, 2985, "tcp"}, -{"hpidsagent", {NULL}, 2985, "udp"}, -{"stonefalls", {NULL}, 2986, "tcp"}, -{"stonefalls", {NULL}, 2986, "udp"}, -{"identify", {NULL}, 2987, "tcp"}, -{"identify", {NULL}, 2987, "udp"}, -{"hippad", {NULL}, 2988, "tcp"}, -{"hippad", {NULL}, 2988, "udp"}, -{"zarkov", {NULL}, 2989, "tcp"}, -{"zarkov", {NULL}, 2989, "udp"}, -{"boscap", {NULL}, 2990, "tcp"}, -{"boscap", {NULL}, 2990, "udp"}, -{"wkstn-mon", {NULL}, 2991, "tcp"}, -{"wkstn-mon", {NULL}, 2991, "udp"}, -{"avenyo", {NULL}, 2992, "tcp"}, -{"avenyo", {NULL}, 2992, "udp"}, -{"veritas-vis1", {NULL}, 2993, "tcp"}, -{"veritas-vis1", {NULL}, 2993, "udp"}, -{"veritas-vis2", {NULL}, 2994, "tcp"}, -{"veritas-vis2", {NULL}, 2994, "udp"}, -{"idrs", {NULL}, 2995, "tcp"}, -{"idrs", {NULL}, 2995, "udp"}, -{"vsixml", {NULL}, 2996, "tcp"}, -{"vsixml", {NULL}, 2996, "udp"}, -{"rebol", {NULL}, 2997, "tcp"}, -{"rebol", {NULL}, 2997, "udp"}, -{"realsecure", {NULL}, 2998, "tcp"}, -{"realsecure", {NULL}, 2998, "udp"}, -{"remoteware-un", {NULL}, 2999, "tcp"}, -{"remoteware-un", {NULL}, 2999, "udp"}, -{"hbci", {NULL}, 3000, "tcp"}, -{"hbci", {NULL}, 3000, "udp"}, -{"remoteware-cl", {NULL}, 3000, "tcp"}, -{"remoteware-cl", {NULL}, 3000, "udp"}, -{"exlm-agent", {NULL}, 3002, "tcp"}, -{"exlm-agent", {NULL}, 3002, "udp"}, -{"remoteware-srv", {NULL}, 3002, "tcp"}, -{"remoteware-srv", {NULL}, 3002, "udp"}, -{"cgms", {NULL}, 3003, "tcp"}, -{"cgms", {NULL}, 3003, "udp"}, -{"csoftragent", {NULL}, 3004, "tcp"}, -{"csoftragent", {NULL}, 3004, "udp"}, -{"geniuslm", {NULL}, 3005, "tcp"}, -{"geniuslm", {NULL}, 3005, "udp"}, -{"ii-admin", {NULL}, 3006, "tcp"}, -{"ii-admin", {NULL}, 3006, "udp"}, -{"lotusmtap", {NULL}, 3007, "tcp"}, -{"lotusmtap", {NULL}, 3007, "udp"}, -{"midnight-tech", {NULL}, 3008, "tcp"}, -{"midnight-tech", {NULL}, 3008, "udp"}, -{"pxc-ntfy", {NULL}, 3009, "tcp"}, -{"pxc-ntfy", {NULL}, 3009, "udp"}, -{"gw", {NULL}, 3010, "tcp"}, -{"ping-pong", {NULL}, 3010, "udp"}, -{"trusted-web", {NULL}, 3011, "tcp"}, -{"trusted-web", {NULL}, 3011, "udp"}, -{"twsdss", {NULL}, 3012, "tcp"}, -{"twsdss", {NULL}, 3012, "udp"}, -{"gilatskysurfer", {NULL}, 3013, "tcp"}, -{"gilatskysurfer", {NULL}, 3013, "udp"}, -{"broker_service", {NULL}, 3014, "tcp"}, -{"broker_service", {NULL}, 3014, "udp"}, -{"nati-dstp", {NULL}, 3015, "tcp"}, -{"nati-dstp", {NULL}, 3015, "udp"}, -{"notify_srvr", {NULL}, 3016, "tcp"}, -{"notify_srvr", {NULL}, 3016, "udp"}, -{"event_listener", {NULL}, 3017, "tcp"}, -{"event_listener", {NULL}, 3017, "udp"}, -{"srvc_registry", {NULL}, 3018, "tcp"}, -{"srvc_registry", {NULL}, 3018, "udp"}, -{"resource_mgr", {NULL}, 3019, "tcp"}, -{"resource_mgr", {NULL}, 3019, "udp"}, -{"cifs", {NULL}, 3020, "tcp"}, -{"cifs", {NULL}, 3020, "udp"}, -{"agriserver", {NULL}, 3021, "tcp"}, -{"agriserver", {NULL}, 3021, "udp"}, -{"csregagent", {NULL}, 3022, "tcp"}, -{"csregagent", {NULL}, 3022, "udp"}, -{"magicnotes", {NULL}, 3023, "tcp"}, -{"magicnotes", {NULL}, 3023, "udp"}, -{"nds_sso", {NULL}, 3024, "tcp"}, -{"nds_sso", {NULL}, 3024, "udp"}, -{"arepa-raft", {NULL}, 3025, "tcp"}, -{"arepa-raft", {NULL}, 3025, "udp"}, -{"agri-gateway", {NULL}, 3026, "tcp"}, -{"agri-gateway", {NULL}, 3026, "udp"}, -{"LiebDevMgmt_C", {NULL}, 3027, "tcp"}, -{"LiebDevMgmt_C", {NULL}, 3027, "udp"}, -{"LiebDevMgmt_DM", {NULL}, 3028, "tcp"}, -{"LiebDevMgmt_DM", {NULL}, 3028, "udp"}, -{"LiebDevMgmt_A", {NULL}, 3029, "tcp"}, -{"LiebDevMgmt_A", {NULL}, 3029, "udp"}, -{"arepa-cas", {NULL}, 3030, "tcp"}, -{"arepa-cas", {NULL}, 3030, "udp"}, -{"eppc", {NULL}, 3031, "tcp"}, -{"eppc", {NULL}, 3031, "udp"}, -{"redwood-chat", {NULL}, 3032, "tcp"}, -{"redwood-chat", {NULL}, 3032, "udp"}, -{"pdb", {NULL}, 3033, "tcp"}, -{"pdb", {NULL}, 3033, "udp"}, -{"osmosis-aeea", {NULL}, 3034, "tcp"}, -{"osmosis-aeea", {NULL}, 3034, "udp"}, -{"fjsv-gssagt", {NULL}, 3035, "tcp"}, -{"fjsv-gssagt", {NULL}, 3035, "udp"}, -{"hagel-dump", {NULL}, 3036, "tcp"}, -{"hagel-dump", {NULL}, 3036, "udp"}, -{"hp-san-mgmt", {NULL}, 3037, "tcp"}, -{"hp-san-mgmt", {NULL}, 3037, "udp"}, -{"santak-ups", {NULL}, 3038, "tcp"}, -{"santak-ups", {NULL}, 3038, "udp"}, -{"cogitate", {NULL}, 3039, "tcp"}, -{"cogitate", {NULL}, 3039, "udp"}, -{"tomato-springs", {NULL}, 3040, "tcp"}, -{"tomato-springs", {NULL}, 3040, "udp"}, -{"di-traceware", {NULL}, 3041, "tcp"}, -{"di-traceware", {NULL}, 3041, "udp"}, -{"journee", {NULL}, 3042, "tcp"}, -{"journee", {NULL}, 3042, "udp"}, -{"brp", {NULL}, 3043, "tcp"}, -{"brp", {NULL}, 3043, "udp"}, -{"epp", {NULL}, 3044, "tcp"}, -{"epp", {NULL}, 3044, "udp"}, -{"responsenet", {NULL}, 3045, "tcp"}, -{"responsenet", {NULL}, 3045, "udp"}, -{"di-ase", {NULL}, 3046, "tcp"}, -{"di-ase", {NULL}, 3046, "udp"}, -{"hlserver", {NULL}, 3047, "tcp"}, -{"hlserver", {NULL}, 3047, "udp"}, -{"pctrader", {NULL}, 3048, "tcp"}, -{"pctrader", {NULL}, 3048, "udp"}, -{"nsws", {NULL}, 3049, "tcp"}, -{"nsws", {NULL}, 3049, "udp"}, -{"gds_db", {NULL}, 3050, "tcp"}, -{"gds_db", {NULL}, 3050, "udp"}, -{"galaxy-server", {NULL}, 3051, "tcp"}, -{"galaxy-server", {NULL}, 3051, "udp"}, -{"apc-3052", {NULL}, 3052, "tcp"}, -{"apc-3052", {NULL}, 3052, "udp"}, -{"dsom-server", {NULL}, 3053, "tcp"}, -{"dsom-server", {NULL}, 3053, "udp"}, -{"amt-cnf-prot", {NULL}, 3054, "tcp"}, -{"amt-cnf-prot", {NULL}, 3054, "udp"}, -{"policyserver", {NULL}, 3055, "tcp"}, -{"policyserver", {NULL}, 3055, "udp"}, -{"cdl-server", {NULL}, 3056, "tcp"}, -{"cdl-server", {NULL}, 3056, "udp"}, -{"goahead-fldup", {NULL}, 3057, "tcp"}, -{"goahead-fldup", {NULL}, 3057, "udp"}, -{"videobeans", {NULL}, 3058, "tcp"}, -{"videobeans", {NULL}, 3058, "udp"}, -{"qsoft", {NULL}, 3059, "tcp"}, -{"qsoft", {NULL}, 3059, "udp"}, -{"interserver", {NULL}, 3060, "tcp"}, -{"interserver", {NULL}, 3060, "udp"}, -{"cautcpd", {NULL}, 3061, "tcp"}, -{"cautcpd", {NULL}, 3061, "udp"}, -{"ncacn-ip-tcp", {NULL}, 3062, "tcp"}, -{"ncacn-ip-tcp", {NULL}, 3062, "udp"}, -{"ncadg-ip-udp", {NULL}, 3063, "tcp"}, -{"ncadg-ip-udp", {NULL}, 3063, "udp"}, -{"rprt", {NULL}, 3064, "tcp"}, -{"rprt", {NULL}, 3064, "udp"}, -{"slinterbase", {NULL}, 3065, "tcp"}, -{"slinterbase", {NULL}, 3065, "udp"}, -{"netattachsdmp", {NULL}, 3066, "tcp"}, -{"netattachsdmp", {NULL}, 3066, "udp"}, -{"fjhpjp", {NULL}, 3067, "tcp"}, -{"fjhpjp", {NULL}, 3067, "udp"}, -{"ls3bcast", {NULL}, 3068, "tcp"}, -{"ls3bcast", {NULL}, 3068, "udp"}, -{"ls3", {NULL}, 3069, "tcp"}, -{"ls3", {NULL}, 3069, "udp"}, -{"mgxswitch", {NULL}, 3070, "tcp"}, -{"mgxswitch", {NULL}, 3070, "udp"}, -{"csd-mgmt-port", {NULL}, 3071, "tcp"}, -{"csd-mgmt-port", {NULL}, 3071, "udp"}, -{"csd-monitor", {NULL}, 3072, "tcp"}, -{"csd-monitor", {NULL}, 3072, "udp"}, -{"vcrp", {NULL}, 3073, "tcp"}, -{"vcrp", {NULL}, 3073, "udp"}, -{"xbox", {NULL}, 3074, "tcp"}, -{"xbox", {NULL}, 3074, "udp"}, -{"orbix-locator", {NULL}, 3075, "tcp"}, -{"orbix-locator", {NULL}, 3075, "udp"}, -{"orbix-config", {NULL}, 3076, "tcp"}, -{"orbix-config", {NULL}, 3076, "udp"}, -{"orbix-loc-ssl", {NULL}, 3077, "tcp"}, -{"orbix-loc-ssl", {NULL}, 3077, "udp"}, -{"orbix-cfg-ssl", {NULL}, 3078, "tcp"}, -{"orbix-cfg-ssl", {NULL}, 3078, "udp"}, -{"lv-frontpanel", {NULL}, 3079, "tcp"}, -{"lv-frontpanel", {NULL}, 3079, "udp"}, -{"stm_pproc", {NULL}, 3080, "tcp"}, -{"stm_pproc", {NULL}, 3080, "udp"}, -{"tl1-lv", {NULL}, 3081, "tcp"}, -{"tl1-lv", {NULL}, 3081, "udp"}, -{"tl1-raw", {NULL}, 3082, "tcp"}, -{"tl1-raw", {NULL}, 3082, "udp"}, -{"tl1-telnet", {NULL}, 3083, "tcp"}, -{"tl1-telnet", {NULL}, 3083, "udp"}, -{"itm-mccs", {NULL}, 3084, "tcp"}, -{"itm-mccs", {NULL}, 3084, "udp"}, -{"pcihreq", {NULL}, 3085, "tcp"}, -{"pcihreq", {NULL}, 3085, "udp"}, -{"jdl-dbkitchen", {NULL}, 3086, "tcp"}, -{"jdl-dbkitchen", {NULL}, 3086, "udp"}, -{"asoki-sma", {NULL}, 3087, "tcp"}, -{"asoki-sma", {NULL}, 3087, "udp"}, -{"xdtp", {NULL}, 3088, "tcp"}, -{"xdtp", {NULL}, 3088, "udp"}, -{"ptk-alink", {NULL}, 3089, "tcp"}, -{"ptk-alink", {NULL}, 3089, "udp"}, -{"stss", {NULL}, 3090, "tcp"}, -{"stss", {NULL}, 3090, "udp"}, -{"1ci-smcs", {NULL}, 3091, "tcp"}, -{"1ci-smcs", {NULL}, 3091, "udp"}, -{"rapidmq-center", {NULL}, 3093, "tcp"}, -{"rapidmq-center", {NULL}, 3093, "udp"}, -{"rapidmq-reg", {NULL}, 3094, "tcp"}, -{"rapidmq-reg", {NULL}, 3094, "udp"}, -{"panasas", {NULL}, 3095, "tcp"}, -{"panasas", {NULL}, 3095, "udp"}, -{"ndl-aps", {NULL}, 3096, "tcp"}, -{"ndl-aps", {NULL}, 3096, "udp"}, -{"itu-bicc-stc", {NULL}, 3097, "sctp"}, -{"umm-port", {NULL}, 3098, "tcp"}, -{"umm-port", {NULL}, 3098, "udp"}, -{"chmd", {NULL}, 3099, "tcp"}, -{"chmd", {NULL}, 3099, "udp"}, -{"opcon-xps", {NULL}, 3100, "tcp"}, -{"opcon-xps", {NULL}, 3100, "udp"}, -{"hp-pxpib", {NULL}, 3101, "tcp"}, -{"hp-pxpib", {NULL}, 3101, "udp"}, -{"slslavemon", {NULL}, 3102, "tcp"}, -{"slslavemon", {NULL}, 3102, "udp"}, -{"autocuesmi", {NULL}, 3103, "tcp"}, -{"autocuesmi", {NULL}, 3103, "udp"}, -{"autocuelog", {NULL}, 3104, "tcp"}, -{"autocuetime", {NULL}, 3104, "udp"}, -{"cardbox", {NULL}, 3105, "tcp"}, -{"cardbox", {NULL}, 3105, "udp"}, -{"cardbox-http", {NULL}, 3106, "tcp"}, -{"cardbox-http", {NULL}, 3106, "udp"}, -{"business", {NULL}, 3107, "tcp"}, -{"business", {NULL}, 3107, "udp"}, -{"geolocate", {NULL}, 3108, "tcp"}, -{"geolocate", {NULL}, 3108, "udp"}, -{"personnel", {NULL}, 3109, "tcp"}, -{"personnel", {NULL}, 3109, "udp"}, -{"sim-control", {NULL}, 3110, "tcp"}, -{"sim-control", {NULL}, 3110, "udp"}, -{"wsynch", {NULL}, 3111, "tcp"}, -{"wsynch", {NULL}, 3111, "udp"}, -{"ksysguard", {NULL}, 3112, "tcp"}, -{"ksysguard", {NULL}, 3112, "udp"}, -{"cs-auth-svr", {NULL}, 3113, "tcp"}, -{"cs-auth-svr", {NULL}, 3113, "udp"}, -{"ccmad", {NULL}, 3114, "tcp"}, -{"ccmad", {NULL}, 3114, "udp"}, -{"mctet-master", {NULL}, 3115, "tcp"}, -{"mctet-master", {NULL}, 3115, "udp"}, -{"mctet-gateway", {NULL}, 3116, "tcp"}, -{"mctet-gateway", {NULL}, 3116, "udp"}, -{"mctet-jserv", {NULL}, 3117, "tcp"}, -{"mctet-jserv", {NULL}, 3117, "udp"}, -{"pkagent", {NULL}, 3118, "tcp"}, -{"pkagent", {NULL}, 3118, "udp"}, -{"d2000kernel", {NULL}, 3119, "tcp"}, -{"d2000kernel", {NULL}, 3119, "udp"}, -{"d2000webserver", {NULL}, 3120, "tcp"}, -{"d2000webserver", {NULL}, 3120, "udp"}, -{"vtr-emulator", {NULL}, 3122, "tcp"}, -{"vtr-emulator", {NULL}, 3122, "udp"}, -{"edix", {NULL}, 3123, "tcp"}, -{"edix", {NULL}, 3123, "udp"}, -{"beacon-port", {NULL}, 3124, "tcp"}, -{"beacon-port", {NULL}, 3124, "udp"}, -{"a13-an", {NULL}, 3125, "tcp"}, -{"a13-an", {NULL}, 3125, "udp"}, -{"ctx-bridge", {NULL}, 3127, "tcp"}, -{"ctx-bridge", {NULL}, 3127, "udp"}, -{"ndl-aas", {NULL}, 3128, "tcp"}, -{"ndl-aas", {NULL}, 3128, "udp"}, -{"netport-id", {NULL}, 3129, "tcp"}, -{"netport-id", {NULL}, 3129, "udp"}, -{"icpv2", {NULL}, 3130, "tcp"}, -{"icpv2", {NULL}, 3130, "udp"}, -{"netbookmark", {NULL}, 3131, "tcp"}, -{"netbookmark", {NULL}, 3131, "udp"}, -{"ms-rule-engine", {NULL}, 3132, "tcp"}, -{"ms-rule-engine", {NULL}, 3132, "udp"}, -{"prism-deploy", {NULL}, 3133, "tcp"}, -{"prism-deploy", {NULL}, 3133, "udp"}, -{"ecp", {NULL}, 3134, "tcp"}, -{"ecp", {NULL}, 3134, "udp"}, -{"peerbook-port", {NULL}, 3135, "tcp"}, -{"peerbook-port", {NULL}, 3135, "udp"}, -{"grubd", {NULL}, 3136, "tcp"}, -{"grubd", {NULL}, 3136, "udp"}, -{"rtnt-1", {NULL}, 3137, "tcp"}, -{"rtnt-1", {NULL}, 3137, "udp"}, -{"rtnt-2", {NULL}, 3138, "tcp"}, -{"rtnt-2", {NULL}, 3138, "udp"}, -{"incognitorv", {NULL}, 3139, "tcp"}, -{"incognitorv", {NULL}, 3139, "udp"}, -{"ariliamulti", {NULL}, 3140, "tcp"}, -{"ariliamulti", {NULL}, 3140, "udp"}, -{"vmodem", {NULL}, 3141, "tcp"}, -{"vmodem", {NULL}, 3141, "udp"}, -{"rdc-wh-eos", {NULL}, 3142, "tcp"}, -{"rdc-wh-eos", {NULL}, 3142, "udp"}, -{"seaview", {NULL}, 3143, "tcp"}, -{"seaview", {NULL}, 3143, "udp"}, -{"tarantella", {NULL}, 3144, "tcp"}, -{"tarantella", {NULL}, 3144, "udp"}, -{"csi-lfap", {NULL}, 3145, "tcp"}, -{"csi-lfap", {NULL}, 3145, "udp"}, -{"bears-02", {NULL}, 3146, "tcp"}, -{"bears-02", {NULL}, 3146, "udp"}, -{"rfio", {NULL}, 3147, "tcp"}, -{"rfio", {NULL}, 3147, "udp"}, -{"nm-game-admin", {NULL}, 3148, "tcp"}, -{"nm-game-admin", {NULL}, 3148, "udp"}, -{"nm-game-server", {NULL}, 3149, "tcp"}, -{"nm-game-server", {NULL}, 3149, "udp"}, -{"nm-asses-admin", {NULL}, 3150, "tcp"}, -{"nm-asses-admin", {NULL}, 3150, "udp"}, -{"nm-assessor", {NULL}, 3151, "tcp"}, -{"nm-assessor", {NULL}, 3151, "udp"}, -{"feitianrockey", {NULL}, 3152, "tcp"}, -{"feitianrockey", {NULL}, 3152, "udp"}, -{"s8-client-port", {NULL}, 3153, "tcp"}, -{"s8-client-port", {NULL}, 3153, "udp"}, -{"ccmrmi", {NULL}, 3154, "tcp"}, -{"ccmrmi", {NULL}, 3154, "udp"}, -{"jpegmpeg", {NULL}, 3155, "tcp"}, -{"jpegmpeg", {NULL}, 3155, "udp"}, -{"indura", {NULL}, 3156, "tcp"}, -{"indura", {NULL}, 3156, "udp"}, -{"e3consultants", {NULL}, 3157, "tcp"}, -{"e3consultants", {NULL}, 3157, "udp"}, -{"stvp", {NULL}, 3158, "tcp"}, -{"stvp", {NULL}, 3158, "udp"}, -{"navegaweb-port", {NULL}, 3159, "tcp"}, -{"navegaweb-port", {NULL}, 3159, "udp"}, -{"tip-app-server", {NULL}, 3160, "tcp"}, -{"tip-app-server", {NULL}, 3160, "udp"}, -{"doc1lm", {NULL}, 3161, "tcp"}, -{"doc1lm", {NULL}, 3161, "udp"}, -{"sflm", {NULL}, 3162, "tcp"}, -{"sflm", {NULL}, 3162, "udp"}, -{"res-sap", {NULL}, 3163, "tcp"}, -{"res-sap", {NULL}, 3163, "udp"}, -{"imprs", {NULL}, 3164, "tcp"}, -{"imprs", {NULL}, 3164, "udp"}, -{"newgenpay", {NULL}, 3165, "tcp"}, -{"newgenpay", {NULL}, 3165, "udp"}, -{"sossecollector", {NULL}, 3166, "tcp"}, -{"sossecollector", {NULL}, 3166, "udp"}, -{"nowcontact", {NULL}, 3167, "tcp"}, -{"nowcontact", {NULL}, 3167, "udp"}, -{"poweronnud", {NULL}, 3168, "tcp"}, -{"poweronnud", {NULL}, 3168, "udp"}, -{"serverview-as", {NULL}, 3169, "tcp"}, -{"serverview-as", {NULL}, 3169, "udp"}, -{"serverview-asn", {NULL}, 3170, "tcp"}, -{"serverview-asn", {NULL}, 3170, "udp"}, -{"serverview-gf", {NULL}, 3171, "tcp"}, -{"serverview-gf", {NULL}, 3171, "udp"}, -{"serverview-rm", {NULL}, 3172, "tcp"}, -{"serverview-rm", {NULL}, 3172, "udp"}, -{"serverview-icc", {NULL}, 3173, "tcp"}, -{"serverview-icc", {NULL}, 3173, "udp"}, -{"armi-server", {NULL}, 3174, "tcp"}, -{"armi-server", {NULL}, 3174, "udp"}, -{"t1-e1-over-ip", {NULL}, 3175, "tcp"}, -{"t1-e1-over-ip", {NULL}, 3175, "udp"}, -{"ars-master", {NULL}, 3176, "tcp"}, -{"ars-master", {NULL}, 3176, "udp"}, -{"phonex-port", {NULL}, 3177, "tcp"}, -{"phonex-port", {NULL}, 3177, "udp"}, -{"radclientport", {NULL}, 3178, "tcp"}, -{"radclientport", {NULL}, 3178, "udp"}, -{"h2gf-w-2m", {NULL}, 3179, "tcp"}, -{"h2gf-w-2m", {NULL}, 3179, "udp"}, -{"mc-brk-srv", {NULL}, 3180, "tcp"}, -{"mc-brk-srv", {NULL}, 3180, "udp"}, -{"bmcpatrolagent", {NULL}, 3181, "tcp"}, -{"bmcpatrolagent", {NULL}, 3181, "udp"}, -{"bmcpatrolrnvu", {NULL}, 3182, "tcp"}, -{"bmcpatrolrnvu", {NULL}, 3182, "udp"}, -{"cops-tls", {NULL}, 3183, "tcp"}, -{"cops-tls", {NULL}, 3183, "udp"}, -{"apogeex-port", {NULL}, 3184, "tcp"}, -{"apogeex-port", {NULL}, 3184, "udp"}, -{"smpppd", {NULL}, 3185, "tcp"}, -{"smpppd", {NULL}, 3185, "udp"}, -{"iiw-port", {NULL}, 3186, "tcp"}, -{"iiw-port", {NULL}, 3186, "udp"}, -{"odi-port", {NULL}, 3187, "tcp"}, -{"odi-port", {NULL}, 3187, "udp"}, -{"brcm-comm-port", {NULL}, 3188, "tcp"}, -{"brcm-comm-port", {NULL}, 3188, "udp"}, -{"pcle-infex", {NULL}, 3189, "tcp"}, -{"pcle-infex", {NULL}, 3189, "udp"}, -{"csvr-proxy", {NULL}, 3190, "tcp"}, -{"csvr-proxy", {NULL}, 3190, "udp"}, -{"csvr-sslproxy", {NULL}, 3191, "tcp"}, -{"csvr-sslproxy", {NULL}, 3191, "udp"}, -{"firemonrcc", {NULL}, 3192, "tcp"}, -{"firemonrcc", {NULL}, 3192, "udp"}, -{"spandataport", {NULL}, 3193, "tcp"}, -{"spandataport", {NULL}, 3193, "udp"}, -{"magbind", {NULL}, 3194, "tcp"}, -{"magbind", {NULL}, 3194, "udp"}, -{"ncu-1", {NULL}, 3195, "tcp"}, -{"ncu-1", {NULL}, 3195, "udp"}, -{"ncu-2", {NULL}, 3196, "tcp"}, -{"ncu-2", {NULL}, 3196, "udp"}, -{"embrace-dp-s", {NULL}, 3197, "tcp"}, -{"embrace-dp-s", {NULL}, 3197, "udp"}, -{"embrace-dp-c", {NULL}, 3198, "tcp"}, -{"embrace-dp-c", {NULL}, 3198, "udp"}, -{"dmod-workspace", {NULL}, 3199, "tcp"}, -{"dmod-workspace", {NULL}, 3199, "udp"}, -{"tick-port", {NULL}, 3200, "tcp"}, -{"tick-port", {NULL}, 3200, "udp"}, -{"cpq-tasksmart", {NULL}, 3201, "tcp"}, -{"cpq-tasksmart", {NULL}, 3201, "udp"}, -{"intraintra", {NULL}, 3202, "tcp"}, -{"intraintra", {NULL}, 3202, "udp"}, -{"netwatcher-mon", {NULL}, 3203, "tcp"}, -{"netwatcher-mon", {NULL}, 3203, "udp"}, -{"netwatcher-db", {NULL}, 3204, "tcp"}, -{"netwatcher-db", {NULL}, 3204, "udp"}, -{"isns", {NULL}, 3205, "tcp"}, -{"isns", {NULL}, 3205, "udp"}, -{"ironmail", {NULL}, 3206, "tcp"}, -{"ironmail", {NULL}, 3206, "udp"}, -{"vx-auth-port", {NULL}, 3207, "tcp"}, -{"vx-auth-port", {NULL}, 3207, "udp"}, -{"pfu-prcallback", {NULL}, 3208, "tcp"}, -{"pfu-prcallback", {NULL}, 3208, "udp"}, -{"netwkpathengine", {NULL}, 3209, "tcp"}, -{"netwkpathengine", {NULL}, 3209, "udp"}, -{"flamenco-proxy", {NULL}, 3210, "tcp"}, -{"flamenco-proxy", {NULL}, 3210, "udp"}, -{"avsecuremgmt", {NULL}, 3211, "tcp"}, -{"avsecuremgmt", {NULL}, 3211, "udp"}, -{"surveyinst", {NULL}, 3212, "tcp"}, -{"surveyinst", {NULL}, 3212, "udp"}, -{"neon24x7", {NULL}, 3213, "tcp"}, -{"neon24x7", {NULL}, 3213, "udp"}, -{"jmq-daemon-1", {NULL}, 3214, "tcp"}, -{"jmq-daemon-1", {NULL}, 3214, "udp"}, -{"jmq-daemon-2", {NULL}, 3215, "tcp"}, -{"jmq-daemon-2", {NULL}, 3215, "udp"}, -{"ferrari-foam", {NULL}, 3216, "tcp"}, -{"ferrari-foam", {NULL}, 3216, "udp"}, -{"unite", {NULL}, 3217, "tcp"}, -{"unite", {NULL}, 3217, "udp"}, -{"smartpackets", {NULL}, 3218, "tcp"}, -{"smartpackets", {NULL}, 3218, "udp"}, -{"wms-messenger", {NULL}, 3219, "tcp"}, -{"wms-messenger", {NULL}, 3219, "udp"}, -{"xnm-ssl", {NULL}, 3220, "tcp"}, -{"xnm-ssl", {NULL}, 3220, "udp"}, -{"xnm-clear-text", {NULL}, 3221, "tcp"}, -{"xnm-clear-text", {NULL}, 3221, "udp"}, -{"glbp", {NULL}, 3222, "tcp"}, -{"glbp", {NULL}, 3222, "udp"}, -{"digivote", {NULL}, 3223, "tcp"}, -{"digivote", {NULL}, 3223, "udp"}, -{"aes-discovery", {NULL}, 3224, "tcp"}, -{"aes-discovery", {NULL}, 3224, "udp"}, -{"fcip-port", {NULL}, 3225, "tcp"}, -{"fcip-port", {NULL}, 3225, "udp"}, -{"isi-irp", {NULL}, 3226, "tcp"}, -{"isi-irp", {NULL}, 3226, "udp"}, -{"dwnmshttp", {NULL}, 3227, "tcp"}, -{"dwnmshttp", {NULL}, 3227, "udp"}, -{"dwmsgserver", {NULL}, 3228, "tcp"}, -{"dwmsgserver", {NULL}, 3228, "udp"}, -{"global-cd-port", {NULL}, 3229, "tcp"}, -{"global-cd-port", {NULL}, 3229, "udp"}, -{"sftdst-port", {NULL}, 3230, "tcp"}, -{"sftdst-port", {NULL}, 3230, "udp"}, -{"vidigo", {NULL}, 3231, "tcp"}, -{"vidigo", {NULL}, 3231, "udp"}, -{"mdtp", {NULL}, 3232, "tcp"}, -{"mdtp", {NULL}, 3232, "udp"}, -{"whisker", {NULL}, 3233, "tcp"}, -{"whisker", {NULL}, 3233, "udp"}, -{"alchemy", {NULL}, 3234, "tcp"}, -{"alchemy", {NULL}, 3234, "udp"}, -{"mdap-port", {NULL}, 3235, "tcp"}, -{"mdap-port", {NULL}, 3235, "udp"}, -{"apparenet-ts", {NULL}, 3236, "tcp"}, -{"apparenet-ts", {NULL}, 3236, "udp"}, -{"apparenet-tps", {NULL}, 3237, "tcp"}, -{"apparenet-tps", {NULL}, 3237, "udp"}, -{"apparenet-as", {NULL}, 3238, "tcp"}, -{"apparenet-as", {NULL}, 3238, "udp"}, -{"apparenet-ui", {NULL}, 3239, "tcp"}, -{"apparenet-ui", {NULL}, 3239, "udp"}, -{"triomotion", {NULL}, 3240, "tcp"}, -{"triomotion", {NULL}, 3240, "udp"}, -{"sysorb", {NULL}, 3241, "tcp"}, -{"sysorb", {NULL}, 3241, "udp"}, -{"sdp-id-port", {NULL}, 3242, "tcp"}, -{"sdp-id-port", {NULL}, 3242, "udp"}, -{"timelot", {NULL}, 3243, "tcp"}, -{"timelot", {NULL}, 3243, "udp"}, -{"onesaf", {NULL}, 3244, "tcp"}, -{"onesaf", {NULL}, 3244, "udp"}, -{"vieo-fe", {NULL}, 3245, "tcp"}, -{"vieo-fe", {NULL}, 3245, "udp"}, -{"dvt-system", {NULL}, 3246, "tcp"}, -{"dvt-system", {NULL}, 3246, "udp"}, -{"dvt-data", {NULL}, 3247, "tcp"}, -{"dvt-data", {NULL}, 3247, "udp"}, -{"procos-lm", {NULL}, 3248, "tcp"}, -{"procos-lm", {NULL}, 3248, "udp"}, -{"ssp", {NULL}, 3249, "tcp"}, -{"ssp", {NULL}, 3249, "udp"}, -{"hicp", {NULL}, 3250, "tcp"}, -{"hicp", {NULL}, 3250, "udp"}, -{"sysscanner", {NULL}, 3251, "tcp"}, -{"sysscanner", {NULL}, 3251, "udp"}, -{"dhe", {NULL}, 3252, "tcp"}, -{"dhe", {NULL}, 3252, "udp"}, -{"pda-data", {NULL}, 3253, "tcp"}, -{"pda-data", {NULL}, 3253, "udp"}, -{"pda-sys", {NULL}, 3254, "tcp"}, -{"pda-sys", {NULL}, 3254, "udp"}, -{"semaphore", {NULL}, 3255, "tcp"}, -{"semaphore", {NULL}, 3255, "udp"}, -{"cpqrpm-agent", {NULL}, 3256, "tcp"}, -{"cpqrpm-agent", {NULL}, 3256, "udp"}, -{"cpqrpm-server", {NULL}, 3257, "tcp"}, -{"cpqrpm-server", {NULL}, 3257, "udp"}, -{"ivecon-port", {NULL}, 3258, "tcp"}, -{"ivecon-port", {NULL}, 3258, "udp"}, -{"epncdp2", {NULL}, 3259, "tcp"}, -{"epncdp2", {NULL}, 3259, "udp"}, -{"iscsi-target", {NULL}, 3260, "tcp"}, -{"iscsi-target", {NULL}, 3260, "udp"}, -{"winshadow", {NULL}, 3261, "tcp"}, -{"winshadow", {NULL}, 3261, "udp"}, -{"necp", {NULL}, 3262, "tcp"}, -{"necp", {NULL}, 3262, "udp"}, -{"ecolor-imager", {NULL}, 3263, "tcp"}, -{"ecolor-imager", {NULL}, 3263, "udp"}, -{"ccmail", {NULL}, 3264, "tcp"}, -{"ccmail", {NULL}, 3264, "udp"}, -{"altav-tunnel", {NULL}, 3265, "tcp"}, -{"altav-tunnel", {NULL}, 3265, "udp"}, -{"ns-cfg-server", {NULL}, 3266, "tcp"}, -{"ns-cfg-server", {NULL}, 3266, "udp"}, -{"ibm-dial-out", {NULL}, 3267, "tcp"}, -{"ibm-dial-out", {NULL}, 3267, "udp"}, -{"msft-gc", {NULL}, 3268, "tcp"}, -{"msft-gc", {NULL}, 3268, "udp"}, -{"msft-gc-ssl", {NULL}, 3269, "tcp"}, -{"msft-gc-ssl", {NULL}, 3269, "udp"}, -{"verismart", {NULL}, 3270, "tcp"}, -{"verismart", {NULL}, 3270, "udp"}, -{"csoft-prev", {NULL}, 3271, "tcp"}, -{"csoft-prev", {NULL}, 3271, "udp"}, -{"user-manager", {NULL}, 3272, "tcp"}, -{"user-manager", {NULL}, 3272, "udp"}, -{"sxmp", {NULL}, 3273, "tcp"}, -{"sxmp", {NULL}, 3273, "udp"}, -{"ordinox-server", {NULL}, 3274, "tcp"}, -{"ordinox-server", {NULL}, 3274, "udp"}, -{"samd", {NULL}, 3275, "tcp"}, -{"samd", {NULL}, 3275, "udp"}, -{"maxim-asics", {NULL}, 3276, "tcp"}, -{"maxim-asics", {NULL}, 3276, "udp"}, -{"awg-proxy", {NULL}, 3277, "tcp"}, -{"awg-proxy", {NULL}, 3277, "udp"}, -{"lkcmserver", {NULL}, 3278, "tcp"}, -{"lkcmserver", {NULL}, 3278, "udp"}, -{"admind", {NULL}, 3279, "tcp"}, -{"admind", {NULL}, 3279, "udp"}, -{"vs-server", {NULL}, 3280, "tcp"}, -{"vs-server", {NULL}, 3280, "udp"}, -{"sysopt", {NULL}, 3281, "tcp"}, -{"sysopt", {NULL}, 3281, "udp"}, -{"datusorb", {NULL}, 3282, "tcp"}, -{"datusorb", {NULL}, 3282, "udp"}, -{"net-assistant", {NULL}, 3283, "tcp"}, -{"net-assistant", {NULL}, 3283, "udp"}, -{"4talk", {NULL}, 3284, "tcp"}, -{"4talk", {NULL}, 3284, "udp"}, -{"plato", {NULL}, 3285, "tcp"}, -{"plato", {NULL}, 3285, "udp"}, -{"e-net", {NULL}, 3286, "tcp"}, -{"e-net", {NULL}, 3286, "udp"}, -{"directvdata", {NULL}, 3287, "tcp"}, -{"directvdata", {NULL}, 3287, "udp"}, -{"cops", {NULL}, 3288, "tcp"}, -{"cops", {NULL}, 3288, "udp"}, -{"enpc", {NULL}, 3289, "tcp"}, -{"enpc", {NULL}, 3289, "udp"}, -{"caps-lm", {NULL}, 3290, "tcp"}, -{"caps-lm", {NULL}, 3290, "udp"}, -{"sah-lm", {NULL}, 3291, "tcp"}, -{"sah-lm", {NULL}, 3291, "udp"}, -{"cart-o-rama", {NULL}, 3292, "tcp"}, -{"cart-o-rama", {NULL}, 3292, "udp"}, -{"fg-fps", {NULL}, 3293, "tcp"}, -{"fg-fps", {NULL}, 3293, "udp"}, -{"fg-gip", {NULL}, 3294, "tcp"}, -{"fg-gip", {NULL}, 3294, "udp"}, -{"dyniplookup", {NULL}, 3295, "tcp"}, -{"dyniplookup", {NULL}, 3295, "udp"}, -{"rib-slm", {NULL}, 3296, "tcp"}, -{"rib-slm", {NULL}, 3296, "udp"}, -{"cytel-lm", {NULL}, 3297, "tcp"}, -{"cytel-lm", {NULL}, 3297, "udp"}, -{"deskview", {NULL}, 3298, "tcp"}, -{"deskview", {NULL}, 3298, "udp"}, -{"pdrncs", {NULL}, 3299, "tcp"}, -{"pdrncs", {NULL}, 3299, "udp"}, -{"mcs-fastmail", {NULL}, 3302, "tcp"}, -{"mcs-fastmail", {NULL}, 3302, "udp"}, -{"opsession-clnt", {NULL}, 3303, "tcp"}, -{"opsession-clnt", {NULL}, 3303, "udp"}, -{"opsession-srvr", {NULL}, 3304, "tcp"}, -{"opsession-srvr", {NULL}, 3304, "udp"}, -{"odette-ftp", {NULL}, 3305, "tcp"}, -{"odette-ftp", {NULL}, 3305, "udp"}, -{"mysql", {NULL}, 3306, "tcp"}, -{"mysql", {NULL}, 3306, "udp"}, -{"opsession-prxy", {NULL}, 3307, "tcp"}, -{"opsession-prxy", {NULL}, 3307, "udp"}, -{"tns-server", {NULL}, 3308, "tcp"}, -{"tns-server", {NULL}, 3308, "udp"}, -{"tns-adv", {NULL}, 3309, "tcp"}, -{"tns-adv", {NULL}, 3309, "udp"}, -{"dyna-access", {NULL}, 3310, "tcp"}, -{"dyna-access", {NULL}, 3310, "udp"}, -{"mcns-tel-ret", {NULL}, 3311, "tcp"}, -{"mcns-tel-ret", {NULL}, 3311, "udp"}, -{"appman-server", {NULL}, 3312, "tcp"}, -{"appman-server", {NULL}, 3312, "udp"}, -{"uorb", {NULL}, 3313, "tcp"}, -{"uorb", {NULL}, 3313, "udp"}, -{"uohost", {NULL}, 3314, "tcp"}, -{"uohost", {NULL}, 3314, "udp"}, -{"cdid", {NULL}, 3315, "tcp"}, -{"cdid", {NULL}, 3315, "udp"}, -{"aicc-cmi", {NULL}, 3316, "tcp"}, -{"aicc-cmi", {NULL}, 3316, "udp"}, -{"vsaiport", {NULL}, 3317, "tcp"}, -{"vsaiport", {NULL}, 3317, "udp"}, -{"ssrip", {NULL}, 3318, "tcp"}, -{"ssrip", {NULL}, 3318, "udp"}, -{"sdt-lmd", {NULL}, 3319, "tcp"}, -{"sdt-lmd", {NULL}, 3319, "udp"}, -{"officelink2000", {NULL}, 3320, "tcp"}, -{"officelink2000", {NULL}, 3320, "udp"}, -{"vnsstr", {NULL}, 3321, "tcp"}, -{"vnsstr", {NULL}, 3321, "udp"}, -{"sftu", {NULL}, 3326, "tcp"}, -{"sftu", {NULL}, 3326, "udp"}, -{"bbars", {NULL}, 3327, "tcp"}, -{"bbars", {NULL}, 3327, "udp"}, -{"egptlm", {NULL}, 3328, "tcp"}, -{"egptlm", {NULL}, 3328, "udp"}, -{"hp-device-disc", {NULL}, 3329, "tcp"}, -{"hp-device-disc", {NULL}, 3329, "udp"}, -{"mcs-calypsoicf", {NULL}, 3330, "tcp"}, -{"mcs-calypsoicf", {NULL}, 3330, "udp"}, -{"mcs-messaging", {NULL}, 3331, "tcp"}, -{"mcs-messaging", {NULL}, 3331, "udp"}, -{"mcs-mailsvr", {NULL}, 3332, "tcp"}, -{"mcs-mailsvr", {NULL}, 3332, "udp"}, -{"dec-notes", {NULL}, 3333, "tcp"}, -{"dec-notes", {NULL}, 3333, "udp"}, -{"directv-web", {NULL}, 3334, "tcp"}, -{"directv-web", {NULL}, 3334, "udp"}, -{"directv-soft", {NULL}, 3335, "tcp"}, -{"directv-soft", {NULL}, 3335, "udp"}, -{"directv-tick", {NULL}, 3336, "tcp"}, -{"directv-tick", {NULL}, 3336, "udp"}, -{"directv-catlg", {NULL}, 3337, "tcp"}, -{"directv-catlg", {NULL}, 3337, "udp"}, -{"anet-b", {NULL}, 3338, "tcp"}, -{"anet-b", {NULL}, 3338, "udp"}, -{"anet-l", {NULL}, 3339, "tcp"}, -{"anet-l", {NULL}, 3339, "udp"}, -{"anet-m", {NULL}, 3340, "tcp"}, -{"anet-m", {NULL}, 3340, "udp"}, -{"anet-h", {NULL}, 3341, "tcp"}, -{"anet-h", {NULL}, 3341, "udp"}, -{"webtie", {NULL}, 3342, "tcp"}, -{"webtie", {NULL}, 3342, "udp"}, -{"ms-cluster-net", {NULL}, 3343, "tcp"}, -{"ms-cluster-net", {NULL}, 3343, "udp"}, -{"bnt-manager", {NULL}, 3344, "tcp"}, -{"bnt-manager", {NULL}, 3344, "udp"}, -{"influence", {NULL}, 3345, "tcp"}, -{"influence", {NULL}, 3345, "udp"}, -{"trnsprntproxy", {NULL}, 3346, "tcp"}, -{"trnsprntproxy", {NULL}, 3346, "udp"}, -{"phoenix-rpc", {NULL}, 3347, "tcp"}, -{"phoenix-rpc", {NULL}, 3347, "udp"}, -{"pangolin-laser", {NULL}, 3348, "tcp"}, -{"pangolin-laser", {NULL}, 3348, "udp"}, -{"chevinservices", {NULL}, 3349, "tcp"}, -{"chevinservices", {NULL}, 3349, "udp"}, -{"findviatv", {NULL}, 3350, "tcp"}, -{"findviatv", {NULL}, 3350, "udp"}, -{"btrieve", {NULL}, 3351, "tcp"}, -{"btrieve", {NULL}, 3351, "udp"}, -{"ssql", {NULL}, 3352, "tcp"}, -{"ssql", {NULL}, 3352, "udp"}, -{"fatpipe", {NULL}, 3353, "tcp"}, -{"fatpipe", {NULL}, 3353, "udp"}, -{"suitjd", {NULL}, 3354, "tcp"}, -{"suitjd", {NULL}, 3354, "udp"}, -{"ordinox-dbase", {NULL}, 3355, "tcp"}, -{"ordinox-dbase", {NULL}, 3355, "udp"}, -{"upnotifyps", {NULL}, 3356, "tcp"}, -{"upnotifyps", {NULL}, 3356, "udp"}, -{"adtech-test", {NULL}, 3357, "tcp"}, -{"adtech-test", {NULL}, 3357, "udp"}, -{"mpsysrmsvr", {NULL}, 3358, "tcp"}, -{"mpsysrmsvr", {NULL}, 3358, "udp"}, -{"wg-netforce", {NULL}, 3359, "tcp"}, -{"wg-netforce", {NULL}, 3359, "udp"}, -{"kv-server", {NULL}, 3360, "tcp"}, -{"kv-server", {NULL}, 3360, "udp"}, -{"kv-agent", {NULL}, 3361, "tcp"}, -{"kv-agent", {NULL}, 3361, "udp"}, -{"dj-ilm", {NULL}, 3362, "tcp"}, -{"dj-ilm", {NULL}, 3362, "udp"}, -{"nati-vi-server", {NULL}, 3363, "tcp"}, -{"nati-vi-server", {NULL}, 3363, "udp"}, -{"creativeserver", {NULL}, 3364, "tcp"}, -{"creativeserver", {NULL}, 3364, "udp"}, -{"contentserver", {NULL}, 3365, "tcp"}, -{"contentserver", {NULL}, 3365, "udp"}, -{"creativepartnr", {NULL}, 3366, "tcp"}, -{"creativepartnr", {NULL}, 3366, "udp"}, -{"tip2", {NULL}, 3372, "tcp"}, -{"tip2", {NULL}, 3372, "udp"}, -{"lavenir-lm", {NULL}, 3373, "tcp"}, -{"lavenir-lm", {NULL}, 3373, "udp"}, -{"cluster-disc", {NULL}, 3374, "tcp"}, -{"cluster-disc", {NULL}, 3374, "udp"}, -{"vsnm-agent", {NULL}, 3375, "tcp"}, -{"vsnm-agent", {NULL}, 3375, "udp"}, -{"cdbroker", {NULL}, 3376, "tcp"}, -{"cdbroker", {NULL}, 3376, "udp"}, -{"cogsys-lm", {NULL}, 3377, "tcp"}, -{"cogsys-lm", {NULL}, 3377, "udp"}, -{"wsicopy", {NULL}, 3378, "tcp"}, -{"wsicopy", {NULL}, 3378, "udp"}, -{"socorfs", {NULL}, 3379, "tcp"}, -{"socorfs", {NULL}, 3379, "udp"}, -{"sns-channels", {NULL}, 3380, "tcp"}, -{"sns-channels", {NULL}, 3380, "udp"}, -{"geneous", {NULL}, 3381, "tcp"}, -{"geneous", {NULL}, 3381, "udp"}, -{"fujitsu-neat", {NULL}, 3382, "tcp"}, -{"fujitsu-neat", {NULL}, 3382, "udp"}, -{"esp-lm", {NULL}, 3383, "tcp"}, -{"esp-lm", {NULL}, 3383, "udp"}, -{"hp-clic", {NULL}, 3384, "tcp"}, -{"hp-clic", {NULL}, 3384, "udp"}, -{"qnxnetman", {NULL}, 3385, "tcp"}, -{"qnxnetman", {NULL}, 3385, "udp"}, -{"gprs-data", {NULL}, 3386, "tcp"}, -{"gprs-sig", {NULL}, 3386, "udp"}, -{"backroomnet", {NULL}, 3387, "tcp"}, -{"backroomnet", {NULL}, 3387, "udp"}, -{"cbserver", {NULL}, 3388, "tcp"}, -{"cbserver", {NULL}, 3388, "udp"}, -{"ms-wbt-server", {NULL}, 3389, "tcp"}, -{"ms-wbt-server", {NULL}, 3389, "udp"}, -{"dsc", {NULL}, 3390, "tcp"}, -{"dsc", {NULL}, 3390, "udp"}, -{"savant", {NULL}, 3391, "tcp"}, -{"savant", {NULL}, 3391, "udp"}, -{"efi-lm", {NULL}, 3392, "tcp"}, -{"efi-lm", {NULL}, 3392, "udp"}, -{"d2k-tapestry1", {NULL}, 3393, "tcp"}, -{"d2k-tapestry1", {NULL}, 3393, "udp"}, -{"d2k-tapestry2", {NULL}, 3394, "tcp"}, -{"d2k-tapestry2", {NULL}, 3394, "udp"}, -{"dyna-lm", {NULL}, 3395, "tcp"}, -{"dyna-lm", {NULL}, 3395, "udp"}, -{"printer_agent", {NULL}, 3396, "tcp"}, -{"printer_agent", {NULL}, 3396, "udp"}, -{"cloanto-lm", {NULL}, 3397, "tcp"}, -{"cloanto-lm", {NULL}, 3397, "udp"}, -{"mercantile", {NULL}, 3398, "tcp"}, -{"mercantile", {NULL}, 3398, "udp"}, -{"csms", {NULL}, 3399, "tcp"}, -{"csms", {NULL}, 3399, "udp"}, -{"csms2", {NULL}, 3400, "tcp"}, -{"csms2", {NULL}, 3400, "udp"}, -{"filecast", {NULL}, 3401, "tcp"}, -{"filecast", {NULL}, 3401, "udp"}, -{"fxaengine-net", {NULL}, 3402, "tcp"}, -{"fxaengine-net", {NULL}, 3402, "udp"}, -{"nokia-ann-ch1", {NULL}, 3405, "tcp"}, -{"nokia-ann-ch1", {NULL}, 3405, "udp"}, -{"nokia-ann-ch2", {NULL}, 3406, "tcp"}, -{"nokia-ann-ch2", {NULL}, 3406, "udp"}, -{"ldap-admin", {NULL}, 3407, "tcp"}, -{"ldap-admin", {NULL}, 3407, "udp"}, -{"BESApi", {NULL}, 3408, "tcp"}, -{"BESApi", {NULL}, 3408, "udp"}, -{"networklens", {NULL}, 3409, "tcp"}, -{"networklens", {NULL}, 3409, "udp"}, -{"networklenss", {NULL}, 3410, "tcp"}, -{"networklenss", {NULL}, 3410, "udp"}, -{"biolink-auth", {NULL}, 3411, "tcp"}, -{"biolink-auth", {NULL}, 3411, "udp"}, -{"xmlblaster", {NULL}, 3412, "tcp"}, -{"xmlblaster", {NULL}, 3412, "udp"}, -{"svnet", {NULL}, 3413, "tcp"}, -{"svnet", {NULL}, 3413, "udp"}, -{"wip-port", {NULL}, 3414, "tcp"}, -{"wip-port", {NULL}, 3414, "udp"}, -{"bcinameservice", {NULL}, 3415, "tcp"}, -{"bcinameservice", {NULL}, 3415, "udp"}, -{"commandport", {NULL}, 3416, "tcp"}, -{"commandport", {NULL}, 3416, "udp"}, -{"csvr", {NULL}, 3417, "tcp"}, -{"csvr", {NULL}, 3417, "udp"}, -{"rnmap", {NULL}, 3418, "tcp"}, -{"rnmap", {NULL}, 3418, "udp"}, -{"softaudit", {NULL}, 3419, "tcp"}, -{"softaudit", {NULL}, 3419, "udp"}, -{"ifcp-port", {NULL}, 3420, "tcp"}, -{"ifcp-port", {NULL}, 3420, "udp"}, -{"bmap", {NULL}, 3421, "tcp"}, -{"bmap", {NULL}, 3421, "udp"}, -{"rusb-sys-port", {NULL}, 3422, "tcp"}, -{"rusb-sys-port", {NULL}, 3422, "udp"}, -{"xtrm", {NULL}, 3423, "tcp"}, -{"xtrm", {NULL}, 3423, "udp"}, -{"xtrms", {NULL}, 3424, "tcp"}, -{"xtrms", {NULL}, 3424, "udp"}, -{"agps-port", {NULL}, 3425, "tcp"}, -{"agps-port", {NULL}, 3425, "udp"}, -{"arkivio", {NULL}, 3426, "tcp"}, -{"arkivio", {NULL}, 3426, "udp"}, -{"websphere-snmp", {NULL}, 3427, "tcp"}, -{"websphere-snmp", {NULL}, 3427, "udp"}, -{"twcss", {NULL}, 3428, "tcp"}, -{"twcss", {NULL}, 3428, "udp"}, -{"gcsp", {NULL}, 3429, "tcp"}, -{"gcsp", {NULL}, 3429, "udp"}, -{"ssdispatch", {NULL}, 3430, "tcp"}, -{"ssdispatch", {NULL}, 3430, "udp"}, -{"ndl-als", {NULL}, 3431, "tcp"}, -{"ndl-als", {NULL}, 3431, "udp"}, -{"osdcp", {NULL}, 3432, "tcp"}, -{"osdcp", {NULL}, 3432, "udp"}, -{"alta-smp", {NULL}, 3433, "tcp"}, -{"alta-smp", {NULL}, 3433, "udp"}, -{"opencm", {NULL}, 3434, "tcp"}, -{"opencm", {NULL}, 3434, "udp"}, -{"pacom", {NULL}, 3435, "tcp"}, -{"pacom", {NULL}, 3435, "udp"}, -{"gc-config", {NULL}, 3436, "tcp"}, -{"gc-config", {NULL}, 3436, "udp"}, -{"autocueds", {NULL}, 3437, "tcp"}, -{"autocueds", {NULL}, 3437, "udp"}, -{"spiral-admin", {NULL}, 3438, "tcp"}, -{"spiral-admin", {NULL}, 3438, "udp"}, -{"hri-port", {NULL}, 3439, "tcp"}, -{"hri-port", {NULL}, 3439, "udp"}, -{"ans-console", {NULL}, 3440, "tcp"}, -{"ans-console", {NULL}, 3440, "udp"}, -{"connect-client", {NULL}, 3441, "tcp"}, -{"connect-client", {NULL}, 3441, "udp"}, -{"connect-server", {NULL}, 3442, "tcp"}, -{"connect-server", {NULL}, 3442, "udp"}, -{"ov-nnm-websrv", {NULL}, 3443, "tcp"}, -{"ov-nnm-websrv", {NULL}, 3443, "udp"}, -{"denali-server", {NULL}, 3444, "tcp"}, -{"denali-server", {NULL}, 3444, "udp"}, -{"monp", {NULL}, 3445, "tcp"}, -{"monp", {NULL}, 3445, "udp"}, -{"3comfaxrpc", {NULL}, 3446, "tcp"}, -{"3comfaxrpc", {NULL}, 3446, "udp"}, -{"directnet", {NULL}, 3447, "tcp"}, -{"directnet", {NULL}, 3447, "udp"}, -{"dnc-port", {NULL}, 3448, "tcp"}, -{"dnc-port", {NULL}, 3448, "udp"}, -{"hotu-chat", {NULL}, 3449, "tcp"}, -{"hotu-chat", {NULL}, 3449, "udp"}, -{"castorproxy", {NULL}, 3450, "tcp"}, -{"castorproxy", {NULL}, 3450, "udp"}, -{"asam", {NULL}, 3451, "tcp"}, -{"asam", {NULL}, 3451, "udp"}, -{"sabp-signal", {NULL}, 3452, "tcp"}, -{"sabp-signal", {NULL}, 3452, "udp"}, -{"pscupd", {NULL}, 3453, "tcp"}, -{"pscupd", {NULL}, 3453, "udp"}, -{"mira", {NULL}, 3454, "tcp"}, -{"prsvp", {NULL}, 3455, "tcp"}, -{"prsvp", {NULL}, 3455, "udp"}, -{"vat", {NULL}, 3456, "tcp"}, -{"vat", {NULL}, 3456, "udp"}, -{"vat-control", {NULL}, 3457, "tcp"}, -{"vat-control", {NULL}, 3457, "udp"}, -{"d3winosfi", {NULL}, 3458, "tcp"}, -{"d3winosfi", {NULL}, 3458, "udp"}, -{"integral", {NULL}, 3459, "tcp"}, -{"integral", {NULL}, 3459, "udp"}, -{"edm-manager", {NULL}, 3460, "tcp"}, -{"edm-manager", {NULL}, 3460, "udp"}, -{"edm-stager", {NULL}, 3461, "tcp"}, -{"edm-stager", {NULL}, 3461, "udp"}, -{"edm-std-notify", {NULL}, 3462, "tcp"}, -{"edm-std-notify", {NULL}, 3462, "udp"}, -{"edm-adm-notify", {NULL}, 3463, "tcp"}, -{"edm-adm-notify", {NULL}, 3463, "udp"}, -{"edm-mgr-sync", {NULL}, 3464, "tcp"}, -{"edm-mgr-sync", {NULL}, 3464, "udp"}, -{"edm-mgr-cntrl", {NULL}, 3465, "tcp"}, -{"edm-mgr-cntrl", {NULL}, 3465, "udp"}, -{"workflow", {NULL}, 3466, "tcp"}, -{"workflow", {NULL}, 3466, "udp"}, -{"rcst", {NULL}, 3467, "tcp"}, -{"rcst", {NULL}, 3467, "udp"}, -{"ttcmremotectrl", {NULL}, 3468, "tcp"}, -{"ttcmremotectrl", {NULL}, 3468, "udp"}, -{"pluribus", {NULL}, 3469, "tcp"}, -{"pluribus", {NULL}, 3469, "udp"}, -{"jt400", {NULL}, 3470, "tcp"}, -{"jt400", {NULL}, 3470, "udp"}, -{"jt400-ssl", {NULL}, 3471, "tcp"}, -{"jt400-ssl", {NULL}, 3471, "udp"}, -{"jaugsremotec-1", {NULL}, 3472, "tcp"}, -{"jaugsremotec-1", {NULL}, 3472, "udp"}, -{"jaugsremotec-2", {NULL}, 3473, "tcp"}, -{"jaugsremotec-2", {NULL}, 3473, "udp"}, -{"ttntspauto", {NULL}, 3474, "tcp"}, -{"ttntspauto", {NULL}, 3474, "udp"}, -{"genisar-port", {NULL}, 3475, "tcp"}, -{"genisar-port", {NULL}, 3475, "udp"}, -{"nppmp", {NULL}, 3476, "tcp"}, -{"nppmp", {NULL}, 3476, "udp"}, -{"ecomm", {NULL}, 3477, "tcp"}, -{"ecomm", {NULL}, 3477, "udp"}, -{"stun", {NULL}, 3478, "tcp"}, -{"stun", {NULL}, 3478, "udp"}, -{"turn", {NULL}, 3478, "tcp"}, -{"turn", {NULL}, 3478, "udp"}, -{"stun-behavior", {NULL}, 3478, "tcp"}, -{"stun-behavior", {NULL}, 3478, "udp"}, -{"twrpc", {NULL}, 3479, "tcp"}, -{"twrpc", {NULL}, 3479, "udp"}, -{"plethora", {NULL}, 3480, "tcp"}, -{"plethora", {NULL}, 3480, "udp"}, -{"cleanerliverc", {NULL}, 3481, "tcp"}, -{"cleanerliverc", {NULL}, 3481, "udp"}, -{"vulture", {NULL}, 3482, "tcp"}, -{"vulture", {NULL}, 3482, "udp"}, -{"slim-devices", {NULL}, 3483, "tcp"}, -{"slim-devices", {NULL}, 3483, "udp"}, -{"gbs-stp", {NULL}, 3484, "tcp"}, -{"gbs-stp", {NULL}, 3484, "udp"}, -{"celatalk", {NULL}, 3485, "tcp"}, -{"celatalk", {NULL}, 3485, "udp"}, -{"ifsf-hb-port", {NULL}, 3486, "tcp"}, -{"ifsf-hb-port", {NULL}, 3486, "udp"}, -{"ltctcp", {NULL}, 3487, "tcp"}, -{"ltcudp", {NULL}, 3487, "udp"}, -{"fs-rh-srv", {NULL}, 3488, "tcp"}, -{"fs-rh-srv", {NULL}, 3488, "udp"}, -{"dtp-dia", {NULL}, 3489, "tcp"}, -{"dtp-dia", {NULL}, 3489, "udp"}, -{"colubris", {NULL}, 3490, "tcp"}, -{"colubris", {NULL}, 3490, "udp"}, -{"swr-port", {NULL}, 3491, "tcp"}, -{"swr-port", {NULL}, 3491, "udp"}, -{"tvdumtray-port", {NULL}, 3492, "tcp"}, -{"tvdumtray-port", {NULL}, 3492, "udp"}, -{"nut", {NULL}, 3493, "tcp"}, -{"nut", {NULL}, 3493, "udp"}, -{"ibm3494", {NULL}, 3494, "tcp"}, -{"ibm3494", {NULL}, 3494, "udp"}, -{"seclayer-tcp", {NULL}, 3495, "tcp"}, -{"seclayer-tcp", {NULL}, 3495, "udp"}, -{"seclayer-tls", {NULL}, 3496, "tcp"}, -{"seclayer-tls", {NULL}, 3496, "udp"}, -{"ipether232port", {NULL}, 3497, "tcp"}, -{"ipether232port", {NULL}, 3497, "udp"}, -{"dashpas-port", {NULL}, 3498, "tcp"}, -{"dashpas-port", {NULL}, 3498, "udp"}, -{"sccip-media", {NULL}, 3499, "tcp"}, -{"sccip-media", {NULL}, 3499, "udp"}, -{"rtmp-port", {NULL}, 3500, "tcp"}, -{"rtmp-port", {NULL}, 3500, "udp"}, -{"isoft-p2p", {NULL}, 3501, "tcp"}, -{"isoft-p2p", {NULL}, 3501, "udp"}, -{"avinstalldisc", {NULL}, 3502, "tcp"}, -{"avinstalldisc", {NULL}, 3502, "udp"}, -{"lsp-ping", {NULL}, 3503, "tcp"}, -{"lsp-ping", {NULL}, 3503, "udp"}, -{"ironstorm", {NULL}, 3504, "tcp"}, -{"ironstorm", {NULL}, 3504, "udp"}, -{"ccmcomm", {NULL}, 3505, "tcp"}, -{"ccmcomm", {NULL}, 3505, "udp"}, -{"apc-3506", {NULL}, 3506, "tcp"}, -{"apc-3506", {NULL}, 3506, "udp"}, -{"nesh-broker", {NULL}, 3507, "tcp"}, -{"nesh-broker", {NULL}, 3507, "udp"}, -{"interactionweb", {NULL}, 3508, "tcp"}, -{"interactionweb", {NULL}, 3508, "udp"}, -{"vt-ssl", {NULL}, 3509, "tcp"}, -{"vt-ssl", {NULL}, 3509, "udp"}, -{"xss-port", {NULL}, 3510, "tcp"}, -{"xss-port", {NULL}, 3510, "udp"}, -{"webmail-2", {NULL}, 3511, "tcp"}, -{"webmail-2", {NULL}, 3511, "udp"}, -{"aztec", {NULL}, 3512, "tcp"}, -{"aztec", {NULL}, 3512, "udp"}, -{"arcpd", {NULL}, 3513, "tcp"}, -{"arcpd", {NULL}, 3513, "udp"}, -{"must-p2p", {NULL}, 3514, "tcp"}, -{"must-p2p", {NULL}, 3514, "udp"}, -{"must-backplane", {NULL}, 3515, "tcp"}, -{"must-backplane", {NULL}, 3515, "udp"}, -{"smartcard-port", {NULL}, 3516, "tcp"}, -{"smartcard-port", {NULL}, 3516, "udp"}, -{"802-11-iapp", {NULL}, 3517, "tcp"}, -{"802-11-iapp", {NULL}, 3517, "udp"}, -{"artifact-msg", {NULL}, 3518, "tcp"}, -{"artifact-msg", {NULL}, 3518, "udp"}, -{"nvmsgd", {NULL}, 3519, "tcp"}, -{"galileo", {NULL}, 3519, "udp"}, -{"galileolog", {NULL}, 3520, "tcp"}, -{"galileolog", {NULL}, 3520, "udp"}, -{"mc3ss", {NULL}, 3521, "tcp"}, -{"mc3ss", {NULL}, 3521, "udp"}, -{"nssocketport", {NULL}, 3522, "tcp"}, -{"nssocketport", {NULL}, 3522, "udp"}, -{"odeumservlink", {NULL}, 3523, "tcp"}, -{"odeumservlink", {NULL}, 3523, "udp"}, -{"ecmport", {NULL}, 3524, "tcp"}, -{"ecmport", {NULL}, 3524, "udp"}, -{"eisport", {NULL}, 3525, "tcp"}, -{"eisport", {NULL}, 3525, "udp"}, -{"starquiz-port", {NULL}, 3526, "tcp"}, -{"starquiz-port", {NULL}, 3526, "udp"}, -{"beserver-msg-q", {NULL}, 3527, "tcp"}, -{"beserver-msg-q", {NULL}, 3527, "udp"}, -{"jboss-iiop", {NULL}, 3528, "tcp"}, -{"jboss-iiop", {NULL}, 3528, "udp"}, -{"jboss-iiop-ssl", {NULL}, 3529, "tcp"}, -{"jboss-iiop-ssl", {NULL}, 3529, "udp"}, -{"gf", {NULL}, 3530, "tcp"}, -{"gf", {NULL}, 3530, "udp"}, -{"joltid", {NULL}, 3531, "tcp"}, -{"joltid", {NULL}, 3531, "udp"}, -{"raven-rmp", {NULL}, 3532, "tcp"}, -{"raven-rmp", {NULL}, 3532, "udp"}, -{"raven-rdp", {NULL}, 3533, "tcp"}, -{"raven-rdp", {NULL}, 3533, "udp"}, -{"urld-port", {NULL}, 3534, "tcp"}, -{"urld-port", {NULL}, 3534, "udp"}, -{"ms-la", {NULL}, 3535, "tcp"}, -{"ms-la", {NULL}, 3535, "udp"}, -{"snac", {NULL}, 3536, "tcp"}, -{"snac", {NULL}, 3536, "udp"}, -{"ni-visa-remote", {NULL}, 3537, "tcp"}, -{"ni-visa-remote", {NULL}, 3537, "udp"}, -{"ibm-diradm", {NULL}, 3538, "tcp"}, -{"ibm-diradm", {NULL}, 3538, "udp"}, -{"ibm-diradm-ssl", {NULL}, 3539, "tcp"}, -{"ibm-diradm-ssl", {NULL}, 3539, "udp"}, -{"pnrp-port", {NULL}, 3540, "tcp"}, -{"pnrp-port", {NULL}, 3540, "udp"}, -{"voispeed-port", {NULL}, 3541, "tcp"}, -{"voispeed-port", {NULL}, 3541, "udp"}, -{"hacl-monitor", {NULL}, 3542, "tcp"}, -{"hacl-monitor", {NULL}, 3542, "udp"}, -{"qftest-lookup", {NULL}, 3543, "tcp"}, -{"qftest-lookup", {NULL}, 3543, "udp"}, -{"teredo", {NULL}, 3544, "tcp"}, -{"teredo", {NULL}, 3544, "udp"}, -{"camac", {NULL}, 3545, "tcp"}, -{"camac", {NULL}, 3545, "udp"}, -{"symantec-sim", {NULL}, 3547, "tcp"}, -{"symantec-sim", {NULL}, 3547, "udp"}, -{"interworld", {NULL}, 3548, "tcp"}, -{"interworld", {NULL}, 3548, "udp"}, -{"tellumat-nms", {NULL}, 3549, "tcp"}, -{"tellumat-nms", {NULL}, 3549, "udp"}, -{"ssmpp", {NULL}, 3550, "tcp"}, -{"ssmpp", {NULL}, 3550, "udp"}, -{"apcupsd", {NULL}, 3551, "tcp"}, -{"apcupsd", {NULL}, 3551, "udp"}, -{"taserver", {NULL}, 3552, "tcp"}, -{"taserver", {NULL}, 3552, "udp"}, -{"rbr-discovery", {NULL}, 3553, "tcp"}, -{"rbr-discovery", {NULL}, 3553, "udp"}, -{"questnotify", {NULL}, 3554, "tcp"}, -{"questnotify", {NULL}, 3554, "udp"}, -{"razor", {NULL}, 3555, "tcp"}, -{"razor", {NULL}, 3555, "udp"}, -{"sky-transport", {NULL}, 3556, "tcp"}, -{"sky-transport", {NULL}, 3556, "udp"}, -{"personalos-001", {NULL}, 3557, "tcp"}, -{"personalos-001", {NULL}, 3557, "udp"}, -{"mcp-port", {NULL}, 3558, "tcp"}, -{"mcp-port", {NULL}, 3558, "udp"}, -{"cctv-port", {NULL}, 3559, "tcp"}, -{"cctv-port", {NULL}, 3559, "udp"}, -{"iniserve-port", {NULL}, 3560, "tcp"}, -{"iniserve-port", {NULL}, 3560, "udp"}, -{"bmc-onekey", {NULL}, 3561, "tcp"}, -{"bmc-onekey", {NULL}, 3561, "udp"}, -{"sdbproxy", {NULL}, 3562, "tcp"}, -{"sdbproxy", {NULL}, 3562, "udp"}, -{"watcomdebug", {NULL}, 3563, "tcp"}, -{"watcomdebug", {NULL}, 3563, "udp"}, -{"esimport", {NULL}, 3564, "tcp"}, -{"esimport", {NULL}, 3564, "udp"}, -{"m2pa", {NULL}, 3565, "tcp"}, -{"m2pa", {NULL}, 3565, "sctp"}, -{"quest-data-hub", {NULL}, 3566, "tcp"}, -{"oap", {NULL}, 3567, "tcp"}, -{"oap", {NULL}, 3567, "udp"}, -{"oap-s", {NULL}, 3568, "tcp"}, -{"oap-s", {NULL}, 3568, "udp"}, -{"mbg-ctrl", {NULL}, 3569, "tcp"}, -{"mbg-ctrl", {NULL}, 3569, "udp"}, -{"mccwebsvr-port", {NULL}, 3570, "tcp"}, -{"mccwebsvr-port", {NULL}, 3570, "udp"}, -{"megardsvr-port", {NULL}, 3571, "tcp"}, -{"megardsvr-port", {NULL}, 3571, "udp"}, -{"megaregsvrport", {NULL}, 3572, "tcp"}, -{"megaregsvrport", {NULL}, 3572, "udp"}, -{"tag-ups-1", {NULL}, 3573, "tcp"}, -{"tag-ups-1", {NULL}, 3573, "udp"}, -{"dmaf-server", {NULL}, 3574, "tcp"}, -{"dmaf-caster", {NULL}, 3574, "udp"}, -{"ccm-port", {NULL}, 3575, "tcp"}, -{"ccm-port", {NULL}, 3575, "udp"}, -{"cmc-port", {NULL}, 3576, "tcp"}, -{"cmc-port", {NULL}, 3576, "udp"}, -{"config-port", {NULL}, 3577, "tcp"}, -{"config-port", {NULL}, 3577, "udp"}, -{"data-port", {NULL}, 3578, "tcp"}, -{"data-port", {NULL}, 3578, "udp"}, -{"ttat3lb", {NULL}, 3579, "tcp"}, -{"ttat3lb", {NULL}, 3579, "udp"}, -{"nati-svrloc", {NULL}, 3580, "tcp"}, -{"nati-svrloc", {NULL}, 3580, "udp"}, -{"kfxaclicensing", {NULL}, 3581, "tcp"}, -{"kfxaclicensing", {NULL}, 3581, "udp"}, -{"press", {NULL}, 3582, "tcp"}, -{"press", {NULL}, 3582, "udp"}, -{"canex-watch", {NULL}, 3583, "tcp"}, -{"canex-watch", {NULL}, 3583, "udp"}, -{"u-dbap", {NULL}, 3584, "tcp"}, -{"u-dbap", {NULL}, 3584, "udp"}, -{"emprise-lls", {NULL}, 3585, "tcp"}, -{"emprise-lls", {NULL}, 3585, "udp"}, -{"emprise-lsc", {NULL}, 3586, "tcp"}, -{"emprise-lsc", {NULL}, 3586, "udp"}, -{"p2pgroup", {NULL}, 3587, "tcp"}, -{"p2pgroup", {NULL}, 3587, "udp"}, -{"sentinel", {NULL}, 3588, "tcp"}, -{"sentinel", {NULL}, 3588, "udp"}, -{"isomair", {NULL}, 3589, "tcp"}, -{"isomair", {NULL}, 3589, "udp"}, -{"wv-csp-sms", {NULL}, 3590, "tcp"}, -{"wv-csp-sms", {NULL}, 3590, "udp"}, -{"gtrack-server", {NULL}, 3591, "tcp"}, -{"gtrack-server", {NULL}, 3591, "udp"}, -{"gtrack-ne", {NULL}, 3592, "tcp"}, -{"gtrack-ne", {NULL}, 3592, "udp"}, -{"bpmd", {NULL}, 3593, "tcp"}, -{"bpmd", {NULL}, 3593, "udp"}, -{"mediaspace", {NULL}, 3594, "tcp"}, -{"mediaspace", {NULL}, 3594, "udp"}, -{"shareapp", {NULL}, 3595, "tcp"}, -{"shareapp", {NULL}, 3595, "udp"}, -{"iw-mmogame", {NULL}, 3596, "tcp"}, -{"iw-mmogame", {NULL}, 3596, "udp"}, -{"a14", {NULL}, 3597, "tcp"}, -{"a14", {NULL}, 3597, "udp"}, -{"a15", {NULL}, 3598, "tcp"}, -{"a15", {NULL}, 3598, "udp"}, -{"quasar-server", {NULL}, 3599, "tcp"}, -{"quasar-server", {NULL}, 3599, "udp"}, -{"trap-daemon", {NULL}, 3600, "tcp"}, -{"trap-daemon", {NULL}, 3600, "udp"}, -{"visinet-gui", {NULL}, 3601, "tcp"}, -{"visinet-gui", {NULL}, 3601, "udp"}, -{"infiniswitchcl", {NULL}, 3602, "tcp"}, -{"infiniswitchcl", {NULL}, 3602, "udp"}, -{"int-rcv-cntrl", {NULL}, 3603, "tcp"}, -{"int-rcv-cntrl", {NULL}, 3603, "udp"}, -{"bmc-jmx-port", {NULL}, 3604, "tcp"}, -{"bmc-jmx-port", {NULL}, 3604, "udp"}, -{"comcam-io", {NULL}, 3605, "tcp"}, -{"comcam-io", {NULL}, 3605, "udp"}, -{"splitlock", {NULL}, 3606, "tcp"}, -{"splitlock", {NULL}, 3606, "udp"}, -{"precise-i3", {NULL}, 3607, "tcp"}, -{"precise-i3", {NULL}, 3607, "udp"}, -{"trendchip-dcp", {NULL}, 3608, "tcp"}, -{"trendchip-dcp", {NULL}, 3608, "udp"}, -{"cpdi-pidas-cm", {NULL}, 3609, "tcp"}, -{"cpdi-pidas-cm", {NULL}, 3609, "udp"}, -{"echonet", {NULL}, 3610, "tcp"}, -{"echonet", {NULL}, 3610, "udp"}, -{"six-degrees", {NULL}, 3611, "tcp"}, -{"six-degrees", {NULL}, 3611, "udp"}, -{"hp-dataprotect", {NULL}, 3612, "tcp"}, -{"hp-dataprotect", {NULL}, 3612, "udp"}, -{"alaris-disc", {NULL}, 3613, "tcp"}, -{"alaris-disc", {NULL}, 3613, "udp"}, -{"sigma-port", {NULL}, 3614, "tcp"}, -{"sigma-port", {NULL}, 3614, "udp"}, -{"start-network", {NULL}, 3615, "tcp"}, -{"start-network", {NULL}, 3615, "udp"}, -{"cd3o-protocol", {NULL}, 3616, "tcp"}, -{"cd3o-protocol", {NULL}, 3616, "udp"}, -{"sharp-server", {NULL}, 3617, "tcp"}, -{"sharp-server", {NULL}, 3617, "udp"}, -{"aairnet-1", {NULL}, 3618, "tcp"}, -{"aairnet-1", {NULL}, 3618, "udp"}, -{"aairnet-2", {NULL}, 3619, "tcp"}, -{"aairnet-2", {NULL}, 3619, "udp"}, -{"ep-pcp", {NULL}, 3620, "tcp"}, -{"ep-pcp", {NULL}, 3620, "udp"}, -{"ep-nsp", {NULL}, 3621, "tcp"}, -{"ep-nsp", {NULL}, 3621, "udp"}, -{"ff-lr-port", {NULL}, 3622, "tcp"}, -{"ff-lr-port", {NULL}, 3622, "udp"}, -{"haipe-discover", {NULL}, 3623, "tcp"}, -{"haipe-discover", {NULL}, 3623, "udp"}, -{"dist-upgrade", {NULL}, 3624, "tcp"}, -{"dist-upgrade", {NULL}, 3624, "udp"}, -{"volley", {NULL}, 3625, "tcp"}, -{"volley", {NULL}, 3625, "udp"}, -{"bvcdaemon-port", {NULL}, 3626, "tcp"}, -{"bvcdaemon-port", {NULL}, 3626, "udp"}, -{"jamserverport", {NULL}, 3627, "tcp"}, -{"jamserverport", {NULL}, 3627, "udp"}, -{"ept-machine", {NULL}, 3628, "tcp"}, -{"ept-machine", {NULL}, 3628, "udp"}, -{"escvpnet", {NULL}, 3629, "tcp"}, -{"escvpnet", {NULL}, 3629, "udp"}, -{"cs-remote-db", {NULL}, 3630, "tcp"}, -{"cs-remote-db", {NULL}, 3630, "udp"}, -{"cs-services", {NULL}, 3631, "tcp"}, -{"cs-services", {NULL}, 3631, "udp"}, -{"distcc", {NULL}, 3632, "tcp"}, -{"distcc", {NULL}, 3632, "udp"}, -{"wacp", {NULL}, 3633, "tcp"}, -{"wacp", {NULL}, 3633, "udp"}, -{"hlibmgr", {NULL}, 3634, "tcp"}, -{"hlibmgr", {NULL}, 3634, "udp"}, -{"sdo", {NULL}, 3635, "tcp"}, -{"sdo", {NULL}, 3635, "udp"}, -{"servistaitsm", {NULL}, 3636, "tcp"}, -{"servistaitsm", {NULL}, 3636, "udp"}, -{"scservp", {NULL}, 3637, "tcp"}, -{"scservp", {NULL}, 3637, "udp"}, -{"ehp-backup", {NULL}, 3638, "tcp"}, -{"ehp-backup", {NULL}, 3638, "udp"}, -{"xap-ha", {NULL}, 3639, "tcp"}, -{"xap-ha", {NULL}, 3639, "udp"}, -{"netplay-port1", {NULL}, 3640, "tcp"}, -{"netplay-port1", {NULL}, 3640, "udp"}, -{"netplay-port2", {NULL}, 3641, "tcp"}, -{"netplay-port2", {NULL}, 3641, "udp"}, -{"juxml-port", {NULL}, 3642, "tcp"}, -{"juxml-port", {NULL}, 3642, "udp"}, -{"audiojuggler", {NULL}, 3643, "tcp"}, -{"audiojuggler", {NULL}, 3643, "udp"}, -{"ssowatch", {NULL}, 3644, "tcp"}, -{"ssowatch", {NULL}, 3644, "udp"}, -{"cyc", {NULL}, 3645, "tcp"}, -{"cyc", {NULL}, 3645, "udp"}, -{"xss-srv-port", {NULL}, 3646, "tcp"}, -{"xss-srv-port", {NULL}, 3646, "udp"}, -{"splitlock-gw", {NULL}, 3647, "tcp"}, -{"splitlock-gw", {NULL}, 3647, "udp"}, -{"fjcp", {NULL}, 3648, "tcp"}, -{"fjcp", {NULL}, 3648, "udp"}, -{"nmmp", {NULL}, 3649, "tcp"}, -{"nmmp", {NULL}, 3649, "udp"}, -{"prismiq-plugin", {NULL}, 3650, "tcp"}, -{"prismiq-plugin", {NULL}, 3650, "udp"}, -{"xrpc-registry", {NULL}, 3651, "tcp"}, -{"xrpc-registry", {NULL}, 3651, "udp"}, -{"vxcrnbuport", {NULL}, 3652, "tcp"}, -{"vxcrnbuport", {NULL}, 3652, "udp"}, -{"tsp", {NULL}, 3653, "tcp"}, -{"tsp", {NULL}, 3653, "udp"}, -{"vaprtm", {NULL}, 3654, "tcp"}, -{"vaprtm", {NULL}, 3654, "udp"}, -{"abatemgr", {NULL}, 3655, "tcp"}, -{"abatemgr", {NULL}, 3655, "udp"}, -{"abatjss", {NULL}, 3656, "tcp"}, -{"abatjss", {NULL}, 3656, "udp"}, -{"immedianet-bcn", {NULL}, 3657, "tcp"}, -{"immedianet-bcn", {NULL}, 3657, "udp"}, -{"ps-ams", {NULL}, 3658, "tcp"}, -{"ps-ams", {NULL}, 3658, "udp"}, -{"apple-sasl", {NULL}, 3659, "tcp"}, -{"apple-sasl", {NULL}, 3659, "udp"}, -{"can-nds-ssl", {NULL}, 3660, "tcp"}, -{"can-nds-ssl", {NULL}, 3660, "udp"}, -{"can-ferret-ssl", {NULL}, 3661, "tcp"}, -{"can-ferret-ssl", {NULL}, 3661, "udp"}, -{"pserver", {NULL}, 3662, "tcp"}, -{"pserver", {NULL}, 3662, "udp"}, -{"dtp", {NULL}, 3663, "tcp"}, -{"dtp", {NULL}, 3663, "udp"}, -{"ups-engine", {NULL}, 3664, "tcp"}, -{"ups-engine", {NULL}, 3664, "udp"}, -{"ent-engine", {NULL}, 3665, "tcp"}, -{"ent-engine", {NULL}, 3665, "udp"}, -{"eserver-pap", {NULL}, 3666, "tcp"}, -{"eserver-pap", {NULL}, 3666, "udp"}, -{"infoexch", {NULL}, 3667, "tcp"}, -{"infoexch", {NULL}, 3667, "udp"}, -{"dell-rm-port", {NULL}, 3668, "tcp"}, -{"dell-rm-port", {NULL}, 3668, "udp"}, -{"casanswmgmt", {NULL}, 3669, "tcp"}, -{"casanswmgmt", {NULL}, 3669, "udp"}, -{"smile", {NULL}, 3670, "tcp"}, -{"smile", {NULL}, 3670, "udp"}, -{"efcp", {NULL}, 3671, "tcp"}, -{"efcp", {NULL}, 3671, "udp"}, -{"lispworks-orb", {NULL}, 3672, "tcp"}, -{"lispworks-orb", {NULL}, 3672, "udp"}, -{"mediavault-gui", {NULL}, 3673, "tcp"}, -{"mediavault-gui", {NULL}, 3673, "udp"}, -{"wininstall-ipc", {NULL}, 3674, "tcp"}, -{"wininstall-ipc", {NULL}, 3674, "udp"}, -{"calltrax", {NULL}, 3675, "tcp"}, -{"calltrax", {NULL}, 3675, "udp"}, -{"va-pacbase", {NULL}, 3676, "tcp"}, -{"va-pacbase", {NULL}, 3676, "udp"}, -{"roverlog", {NULL}, 3677, "tcp"}, -{"roverlog", {NULL}, 3677, "udp"}, -{"ipr-dglt", {NULL}, 3678, "tcp"}, -{"ipr-dglt", {NULL}, 3678, "udp"}, -{"newton-dock", {NULL}, 3679, "tcp"}, -{"newton-dock", {NULL}, 3679, "udp"}, -{"npds-tracker", {NULL}, 3680, "tcp"}, -{"npds-tracker", {NULL}, 3680, "udp"}, -{"bts-x73", {NULL}, 3681, "tcp"}, -{"bts-x73", {NULL}, 3681, "udp"}, -{"cas-mapi", {NULL}, 3682, "tcp"}, -{"cas-mapi", {NULL}, 3682, "udp"}, -{"bmc-ea", {NULL}, 3683, "tcp"}, -{"bmc-ea", {NULL}, 3683, "udp"}, -{"faxstfx-port", {NULL}, 3684, "tcp"}, -{"faxstfx-port", {NULL}, 3684, "udp"}, -{"dsx-agent", {NULL}, 3685, "tcp"}, -{"dsx-agent", {NULL}, 3685, "udp"}, -{"tnmpv2", {NULL}, 3686, "tcp"}, -{"tnmpv2", {NULL}, 3686, "udp"}, -{"simple-push", {NULL}, 3687, "tcp"}, -{"simple-push", {NULL}, 3687, "udp"}, -{"simple-push-s", {NULL}, 3688, "tcp"}, -{"simple-push-s", {NULL}, 3688, "udp"}, -{"daap", {NULL}, 3689, "tcp"}, -{"daap", {NULL}, 3689, "udp"}, -{"svn", {NULL}, 3690, "tcp"}, -{"svn", {NULL}, 3690, "udp"}, -{"magaya-network", {NULL}, 3691, "tcp"}, -{"magaya-network", {NULL}, 3691, "udp"}, -{"intelsync", {NULL}, 3692, "tcp"}, -{"intelsync", {NULL}, 3692, "udp"}, -{"bmc-data-coll", {NULL}, 3695, "tcp"}, -{"bmc-data-coll", {NULL}, 3695, "udp"}, -{"telnetcpcd", {NULL}, 3696, "tcp"}, -{"telnetcpcd", {NULL}, 3696, "udp"}, -{"nw-license", {NULL}, 3697, "tcp"}, -{"nw-license", {NULL}, 3697, "udp"}, -{"sagectlpanel", {NULL}, 3698, "tcp"}, -{"sagectlpanel", {NULL}, 3698, "udp"}, -{"kpn-icw", {NULL}, 3699, "tcp"}, -{"kpn-icw", {NULL}, 3699, "udp"}, -{"lrs-paging", {NULL}, 3700, "tcp"}, -{"lrs-paging", {NULL}, 3700, "udp"}, -{"netcelera", {NULL}, 3701, "tcp"}, -{"netcelera", {NULL}, 3701, "udp"}, -{"ws-discovery", {NULL}, 3702, "tcp"}, -{"ws-discovery", {NULL}, 3702, "udp"}, -{"adobeserver-3", {NULL}, 3703, "tcp"}, -{"adobeserver-3", {NULL}, 3703, "udp"}, -{"adobeserver-4", {NULL}, 3704, "tcp"}, -{"adobeserver-4", {NULL}, 3704, "udp"}, -{"adobeserver-5", {NULL}, 3705, "tcp"}, -{"adobeserver-5", {NULL}, 3705, "udp"}, -{"rt-event", {NULL}, 3706, "tcp"}, -{"rt-event", {NULL}, 3706, "udp"}, -{"rt-event-s", {NULL}, 3707, "tcp"}, -{"rt-event-s", {NULL}, 3707, "udp"}, -{"sun-as-iiops", {NULL}, 3708, "tcp"}, -{"sun-as-iiops", {NULL}, 3708, "udp"}, -{"ca-idms", {NULL}, 3709, "tcp"}, -{"ca-idms", {NULL}, 3709, "udp"}, -{"portgate-auth", {NULL}, 3710, "tcp"}, -{"portgate-auth", {NULL}, 3710, "udp"}, -{"edb-server2", {NULL}, 3711, "tcp"}, -{"edb-server2", {NULL}, 3711, "udp"}, -{"sentinel-ent", {NULL}, 3712, "tcp"}, -{"sentinel-ent", {NULL}, 3712, "udp"}, -{"tftps", {NULL}, 3713, "tcp"}, -{"tftps", {NULL}, 3713, "udp"}, -{"delos-dms", {NULL}, 3714, "tcp"}, -{"delos-dms", {NULL}, 3714, "udp"}, -{"anoto-rendezv", {NULL}, 3715, "tcp"}, -{"anoto-rendezv", {NULL}, 3715, "udp"}, -{"wv-csp-sms-cir", {NULL}, 3716, "tcp"}, -{"wv-csp-sms-cir", {NULL}, 3716, "udp"}, -{"wv-csp-udp-cir", {NULL}, 3717, "tcp"}, -{"wv-csp-udp-cir", {NULL}, 3717, "udp"}, -{"opus-services", {NULL}, 3718, "tcp"}, -{"opus-services", {NULL}, 3718, "udp"}, -{"itelserverport", {NULL}, 3719, "tcp"}, -{"itelserverport", {NULL}, 3719, "udp"}, -{"ufastro-instr", {NULL}, 3720, "tcp"}, -{"ufastro-instr", {NULL}, 3720, "udp"}, -{"xsync", {NULL}, 3721, "tcp"}, -{"xsync", {NULL}, 3721, "udp"}, -{"xserveraid", {NULL}, 3722, "tcp"}, -{"xserveraid", {NULL}, 3722, "udp"}, -{"sychrond", {NULL}, 3723, "tcp"}, -{"sychrond", {NULL}, 3723, "udp"}, -{"blizwow", {NULL}, 3724, "tcp"}, -{"blizwow", {NULL}, 3724, "udp"}, -{"na-er-tip", {NULL}, 3725, "tcp"}, -{"na-er-tip", {NULL}, 3725, "udp"}, -{"array-manager", {NULL}, 3726, "tcp"}, -{"array-manager", {NULL}, 3726, "udp"}, -{"e-mdu", {NULL}, 3727, "tcp"}, -{"e-mdu", {NULL}, 3727, "udp"}, -{"e-woa", {NULL}, 3728, "tcp"}, -{"e-woa", {NULL}, 3728, "udp"}, -{"fksp-audit", {NULL}, 3729, "tcp"}, -{"fksp-audit", {NULL}, 3729, "udp"}, -{"client-ctrl", {NULL}, 3730, "tcp"}, -{"client-ctrl", {NULL}, 3730, "udp"}, -{"smap", {NULL}, 3731, "tcp"}, -{"smap", {NULL}, 3731, "udp"}, -{"m-wnn", {NULL}, 3732, "tcp"}, -{"m-wnn", {NULL}, 3732, "udp"}, -{"multip-msg", {NULL}, 3733, "tcp"}, -{"multip-msg", {NULL}, 3733, "udp"}, -{"synel-data", {NULL}, 3734, "tcp"}, -{"synel-data", {NULL}, 3734, "udp"}, -{"pwdis", {NULL}, 3735, "tcp"}, -{"pwdis", {NULL}, 3735, "udp"}, -{"rs-rmi", {NULL}, 3736, "tcp"}, -{"rs-rmi", {NULL}, 3736, "udp"}, -{"xpanel", {NULL}, 3737, "tcp"}, -{"versatalk", {NULL}, 3738, "tcp"}, -{"versatalk", {NULL}, 3738, "udp"}, -{"launchbird-lm", {NULL}, 3739, "tcp"}, -{"launchbird-lm", {NULL}, 3739, "udp"}, -{"heartbeat", {NULL}, 3740, "tcp"}, -{"heartbeat", {NULL}, 3740, "udp"}, -{"wysdma", {NULL}, 3741, "tcp"}, -{"wysdma", {NULL}, 3741, "udp"}, -{"cst-port", {NULL}, 3742, "tcp"}, -{"cst-port", {NULL}, 3742, "udp"}, -{"ipcs-command", {NULL}, 3743, "tcp"}, -{"ipcs-command", {NULL}, 3743, "udp"}, -{"sasg", {NULL}, 3744, "tcp"}, -{"sasg", {NULL}, 3744, "udp"}, -{"gw-call-port", {NULL}, 3745, "tcp"}, -{"gw-call-port", {NULL}, 3745, "udp"}, -{"linktest", {NULL}, 3746, "tcp"}, -{"linktest", {NULL}, 3746, "udp"}, -{"linktest-s", {NULL}, 3747, "tcp"}, -{"linktest-s", {NULL}, 3747, "udp"}, -{"webdata", {NULL}, 3748, "tcp"}, -{"webdata", {NULL}, 3748, "udp"}, -{"cimtrak", {NULL}, 3749, "tcp"}, -{"cimtrak", {NULL}, 3749, "udp"}, -{"cbos-ip-port", {NULL}, 3750, "tcp"}, -{"cbos-ip-port", {NULL}, 3750, "udp"}, -{"gprs-cube", {NULL}, 3751, "tcp"}, -{"gprs-cube", {NULL}, 3751, "udp"}, -{"vipremoteagent", {NULL}, 3752, "tcp"}, -{"vipremoteagent", {NULL}, 3752, "udp"}, -{"nattyserver", {NULL}, 3753, "tcp"}, -{"nattyserver", {NULL}, 3753, "udp"}, -{"timestenbroker", {NULL}, 3754, "tcp"}, -{"timestenbroker", {NULL}, 3754, "udp"}, -{"sas-remote-hlp", {NULL}, 3755, "tcp"}, -{"sas-remote-hlp", {NULL}, 3755, "udp"}, -{"canon-capt", {NULL}, 3756, "tcp"}, -{"canon-capt", {NULL}, 3756, "udp"}, -{"grf-port", {NULL}, 3757, "tcp"}, -{"grf-port", {NULL}, 3757, "udp"}, -{"apw-registry", {NULL}, 3758, "tcp"}, -{"apw-registry", {NULL}, 3758, "udp"}, -{"exapt-lmgr", {NULL}, 3759, "tcp"}, -{"exapt-lmgr", {NULL}, 3759, "udp"}, -{"adtempusclient", {NULL}, 3760, "tcp"}, -{"adtempusclient", {NULL}, 3760, "udp"}, -{"gsakmp", {NULL}, 3761, "tcp"}, -{"gsakmp", {NULL}, 3761, "udp"}, -{"gbs-smp", {NULL}, 3762, "tcp"}, -{"gbs-smp", {NULL}, 3762, "udp"}, -{"xo-wave", {NULL}, 3763, "tcp"}, -{"xo-wave", {NULL}, 3763, "udp"}, -{"mni-prot-rout", {NULL}, 3764, "tcp"}, -{"mni-prot-rout", {NULL}, 3764, "udp"}, -{"rtraceroute", {NULL}, 3765, "tcp"}, -{"rtraceroute", {NULL}, 3765, "udp"}, -{"listmgr-port", {NULL}, 3767, "tcp"}, -{"listmgr-port", {NULL}, 3767, "udp"}, -{"rblcheckd", {NULL}, 3768, "tcp"}, -{"rblcheckd", {NULL}, 3768, "udp"}, -{"haipe-otnk", {NULL}, 3769, "tcp"}, -{"haipe-otnk", {NULL}, 3769, "udp"}, -{"cindycollab", {NULL}, 3770, "tcp"}, -{"cindycollab", {NULL}, 3770, "udp"}, -{"paging-port", {NULL}, 3771, "tcp"}, -{"paging-port", {NULL}, 3771, "udp"}, -{"ctp", {NULL}, 3772, "tcp"}, -{"ctp", {NULL}, 3772, "udp"}, -{"ctdhercules", {NULL}, 3773, "tcp"}, -{"ctdhercules", {NULL}, 3773, "udp"}, -{"zicom", {NULL}, 3774, "tcp"}, -{"zicom", {NULL}, 3774, "udp"}, -{"ispmmgr", {NULL}, 3775, "tcp"}, -{"ispmmgr", {NULL}, 3775, "udp"}, -{"dvcprov-port", {NULL}, 3776, "tcp"}, -{"dvcprov-port", {NULL}, 3776, "udp"}, -{"jibe-eb", {NULL}, 3777, "tcp"}, -{"jibe-eb", {NULL}, 3777, "udp"}, -{"c-h-it-port", {NULL}, 3778, "tcp"}, -{"c-h-it-port", {NULL}, 3778, "udp"}, -{"cognima", {NULL}, 3779, "tcp"}, -{"cognima", {NULL}, 3779, "udp"}, -{"nnp", {NULL}, 3780, "tcp"}, -{"nnp", {NULL}, 3780, "udp"}, -{"abcvoice-port", {NULL}, 3781, "tcp"}, -{"abcvoice-port", {NULL}, 3781, "udp"}, -{"iso-tp0s", {NULL}, 3782, "tcp"}, -{"iso-tp0s", {NULL}, 3782, "udp"}, -{"bim-pem", {NULL}, 3783, "tcp"}, -{"bim-pem", {NULL}, 3783, "udp"}, -{"bfd-control", {NULL}, 3784, "tcp"}, -{"bfd-control", {NULL}, 3784, "udp"}, -{"bfd-echo", {NULL}, 3785, "tcp"}, -{"bfd-echo", {NULL}, 3785, "udp"}, -{"upstriggervsw", {NULL}, 3786, "tcp"}, -{"upstriggervsw", {NULL}, 3786, "udp"}, -{"fintrx", {NULL}, 3787, "tcp"}, -{"fintrx", {NULL}, 3787, "udp"}, -{"isrp-port", {NULL}, 3788, "tcp"}, -{"isrp-port", {NULL}, 3788, "udp"}, -{"remotedeploy", {NULL}, 3789, "tcp"}, -{"remotedeploy", {NULL}, 3789, "udp"}, -{"quickbooksrds", {NULL}, 3790, "tcp"}, -{"quickbooksrds", {NULL}, 3790, "udp"}, -{"tvnetworkvideo", {NULL}, 3791, "tcp"}, -{"tvnetworkvideo", {NULL}, 3791, "udp"}, -{"sitewatch", {NULL}, 3792, "tcp"}, -{"sitewatch", {NULL}, 3792, "udp"}, -{"dcsoftware", {NULL}, 3793, "tcp"}, -{"dcsoftware", {NULL}, 3793, "udp"}, -{"jaus", {NULL}, 3794, "tcp"}, -{"jaus", {NULL}, 3794, "udp"}, -{"myblast", {NULL}, 3795, "tcp"}, -{"myblast", {NULL}, 3795, "udp"}, -{"spw-dialer", {NULL}, 3796, "tcp"}, -{"spw-dialer", {NULL}, 3796, "udp"}, -{"idps", {NULL}, 3797, "tcp"}, -{"idps", {NULL}, 3797, "udp"}, -{"minilock", {NULL}, 3798, "tcp"}, -{"minilock", {NULL}, 3798, "udp"}, -{"radius-dynauth", {NULL}, 3799, "tcp"}, -{"radius-dynauth", {NULL}, 3799, "udp"}, -{"pwgpsi", {NULL}, 3800, "tcp"}, -{"pwgpsi", {NULL}, 3800, "udp"}, -{"ibm-mgr", {NULL}, 3801, "tcp"}, -{"ibm-mgr", {NULL}, 3801, "udp"}, -{"vhd", {NULL}, 3802, "tcp"}, -{"vhd", {NULL}, 3802, "udp"}, -{"soniqsync", {NULL}, 3803, "tcp"}, -{"soniqsync", {NULL}, 3803, "udp"}, -{"iqnet-port", {NULL}, 3804, "tcp"}, -{"iqnet-port", {NULL}, 3804, "udp"}, -{"tcpdataserver", {NULL}, 3805, "tcp"}, -{"tcpdataserver", {NULL}, 3805, "udp"}, -{"wsmlb", {NULL}, 3806, "tcp"}, -{"wsmlb", {NULL}, 3806, "udp"}, -{"spugna", {NULL}, 3807, "tcp"}, -{"spugna", {NULL}, 3807, "udp"}, -{"sun-as-iiops-ca", {NULL}, 3808, "tcp"}, -{"sun-as-iiops-ca", {NULL}, 3808, "udp"}, -{"apocd", {NULL}, 3809, "tcp"}, -{"apocd", {NULL}, 3809, "udp"}, -{"wlanauth", {NULL}, 3810, "tcp"}, -{"wlanauth", {NULL}, 3810, "udp"}, -{"amp", {NULL}, 3811, "tcp"}, -{"amp", {NULL}, 3811, "udp"}, -{"neto-wol-server", {NULL}, 3812, "tcp"}, -{"neto-wol-server", {NULL}, 3812, "udp"}, -{"rap-ip", {NULL}, 3813, "tcp"}, -{"rap-ip", {NULL}, 3813, "udp"}, -{"neto-dcs", {NULL}, 3814, "tcp"}, -{"neto-dcs", {NULL}, 3814, "udp"}, -{"lansurveyorxml", {NULL}, 3815, "tcp"}, -{"lansurveyorxml", {NULL}, 3815, "udp"}, -{"sunlps-http", {NULL}, 3816, "tcp"}, -{"sunlps-http", {NULL}, 3816, "udp"}, -{"tapeware", {NULL}, 3817, "tcp"}, -{"tapeware", {NULL}, 3817, "udp"}, -{"crinis-hb", {NULL}, 3818, "tcp"}, -{"crinis-hb", {NULL}, 3818, "udp"}, -{"epl-slp", {NULL}, 3819, "tcp"}, -{"epl-slp", {NULL}, 3819, "udp"}, -{"scp", {NULL}, 3820, "tcp"}, -{"scp", {NULL}, 3820, "udp"}, -{"pmcp", {NULL}, 3821, "tcp"}, -{"pmcp", {NULL}, 3821, "udp"}, -{"acp-discovery", {NULL}, 3822, "tcp"}, -{"acp-discovery", {NULL}, 3822, "udp"}, -{"acp-conduit", {NULL}, 3823, "tcp"}, -{"acp-conduit", {NULL}, 3823, "udp"}, -{"acp-policy", {NULL}, 3824, "tcp"}, -{"acp-policy", {NULL}, 3824, "udp"}, -{"ffserver", {NULL}, 3825, "tcp"}, -{"ffserver", {NULL}, 3825, "udp"}, -{"wormux", {NULL}, 3826, "tcp"}, -{"wormux", {NULL}, 3826, "udp"}, -{"netmpi", {NULL}, 3827, "tcp"}, -{"netmpi", {NULL}, 3827, "udp"}, -{"neteh", {NULL}, 3828, "tcp"}, -{"neteh", {NULL}, 3828, "udp"}, -{"neteh-ext", {NULL}, 3829, "tcp"}, -{"neteh-ext", {NULL}, 3829, "udp"}, -{"cernsysmgmtagt", {NULL}, 3830, "tcp"}, -{"cernsysmgmtagt", {NULL}, 3830, "udp"}, -{"dvapps", {NULL}, 3831, "tcp"}, -{"dvapps", {NULL}, 3831, "udp"}, -{"xxnetserver", {NULL}, 3832, "tcp"}, -{"xxnetserver", {NULL}, 3832, "udp"}, -{"aipn-auth", {NULL}, 3833, "tcp"}, -{"aipn-auth", {NULL}, 3833, "udp"}, -{"spectardata", {NULL}, 3834, "tcp"}, -{"spectardata", {NULL}, 3834, "udp"}, -{"spectardb", {NULL}, 3835, "tcp"}, -{"spectardb", {NULL}, 3835, "udp"}, -{"markem-dcp", {NULL}, 3836, "tcp"}, -{"markem-dcp", {NULL}, 3836, "udp"}, -{"mkm-discovery", {NULL}, 3837, "tcp"}, -{"mkm-discovery", {NULL}, 3837, "udp"}, -{"sos", {NULL}, 3838, "tcp"}, -{"sos", {NULL}, 3838, "udp"}, -{"amx-rms", {NULL}, 3839, "tcp"}, -{"amx-rms", {NULL}, 3839, "udp"}, -{"flirtmitmir", {NULL}, 3840, "tcp"}, -{"flirtmitmir", {NULL}, 3840, "udp"}, -{"zfirm-shiprush3", {NULL}, 3841, "tcp"}, -{"zfirm-shiprush3", {NULL}, 3841, "udp"}, -{"nhci", {NULL}, 3842, "tcp"}, -{"nhci", {NULL}, 3842, "udp"}, -{"quest-agent", {NULL}, 3843, "tcp"}, -{"quest-agent", {NULL}, 3843, "udp"}, -{"rnm", {NULL}, 3844, "tcp"}, -{"rnm", {NULL}, 3844, "udp"}, -{"v-one-spp", {NULL}, 3845, "tcp"}, -{"v-one-spp", {NULL}, 3845, "udp"}, -{"an-pcp", {NULL}, 3846, "tcp"}, -{"an-pcp", {NULL}, 3846, "udp"}, -{"msfw-control", {NULL}, 3847, "tcp"}, -{"msfw-control", {NULL}, 3847, "udp"}, -{"item", {NULL}, 3848, "tcp"}, -{"item", {NULL}, 3848, "udp"}, -{"spw-dnspreload", {NULL}, 3849, "tcp"}, -{"spw-dnspreload", {NULL}, 3849, "udp"}, -{"qtms-bootstrap", {NULL}, 3850, "tcp"}, -{"qtms-bootstrap", {NULL}, 3850, "udp"}, -{"spectraport", {NULL}, 3851, "tcp"}, -{"spectraport", {NULL}, 3851, "udp"}, -{"sse-app-config", {NULL}, 3852, "tcp"}, -{"sse-app-config", {NULL}, 3852, "udp"}, -{"sscan", {NULL}, 3853, "tcp"}, -{"sscan", {NULL}, 3853, "udp"}, -{"stryker-com", {NULL}, 3854, "tcp"}, -{"stryker-com", {NULL}, 3854, "udp"}, -{"opentrac", {NULL}, 3855, "tcp"}, -{"opentrac", {NULL}, 3855, "udp"}, -{"informer", {NULL}, 3856, "tcp"}, -{"informer", {NULL}, 3856, "udp"}, -{"trap-port", {NULL}, 3857, "tcp"}, -{"trap-port", {NULL}, 3857, "udp"}, -{"trap-port-mom", {NULL}, 3858, "tcp"}, -{"trap-port-mom", {NULL}, 3858, "udp"}, -{"nav-port", {NULL}, 3859, "tcp"}, -{"nav-port", {NULL}, 3859, "udp"}, -{"sasp", {NULL}, 3860, "tcp"}, -{"sasp", {NULL}, 3860, "udp"}, -{"winshadow-hd", {NULL}, 3861, "tcp"}, -{"winshadow-hd", {NULL}, 3861, "udp"}, -{"giga-pocket", {NULL}, 3862, "tcp"}, -{"giga-pocket", {NULL}, 3862, "udp"}, -{"asap-tcp", {NULL}, 3863, "tcp"}, -{"asap-udp", {NULL}, 3863, "udp"}, -{"asap-sctp", {NULL}, 3863, "sctp"}, -{"asap-tcp-tls", {NULL}, 3864, "tcp"}, -{"asap-sctp-tls", {NULL}, 3864, "sctp"}, -{"xpl", {NULL}, 3865, "tcp"}, -{"xpl", {NULL}, 3865, "udp"}, -{"dzdaemon", {NULL}, 3866, "tcp"}, -{"dzdaemon", {NULL}, 3866, "udp"}, -{"dzoglserver", {NULL}, 3867, "tcp"}, -{"dzoglserver", {NULL}, 3867, "udp"}, -{"diameter", {NULL}, 3868, "tcp"}, -{"diameter", {NULL}, 3868, "sctp"}, -{"ovsam-mgmt", {NULL}, 3869, "tcp"}, -{"ovsam-mgmt", {NULL}, 3869, "udp"}, -{"ovsam-d-agent", {NULL}, 3870, "tcp"}, -{"ovsam-d-agent", {NULL}, 3870, "udp"}, -{"avocent-adsap", {NULL}, 3871, "tcp"}, -{"avocent-adsap", {NULL}, 3871, "udp"}, -{"oem-agent", {NULL}, 3872, "tcp"}, -{"oem-agent", {NULL}, 3872, "udp"}, -{"fagordnc", {NULL}, 3873, "tcp"}, -{"fagordnc", {NULL}, 3873, "udp"}, -{"sixxsconfig", {NULL}, 3874, "tcp"}, -{"sixxsconfig", {NULL}, 3874, "udp"}, -{"pnbscada", {NULL}, 3875, "tcp"}, -{"pnbscada", {NULL}, 3875, "udp"}, -{"dl_agent", {NULL}, 3876, "tcp"}, -{"dl_agent", {NULL}, 3876, "udp"}, -{"xmpcr-interface", {NULL}, 3877, "tcp"}, -{"xmpcr-interface", {NULL}, 3877, "udp"}, -{"fotogcad", {NULL}, 3878, "tcp"}, -{"fotogcad", {NULL}, 3878, "udp"}, -{"appss-lm", {NULL}, 3879, "tcp"}, -{"appss-lm", {NULL}, 3879, "udp"}, -{"igrs", {NULL}, 3880, "tcp"}, -{"igrs", {NULL}, 3880, "udp"}, -{"idac", {NULL}, 3881, "tcp"}, -{"idac", {NULL}, 3881, "udp"}, -{"msdts1", {NULL}, 3882, "tcp"}, -{"msdts1", {NULL}, 3882, "udp"}, -{"vrpn", {NULL}, 3883, "tcp"}, -{"vrpn", {NULL}, 3883, "udp"}, -{"softrack-meter", {NULL}, 3884, "tcp"}, -{"softrack-meter", {NULL}, 3884, "udp"}, -{"topflow-ssl", {NULL}, 3885, "tcp"}, -{"topflow-ssl", {NULL}, 3885, "udp"}, -{"nei-management", {NULL}, 3886, "tcp"}, -{"nei-management", {NULL}, 3886, "udp"}, -{"ciphire-data", {NULL}, 3887, "tcp"}, -{"ciphire-data", {NULL}, 3887, "udp"}, -{"ciphire-serv", {NULL}, 3888, "tcp"}, -{"ciphire-serv", {NULL}, 3888, "udp"}, -{"dandv-tester", {NULL}, 3889, "tcp"}, -{"dandv-tester", {NULL}, 3889, "udp"}, -{"ndsconnect", {NULL}, 3890, "tcp"}, -{"ndsconnect", {NULL}, 3890, "udp"}, -{"rtc-pm-port", {NULL}, 3891, "tcp"}, -{"rtc-pm-port", {NULL}, 3891, "udp"}, -{"pcc-image-port", {NULL}, 3892, "tcp"}, -{"pcc-image-port", {NULL}, 3892, "udp"}, -{"cgi-starapi", {NULL}, 3893, "tcp"}, -{"cgi-starapi", {NULL}, 3893, "udp"}, -{"syam-agent", {NULL}, 3894, "tcp"}, -{"syam-agent", {NULL}, 3894, "udp"}, -{"syam-smc", {NULL}, 3895, "tcp"}, -{"syam-smc", {NULL}, 3895, "udp"}, -{"sdo-tls", {NULL}, 3896, "tcp"}, -{"sdo-tls", {NULL}, 3896, "udp"}, -{"sdo-ssh", {NULL}, 3897, "tcp"}, -{"sdo-ssh", {NULL}, 3897, "udp"}, -{"senip", {NULL}, 3898, "tcp"}, -{"senip", {NULL}, 3898, "udp"}, -{"itv-control", {NULL}, 3899, "tcp"}, -{"itv-control", {NULL}, 3899, "udp"}, -{"udt_os", {NULL}, 3900, "tcp"}, -{"udt_os", {NULL}, 3900, "udp"}, -{"nimsh", {NULL}, 3901, "tcp"}, -{"nimsh", {NULL}, 3901, "udp"}, -{"nimaux", {NULL}, 3902, "tcp"}, -{"nimaux", {NULL}, 3902, "udp"}, -{"charsetmgr", {NULL}, 3903, "tcp"}, -{"charsetmgr", {NULL}, 3903, "udp"}, -{"omnilink-port", {NULL}, 3904, "tcp"}, -{"omnilink-port", {NULL}, 3904, "udp"}, -{"mupdate", {NULL}, 3905, "tcp"}, -{"mupdate", {NULL}, 3905, "udp"}, -{"topovista-data", {NULL}, 3906, "tcp"}, -{"topovista-data", {NULL}, 3906, "udp"}, -{"imoguia-port", {NULL}, 3907, "tcp"}, -{"imoguia-port", {NULL}, 3907, "udp"}, -{"hppronetman", {NULL}, 3908, "tcp"}, -{"hppronetman", {NULL}, 3908, "udp"}, -{"surfcontrolcpa", {NULL}, 3909, "tcp"}, -{"surfcontrolcpa", {NULL}, 3909, "udp"}, -{"prnrequest", {NULL}, 3910, "tcp"}, -{"prnrequest", {NULL}, 3910, "udp"}, -{"prnstatus", {NULL}, 3911, "tcp"}, -{"prnstatus", {NULL}, 3911, "udp"}, -{"gbmt-stars", {NULL}, 3912, "tcp"}, -{"gbmt-stars", {NULL}, 3912, "udp"}, -{"listcrt-port", {NULL}, 3913, "tcp"}, -{"listcrt-port", {NULL}, 3913, "udp"}, -{"listcrt-port-2", {NULL}, 3914, "tcp"}, -{"listcrt-port-2", {NULL}, 3914, "udp"}, -{"agcat", {NULL}, 3915, "tcp"}, -{"agcat", {NULL}, 3915, "udp"}, -{"wysdmc", {NULL}, 3916, "tcp"}, -{"wysdmc", {NULL}, 3916, "udp"}, -{"aftmux", {NULL}, 3917, "tcp"}, -{"aftmux", {NULL}, 3917, "udp"}, -{"pktcablemmcops", {NULL}, 3918, "tcp"}, -{"pktcablemmcops", {NULL}, 3918, "udp"}, -{"hyperip", {NULL}, 3919, "tcp"}, -{"hyperip", {NULL}, 3919, "udp"}, -{"exasoftport1", {NULL}, 3920, "tcp"}, -{"exasoftport1", {NULL}, 3920, "udp"}, -{"herodotus-net", {NULL}, 3921, "tcp"}, -{"herodotus-net", {NULL}, 3921, "udp"}, -{"sor-update", {NULL}, 3922, "tcp"}, -{"sor-update", {NULL}, 3922, "udp"}, -{"symb-sb-port", {NULL}, 3923, "tcp"}, -{"symb-sb-port", {NULL}, 3923, "udp"}, -{"mpl-gprs-port", {NULL}, 3924, "tcp"}, -{"mpl-gprs-port", {NULL}, 3924, "udp"}, -{"zmp", {NULL}, 3925, "tcp"}, -{"zmp", {NULL}, 3925, "udp"}, -{"winport", {NULL}, 3926, "tcp"}, -{"winport", {NULL}, 3926, "udp"}, -{"natdataservice", {NULL}, 3927, "tcp"}, -{"natdataservice", {NULL}, 3927, "udp"}, -{"netboot-pxe", {NULL}, 3928, "tcp"}, -{"netboot-pxe", {NULL}, 3928, "udp"}, -{"smauth-port", {NULL}, 3929, "tcp"}, -{"smauth-port", {NULL}, 3929, "udp"}, -{"syam-webserver", {NULL}, 3930, "tcp"}, -{"syam-webserver", {NULL}, 3930, "udp"}, -{"msr-plugin-port", {NULL}, 3931, "tcp"}, -{"msr-plugin-port", {NULL}, 3931, "udp"}, -{"dyn-site", {NULL}, 3932, "tcp"}, -{"dyn-site", {NULL}, 3932, "udp"}, -{"plbserve-port", {NULL}, 3933, "tcp"}, -{"plbserve-port", {NULL}, 3933, "udp"}, -{"sunfm-port", {NULL}, 3934, "tcp"}, -{"sunfm-port", {NULL}, 3934, "udp"}, -{"sdp-portmapper", {NULL}, 3935, "tcp"}, -{"sdp-portmapper", {NULL}, 3935, "udp"}, -{"mailprox", {NULL}, 3936, "tcp"}, -{"mailprox", {NULL}, 3936, "udp"}, -{"dvbservdsc", {NULL}, 3937, "tcp"}, -{"dvbservdsc", {NULL}, 3937, "udp"}, -{"dbcontrol_agent", {NULL}, 3938, "tcp"}, -{"dbcontrol_agent", {NULL}, 3938, "udp"}, -{"aamp", {NULL}, 3939, "tcp"}, -{"aamp", {NULL}, 3939, "udp"}, -{"xecp-node", {NULL}, 3940, "tcp"}, -{"xecp-node", {NULL}, 3940, "udp"}, -{"homeportal-web", {NULL}, 3941, "tcp"}, -{"homeportal-web", {NULL}, 3941, "udp"}, -{"srdp", {NULL}, 3942, "tcp"}, -{"srdp", {NULL}, 3942, "udp"}, -{"tig", {NULL}, 3943, "tcp"}, -{"tig", {NULL}, 3943, "udp"}, -{"sops", {NULL}, 3944, "tcp"}, -{"sops", {NULL}, 3944, "udp"}, -{"emcads", {NULL}, 3945, "tcp"}, -{"emcads", {NULL}, 3945, "udp"}, -{"backupedge", {NULL}, 3946, "tcp"}, -{"backupedge", {NULL}, 3946, "udp"}, -{"ccp", {NULL}, 3947, "tcp"}, -{"ccp", {NULL}, 3947, "udp"}, -{"apdap", {NULL}, 3948, "tcp"}, -{"apdap", {NULL}, 3948, "udp"}, -{"drip", {NULL}, 3949, "tcp"}, -{"drip", {NULL}, 3949, "udp"}, -{"namemunge", {NULL}, 3950, "tcp"}, -{"namemunge", {NULL}, 3950, "udp"}, -{"pwgippfax", {NULL}, 3951, "tcp"}, -{"pwgippfax", {NULL}, 3951, "udp"}, -{"i3-sessionmgr", {NULL}, 3952, "tcp"}, -{"i3-sessionmgr", {NULL}, 3952, "udp"}, -{"xmlink-connect", {NULL}, 3953, "tcp"}, -{"xmlink-connect", {NULL}, 3953, "udp"}, -{"adrep", {NULL}, 3954, "tcp"}, -{"adrep", {NULL}, 3954, "udp"}, -{"p2pcommunity", {NULL}, 3955, "tcp"}, -{"p2pcommunity", {NULL}, 3955, "udp"}, -{"gvcp", {NULL}, 3956, "tcp"}, -{"gvcp", {NULL}, 3956, "udp"}, -{"mqe-broker", {NULL}, 3957, "tcp"}, -{"mqe-broker", {NULL}, 3957, "udp"}, -{"mqe-agent", {NULL}, 3958, "tcp"}, -{"mqe-agent", {NULL}, 3958, "udp"}, -{"treehopper", {NULL}, 3959, "tcp"}, -{"treehopper", {NULL}, 3959, "udp"}, -{"bess", {NULL}, 3960, "tcp"}, -{"bess", {NULL}, 3960, "udp"}, -{"proaxess", {NULL}, 3961, "tcp"}, -{"proaxess", {NULL}, 3961, "udp"}, -{"sbi-agent", {NULL}, 3962, "tcp"}, -{"sbi-agent", {NULL}, 3962, "udp"}, -{"thrp", {NULL}, 3963, "tcp"}, -{"thrp", {NULL}, 3963, "udp"}, -{"sasggprs", {NULL}, 3964, "tcp"}, -{"sasggprs", {NULL}, 3964, "udp"}, -{"ati-ip-to-ncpe", {NULL}, 3965, "tcp"}, -{"ati-ip-to-ncpe", {NULL}, 3965, "udp"}, -{"bflckmgr", {NULL}, 3966, "tcp"}, -{"bflckmgr", {NULL}, 3966, "udp"}, -{"ppsms", {NULL}, 3967, "tcp"}, -{"ppsms", {NULL}, 3967, "udp"}, -{"ianywhere-dbns", {NULL}, 3968, "tcp"}, -{"ianywhere-dbns", {NULL}, 3968, "udp"}, -{"landmarks", {NULL}, 3969, "tcp"}, -{"landmarks", {NULL}, 3969, "udp"}, -{"lanrevagent", {NULL}, 3970, "tcp"}, -{"lanrevagent", {NULL}, 3970, "udp"}, -{"lanrevserver", {NULL}, 3971, "tcp"}, -{"lanrevserver", {NULL}, 3971, "udp"}, -{"iconp", {NULL}, 3972, "tcp"}, -{"iconp", {NULL}, 3972, "udp"}, -{"progistics", {NULL}, 3973, "tcp"}, -{"progistics", {NULL}, 3973, "udp"}, -{"citysearch", {NULL}, 3974, "tcp"}, -{"citysearch", {NULL}, 3974, "udp"}, -{"airshot", {NULL}, 3975, "tcp"}, -{"airshot", {NULL}, 3975, "udp"}, -{"opswagent", {NULL}, 3976, "tcp"}, -{"opswagent", {NULL}, 3976, "udp"}, -{"opswmanager", {NULL}, 3977, "tcp"}, -{"opswmanager", {NULL}, 3977, "udp"}, -{"secure-cfg-svr", {NULL}, 3978, "tcp"}, -{"secure-cfg-svr", {NULL}, 3978, "udp"}, -{"smwan", {NULL}, 3979, "tcp"}, -{"smwan", {NULL}, 3979, "udp"}, -{"acms", {NULL}, 3980, "tcp"}, -{"acms", {NULL}, 3980, "udp"}, -{"starfish", {NULL}, 3981, "tcp"}, -{"starfish", {NULL}, 3981, "udp"}, -{"eis", {NULL}, 3982, "tcp"}, -{"eis", {NULL}, 3982, "udp"}, -{"eisp", {NULL}, 3983, "tcp"}, -{"eisp", {NULL}, 3983, "udp"}, -{"mapper-nodemgr", {NULL}, 3984, "tcp"}, -{"mapper-nodemgr", {NULL}, 3984, "udp"}, -{"mapper-mapethd", {NULL}, 3985, "tcp"}, -{"mapper-mapethd", {NULL}, 3985, "udp"}, -{"mapper-ws_ethd", {NULL}, 3986, "tcp"}, -{"mapper-ws_ethd", {NULL}, 3986, "udp"}, -{"centerline", {NULL}, 3987, "tcp"}, -{"centerline", {NULL}, 3987, "udp"}, -{"dcs-config", {NULL}, 3988, "tcp"}, -{"dcs-config", {NULL}, 3988, "udp"}, -{"bv-queryengine", {NULL}, 3989, "tcp"}, -{"bv-queryengine", {NULL}, 3989, "udp"}, -{"bv-is", {NULL}, 3990, "tcp"}, -{"bv-is", {NULL}, 3990, "udp"}, -{"bv-smcsrv", {NULL}, 3991, "tcp"}, -{"bv-smcsrv", {NULL}, 3991, "udp"}, -{"bv-ds", {NULL}, 3992, "tcp"}, -{"bv-ds", {NULL}, 3992, "udp"}, -{"bv-agent", {NULL}, 3993, "tcp"}, -{"bv-agent", {NULL}, 3993, "udp"}, -{"iss-mgmt-ssl", {NULL}, 3995, "tcp"}, -{"iss-mgmt-ssl", {NULL}, 3995, "udp"}, -{"abcsoftware", {NULL}, 3996, "tcp"}, -{"abcsoftware", {NULL}, 3996, "udp"}, -{"agentsease-db", {NULL}, 3997, "tcp"}, -{"agentsease-db", {NULL}, 3997, "udp"}, -{"dnx", {NULL}, 3998, "tcp"}, -{"dnx", {NULL}, 3998, "udp"}, -{"nvcnet", {NULL}, 3999, "tcp"}, -{"nvcnet", {NULL}, 3999, "udp"}, -{"terabase", {NULL}, 4000, "tcp"}, -{"terabase", {NULL}, 4000, "udp"}, -{"newoak", {NULL}, 4001, "tcp"}, -{"newoak", {NULL}, 4001, "udp"}, -{"pxc-spvr-ft", {NULL}, 4002, "tcp"}, -{"pxc-spvr-ft", {NULL}, 4002, "udp"}, -{"pxc-splr-ft", {NULL}, 4003, "tcp"}, -{"pxc-splr-ft", {NULL}, 4003, "udp"}, -{"pxc-roid", {NULL}, 4004, "tcp"}, -{"pxc-roid", {NULL}, 4004, "udp"}, -{"pxc-pin", {NULL}, 4005, "tcp"}, -{"pxc-pin", {NULL}, 4005, "udp"}, -{"pxc-spvr", {NULL}, 4006, "tcp"}, -{"pxc-spvr", {NULL}, 4006, "udp"}, -{"pxc-splr", {NULL}, 4007, "tcp"}, -{"pxc-splr", {NULL}, 4007, "udp"}, -{"netcheque", {NULL}, 4008, "tcp"}, -{"netcheque", {NULL}, 4008, "udp"}, -{"chimera-hwm", {NULL}, 4009, "tcp"}, -{"chimera-hwm", {NULL}, 4009, "udp"}, -{"samsung-unidex", {NULL}, 4010, "tcp"}, -{"samsung-unidex", {NULL}, 4010, "udp"}, -{"altserviceboot", {NULL}, 4011, "tcp"}, -{"altserviceboot", {NULL}, 4011, "udp"}, -{"pda-gate", {NULL}, 4012, "tcp"}, -{"pda-gate", {NULL}, 4012, "udp"}, -{"acl-manager", {NULL}, 4013, "tcp"}, -{"acl-manager", {NULL}, 4013, "udp"}, -{"taiclock", {NULL}, 4014, "tcp"}, -{"taiclock", {NULL}, 4014, "udp"}, -{"talarian-mcast1", {NULL}, 4015, "tcp"}, -{"talarian-mcast1", {NULL}, 4015, "udp"}, -{"talarian-mcast2", {NULL}, 4016, "tcp"}, -{"talarian-mcast2", {NULL}, 4016, "udp"}, -{"talarian-mcast3", {NULL}, 4017, "tcp"}, -{"talarian-mcast3", {NULL}, 4017, "udp"}, -{"talarian-mcast4", {NULL}, 4018, "tcp"}, -{"talarian-mcast4", {NULL}, 4018, "udp"}, -{"talarian-mcast5", {NULL}, 4019, "tcp"}, -{"talarian-mcast5", {NULL}, 4019, "udp"}, -{"trap", {NULL}, 4020, "tcp"}, -{"trap", {NULL}, 4020, "udp"}, -{"nexus-portal", {NULL}, 4021, "tcp"}, -{"nexus-portal", {NULL}, 4021, "udp"}, -{"dnox", {NULL}, 4022, "tcp"}, -{"dnox", {NULL}, 4022, "udp"}, -{"esnm-zoning", {NULL}, 4023, "tcp"}, -{"esnm-zoning", {NULL}, 4023, "udp"}, -{"tnp1-port", {NULL}, 4024, "tcp"}, -{"tnp1-port", {NULL}, 4024, "udp"}, -{"partimage", {NULL}, 4025, "tcp"}, -{"partimage", {NULL}, 4025, "udp"}, -{"as-debug", {NULL}, 4026, "tcp"}, -{"as-debug", {NULL}, 4026, "udp"}, -{"bxp", {NULL}, 4027, "tcp"}, -{"bxp", {NULL}, 4027, "udp"}, -{"dtserver-port", {NULL}, 4028, "tcp"}, -{"dtserver-port", {NULL}, 4028, "udp"}, -{"ip-qsig", {NULL}, 4029, "tcp"}, -{"ip-qsig", {NULL}, 4029, "udp"}, -{"jdmn-port", {NULL}, 4030, "tcp"}, -{"jdmn-port", {NULL}, 4030, "udp"}, -{"suucp", {NULL}, 4031, "tcp"}, -{"suucp", {NULL}, 4031, "udp"}, -{"vrts-auth-port", {NULL}, 4032, "tcp"}, -{"vrts-auth-port", {NULL}, 4032, "udp"}, -{"sanavigator", {NULL}, 4033, "tcp"}, -{"sanavigator", {NULL}, 4033, "udp"}, -{"ubxd", {NULL}, 4034, "tcp"}, -{"ubxd", {NULL}, 4034, "udp"}, -{"wap-push-http", {NULL}, 4035, "tcp"}, -{"wap-push-http", {NULL}, 4035, "udp"}, -{"wap-push-https", {NULL}, 4036, "tcp"}, -{"wap-push-https", {NULL}, 4036, "udp"}, -{"ravehd", {NULL}, 4037, "tcp"}, -{"ravehd", {NULL}, 4037, "udp"}, -{"fazzt-ptp", {NULL}, 4038, "tcp"}, -{"fazzt-ptp", {NULL}, 4038, "udp"}, -{"fazzt-admin", {NULL}, 4039, "tcp"}, -{"fazzt-admin", {NULL}, 4039, "udp"}, -{"yo-main", {NULL}, 4040, "tcp"}, -{"yo-main", {NULL}, 4040, "udp"}, -{"houston", {NULL}, 4041, "tcp"}, -{"houston", {NULL}, 4041, "udp"}, -{"ldxp", {NULL}, 4042, "tcp"}, -{"ldxp", {NULL}, 4042, "udp"}, -{"nirp", {NULL}, 4043, "tcp"}, -{"nirp", {NULL}, 4043, "udp"}, -{"ltp", {NULL}, 4044, "tcp"}, -{"ltp", {NULL}, 4044, "udp"}, -{"npp", {NULL}, 4045, "tcp"}, -{"npp", {NULL}, 4045, "udp"}, -{"acp-proto", {NULL}, 4046, "tcp"}, -{"acp-proto", {NULL}, 4046, "udp"}, -{"ctp-state", {NULL}, 4047, "tcp"}, -{"ctp-state", {NULL}, 4047, "udp"}, -{"wafs", {NULL}, 4049, "tcp"}, -{"wafs", {NULL}, 4049, "udp"}, -{"cisco-wafs", {NULL}, 4050, "tcp"}, -{"cisco-wafs", {NULL}, 4050, "udp"}, -{"cppdp", {NULL}, 4051, "tcp"}, -{"cppdp", {NULL}, 4051, "udp"}, -{"interact", {NULL}, 4052, "tcp"}, -{"interact", {NULL}, 4052, "udp"}, -{"ccu-comm-1", {NULL}, 4053, "tcp"}, -{"ccu-comm-1", {NULL}, 4053, "udp"}, -{"ccu-comm-2", {NULL}, 4054, "tcp"}, -{"ccu-comm-2", {NULL}, 4054, "udp"}, -{"ccu-comm-3", {NULL}, 4055, "tcp"}, -{"ccu-comm-3", {NULL}, 4055, "udp"}, -{"lms", {NULL}, 4056, "tcp"}, -{"lms", {NULL}, 4056, "udp"}, -{"wfm", {NULL}, 4057, "tcp"}, -{"wfm", {NULL}, 4057, "udp"}, -{"kingfisher", {NULL}, 4058, "tcp"}, -{"kingfisher", {NULL}, 4058, "udp"}, -{"dlms-cosem", {NULL}, 4059, "tcp"}, -{"dlms-cosem", {NULL}, 4059, "udp"}, -{"dsmeter_iatc", {NULL}, 4060, "tcp"}, -{"dsmeter_iatc", {NULL}, 4060, "udp"}, -{"ice-location", {NULL}, 4061, "tcp"}, -{"ice-location", {NULL}, 4061, "udp"}, -{"ice-slocation", {NULL}, 4062, "tcp"}, -{"ice-slocation", {NULL}, 4062, "udp"}, -{"ice-router", {NULL}, 4063, "tcp"}, -{"ice-router", {NULL}, 4063, "udp"}, -{"ice-srouter", {NULL}, 4064, "tcp"}, -{"ice-srouter", {NULL}, 4064, "udp"}, -{"avanti_cdp", {NULL}, 4065, "tcp"}, -{"avanti_cdp", {NULL}, 4065, "udp"}, -{"pmas", {NULL}, 4066, "tcp"}, -{"pmas", {NULL}, 4066, "udp"}, -{"idp", {NULL}, 4067, "tcp"}, -{"idp", {NULL}, 4067, "udp"}, -{"ipfltbcst", {NULL}, 4068, "tcp"}, -{"ipfltbcst", {NULL}, 4068, "udp"}, -{"minger", {NULL}, 4069, "tcp"}, -{"minger", {NULL}, 4069, "udp"}, -{"tripe", {NULL}, 4070, "tcp"}, -{"tripe", {NULL}, 4070, "udp"}, -{"aibkup", {NULL}, 4071, "tcp"}, -{"aibkup", {NULL}, 4071, "udp"}, -{"zieto-sock", {NULL}, 4072, "tcp"}, -{"zieto-sock", {NULL}, 4072, "udp"}, -{"iRAPP", {NULL}, 4073, "tcp"}, -{"iRAPP", {NULL}, 4073, "udp"}, -{"cequint-cityid", {NULL}, 4074, "tcp"}, -{"cequint-cityid", {NULL}, 4074, "udp"}, -{"perimlan", {NULL}, 4075, "tcp"}, -{"perimlan", {NULL}, 4075, "udp"}, -{"seraph", {NULL}, 4076, "tcp"}, -{"seraph", {NULL}, 4076, "udp"}, -{"ascomalarm", {NULL}, 4077, "udp"}, -{"cssp", {NULL}, 4078, "tcp"}, -{"santools", {NULL}, 4079, "tcp"}, -{"santools", {NULL}, 4079, "udp"}, -{"lorica-in", {NULL}, 4080, "tcp"}, -{"lorica-in", {NULL}, 4080, "udp"}, -{"lorica-in-sec", {NULL}, 4081, "tcp"}, -{"lorica-in-sec", {NULL}, 4081, "udp"}, -{"lorica-out", {NULL}, 4082, "tcp"}, -{"lorica-out", {NULL}, 4082, "udp"}, -{"lorica-out-sec", {NULL}, 4083, "tcp"}, -{"lorica-out-sec", {NULL}, 4083, "udp"}, -{"fortisphere-vm", {NULL}, 4084, "udp"}, -{"ezmessagesrv", {NULL}, 4085, "tcp"}, -{"ftsync", {NULL}, 4086, "udp"}, -{"applusservice", {NULL}, 4087, "tcp"}, -{"npsp", {NULL}, 4088, "tcp"}, -{"opencore", {NULL}, 4089, "tcp"}, -{"opencore", {NULL}, 4089, "udp"}, -{"omasgport", {NULL}, 4090, "tcp"}, -{"omasgport", {NULL}, 4090, "udp"}, -{"ewinstaller", {NULL}, 4091, "tcp"}, -{"ewinstaller", {NULL}, 4091, "udp"}, -{"ewdgs", {NULL}, 4092, "tcp"}, -{"ewdgs", {NULL}, 4092, "udp"}, -{"pvxpluscs", {NULL}, 4093, "tcp"}, -{"pvxpluscs", {NULL}, 4093, "udp"}, -{"sysrqd", {NULL}, 4094, "tcp"}, -{"sysrqd", {NULL}, 4094, "udp"}, -{"xtgui", {NULL}, 4095, "tcp"}, -{"xtgui", {NULL}, 4095, "udp"}, -{"bre", {NULL}, 4096, "tcp"}, -{"bre", {NULL}, 4096, "udp"}, -{"patrolview", {NULL}, 4097, "tcp"}, -{"patrolview", {NULL}, 4097, "udp"}, -{"drmsfsd", {NULL}, 4098, "tcp"}, -{"drmsfsd", {NULL}, 4098, "udp"}, -{"dpcp", {NULL}, 4099, "tcp"}, -{"dpcp", {NULL}, 4099, "udp"}, -{"igo-incognito", {NULL}, 4100, "tcp"}, -{"igo-incognito", {NULL}, 4100, "udp"}, -{"brlp-0", {NULL}, 4101, "tcp"}, -{"brlp-0", {NULL}, 4101, "udp"}, -{"brlp-1", {NULL}, 4102, "tcp"}, -{"brlp-1", {NULL}, 4102, "udp"}, -{"brlp-2", {NULL}, 4103, "tcp"}, -{"brlp-2", {NULL}, 4103, "udp"}, -{"brlp-3", {NULL}, 4104, "tcp"}, -{"brlp-3", {NULL}, 4104, "udp"}, -{"shofarplayer", {NULL}, 4105, "tcp"}, -{"shofarplayer", {NULL}, 4105, "udp"}, -{"synchronite", {NULL}, 4106, "tcp"}, -{"synchronite", {NULL}, 4106, "udp"}, -{"j-ac", {NULL}, 4107, "tcp"}, -{"j-ac", {NULL}, 4107, "udp"}, -{"accel", {NULL}, 4108, "tcp"}, -{"accel", {NULL}, 4108, "udp"}, -{"izm", {NULL}, 4109, "tcp"}, -{"izm", {NULL}, 4109, "udp"}, -{"g2tag", {NULL}, 4110, "tcp"}, -{"g2tag", {NULL}, 4110, "udp"}, -{"xgrid", {NULL}, 4111, "tcp"}, -{"xgrid", {NULL}, 4111, "udp"}, -{"apple-vpns-rp", {NULL}, 4112, "tcp"}, -{"apple-vpns-rp", {NULL}, 4112, "udp"}, -{"aipn-reg", {NULL}, 4113, "tcp"}, -{"aipn-reg", {NULL}, 4113, "udp"}, -{"jomamqmonitor", {NULL}, 4114, "tcp"}, -{"jomamqmonitor", {NULL}, 4114, "udp"}, -{"cds", {NULL}, 4115, "tcp"}, -{"cds", {NULL}, 4115, "udp"}, -{"smartcard-tls", {NULL}, 4116, "tcp"}, -{"smartcard-tls", {NULL}, 4116, "udp"}, -{"hillrserv", {NULL}, 4117, "tcp"}, -{"hillrserv", {NULL}, 4117, "udp"}, -{"netscript", {NULL}, 4118, "tcp"}, -{"netscript", {NULL}, 4118, "udp"}, -{"assuria-slm", {NULL}, 4119, "tcp"}, -{"assuria-slm", {NULL}, 4119, "udp"}, -{"e-builder", {NULL}, 4121, "tcp"}, -{"e-builder", {NULL}, 4121, "udp"}, -{"fprams", {NULL}, 4122, "tcp"}, -{"fprams", {NULL}, 4122, "udp"}, -{"z-wave", {NULL}, 4123, "tcp"}, -{"z-wave", {NULL}, 4123, "udp"}, -{"tigv2", {NULL}, 4124, "tcp"}, -{"tigv2", {NULL}, 4124, "udp"}, -{"opsview-envoy", {NULL}, 4125, "tcp"}, -{"opsview-envoy", {NULL}, 4125, "udp"}, -{"ddrepl", {NULL}, 4126, "tcp"}, -{"ddrepl", {NULL}, 4126, "udp"}, -{"unikeypro", {NULL}, 4127, "tcp"}, -{"unikeypro", {NULL}, 4127, "udp"}, -{"nufw", {NULL}, 4128, "tcp"}, -{"nufw", {NULL}, 4128, "udp"}, -{"nuauth", {NULL}, 4129, "tcp"}, -{"nuauth", {NULL}, 4129, "udp"}, -{"fronet", {NULL}, 4130, "tcp"}, -{"fronet", {NULL}, 4130, "udp"}, -{"stars", {NULL}, 4131, "tcp"}, -{"stars", {NULL}, 4131, "udp"}, -{"nuts_dem", {NULL}, 4132, "tcp"}, -{"nuts_dem", {NULL}, 4132, "udp"}, -{"nuts_bootp", {NULL}, 4133, "tcp"}, -{"nuts_bootp", {NULL}, 4133, "udp"}, -{"nifty-hmi", {NULL}, 4134, "tcp"}, -{"nifty-hmi", {NULL}, 4134, "udp"}, -{"cl-db-attach", {NULL}, 4135, "tcp"}, -{"cl-db-attach", {NULL}, 4135, "udp"}, -{"cl-db-request", {NULL}, 4136, "tcp"}, -{"cl-db-request", {NULL}, 4136, "udp"}, -{"cl-db-remote", {NULL}, 4137, "tcp"}, -{"cl-db-remote", {NULL}, 4137, "udp"}, -{"nettest", {NULL}, 4138, "tcp"}, -{"nettest", {NULL}, 4138, "udp"}, -{"thrtx", {NULL}, 4139, "tcp"}, -{"thrtx", {NULL}, 4139, "udp"}, -{"cedros_fds", {NULL}, 4140, "tcp"}, -{"cedros_fds", {NULL}, 4140, "udp"}, -{"oirtgsvc", {NULL}, 4141, "tcp"}, -{"oirtgsvc", {NULL}, 4141, "udp"}, -{"oidocsvc", {NULL}, 4142, "tcp"}, -{"oidocsvc", {NULL}, 4142, "udp"}, -{"oidsr", {NULL}, 4143, "tcp"}, -{"oidsr", {NULL}, 4143, "udp"}, -{"vvr-control", {NULL}, 4145, "tcp"}, -{"vvr-control", {NULL}, 4145, "udp"}, -{"tgcconnect", {NULL}, 4146, "tcp"}, -{"tgcconnect", {NULL}, 4146, "udp"}, -{"vrxpservman", {NULL}, 4147, "tcp"}, -{"vrxpservman", {NULL}, 4147, "udp"}, -{"hhb-handheld", {NULL}, 4148, "tcp"}, -{"hhb-handheld", {NULL}, 4148, "udp"}, -{"agslb", {NULL}, 4149, "tcp"}, -{"agslb", {NULL}, 4149, "udp"}, -{"PowerAlert-nsa", {NULL}, 4150, "tcp"}, -{"PowerAlert-nsa", {NULL}, 4150, "udp"}, -{"menandmice_noh", {NULL}, 4151, "tcp"}, -{"menandmice_noh", {NULL}, 4151, "udp"}, -{"idig_mux", {NULL}, 4152, "tcp"}, -{"idig_mux", {NULL}, 4152, "udp"}, -{"mbl-battd", {NULL}, 4153, "tcp"}, -{"mbl-battd", {NULL}, 4153, "udp"}, -{"atlinks", {NULL}, 4154, "tcp"}, -{"atlinks", {NULL}, 4154, "udp"}, -{"bzr", {NULL}, 4155, "tcp"}, -{"bzr", {NULL}, 4155, "udp"}, -{"stat-results", {NULL}, 4156, "tcp"}, -{"stat-results", {NULL}, 4156, "udp"}, -{"stat-scanner", {NULL}, 4157, "tcp"}, -{"stat-scanner", {NULL}, 4157, "udp"}, -{"stat-cc", {NULL}, 4158, "tcp"}, -{"stat-cc", {NULL}, 4158, "udp"}, -{"nss", {NULL}, 4159, "tcp"}, -{"nss", {NULL}, 4159, "udp"}, -{"jini-discovery", {NULL}, 4160, "tcp"}, -{"jini-discovery", {NULL}, 4160, "udp"}, -{"omscontact", {NULL}, 4161, "tcp"}, -{"omscontact", {NULL}, 4161, "udp"}, -{"omstopology", {NULL}, 4162, "tcp"}, -{"omstopology", {NULL}, 4162, "udp"}, -{"silverpeakpeer", {NULL}, 4163, "tcp"}, -{"silverpeakpeer", {NULL}, 4163, "udp"}, -{"silverpeakcomm", {NULL}, 4164, "tcp"}, -{"silverpeakcomm", {NULL}, 4164, "udp"}, -{"altcp", {NULL}, 4165, "tcp"}, -{"altcp", {NULL}, 4165, "udp"}, -{"joost", {NULL}, 4166, "tcp"}, -{"joost", {NULL}, 4166, "udp"}, -{"ddgn", {NULL}, 4167, "tcp"}, -{"ddgn", {NULL}, 4167, "udp"}, -{"pslicser", {NULL}, 4168, "tcp"}, -{"pslicser", {NULL}, 4168, "udp"}, -{"iadt", {NULL}, 4169, "tcp"}, -{"iadt-disc", {NULL}, 4169, "udp"}, -{"d-cinema-csp", {NULL}, 4170, "tcp"}, -{"ml-svnet", {NULL}, 4171, "tcp"}, -{"pcoip", {NULL}, 4172, "tcp"}, -{"pcoip", {NULL}, 4172, "udp"}, -{"smcluster", {NULL}, 4174, "tcp"}, -{"bccp", {NULL}, 4175, "tcp"}, -{"tl-ipcproxy", {NULL}, 4176, "tcp"}, -{"wello", {NULL}, 4177, "tcp"}, -{"wello", {NULL}, 4177, "udp"}, -{"storman", {NULL}, 4178, "tcp"}, -{"storman", {NULL}, 4178, "udp"}, -{"MaxumSP", {NULL}, 4179, "tcp"}, -{"MaxumSP", {NULL}, 4179, "udp"}, -{"httpx", {NULL}, 4180, "tcp"}, -{"httpx", {NULL}, 4180, "udp"}, -{"macbak", {NULL}, 4181, "tcp"}, -{"macbak", {NULL}, 4181, "udp"}, -{"pcptcpservice", {NULL}, 4182, "tcp"}, -{"pcptcpservice", {NULL}, 4182, "udp"}, -{"gmmp", {NULL}, 4183, "tcp"}, -{"gmmp", {NULL}, 4183, "udp"}, -{"universe_suite", {NULL}, 4184, "tcp"}, -{"universe_suite", {NULL}, 4184, "udp"}, -{"wcpp", {NULL}, 4185, "tcp"}, -{"wcpp", {NULL}, 4185, "udp"}, -{"boxbackupstore", {NULL}, 4186, "tcp"}, -{"csc_proxy", {NULL}, 4187, "tcp"}, -{"vatata", {NULL}, 4188, "tcp"}, -{"vatata", {NULL}, 4188, "udp"}, -{"pcep", {NULL}, 4189, "tcp"}, -{"sieve", {NULL}, 4190, "tcp"}, -{"dsmipv6", {NULL}, 4191, "udp"}, -{"azeti", {NULL}, 4192, "tcp"}, -{"azeti-bd", {NULL}, 4192, "udp"}, -{"pvxplusio", {NULL}, 4193, "tcp"}, -{"eims-admin", {NULL}, 4199, "tcp"}, -{"eims-admin", {NULL}, 4199, "udp"}, -{"corelccam", {NULL}, 4300, "tcp"}, -{"corelccam", {NULL}, 4300, "udp"}, -{"d-data", {NULL}, 4301, "tcp"}, -{"d-data", {NULL}, 4301, "udp"}, -{"d-data-control", {NULL}, 4302, "tcp"}, -{"d-data-control", {NULL}, 4302, "udp"}, -{"srcp", {NULL}, 4303, "tcp"}, -{"srcp", {NULL}, 4303, "udp"}, -{"owserver", {NULL}, 4304, "tcp"}, -{"owserver", {NULL}, 4304, "udp"}, -{"batman", {NULL}, 4305, "tcp"}, -{"batman", {NULL}, 4305, "udp"}, -{"pinghgl", {NULL}, 4306, "tcp"}, -{"pinghgl", {NULL}, 4306, "udp"}, -{"visicron-vs", {NULL}, 4307, "tcp"}, -{"visicron-vs", {NULL}, 4307, "udp"}, -{"compx-lockview", {NULL}, 4308, "tcp"}, -{"compx-lockview", {NULL}, 4308, "udp"}, -{"dserver", {NULL}, 4309, "tcp"}, -{"dserver", {NULL}, 4309, "udp"}, -{"mirrtex", {NULL}, 4310, "tcp"}, -{"mirrtex", {NULL}, 4310, "udp"}, -{"p6ssmc", {NULL}, 4311, "tcp"}, -{"pscl-mgt", {NULL}, 4312, "tcp"}, -{"perrla", {NULL}, 4313, "tcp"}, -{"fdt-rcatp", {NULL}, 4320, "tcp"}, -{"fdt-rcatp", {NULL}, 4320, "udp"}, -{"rwhois", {NULL}, 4321, "tcp"}, -{"rwhois", {NULL}, 4321, "udp"}, -{"trim-event", {NULL}, 4322, "tcp"}, -{"trim-event", {NULL}, 4322, "udp"}, -{"trim-ice", {NULL}, 4323, "tcp"}, -{"trim-ice", {NULL}, 4323, "udp"}, -{"balour", {NULL}, 4324, "tcp"}, -{"balour", {NULL}, 4324, "udp"}, -{"geognosisman", {NULL}, 4325, "tcp"}, -{"geognosisman", {NULL}, 4325, "udp"}, -{"geognosis", {NULL}, 4326, "tcp"}, -{"geognosis", {NULL}, 4326, "udp"}, -{"jaxer-web", {NULL}, 4327, "tcp"}, -{"jaxer-web", {NULL}, 4327, "udp"}, -{"jaxer-manager", {NULL}, 4328, "tcp"}, -{"jaxer-manager", {NULL}, 4328, "udp"}, -{"publiqare-sync", {NULL}, 4329, "tcp"}, -{"gaia", {NULL}, 4340, "tcp"}, -{"gaia", {NULL}, 4340, "udp"}, -{"lisp-data", {NULL}, 4341, "tcp"}, -{"lisp-data", {NULL}, 4341, "udp"}, -{"lisp-cons", {NULL}, 4342, "tcp"}, -{"lisp-control", {NULL}, 4342, "udp"}, -{"unicall", {NULL}, 4343, "tcp"}, -{"unicall", {NULL}, 4343, "udp"}, -{"vinainstall", {NULL}, 4344, "tcp"}, -{"vinainstall", {NULL}, 4344, "udp"}, -{"m4-network-as", {NULL}, 4345, "tcp"}, -{"m4-network-as", {NULL}, 4345, "udp"}, -{"elanlm", {NULL}, 4346, "tcp"}, -{"elanlm", {NULL}, 4346, "udp"}, -{"lansurveyor", {NULL}, 4347, "tcp"}, -{"lansurveyor", {NULL}, 4347, "udp"}, -{"itose", {NULL}, 4348, "tcp"}, -{"itose", {NULL}, 4348, "udp"}, -{"fsportmap", {NULL}, 4349, "tcp"}, -{"fsportmap", {NULL}, 4349, "udp"}, -{"net-device", {NULL}, 4350, "tcp"}, -{"net-device", {NULL}, 4350, "udp"}, -{"plcy-net-svcs", {NULL}, 4351, "tcp"}, -{"plcy-net-svcs", {NULL}, 4351, "udp"}, -{"pjlink", {NULL}, 4352, "tcp"}, -{"pjlink", {NULL}, 4352, "udp"}, -{"f5-iquery", {NULL}, 4353, "tcp"}, -{"f5-iquery", {NULL}, 4353, "udp"}, -{"qsnet-trans", {NULL}, 4354, "tcp"}, -{"qsnet-trans", {NULL}, 4354, "udp"}, -{"qsnet-workst", {NULL}, 4355, "tcp"}, -{"qsnet-workst", {NULL}, 4355, "udp"}, -{"qsnet-assist", {NULL}, 4356, "tcp"}, -{"qsnet-assist", {NULL}, 4356, "udp"}, -{"qsnet-cond", {NULL}, 4357, "tcp"}, -{"qsnet-cond", {NULL}, 4357, "udp"}, -{"qsnet-nucl", {NULL}, 4358, "tcp"}, -{"qsnet-nucl", {NULL}, 4358, "udp"}, -{"omabcastltkm", {NULL}, 4359, "tcp"}, -{"omabcastltkm", {NULL}, 4359, "udp"}, -{"matrix_vnet", {NULL}, 4360, "tcp"}, -{"nacnl", {NULL}, 4361, "udp"}, -{"afore-vdp-disc", {NULL}, 4362, "udp"}, -{"wxbrief", {NULL}, 4368, "tcp"}, -{"wxbrief", {NULL}, 4368, "udp"}, -{"epmd", {NULL}, 4369, "tcp"}, -{"epmd", {NULL}, 4369, "udp"}, -{"elpro_tunnel", {NULL}, 4370, "tcp"}, -{"elpro_tunnel", {NULL}, 4370, "udp"}, -{"l2c-control", {NULL}, 4371, "tcp"}, -{"l2c-disc", {NULL}, 4371, "udp"}, -{"l2c-data", {NULL}, 4372, "tcp"}, -{"l2c-data", {NULL}, 4372, "udp"}, -{"remctl", {NULL}, 4373, "tcp"}, -{"remctl", {NULL}, 4373, "udp"}, -{"psi-ptt", {NULL}, 4374, "tcp"}, -{"tolteces", {NULL}, 4375, "tcp"}, -{"tolteces", {NULL}, 4375, "udp"}, -{"bip", {NULL}, 4376, "tcp"}, -{"bip", {NULL}, 4376, "udp"}, -{"cp-spxsvr", {NULL}, 4377, "tcp"}, -{"cp-spxsvr", {NULL}, 4377, "udp"}, -{"cp-spxdpy", {NULL}, 4378, "tcp"}, -{"cp-spxdpy", {NULL}, 4378, "udp"}, -{"ctdb", {NULL}, 4379, "tcp"}, -{"ctdb", {NULL}, 4379, "udp"}, -{"xandros-cms", {NULL}, 4389, "tcp"}, -{"xandros-cms", {NULL}, 4389, "udp"}, -{"wiegand", {NULL}, 4390, "tcp"}, -{"wiegand", {NULL}, 4390, "udp"}, -{"apwi-imserver", {NULL}, 4391, "tcp"}, -{"apwi-rxserver", {NULL}, 4392, "tcp"}, -{"apwi-rxspooler", {NULL}, 4393, "tcp"}, -{"apwi-disc", {NULL}, 4394, "udp"}, -{"omnivisionesx", {NULL}, 4395, "tcp"}, -{"omnivisionesx", {NULL}, 4395, "udp"}, -{"fly", {NULL}, 4396, "tcp"}, -{"ds-srv", {NULL}, 4400, "tcp"}, -{"ds-srv", {NULL}, 4400, "udp"}, -{"ds-srvr", {NULL}, 4401, "tcp"}, -{"ds-srvr", {NULL}, 4401, "udp"}, -{"ds-clnt", {NULL}, 4402, "tcp"}, -{"ds-clnt", {NULL}, 4402, "udp"}, -{"ds-user", {NULL}, 4403, "tcp"}, -{"ds-user", {NULL}, 4403, "udp"}, -{"ds-admin", {NULL}, 4404, "tcp"}, -{"ds-admin", {NULL}, 4404, "udp"}, -{"ds-mail", {NULL}, 4405, "tcp"}, -{"ds-mail", {NULL}, 4405, "udp"}, -{"ds-slp", {NULL}, 4406, "tcp"}, -{"ds-slp", {NULL}, 4406, "udp"}, -{"nacagent", {NULL}, 4407, "tcp"}, -{"slscc", {NULL}, 4408, "tcp"}, -{"netcabinet-com", {NULL}, 4409, "tcp"}, -{"itwo-server", {NULL}, 4410, "tcp"}, -{"netrockey6", {NULL}, 4425, "tcp"}, -{"netrockey6", {NULL}, 4425, "udp"}, -{"beacon-port-2", {NULL}, 4426, "tcp"}, -{"beacon-port-2", {NULL}, 4426, "udp"}, -{"drizzle", {NULL}, 4427, "tcp"}, -{"omviserver", {NULL}, 4428, "tcp"}, -{"omviagent", {NULL}, 4429, "tcp"}, -{"rsqlserver", {NULL}, 4430, "tcp"}, -{"rsqlserver", {NULL}, 4430, "udp"}, -{"wspipe", {NULL}, 4431, "tcp"}, -{"netblox", {NULL}, 4441, "udp"}, -{"saris", {NULL}, 4442, "tcp"}, -{"saris", {NULL}, 4442, "udp"}, -{"pharos", {NULL}, 4443, "tcp"}, -{"pharos", {NULL}, 4443, "udp"}, -{"krb524", {NULL}, 4444, "tcp"}, -{"krb524", {NULL}, 4444, "udp"}, -{"nv-video", {NULL}, 4444, "tcp"}, -{"nv-video", {NULL}, 4444, "udp"}, -{"upnotifyp", {NULL}, 4445, "tcp"}, -{"upnotifyp", {NULL}, 4445, "udp"}, -{"n1-fwp", {NULL}, 4446, "tcp"}, -{"n1-fwp", {NULL}, 4446, "udp"}, -{"n1-rmgmt", {NULL}, 4447, "tcp"}, -{"n1-rmgmt", {NULL}, 4447, "udp"}, -{"asc-slmd", {NULL}, 4448, "tcp"}, -{"asc-slmd", {NULL}, 4448, "udp"}, -{"privatewire", {NULL}, 4449, "tcp"}, -{"privatewire", {NULL}, 4449, "udp"}, -{"camp", {NULL}, 4450, "tcp"}, -{"camp", {NULL}, 4450, "udp"}, -{"ctisystemmsg", {NULL}, 4451, "tcp"}, -{"ctisystemmsg", {NULL}, 4451, "udp"}, -{"ctiprogramload", {NULL}, 4452, "tcp"}, -{"ctiprogramload", {NULL}, 4452, "udp"}, -{"nssalertmgr", {NULL}, 4453, "tcp"}, -{"nssalertmgr", {NULL}, 4453, "udp"}, -{"nssagentmgr", {NULL}, 4454, "tcp"}, -{"nssagentmgr", {NULL}, 4454, "udp"}, -{"prchat-user", {NULL}, 4455, "tcp"}, -{"prchat-user", {NULL}, 4455, "udp"}, -{"prchat-server", {NULL}, 4456, "tcp"}, -{"prchat-server", {NULL}, 4456, "udp"}, -{"prRegister", {NULL}, 4457, "tcp"}, -{"prRegister", {NULL}, 4457, "udp"}, -{"mcp", {NULL}, 4458, "tcp"}, -{"mcp", {NULL}, 4458, "udp"}, -{"hpssmgmt", {NULL}, 4484, "tcp"}, -{"hpssmgmt", {NULL}, 4484, "udp"}, -{"assyst-dr", {NULL}, 4485, "tcp"}, -{"icms", {NULL}, 4486, "tcp"}, -{"icms", {NULL}, 4486, "udp"}, -{"prex-tcp", {NULL}, 4487, "tcp"}, -{"awacs-ice", {NULL}, 4488, "tcp"}, -{"awacs-ice", {NULL}, 4488, "udp"}, -{"ipsec-nat-t", {NULL}, 4500, "tcp"}, -{"ipsec-nat-t", {NULL}, 4500, "udp"}, -{"ehs", {NULL}, 4535, "tcp"}, -{"ehs", {NULL}, 4535, "udp"}, -{"ehs-ssl", {NULL}, 4536, "tcp"}, -{"ehs-ssl", {NULL}, 4536, "udp"}, -{"wssauthsvc", {NULL}, 4537, "tcp"}, -{"wssauthsvc", {NULL}, 4537, "udp"}, -{"swx-gate", {NULL}, 4538, "tcp"}, -{"swx-gate", {NULL}, 4538, "udp"}, -{"worldscores", {NULL}, 4545, "tcp"}, -{"worldscores", {NULL}, 4545, "udp"}, -{"sf-lm", {NULL}, 4546, "tcp"}, -{"sf-lm", {NULL}, 4546, "udp"}, -{"lanner-lm", {NULL}, 4547, "tcp"}, -{"lanner-lm", {NULL}, 4547, "udp"}, -{"synchromesh", {NULL}, 4548, "tcp"}, -{"synchromesh", {NULL}, 4548, "udp"}, -{"aegate", {NULL}, 4549, "tcp"}, -{"aegate", {NULL}, 4549, "udp"}, -{"gds-adppiw-db", {NULL}, 4550, "tcp"}, -{"gds-adppiw-db", {NULL}, 4550, "udp"}, -{"ieee-mih", {NULL}, 4551, "tcp"}, -{"ieee-mih", {NULL}, 4551, "udp"}, -{"menandmice-mon", {NULL}, 4552, "tcp"}, -{"menandmice-mon", {NULL}, 4552, "udp"}, -{"icshostsvc", {NULL}, 4553, "tcp"}, -{"msfrs", {NULL}, 4554, "tcp"}, -{"msfrs", {NULL}, 4554, "udp"}, -{"rsip", {NULL}, 4555, "tcp"}, -{"rsip", {NULL}, 4555, "udp"}, -{"dtn-bundle-tcp", {NULL}, 4556, "tcp"}, -{"dtn-bundle-udp", {NULL}, 4556, "udp"}, -{"mtcevrunqss", {NULL}, 4557, "udp"}, -{"mtcevrunqman", {NULL}, 4558, "udp"}, -{"hylafax", {NULL}, 4559, "tcp"}, -{"hylafax", {NULL}, 4559, "udp"}, -{"kwtc", {NULL}, 4566, "tcp"}, -{"kwtc", {NULL}, 4566, "udp"}, -{"tram", {NULL}, 4567, "tcp"}, -{"tram", {NULL}, 4567, "udp"}, -{"bmc-reporting", {NULL}, 4568, "tcp"}, -{"bmc-reporting", {NULL}, 4568, "udp"}, -{"iax", {NULL}, 4569, "tcp"}, -{"iax", {NULL}, 4569, "udp"}, -{"rid", {NULL}, 4590, "tcp"}, -{"l3t-at-an", {NULL}, 4591, "tcp"}, -{"l3t-at-an", {NULL}, 4591, "udp"}, -{"hrpd-ith-at-an", {NULL}, 4592, "udp"}, -{"ipt-anri-anri", {NULL}, 4593, "tcp"}, -{"ipt-anri-anri", {NULL}, 4593, "udp"}, -{"ias-session", {NULL}, 4594, "tcp"}, -{"ias-session", {NULL}, 4594, "udp"}, -{"ias-paging", {NULL}, 4595, "tcp"}, -{"ias-paging", {NULL}, 4595, "udp"}, -{"ias-neighbor", {NULL}, 4596, "tcp"}, -{"ias-neighbor", {NULL}, 4596, "udp"}, -{"a21-an-1xbs", {NULL}, 4597, "tcp"}, -{"a21-an-1xbs", {NULL}, 4597, "udp"}, -{"a16-an-an", {NULL}, 4598, "tcp"}, -{"a16-an-an", {NULL}, 4598, "udp"}, -{"a17-an-an", {NULL}, 4599, "tcp"}, -{"a17-an-an", {NULL}, 4599, "udp"}, -{"piranha1", {NULL}, 4600, "tcp"}, -{"piranha1", {NULL}, 4600, "udp"}, -{"piranha2", {NULL}, 4601, "tcp"}, -{"piranha2", {NULL}, 4601, "udp"}, -{"mtsserver", {NULL}, 4602, "tcp"}, -{"menandmice-upg", {NULL}, 4603, "tcp"}, -{"playsta2-app", {NULL}, 4658, "tcp"}, -{"playsta2-app", {NULL}, 4658, "udp"}, -{"playsta2-lob", {NULL}, 4659, "tcp"}, -{"playsta2-lob", {NULL}, 4659, "udp"}, -{"smaclmgr", {NULL}, 4660, "tcp"}, -{"smaclmgr", {NULL}, 4660, "udp"}, -{"kar2ouche", {NULL}, 4661, "tcp"}, -{"kar2ouche", {NULL}, 4661, "udp"}, -{"oms", {NULL}, 4662, "tcp"}, -{"oms", {NULL}, 4662, "udp"}, -{"noteit", {NULL}, 4663, "tcp"}, -{"noteit", {NULL}, 4663, "udp"}, -{"ems", {NULL}, 4664, "tcp"}, -{"ems", {NULL}, 4664, "udp"}, -{"contclientms", {NULL}, 4665, "tcp"}, -{"contclientms", {NULL}, 4665, "udp"}, -{"eportcomm", {NULL}, 4666, "tcp"}, -{"eportcomm", {NULL}, 4666, "udp"}, -{"mmacomm", {NULL}, 4667, "tcp"}, -{"mmacomm", {NULL}, 4667, "udp"}, -{"mmaeds", {NULL}, 4668, "tcp"}, -{"mmaeds", {NULL}, 4668, "udp"}, -{"eportcommdata", {NULL}, 4669, "tcp"}, -{"eportcommdata", {NULL}, 4669, "udp"}, -{"light", {NULL}, 4670, "tcp"}, -{"light", {NULL}, 4670, "udp"}, -{"acter", {NULL}, 4671, "tcp"}, -{"acter", {NULL}, 4671, "udp"}, -{"rfa", {NULL}, 4672, "tcp"}, -{"rfa", {NULL}, 4672, "udp"}, -{"cxws", {NULL}, 4673, "tcp"}, -{"cxws", {NULL}, 4673, "udp"}, -{"appiq-mgmt", {NULL}, 4674, "tcp"}, -{"appiq-mgmt", {NULL}, 4674, "udp"}, -{"dhct-status", {NULL}, 4675, "tcp"}, -{"dhct-status", {NULL}, 4675, "udp"}, -{"dhct-alerts", {NULL}, 4676, "tcp"}, -{"dhct-alerts", {NULL}, 4676, "udp"}, -{"bcs", {NULL}, 4677, "tcp"}, -{"bcs", {NULL}, 4677, "udp"}, -{"traversal", {NULL}, 4678, "tcp"}, -{"traversal", {NULL}, 4678, "udp"}, -{"mgesupervision", {NULL}, 4679, "tcp"}, -{"mgesupervision", {NULL}, 4679, "udp"}, -{"mgemanagement", {NULL}, 4680, "tcp"}, -{"mgemanagement", {NULL}, 4680, "udp"}, -{"parliant", {NULL}, 4681, "tcp"}, -{"parliant", {NULL}, 4681, "udp"}, -{"finisar", {NULL}, 4682, "tcp"}, -{"finisar", {NULL}, 4682, "udp"}, -{"spike", {NULL}, 4683, "tcp"}, -{"spike", {NULL}, 4683, "udp"}, -{"rfid-rp1", {NULL}, 4684, "tcp"}, -{"rfid-rp1", {NULL}, 4684, "udp"}, -{"autopac", {NULL}, 4685, "tcp"}, -{"autopac", {NULL}, 4685, "udp"}, -{"msp-os", {NULL}, 4686, "tcp"}, -{"msp-os", {NULL}, 4686, "udp"}, -{"nst", {NULL}, 4687, "tcp"}, -{"nst", {NULL}, 4687, "udp"}, -{"mobile-p2p", {NULL}, 4688, "tcp"}, -{"mobile-p2p", {NULL}, 4688, "udp"}, -{"altovacentral", {NULL}, 4689, "tcp"}, -{"altovacentral", {NULL}, 4689, "udp"}, -{"prelude", {NULL}, 4690, "tcp"}, -{"prelude", {NULL}, 4690, "udp"}, -{"mtn", {NULL}, 4691, "tcp"}, -{"mtn", {NULL}, 4691, "udp"}, -{"conspiracy", {NULL}, 4692, "tcp"}, -{"conspiracy", {NULL}, 4692, "udp"}, -{"netxms-agent", {NULL}, 4700, "tcp"}, -{"netxms-agent", {NULL}, 4700, "udp"}, -{"netxms-mgmt", {NULL}, 4701, "tcp"}, -{"netxms-mgmt", {NULL}, 4701, "udp"}, -{"netxms-sync", {NULL}, 4702, "tcp"}, -{"netxms-sync", {NULL}, 4702, "udp"}, -{"npqes-test", {NULL}, 4703, "tcp"}, -{"assuria-ins", {NULL}, 4704, "tcp"}, -{"truckstar", {NULL}, 4725, "tcp"}, -{"truckstar", {NULL}, 4725, "udp"}, -{"a26-fap-fgw", {NULL}, 4726, "udp"}, -{"fcis", {NULL}, 4727, "tcp"}, -{"fcis-disc", {NULL}, 4727, "udp"}, -{"capmux", {NULL}, 4728, "tcp"}, -{"capmux", {NULL}, 4728, "udp"}, -{"gsmtap", {NULL}, 4729, "udp"}, -{"gearman", {NULL}, 4730, "tcp"}, -{"gearman", {NULL}, 4730, "udp"}, -{"remcap", {NULL}, 4731, "tcp"}, -{"ohmtrigger", {NULL}, 4732, "udp"}, -{"resorcs", {NULL}, 4733, "tcp"}, -{"ipdr-sp", {NULL}, 4737, "tcp"}, -{"ipdr-sp", {NULL}, 4737, "udp"}, -{"solera-lpn", {NULL}, 4738, "tcp"}, -{"solera-lpn", {NULL}, 4738, "udp"}, -{"ipfix", {NULL}, 4739, "tcp"}, -{"ipfix", {NULL}, 4739, "udp"}, -{"ipfix", {NULL}, 4739, "sctp"}, -{"ipfixs", {NULL}, 4740, "tcp"}, -{"ipfixs", {NULL}, 4740, "sctp"}, -{"ipfixs", {NULL}, 4740, "udp"}, -{"lumimgrd", {NULL}, 4741, "tcp"}, -{"lumimgrd", {NULL}, 4741, "udp"}, -{"sicct", {NULL}, 4742, "tcp"}, -{"sicct-sdp", {NULL}, 4742, "udp"}, -{"openhpid", {NULL}, 4743, "tcp"}, -{"openhpid", {NULL}, 4743, "udp"}, -{"ifsp", {NULL}, 4744, "tcp"}, -{"ifsp", {NULL}, 4744, "udp"}, -{"fmp", {NULL}, 4745, "tcp"}, -{"fmp", {NULL}, 4745, "udp"}, -{"profilemac", {NULL}, 4749, "tcp"}, -{"profilemac", {NULL}, 4749, "udp"}, -{"ssad", {NULL}, 4750, "tcp"}, -{"ssad", {NULL}, 4750, "udp"}, -{"spocp", {NULL}, 4751, "tcp"}, -{"spocp", {NULL}, 4751, "udp"}, -{"snap", {NULL}, 4752, "tcp"}, -{"snap", {NULL}, 4752, "udp"}, -{"bfd-multi-ctl", {NULL}, 4784, "tcp"}, -{"bfd-multi-ctl", {NULL}, 4784, "udp"}, -{"cncp", {NULL}, 4785, "udp"}, -{"smart-install", {NULL}, 4786, "tcp"}, -{"sia-ctrl-plane", {NULL}, 4787, "tcp"}, -{"iims", {NULL}, 4800, "tcp"}, -{"iims", {NULL}, 4800, "udp"}, -{"iwec", {NULL}, 4801, "tcp"}, -{"iwec", {NULL}, 4801, "udp"}, -{"ilss", {NULL}, 4802, "tcp"}, -{"ilss", {NULL}, 4802, "udp"}, -{"notateit", {NULL}, 4803, "tcp"}, -{"notateit-disc", {NULL}, 4803, "udp"}, -{"aja-ntv4-disc", {NULL}, 4804, "udp"}, -{"htcp", {NULL}, 4827, "tcp"}, -{"htcp", {NULL}, 4827, "udp"}, -{"varadero-0", {NULL}, 4837, "tcp"}, -{"varadero-0", {NULL}, 4837, "udp"}, -{"varadero-1", {NULL}, 4838, "tcp"}, -{"varadero-1", {NULL}, 4838, "udp"}, -{"varadero-2", {NULL}, 4839, "tcp"}, -{"varadero-2", {NULL}, 4839, "udp"}, -{"opcua-tcp", {NULL}, 4840, "tcp"}, -{"opcua-udp", {NULL}, 4840, "udp"}, -{"quosa", {NULL}, 4841, "tcp"}, -{"quosa", {NULL}, 4841, "udp"}, -{"gw-asv", {NULL}, 4842, "tcp"}, -{"gw-asv", {NULL}, 4842, "udp"}, -{"opcua-tls", {NULL}, 4843, "tcp"}, -{"opcua-tls", {NULL}, 4843, "udp"}, -{"gw-log", {NULL}, 4844, "tcp"}, -{"gw-log", {NULL}, 4844, "udp"}, -{"wcr-remlib", {NULL}, 4845, "tcp"}, -{"wcr-remlib", {NULL}, 4845, "udp"}, -{"contamac_icm", {NULL}, 4846, "tcp"}, -{"contamac_icm", {NULL}, 4846, "udp"}, -{"wfc", {NULL}, 4847, "tcp"}, -{"wfc", {NULL}, 4847, "udp"}, -{"appserv-http", {NULL}, 4848, "tcp"}, -{"appserv-http", {NULL}, 4848, "udp"}, -{"appserv-https", {NULL}, 4849, "tcp"}, -{"appserv-https", {NULL}, 4849, "udp"}, -{"sun-as-nodeagt", {NULL}, 4850, "tcp"}, -{"sun-as-nodeagt", {NULL}, 4850, "udp"}, -{"derby-repli", {NULL}, 4851, "tcp"}, -{"derby-repli", {NULL}, 4851, "udp"}, -{"unify-debug", {NULL}, 4867, "tcp"}, -{"unify-debug", {NULL}, 4867, "udp"}, -{"phrelay", {NULL}, 4868, "tcp"}, -{"phrelay", {NULL}, 4868, "udp"}, -{"phrelaydbg", {NULL}, 4869, "tcp"}, -{"phrelaydbg", {NULL}, 4869, "udp"}, -{"cc-tracking", {NULL}, 4870, "tcp"}, -{"cc-tracking", {NULL}, 4870, "udp"}, -{"wired", {NULL}, 4871, "tcp"}, -{"wired", {NULL}, 4871, "udp"}, -{"tritium-can", {NULL}, 4876, "tcp"}, -{"tritium-can", {NULL}, 4876, "udp"}, -{"lmcs", {NULL}, 4877, "tcp"}, -{"lmcs", {NULL}, 4877, "udp"}, -{"inst-discovery", {NULL}, 4878, "udp"}, -{"wsdl-event", {NULL}, 4879, "tcp"}, -{"hislip", {NULL}, 4880, "tcp"}, -{"socp-t", {NULL}, 4881, "udp"}, -{"socp-c", {NULL}, 4882, "udp"}, -{"wmlserver", {NULL}, 4883, "tcp"}, -{"hivestor", {NULL}, 4884, "tcp"}, -{"hivestor", {NULL}, 4884, "udp"}, -{"abbs", {NULL}, 4885, "tcp"}, -{"abbs", {NULL}, 4885, "udp"}, -{"lyskom", {NULL}, 4894, "tcp"}, -{"lyskom", {NULL}, 4894, "udp"}, -{"radmin-port", {NULL}, 4899, "tcp"}, -{"radmin-port", {NULL}, 4899, "udp"}, -{"hfcs", {NULL}, 4900, "tcp"}, -{"hfcs", {NULL}, 4900, "udp"}, -{"flr_agent", {NULL}, 4901, "tcp"}, -{"magiccontrol", {NULL}, 4902, "tcp"}, -{"lutap", {NULL}, 4912, "tcp"}, -{"lutcp", {NULL}, 4913, "tcp"}, -{"bones", {NULL}, 4914, "tcp"}, -{"bones", {NULL}, 4914, "udp"}, -{"frcs", {NULL}, 4915, "tcp"}, -{"atsc-mh-ssc", {NULL}, 4937, "udp"}, -{"eq-office-4940", {NULL}, 4940, "tcp"}, -{"eq-office-4940", {NULL}, 4940, "udp"}, -{"eq-office-4941", {NULL}, 4941, "tcp"}, -{"eq-office-4941", {NULL}, 4941, "udp"}, -{"eq-office-4942", {NULL}, 4942, "tcp"}, -{"eq-office-4942", {NULL}, 4942, "udp"}, -{"munin", {NULL}, 4949, "tcp"}, -{"munin", {NULL}, 4949, "udp"}, -{"sybasesrvmon", {NULL}, 4950, "tcp"}, -{"sybasesrvmon", {NULL}, 4950, "udp"}, -{"pwgwims", {NULL}, 4951, "tcp"}, -{"pwgwims", {NULL}, 4951, "udp"}, -{"sagxtsds", {NULL}, 4952, "tcp"}, -{"sagxtsds", {NULL}, 4952, "udp"}, -{"dbsyncarbiter", {NULL}, 4953, "tcp"}, -{"ccss-qmm", {NULL}, 4969, "tcp"}, -{"ccss-qmm", {NULL}, 4969, "udp"}, -{"ccss-qsm", {NULL}, 4970, "tcp"}, -{"ccss-qsm", {NULL}, 4970, "udp"}, -{"webyast", {NULL}, 4984, "tcp"}, -{"gerhcs", {NULL}, 4985, "tcp"}, -{"mrip", {NULL}, 4986, "tcp"}, -{"mrip", {NULL}, 4986, "udp"}, -{"smar-se-port1", {NULL}, 4987, "tcp"}, -{"smar-se-port1", {NULL}, 4987, "udp"}, -{"smar-se-port2", {NULL}, 4988, "tcp"}, -{"smar-se-port2", {NULL}, 4988, "udp"}, -{"parallel", {NULL}, 4989, "tcp"}, -{"parallel", {NULL}, 4989, "udp"}, -{"busycal", {NULL}, 4990, "tcp"}, -{"busycal", {NULL}, 4990, "udp"}, -{"vrt", {NULL}, 4991, "tcp"}, -{"vrt", {NULL}, 4991, "udp"}, -{"hfcs-manager", {NULL}, 4999, "tcp"}, -{"hfcs-manager", {NULL}, 4999, "udp"}, -{"commplex-main", {NULL}, 5000, "tcp"}, -{"commplex-main", {NULL}, 5000, "udp"}, -{"commplex-link", {NULL}, 5001, "tcp"}, -{"commplex-link", {NULL}, 5001, "udp"}, -{"rfe", {NULL}, 5002, "tcp"}, -{"rfe", {NULL}, 5002, "udp"}, -{"fmpro-internal", {NULL}, 5003, "tcp"}, -{"fmpro-internal", {NULL}, 5003, "udp"}, -{"avt-profile-1", {NULL}, 5004, "tcp"}, -{"avt-profile-1", {NULL}, 5004, "udp"}, -{"avt-profile-1", {NULL}, 5004, "dccp"}, -{"avt-profile-2", {NULL}, 5005, "tcp"}, -{"avt-profile-2", {NULL}, 5005, "udp"}, -{"avt-profile-2", {NULL}, 5005, "dccp"}, -{"wsm-server", {NULL}, 5006, "tcp"}, -{"wsm-server", {NULL}, 5006, "udp"}, -{"wsm-server-ssl", {NULL}, 5007, "tcp"}, -{"wsm-server-ssl", {NULL}, 5007, "udp"}, -{"synapsis-edge", {NULL}, 5008, "tcp"}, -{"synapsis-edge", {NULL}, 5008, "udp"}, -{"winfs", {NULL}, 5009, "tcp"}, -{"winfs", {NULL}, 5009, "udp"}, -{"telelpathstart", {NULL}, 5010, "tcp"}, -{"telelpathstart", {NULL}, 5010, "udp"}, -{"telelpathattack", {NULL}, 5011, "tcp"}, -{"telelpathattack", {NULL}, 5011, "udp"}, -{"nsp", {NULL}, 5012, "tcp"}, -{"nsp", {NULL}, 5012, "udp"}, -{"fmpro-v6", {NULL}, 5013, "tcp"}, -{"fmpro-v6", {NULL}, 5013, "udp"}, -{"onpsocket", {NULL}, 5014, "udp"}, -{"fmwp", {NULL}, 5015, "tcp"}, -{"zenginkyo-1", {NULL}, 5020, "tcp"}, -{"zenginkyo-1", {NULL}, 5020, "udp"}, -{"zenginkyo-2", {NULL}, 5021, "tcp"}, -{"zenginkyo-2", {NULL}, 5021, "udp"}, -{"mice", {NULL}, 5022, "tcp"}, -{"mice", {NULL}, 5022, "udp"}, -{"htuilsrv", {NULL}, 5023, "tcp"}, -{"htuilsrv", {NULL}, 5023, "udp"}, -{"scpi-telnet", {NULL}, 5024, "tcp"}, -{"scpi-telnet", {NULL}, 5024, "udp"}, -{"scpi-raw", {NULL}, 5025, "tcp"}, -{"scpi-raw", {NULL}, 5025, "udp"}, -{"strexec-d", {NULL}, 5026, "tcp"}, -{"strexec-d", {NULL}, 5026, "udp"}, -{"strexec-s", {NULL}, 5027, "tcp"}, -{"strexec-s", {NULL}, 5027, "udp"}, -{"qvr", {NULL}, 5028, "tcp"}, -{"infobright", {NULL}, 5029, "tcp"}, -{"infobright", {NULL}, 5029, "udp"}, -{"surfpass", {NULL}, 5030, "tcp"}, -{"surfpass", {NULL}, 5030, "udp"}, -{"dmp", {NULL}, 5031, "udp"}, -{"asnaacceler8db", {NULL}, 5042, "tcp"}, -{"asnaacceler8db", {NULL}, 5042, "udp"}, -{"swxadmin", {NULL}, 5043, "tcp"}, -{"swxadmin", {NULL}, 5043, "udp"}, -{"lxi-evntsvc", {NULL}, 5044, "tcp"}, -{"lxi-evntsvc", {NULL}, 5044, "udp"}, -{"osp", {NULL}, 5045, "tcp"}, -{"vpm-udp", {NULL}, 5046, "udp"}, -{"iscape", {NULL}, 5047, "udp"}, -{"texai", {NULL}, 5048, "tcp"}, -{"ivocalize", {NULL}, 5049, "tcp"}, -{"ivocalize", {NULL}, 5049, "udp"}, -{"mmcc", {NULL}, 5050, "tcp"}, -{"mmcc", {NULL}, 5050, "udp"}, -{"ita-agent", {NULL}, 5051, "tcp"}, -{"ita-agent", {NULL}, 5051, "udp"}, -{"ita-manager", {NULL}, 5052, "tcp"}, -{"ita-manager", {NULL}, 5052, "udp"}, -{"rlm", {NULL}, 5053, "tcp"}, -{"rlm-admin", {NULL}, 5054, "tcp"}, -{"unot", {NULL}, 5055, "tcp"}, -{"unot", {NULL}, 5055, "udp"}, -{"intecom-ps1", {NULL}, 5056, "tcp"}, -{"intecom-ps1", {NULL}, 5056, "udp"}, -{"intecom-ps2", {NULL}, 5057, "tcp"}, -{"intecom-ps2", {NULL}, 5057, "udp"}, -{"locus-disc", {NULL}, 5058, "udp"}, -{"sds", {NULL}, 5059, "tcp"}, -{"sds", {NULL}, 5059, "udp"}, -{"sip", {NULL}, 5060, "tcp"}, -{"sip", {NULL}, 5060, "udp"}, -{"sip-tls", {NULL}, 5061, "tcp"}, -{"sip-tls", {NULL}, 5061, "udp"}, -{"na-localise", {NULL}, 5062, "tcp"}, -{"na-localise", {NULL}, 5062, "udp"}, -{"csrpc", {NULL}, 5063, "tcp"}, -{"ca-1", {NULL}, 5064, "tcp"}, -{"ca-1", {NULL}, 5064, "udp"}, -{"ca-2", {NULL}, 5065, "tcp"}, -{"ca-2", {NULL}, 5065, "udp"}, -{"stanag-5066", {NULL}, 5066, "tcp"}, -{"stanag-5066", {NULL}, 5066, "udp"}, -{"authentx", {NULL}, 5067, "tcp"}, -{"authentx", {NULL}, 5067, "udp"}, -{"bitforestsrv", {NULL}, 5068, "tcp"}, -{"i-net-2000-npr", {NULL}, 5069, "tcp"}, -{"i-net-2000-npr", {NULL}, 5069, "udp"}, -{"vtsas", {NULL}, 5070, "tcp"}, -{"vtsas", {NULL}, 5070, "udp"}, -{"powerschool", {NULL}, 5071, "tcp"}, -{"powerschool", {NULL}, 5071, "udp"}, -{"ayiya", {NULL}, 5072, "tcp"}, -{"ayiya", {NULL}, 5072, "udp"}, -{"tag-pm", {NULL}, 5073, "tcp"}, -{"tag-pm", {NULL}, 5073, "udp"}, -{"alesquery", {NULL}, 5074, "tcp"}, -{"alesquery", {NULL}, 5074, "udp"}, -{"cp-spxrpts", {NULL}, 5079, "udp"}, -{"onscreen", {NULL}, 5080, "tcp"}, -{"onscreen", {NULL}, 5080, "udp"}, -{"sdl-ets", {NULL}, 5081, "tcp"}, -{"sdl-ets", {NULL}, 5081, "udp"}, -{"qcp", {NULL}, 5082, "tcp"}, -{"qcp", {NULL}, 5082, "udp"}, -{"qfp", {NULL}, 5083, "tcp"}, -{"qfp", {NULL}, 5083, "udp"}, -{"llrp", {NULL}, 5084, "tcp"}, -{"llrp", {NULL}, 5084, "udp"}, -{"encrypted-llrp", {NULL}, 5085, "tcp"}, -{"encrypted-llrp", {NULL}, 5085, "udp"}, -{"aprigo-cs", {NULL}, 5086, "tcp"}, -{"car", {NULL}, 5090, "sctp"}, -{"cxtp", {NULL}, 5091, "sctp"}, -{"magpie", {NULL}, 5092, "udp"}, -{"sentinel-lm", {NULL}, 5093, "tcp"}, -{"sentinel-lm", {NULL}, 5093, "udp"}, -{"hart-ip", {NULL}, 5094, "tcp"}, -{"hart-ip", {NULL}, 5094, "udp"}, -{"sentlm-srv2srv", {NULL}, 5099, "tcp"}, -{"sentlm-srv2srv", {NULL}, 5099, "udp"}, -{"socalia", {NULL}, 5100, "tcp"}, -{"socalia", {NULL}, 5100, "udp"}, -{"talarian-tcp", {NULL}, 5101, "tcp"}, -{"talarian-udp", {NULL}, 5101, "udp"}, -{"oms-nonsecure", {NULL}, 5102, "tcp"}, -{"oms-nonsecure", {NULL}, 5102, "udp"}, -{"actifio-c2c", {NULL}, 5103, "tcp"}, -{"tinymessage", {NULL}, 5104, "udp"}, -{"hughes-ap", {NULL}, 5105, "udp"}, -{"taep-as-svc", {NULL}, 5111, "tcp"}, -{"taep-as-svc", {NULL}, 5111, "udp"}, -{"pm-cmdsvr", {NULL}, 5112, "tcp"}, -{"pm-cmdsvr", {NULL}, 5112, "udp"}, -{"ev-services", {NULL}, 5114, "tcp"}, -{"autobuild", {NULL}, 5115, "tcp"}, -{"emb-proj-cmd", {NULL}, 5116, "udp"}, -{"gradecam", {NULL}, 5117, "tcp"}, -{"nbt-pc", {NULL}, 5133, "tcp"}, -{"nbt-pc", {NULL}, 5133, "udp"}, -{"ppactivation", {NULL}, 5134, "tcp"}, -{"erp-scale", {NULL}, 5135, "tcp"}, -{"minotaur-sa", {NULL}, 5136, "udp"}, -{"ctsd", {NULL}, 5137, "tcp"}, -{"ctsd", {NULL}, 5137, "udp"}, -{"rmonitor_secure", {NULL}, 5145, "tcp"}, -{"rmonitor_secure", {NULL}, 5145, "udp"}, -{"social-alarm", {NULL}, 5146, "tcp"}, -{"atmp", {NULL}, 5150, "tcp"}, -{"atmp", {NULL}, 5150, "udp"}, -{"esri_sde", {NULL}, 5151, "tcp"}, -{"esri_sde", {NULL}, 5151, "udp"}, -{"sde-discovery", {NULL}, 5152, "tcp"}, -{"sde-discovery", {NULL}, 5152, "udp"}, -{"toruxserver", {NULL}, 5153, "tcp"}, -{"bzflag", {NULL}, 5154, "tcp"}, -{"bzflag", {NULL}, 5154, "udp"}, -{"asctrl-agent", {NULL}, 5155, "tcp"}, -{"asctrl-agent", {NULL}, 5155, "udp"}, -{"rugameonline", {NULL}, 5156, "tcp"}, -{"mediat", {NULL}, 5157, "tcp"}, -{"snmpssh", {NULL}, 5161, "tcp"}, -{"snmpssh-trap", {NULL}, 5162, "tcp"}, -{"sbackup", {NULL}, 5163, "tcp"}, -{"vpa", {NULL}, 5164, "tcp"}, -{"vpa-disc", {NULL}, 5164, "udp"}, -{"ife_icorp", {NULL}, 5165, "tcp"}, -{"ife_icorp", {NULL}, 5165, "udp"}, -{"winpcs", {NULL}, 5166, "tcp"}, -{"winpcs", {NULL}, 5166, "udp"}, -{"scte104", {NULL}, 5167, "tcp"}, -{"scte104", {NULL}, 5167, "udp"}, -{"scte30", {NULL}, 5168, "tcp"}, -{"scte30", {NULL}, 5168, "udp"}, -{"aol", {NULL}, 5190, "tcp"}, -{"aol", {NULL}, 5190, "udp"}, -{"aol-1", {NULL}, 5191, "tcp"}, -{"aol-1", {NULL}, 5191, "udp"}, -{"aol-2", {NULL}, 5192, "tcp"}, -{"aol-2", {NULL}, 5192, "udp"}, -{"aol-3", {NULL}, 5193, "tcp"}, -{"aol-3", {NULL}, 5193, "udp"}, -{"cpscomm", {NULL}, 5194, "tcp"}, -{"targus-getdata", {NULL}, 5200, "tcp"}, -{"targus-getdata", {NULL}, 5200, "udp"}, -{"targus-getdata1", {NULL}, 5201, "tcp"}, -{"targus-getdata1", {NULL}, 5201, "udp"}, -{"targus-getdata2", {NULL}, 5202, "tcp"}, -{"targus-getdata2", {NULL}, 5202, "udp"}, -{"targus-getdata3", {NULL}, 5203, "tcp"}, -{"targus-getdata3", {NULL}, 5203, "udp"}, -{"3exmp", {NULL}, 5221, "tcp"}, -{"xmpp-client", {NULL}, 5222, "tcp"}, -{"hpvirtgrp", {NULL}, 5223, "tcp"}, -{"hpvirtgrp", {NULL}, 5223, "udp"}, -{"hpvirtctrl", {NULL}, 5224, "tcp"}, -{"hpvirtctrl", {NULL}, 5224, "udp"}, -{"hp-server", {NULL}, 5225, "tcp"}, -{"hp-server", {NULL}, 5225, "udp"}, -{"hp-status", {NULL}, 5226, "tcp"}, -{"hp-status", {NULL}, 5226, "udp"}, -{"perfd", {NULL}, 5227, "tcp"}, -{"perfd", {NULL}, 5227, "udp"}, -{"hpvroom", {NULL}, 5228, "tcp"}, -{"csedaemon", {NULL}, 5232, "tcp"}, -{"enfs", {NULL}, 5233, "tcp"}, -{"eenet", {NULL}, 5234, "tcp"}, -{"eenet", {NULL}, 5234, "udp"}, -{"galaxy-network", {NULL}, 5235, "tcp"}, -{"galaxy-network", {NULL}, 5235, "udp"}, -{"padl2sim", {NULL}, 5236, "tcp"}, -{"padl2sim", {NULL}, 5236, "udp"}, -{"mnet-discovery", {NULL}, 5237, "tcp"}, -{"mnet-discovery", {NULL}, 5237, "udp"}, -{"downtools", {NULL}, 5245, "tcp"}, -{"downtools-disc", {NULL}, 5245, "udp"}, -{"capwap-control", {NULL}, 5246, "udp"}, -{"capwap-data", {NULL}, 5247, "udp"}, -{"caacws", {NULL}, 5248, "tcp"}, -{"caacws", {NULL}, 5248, "udp"}, -{"caaclang2", {NULL}, 5249, "tcp"}, -{"caaclang2", {NULL}, 5249, "udp"}, -{"soagateway", {NULL}, 5250, "tcp"}, -{"soagateway", {NULL}, 5250, "udp"}, -{"caevms", {NULL}, 5251, "tcp"}, -{"caevms", {NULL}, 5251, "udp"}, -{"movaz-ssc", {NULL}, 5252, "tcp"}, -{"movaz-ssc", {NULL}, 5252, "udp"}, -{"kpdp", {NULL}, 5253, "tcp"}, -{"3com-njack-1", {NULL}, 5264, "tcp"}, -{"3com-njack-1", {NULL}, 5264, "udp"}, -{"3com-njack-2", {NULL}, 5265, "tcp"}, -{"3com-njack-2", {NULL}, 5265, "udp"}, -{"xmpp-server", {NULL}, 5269, "tcp"}, -{"xmp", {NULL}, 5270, "tcp"}, -{"xmp", {NULL}, 5270, "udp"}, -{"cuelink", {NULL}, 5271, "tcp"}, -{"cuelink-disc", {NULL}, 5271, "udp"}, -{"pk", {NULL}, 5272, "tcp"}, -{"pk", {NULL}, 5272, "udp"}, -{"xmpp-bosh", {NULL}, 5280, "tcp"}, -{"undo-lm", {NULL}, 5281, "tcp"}, -{"transmit-port", {NULL}, 5282, "tcp"}, -{"transmit-port", {NULL}, 5282, "udp"}, -{"presence", {NULL}, 5298, "tcp"}, -{"presence", {NULL}, 5298, "udp"}, -{"nlg-data", {NULL}, 5299, "tcp"}, -{"nlg-data", {NULL}, 5299, "udp"}, -{"hacl-hb", {NULL}, 5300, "tcp"}, -{"hacl-hb", {NULL}, 5300, "udp"}, -{"hacl-gs", {NULL}, 5301, "tcp"}, -{"hacl-gs", {NULL}, 5301, "udp"}, -{"hacl-cfg", {NULL}, 5302, "tcp"}, -{"hacl-cfg", {NULL}, 5302, "udp"}, -{"hacl-probe", {NULL}, 5303, "tcp"}, -{"hacl-probe", {NULL}, 5303, "udp"}, -{"hacl-local", {NULL}, 5304, "tcp"}, -{"hacl-local", {NULL}, 5304, "udp"}, -{"hacl-test", {NULL}, 5305, "tcp"}, -{"hacl-test", {NULL}, 5305, "udp"}, -{"sun-mc-grp", {NULL}, 5306, "tcp"}, -{"sun-mc-grp", {NULL}, 5306, "udp"}, -{"sco-aip", {NULL}, 5307, "tcp"}, -{"sco-aip", {NULL}, 5307, "udp"}, -{"cfengine", {NULL}, 5308, "tcp"}, -{"cfengine", {NULL}, 5308, "udp"}, -{"jprinter", {NULL}, 5309, "tcp"}, -{"jprinter", {NULL}, 5309, "udp"}, -{"outlaws", {NULL}, 5310, "tcp"}, -{"outlaws", {NULL}, 5310, "udp"}, -{"permabit-cs", {NULL}, 5312, "tcp"}, -{"permabit-cs", {NULL}, 5312, "udp"}, -{"rrdp", {NULL}, 5313, "tcp"}, -{"rrdp", {NULL}, 5313, "udp"}, -{"opalis-rbt-ipc", {NULL}, 5314, "tcp"}, -{"opalis-rbt-ipc", {NULL}, 5314, "udp"}, -{"hacl-poll", {NULL}, 5315, "tcp"}, -{"hacl-poll", {NULL}, 5315, "udp"}, -{"hpdevms", {NULL}, 5316, "tcp"}, -{"hpdevms", {NULL}, 5316, "udp"}, -{"bsfserver-zn", {NULL}, 5320, "tcp"}, -{"bsfsvr-zn-ssl", {NULL}, 5321, "tcp"}, -{"kfserver", {NULL}, 5343, "tcp"}, -{"kfserver", {NULL}, 5343, "udp"}, -{"xkotodrcp", {NULL}, 5344, "tcp"}, -{"xkotodrcp", {NULL}, 5344, "udp"}, -{"stuns", {NULL}, 5349, "tcp"}, -{"stuns", {NULL}, 5349, "udp"}, -{"turns", {NULL}, 5349, "tcp"}, -{"turns", {NULL}, 5349, "udp"}, -{"stun-behaviors", {NULL}, 5349, "tcp"}, -{"stun-behaviors", {NULL}, 5349, "udp"}, -{"nat-pmp-status", {NULL}, 5350, "tcp"}, -{"nat-pmp-status", {NULL}, 5350, "udp"}, -{"nat-pmp", {NULL}, 5351, "tcp"}, -{"nat-pmp", {NULL}, 5351, "udp"}, -{"dns-llq", {NULL}, 5352, "tcp"}, -{"dns-llq", {NULL}, 5352, "udp"}, -{"mdns", {NULL}, 5353, "tcp"}, -{"mdns", {NULL}, 5353, "udp"}, -{"mdnsresponder", {NULL}, 5354, "tcp"}, -{"mdnsresponder", {NULL}, 5354, "udp"}, -{"llmnr", {NULL}, 5355, "tcp"}, -{"llmnr", {NULL}, 5355, "udp"}, -{"ms-smlbiz", {NULL}, 5356, "tcp"}, -{"ms-smlbiz", {NULL}, 5356, "udp"}, -{"wsdapi", {NULL}, 5357, "tcp"}, -{"wsdapi", {NULL}, 5357, "udp"}, -{"wsdapi-s", {NULL}, 5358, "tcp"}, -{"wsdapi-s", {NULL}, 5358, "udp"}, -{"ms-alerter", {NULL}, 5359, "tcp"}, -{"ms-alerter", {NULL}, 5359, "udp"}, -{"ms-sideshow", {NULL}, 5360, "tcp"}, -{"ms-sideshow", {NULL}, 5360, "udp"}, -{"ms-s-sideshow", {NULL}, 5361, "tcp"}, -{"ms-s-sideshow", {NULL}, 5361, "udp"}, -{"serverwsd2", {NULL}, 5362, "tcp"}, -{"serverwsd2", {NULL}, 5362, "udp"}, -{"net-projection", {NULL}, 5363, "tcp"}, -{"net-projection", {NULL}, 5363, "udp"}, -{"stresstester", {NULL}, 5397, "tcp"}, -{"stresstester", {NULL}, 5397, "udp"}, -{"elektron-admin", {NULL}, 5398, "tcp"}, -{"elektron-admin", {NULL}, 5398, "udp"}, -{"securitychase", {NULL}, 5399, "tcp"}, -{"securitychase", {NULL}, 5399, "udp"}, -{"excerpt", {NULL}, 5400, "tcp"}, -{"excerpt", {NULL}, 5400, "udp"}, -{"excerpts", {NULL}, 5401, "tcp"}, -{"excerpts", {NULL}, 5401, "udp"}, -{"mftp", {NULL}, 5402, "tcp"}, -{"mftp", {NULL}, 5402, "udp"}, -{"hpoms-ci-lstn", {NULL}, 5403, "tcp"}, -{"hpoms-ci-lstn", {NULL}, 5403, "udp"}, -{"hpoms-dps-lstn", {NULL}, 5404, "tcp"}, -{"hpoms-dps-lstn", {NULL}, 5404, "udp"}, -{"netsupport", {NULL}, 5405, "tcp"}, -{"netsupport", {NULL}, 5405, "udp"}, -{"systemics-sox", {NULL}, 5406, "tcp"}, -{"systemics-sox", {NULL}, 5406, "udp"}, -{"foresyte-clear", {NULL}, 5407, "tcp"}, -{"foresyte-clear", {NULL}, 5407, "udp"}, -{"foresyte-sec", {NULL}, 5408, "tcp"}, -{"foresyte-sec", {NULL}, 5408, "udp"}, -{"salient-dtasrv", {NULL}, 5409, "tcp"}, -{"salient-dtasrv", {NULL}, 5409, "udp"}, -{"salient-usrmgr", {NULL}, 5410, "tcp"}, -{"salient-usrmgr", {NULL}, 5410, "udp"}, -{"actnet", {NULL}, 5411, "tcp"}, -{"actnet", {NULL}, 5411, "udp"}, -{"continuus", {NULL}, 5412, "tcp"}, -{"continuus", {NULL}, 5412, "udp"}, -{"wwiotalk", {NULL}, 5413, "tcp"}, -{"wwiotalk", {NULL}, 5413, "udp"}, -{"statusd", {NULL}, 5414, "tcp"}, -{"statusd", {NULL}, 5414, "udp"}, -{"ns-server", {NULL}, 5415, "tcp"}, -{"ns-server", {NULL}, 5415, "udp"}, -{"sns-gateway", {NULL}, 5416, "tcp"}, -{"sns-gateway", {NULL}, 5416, "udp"}, -{"sns-agent", {NULL}, 5417, "tcp"}, -{"sns-agent", {NULL}, 5417, "udp"}, -{"mcntp", {NULL}, 5418, "tcp"}, -{"mcntp", {NULL}, 5418, "udp"}, -{"dj-ice", {NULL}, 5419, "tcp"}, -{"dj-ice", {NULL}, 5419, "udp"}, -{"cylink-c", {NULL}, 5420, "tcp"}, -{"cylink-c", {NULL}, 5420, "udp"}, -{"netsupport2", {NULL}, 5421, "tcp"}, -{"netsupport2", {NULL}, 5421, "udp"}, -{"salient-mux", {NULL}, 5422, "tcp"}, -{"salient-mux", {NULL}, 5422, "udp"}, -{"virtualuser", {NULL}, 5423, "tcp"}, -{"virtualuser", {NULL}, 5423, "udp"}, -{"beyond-remote", {NULL}, 5424, "tcp"}, -{"beyond-remote", {NULL}, 5424, "udp"}, -{"br-channel", {NULL}, 5425, "tcp"}, -{"br-channel", {NULL}, 5425, "udp"}, -{"devbasic", {NULL}, 5426, "tcp"}, -{"devbasic", {NULL}, 5426, "udp"}, -{"sco-peer-tta", {NULL}, 5427, "tcp"}, -{"sco-peer-tta", {NULL}, 5427, "udp"}, -{"telaconsole", {NULL}, 5428, "tcp"}, -{"telaconsole", {NULL}, 5428, "udp"}, -{"base", {NULL}, 5429, "tcp"}, -{"base", {NULL}, 5429, "udp"}, -{"radec-corp", {NULL}, 5430, "tcp"}, -{"radec-corp", {NULL}, 5430, "udp"}, -{"park-agent", {NULL}, 5431, "tcp"}, -{"park-agent", {NULL}, 5431, "udp"}, -{"postgresql", {NULL}, 5432, "tcp"}, -{"postgresql", {NULL}, 5432, "udp"}, -{"pyrrho", {NULL}, 5433, "tcp"}, -{"pyrrho", {NULL}, 5433, "udp"}, -{"sgi-arrayd", {NULL}, 5434, "tcp"}, -{"sgi-arrayd", {NULL}, 5434, "udp"}, -{"sceanics", {NULL}, 5435, "tcp"}, -{"sceanics", {NULL}, 5435, "udp"}, -{"pmip6-cntl", {NULL}, 5436, "udp"}, -{"pmip6-data", {NULL}, 5437, "udp"}, -{"spss", {NULL}, 5443, "tcp"}, -{"spss", {NULL}, 5443, "udp"}, -{"surebox", {NULL}, 5453, "tcp"}, -{"surebox", {NULL}, 5453, "udp"}, -{"apc-5454", {NULL}, 5454, "tcp"}, -{"apc-5454", {NULL}, 5454, "udp"}, -{"apc-5455", {NULL}, 5455, "tcp"}, -{"apc-5455", {NULL}, 5455, "udp"}, -{"apc-5456", {NULL}, 5456, "tcp"}, -{"apc-5456", {NULL}, 5456, "udp"}, -{"silkmeter", {NULL}, 5461, "tcp"}, -{"silkmeter", {NULL}, 5461, "udp"}, -{"ttl-publisher", {NULL}, 5462, "tcp"}, -{"ttl-publisher", {NULL}, 5462, "udp"}, -{"ttlpriceproxy", {NULL}, 5463, "tcp"}, -{"ttlpriceproxy", {NULL}, 5463, "udp"}, -{"quailnet", {NULL}, 5464, "tcp"}, -{"quailnet", {NULL}, 5464, "udp"}, -{"netops-broker", {NULL}, 5465, "tcp"}, -{"netops-broker", {NULL}, 5465, "udp"}, -{"fcp-addr-srvr1", {NULL}, 5500, "tcp"}, -{"fcp-addr-srvr1", {NULL}, 5500, "udp"}, -{"fcp-addr-srvr2", {NULL}, 5501, "tcp"}, -{"fcp-addr-srvr2", {NULL}, 5501, "udp"}, -{"fcp-srvr-inst1", {NULL}, 5502, "tcp"}, -{"fcp-srvr-inst1", {NULL}, 5502, "udp"}, -{"fcp-srvr-inst2", {NULL}, 5503, "tcp"}, -{"fcp-srvr-inst2", {NULL}, 5503, "udp"}, -{"fcp-cics-gw1", {NULL}, 5504, "tcp"}, -{"fcp-cics-gw1", {NULL}, 5504, "udp"}, -{"checkoutdb", {NULL}, 5505, "tcp"}, -{"checkoutdb", {NULL}, 5505, "udp"}, -{"amc", {NULL}, 5506, "tcp"}, -{"amc", {NULL}, 5506, "udp"}, -{"sgi-eventmond", {NULL}, 5553, "tcp"}, -{"sgi-eventmond", {NULL}, 5553, "udp"}, -{"sgi-esphttp", {NULL}, 5554, "tcp"}, -{"sgi-esphttp", {NULL}, 5554, "udp"}, -{"personal-agent", {NULL}, 5555, "tcp"}, -{"personal-agent", {NULL}, 5555, "udp"}, -{"freeciv", {NULL}, 5556, "tcp"}, -{"freeciv", {NULL}, 5556, "udp"}, -{"farenet", {NULL}, 5557, "tcp"}, -{"westec-connect", {NULL}, 5566, "tcp"}, -{"m-oap", {NULL}, 5567, "tcp"}, -{"m-oap", {NULL}, 5567, "udp"}, -{"sdt", {NULL}, 5568, "tcp"}, -{"sdt", {NULL}, 5568, "udp"}, -{"sdmmp", {NULL}, 5573, "tcp"}, -{"sdmmp", {NULL}, 5573, "udp"}, -{"lsi-bobcat", {NULL}, 5574, "tcp"}, -{"ora-oap", {NULL}, 5575, "tcp"}, -{"fdtracks", {NULL}, 5579, "tcp"}, -{"tmosms0", {NULL}, 5580, "tcp"}, -{"tmosms0", {NULL}, 5580, "udp"}, -{"tmosms1", {NULL}, 5581, "tcp"}, -{"tmosms1", {NULL}, 5581, "udp"}, -{"fac-restore", {NULL}, 5582, "tcp"}, -{"fac-restore", {NULL}, 5582, "udp"}, -{"tmo-icon-sync", {NULL}, 5583, "tcp"}, -{"tmo-icon-sync", {NULL}, 5583, "udp"}, -{"bis-web", {NULL}, 5584, "tcp"}, -{"bis-web", {NULL}, 5584, "udp"}, -{"bis-sync", {NULL}, 5585, "tcp"}, -{"bis-sync", {NULL}, 5585, "udp"}, -{"ininmessaging", {NULL}, 5597, "tcp"}, -{"ininmessaging", {NULL}, 5597, "udp"}, -{"mctfeed", {NULL}, 5598, "tcp"}, -{"mctfeed", {NULL}, 5598, "udp"}, -{"esinstall", {NULL}, 5599, "tcp"}, -{"esinstall", {NULL}, 5599, "udp"}, -{"esmmanager", {NULL}, 5600, "tcp"}, -{"esmmanager", {NULL}, 5600, "udp"}, -{"esmagent", {NULL}, 5601, "tcp"}, -{"esmagent", {NULL}, 5601, "udp"}, -{"a1-msc", {NULL}, 5602, "tcp"}, -{"a1-msc", {NULL}, 5602, "udp"}, -{"a1-bs", {NULL}, 5603, "tcp"}, -{"a1-bs", {NULL}, 5603, "udp"}, -{"a3-sdunode", {NULL}, 5604, "tcp"}, -{"a3-sdunode", {NULL}, 5604, "udp"}, -{"a4-sdunode", {NULL}, 5605, "tcp"}, -{"a4-sdunode", {NULL}, 5605, "udp"}, -{"ninaf", {NULL}, 5627, "tcp"}, -{"ninaf", {NULL}, 5627, "udp"}, -{"htrust", {NULL}, 5628, "tcp"}, -{"htrust", {NULL}, 5628, "udp"}, -{"symantec-sfdb", {NULL}, 5629, "tcp"}, -{"symantec-sfdb", {NULL}, 5629, "udp"}, -{"precise-comm", {NULL}, 5630, "tcp"}, -{"precise-comm", {NULL}, 5630, "udp"}, -{"pcanywheredata", {NULL}, 5631, "tcp"}, -{"pcanywheredata", {NULL}, 5631, "udp"}, -{"pcanywherestat", {NULL}, 5632, "tcp"}, -{"pcanywherestat", {NULL}, 5632, "udp"}, -{"beorl", {NULL}, 5633, "tcp"}, -{"beorl", {NULL}, 5633, "udp"}, -{"xprtld", {NULL}, 5634, "tcp"}, -{"xprtld", {NULL}, 5634, "udp"}, -{"sfmsso", {NULL}, 5635, "tcp"}, -{"sfm-db-server", {NULL}, 5636, "tcp"}, -{"cssc", {NULL}, 5637, "tcp"}, -{"amqps", {NULL}, 5671, "tcp"}, -{"amqps", {NULL}, 5671, "udp"}, -{"amqp", {NULL}, 5672, "tcp"}, -{"amqp", {NULL}, 5672, "udp"}, -{"amqp", {NULL}, 5672, "sctp"}, -{"jms", {NULL}, 5673, "tcp"}, -{"jms", {NULL}, 5673, "udp"}, -{"hyperscsi-port", {NULL}, 5674, "tcp"}, -{"hyperscsi-port", {NULL}, 5674, "udp"}, -{"v5ua", {NULL}, 5675, "tcp"}, -{"v5ua", {NULL}, 5675, "udp"}, -{"v5ua", {NULL}, 5675, "sctp"}, -{"raadmin", {NULL}, 5676, "tcp"}, -{"raadmin", {NULL}, 5676, "udp"}, -{"questdb2-lnchr", {NULL}, 5677, "tcp"}, -{"questdb2-lnchr", {NULL}, 5677, "udp"}, -{"rrac", {NULL}, 5678, "tcp"}, -{"rrac", {NULL}, 5678, "udp"}, -{"dccm", {NULL}, 5679, "tcp"}, -{"dccm", {NULL}, 5679, "udp"}, -{"auriga-router", {NULL}, 5680, "tcp"}, -{"auriga-router", {NULL}, 5680, "udp"}, -{"ncxcp", {NULL}, 5681, "tcp"}, -{"ncxcp", {NULL}, 5681, "udp"}, -{"brightcore", {NULL}, 5682, "udp"}, -{"ggz", {NULL}, 5688, "tcp"}, -{"ggz", {NULL}, 5688, "udp"}, -{"qmvideo", {NULL}, 5689, "tcp"}, -{"qmvideo", {NULL}, 5689, "udp"}, -{"proshareaudio", {NULL}, 5713, "tcp"}, -{"proshareaudio", {NULL}, 5713, "udp"}, -{"prosharevideo", {NULL}, 5714, "tcp"}, -{"prosharevideo", {NULL}, 5714, "udp"}, -{"prosharedata", {NULL}, 5715, "tcp"}, -{"prosharedata", {NULL}, 5715, "udp"}, -{"prosharerequest", {NULL}, 5716, "tcp"}, -{"prosharerequest", {NULL}, 5716, "udp"}, -{"prosharenotify", {NULL}, 5717, "tcp"}, -{"prosharenotify", {NULL}, 5717, "udp"}, -{"dpm", {NULL}, 5718, "tcp"}, -{"dpm", {NULL}, 5718, "udp"}, -{"dpm-agent", {NULL}, 5719, "tcp"}, -{"dpm-agent", {NULL}, 5719, "udp"}, -{"ms-licensing", {NULL}, 5720, "tcp"}, -{"ms-licensing", {NULL}, 5720, "udp"}, -{"dtpt", {NULL}, 5721, "tcp"}, -{"dtpt", {NULL}, 5721, "udp"}, -{"msdfsr", {NULL}, 5722, "tcp"}, -{"msdfsr", {NULL}, 5722, "udp"}, -{"omhs", {NULL}, 5723, "tcp"}, -{"omhs", {NULL}, 5723, "udp"}, -{"omsdk", {NULL}, 5724, "tcp"}, -{"omsdk", {NULL}, 5724, "udp"}, -{"ms-ilm", {NULL}, 5725, "tcp"}, -{"ms-ilm-sts", {NULL}, 5726, "tcp"}, -{"asgenf", {NULL}, 5727, "tcp"}, -{"io-dist-data", {NULL}, 5728, "tcp"}, -{"io-dist-group", {NULL}, 5728, "udp"}, -{"openmail", {NULL}, 5729, "tcp"}, -{"openmail", {NULL}, 5729, "udp"}, -{"unieng", {NULL}, 5730, "tcp"}, -{"unieng", {NULL}, 5730, "udp"}, -{"ida-discover1", {NULL}, 5741, "tcp"}, -{"ida-discover1", {NULL}, 5741, "udp"}, -{"ida-discover2", {NULL}, 5742, "tcp"}, -{"ida-discover2", {NULL}, 5742, "udp"}, -{"watchdoc-pod", {NULL}, 5743, "tcp"}, -{"watchdoc-pod", {NULL}, 5743, "udp"}, -{"watchdoc", {NULL}, 5744, "tcp"}, -{"watchdoc", {NULL}, 5744, "udp"}, -{"fcopy-server", {NULL}, 5745, "tcp"}, -{"fcopy-server", {NULL}, 5745, "udp"}, -{"fcopys-server", {NULL}, 5746, "tcp"}, -{"fcopys-server", {NULL}, 5746, "udp"}, -{"tunatic", {NULL}, 5747, "tcp"}, -{"tunatic", {NULL}, 5747, "udp"}, -{"tunalyzer", {NULL}, 5748, "tcp"}, -{"tunalyzer", {NULL}, 5748, "udp"}, -{"rscd", {NULL}, 5750, "tcp"}, -{"rscd", {NULL}, 5750, "udp"}, -{"openmailg", {NULL}, 5755, "tcp"}, -{"openmailg", {NULL}, 5755, "udp"}, -{"x500ms", {NULL}, 5757, "tcp"}, -{"x500ms", {NULL}, 5757, "udp"}, -{"openmailns", {NULL}, 5766, "tcp"}, -{"openmailns", {NULL}, 5766, "udp"}, -{"s-openmail", {NULL}, 5767, "tcp"}, -{"s-openmail", {NULL}, 5767, "udp"}, -{"openmailpxy", {NULL}, 5768, "tcp"}, -{"openmailpxy", {NULL}, 5768, "udp"}, -{"spramsca", {NULL}, 5769, "tcp"}, -{"spramsca", {NULL}, 5769, "udp"}, -{"spramsd", {NULL}, 5770, "tcp"}, -{"spramsd", {NULL}, 5770, "udp"}, -{"netagent", {NULL}, 5771, "tcp"}, -{"netagent", {NULL}, 5771, "udp"}, -{"dali-port", {NULL}, 5777, "tcp"}, -{"dali-port", {NULL}, 5777, "udp"}, -{"vts-rpc", {NULL}, 5780, "tcp"}, -{"3par-evts", {NULL}, 5781, "tcp"}, -{"3par-evts", {NULL}, 5781, "udp"}, -{"3par-mgmt", {NULL}, 5782, "tcp"}, -{"3par-mgmt", {NULL}, 5782, "udp"}, -{"3par-mgmt-ssl", {NULL}, 5783, "tcp"}, -{"3par-mgmt-ssl", {NULL}, 5783, "udp"}, -{"ibar", {NULL}, 5784, "udp"}, -{"3par-rcopy", {NULL}, 5785, "tcp"}, -{"3par-rcopy", {NULL}, 5785, "udp"}, -{"cisco-redu", {NULL}, 5786, "udp"}, -{"waascluster", {NULL}, 5787, "udp"}, -{"xtreamx", {NULL}, 5793, "tcp"}, -{"xtreamx", {NULL}, 5793, "udp"}, -{"spdp", {NULL}, 5794, "udp"}, -{"icmpd", {NULL}, 5813, "tcp"}, -{"icmpd", {NULL}, 5813, "udp"}, -{"spt-automation", {NULL}, 5814, "tcp"}, -{"spt-automation", {NULL}, 5814, "udp"}, -{"wherehoo", {NULL}, 5859, "tcp"}, -{"wherehoo", {NULL}, 5859, "udp"}, -{"ppsuitemsg", {NULL}, 5863, "tcp"}, -{"ppsuitemsg", {NULL}, 5863, "udp"}, -{"rfb", {NULL}, 5900, "tcp"}, -{"rfb", {NULL}, 5900, "udp"}, -{"cm", {NULL}, 5910, "tcp"}, -{"cm", {NULL}, 5910, "udp"}, -{"cpdlc", {NULL}, 5911, "tcp"}, -{"cpdlc", {NULL}, 5911, "udp"}, -{"fis", {NULL}, 5912, "tcp"}, -{"fis", {NULL}, 5912, "udp"}, -{"ads-c", {NULL}, 5913, "tcp"}, -{"ads-c", {NULL}, 5913, "udp"}, -{"indy", {NULL}, 5963, "tcp"}, -{"indy", {NULL}, 5963, "udp"}, -{"mppolicy-v5", {NULL}, 5968, "tcp"}, -{"mppolicy-v5", {NULL}, 5968, "udp"}, -{"mppolicy-mgr", {NULL}, 5969, "tcp"}, -{"mppolicy-mgr", {NULL}, 5969, "udp"}, -{"couchdb", {NULL}, 5984, "tcp"}, -{"couchdb", {NULL}, 5984, "udp"}, -{"wsman", {NULL}, 5985, "tcp"}, -{"wsman", {NULL}, 5985, "udp"}, -{"wsmans", {NULL}, 5986, "tcp"}, -{"wsmans", {NULL}, 5986, "udp"}, -{"wbem-rmi", {NULL}, 5987, "tcp"}, -{"wbem-rmi", {NULL}, 5987, "udp"}, -{"wbem-http", {NULL}, 5988, "tcp"}, -{"wbem-http", {NULL}, 5988, "udp"}, -{"wbem-https", {NULL}, 5989, "tcp"}, -{"wbem-https", {NULL}, 5989, "udp"}, -{"wbem-exp-https", {NULL}, 5990, "tcp"}, -{"wbem-exp-https", {NULL}, 5990, "udp"}, -{"nuxsl", {NULL}, 5991, "tcp"}, -{"nuxsl", {NULL}, 5991, "udp"}, -{"consul-insight", {NULL}, 5992, "tcp"}, -{"consul-insight", {NULL}, 5992, "udp"}, -{"cvsup", {NULL}, 5999, "tcp"}, -{"cvsup", {NULL}, 5999, "udp"}, -{"ndl-ahp-svc", {NULL}, 6064, "tcp"}, -{"ndl-ahp-svc", {NULL}, 6064, "udp"}, -{"winpharaoh", {NULL}, 6065, "tcp"}, -{"winpharaoh", {NULL}, 6065, "udp"}, -{"ewctsp", {NULL}, 6066, "tcp"}, -{"ewctsp", {NULL}, 6066, "udp"}, -{"gsmp", {NULL}, 6068, "tcp"}, -{"gsmp", {NULL}, 6068, "udp"}, -{"trip", {NULL}, 6069, "tcp"}, -{"trip", {NULL}, 6069, "udp"}, -{"messageasap", {NULL}, 6070, "tcp"}, -{"messageasap", {NULL}, 6070, "udp"}, -{"ssdtp", {NULL}, 6071, "tcp"}, -{"ssdtp", {NULL}, 6071, "udp"}, -{"diagnose-proc", {NULL}, 6072, "tcp"}, -{"diagnose-proc", {NULL}, 6072, "udp"}, -{"directplay8", {NULL}, 6073, "tcp"}, -{"directplay8", {NULL}, 6073, "udp"}, -{"max", {NULL}, 6074, "tcp"}, -{"max", {NULL}, 6074, "udp"}, -{"dpm-acm", {NULL}, 6075, "tcp"}, -{"miami-bcast", {NULL}, 6083, "udp"}, -{"p2p-sip", {NULL}, 6084, "tcp"}, -{"konspire2b", {NULL}, 6085, "tcp"}, -{"konspire2b", {NULL}, 6085, "udp"}, -{"pdtp", {NULL}, 6086, "tcp"}, -{"pdtp", {NULL}, 6086, "udp"}, -{"ldss", {NULL}, 6087, "tcp"}, -{"ldss", {NULL}, 6087, "udp"}, -{"raxa-mgmt", {NULL}, 6099, "tcp"}, -{"synchronet-db", {NULL}, 6100, "tcp"}, -{"synchronet-db", {NULL}, 6100, "udp"}, -{"synchronet-rtc", {NULL}, 6101, "tcp"}, -{"synchronet-rtc", {NULL}, 6101, "udp"}, -{"synchronet-upd", {NULL}, 6102, "tcp"}, -{"synchronet-upd", {NULL}, 6102, "udp"}, -{"rets", {NULL}, 6103, "tcp"}, -{"rets", {NULL}, 6103, "udp"}, -{"dbdb", {NULL}, 6104, "tcp"}, -{"dbdb", {NULL}, 6104, "udp"}, -{"primaserver", {NULL}, 6105, "tcp"}, -{"primaserver", {NULL}, 6105, "udp"}, -{"mpsserver", {NULL}, 6106, "tcp"}, -{"mpsserver", {NULL}, 6106, "udp"}, -{"etc-control", {NULL}, 6107, "tcp"}, -{"etc-control", {NULL}, 6107, "udp"}, -{"sercomm-scadmin", {NULL}, 6108, "tcp"}, -{"sercomm-scadmin", {NULL}, 6108, "udp"}, -{"globecast-id", {NULL}, 6109, "tcp"}, -{"globecast-id", {NULL}, 6109, "udp"}, -{"softcm", {NULL}, 6110, "tcp"}, -{"softcm", {NULL}, 6110, "udp"}, -{"spc", {NULL}, 6111, "tcp"}, -{"spc", {NULL}, 6111, "udp"}, -{"dtspcd", {NULL}, 6112, "tcp"}, -{"dtspcd", {NULL}, 6112, "udp"}, -{"dayliteserver", {NULL}, 6113, "tcp"}, -{"wrspice", {NULL}, 6114, "tcp"}, -{"xic", {NULL}, 6115, "tcp"}, -{"xtlserv", {NULL}, 6116, "tcp"}, -{"daylitetouch", {NULL}, 6117, "tcp"}, -{"spdy", {NULL}, 6121, "tcp"}, -{"bex-webadmin", {NULL}, 6122, "tcp"}, -{"bex-webadmin", {NULL}, 6122, "udp"}, -{"backup-express", {NULL}, 6123, "tcp"}, -{"backup-express", {NULL}, 6123, "udp"}, -{"pnbs", {NULL}, 6124, "tcp"}, -{"pnbs", {NULL}, 6124, "udp"}, -{"nbt-wol", {NULL}, 6133, "tcp"}, -{"nbt-wol", {NULL}, 6133, "udp"}, -{"pulsonixnls", {NULL}, 6140, "tcp"}, -{"pulsonixnls", {NULL}, 6140, "udp"}, -{"meta-corp", {NULL}, 6141, "tcp"}, -{"meta-corp", {NULL}, 6141, "udp"}, -{"aspentec-lm", {NULL}, 6142, "tcp"}, -{"aspentec-lm", {NULL}, 6142, "udp"}, -{"watershed-lm", {NULL}, 6143, "tcp"}, -{"watershed-lm", {NULL}, 6143, "udp"}, -{"statsci1-lm", {NULL}, 6144, "tcp"}, -{"statsci1-lm", {NULL}, 6144, "udp"}, -{"statsci2-lm", {NULL}, 6145, "tcp"}, -{"statsci2-lm", {NULL}, 6145, "udp"}, -{"lonewolf-lm", {NULL}, 6146, "tcp"}, -{"lonewolf-lm", {NULL}, 6146, "udp"}, -{"montage-lm", {NULL}, 6147, "tcp"}, -{"montage-lm", {NULL}, 6147, "udp"}, -{"ricardo-lm", {NULL}, 6148, "tcp"}, -{"ricardo-lm", {NULL}, 6148, "udp"}, -{"tal-pod", {NULL}, 6149, "tcp"}, -{"tal-pod", {NULL}, 6149, "udp"}, -{"efb-aci", {NULL}, 6159, "tcp"}, -{"patrol-ism", {NULL}, 6161, "tcp"}, -{"patrol-ism", {NULL}, 6161, "udp"}, -{"patrol-coll", {NULL}, 6162, "tcp"}, -{"patrol-coll", {NULL}, 6162, "udp"}, -{"pscribe", {NULL}, 6163, "tcp"}, -{"pscribe", {NULL}, 6163, "udp"}, -{"lm-x", {NULL}, 6200, "tcp"}, -{"lm-x", {NULL}, 6200, "udp"}, -{"radmind", {NULL}, 6222, "tcp"}, -{"radmind", {NULL}, 6222, "udp"}, -{"jeol-nsdtp-1", {NULL}, 6241, "tcp"}, -{"jeol-nsddp-1", {NULL}, 6241, "udp"}, -{"jeol-nsdtp-2", {NULL}, 6242, "tcp"}, -{"jeol-nsddp-2", {NULL}, 6242, "udp"}, -{"jeol-nsdtp-3", {NULL}, 6243, "tcp"}, -{"jeol-nsddp-3", {NULL}, 6243, "udp"}, -{"jeol-nsdtp-4", {NULL}, 6244, "tcp"}, -{"jeol-nsddp-4", {NULL}, 6244, "udp"}, -{"tl1-raw-ssl", {NULL}, 6251, "tcp"}, -{"tl1-raw-ssl", {NULL}, 6251, "udp"}, -{"tl1-ssh", {NULL}, 6252, "tcp"}, -{"tl1-ssh", {NULL}, 6252, "udp"}, -{"crip", {NULL}, 6253, "tcp"}, -{"crip", {NULL}, 6253, "udp"}, -{"gld", {NULL}, 6267, "tcp"}, -{"grid", {NULL}, 6268, "tcp"}, -{"grid", {NULL}, 6268, "udp"}, -{"grid-alt", {NULL}, 6269, "tcp"}, -{"grid-alt", {NULL}, 6269, "udp"}, -{"bmc-grx", {NULL}, 6300, "tcp"}, -{"bmc-grx", {NULL}, 6300, "udp"}, -{"bmc_ctd_ldap", {NULL}, 6301, "tcp"}, -{"bmc_ctd_ldap", {NULL}, 6301, "udp"}, -{"ufmp", {NULL}, 6306, "tcp"}, -{"ufmp", {NULL}, 6306, "udp"}, -{"scup", {NULL}, 6315, "tcp"}, -{"scup-disc", {NULL}, 6315, "udp"}, -{"abb-escp", {NULL}, 6316, "tcp"}, -{"abb-escp", {NULL}, 6316, "udp"}, -{"repsvc", {NULL}, 6320, "tcp"}, -{"repsvc", {NULL}, 6320, "udp"}, -{"emp-server1", {NULL}, 6321, "tcp"}, -{"emp-server1", {NULL}, 6321, "udp"}, -{"emp-server2", {NULL}, 6322, "tcp"}, -{"emp-server2", {NULL}, 6322, "udp"}, -{"sflow", {NULL}, 6343, "tcp"}, -{"sflow", {NULL}, 6343, "udp"}, -{"gnutella-svc", {NULL}, 6346, "tcp"}, -{"gnutella-svc", {NULL}, 6346, "udp"}, -{"gnutella-rtr", {NULL}, 6347, "tcp"}, -{"gnutella-rtr", {NULL}, 6347, "udp"}, -{"adap", {NULL}, 6350, "tcp"}, -{"adap", {NULL}, 6350, "udp"}, -{"pmcs", {NULL}, 6355, "tcp"}, -{"pmcs", {NULL}, 6355, "udp"}, -{"metaedit-mu", {NULL}, 6360, "tcp"}, -{"metaedit-mu", {NULL}, 6360, "udp"}, -{"metaedit-se", {NULL}, 6370, "tcp"}, -{"metaedit-se", {NULL}, 6370, "udp"}, -{"metatude-mds", {NULL}, 6382, "tcp"}, -{"metatude-mds", {NULL}, 6382, "udp"}, -{"clariion-evr01", {NULL}, 6389, "tcp"}, -{"clariion-evr01", {NULL}, 6389, "udp"}, -{"metaedit-ws", {NULL}, 6390, "tcp"}, -{"metaedit-ws", {NULL}, 6390, "udp"}, -{"faxcomservice", {NULL}, 6417, "tcp"}, -{"faxcomservice", {NULL}, 6417, "udp"}, -{"syserverremote", {NULL}, 6418, "tcp"}, -{"svdrp", {NULL}, 6419, "tcp"}, -{"nim-vdrshell", {NULL}, 6420, "tcp"}, -{"nim-vdrshell", {NULL}, 6420, "udp"}, -{"nim-wan", {NULL}, 6421, "tcp"}, -{"nim-wan", {NULL}, 6421, "udp"}, -{"pgbouncer", {NULL}, 6432, "tcp"}, -{"sun-sr-https", {NULL}, 6443, "tcp"}, -{"sun-sr-https", {NULL}, 6443, "udp"}, -{"sge_qmaster", {NULL}, 6444, "tcp"}, -{"sge_qmaster", {NULL}, 6444, "udp"}, -{"sge_execd", {NULL}, 6445, "tcp"}, -{"sge_execd", {NULL}, 6445, "udp"}, -{"mysql-proxy", {NULL}, 6446, "tcp"}, -{"mysql-proxy", {NULL}, 6446, "udp"}, -{"skip-cert-recv", {NULL}, 6455, "tcp"}, -{"skip-cert-send", {NULL}, 6456, "udp"}, -{"lvision-lm", {NULL}, 6471, "tcp"}, -{"lvision-lm", {NULL}, 6471, "udp"}, -{"sun-sr-http", {NULL}, 6480, "tcp"}, -{"sun-sr-http", {NULL}, 6480, "udp"}, -{"servicetags", {NULL}, 6481, "tcp"}, -{"servicetags", {NULL}, 6481, "udp"}, -{"ldoms-mgmt", {NULL}, 6482, "tcp"}, -{"ldoms-mgmt", {NULL}, 6482, "udp"}, -{"SunVTS-RMI", {NULL}, 6483, "tcp"}, -{"SunVTS-RMI", {NULL}, 6483, "udp"}, -{"sun-sr-jms", {NULL}, 6484, "tcp"}, -{"sun-sr-jms", {NULL}, 6484, "udp"}, -{"sun-sr-iiop", {NULL}, 6485, "tcp"}, -{"sun-sr-iiop", {NULL}, 6485, "udp"}, -{"sun-sr-iiops", {NULL}, 6486, "tcp"}, -{"sun-sr-iiops", {NULL}, 6486, "udp"}, -{"sun-sr-iiop-aut", {NULL}, 6487, "tcp"}, -{"sun-sr-iiop-aut", {NULL}, 6487, "udp"}, -{"sun-sr-jmx", {NULL}, 6488, "tcp"}, -{"sun-sr-jmx", {NULL}, 6488, "udp"}, -{"sun-sr-admin", {NULL}, 6489, "tcp"}, -{"sun-sr-admin", {NULL}, 6489, "udp"}, -{"boks", {NULL}, 6500, "tcp"}, -{"boks", {NULL}, 6500, "udp"}, -{"boks_servc", {NULL}, 6501, "tcp"}, -{"boks_servc", {NULL}, 6501, "udp"}, -{"boks_servm", {NULL}, 6502, "tcp"}, -{"boks_servm", {NULL}, 6502, "udp"}, -{"boks_clntd", {NULL}, 6503, "tcp"}, -{"boks_clntd", {NULL}, 6503, "udp"}, -{"badm_priv", {NULL}, 6505, "tcp"}, -{"badm_priv", {NULL}, 6505, "udp"}, -{"badm_pub", {NULL}, 6506, "tcp"}, -{"badm_pub", {NULL}, 6506, "udp"}, -{"bdir_priv", {NULL}, 6507, "tcp"}, -{"bdir_priv", {NULL}, 6507, "udp"}, -{"bdir_pub", {NULL}, 6508, "tcp"}, -{"bdir_pub", {NULL}, 6508, "udp"}, -{"mgcs-mfp-port", {NULL}, 6509, "tcp"}, -{"mgcs-mfp-port", {NULL}, 6509, "udp"}, -{"mcer-port", {NULL}, 6510, "tcp"}, -{"mcer-port", {NULL}, 6510, "udp"}, -{"netconf-tls", {NULL}, 6513, "tcp"}, -{"syslog-tls", {NULL}, 6514, "tcp"}, -{"syslog-tls", {NULL}, 6514, "udp"}, -{"syslog-tls", {NULL}, 6514, "dccp"}, -{"elipse-rec", {NULL}, 6515, "tcp"}, -{"elipse-rec", {NULL}, 6515, "udp"}, -{"lds-distrib", {NULL}, 6543, "tcp"}, -{"lds-distrib", {NULL}, 6543, "udp"}, -{"lds-dump", {NULL}, 6544, "tcp"}, -{"lds-dump", {NULL}, 6544, "udp"}, -{"apc-6547", {NULL}, 6547, "tcp"}, -{"apc-6547", {NULL}, 6547, "udp"}, -{"apc-6548", {NULL}, 6548, "tcp"}, -{"apc-6548", {NULL}, 6548, "udp"}, -{"apc-6549", {NULL}, 6549, "tcp"}, -{"apc-6549", {NULL}, 6549, "udp"}, -{"fg-sysupdate", {NULL}, 6550, "tcp"}, -{"fg-sysupdate", {NULL}, 6550, "udp"}, -{"sum", {NULL}, 6551, "tcp"}, -{"sum", {NULL}, 6551, "udp"}, -{"xdsxdm", {NULL}, 6558, "tcp"}, -{"xdsxdm", {NULL}, 6558, "udp"}, -{"sane-port", {NULL}, 6566, "tcp"}, -{"sane-port", {NULL}, 6566, "udp"}, -{"esp", {NULL}, 6567, "tcp"}, -{"esp", {NULL}, 6567, "udp"}, -{"canit_store", {NULL}, 6568, "tcp"}, -{"rp-reputation", {NULL}, 6568, "udp"}, -{"affiliate", {NULL}, 6579, "tcp"}, -{"affiliate", {NULL}, 6579, "udp"}, -{"parsec-master", {NULL}, 6580, "tcp"}, -{"parsec-master", {NULL}, 6580, "udp"}, -{"parsec-peer", {NULL}, 6581, "tcp"}, -{"parsec-peer", {NULL}, 6581, "udp"}, -{"parsec-game", {NULL}, 6582, "tcp"}, -{"parsec-game", {NULL}, 6582, "udp"}, -{"joaJewelSuite", {NULL}, 6583, "tcp"}, -{"joaJewelSuite", {NULL}, 6583, "udp"}, -{"mshvlm", {NULL}, 6600, "tcp"}, -{"mstmg-sstp", {NULL}, 6601, "tcp"}, -{"wsscomfrmwk", {NULL}, 6602, "tcp"}, -{"odette-ftps", {NULL}, 6619, "tcp"}, -{"odette-ftps", {NULL}, 6619, "udp"}, -{"kftp-data", {NULL}, 6620, "tcp"}, -{"kftp-data", {NULL}, 6620, "udp"}, -{"kftp", {NULL}, 6621, "tcp"}, -{"kftp", {NULL}, 6621, "udp"}, -{"mcftp", {NULL}, 6622, "tcp"}, -{"mcftp", {NULL}, 6622, "udp"}, -{"ktelnet", {NULL}, 6623, "tcp"}, -{"ktelnet", {NULL}, 6623, "udp"}, -{"datascaler-db", {NULL}, 6624, "tcp"}, -{"datascaler-ctl", {NULL}, 6625, "tcp"}, -{"wago-service", {NULL}, 6626, "tcp"}, -{"wago-service", {NULL}, 6626, "udp"}, -{"nexgen", {NULL}, 6627, "tcp"}, -{"nexgen", {NULL}, 6627, "udp"}, -{"afesc-mc", {NULL}, 6628, "tcp"}, -{"afesc-mc", {NULL}, 6628, "udp"}, -{"mxodbc-connect", {NULL}, 6632, "tcp"}, -{"pcs-sf-ui-man", {NULL}, 6655, "tcp"}, -{"emgmsg", {NULL}, 6656, "tcp"}, -{"palcom-disc", {NULL}, 6657, "udp"}, -{"vocaltec-gold", {NULL}, 6670, "tcp"}, -{"vocaltec-gold", {NULL}, 6670, "udp"}, -{"p4p-portal", {NULL}, 6671, "tcp"}, -{"p4p-portal", {NULL}, 6671, "udp"}, -{"vision_server", {NULL}, 6672, "tcp"}, -{"vision_server", {NULL}, 6672, "udp"}, -{"vision_elmd", {NULL}, 6673, "tcp"}, -{"vision_elmd", {NULL}, 6673, "udp"}, -{"vfbp", {NULL}, 6678, "tcp"}, -{"vfbp-disc", {NULL}, 6678, "udp"}, -{"osaut", {NULL}, 6679, "tcp"}, -{"osaut", {NULL}, 6679, "udp"}, -{"clever-ctrace", {NULL}, 6687, "tcp"}, -{"clever-tcpip", {NULL}, 6688, "tcp"}, -{"tsa", {NULL}, 6689, "tcp"}, -{"tsa", {NULL}, 6689, "udp"}, -{"babel", {NULL}, 6697, "udp"}, -{"kti-icad-srvr", {NULL}, 6701, "tcp"}, -{"kti-icad-srvr", {NULL}, 6701, "udp"}, -{"e-design-net", {NULL}, 6702, "tcp"}, -{"e-design-net", {NULL}, 6702, "udp"}, -{"e-design-web", {NULL}, 6703, "tcp"}, -{"e-design-web", {NULL}, 6703, "udp"}, -{"frc-hp", {NULL}, 6704, "sctp"}, -{"frc-mp", {NULL}, 6705, "sctp"}, -{"frc-lp", {NULL}, 6706, "sctp"}, -{"ibprotocol", {NULL}, 6714, "tcp"}, -{"ibprotocol", {NULL}, 6714, "udp"}, -{"fibotrader-com", {NULL}, 6715, "tcp"}, -{"fibotrader-com", {NULL}, 6715, "udp"}, -{"bmc-perf-agent", {NULL}, 6767, "tcp"}, -{"bmc-perf-agent", {NULL}, 6767, "udp"}, -{"bmc-perf-mgrd", {NULL}, 6768, "tcp"}, -{"bmc-perf-mgrd", {NULL}, 6768, "udp"}, -{"adi-gxp-srvprt", {NULL}, 6769, "tcp"}, -{"adi-gxp-srvprt", {NULL}, 6769, "udp"}, -{"plysrv-http", {NULL}, 6770, "tcp"}, -{"plysrv-http", {NULL}, 6770, "udp"}, -{"plysrv-https", {NULL}, 6771, "tcp"}, -{"plysrv-https", {NULL}, 6771, "udp"}, -{"dgpf-exchg", {NULL}, 6785, "tcp"}, -{"dgpf-exchg", {NULL}, 6785, "udp"}, -{"smc-jmx", {NULL}, 6786, "tcp"}, -{"smc-jmx", {NULL}, 6786, "udp"}, -{"smc-admin", {NULL}, 6787, "tcp"}, -{"smc-admin", {NULL}, 6787, "udp"}, -{"smc-http", {NULL}, 6788, "tcp"}, -{"smc-http", {NULL}, 6788, "udp"}, -{"smc-https", {NULL}, 6789, "tcp"}, -{"smc-https", {NULL}, 6789, "udp"}, -{"hnmp", {NULL}, 6790, "tcp"}, -{"hnmp", {NULL}, 6790, "udp"}, -{"hnm", {NULL}, 6791, "tcp"}, -{"hnm", {NULL}, 6791, "udp"}, -{"acnet", {NULL}, 6801, "tcp"}, -{"acnet", {NULL}, 6801, "udp"}, -{"pentbox-sim", {NULL}, 6817, "tcp"}, -{"ambit-lm", {NULL}, 6831, "tcp"}, -{"ambit-lm", {NULL}, 6831, "udp"}, -{"netmo-default", {NULL}, 6841, "tcp"}, -{"netmo-default", {NULL}, 6841, "udp"}, -{"netmo-http", {NULL}, 6842, "tcp"}, -{"netmo-http", {NULL}, 6842, "udp"}, -{"iccrushmore", {NULL}, 6850, "tcp"}, -{"iccrushmore", {NULL}, 6850, "udp"}, -{"acctopus-cc", {NULL}, 6868, "tcp"}, -{"acctopus-st", {NULL}, 6868, "udp"}, -{"muse", {NULL}, 6888, "tcp"}, -{"muse", {NULL}, 6888, "udp"}, -{"jetstream", {NULL}, 6901, "tcp"}, -{"xsmsvc", {NULL}, 6936, "tcp"}, -{"xsmsvc", {NULL}, 6936, "udp"}, -{"bioserver", {NULL}, 6946, "tcp"}, -{"bioserver", {NULL}, 6946, "udp"}, -{"otlp", {NULL}, 6951, "tcp"}, -{"otlp", {NULL}, 6951, "udp"}, -{"jmact3", {NULL}, 6961, "tcp"}, -{"jmact3", {NULL}, 6961, "udp"}, -{"jmevt2", {NULL}, 6962, "tcp"}, -{"jmevt2", {NULL}, 6962, "udp"}, -{"swismgr1", {NULL}, 6963, "tcp"}, -{"swismgr1", {NULL}, 6963, "udp"}, -{"swismgr2", {NULL}, 6964, "tcp"}, -{"swismgr2", {NULL}, 6964, "udp"}, -{"swistrap", {NULL}, 6965, "tcp"}, -{"swistrap", {NULL}, 6965, "udp"}, -{"swispol", {NULL}, 6966, "tcp"}, -{"swispol", {NULL}, 6966, "udp"}, -{"acmsoda", {NULL}, 6969, "tcp"}, -{"acmsoda", {NULL}, 6969, "udp"}, -{"MobilitySrv", {NULL}, 6997, "tcp"}, -{"MobilitySrv", {NULL}, 6997, "udp"}, -{"iatp-highpri", {NULL}, 6998, "tcp"}, -{"iatp-highpri", {NULL}, 6998, "udp"}, -{"iatp-normalpri", {NULL}, 6999, "tcp"}, -{"iatp-normalpri", {NULL}, 6999, "udp"}, -{"afs3-fileserver", {NULL}, 7000, "tcp"}, -{"afs3-fileserver", {NULL}, 7000, "udp"}, -{"afs3-callback", {NULL}, 7001, "tcp"}, -{"afs3-callback", {NULL}, 7001, "udp"}, -{"afs3-prserver", {NULL}, 7002, "tcp"}, -{"afs3-prserver", {NULL}, 7002, "udp"}, -{"afs3-vlserver", {NULL}, 7003, "tcp"}, -{"afs3-vlserver", {NULL}, 7003, "udp"}, -{"afs3-kaserver", {NULL}, 7004, "tcp"}, -{"afs3-kaserver", {NULL}, 7004, "udp"}, -{"afs3-volser", {NULL}, 7005, "tcp"}, -{"afs3-volser", {NULL}, 7005, "udp"}, -{"afs3-errors", {NULL}, 7006, "tcp"}, -{"afs3-errors", {NULL}, 7006, "udp"}, -{"afs3-bos", {NULL}, 7007, "tcp"}, -{"afs3-bos", {NULL}, 7007, "udp"}, -{"afs3-update", {NULL}, 7008, "tcp"}, -{"afs3-update", {NULL}, 7008, "udp"}, -{"afs3-rmtsys", {NULL}, 7009, "tcp"}, -{"afs3-rmtsys", {NULL}, 7009, "udp"}, -{"ups-onlinet", {NULL}, 7010, "tcp"}, -{"ups-onlinet", {NULL}, 7010, "udp"}, -{"talon-disc", {NULL}, 7011, "tcp"}, -{"talon-disc", {NULL}, 7011, "udp"}, -{"talon-engine", {NULL}, 7012, "tcp"}, -{"talon-engine", {NULL}, 7012, "udp"}, -{"microtalon-dis", {NULL}, 7013, "tcp"}, -{"microtalon-dis", {NULL}, 7013, "udp"}, -{"microtalon-com", {NULL}, 7014, "tcp"}, -{"microtalon-com", {NULL}, 7014, "udp"}, -{"talon-webserver", {NULL}, 7015, "tcp"}, -{"talon-webserver", {NULL}, 7015, "udp"}, -{"dpserve", {NULL}, 7020, "tcp"}, -{"dpserve", {NULL}, 7020, "udp"}, -{"dpserveadmin", {NULL}, 7021, "tcp"}, -{"dpserveadmin", {NULL}, 7021, "udp"}, -{"ctdp", {NULL}, 7022, "tcp"}, -{"ctdp", {NULL}, 7022, "udp"}, -{"ct2nmcs", {NULL}, 7023, "tcp"}, -{"ct2nmcs", {NULL}, 7023, "udp"}, -{"vmsvc", {NULL}, 7024, "tcp"}, -{"vmsvc", {NULL}, 7024, "udp"}, -{"vmsvc-2", {NULL}, 7025, "tcp"}, -{"vmsvc-2", {NULL}, 7025, "udp"}, -{"op-probe", {NULL}, 7030, "tcp"}, -{"op-probe", {NULL}, 7030, "udp"}, -{"arcp", {NULL}, 7070, "tcp"}, -{"arcp", {NULL}, 7070, "udp"}, -{"iwg1", {NULL}, 7071, "tcp"}, -{"iwg1", {NULL}, 7071, "udp"}, -{"empowerid", {NULL}, 7080, "tcp"}, -{"empowerid", {NULL}, 7080, "udp"}, -{"lazy-ptop", {NULL}, 7099, "tcp"}, -{"lazy-ptop", {NULL}, 7099, "udp"}, -{"font-service", {NULL}, 7100, "tcp"}, -{"font-service", {NULL}, 7100, "udp"}, -{"elcn", {NULL}, 7101, "tcp"}, -{"elcn", {NULL}, 7101, "udp"}, -{"aes-x170", {NULL}, 7107, "udp"}, -{"virprot-lm", {NULL}, 7121, "tcp"}, -{"virprot-lm", {NULL}, 7121, "udp"}, -{"scenidm", {NULL}, 7128, "tcp"}, -{"scenidm", {NULL}, 7128, "udp"}, -{"scenccs", {NULL}, 7129, "tcp"}, -{"scenccs", {NULL}, 7129, "udp"}, -{"cabsm-comm", {NULL}, 7161, "tcp"}, -{"cabsm-comm", {NULL}, 7161, "udp"}, -{"caistoragemgr", {NULL}, 7162, "tcp"}, -{"caistoragemgr", {NULL}, 7162, "udp"}, -{"cacsambroker", {NULL}, 7163, "tcp"}, -{"cacsambroker", {NULL}, 7163, "udp"}, -{"fsr", {NULL}, 7164, "tcp"}, -{"fsr", {NULL}, 7164, "udp"}, -{"doc-server", {NULL}, 7165, "tcp"}, -{"doc-server", {NULL}, 7165, "udp"}, -{"aruba-server", {NULL}, 7166, "tcp"}, -{"aruba-server", {NULL}, 7166, "udp"}, -{"casrmagent", {NULL}, 7167, "tcp"}, -{"cnckadserver", {NULL}, 7168, "tcp"}, -{"ccag-pib", {NULL}, 7169, "tcp"}, -{"ccag-pib", {NULL}, 7169, "udp"}, -{"nsrp", {NULL}, 7170, "tcp"}, -{"nsrp", {NULL}, 7170, "udp"}, -{"drm-production", {NULL}, 7171, "tcp"}, -{"drm-production", {NULL}, 7171, "udp"}, -{"zsecure", {NULL}, 7173, "tcp"}, -{"clutild", {NULL}, 7174, "tcp"}, -{"clutild", {NULL}, 7174, "udp"}, -{"fodms", {NULL}, 7200, "tcp"}, -{"fodms", {NULL}, 7200, "udp"}, -{"dlip", {NULL}, 7201, "tcp"}, -{"dlip", {NULL}, 7201, "udp"}, -{"ramp", {NULL}, 7227, "tcp"}, -{"ramp", {NULL}, 7227, "udp"}, -{"citrixupp", {NULL}, 7228, "tcp"}, -{"citrixuppg", {NULL}, 7229, "tcp"}, -{"pads", {NULL}, 7237, "tcp"}, -{"cnap", {NULL}, 7262, "tcp"}, -{"cnap", {NULL}, 7262, "udp"}, -{"watchme-7272", {NULL}, 7272, "tcp"}, -{"watchme-7272", {NULL}, 7272, "udp"}, -{"oma-rlp", {NULL}, 7273, "tcp"}, -{"oma-rlp", {NULL}, 7273, "udp"}, -{"oma-rlp-s", {NULL}, 7274, "tcp"}, -{"oma-rlp-s", {NULL}, 7274, "udp"}, -{"oma-ulp", {NULL}, 7275, "tcp"}, -{"oma-ulp", {NULL}, 7275, "udp"}, -{"oma-ilp", {NULL}, 7276, "tcp"}, -{"oma-ilp", {NULL}, 7276, "udp"}, -{"oma-ilp-s", {NULL}, 7277, "tcp"}, -{"oma-ilp-s", {NULL}, 7277, "udp"}, -{"oma-dcdocbs", {NULL}, 7278, "tcp"}, -{"oma-dcdocbs", {NULL}, 7278, "udp"}, -{"ctxlic", {NULL}, 7279, "tcp"}, -{"ctxlic", {NULL}, 7279, "udp"}, -{"itactionserver1", {NULL}, 7280, "tcp"}, -{"itactionserver1", {NULL}, 7280, "udp"}, -{"itactionserver2", {NULL}, 7281, "tcp"}, -{"itactionserver2", {NULL}, 7281, "udp"}, -{"mzca-action", {NULL}, 7282, "tcp"}, -{"mzca-alert", {NULL}, 7282, "udp"}, -{"lcm-server", {NULL}, 7365, "tcp"}, -{"lcm-server", {NULL}, 7365, "udp"}, -{"mindfilesys", {NULL}, 7391, "tcp"}, -{"mindfilesys", {NULL}, 7391, "udp"}, -{"mrssrendezvous", {NULL}, 7392, "tcp"}, -{"mrssrendezvous", {NULL}, 7392, "udp"}, -{"nfoldman", {NULL}, 7393, "tcp"}, -{"nfoldman", {NULL}, 7393, "udp"}, -{"fse", {NULL}, 7394, "tcp"}, -{"fse", {NULL}, 7394, "udp"}, -{"winqedit", {NULL}, 7395, "tcp"}, -{"winqedit", {NULL}, 7395, "udp"}, -{"hexarc", {NULL}, 7397, "tcp"}, -{"hexarc", {NULL}, 7397, "udp"}, -{"rtps-discovery", {NULL}, 7400, "tcp"}, -{"rtps-discovery", {NULL}, 7400, "udp"}, -{"rtps-dd-ut", {NULL}, 7401, "tcp"}, -{"rtps-dd-ut", {NULL}, 7401, "udp"}, -{"rtps-dd-mt", {NULL}, 7402, "tcp"}, -{"rtps-dd-mt", {NULL}, 7402, "udp"}, -{"ionixnetmon", {NULL}, 7410, "tcp"}, -{"ionixnetmon", {NULL}, 7410, "udp"}, -{"mtportmon", {NULL}, 7421, "tcp"}, -{"mtportmon", {NULL}, 7421, "udp"}, -{"pmdmgr", {NULL}, 7426, "tcp"}, -{"pmdmgr", {NULL}, 7426, "udp"}, -{"oveadmgr", {NULL}, 7427, "tcp"}, -{"oveadmgr", {NULL}, 7427, "udp"}, -{"ovladmgr", {NULL}, 7428, "tcp"}, -{"ovladmgr", {NULL}, 7428, "udp"}, -{"opi-sock", {NULL}, 7429, "tcp"}, -{"opi-sock", {NULL}, 7429, "udp"}, -{"xmpv7", {NULL}, 7430, "tcp"}, -{"xmpv7", {NULL}, 7430, "udp"}, -{"pmd", {NULL}, 7431, "tcp"}, -{"pmd", {NULL}, 7431, "udp"}, -{"faximum", {NULL}, 7437, "tcp"}, -{"faximum", {NULL}, 7437, "udp"}, -{"oracleas-https", {NULL}, 7443, "tcp"}, -{"oracleas-https", {NULL}, 7443, "udp"}, -{"rise", {NULL}, 7473, "tcp"}, -{"rise", {NULL}, 7473, "udp"}, -{"telops-lmd", {NULL}, 7491, "tcp"}, -{"telops-lmd", {NULL}, 7491, "udp"}, -{"silhouette", {NULL}, 7500, "tcp"}, -{"silhouette", {NULL}, 7500, "udp"}, -{"ovbus", {NULL}, 7501, "tcp"}, -{"ovbus", {NULL}, 7501, "udp"}, -{"acplt", {NULL}, 7509, "tcp"}, -{"ovhpas", {NULL}, 7510, "tcp"}, -{"ovhpas", {NULL}, 7510, "udp"}, -{"pafec-lm", {NULL}, 7511, "tcp"}, -{"pafec-lm", {NULL}, 7511, "udp"}, -{"saratoga", {NULL}, 7542, "tcp"}, -{"saratoga", {NULL}, 7542, "udp"}, -{"atul", {NULL}, 7543, "tcp"}, -{"atul", {NULL}, 7543, "udp"}, -{"nta-ds", {NULL}, 7544, "tcp"}, -{"nta-ds", {NULL}, 7544, "udp"}, -{"nta-us", {NULL}, 7545, "tcp"}, -{"nta-us", {NULL}, 7545, "udp"}, -{"cfs", {NULL}, 7546, "tcp"}, -{"cfs", {NULL}, 7546, "udp"}, -{"cwmp", {NULL}, 7547, "tcp"}, -{"cwmp", {NULL}, 7547, "udp"}, -{"tidp", {NULL}, 7548, "tcp"}, -{"tidp", {NULL}, 7548, "udp"}, -{"nls-tl", {NULL}, 7549, "tcp"}, -{"nls-tl", {NULL}, 7549, "udp"}, -{"sncp", {NULL}, 7560, "tcp"}, -{"sncp", {NULL}, 7560, "udp"}, -{"cfw", {NULL}, 7563, "tcp"}, -{"vsi-omega", {NULL}, 7566, "tcp"}, -{"vsi-omega", {NULL}, 7566, "udp"}, -{"dell-eql-asm", {NULL}, 7569, "tcp"}, -{"aries-kfinder", {NULL}, 7570, "tcp"}, -{"aries-kfinder", {NULL}, 7570, "udp"}, -{"sun-lm", {NULL}, 7588, "tcp"}, -{"sun-lm", {NULL}, 7588, "udp"}, -{"indi", {NULL}, 7624, "tcp"}, -{"indi", {NULL}, 7624, "udp"}, -{"simco", {NULL}, 7626, "tcp"}, -{"simco", {NULL}, 7626, "sctp"}, -{"soap-http", {NULL}, 7627, "tcp"}, -{"soap-http", {NULL}, 7627, "udp"}, -{"zen-pawn", {NULL}, 7628, "tcp"}, -{"zen-pawn", {NULL}, 7628, "udp"}, -{"xdas", {NULL}, 7629, "tcp"}, -{"xdas", {NULL}, 7629, "udp"}, -{"hawk", {NULL}, 7630, "tcp"}, -{"tesla-sys-msg", {NULL}, 7631, "tcp"}, -{"pmdfmgt", {NULL}, 7633, "tcp"}, -{"pmdfmgt", {NULL}, 7633, "udp"}, -{"cuseeme", {NULL}, 7648, "tcp"}, -{"cuseeme", {NULL}, 7648, "udp"}, -{"imqstomp", {NULL}, 7672, "tcp"}, -{"imqstomps", {NULL}, 7673, "tcp"}, -{"imqtunnels", {NULL}, 7674, "tcp"}, -{"imqtunnels", {NULL}, 7674, "udp"}, -{"imqtunnel", {NULL}, 7675, "tcp"}, -{"imqtunnel", {NULL}, 7675, "udp"}, -{"imqbrokerd", {NULL}, 7676, "tcp"}, -{"imqbrokerd", {NULL}, 7676, "udp"}, -{"sun-user-https", {NULL}, 7677, "tcp"}, -{"sun-user-https", {NULL}, 7677, "udp"}, -{"pando-pub", {NULL}, 7680, "tcp"}, -{"pando-pub", {NULL}, 7680, "udp"}, -{"collaber", {NULL}, 7689, "tcp"}, -{"collaber", {NULL}, 7689, "udp"}, -{"klio", {NULL}, 7697, "tcp"}, -{"klio", {NULL}, 7697, "udp"}, -{"em7-secom", {NULL}, 7700, "tcp"}, -{"sync-em7", {NULL}, 7707, "tcp"}, -{"sync-em7", {NULL}, 7707, "udp"}, -{"scinet", {NULL}, 7708, "tcp"}, -{"scinet", {NULL}, 7708, "udp"}, -{"medimageportal", {NULL}, 7720, "tcp"}, -{"medimageportal", {NULL}, 7720, "udp"}, -{"nsdeepfreezectl", {NULL}, 7724, "tcp"}, -{"nsdeepfreezectl", {NULL}, 7724, "udp"}, -{"nitrogen", {NULL}, 7725, "tcp"}, -{"nitrogen", {NULL}, 7725, "udp"}, -{"freezexservice", {NULL}, 7726, "tcp"}, -{"freezexservice", {NULL}, 7726, "udp"}, -{"trident-data", {NULL}, 7727, "tcp"}, -{"trident-data", {NULL}, 7727, "udp"}, -{"smip", {NULL}, 7734, "tcp"}, -{"smip", {NULL}, 7734, "udp"}, -{"aiagent", {NULL}, 7738, "tcp"}, -{"aiagent", {NULL}, 7738, "udp"}, -{"scriptview", {NULL}, 7741, "tcp"}, -{"scriptview", {NULL}, 7741, "udp"}, -{"msss", {NULL}, 7742, "tcp"}, -{"sstp-1", {NULL}, 7743, "tcp"}, -{"sstp-1", {NULL}, 7743, "udp"}, -{"raqmon-pdu", {NULL}, 7744, "tcp"}, -{"raqmon-pdu", {NULL}, 7744, "udp"}, -{"prgp", {NULL}, 7747, "tcp"}, -{"prgp", {NULL}, 7747, "udp"}, -{"cbt", {NULL}, 7777, "tcp"}, -{"cbt", {NULL}, 7777, "udp"}, -{"interwise", {NULL}, 7778, "tcp"}, -{"interwise", {NULL}, 7778, "udp"}, -{"vstat", {NULL}, 7779, "tcp"}, -{"vstat", {NULL}, 7779, "udp"}, -{"accu-lmgr", {NULL}, 7781, "tcp"}, -{"accu-lmgr", {NULL}, 7781, "udp"}, -{"minivend", {NULL}, 7786, "tcp"}, -{"minivend", {NULL}, 7786, "udp"}, -{"popup-reminders", {NULL}, 7787, "tcp"}, -{"popup-reminders", {NULL}, 7787, "udp"}, -{"office-tools", {NULL}, 7789, "tcp"}, -{"office-tools", {NULL}, 7789, "udp"}, -{"q3ade", {NULL}, 7794, "tcp"}, -{"q3ade", {NULL}, 7794, "udp"}, -{"pnet-conn", {NULL}, 7797, "tcp"}, -{"pnet-conn", {NULL}, 7797, "udp"}, -{"pnet-enc", {NULL}, 7798, "tcp"}, -{"pnet-enc", {NULL}, 7798, "udp"}, -{"altbsdp", {NULL}, 7799, "tcp"}, -{"altbsdp", {NULL}, 7799, "udp"}, -{"asr", {NULL}, 7800, "tcp"}, -{"asr", {NULL}, 7800, "udp"}, -{"ssp-client", {NULL}, 7801, "tcp"}, -{"ssp-client", {NULL}, 7801, "udp"}, -{"rbt-wanopt", {NULL}, 7810, "tcp"}, -{"rbt-wanopt", {NULL}, 7810, "udp"}, -{"apc-7845", {NULL}, 7845, "tcp"}, -{"apc-7845", {NULL}, 7845, "udp"}, -{"apc-7846", {NULL}, 7846, "tcp"}, -{"apc-7846", {NULL}, 7846, "udp"}, -{"mobileanalyzer", {NULL}, 7869, "tcp"}, -{"rbt-smc", {NULL}, 7870, "tcp"}, -{"pss", {NULL}, 7880, "tcp"}, -{"pss", {NULL}, 7880, "udp"}, -{"ubroker", {NULL}, 7887, "tcp"}, -{"ubroker", {NULL}, 7887, "udp"}, -{"mevent", {NULL}, 7900, "tcp"}, -{"mevent", {NULL}, 7900, "udp"}, -{"tnos-sp", {NULL}, 7901, "tcp"}, -{"tnos-sp", {NULL}, 7901, "udp"}, -{"tnos-dp", {NULL}, 7902, "tcp"}, -{"tnos-dp", {NULL}, 7902, "udp"}, -{"tnos-dps", {NULL}, 7903, "tcp"}, -{"tnos-dps", {NULL}, 7903, "udp"}, -{"qo-secure", {NULL}, 7913, "tcp"}, -{"qo-secure", {NULL}, 7913, "udp"}, -{"t2-drm", {NULL}, 7932, "tcp"}, -{"t2-drm", {NULL}, 7932, "udp"}, -{"t2-brm", {NULL}, 7933, "tcp"}, -{"t2-brm", {NULL}, 7933, "udp"}, -{"supercell", {NULL}, 7967, "tcp"}, -{"supercell", {NULL}, 7967, "udp"}, -{"micromuse-ncps", {NULL}, 7979, "tcp"}, -{"micromuse-ncps", {NULL}, 7979, "udp"}, -{"quest-vista", {NULL}, 7980, "tcp"}, -{"quest-vista", {NULL}, 7980, "udp"}, -{"sossd-collect", {NULL}, 7981, "tcp"}, -{"sossd-agent", {NULL}, 7982, "tcp"}, -{"sossd-disc", {NULL}, 7982, "udp"}, -{"pushns", {NULL}, 7997, "tcp"}, -{"usicontentpush", {NULL}, 7998, "udp"}, -{"irdmi2", {NULL}, 7999, "tcp"}, -{"irdmi2", {NULL}, 7999, "udp"}, -{"irdmi", {NULL}, 8000, "tcp"}, -{"irdmi", {NULL}, 8000, "udp"}, -{"vcom-tunnel", {NULL}, 8001, "tcp"}, -{"vcom-tunnel", {NULL}, 8001, "udp"}, -{"teradataordbms", {NULL}, 8002, "tcp"}, -{"teradataordbms", {NULL}, 8002, "udp"}, -{"mcreport", {NULL}, 8003, "tcp"}, -{"mcreport", {NULL}, 8003, "udp"}, -{"mxi", {NULL}, 8005, "tcp"}, -{"mxi", {NULL}, 8005, "udp"}, -{"http-alt", {NULL}, 8008, "tcp"}, -{"http-alt", {NULL}, 8008, "udp"}, -{"qbdb", {NULL}, 8019, "tcp"}, -{"qbdb", {NULL}, 8019, "udp"}, -{"intu-ec-svcdisc", {NULL}, 8020, "tcp"}, -{"intu-ec-svcdisc", {NULL}, 8020, "udp"}, -{"intu-ec-client", {NULL}, 8021, "tcp"}, -{"intu-ec-client", {NULL}, 8021, "udp"}, -{"oa-system", {NULL}, 8022, "tcp"}, -{"oa-system", {NULL}, 8022, "udp"}, -{"ca-audit-da", {NULL}, 8025, "tcp"}, -{"ca-audit-da", {NULL}, 8025, "udp"}, -{"ca-audit-ds", {NULL}, 8026, "tcp"}, -{"ca-audit-ds", {NULL}, 8026, "udp"}, -{"pro-ed", {NULL}, 8032, "tcp"}, -{"pro-ed", {NULL}, 8032, "udp"}, -{"mindprint", {NULL}, 8033, "tcp"}, -{"mindprint", {NULL}, 8033, "udp"}, -{"vantronix-mgmt", {NULL}, 8034, "tcp"}, -{"vantronix-mgmt", {NULL}, 8034, "udp"}, -{"ampify", {NULL}, 8040, "tcp"}, -{"ampify", {NULL}, 8040, "udp"}, -{"fs-agent", {NULL}, 8042, "tcp"}, -{"fs-server", {NULL}, 8043, "tcp"}, -{"fs-mgmt", {NULL}, 8044, "tcp"}, -{"senomix01", {NULL}, 8052, "tcp"}, -{"senomix01", {NULL}, 8052, "udp"}, -{"senomix02", {NULL}, 8053, "tcp"}, -{"senomix02", {NULL}, 8053, "udp"}, -{"senomix03", {NULL}, 8054, "tcp"}, -{"senomix03", {NULL}, 8054, "udp"}, -{"senomix04", {NULL}, 8055, "tcp"}, -{"senomix04", {NULL}, 8055, "udp"}, -{"senomix05", {NULL}, 8056, "tcp"}, -{"senomix05", {NULL}, 8056, "udp"}, -{"senomix06", {NULL}, 8057, "tcp"}, -{"senomix06", {NULL}, 8057, "udp"}, -{"senomix07", {NULL}, 8058, "tcp"}, -{"senomix07", {NULL}, 8058, "udp"}, -{"senomix08", {NULL}, 8059, "tcp"}, -{"senomix08", {NULL}, 8059, "udp"}, -{"gadugadu", {NULL}, 8074, "tcp"}, -{"gadugadu", {NULL}, 8074, "udp"}, -{"http-alt", {NULL}, 8080, "tcp"}, -{"http-alt", {NULL}, 8080, "udp"}, -{"sunproxyadmin", {NULL}, 8081, "tcp"}, -{"sunproxyadmin", {NULL}, 8081, "udp"}, -{"us-cli", {NULL}, 8082, "tcp"}, -{"us-cli", {NULL}, 8082, "udp"}, -{"us-srv", {NULL}, 8083, "tcp"}, -{"us-srv", {NULL}, 8083, "udp"}, -{"d-s-n", {NULL}, 8086, "tcp"}, -{"d-s-n", {NULL}, 8086, "udp"}, -{"simplifymedia", {NULL}, 8087, "tcp"}, -{"simplifymedia", {NULL}, 8087, "udp"}, -{"radan-http", {NULL}, 8088, "tcp"}, -{"radan-http", {NULL}, 8088, "udp"}, -{"jamlink", {NULL}, 8091, "tcp"}, -{"sac", {NULL}, 8097, "tcp"}, -{"sac", {NULL}, 8097, "udp"}, -{"xprint-server", {NULL}, 8100, "tcp"}, -{"xprint-server", {NULL}, 8100, "udp"}, -{"ldoms-migr", {NULL}, 8101, "tcp"}, -{"mtl8000-matrix", {NULL}, 8115, "tcp"}, -{"mtl8000-matrix", {NULL}, 8115, "udp"}, -{"cp-cluster", {NULL}, 8116, "tcp"}, -{"cp-cluster", {NULL}, 8116, "udp"}, -{"privoxy", {NULL}, 8118, "tcp"}, -{"privoxy", {NULL}, 8118, "udp"}, -{"apollo-data", {NULL}, 8121, "tcp"}, -{"apollo-data", {NULL}, 8121, "udp"}, -{"apollo-admin", {NULL}, 8122, "tcp"}, -{"apollo-admin", {NULL}, 8122, "udp"}, -{"paycash-online", {NULL}, 8128, "tcp"}, -{"paycash-online", {NULL}, 8128, "udp"}, -{"paycash-wbp", {NULL}, 8129, "tcp"}, -{"paycash-wbp", {NULL}, 8129, "udp"}, -{"indigo-vrmi", {NULL}, 8130, "tcp"}, -{"indigo-vrmi", {NULL}, 8130, "udp"}, -{"indigo-vbcp", {NULL}, 8131, "tcp"}, -{"indigo-vbcp", {NULL}, 8131, "udp"}, -{"dbabble", {NULL}, 8132, "tcp"}, -{"dbabble", {NULL}, 8132, "udp"}, -{"isdd", {NULL}, 8148, "tcp"}, -{"isdd", {NULL}, 8148, "udp"}, -{"patrol", {NULL}, 8160, "tcp"}, -{"patrol", {NULL}, 8160, "udp"}, -{"patrol-snmp", {NULL}, 8161, "tcp"}, -{"patrol-snmp", {NULL}, 8161, "udp"}, -{"vmware-fdm", {NULL}, 8182, "tcp"}, -{"vmware-fdm", {NULL}, 8182, "udp"}, -{"proremote", {NULL}, 8183, "tcp"}, -{"itach", {NULL}, 8184, "tcp"}, -{"itach", {NULL}, 8184, "udp"}, -{"spytechphone", {NULL}, 8192, "tcp"}, -{"spytechphone", {NULL}, 8192, "udp"}, -{"blp1", {NULL}, 8194, "tcp"}, -{"blp1", {NULL}, 8194, "udp"}, -{"blp2", {NULL}, 8195, "tcp"}, -{"blp2", {NULL}, 8195, "udp"}, -{"vvr-data", {NULL}, 8199, "tcp"}, -{"vvr-data", {NULL}, 8199, "udp"}, -{"trivnet1", {NULL}, 8200, "tcp"}, -{"trivnet1", {NULL}, 8200, "udp"}, -{"trivnet2", {NULL}, 8201, "tcp"}, -{"trivnet2", {NULL}, 8201, "udp"}, -{"lm-perfworks", {NULL}, 8204, "tcp"}, -{"lm-perfworks", {NULL}, 8204, "udp"}, -{"lm-instmgr", {NULL}, 8205, "tcp"}, -{"lm-instmgr", {NULL}, 8205, "udp"}, -{"lm-dta", {NULL}, 8206, "tcp"}, -{"lm-dta", {NULL}, 8206, "udp"}, -{"lm-sserver", {NULL}, 8207, "tcp"}, -{"lm-sserver", {NULL}, 8207, "udp"}, -{"lm-webwatcher", {NULL}, 8208, "tcp"}, -{"lm-webwatcher", {NULL}, 8208, "udp"}, -{"rexecj", {NULL}, 8230, "tcp"}, -{"rexecj", {NULL}, 8230, "udp"}, -{"synapse-nhttps", {NULL}, 8243, "tcp"}, -{"synapse-nhttps", {NULL}, 8243, "udp"}, -{"pando-sec", {NULL}, 8276, "tcp"}, -{"pando-sec", {NULL}, 8276, "udp"}, -{"synapse-nhttp", {NULL}, 8280, "tcp"}, -{"synapse-nhttp", {NULL}, 8280, "udp"}, -{"blp3", {NULL}, 8292, "tcp"}, -{"blp3", {NULL}, 8292, "udp"}, -{"hiperscan-id", {NULL}, 8293, "tcp"}, -{"blp4", {NULL}, 8294, "tcp"}, -{"blp4", {NULL}, 8294, "udp"}, -{"tmi", {NULL}, 8300, "tcp"}, -{"tmi", {NULL}, 8300, "udp"}, -{"amberon", {NULL}, 8301, "tcp"}, -{"amberon", {NULL}, 8301, "udp"}, -{"tnp-discover", {NULL}, 8320, "tcp"}, -{"tnp-discover", {NULL}, 8320, "udp"}, -{"tnp", {NULL}, 8321, "tcp"}, -{"tnp", {NULL}, 8321, "udp"}, -{"server-find", {NULL}, 8351, "tcp"}, -{"server-find", {NULL}, 8351, "udp"}, -{"cruise-enum", {NULL}, 8376, "tcp"}, -{"cruise-enum", {NULL}, 8376, "udp"}, -{"cruise-swroute", {NULL}, 8377, "tcp"}, -{"cruise-swroute", {NULL}, 8377, "udp"}, -{"cruise-config", {NULL}, 8378, "tcp"}, -{"cruise-config", {NULL}, 8378, "udp"}, -{"cruise-diags", {NULL}, 8379, "tcp"}, -{"cruise-diags", {NULL}, 8379, "udp"}, -{"cruise-update", {NULL}, 8380, "tcp"}, -{"cruise-update", {NULL}, 8380, "udp"}, -{"m2mservices", {NULL}, 8383, "tcp"}, -{"m2mservices", {NULL}, 8383, "udp"}, -{"cvd", {NULL}, 8400, "tcp"}, -{"cvd", {NULL}, 8400, "udp"}, -{"sabarsd", {NULL}, 8401, "tcp"}, -{"sabarsd", {NULL}, 8401, "udp"}, -{"abarsd", {NULL}, 8402, "tcp"}, -{"abarsd", {NULL}, 8402, "udp"}, -{"admind", {NULL}, 8403, "tcp"}, -{"admind", {NULL}, 8403, "udp"}, -{"svcloud", {NULL}, 8404, "tcp"}, -{"svbackup", {NULL}, 8405, "tcp"}, -{"espeech", {NULL}, 8416, "tcp"}, -{"espeech", {NULL}, 8416, "udp"}, -{"espeech-rtp", {NULL}, 8417, "tcp"}, -{"espeech-rtp", {NULL}, 8417, "udp"}, -{"cybro-a-bus", {NULL}, 8442, "tcp"}, -{"cybro-a-bus", {NULL}, 8442, "udp"}, -{"pcsync-https", {NULL}, 8443, "tcp"}, -{"pcsync-https", {NULL}, 8443, "udp"}, -{"pcsync-http", {NULL}, 8444, "tcp"}, -{"pcsync-http", {NULL}, 8444, "udp"}, -{"npmp", {NULL}, 8450, "tcp"}, -{"npmp", {NULL}, 8450, "udp"}, -{"cisco-avp", {NULL}, 8470, "tcp"}, -{"pim-port", {NULL}, 8471, "tcp"}, -{"pim-port", {NULL}, 8471, "sctp"}, -{"otv", {NULL}, 8472, "tcp"}, -{"otv", {NULL}, 8472, "udp"}, -{"vp2p", {NULL}, 8473, "tcp"}, -{"vp2p", {NULL}, 8473, "udp"}, -{"noteshare", {NULL}, 8474, "tcp"}, -{"noteshare", {NULL}, 8474, "udp"}, -{"fmtp", {NULL}, 8500, "tcp"}, -{"fmtp", {NULL}, 8500, "udp"}, -{"rtsp-alt", {NULL}, 8554, "tcp"}, -{"rtsp-alt", {NULL}, 8554, "udp"}, -{"d-fence", {NULL}, 8555, "tcp"}, -{"d-fence", {NULL}, 8555, "udp"}, -{"oap-admin", {NULL}, 8567, "tcp"}, -{"oap-admin", {NULL}, 8567, "udp"}, -{"asterix", {NULL}, 8600, "tcp"}, -{"asterix", {NULL}, 8600, "udp"}, -{"canon-mfnp", {NULL}, 8610, "tcp"}, -{"canon-mfnp", {NULL}, 8610, "udp"}, -{"canon-bjnp1", {NULL}, 8611, "tcp"}, -{"canon-bjnp1", {NULL}, 8611, "udp"}, -{"canon-bjnp2", {NULL}, 8612, "tcp"}, -{"canon-bjnp2", {NULL}, 8612, "udp"}, -{"canon-bjnp3", {NULL}, 8613, "tcp"}, -{"canon-bjnp3", {NULL}, 8613, "udp"}, -{"canon-bjnp4", {NULL}, 8614, "tcp"}, -{"canon-bjnp4", {NULL}, 8614, "udp"}, -{"sun-as-jmxrmi", {NULL}, 8686, "tcp"}, -{"sun-as-jmxrmi", {NULL}, 8686, "udp"}, -{"vnyx", {NULL}, 8699, "tcp"}, -{"vnyx", {NULL}, 8699, "udp"}, -{"dtp-net", {NULL}, 8732, "udp"}, -{"ibus", {NULL}, 8733, "tcp"}, -{"ibus", {NULL}, 8733, "udp"}, -{"mc-appserver", {NULL}, 8763, "tcp"}, -{"mc-appserver", {NULL}, 8763, "udp"}, -{"openqueue", {NULL}, 8764, "tcp"}, -{"openqueue", {NULL}, 8764, "udp"}, -{"ultraseek-http", {NULL}, 8765, "tcp"}, -{"ultraseek-http", {NULL}, 8765, "udp"}, -{"dpap", {NULL}, 8770, "tcp"}, -{"dpap", {NULL}, 8770, "udp"}, -{"msgclnt", {NULL}, 8786, "tcp"}, -{"msgclnt", {NULL}, 8786, "udp"}, -{"msgsrvr", {NULL}, 8787, "tcp"}, -{"msgsrvr", {NULL}, 8787, "udp"}, -{"sunwebadmin", {NULL}, 8800, "tcp"}, -{"sunwebadmin", {NULL}, 8800, "udp"}, -{"truecm", {NULL}, 8804, "tcp"}, -{"truecm", {NULL}, 8804, "udp"}, -{"dxspider", {NULL}, 8873, "tcp"}, -{"dxspider", {NULL}, 8873, "udp"}, -{"cddbp-alt", {NULL}, 8880, "tcp"}, -{"cddbp-alt", {NULL}, 8880, "udp"}, -{"secure-mqtt", {NULL}, 8883, "tcp"}, -{"secure-mqtt", {NULL}, 8883, "udp"}, -{"ddi-tcp-1", {NULL}, 8888, "tcp"}, -{"ddi-udp-1", {NULL}, 8888, "udp"}, -{"ddi-tcp-2", {NULL}, 8889, "tcp"}, -{"ddi-udp-2", {NULL}, 8889, "udp"}, -{"ddi-tcp-3", {NULL}, 8890, "tcp"}, -{"ddi-udp-3", {NULL}, 8890, "udp"}, -{"ddi-tcp-4", {NULL}, 8891, "tcp"}, -{"ddi-udp-4", {NULL}, 8891, "udp"}, -{"ddi-tcp-5", {NULL}, 8892, "tcp"}, -{"ddi-udp-5", {NULL}, 8892, "udp"}, -{"ddi-tcp-6", {NULL}, 8893, "tcp"}, -{"ddi-udp-6", {NULL}, 8893, "udp"}, -{"ddi-tcp-7", {NULL}, 8894, "tcp"}, -{"ddi-udp-7", {NULL}, 8894, "udp"}, -{"ospf-lite", {NULL}, 8899, "tcp"}, -{"ospf-lite", {NULL}, 8899, "udp"}, -{"jmb-cds1", {NULL}, 8900, "tcp"}, -{"jmb-cds1", {NULL}, 8900, "udp"}, -{"jmb-cds2", {NULL}, 8901, "tcp"}, -{"jmb-cds2", {NULL}, 8901, "udp"}, -{"manyone-http", {NULL}, 8910, "tcp"}, -{"manyone-http", {NULL}, 8910, "udp"}, -{"manyone-xml", {NULL}, 8911, "tcp"}, -{"manyone-xml", {NULL}, 8911, "udp"}, -{"wcbackup", {NULL}, 8912, "tcp"}, -{"wcbackup", {NULL}, 8912, "udp"}, -{"dragonfly", {NULL}, 8913, "tcp"}, -{"dragonfly", {NULL}, 8913, "udp"}, -{"twds", {NULL}, 8937, "tcp"}, -{"cumulus-admin", {NULL}, 8954, "tcp"}, -{"cumulus-admin", {NULL}, 8954, "udp"}, -{"sunwebadmins", {NULL}, 8989, "tcp"}, -{"sunwebadmins", {NULL}, 8989, "udp"}, -{"http-wmap", {NULL}, 8990, "tcp"}, -{"http-wmap", {NULL}, 8990, "udp"}, -{"https-wmap", {NULL}, 8991, "tcp"}, -{"https-wmap", {NULL}, 8991, "udp"}, -{"bctp", {NULL}, 8999, "tcp"}, -{"bctp", {NULL}, 8999, "udp"}, -{"cslistener", {NULL}, 9000, "tcp"}, -{"cslistener", {NULL}, 9000, "udp"}, -{"etlservicemgr", {NULL}, 9001, "tcp"}, -{"etlservicemgr", {NULL}, 9001, "udp"}, -{"dynamid", {NULL}, 9002, "tcp"}, -{"dynamid", {NULL}, 9002, "udp"}, -{"ogs-client", {NULL}, 9007, "udp"}, -{"ogs-server", {NULL}, 9008, "tcp"}, -{"pichat", {NULL}, 9009, "tcp"}, -{"pichat", {NULL}, 9009, "udp"}, -{"sdr", {NULL}, 9010, "tcp"}, -{"tambora", {NULL}, 9020, "tcp"}, -{"tambora", {NULL}, 9020, "udp"}, -{"panagolin-ident", {NULL}, 9021, "tcp"}, -{"panagolin-ident", {NULL}, 9021, "udp"}, -{"paragent", {NULL}, 9022, "tcp"}, -{"paragent", {NULL}, 9022, "udp"}, -{"swa-1", {NULL}, 9023, "tcp"}, -{"swa-1", {NULL}, 9023, "udp"}, -{"swa-2", {NULL}, 9024, "tcp"}, -{"swa-2", {NULL}, 9024, "udp"}, -{"swa-3", {NULL}, 9025, "tcp"}, -{"swa-3", {NULL}, 9025, "udp"}, -{"swa-4", {NULL}, 9026, "tcp"}, -{"swa-4", {NULL}, 9026, "udp"}, -{"versiera", {NULL}, 9050, "tcp"}, -{"fio-cmgmt", {NULL}, 9051, "tcp"}, -{"glrpc", {NULL}, 9080, "tcp"}, -{"glrpc", {NULL}, 9080, "udp"}, -{"lcs-ap", {NULL}, 9082, "sctp"}, -{"emc-pp-mgmtsvc", {NULL}, 9083, "tcp"}, -{"aurora", {NULL}, 9084, "tcp"}, -{"aurora", {NULL}, 9084, "udp"}, -{"aurora", {NULL}, 9084, "sctp"}, -{"ibm-rsyscon", {NULL}, 9085, "tcp"}, -{"ibm-rsyscon", {NULL}, 9085, "udp"}, -{"net2display", {NULL}, 9086, "tcp"}, -{"net2display", {NULL}, 9086, "udp"}, -{"classic", {NULL}, 9087, "tcp"}, -{"classic", {NULL}, 9087, "udp"}, -{"sqlexec", {NULL}, 9088, "tcp"}, -{"sqlexec", {NULL}, 9088, "udp"}, -{"sqlexec-ssl", {NULL}, 9089, "tcp"}, -{"sqlexec-ssl", {NULL}, 9089, "udp"}, -{"websm", {NULL}, 9090, "tcp"}, -{"websm", {NULL}, 9090, "udp"}, -{"xmltec-xmlmail", {NULL}, 9091, "tcp"}, -{"xmltec-xmlmail", {NULL}, 9091, "udp"}, -{"XmlIpcRegSvc", {NULL}, 9092, "tcp"}, -{"XmlIpcRegSvc", {NULL}, 9092, "udp"}, -{"hp-pdl-datastr", {NULL}, 9100, "tcp"}, -{"hp-pdl-datastr", {NULL}, 9100, "udp"}, -{"pdl-datastream", {NULL}, 9100, "tcp"}, -{"pdl-datastream", {NULL}, 9100, "udp"}, -{"bacula-dir", {NULL}, 9101, "tcp"}, -{"bacula-dir", {NULL}, 9101, "udp"}, -{"bacula-fd", {NULL}, 9102, "tcp"}, -{"bacula-fd", {NULL}, 9102, "udp"}, -{"bacula-sd", {NULL}, 9103, "tcp"}, -{"bacula-sd", {NULL}, 9103, "udp"}, -{"peerwire", {NULL}, 9104, "tcp"}, -{"peerwire", {NULL}, 9104, "udp"}, -{"xadmin", {NULL}, 9105, "tcp"}, -{"xadmin", {NULL}, 9105, "udp"}, -{"astergate", {NULL}, 9106, "tcp"}, -{"astergate-disc", {NULL}, 9106, "udp"}, -{"astergatefax", {NULL}, 9107, "tcp"}, -{"mxit", {NULL}, 9119, "tcp"}, -{"mxit", {NULL}, 9119, "udp"}, -{"dddp", {NULL}, 9131, "tcp"}, -{"dddp", {NULL}, 9131, "udp"}, -{"apani1", {NULL}, 9160, "tcp"}, -{"apani1", {NULL}, 9160, "udp"}, -{"apani2", {NULL}, 9161, "tcp"}, -{"apani2", {NULL}, 9161, "udp"}, -{"apani3", {NULL}, 9162, "tcp"}, -{"apani3", {NULL}, 9162, "udp"}, -{"apani4", {NULL}, 9163, "tcp"}, -{"apani4", {NULL}, 9163, "udp"}, -{"apani5", {NULL}, 9164, "tcp"}, -{"apani5", {NULL}, 9164, "udp"}, -{"sun-as-jpda", {NULL}, 9191, "tcp"}, -{"sun-as-jpda", {NULL}, 9191, "udp"}, -{"wap-wsp", {NULL}, 9200, "tcp"}, -{"wap-wsp", {NULL}, 9200, "udp"}, -{"wap-wsp-wtp", {NULL}, 9201, "tcp"}, -{"wap-wsp-wtp", {NULL}, 9201, "udp"}, -{"wap-wsp-s", {NULL}, 9202, "tcp"}, -{"wap-wsp-s", {NULL}, 9202, "udp"}, -{"wap-wsp-wtp-s", {NULL}, 9203, "tcp"}, -{"wap-wsp-wtp-s", {NULL}, 9203, "udp"}, -{"wap-vcard", {NULL}, 9204, "tcp"}, -{"wap-vcard", {NULL}, 9204, "udp"}, -{"wap-vcal", {NULL}, 9205, "tcp"}, -{"wap-vcal", {NULL}, 9205, "udp"}, -{"wap-vcard-s", {NULL}, 9206, "tcp"}, -{"wap-vcard-s", {NULL}, 9206, "udp"}, -{"wap-vcal-s", {NULL}, 9207, "tcp"}, -{"wap-vcal-s", {NULL}, 9207, "udp"}, -{"rjcdb-vcards", {NULL}, 9208, "tcp"}, -{"rjcdb-vcards", {NULL}, 9208, "udp"}, -{"almobile-system", {NULL}, 9209, "tcp"}, -{"almobile-system", {NULL}, 9209, "udp"}, -{"oma-mlp", {NULL}, 9210, "tcp"}, -{"oma-mlp", {NULL}, 9210, "udp"}, -{"oma-mlp-s", {NULL}, 9211, "tcp"}, -{"oma-mlp-s", {NULL}, 9211, "udp"}, -{"serverviewdbms", {NULL}, 9212, "tcp"}, -{"serverviewdbms", {NULL}, 9212, "udp"}, -{"serverstart", {NULL}, 9213, "tcp"}, -{"serverstart", {NULL}, 9213, "udp"}, -{"ipdcesgbs", {NULL}, 9214, "tcp"}, -{"ipdcesgbs", {NULL}, 9214, "udp"}, -{"insis", {NULL}, 9215, "tcp"}, -{"insis", {NULL}, 9215, "udp"}, -{"acme", {NULL}, 9216, "tcp"}, -{"acme", {NULL}, 9216, "udp"}, -{"fsc-port", {NULL}, 9217, "tcp"}, -{"fsc-port", {NULL}, 9217, "udp"}, -{"teamcoherence", {NULL}, 9222, "tcp"}, -{"teamcoherence", {NULL}, 9222, "udp"}, -{"mon", {NULL}, 9255, "tcp"}, -{"mon", {NULL}, 9255, "udp"}, -{"pegasus", {NULL}, 9278, "tcp"}, -{"pegasus", {NULL}, 9278, "udp"}, -{"pegasus-ctl", {NULL}, 9279, "tcp"}, -{"pegasus-ctl", {NULL}, 9279, "udp"}, -{"pgps", {NULL}, 9280, "tcp"}, -{"pgps", {NULL}, 9280, "udp"}, -{"swtp-port1", {NULL}, 9281, "tcp"}, -{"swtp-port1", {NULL}, 9281, "udp"}, -{"swtp-port2", {NULL}, 9282, "tcp"}, -{"swtp-port2", {NULL}, 9282, "udp"}, -{"callwaveiam", {NULL}, 9283, "tcp"}, -{"callwaveiam", {NULL}, 9283, "udp"}, -{"visd", {NULL}, 9284, "tcp"}, -{"visd", {NULL}, 9284, "udp"}, -{"n2h2server", {NULL}, 9285, "tcp"}, -{"n2h2server", {NULL}, 9285, "udp"}, -{"n2receive", {NULL}, 9286, "udp"}, -{"cumulus", {NULL}, 9287, "tcp"}, -{"cumulus", {NULL}, 9287, "udp"}, -{"armtechdaemon", {NULL}, 9292, "tcp"}, -{"armtechdaemon", {NULL}, 9292, "udp"}, -{"storview", {NULL}, 9293, "tcp"}, -{"storview", {NULL}, 9293, "udp"}, -{"armcenterhttp", {NULL}, 9294, "tcp"}, -{"armcenterhttp", {NULL}, 9294, "udp"}, -{"armcenterhttps", {NULL}, 9295, "tcp"}, -{"armcenterhttps", {NULL}, 9295, "udp"}, -{"vrace", {NULL}, 9300, "tcp"}, -{"vrace", {NULL}, 9300, "udp"}, -{"sphinxql", {NULL}, 9306, "tcp"}, -{"sphinxapi", {NULL}, 9312, "tcp"}, -{"secure-ts", {NULL}, 9318, "tcp"}, -{"secure-ts", {NULL}, 9318, "udp"}, -{"guibase", {NULL}, 9321, "tcp"}, -{"guibase", {NULL}, 9321, "udp"}, -{"mpidcmgr", {NULL}, 9343, "tcp"}, -{"mpidcmgr", {NULL}, 9343, "udp"}, -{"mphlpdmc", {NULL}, 9344, "tcp"}, -{"mphlpdmc", {NULL}, 9344, "udp"}, -{"ctechlicensing", {NULL}, 9346, "tcp"}, -{"ctechlicensing", {NULL}, 9346, "udp"}, -{"fjdmimgr", {NULL}, 9374, "tcp"}, -{"fjdmimgr", {NULL}, 9374, "udp"}, -{"boxp", {NULL}, 9380, "tcp"}, -{"boxp", {NULL}, 9380, "udp"}, -{"d2dconfig", {NULL}, 9387, "tcp"}, -{"d2ddatatrans", {NULL}, 9388, "tcp"}, -{"adws", {NULL}, 9389, "tcp"}, -{"otp", {NULL}, 9390, "tcp"}, -{"fjinvmgr", {NULL}, 9396, "tcp"}, -{"fjinvmgr", {NULL}, 9396, "udp"}, -{"mpidcagt", {NULL}, 9397, "tcp"}, -{"mpidcagt", {NULL}, 9397, "udp"}, -{"sec-t4net-srv", {NULL}, 9400, "tcp"}, -{"sec-t4net-srv", {NULL}, 9400, "udp"}, -{"sec-t4net-clt", {NULL}, 9401, "tcp"}, -{"sec-t4net-clt", {NULL}, 9401, "udp"}, -{"sec-pc2fax-srv", {NULL}, 9402, "tcp"}, -{"sec-pc2fax-srv", {NULL}, 9402, "udp"}, -{"git", {NULL}, 9418, "tcp"}, -{"git", {NULL}, 9418, "udp"}, -{"tungsten-https", {NULL}, 9443, "tcp"}, -{"tungsten-https", {NULL}, 9443, "udp"}, -{"wso2esb-console", {NULL}, 9444, "tcp"}, -{"wso2esb-console", {NULL}, 9444, "udp"}, -{"sntlkeyssrvr", {NULL}, 9450, "tcp"}, -{"sntlkeyssrvr", {NULL}, 9450, "udp"}, -{"ismserver", {NULL}, 9500, "tcp"}, -{"ismserver", {NULL}, 9500, "udp"}, -{"sma-spw", {NULL}, 9522, "udp"}, -{"mngsuite", {NULL}, 9535, "tcp"}, -{"mngsuite", {NULL}, 9535, "udp"}, -{"laes-bf", {NULL}, 9536, "tcp"}, -{"laes-bf", {NULL}, 9536, "udp"}, -{"trispen-sra", {NULL}, 9555, "tcp"}, -{"trispen-sra", {NULL}, 9555, "udp"}, -{"ldgateway", {NULL}, 9592, "tcp"}, -{"ldgateway", {NULL}, 9592, "udp"}, -{"cba8", {NULL}, 9593, "tcp"}, -{"cba8", {NULL}, 9593, "udp"}, -{"msgsys", {NULL}, 9594, "tcp"}, -{"msgsys", {NULL}, 9594, "udp"}, -{"pds", {NULL}, 9595, "tcp"}, -{"pds", {NULL}, 9595, "udp"}, -{"mercury-disc", {NULL}, 9596, "tcp"}, -{"mercury-disc", {NULL}, 9596, "udp"}, -{"pd-admin", {NULL}, 9597, "tcp"}, -{"pd-admin", {NULL}, 9597, "udp"}, -{"vscp", {NULL}, 9598, "tcp"}, -{"vscp", {NULL}, 9598, "udp"}, -{"robix", {NULL}, 9599, "tcp"}, -{"robix", {NULL}, 9599, "udp"}, -{"micromuse-ncpw", {NULL}, 9600, "tcp"}, -{"micromuse-ncpw", {NULL}, 9600, "udp"}, -{"streamcomm-ds", {NULL}, 9612, "tcp"}, -{"streamcomm-ds", {NULL}, 9612, "udp"}, -{"iadt-tls", {NULL}, 9614, "tcp"}, -{"erunbook_agent", {NULL}, 9616, "tcp"}, -{"erunbook_server", {NULL}, 9617, "tcp"}, -{"condor", {NULL}, 9618, "tcp"}, -{"condor", {NULL}, 9618, "udp"}, -{"odbcpathway", {NULL}, 9628, "tcp"}, -{"odbcpathway", {NULL}, 9628, "udp"}, -{"uniport", {NULL}, 9629, "tcp"}, -{"uniport", {NULL}, 9629, "udp"}, -{"peoctlr", {NULL}, 9630, "tcp"}, -{"peocoll", {NULL}, 9631, "tcp"}, -{"mc-comm", {NULL}, 9632, "udp"}, -{"pqsflows", {NULL}, 9640, "tcp"}, -{"xmms2", {NULL}, 9667, "tcp"}, -{"xmms2", {NULL}, 9667, "udp"}, -{"tec5-sdctp", {NULL}, 9668, "tcp"}, -{"tec5-sdctp", {NULL}, 9668, "udp"}, -{"client-wakeup", {NULL}, 9694, "tcp"}, -{"client-wakeup", {NULL}, 9694, "udp"}, -{"ccnx", {NULL}, 9695, "tcp"}, -{"ccnx", {NULL}, 9695, "udp"}, -{"board-roar", {NULL}, 9700, "tcp"}, -{"board-roar", {NULL}, 9700, "udp"}, -{"l5nas-parchan", {NULL}, 9747, "tcp"}, -{"l5nas-parchan", {NULL}, 9747, "udp"}, -{"board-voip", {NULL}, 9750, "tcp"}, -{"board-voip", {NULL}, 9750, "udp"}, -{"rasadv", {NULL}, 9753, "tcp"}, -{"rasadv", {NULL}, 9753, "udp"}, -{"tungsten-http", {NULL}, 9762, "tcp"}, -{"tungsten-http", {NULL}, 9762, "udp"}, -{"davsrc", {NULL}, 9800, "tcp"}, -{"davsrc", {NULL}, 9800, "udp"}, -{"sstp-2", {NULL}, 9801, "tcp"}, -{"sstp-2", {NULL}, 9801, "udp"}, -{"davsrcs", {NULL}, 9802, "tcp"}, -{"davsrcs", {NULL}, 9802, "udp"}, -{"sapv1", {NULL}, 9875, "tcp"}, -{"sapv1", {NULL}, 9875, "udp"}, -{"sd", {NULL}, 9876, "tcp"}, -{"sd", {NULL}, 9876, "udp"}, -{"cyborg-systems", {NULL}, 9888, "tcp"}, -{"cyborg-systems", {NULL}, 9888, "udp"}, -{"gt-proxy", {NULL}, 9889, "tcp"}, -{"gt-proxy", {NULL}, 9889, "udp"}, -{"monkeycom", {NULL}, 9898, "tcp"}, -{"monkeycom", {NULL}, 9898, "udp"}, -{"sctp-tunneling", {NULL}, 9899, "tcp"}, -{"sctp-tunneling", {NULL}, 9899, "udp"}, -{"iua", {NULL}, 9900, "tcp"}, -{"iua", {NULL}, 9900, "udp"}, -{"iua", {NULL}, 9900, "sctp"}, -{"enrp", {NULL}, 9901, "udp"}, -{"enrp-sctp", {NULL}, 9901, "sctp"}, -{"enrp-sctp-tls", {NULL}, 9902, "sctp"}, -{"domaintime", {NULL}, 9909, "tcp"}, -{"domaintime", {NULL}, 9909, "udp"}, -{"sype-transport", {NULL}, 9911, "tcp"}, -{"sype-transport", {NULL}, 9911, "udp"}, -{"apc-9950", {NULL}, 9950, "tcp"}, -{"apc-9950", {NULL}, 9950, "udp"}, -{"apc-9951", {NULL}, 9951, "tcp"}, -{"apc-9951", {NULL}, 9951, "udp"}, -{"apc-9952", {NULL}, 9952, "tcp"}, -{"apc-9952", {NULL}, 9952, "udp"}, -{"acis", {NULL}, 9953, "tcp"}, -{"acis", {NULL}, 9953, "udp"}, -{"odnsp", {NULL}, 9966, "tcp"}, -{"odnsp", {NULL}, 9966, "udp"}, -{"dsm-scm-target", {NULL}, 9987, "tcp"}, -{"dsm-scm-target", {NULL}, 9987, "udp"}, -{"nsesrvr", {NULL}, 9988, "tcp"}, -{"osm-appsrvr", {NULL}, 9990, "tcp"}, -{"osm-appsrvr", {NULL}, 9990, "udp"}, -{"osm-oev", {NULL}, 9991, "tcp"}, -{"osm-oev", {NULL}, 9991, "udp"}, -{"palace-1", {NULL}, 9992, "tcp"}, -{"palace-1", {NULL}, 9992, "udp"}, -{"palace-2", {NULL}, 9993, "tcp"}, -{"palace-2", {NULL}, 9993, "udp"}, -{"palace-3", {NULL}, 9994, "tcp"}, -{"palace-3", {NULL}, 9994, "udp"}, -{"palace-4", {NULL}, 9995, "tcp"}, -{"palace-4", {NULL}, 9995, "udp"}, -{"palace-5", {NULL}, 9996, "tcp"}, -{"palace-5", {NULL}, 9996, "udp"}, -{"palace-6", {NULL}, 9997, "tcp"}, -{"palace-6", {NULL}, 9997, "udp"}, -{"distinct32", {NULL}, 9998, "tcp"}, -{"distinct32", {NULL}, 9998, "udp"}, -{"distinct", {NULL}, 9999, "tcp"}, -{"distinct", {NULL}, 9999, "udp"}, -{"ndmp", {NULL}, 10000, "tcp"}, -{"ndmp", {NULL}, 10000, "udp"}, -{"scp-config", {NULL}, 10001, "tcp"}, -{"scp-config", {NULL}, 10001, "udp"}, -{"documentum", {NULL}, 10002, "tcp"}, -{"documentum", {NULL}, 10002, "udp"}, -{"documentum_s", {NULL}, 10003, "tcp"}, -{"documentum_s", {NULL}, 10003, "udp"}, -{"emcrmirccd", {NULL}, 10004, "tcp"}, -{"emcrmird", {NULL}, 10005, "tcp"}, -{"mvs-capacity", {NULL}, 10007, "tcp"}, -{"mvs-capacity", {NULL}, 10007, "udp"}, -{"octopus", {NULL}, 10008, "tcp"}, -{"octopus", {NULL}, 10008, "udp"}, -{"swdtp-sv", {NULL}, 10009, "tcp"}, -{"swdtp-sv", {NULL}, 10009, "udp"}, -{"rxapi", {NULL}, 10010, "tcp"}, -{"zabbix-agent", {NULL}, 10050, "tcp"}, -{"zabbix-agent", {NULL}, 10050, "udp"}, -{"zabbix-trapper", {NULL}, 10051, "tcp"}, -{"zabbix-trapper", {NULL}, 10051, "udp"}, -{"qptlmd", {NULL}, 10055, "tcp"}, -{"amanda", {NULL}, 10080, "tcp"}, -{"amanda", {NULL}, 10080, "udp"}, -{"famdc", {NULL}, 10081, "tcp"}, -{"famdc", {NULL}, 10081, "udp"}, -{"itap-ddtp", {NULL}, 10100, "tcp"}, -{"itap-ddtp", {NULL}, 10100, "udp"}, -{"ezmeeting-2", {NULL}, 10101, "tcp"}, -{"ezmeeting-2", {NULL}, 10101, "udp"}, -{"ezproxy-2", {NULL}, 10102, "tcp"}, -{"ezproxy-2", {NULL}, 10102, "udp"}, -{"ezrelay", {NULL}, 10103, "tcp"}, -{"ezrelay", {NULL}, 10103, "udp"}, -{"swdtp", {NULL}, 10104, "tcp"}, -{"swdtp", {NULL}, 10104, "udp"}, -{"bctp-server", {NULL}, 10107, "tcp"}, -{"bctp-server", {NULL}, 10107, "udp"}, -{"nmea-0183", {NULL}, 10110, "tcp"}, -{"nmea-0183", {NULL}, 10110, "udp"}, -{"netiq-endpoint", {NULL}, 10113, "tcp"}, -{"netiq-endpoint", {NULL}, 10113, "udp"}, -{"netiq-qcheck", {NULL}, 10114, "tcp"}, -{"netiq-qcheck", {NULL}, 10114, "udp"}, -{"netiq-endpt", {NULL}, 10115, "tcp"}, -{"netiq-endpt", {NULL}, 10115, "udp"}, -{"netiq-voipa", {NULL}, 10116, "tcp"}, -{"netiq-voipa", {NULL}, 10116, "udp"}, -{"iqrm", {NULL}, 10117, "tcp"}, -{"iqrm", {NULL}, 10117, "udp"}, -{"bmc-perf-sd", {NULL}, 10128, "tcp"}, -{"bmc-perf-sd", {NULL}, 10128, "udp"}, -{"bmc-gms", {NULL}, 10129, "tcp"}, -{"qb-db-server", {NULL}, 10160, "tcp"}, -{"qb-db-server", {NULL}, 10160, "udp"}, -{"snmptls", {NULL}, 10161, "tcp"}, -{"snmpdtls", {NULL}, 10161, "udp"}, -{"snmptls-trap", {NULL}, 10162, "tcp"}, -{"snmpdtls-trap", {NULL}, 10162, "udp"}, -{"trisoap", {NULL}, 10200, "tcp"}, -{"trisoap", {NULL}, 10200, "udp"}, -{"rsms", {NULL}, 10201, "tcp"}, -{"rscs", {NULL}, 10201, "udp"}, -{"apollo-relay", {NULL}, 10252, "tcp"}, -{"apollo-relay", {NULL}, 10252, "udp"}, -{"axis-wimp-port", {NULL}, 10260, "tcp"}, -{"axis-wimp-port", {NULL}, 10260, "udp"}, -{"blocks", {NULL}, 10288, "tcp"}, -{"blocks", {NULL}, 10288, "udp"}, -{"cosir", {NULL}, 10321, "tcp"}, -{"hip-nat-t", {NULL}, 10500, "udp"}, -{"MOS-lower", {NULL}, 10540, "tcp"}, -{"MOS-lower", {NULL}, 10540, "udp"}, -{"MOS-upper", {NULL}, 10541, "tcp"}, -{"MOS-upper", {NULL}, 10541, "udp"}, -{"MOS-aux", {NULL}, 10542, "tcp"}, -{"MOS-aux", {NULL}, 10542, "udp"}, -{"MOS-soap", {NULL}, 10543, "tcp"}, -{"MOS-soap", {NULL}, 10543, "udp"}, -{"MOS-soap-opt", {NULL}, 10544, "tcp"}, -{"MOS-soap-opt", {NULL}, 10544, "udp"}, -{"gap", {NULL}, 10800, "tcp"}, -{"gap", {NULL}, 10800, "udp"}, -{"lpdg", {NULL}, 10805, "tcp"}, -{"lpdg", {NULL}, 10805, "udp"}, -{"nbd", {NULL}, 10809, "tcp"}, -{"nmc-disc", {NULL}, 10810, "udp"}, -{"helix", {NULL}, 10860, "tcp"}, -{"helix", {NULL}, 10860, "udp"}, -{"rmiaux", {NULL}, 10990, "tcp"}, -{"rmiaux", {NULL}, 10990, "udp"}, -{"irisa", {NULL}, 11000, "tcp"}, -{"irisa", {NULL}, 11000, "udp"}, -{"metasys", {NULL}, 11001, "tcp"}, -{"metasys", {NULL}, 11001, "udp"}, -{"netapp-icmgmt", {NULL}, 11104, "tcp"}, -{"netapp-icdata", {NULL}, 11105, "tcp"}, -{"sgi-lk", {NULL}, 11106, "tcp"}, -{"sgi-lk", {NULL}, 11106, "udp"}, -{"vce", {NULL}, 11111, "tcp"}, -{"vce", {NULL}, 11111, "udp"}, -{"dicom", {NULL}, 11112, "tcp"}, -{"dicom", {NULL}, 11112, "udp"}, -{"suncacao-snmp", {NULL}, 11161, "tcp"}, -{"suncacao-snmp", {NULL}, 11161, "udp"}, -{"suncacao-jmxmp", {NULL}, 11162, "tcp"}, -{"suncacao-jmxmp", {NULL}, 11162, "udp"}, -{"suncacao-rmi", {NULL}, 11163, "tcp"}, -{"suncacao-rmi", {NULL}, 11163, "udp"}, -{"suncacao-csa", {NULL}, 11164, "tcp"}, -{"suncacao-csa", {NULL}, 11164, "udp"}, -{"suncacao-websvc", {NULL}, 11165, "tcp"}, -{"suncacao-websvc", {NULL}, 11165, "udp"}, -{"snss", {NULL}, 11171, "udp"}, -{"oemcacao-jmxmp", {NULL}, 11172, "tcp"}, -{"oemcacao-rmi", {NULL}, 11174, "tcp"}, -{"oemcacao-websvc", {NULL}, 11175, "tcp"}, -{"smsqp", {NULL}, 11201, "tcp"}, -{"smsqp", {NULL}, 11201, "udp"}, -{"wifree", {NULL}, 11208, "tcp"}, -{"wifree", {NULL}, 11208, "udp"}, -{"memcache", {NULL}, 11211, "tcp"}, -{"memcache", {NULL}, 11211, "udp"}, -{"imip", {NULL}, 11319, "tcp"}, -{"imip", {NULL}, 11319, "udp"}, -{"imip-channels", {NULL}, 11320, "tcp"}, -{"imip-channels", {NULL}, 11320, "udp"}, -{"arena-server", {NULL}, 11321, "tcp"}, -{"arena-server", {NULL}, 11321, "udp"}, -{"atm-uhas", {NULL}, 11367, "tcp"}, -{"atm-uhas", {NULL}, 11367, "udp"}, -{"hkp", {NULL}, 11371, "tcp"}, -{"hkp", {NULL}, 11371, "udp"}, -{"asgcypresstcps", {NULL}, 11489, "tcp"}, -{"tempest-port", {NULL}, 11600, "tcp"}, -{"tempest-port", {NULL}, 11600, "udp"}, -{"h323callsigalt", {NULL}, 11720, "tcp"}, -{"h323callsigalt", {NULL}, 11720, "udp"}, -{"intrepid-ssl", {NULL}, 11751, "tcp"}, -{"intrepid-ssl", {NULL}, 11751, "udp"}, -{"xoraya", {NULL}, 11876, "tcp"}, -{"xoraya", {NULL}, 11876, "udp"}, -{"x2e-disc", {NULL}, 11877, "udp"}, -{"sysinfo-sp", {NULL}, 11967, "tcp"}, -{"sysinfo-sp", {NULL}, 11967, "udp"}, -{"wmereceiving", {NULL}, 11997, "sctp"}, -{"wmedistribution", {NULL}, 11998, "sctp"}, -{"wmereporting", {NULL}, 11999, "sctp"}, -{"entextxid", {NULL}, 12000, "tcp"}, -{"entextxid", {NULL}, 12000, "udp"}, -{"entextnetwk", {NULL}, 12001, "tcp"}, -{"entextnetwk", {NULL}, 12001, "udp"}, -{"entexthigh", {NULL}, 12002, "tcp"}, -{"entexthigh", {NULL}, 12002, "udp"}, -{"entextmed", {NULL}, 12003, "tcp"}, -{"entextmed", {NULL}, 12003, "udp"}, -{"entextlow", {NULL}, 12004, "tcp"}, -{"entextlow", {NULL}, 12004, "udp"}, -{"dbisamserver1", {NULL}, 12005, "tcp"}, -{"dbisamserver1", {NULL}, 12005, "udp"}, -{"dbisamserver2", {NULL}, 12006, "tcp"}, -{"dbisamserver2", {NULL}, 12006, "udp"}, -{"accuracer", {NULL}, 12007, "tcp"}, -{"accuracer", {NULL}, 12007, "udp"}, -{"accuracer-dbms", {NULL}, 12008, "tcp"}, -{"accuracer-dbms", {NULL}, 12008, "udp"}, -{"edbsrvr", {NULL}, 12010, "tcp"}, -{"vipera", {NULL}, 12012, "tcp"}, -{"vipera", {NULL}, 12012, "udp"}, -{"vipera-ssl", {NULL}, 12013, "tcp"}, -{"vipera-ssl", {NULL}, 12013, "udp"}, -{"rets-ssl", {NULL}, 12109, "tcp"}, -{"rets-ssl", {NULL}, 12109, "udp"}, -{"nupaper-ss", {NULL}, 12121, "tcp"}, -{"nupaper-ss", {NULL}, 12121, "udp"}, -{"cawas", {NULL}, 12168, "tcp"}, -{"cawas", {NULL}, 12168, "udp"}, -{"hivep", {NULL}, 12172, "tcp"}, -{"hivep", {NULL}, 12172, "udp"}, -{"linogridengine", {NULL}, 12300, "tcp"}, -{"linogridengine", {NULL}, 12300, "udp"}, -{"warehouse-sss", {NULL}, 12321, "tcp"}, -{"warehouse-sss", {NULL}, 12321, "udp"}, -{"warehouse", {NULL}, 12322, "tcp"}, -{"warehouse", {NULL}, 12322, "udp"}, -{"italk", {NULL}, 12345, "tcp"}, -{"italk", {NULL}, 12345, "udp"}, -{"tsaf", {NULL}, 12753, "tcp"}, -{"tsaf", {NULL}, 12753, "udp"}, -{"i-zipqd", {NULL}, 13160, "tcp"}, -{"i-zipqd", {NULL}, 13160, "udp"}, -{"bcslogc", {NULL}, 13216, "tcp"}, -{"bcslogc", {NULL}, 13216, "udp"}, -{"rs-pias", {NULL}, 13217, "tcp"}, -{"rs-pias", {NULL}, 13217, "udp"}, -{"emc-vcas-tcp", {NULL}, 13218, "tcp"}, -{"emc-vcas-udp", {NULL}, 13218, "udp"}, -{"powwow-client", {NULL}, 13223, "tcp"}, -{"powwow-client", {NULL}, 13223, "udp"}, -{"powwow-server", {NULL}, 13224, "tcp"}, -{"powwow-server", {NULL}, 13224, "udp"}, -{"doip-data", {NULL}, 13400, "tcp"}, -{"doip-disc", {NULL}, 13400, "udp"}, -{"bprd", {NULL}, 13720, "tcp"}, -{"bprd", {NULL}, 13720, "udp"}, -{"bpdbm", {NULL}, 13721, "tcp"}, -{"bpdbm", {NULL}, 13721, "udp"}, -{"bpjava-msvc", {NULL}, 13722, "tcp"}, -{"bpjava-msvc", {NULL}, 13722, "udp"}, -{"vnetd", {NULL}, 13724, "tcp"}, -{"vnetd", {NULL}, 13724, "udp"}, -{"bpcd", {NULL}, 13782, "tcp"}, -{"bpcd", {NULL}, 13782, "udp"}, -{"vopied", {NULL}, 13783, "tcp"}, -{"vopied", {NULL}, 13783, "udp"}, -{"nbdb", {NULL}, 13785, "tcp"}, -{"nbdb", {NULL}, 13785, "udp"}, -{"nomdb", {NULL}, 13786, "tcp"}, -{"nomdb", {NULL}, 13786, "udp"}, -{"dsmcc-config", {NULL}, 13818, "tcp"}, -{"dsmcc-config", {NULL}, 13818, "udp"}, -{"dsmcc-session", {NULL}, 13819, "tcp"}, -{"dsmcc-session", {NULL}, 13819, "udp"}, -{"dsmcc-passthru", {NULL}, 13820, "tcp"}, -{"dsmcc-passthru", {NULL}, 13820, "udp"}, -{"dsmcc-download", {NULL}, 13821, "tcp"}, -{"dsmcc-download", {NULL}, 13821, "udp"}, -{"dsmcc-ccp", {NULL}, 13822, "tcp"}, -{"dsmcc-ccp", {NULL}, 13822, "udp"}, -{"bmdss", {NULL}, 13823, "tcp"}, -{"dta-systems", {NULL}, 13929, "tcp"}, -{"dta-systems", {NULL}, 13929, "udp"}, -{"medevolve", {NULL}, 13930, "tcp"}, -{"scotty-ft", {NULL}, 14000, "tcp"}, -{"scotty-ft", {NULL}, 14000, "udp"}, -{"sua", {NULL}, 14001, "tcp"}, -{"sua", {NULL}, 14001, "udp"}, -{"sua", {NULL}, 14001, "sctp"}, -{"sage-best-com1", {NULL}, 14033, "tcp"}, -{"sage-best-com1", {NULL}, 14033, "udp"}, -{"sage-best-com2", {NULL}, 14034, "tcp"}, -{"sage-best-com2", {NULL}, 14034, "udp"}, -{"vcs-app", {NULL}, 14141, "tcp"}, -{"vcs-app", {NULL}, 14141, "udp"}, -{"icpp", {NULL}, 14142, "tcp"}, -{"icpp", {NULL}, 14142, "udp"}, -{"gcm-app", {NULL}, 14145, "tcp"}, -{"gcm-app", {NULL}, 14145, "udp"}, -{"vrts-tdd", {NULL}, 14149, "tcp"}, -{"vrts-tdd", {NULL}, 14149, "udp"}, -{"vcscmd", {NULL}, 14150, "tcp"}, -{"vad", {NULL}, 14154, "tcp"}, -{"vad", {NULL}, 14154, "udp"}, -{"cps", {NULL}, 14250, "tcp"}, -{"cps", {NULL}, 14250, "udp"}, -{"ca-web-update", {NULL}, 14414, "tcp"}, -{"ca-web-update", {NULL}, 14414, "udp"}, -{"hde-lcesrvr-1", {NULL}, 14936, "tcp"}, -{"hde-lcesrvr-1", {NULL}, 14936, "udp"}, -{"hde-lcesrvr-2", {NULL}, 14937, "tcp"}, -{"hde-lcesrvr-2", {NULL}, 14937, "udp"}, -{"hydap", {NULL}, 15000, "tcp"}, -{"hydap", {NULL}, 15000, "udp"}, -{"xpilot", {NULL}, 15345, "tcp"}, -{"xpilot", {NULL}, 15345, "udp"}, -{"3link", {NULL}, 15363, "tcp"}, -{"3link", {NULL}, 15363, "udp"}, -{"cisco-snat", {NULL}, 15555, "tcp"}, -{"cisco-snat", {NULL}, 15555, "udp"}, -{"bex-xr", {NULL}, 15660, "tcp"}, -{"bex-xr", {NULL}, 15660, "udp"}, -{"ptp", {NULL}, 15740, "tcp"}, -{"ptp", {NULL}, 15740, "udp"}, -{"2ping", {NULL}, 15998, "udp"}, -{"programmar", {NULL}, 15999, "tcp"}, -{"fmsas", {NULL}, 16000, "tcp"}, -{"fmsascon", {NULL}, 16001, "tcp"}, -{"gsms", {NULL}, 16002, "tcp"}, -{"alfin", {NULL}, 16003, "udp"}, -{"jwpc", {NULL}, 16020, "tcp"}, -{"jwpc-bin", {NULL}, 16021, "tcp"}, -{"sun-sea-port", {NULL}, 16161, "tcp"}, -{"sun-sea-port", {NULL}, 16161, "udp"}, -{"solaris-audit", {NULL}, 16162, "tcp"}, -{"etb4j", {NULL}, 16309, "tcp"}, -{"etb4j", {NULL}, 16309, "udp"}, -{"pduncs", {NULL}, 16310, "tcp"}, -{"pduncs", {NULL}, 16310, "udp"}, -{"pdefmns", {NULL}, 16311, "tcp"}, -{"pdefmns", {NULL}, 16311, "udp"}, -{"netserialext1", {NULL}, 16360, "tcp"}, -{"netserialext1", {NULL}, 16360, "udp"}, -{"netserialext2", {NULL}, 16361, "tcp"}, -{"netserialext2", {NULL}, 16361, "udp"}, -{"netserialext3", {NULL}, 16367, "tcp"}, -{"netserialext3", {NULL}, 16367, "udp"}, -{"netserialext4", {NULL}, 16368, "tcp"}, -{"netserialext4", {NULL}, 16368, "udp"}, -{"connected", {NULL}, 16384, "tcp"}, -{"connected", {NULL}, 16384, "udp"}, -{"xoms", {NULL}, 16619, "tcp"}, -{"newbay-snc-mc", {NULL}, 16900, "tcp"}, -{"newbay-snc-mc", {NULL}, 16900, "udp"}, -{"sgcip", {NULL}, 16950, "tcp"}, -{"sgcip", {NULL}, 16950, "udp"}, -{"intel-rci-mp", {NULL}, 16991, "tcp"}, -{"intel-rci-mp", {NULL}, 16991, "udp"}, -{"amt-soap-http", {NULL}, 16992, "tcp"}, -{"amt-soap-http", {NULL}, 16992, "udp"}, -{"amt-soap-https", {NULL}, 16993, "tcp"}, -{"amt-soap-https", {NULL}, 16993, "udp"}, -{"amt-redir-tcp", {NULL}, 16994, "tcp"}, -{"amt-redir-tcp", {NULL}, 16994, "udp"}, -{"amt-redir-tls", {NULL}, 16995, "tcp"}, -{"amt-redir-tls", {NULL}, 16995, "udp"}, -{"isode-dua", {NULL}, 17007, "tcp"}, -{"isode-dua", {NULL}, 17007, "udp"}, -{"soundsvirtual", {NULL}, 17185, "tcp"}, -{"soundsvirtual", {NULL}, 17185, "udp"}, -{"chipper", {NULL}, 17219, "tcp"}, -{"chipper", {NULL}, 17219, "udp"}, -{"integrius-stp", {NULL}, 17234, "tcp"}, -{"integrius-stp", {NULL}, 17234, "udp"}, -{"ssh-mgmt", {NULL}, 17235, "tcp"}, -{"ssh-mgmt", {NULL}, 17235, "udp"}, -{"db-lsp", {NULL}, 17500, "tcp"}, -{"db-lsp-disc", {NULL}, 17500, "udp"}, -{"ea", {NULL}, 17729, "tcp"}, -{"ea", {NULL}, 17729, "udp"}, -{"zep", {NULL}, 17754, "tcp"}, -{"zep", {NULL}, 17754, "udp"}, -{"zigbee-ip", {NULL}, 17755, "tcp"}, -{"zigbee-ip", {NULL}, 17755, "udp"}, -{"zigbee-ips", {NULL}, 17756, "tcp"}, -{"zigbee-ips", {NULL}, 17756, "udp"}, -{"sw-orion", {NULL}, 17777, "tcp"}, -{"biimenu", {NULL}, 18000, "tcp"}, -{"biimenu", {NULL}, 18000, "udp"}, -{"radpdf", {NULL}, 18104, "tcp"}, -{"racf", {NULL}, 18136, "tcp"}, -{"opsec-cvp", {NULL}, 18181, "tcp"}, -{"opsec-cvp", {NULL}, 18181, "udp"}, -{"opsec-ufp", {NULL}, 18182, "tcp"}, -{"opsec-ufp", {NULL}, 18182, "udp"}, -{"opsec-sam", {NULL}, 18183, "tcp"}, -{"opsec-sam", {NULL}, 18183, "udp"}, -{"opsec-lea", {NULL}, 18184, "tcp"}, -{"opsec-lea", {NULL}, 18184, "udp"}, -{"opsec-omi", {NULL}, 18185, "tcp"}, -{"opsec-omi", {NULL}, 18185, "udp"}, -{"ohsc", {NULL}, 18186, "tcp"}, -{"ohsc", {NULL}, 18186, "udp"}, -{"opsec-ela", {NULL}, 18187, "tcp"}, -{"opsec-ela", {NULL}, 18187, "udp"}, -{"checkpoint-rtm", {NULL}, 18241, "tcp"}, -{"checkpoint-rtm", {NULL}, 18241, "udp"}, -{"gv-pf", {NULL}, 18262, "tcp"}, -{"gv-pf", {NULL}, 18262, "udp"}, -{"ac-cluster", {NULL}, 18463, "tcp"}, -{"ac-cluster", {NULL}, 18463, "udp"}, -{"rds-ib", {NULL}, 18634, "tcp"}, -{"rds-ib", {NULL}, 18634, "udp"}, -{"rds-ip", {NULL}, 18635, "tcp"}, -{"rds-ip", {NULL}, 18635, "udp"}, -{"ique", {NULL}, 18769, "tcp"}, -{"ique", {NULL}, 18769, "udp"}, -{"infotos", {NULL}, 18881, "tcp"}, -{"infotos", {NULL}, 18881, "udp"}, -{"apc-necmp", {NULL}, 18888, "tcp"}, -{"apc-necmp", {NULL}, 18888, "udp"}, -{"igrid", {NULL}, 19000, "tcp"}, -{"igrid", {NULL}, 19000, "udp"}, -{"j-link", {NULL}, 19020, "tcp"}, -{"opsec-uaa", {NULL}, 19191, "tcp"}, -{"opsec-uaa", {NULL}, 19191, "udp"}, -{"ua-secureagent", {NULL}, 19194, "tcp"}, -{"ua-secureagent", {NULL}, 19194, "udp"}, -{"keysrvr", {NULL}, 19283, "tcp"}, -{"keysrvr", {NULL}, 19283, "udp"}, -{"keyshadow", {NULL}, 19315, "tcp"}, -{"keyshadow", {NULL}, 19315, "udp"}, -{"mtrgtrans", {NULL}, 19398, "tcp"}, -{"mtrgtrans", {NULL}, 19398, "udp"}, -{"hp-sco", {NULL}, 19410, "tcp"}, -{"hp-sco", {NULL}, 19410, "udp"}, -{"hp-sca", {NULL}, 19411, "tcp"}, -{"hp-sca", {NULL}, 19411, "udp"}, -{"hp-sessmon", {NULL}, 19412, "tcp"}, -{"hp-sessmon", {NULL}, 19412, "udp"}, -{"fxuptp", {NULL}, 19539, "tcp"}, -{"fxuptp", {NULL}, 19539, "udp"}, -{"sxuptp", {NULL}, 19540, "tcp"}, -{"sxuptp", {NULL}, 19540, "udp"}, -{"jcp", {NULL}, 19541, "tcp"}, -{"jcp", {NULL}, 19541, "udp"}, -{"iec-104-sec", {NULL}, 19998, "tcp"}, -{"dnp-sec", {NULL}, 19999, "tcp"}, -{"dnp-sec", {NULL}, 19999, "udp"}, -{"dnp", {NULL}, 20000, "tcp"}, -{"dnp", {NULL}, 20000, "udp"}, -{"microsan", {NULL}, 20001, "tcp"}, -{"microsan", {NULL}, 20001, "udp"}, -{"commtact-http", {NULL}, 20002, "tcp"}, -{"commtact-http", {NULL}, 20002, "udp"}, -{"commtact-https", {NULL}, 20003, "tcp"}, -{"commtact-https", {NULL}, 20003, "udp"}, -{"openwebnet", {NULL}, 20005, "tcp"}, -{"openwebnet", {NULL}, 20005, "udp"}, -{"ss-idi-disc", {NULL}, 20012, "udp"}, -{"ss-idi", {NULL}, 20013, "tcp"}, -{"opendeploy", {NULL}, 20014, "tcp"}, -{"opendeploy", {NULL}, 20014, "udp"}, -{"nburn_id", {NULL}, 20034, "tcp"}, -{"nburn_id", {NULL}, 20034, "udp"}, -{"tmophl7mts", {NULL}, 20046, "tcp"}, -{"tmophl7mts", {NULL}, 20046, "udp"}, -{"mountd", {NULL}, 20048, "tcp"}, -{"mountd", {NULL}, 20048, "udp"}, -{"nfsrdma", {NULL}, 20049, "tcp"}, -{"nfsrdma", {NULL}, 20049, "udp"}, -{"nfsrdma", {NULL}, 20049, "sctp"}, -{"tolfab", {NULL}, 20167, "tcp"}, -{"tolfab", {NULL}, 20167, "udp"}, -{"ipdtp-port", {NULL}, 20202, "tcp"}, -{"ipdtp-port", {NULL}, 20202, "udp"}, -{"ipulse-ics", {NULL}, 20222, "tcp"}, -{"ipulse-ics", {NULL}, 20222, "udp"}, -{"emwavemsg", {NULL}, 20480, "tcp"}, -{"emwavemsg", {NULL}, 20480, "udp"}, -{"track", {NULL}, 20670, "tcp"}, -{"track", {NULL}, 20670, "udp"}, -{"athand-mmp", {NULL}, 20999, "tcp"}, -{"athand-mmp", {NULL}, 20999, "udp"}, -{"irtrans", {NULL}, 21000, "tcp"}, -{"irtrans", {NULL}, 21000, "udp"}, -{"dfserver", {NULL}, 21554, "tcp"}, -{"dfserver", {NULL}, 21554, "udp"}, -{"vofr-gateway", {NULL}, 21590, "tcp"}, -{"vofr-gateway", {NULL}, 21590, "udp"}, -{"tvpm", {NULL}, 21800, "tcp"}, -{"tvpm", {NULL}, 21800, "udp"}, -{"webphone", {NULL}, 21845, "tcp"}, -{"webphone", {NULL}, 21845, "udp"}, -{"netspeak-is", {NULL}, 21846, "tcp"}, -{"netspeak-is", {NULL}, 21846, "udp"}, -{"netspeak-cs", {NULL}, 21847, "tcp"}, -{"netspeak-cs", {NULL}, 21847, "udp"}, -{"netspeak-acd", {NULL}, 21848, "tcp"}, -{"netspeak-acd", {NULL}, 21848, "udp"}, -{"netspeak-cps", {NULL}, 21849, "tcp"}, -{"netspeak-cps", {NULL}, 21849, "udp"}, -{"snapenetio", {NULL}, 22000, "tcp"}, -{"snapenetio", {NULL}, 22000, "udp"}, -{"optocontrol", {NULL}, 22001, "tcp"}, -{"optocontrol", {NULL}, 22001, "udp"}, -{"optohost002", {NULL}, 22002, "tcp"}, -{"optohost002", {NULL}, 22002, "udp"}, -{"optohost003", {NULL}, 22003, "tcp"}, -{"optohost003", {NULL}, 22003, "udp"}, -{"optohost004", {NULL}, 22004, "tcp"}, -{"optohost004", {NULL}, 22004, "udp"}, -{"optohost004", {NULL}, 22005, "tcp"}, -{"optohost004", {NULL}, 22005, "udp"}, -{"dcap", {NULL}, 22125, "tcp"}, -{"gsidcap", {NULL}, 22128, "tcp"}, -{"wnn6", {NULL}, 22273, "tcp"}, -{"wnn6", {NULL}, 22273, "udp"}, -{"cis", {NULL}, 22305, "tcp"}, -{"cis", {NULL}, 22305, "udp"}, -{"cis-secure", {NULL}, 22343, "tcp"}, -{"cis-secure", {NULL}, 22343, "udp"}, -{"WibuKey", {NULL}, 22347, "tcp"}, -{"WibuKey", {NULL}, 22347, "udp"}, -{"CodeMeter", {NULL}, 22350, "tcp"}, -{"CodeMeter", {NULL}, 22350, "udp"}, -{"vocaltec-wconf", {NULL}, 22555, "tcp"}, -{"vocaltec-phone", {NULL}, 22555, "udp"}, -{"talikaserver", {NULL}, 22763, "tcp"}, -{"talikaserver", {NULL}, 22763, "udp"}, -{"aws-brf", {NULL}, 22800, "tcp"}, -{"aws-brf", {NULL}, 22800, "udp"}, -{"brf-gw", {NULL}, 22951, "tcp"}, -{"brf-gw", {NULL}, 22951, "udp"}, -{"inovaport1", {NULL}, 23000, "tcp"}, -{"inovaport1", {NULL}, 23000, "udp"}, -{"inovaport2", {NULL}, 23001, "tcp"}, -{"inovaport2", {NULL}, 23001, "udp"}, -{"inovaport3", {NULL}, 23002, "tcp"}, -{"inovaport3", {NULL}, 23002, "udp"}, -{"inovaport4", {NULL}, 23003, "tcp"}, -{"inovaport4", {NULL}, 23003, "udp"}, -{"inovaport5", {NULL}, 23004, "tcp"}, -{"inovaport5", {NULL}, 23004, "udp"}, -{"inovaport6", {NULL}, 23005, "tcp"}, -{"inovaport6", {NULL}, 23005, "udp"}, -{"s102", {NULL}, 23272, "udp"}, -{"elxmgmt", {NULL}, 23333, "tcp"}, -{"elxmgmt", {NULL}, 23333, "udp"}, -{"novar-dbase", {NULL}, 23400, "tcp"}, -{"novar-dbase", {NULL}, 23400, "udp"}, -{"novar-alarm", {NULL}, 23401, "tcp"}, -{"novar-alarm", {NULL}, 23401, "udp"}, -{"novar-global", {NULL}, 23402, "tcp"}, -{"novar-global", {NULL}, 23402, "udp"}, -{"aequus", {NULL}, 23456, "tcp"}, -{"aequus-alt", {NULL}, 23457, "tcp"}, -{"med-ltp", {NULL}, 24000, "tcp"}, -{"med-ltp", {NULL}, 24000, "udp"}, -{"med-fsp-rx", {NULL}, 24001, "tcp"}, -{"med-fsp-rx", {NULL}, 24001, "udp"}, -{"med-fsp-tx", {NULL}, 24002, "tcp"}, -{"med-fsp-tx", {NULL}, 24002, "udp"}, -{"med-supp", {NULL}, 24003, "tcp"}, -{"med-supp", {NULL}, 24003, "udp"}, -{"med-ovw", {NULL}, 24004, "tcp"}, -{"med-ovw", {NULL}, 24004, "udp"}, -{"med-ci", {NULL}, 24005, "tcp"}, -{"med-ci", {NULL}, 24005, "udp"}, -{"med-net-svc", {NULL}, 24006, "tcp"}, -{"med-net-svc", {NULL}, 24006, "udp"}, -{"filesphere", {NULL}, 24242, "tcp"}, -{"filesphere", {NULL}, 24242, "udp"}, -{"vista-4gl", {NULL}, 24249, "tcp"}, -{"vista-4gl", {NULL}, 24249, "udp"}, -{"ild", {NULL}, 24321, "tcp"}, -{"ild", {NULL}, 24321, "udp"}, -{"intel_rci", {NULL}, 24386, "tcp"}, -{"intel_rci", {NULL}, 24386, "udp"}, -{"tonidods", {NULL}, 24465, "tcp"}, -{"tonidods", {NULL}, 24465, "udp"}, -{"binkp", {NULL}, 24554, "tcp"}, -{"binkp", {NULL}, 24554, "udp"}, -{"canditv", {NULL}, 24676, "tcp"}, -{"canditv", {NULL}, 24676, "udp"}, -{"flashfiler", {NULL}, 24677, "tcp"}, -{"flashfiler", {NULL}, 24677, "udp"}, -{"proactivate", {NULL}, 24678, "tcp"}, -{"proactivate", {NULL}, 24678, "udp"}, -{"tcc-http", {NULL}, 24680, "tcp"}, -{"tcc-http", {NULL}, 24680, "udp"}, -{"cslg", {NULL}, 24754, "tcp"}, -{"find", {NULL}, 24922, "tcp"}, -{"find", {NULL}, 24922, "udp"}, -{"icl-twobase1", {NULL}, 25000, "tcp"}, -{"icl-twobase1", {NULL}, 25000, "udp"}, -{"icl-twobase2", {NULL}, 25001, "tcp"}, -{"icl-twobase2", {NULL}, 25001, "udp"}, -{"icl-twobase3", {NULL}, 25002, "tcp"}, -{"icl-twobase3", {NULL}, 25002, "udp"}, -{"icl-twobase4", {NULL}, 25003, "tcp"}, -{"icl-twobase4", {NULL}, 25003, "udp"}, -{"icl-twobase5", {NULL}, 25004, "tcp"}, -{"icl-twobase5", {NULL}, 25004, "udp"}, -{"icl-twobase6", {NULL}, 25005, "tcp"}, -{"icl-twobase6", {NULL}, 25005, "udp"}, -{"icl-twobase7", {NULL}, 25006, "tcp"}, -{"icl-twobase7", {NULL}, 25006, "udp"}, -{"icl-twobase8", {NULL}, 25007, "tcp"}, -{"icl-twobase8", {NULL}, 25007, "udp"}, -{"icl-twobase9", {NULL}, 25008, "tcp"}, -{"icl-twobase9", {NULL}, 25008, "udp"}, -{"icl-twobase10", {NULL}, 25009, "tcp"}, -{"icl-twobase10", {NULL}, 25009, "udp"}, -{"rna", {NULL}, 25471, "sctp"}, -{"sauterdongle", {NULL}, 25576, "tcp"}, -{"vocaltec-hos", {NULL}, 25793, "tcp"}, -{"vocaltec-hos", {NULL}, 25793, "udp"}, -{"tasp-net", {NULL}, 25900, "tcp"}, -{"tasp-net", {NULL}, 25900, "udp"}, -{"niobserver", {NULL}, 25901, "tcp"}, -{"niobserver", {NULL}, 25901, "udp"}, -{"nilinkanalyst", {NULL}, 25902, "tcp"}, -{"nilinkanalyst", {NULL}, 25902, "udp"}, -{"niprobe", {NULL}, 25903, "tcp"}, -{"niprobe", {NULL}, 25903, "udp"}, -{"quake", {NULL}, 26000, "tcp"}, -{"quake", {NULL}, 26000, "udp"}, -{"scscp", {NULL}, 26133, "tcp"}, -{"scscp", {NULL}, 26133, "udp"}, -{"wnn6-ds", {NULL}, 26208, "tcp"}, -{"wnn6-ds", {NULL}, 26208, "udp"}, -{"ezproxy", {NULL}, 26260, "tcp"}, -{"ezproxy", {NULL}, 26260, "udp"}, -{"ezmeeting", {NULL}, 26261, "tcp"}, -{"ezmeeting", {NULL}, 26261, "udp"}, -{"k3software-svr", {NULL}, 26262, "tcp"}, -{"k3software-svr", {NULL}, 26262, "udp"}, -{"k3software-cli", {NULL}, 26263, "tcp"}, -{"k3software-cli", {NULL}, 26263, "udp"}, -{"exoline-tcp", {NULL}, 26486, "tcp"}, -{"exoline-udp", {NULL}, 26486, "udp"}, -{"exoconfig", {NULL}, 26487, "tcp"}, -{"exoconfig", {NULL}, 26487, "udp"}, -{"exonet", {NULL}, 26489, "tcp"}, -{"exonet", {NULL}, 26489, "udp"}, -{"imagepump", {NULL}, 27345, "tcp"}, -{"imagepump", {NULL}, 27345, "udp"}, -{"jesmsjc", {NULL}, 27442, "tcp"}, -{"jesmsjc", {NULL}, 27442, "udp"}, -{"kopek-httphead", {NULL}, 27504, "tcp"}, -{"kopek-httphead", {NULL}, 27504, "udp"}, -{"ars-vista", {NULL}, 27782, "tcp"}, -{"ars-vista", {NULL}, 27782, "udp"}, -{"tw-auth-key", {NULL}, 27999, "tcp"}, -{"tw-auth-key", {NULL}, 27999, "udp"}, -{"nxlmd", {NULL}, 28000, "tcp"}, -{"nxlmd", {NULL}, 28000, "udp"}, -{"pqsp", {NULL}, 28001, "tcp"}, -{"siemensgsm", {NULL}, 28240, "tcp"}, -{"siemensgsm", {NULL}, 28240, "udp"}, -{"sgsap", {NULL}, 29118, "sctp"}, -{"otmp", {NULL}, 29167, "tcp"}, -{"otmp", {NULL}, 29167, "udp"}, -{"sbcap", {NULL}, 29168, "sctp"}, -{"iuhsctpassoc", {NULL}, 29169, "sctp"}, -{"pago-services1", {NULL}, 30001, "tcp"}, -{"pago-services1", {NULL}, 30001, "udp"}, -{"pago-services2", {NULL}, 30002, "tcp"}, -{"pago-services2", {NULL}, 30002, "udp"}, -{"kingdomsonline", {NULL}, 30260, "tcp"}, -{"kingdomsonline", {NULL}, 30260, "udp"}, -{"ovobs", {NULL}, 30999, "tcp"}, -{"ovobs", {NULL}, 30999, "udp"}, -{"autotrac-acp", {NULL}, 31020, "tcp"}, -{"yawn", {NULL}, 31029, "udp"}, -{"xqosd", {NULL}, 31416, "tcp"}, -{"xqosd", {NULL}, 31416, "udp"}, -{"tetrinet", {NULL}, 31457, "tcp"}, -{"tetrinet", {NULL}, 31457, "udp"}, -{"lm-mon", {NULL}, 31620, "tcp"}, -{"lm-mon", {NULL}, 31620, "udp"}, -{"dsx_monitor", {NULL}, 31685, "tcp"}, -{"gamesmith-port", {NULL}, 31765, "tcp"}, -{"gamesmith-port", {NULL}, 31765, "udp"}, -{"iceedcp_tx", {NULL}, 31948, "tcp"}, -{"iceedcp_tx", {NULL}, 31948, "udp"}, -{"iceedcp_rx", {NULL}, 31949, "tcp"}, -{"iceedcp_rx", {NULL}, 31949, "udp"}, -{"iracinghelper", {NULL}, 32034, "tcp"}, -{"iracinghelper", {NULL}, 32034, "udp"}, -{"t1distproc60", {NULL}, 32249, "tcp"}, -{"t1distproc60", {NULL}, 32249, "udp"}, -{"apm-link", {NULL}, 32483, "tcp"}, -{"apm-link", {NULL}, 32483, "udp"}, -{"sec-ntb-clnt", {NULL}, 32635, "tcp"}, -{"sec-ntb-clnt", {NULL}, 32635, "udp"}, -{"DMExpress", {NULL}, 32636, "tcp"}, -{"DMExpress", {NULL}, 32636, "udp"}, -{"filenet-powsrm", {NULL}, 32767, "tcp"}, -{"filenet-powsrm", {NULL}, 32767, "udp"}, -{"filenet-tms", {NULL}, 32768, "tcp"}, -{"filenet-tms", {NULL}, 32768, "udp"}, -{"filenet-rpc", {NULL}, 32769, "tcp"}, -{"filenet-rpc", {NULL}, 32769, "udp"}, -{"filenet-nch", {NULL}, 32770, "tcp"}, -{"filenet-nch", {NULL}, 32770, "udp"}, -{"filenet-rmi", {NULL}, 32771, "tcp"}, -{"filenet-rmi", {NULL}, 32771, "udp"}, -{"filenet-pa", {NULL}, 32772, "tcp"}, -{"filenet-pa", {NULL}, 32772, "udp"}, -{"filenet-cm", {NULL}, 32773, "tcp"}, -{"filenet-cm", {NULL}, 32773, "udp"}, -{"filenet-re", {NULL}, 32774, "tcp"}, -{"filenet-re", {NULL}, 32774, "udp"}, -{"filenet-pch", {NULL}, 32775, "tcp"}, -{"filenet-pch", {NULL}, 32775, "udp"}, -{"filenet-peior", {NULL}, 32776, "tcp"}, -{"filenet-peior", {NULL}, 32776, "udp"}, -{"filenet-obrok", {NULL}, 32777, "tcp"}, -{"filenet-obrok", {NULL}, 32777, "udp"}, -{"mlsn", {NULL}, 32801, "tcp"}, -{"mlsn", {NULL}, 32801, "udp"}, -{"retp", {NULL}, 32811, "tcp"}, -{"idmgratm", {NULL}, 32896, "tcp"}, -{"idmgratm", {NULL}, 32896, "udp"}, -{"aurora-balaena", {NULL}, 33123, "tcp"}, -{"aurora-balaena", {NULL}, 33123, "udp"}, -{"diamondport", {NULL}, 33331, "tcp"}, -{"diamondport", {NULL}, 33331, "udp"}, -{"dgi-serv", {NULL}, 33333, "tcp"}, -{"traceroute", {NULL}, 33434, "tcp"}, -{"traceroute", {NULL}, 33434, "udp"}, -{"snip-slave", {NULL}, 33656, "tcp"}, -{"snip-slave", {NULL}, 33656, "udp"}, -{"turbonote-2", {NULL}, 34249, "tcp"}, -{"turbonote-2", {NULL}, 34249, "udp"}, -{"p-net-local", {NULL}, 34378, "tcp"}, -{"p-net-local", {NULL}, 34378, "udp"}, -{"p-net-remote", {NULL}, 34379, "tcp"}, -{"p-net-remote", {NULL}, 34379, "udp"}, -{"dhanalakshmi", {NULL}, 34567, "tcp"}, -{"profinet-rt", {NULL}, 34962, "tcp"}, -{"profinet-rt", {NULL}, 34962, "udp"}, -{"profinet-rtm", {NULL}, 34963, "tcp"}, -{"profinet-rtm", {NULL}, 34963, "udp"}, -{"profinet-cm", {NULL}, 34964, "tcp"}, -{"profinet-cm", {NULL}, 34964, "udp"}, -{"ethercat", {NULL}, 34980, "tcp"}, -{"ethercat", {NULL}, 34980, "udp"}, -{"allpeers", {NULL}, 36001, "tcp"}, -{"allpeers", {NULL}, 36001, "udp"}, -{"s1-control", {NULL}, 36412, "sctp"}, -{"x2-control", {NULL}, 36422, "sctp"}, -{"m2ap", {NULL}, 36443, "sctp"}, -{"m3ap", {NULL}, 36444, "sctp"}, -{"kastenxpipe", {NULL}, 36865, "tcp"}, -{"kastenxpipe", {NULL}, 36865, "udp"}, -{"neckar", {NULL}, 37475, "tcp"}, -{"neckar", {NULL}, 37475, "udp"}, -{"unisys-eportal", {NULL}, 37654, "tcp"}, -{"unisys-eportal", {NULL}, 37654, "udp"}, -{"galaxy7-data", {NULL}, 38201, "tcp"}, -{"galaxy7-data", {NULL}, 38201, "udp"}, -{"fairview", {NULL}, 38202, "tcp"}, -{"fairview", {NULL}, 38202, "udp"}, -{"agpolicy", {NULL}, 38203, "tcp"}, -{"agpolicy", {NULL}, 38203, "udp"}, -{"turbonote-1", {NULL}, 39681, "tcp"}, -{"turbonote-1", {NULL}, 39681, "udp"}, -{"safetynetp", {NULL}, 40000, "tcp"}, -{"safetynetp", {NULL}, 40000, "udp"}, -{"cscp", {NULL}, 40841, "tcp"}, -{"cscp", {NULL}, 40841, "udp"}, -{"csccredir", {NULL}, 40842, "tcp"}, -{"csccredir", {NULL}, 40842, "udp"}, -{"csccfirewall", {NULL}, 40843, "tcp"}, -{"csccfirewall", {NULL}, 40843, "udp"}, -{"ortec-disc", {NULL}, 40853, "udp"}, -{"fs-qos", {NULL}, 41111, "tcp"}, -{"fs-qos", {NULL}, 41111, "udp"}, -{"tentacle", {NULL}, 41121, "tcp"}, -{"crestron-cip", {NULL}, 41794, "tcp"}, -{"crestron-cip", {NULL}, 41794, "udp"}, -{"crestron-ctp", {NULL}, 41795, "tcp"}, -{"crestron-ctp", {NULL}, 41795, "udp"}, -{"candp", {NULL}, 42508, "tcp"}, -{"candp", {NULL}, 42508, "udp"}, -{"candrp", {NULL}, 42509, "tcp"}, -{"candrp", {NULL}, 42509, "udp"}, -{"caerpc", {NULL}, 42510, "tcp"}, -{"caerpc", {NULL}, 42510, "udp"}, -{"reachout", {NULL}, 43188, "tcp"}, -{"reachout", {NULL}, 43188, "udp"}, -{"ndm-agent-port", {NULL}, 43189, "tcp"}, -{"ndm-agent-port", {NULL}, 43189, "udp"}, -{"ip-provision", {NULL}, 43190, "tcp"}, -{"ip-provision", {NULL}, 43190, "udp"}, -{"noit-transport", {NULL}, 43191, "tcp"}, -{"ew-mgmt", {NULL}, 43440, "tcp"}, -{"ew-disc-cmd", {NULL}, 43440, "udp"}, -{"ciscocsdb", {NULL}, 43441, "tcp"}, -{"ciscocsdb", {NULL}, 43441, "udp"}, -{"pmcd", {NULL}, 44321, "tcp"}, -{"pmcd", {NULL}, 44321, "udp"}, -{"pmcdproxy", {NULL}, 44322, "tcp"}, -{"pmcdproxy", {NULL}, 44322, "udp"}, -{"pcp", {NULL}, 44323, "udp"}, -{"rbr-debug", {NULL}, 44553, "tcp"}, -{"rbr-debug", {NULL}, 44553, "udp"}, -{"EtherNet/IP-2", {NULL}, 44818, "tcp"}, -{"EtherNet/IP-2", {NULL}, 44818, "udp"}, -{"invision-ag", {NULL}, 45054, "tcp"}, -{"invision-ag", {NULL}, 45054, "udp"}, -{"eba", {NULL}, 45678, "tcp"}, -{"eba", {NULL}, 45678, "udp"}, -{"qdb2service", {NULL}, 45825, "tcp"}, -{"qdb2service", {NULL}, 45825, "udp"}, -{"ssr-servermgr", {NULL}, 45966, "tcp"}, -{"ssr-servermgr", {NULL}, 45966, "udp"}, -{"mediabox", {NULL}, 46999, "tcp"}, -{"mediabox", {NULL}, 46999, "udp"}, -{"mbus", {NULL}, 47000, "tcp"}, -{"mbus", {NULL}, 47000, "udp"}, -{"winrm", {NULL}, 47001, "tcp"}, -{"dbbrowse", {NULL}, 47557, "tcp"}, -{"dbbrowse", {NULL}, 47557, "udp"}, -{"directplaysrvr", {NULL}, 47624, "tcp"}, -{"directplaysrvr", {NULL}, 47624, "udp"}, -{"ap", {NULL}, 47806, "tcp"}, -{"ap", {NULL}, 47806, "udp"}, -{"bacnet", {NULL}, 47808, "tcp"}, -{"bacnet", {NULL}, 47808, "udp"}, -{"nimcontroller", {NULL}, 48000, "tcp"}, -{"nimcontroller", {NULL}, 48000, "udp"}, -{"nimspooler", {NULL}, 48001, "tcp"}, -{"nimspooler", {NULL}, 48001, "udp"}, -{"nimhub", {NULL}, 48002, "tcp"}, -{"nimhub", {NULL}, 48002, "udp"}, -{"nimgtw", {NULL}, 48003, "tcp"}, -{"nimgtw", {NULL}, 48003, "udp"}, -{"nimbusdb", {NULL}, 48004, "tcp"}, -{"nimbusdbctrl", {NULL}, 48005, "tcp"}, -{"3gpp-cbsp", {NULL}, 48049, "tcp"}, -{"isnetserv", {NULL}, 48128, "tcp"}, -{"isnetserv", {NULL}, 48128, "udp"}, -{"blp5", {NULL}, 48129, "tcp"}, -{"blp5", {NULL}, 48129, "udp"}, -{"com-bardac-dw", {NULL}, 48556, "tcp"}, -{"com-bardac-dw", {NULL}, 48556, "udp"}, -{"iqobject", {NULL}, 48619, "tcp"}, -{"iqobject", {NULL}, 48619, "udp"}, -#endif /* USE_IANA_REGISTERED_PORTS */ -{ NULL, {NULL}, 0, NULL } -}; - -struct servent *getservbyport(int port, const char *proto) -{ - unsigned short u_port; - const char *protocol = NULL; - int i, error = 0; - - u_port = ntohs((unsigned short)port); - - if (proto) - { - switch (strlen(proto)) { - case 3: - if (!strncasecmp(proto, "tcp", 3)) - protocol = "tcp"; - else if (!strncasecmp(proto, "udp", 3)) - protocol = "udp"; - else - error = WSAEFAULT; - break; - case 4: - if (!strncasecmp(proto, "sctp", 4)) - protocol = "sctp"; - else if (!strncasecmp(proto, "dccp", 4)) - protocol = "dccp"; - else - error = WSAEFAULT; - break; - default: - error = WSAEFAULT; - } - } - - if (!error) - { - for (i = 0; i < (sizeof(IANAports) / sizeof(IANAports[0])) - 1; i++) - { - if (u_port == IANAports[i].s_port) - { - if (!protocol || !strcasecmp(protocol, IANAports[i].s_proto)) - return (struct servent *)&IANAports[i]; - } - } - error = WSANO_DATA; - } - - SET_SOCKERRNO(error); - return NULL; -} - -#endif /* _WIN32_WCE */ diff --git a/lib/c-ares-1.19.1/src/lib/ares_platform.h b/lib/c-ares-1.19.1/src/lib/ares_platform.h deleted file mode 100644 index e6885ae5461..00000000000 --- a/lib/c-ares-1.19.1/src/lib/ares_platform.h +++ /dev/null @@ -1,43 +0,0 @@ -#ifndef HEADER_CARES_PLATFORM_H -#define HEADER_CARES_PLATFORM_H - - -/* Copyright 1998 by the Massachusetts Institute of Technology. - * Copyright (C) 2004 - 2011 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. - */ - -#include "ares_setup.h" - -#if defined(WIN32) && !defined(MSDOS) - -typedef enum { - WIN_UNKNOWN, - WIN_3X, - WIN_9X, - WIN_NT, - WIN_CE -} win_platform; - -win_platform ares__getplatform(void); - -#endif - -#if defined(_WIN32_WCE) - -struct servent *getservbyport(int port, const char *proto); - -#endif - -#endif /* HEADER_CARES_PLATFORM_H */ diff --git a/lib/c-ares-1.19.1/src/lib/ares_private.h b/lib/c-ares-1.19.1/src/lib/ares_private.h deleted file mode 100644 index b6eab8a7d9b..00000000000 --- a/lib/c-ares-1.19.1/src/lib/ares_private.h +++ /dev/null @@ -1,437 +0,0 @@ -#ifndef __ARES_PRIVATE_H -#define __ARES_PRIVATE_H - - -/* Copyright 1998 by the Massachusetts Institute of Technology. - * Copyright (C) 2004-2010 by Daniel Stenberg - * - * 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. - */ - -/* - * Define WIN32 when build target is Win32 API - */ - -#if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32) -#define WIN32 -#endif - -#ifdef HAVE_NETINET_IN_H -#include -#endif - -#ifdef WATT32 -#include -#include -#define writev(s,v,c) writev_s(s,v,c) -#define HAVE_WRITEV 1 -#endif - -#define DEFAULT_TIMEOUT 5000 /* milliseconds */ -#define DEFAULT_TRIES 4 -#ifndef INADDR_NONE -#define INADDR_NONE 0xffffffff -#endif - -#ifdef CARES_EXPOSE_STATICS -/* Make some internal functions visible for testing */ -#define STATIC_TESTABLE -#else -#define STATIC_TESTABLE static -#endif - -/* By using a double cast, we can get rid of the bogus warning of - * warning: cast from 'const struct sockaddr *' to 'const struct sockaddr_in6 *' increases required alignment from 1 to 4 [-Wcast-align] - */ -#define CARES_INADDR_CAST(type, var) ((type)((void *)var)) - -#if defined(WIN32) && !defined(WATT32) - -#define WIN_NS_9X "System\\CurrentControlSet\\Services\\VxD\\MSTCP" -#define WIN_NS_NT_KEY "System\\CurrentControlSet\\Services\\Tcpip\\Parameters" -#define WIN_DNSCLIENT "Software\\Policies\\Microsoft\\System\\DNSClient" -#define WIN_NT_DNSCLIENT "Software\\Policies\\Microsoft\\Windows NT\\DNSClient" -#define NAMESERVER "NameServer" -#define DHCPNAMESERVER "DhcpNameServer" -#define DATABASEPATH "DatabasePath" -#define WIN_PATH_HOSTS "\\hosts" -#define SEARCHLIST_KEY "SearchList" -#define PRIMARYDNSSUFFIX_KEY "PrimaryDNSSuffix" -#define INTERFACES_KEY "Interfaces" -#define DOMAIN_KEY "Domain" -#define DHCPDOMAIN_KEY "DhcpDomain" - -#elif defined(WATT32) - -#define PATH_RESOLV_CONF "/dev/ENV/etc/resolv.conf" -W32_FUNC const char *_w32_GetHostsFile (void); - -#elif defined(NETWARE) - -#define PATH_RESOLV_CONF "sys:/etc/resolv.cfg" -#define PATH_HOSTS "sys:/etc/hosts" - -#elif defined(__riscos__) - -#define PATH_HOSTS "InetDBase:Hosts" - -#elif defined(__HAIKU__) - -#define PATH_RESOLV_CONF "/system/settings/network/resolv.conf" -#define PATH_HOSTS "/system/settings/network/hosts" - -#else - -#define PATH_RESOLV_CONF "/etc/resolv.conf" -#ifdef ETC_INET -#define PATH_HOSTS "/etc/inet/hosts" -#else -#define PATH_HOSTS "/etc/hosts" -#endif - -#endif - -#include "ares_ipv6.h" -#include "ares_llist.h" - -#ifndef HAVE_GETENV -# include "ares_getenv.h" -# define getenv(ptr) ares_getenv(ptr) -#endif - -#include "ares_strdup.h" -#include "ares_strsplit.h" - -#ifndef HAVE_STRCASECMP -# include "ares_strcasecmp.h" -# define strcasecmp(p1,p2) ares_strcasecmp(p1,p2) -#endif - -#ifndef HAVE_STRNCASECMP -# include "ares_strcasecmp.h" -# define strncasecmp(p1,p2,n) ares_strncasecmp(p1,p2,n) -#endif - -#ifndef HAVE_WRITEV -# include "ares_writev.h" -# define writev(s,ptr,cnt) ares_writev(s,ptr,cnt) -#endif - -/********* EDNS defines section ******/ -#define EDNSPACKETSZ 1280 /* Reasonable UDP payload size, as suggested - in RFC2671 */ -#define MAXENDSSZ 4096 /* Maximum (local) limit for edns packet size */ -#define EDNSFIXEDSZ 11 /* Size of EDNS header */ -/********* EDNS defines section ******/ - -struct ares_addr { - int family; - union { - struct in_addr addr4; - struct ares_in6_addr addr6; - } addr; - int udp_port; /* stored in network order */ - int tcp_port; /* stored in network order */ -}; -#define addrV4 addr.addr4 -#define addrV6 addr.addr6 - -struct query; - -struct send_request { - /* Remaining data to send */ - const unsigned char *data; - size_t len; - - /* The query for which we're sending this data */ - struct query* owner_query; - /* The buffer we're using, if we have our own copy of the packet */ - unsigned char *data_storage; - - /* Next request in queue */ - struct send_request *next; -}; - -struct server_state { - struct ares_addr addr; - ares_socket_t udp_socket; - ares_socket_t tcp_socket; - - /* Mini-buffer for reading the length word */ - unsigned char tcp_lenbuf[2]; - int tcp_lenbuf_pos; - int tcp_length; - - /* Buffer for reading actual TCP data */ - unsigned char *tcp_buffer; - int tcp_buffer_pos; - - /* TCP output queue */ - struct send_request *qhead; - struct send_request *qtail; - - /* Which incarnation of this connection is this? We don't want to - * retransmit requests into the very same socket, but if the server - * closes on us and we re-open the connection, then we do want to - * re-send. */ - int tcp_connection_generation; - - /* Circular, doubly-linked list of outstanding queries to this server */ - struct list_node queries_to_server; - - /* Link back to owning channel */ - ares_channel channel; - - /* Is this server broken? We mark connections as broken when a - * request that is queued for sending times out. - */ - int is_broken; -}; - -/* State to represent a DNS query */ -struct query { - /* Query ID from qbuf, for faster lookup, and current timeout */ - unsigned short qid; - struct timeval timeout; - - /* - * Links for the doubly-linked lists in which we insert a query. - * These circular, doubly-linked lists that are hash-bucketed based - * the attributes we care about, help making most important - * operations O(1). - */ - struct list_node queries_by_qid; /* hopefully in same cache line as qid */ - struct list_node queries_by_timeout; - struct list_node queries_to_server; - struct list_node all_queries; - - /* Query buf with length at beginning, for TCP transmission */ - unsigned char *tcpbuf; - int tcplen; - - /* Arguments passed to ares_send() (qbuf points into tcpbuf) */ - const unsigned char *qbuf; - int qlen; - ares_callback callback; - void *arg; - - /* Query status */ - int try_count; /* Number of times we tried this query already. */ - int server; /* Server this query has last been sent to. */ - struct query_server_info *server_info; /* per-server state */ - int using_tcp; - int error_status; - int timeouts; /* number of timeouts we saw for this request */ -}; - -/* Per-server state for a query */ -struct query_server_info { - int skip_server; /* should we skip server, due to errors, etc? */ - int tcp_connection_generation; /* into which TCP connection did we send? */ -}; - -/* An IP address pattern; matches an IP address X if X & mask == addr */ -#define PATTERN_MASK 0x1 -#define PATTERN_CIDR 0x2 - -struct apattern { - union - { - struct in_addr addr4; - struct ares_in6_addr addr6; - } addr; - union - { - struct in_addr addr4; - struct ares_in6_addr addr6; - unsigned short bits; - } mask; - int family; - unsigned short type; -}; - -struct ares_rand_state; -typedef struct ares_rand_state ares_rand_state; - -struct ares_channeldata { - /* Configuration data */ - int flags; - int timeout; /* in milliseconds */ - int tries; - int ndots; - int rotate; /* if true, all servers specified are used */ - int udp_port; /* stored in network order */ - int tcp_port; /* stored in network order */ - int socket_send_buffer_size; - int socket_receive_buffer_size; - char **domains; - int ndomains; - struct apattern *sortlist; - int nsort; - char *lookups; - int ednspsz; - - /* For binding to local devices and/or IP addresses. Leave - * them null/zero for no binding. - */ - char local_dev_name[32]; - unsigned int local_ip4; - unsigned char local_ip6[16]; - - int optmask; /* the option bitfield passed in at init time */ - - /* Server addresses and communications state */ - struct server_state *servers; - int nservers; - - /* ID to use for next query */ - unsigned short next_id; - /* random state to use when generating new ids */ - ares_rand_state *rand_state; - - /* Generation number to use for the next TCP socket open/close */ - int tcp_connection_generation; - - /* The time at which we last called process_timeouts(). Uses integer seconds - just to draw the line somewhere. */ - time_t last_timeout_processed; - - /* Last server we sent a query to. */ - int last_server; - - /* Circular, doubly-linked list of queries, bucketed various ways.... */ - /* All active queries in a single list: */ - struct list_node all_queries; - /* Queries bucketed by qid, for quickly dispatching DNS responses: */ -#define ARES_QID_TABLE_SIZE 2048 - struct list_node queries_by_qid[ARES_QID_TABLE_SIZE]; - /* Queries bucketed by timeout, for quickly handling timeouts: */ -#define ARES_TIMEOUT_TABLE_SIZE 1024 - struct list_node queries_by_timeout[ARES_TIMEOUT_TABLE_SIZE]; - - ares_sock_state_cb sock_state_cb; - void *sock_state_cb_data; - - ares_sock_create_callback sock_create_cb; - void *sock_create_cb_data; - - ares_sock_config_callback sock_config_cb; - void *sock_config_cb_data; - - const struct ares_socket_functions * sock_funcs; - void *sock_func_cb_data; - - /* Path for resolv.conf file, configurable via ares_options */ - char *resolvconf_path; - - /* Path for hosts file, configurable via ares_options */ - char *hosts_path; -}; - -/* Does the domain end in ".onion" or ".onion."? Case-insensitive. */ -int ares__is_onion_domain(const char *name); - -/* Memory management functions */ -extern void *(*ares_malloc)(size_t size); -extern void *(*ares_realloc)(void *ptr, size_t size); -extern void (*ares_free)(void *ptr); - -/* return true if now is exactly check time or later */ -int ares__timedout(struct timeval *now, - struct timeval *check); - -void ares__send_query(ares_channel channel, struct query *query, - struct timeval *now); -void ares__close_sockets(ares_channel channel, struct server_state *server); -int ares__get_hostent(FILE *fp, int family, struct hostent **host); -int ares__read_line(FILE *fp, char **buf, size_t *bufsize); -void ares__free_query(struct query *query); - -ares_rand_state *ares__init_rand_state(void); -void ares__destroy_rand_state(ares_rand_state *state); -unsigned short ares__generate_new_id(ares_rand_state *state); -struct timeval ares__tvnow(void); -int ares__expand_name_validated(const unsigned char *encoded, - const unsigned char *abuf, - int alen, char **s, long *enclen, - int is_hostname); -int ares__expand_name_for_response(const unsigned char *encoded, - const unsigned char *abuf, int alen, - char **s, long *enclen, int is_hostname); -void ares__init_servers_state(ares_channel channel); -void ares__destroy_servers_state(ares_channel channel); -int ares__parse_qtype_reply(const unsigned char* abuf, int alen, int* qtype); -int ares__single_domain(ares_channel channel, const char *name, char **s); -int ares__cat_domain(const char *name, const char *domain, char **s); -int ares__sortaddrinfo(ares_channel channel, struct ares_addrinfo_node *ai_node); -int ares__readaddrinfo(FILE *fp, const char *name, unsigned short port, - const struct ares_addrinfo_hints *hints, - struct ares_addrinfo *ai); - -struct ares_addrinfo *ares__malloc_addrinfo(void); - -struct ares_addrinfo_node *ares__malloc_addrinfo_node(void); -void ares__freeaddrinfo_nodes(struct ares_addrinfo_node *ai_node); - -struct ares_addrinfo_node *ares__append_addrinfo_node(struct ares_addrinfo_node **ai_node); -void ares__addrinfo_cat_nodes(struct ares_addrinfo_node **head, - struct ares_addrinfo_node *tail); - -struct ares_addrinfo_cname *ares__malloc_addrinfo_cname(void); -void ares__freeaddrinfo_cnames(struct ares_addrinfo_cname *ai_cname); - -struct ares_addrinfo_cname *ares__append_addrinfo_cname(struct ares_addrinfo_cname **ai_cname); - -int ares_append_ai_node(int aftype, unsigned short port, int ttl, - const void *adata, - struct ares_addrinfo_node **nodes); - -void ares__addrinfo_cat_cnames(struct ares_addrinfo_cname **head, - struct ares_addrinfo_cname *tail); - -int ares__parse_into_addrinfo(const unsigned char *abuf, - int alen, int cname_only_is_enodata, - unsigned short port, - struct ares_addrinfo *ai); - -int ares__addrinfo2hostent(const struct ares_addrinfo *ai, int family, - struct hostent **host); -int ares__addrinfo2addrttl(const struct ares_addrinfo *ai, int family, - int req_naddrttls, struct ares_addrttl *addrttls, - struct ares_addr6ttl *addr6ttls, int *naddrttls); -int ares__addrinfo_localhost(const char *name, unsigned short port, - const struct ares_addrinfo_hints *hints, - struct ares_addrinfo *ai); - -#if 0 /* Not used */ -long ares__tvdiff(struct timeval t1, struct timeval t2); -#endif - -ares_socket_t ares__open_socket(ares_channel channel, - int af, int type, int protocol); -void ares__close_socket(ares_channel, ares_socket_t); -int ares__connect_socket(ares_channel channel, - ares_socket_t sockfd, - const struct sockaddr *addr, - ares_socklen_t addrlen); - -#define ARES_SWAP_BYTE(a,b) \ - { unsigned char swapByte = *(a); *(a) = *(b); *(b) = swapByte; } - -#define SOCK_STATE_CALLBACK(c, s, r, w) \ - do { \ - if ((c)->sock_state_cb) \ - (c)->sock_state_cb((c)->sock_state_cb_data, (s), (r), (w)); \ - } WHILE_FALSE - -#endif /* __ARES_PRIVATE_H */ diff --git a/lib/c-ares-1.19.1/src/lib/ares_process.c b/lib/c-ares-1.19.1/src/lib/ares_process.c deleted file mode 100644 index 6cac0a99fdf..00000000000 --- a/lib/c-ares-1.19.1/src/lib/ares_process.c +++ /dev/null @@ -1,1587 +0,0 @@ - -/* Copyright 1998 by the Massachusetts Institute of Technology. - * Copyright (C) 2004-2017 by Daniel Stenberg - * - * 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. - */ - -#include "ares_setup.h" - -#ifdef HAVE_SYS_UIO_H -# include -#endif -#ifdef HAVE_NETINET_IN_H -# include -#endif -#ifdef HAVE_NETINET_TCP_H -# include -#endif -#ifdef HAVE_NETDB_H -# include -#endif -#ifdef HAVE_ARPA_INET_H -# include -#endif - -#include "ares_nameser.h" - -#ifdef HAVE_STRINGS_H -# include -#endif -#ifdef HAVE_SYS_IOCTL_H -# include -#endif -#ifdef NETWARE -# include -#endif - -#include -#include -#include - -#include "ares.h" -#include "ares_dns.h" -#include "ares_nowarn.h" -#include "ares_private.h" - - -static int try_again(int errnum); -static void write_tcp_data(ares_channel channel, fd_set *write_fds, - ares_socket_t write_fd, struct timeval *now); -static void read_tcp_data(ares_channel channel, fd_set *read_fds, - ares_socket_t read_fd, struct timeval *now); -static void read_udp_packets(ares_channel channel, fd_set *read_fds, - ares_socket_t read_fd, struct timeval *now); -static void advance_tcp_send_queue(ares_channel channel, int whichserver, - ares_ssize_t num_bytes); -static void process_timeouts(ares_channel channel, struct timeval *now); -static void process_broken_connections(ares_channel channel, - struct timeval *now); -static void process_answer(ares_channel channel, unsigned char *abuf, - int alen, int whichserver, int tcp, - struct timeval *now); -static void handle_error(ares_channel channel, int whichserver, - struct timeval *now); -static void skip_server(ares_channel channel, struct query *query, - int whichserver); -static void next_server(ares_channel channel, struct query *query, - struct timeval *now); -static int open_tcp_socket(ares_channel channel, struct server_state *server); -static int open_udp_socket(ares_channel channel, struct server_state *server); -static int same_questions(const unsigned char *qbuf, int qlen, - const unsigned char *abuf, int alen); -static int same_address(struct sockaddr *sa, struct ares_addr *aa); -static int has_opt_rr(const unsigned char *abuf, int alen); -static void end_query(ares_channel channel, struct query *query, int status, - unsigned char *abuf, int alen); - -/* return true if now is exactly check time or later */ -int ares__timedout(struct timeval *now, - struct timeval *check) -{ - long secs = (now->tv_sec - check->tv_sec); - - if(secs > 0) - return 1; /* yes, timed out */ - if(secs < 0) - return 0; /* nope, not timed out */ - - /* if the full seconds were identical, check the sub second parts */ - return (now->tv_usec - check->tv_usec >= 0); -} - -/* add the specific number of milliseconds to the time in the first argument */ -static void timeadd(struct timeval *now, int millisecs) -{ - now->tv_sec += millisecs/1000; - now->tv_usec += (millisecs%1000)*1000; - - if(now->tv_usec >= 1000000) { - ++(now->tv_sec); - now->tv_usec -= 1000000; - } -} - -/* - * generic process function - */ -static void processfds(ares_channel channel, - fd_set *read_fds, ares_socket_t read_fd, - fd_set *write_fds, ares_socket_t write_fd) -{ - struct timeval now = ares__tvnow(); - - write_tcp_data(channel, write_fds, write_fd, &now); - read_tcp_data(channel, read_fds, read_fd, &now); - read_udp_packets(channel, read_fds, read_fd, &now); - process_timeouts(channel, &now); - process_broken_connections(channel, &now); -} - -/* Something interesting happened on the wire, or there was a timeout. - * See what's up and respond accordingly. - */ -void ares_process(ares_channel channel, fd_set *read_fds, fd_set *write_fds) -{ - processfds(channel, read_fds, ARES_SOCKET_BAD, write_fds, ARES_SOCKET_BAD); -} - -/* Something interesting happened on the wire, or there was a timeout. - * See what's up and respond accordingly. - */ -void ares_process_fd(ares_channel channel, - ares_socket_t read_fd, /* use ARES_SOCKET_BAD or valid - file descriptors */ - ares_socket_t write_fd) -{ - processfds(channel, NULL, read_fd, NULL, write_fd); -} - - -/* Return 1 if the specified error number describes a readiness error, or 0 - * otherwise. This is mostly for HP-UX, which could return EAGAIN or - * EWOULDBLOCK. See this man page - * - * http://devrsrc1.external.hp.com/STKS/cgi-bin/man2html? - * manpage=/usr/share/man/man2.Z/send.2 - */ -static int try_again(int errnum) -{ -#if !defined EWOULDBLOCK && !defined EAGAIN -#error "Neither EWOULDBLOCK nor EAGAIN defined" -#endif - switch (errnum) - { -#ifdef EWOULDBLOCK - case EWOULDBLOCK: - return 1; -#endif -#if defined EAGAIN && EAGAIN != EWOULDBLOCK - case EAGAIN: - return 1; -#endif - } - return 0; -} - -static ares_ssize_t socket_writev(ares_channel channel, ares_socket_t s, const struct iovec * vec, int len) -{ - if (channel->sock_funcs) - return channel->sock_funcs->asendv(s, vec, len, channel->sock_func_cb_data); - - return writev(s, vec, len); -} - -static ares_ssize_t socket_write(ares_channel channel, ares_socket_t s, const void * data, size_t len) -{ - if (channel->sock_funcs) - { - struct iovec vec; - vec.iov_base = (void*)data; - vec.iov_len = len; - return channel->sock_funcs->asendv(s, &vec, 1, channel->sock_func_cb_data); - } - return swrite(s, data, len); -} - -/* If any TCP sockets select true for writing, write out queued data - * we have for them. - */ -static void write_tcp_data(ares_channel channel, - fd_set *write_fds, - ares_socket_t write_fd, - struct timeval *now) -{ - struct server_state *server; - struct send_request *sendreq; - struct iovec *vec; - int i; - ares_ssize_t scount; - ares_ssize_t wcount; - size_t n; - /* From writev manpage: An implementation can advertise its limit by defining - IOV_MAX in or at run time via the return value from - sysconf(_SC_IOV_MAX). On modern Linux systems, the limit is 1024. Back in - Linux 2.0 days, this limit was 16. */ -#if defined(IOV_MAX) - const size_t maxn = IOV_MAX; /* FreeBSD */ -#elif defined(_SC_IOV_MAX) - const size_t maxn = sysconf(_SC_IOV_MAX); /* Linux */ -#else - const size_t maxn = 16; /* Safe default */ -#endif - - if(!write_fds && (write_fd == ARES_SOCKET_BAD)) - /* no possible action */ - return; - - for (i = 0; i < channel->nservers; i++) - { - /* Make sure server has data to send and is selected in write_fds or - write_fd. */ - server = &channel->servers[i]; - if (!server->qhead || server->tcp_socket == ARES_SOCKET_BAD || - server->is_broken) - continue; - - if(write_fds) { - if(!FD_ISSET(server->tcp_socket, write_fds)) - continue; - } - else { - if(server->tcp_socket != write_fd) - continue; - } - - if(write_fds) - /* If there's an error and we close this socket, then open - * another with the same fd to talk to another server, then we - * don't want to think that it was the new socket that was - * ready. This is not disastrous, but is likely to result in - * extra system calls and confusion. */ - FD_CLR(server->tcp_socket, write_fds); - - /* Count the number of send queue items. */ - n = 0; - for (sendreq = server->qhead; sendreq; sendreq = sendreq->next) - n++; - - /* Allocate iovecs so we can send all our data at once. */ - vec = ares_malloc(n * sizeof(struct iovec)); - if (vec) - { - /* Fill in the iovecs and send. */ - n = 0; - for (sendreq = server->qhead; sendreq; sendreq = sendreq->next) - { - vec[n].iov_base = (char *) sendreq->data; - vec[n].iov_len = sendreq->len; - n++; - if(n >= maxn) - break; - } - wcount = socket_writev(channel, server->tcp_socket, vec, (int)n); - ares_free(vec); - if (wcount < 0) - { - if (!try_again(SOCKERRNO)) - handle_error(channel, i, now); - continue; - } - - /* Advance the send queue by as many bytes as we sent. */ - advance_tcp_send_queue(channel, i, wcount); - } - else - { - /* Can't allocate iovecs; just send the first request. */ - sendreq = server->qhead; - - scount = socket_write(channel, server->tcp_socket, sendreq->data, sendreq->len); - if (scount < 0) - { - if (!try_again(SOCKERRNO)) - handle_error(channel, i, now); - continue; - } - - /* Advance the send queue by as many bytes as we sent. */ - advance_tcp_send_queue(channel, i, scount); - } - } -} - -/* Consume the given number of bytes from the head of the TCP send queue. */ -static void advance_tcp_send_queue(ares_channel channel, int whichserver, - ares_ssize_t num_bytes) -{ - struct send_request *sendreq; - struct server_state *server = &channel->servers[whichserver]; - while (num_bytes > 0) { - sendreq = server->qhead; - if ((size_t)num_bytes >= sendreq->len) { - num_bytes -= sendreq->len; - server->qhead = sendreq->next; - if (sendreq->data_storage) - ares_free(sendreq->data_storage); - ares_free(sendreq); - if (server->qhead == NULL) { - SOCK_STATE_CALLBACK(channel, server->tcp_socket, 1, 0); - server->qtail = NULL; - - /* qhead is NULL so we cannot continue this loop */ - break; - } - } - else { - sendreq->data += num_bytes; - sendreq->len -= num_bytes; - num_bytes = 0; - } - } -} - -static ares_ssize_t socket_recvfrom(ares_channel channel, - ares_socket_t s, - void * data, - size_t data_len, - int flags, - struct sockaddr *from, - ares_socklen_t *from_len) -{ - if (channel->sock_funcs) - return channel->sock_funcs->arecvfrom(s, data, data_len, - flags, from, from_len, - channel->sock_func_cb_data); - -#ifdef HAVE_RECVFROM - return recvfrom(s, data, data_len, flags, from, from_len); -#else - return sread(s, data, data_len); -#endif -} - -static ares_ssize_t socket_recv(ares_channel channel, - ares_socket_t s, - void * data, - size_t data_len) -{ - if (channel->sock_funcs) - return channel->sock_funcs->arecvfrom(s, data, data_len, 0, 0, 0, - channel->sock_func_cb_data); - - return sread(s, data, data_len); -} - -/* If any TCP socket selects true for reading, read some data, - * allocate a buffer if we finish reading the length word, and process - * a packet if we finish reading one. - */ -static void read_tcp_data(ares_channel channel, fd_set *read_fds, - ares_socket_t read_fd, struct timeval *now) -{ - struct server_state *server; - int i; - ares_ssize_t count; - - if(!read_fds && (read_fd == ARES_SOCKET_BAD)) - /* no possible action */ - return; - - for (i = 0; i < channel->nservers; i++) - { - /* Make sure the server has a socket and is selected in read_fds. */ - server = &channel->servers[i]; - if (server->tcp_socket == ARES_SOCKET_BAD || server->is_broken) - continue; - - if(read_fds) { - if(!FD_ISSET(server->tcp_socket, read_fds)) - continue; - } - else { - if(server->tcp_socket != read_fd) - continue; - } - - if(read_fds) - /* If there's an error and we close this socket, then open another - * with the same fd to talk to another server, then we don't want to - * think that it was the new socket that was ready. This is not - * disastrous, but is likely to result in extra system calls and - * confusion. */ - FD_CLR(server->tcp_socket, read_fds); - - if (server->tcp_lenbuf_pos != 2) - { - /* We haven't yet read a length word, so read that (or - * what's left to read of it). - */ - count = socket_recv(channel, server->tcp_socket, - server->tcp_lenbuf + server->tcp_lenbuf_pos, - 2 - server->tcp_lenbuf_pos); - if (count <= 0) - { - if (!(count == -1 && try_again(SOCKERRNO))) - handle_error(channel, i, now); - continue; - } - - server->tcp_lenbuf_pos += (int)count; - if (server->tcp_lenbuf_pos == 2) - { - /* We finished reading the length word. Decode the - * length and allocate a buffer for the data. - */ - server->tcp_length = server->tcp_lenbuf[0] << 8 - | server->tcp_lenbuf[1]; - server->tcp_buffer = ares_malloc(server->tcp_length); - if (!server->tcp_buffer) { - handle_error(channel, i, now); - return; /* bail out on malloc failure. TODO: make this - function return error codes */ - } - server->tcp_buffer_pos = 0; - } - } - else - { - /* Read data into the allocated buffer. */ - count = socket_recv(channel, server->tcp_socket, - server->tcp_buffer + server->tcp_buffer_pos, - server->tcp_length - server->tcp_buffer_pos); - if (count <= 0) - { - if (!(count == -1 && try_again(SOCKERRNO))) - handle_error(channel, i, now); - continue; - } - - server->tcp_buffer_pos += (int)count; - if (server->tcp_buffer_pos == server->tcp_length) - { - /* We finished reading this answer; process it and - * prepare to read another length word. - */ - process_answer(channel, server->tcp_buffer, server->tcp_length, - i, 1, now); - ares_free(server->tcp_buffer); - server->tcp_buffer = NULL; - server->tcp_lenbuf_pos = 0; - server->tcp_buffer_pos = 0; - } - } - } -} - -/* If any UDP sockets select true for reading, process them. */ -static void read_udp_packets(ares_channel channel, fd_set *read_fds, - ares_socket_t read_fd, struct timeval *now) -{ - struct server_state *server; - int i; - ares_ssize_t read_len; - unsigned char buf[MAXENDSSZ + 1]; -#ifdef HAVE_RECVFROM - ares_socklen_t fromlen; - union { - struct sockaddr sa; - struct sockaddr_in sa4; - struct sockaddr_in6 sa6; - } from; -#endif - - if(!read_fds && (read_fd == ARES_SOCKET_BAD)) - /* no possible action */ - return; - - for (i = 0; i < channel->nservers; i++) - { - /* Make sure the server has a socket and is selected in read_fds. */ - server = &channel->servers[i]; - - if (server->udp_socket == ARES_SOCKET_BAD || server->is_broken) - continue; - - if(read_fds) { - if(!FD_ISSET(server->udp_socket, read_fds)) - continue; - } - else { - if(server->udp_socket != read_fd) - continue; - } - - if(read_fds) - /* If there's an error and we close this socket, then open - * another with the same fd to talk to another server, then we - * don't want to think that it was the new socket that was - * ready. This is not disastrous, but is likely to result in - * extra system calls and confusion. */ - FD_CLR(server->udp_socket, read_fds); - - /* To reduce event loop overhead, read and process as many - * packets as we can. */ - do { - if (server->udp_socket == ARES_SOCKET_BAD) { - read_len = -1; - } else { - if (server->addr.family == AF_INET) { - fromlen = sizeof(from.sa4); - } else { - fromlen = sizeof(from.sa6); - } - read_len = socket_recvfrom(channel, server->udp_socket, (void *)buf, - sizeof(buf), 0, &from.sa, &fromlen); - } - - if (read_len == 0) { - /* UDP is connectionless, so result code of 0 is a 0-length UDP - * packet, and not an indication the connection is closed like on - * tcp */ - continue; - } else if (read_len < 0) { - if (try_again(SOCKERRNO)) - continue; - - handle_error(channel, i, now); - -#ifdef HAVE_RECVFROM - } else if (!same_address(&from.sa, &server->addr)) { - /* The address the response comes from does not match the address we - * sent the request to. Someone may be attempting to perform a cache - * poisoning attack. */ - continue; -#endif - - } else { - process_answer(channel, buf, (int)read_len, i, 0, now); - } - } while (read_len >= 0); - } -} - -/* If any queries have timed out, note the timeout and move them on. */ -static void process_timeouts(ares_channel channel, struct timeval *now) -{ - time_t t; /* the time of the timeouts we're processing */ - struct query *query; - struct list_node* list_head; - struct list_node* list_node; - - /* Process all the timeouts that have fired since the last time we processed - * timeouts. If things are going well, then we'll have hundreds/thousands of - * queries that fall into future buckets, and only a handful of requests - * that fall into the "now" bucket, so this should be quite quick. - */ - for (t = channel->last_timeout_processed; t <= now->tv_sec; t++) - { - list_head = &(channel->queries_by_timeout[t % ARES_TIMEOUT_TABLE_SIZE]); - for (list_node = list_head->next; list_node != list_head; ) - { - query = list_node->data; - list_node = list_node->next; /* in case the query gets deleted */ - if (query->timeout.tv_sec && ares__timedout(now, &query->timeout)) - { - query->error_status = ARES_ETIMEOUT; - ++query->timeouts; - next_server(channel, query, now); - } - } - } - channel->last_timeout_processed = now->tv_sec; -} - -/* Handle an answer from a server. */ -static void process_answer(ares_channel channel, unsigned char *abuf, - int alen, int whichserver, int tcp, - struct timeval *now) -{ - int tc, rcode, packetsz; - unsigned short id; - struct query *query; - struct list_node* list_head; - struct list_node* list_node; - - /* If there's no room in the answer for a header, we can't do much - * with it. */ - if (alen < HFIXEDSZ) - return; - - /* Grab the query ID, truncate bit, and response code from the packet. */ - id = DNS_HEADER_QID(abuf); - tc = DNS_HEADER_TC(abuf); - rcode = DNS_HEADER_RCODE(abuf); - - /* Find the query corresponding to this packet. The queries are - * hashed/bucketed by query id, so this lookup should be quick. Note that - * both the query id and the questions must be the same; when the query id - * wraps around we can have multiple outstanding queries with the same query - * id, so we need to check both the id and question. - */ - query = NULL; - list_head = &(channel->queries_by_qid[id % ARES_QID_TABLE_SIZE]); - for (list_node = list_head->next; list_node != list_head; - list_node = list_node->next) - { - struct query *q = list_node->data; - if ((q->qid == id) && same_questions(q->qbuf, q->qlen, abuf, alen)) - { - query = q; - break; - } - } - if (!query) - return; - - packetsz = PACKETSZ; - /* If we use EDNS and server answers with FORMERR without an OPT RR, the protocol - * extension is not understood by the responder. We must retry the query - * without EDNS enabled. */ - if (channel->flags & ARES_FLAG_EDNS) - { - packetsz = channel->ednspsz; - if (rcode == FORMERR && has_opt_rr(abuf, alen) != 1) - { - int qlen = (query->tcplen - 2) - EDNSFIXEDSZ; - channel->flags ^= ARES_FLAG_EDNS; - query->tcplen -= EDNSFIXEDSZ; - query->qlen -= EDNSFIXEDSZ; - query->tcpbuf[0] = (unsigned char)((qlen >> 8) & 0xff); - query->tcpbuf[1] = (unsigned char)(qlen & 0xff); - DNS_HEADER_SET_ARCOUNT(query->tcpbuf + 2, 0); - query->tcpbuf = ares_realloc(query->tcpbuf, query->tcplen); - query->qbuf = query->tcpbuf + 2; - ares__send_query(channel, query, now); - return; - } - } - - /* If we got a truncated UDP packet and are not ignoring truncation, - * don't accept the packet, and switch the query to TCP if we hadn't - * done so already. - */ - if ((tc || alen > packetsz) && !tcp && !(channel->flags & ARES_FLAG_IGNTC)) - { - if (!query->using_tcp) - { - query->using_tcp = 1; - ares__send_query(channel, query, now); - } - return; - } - - /* Limit alen to PACKETSZ if we aren't using TCP (only relevant if we - * are ignoring truncation. - */ - if (alen > packetsz && !tcp) - alen = packetsz; - - /* If we aren't passing through all error packets, discard packets - * with SERVFAIL, NOTIMP, or REFUSED response codes. - */ - if (!(channel->flags & ARES_FLAG_NOCHECKRESP)) - { - if (rcode == SERVFAIL || rcode == NOTIMP || rcode == REFUSED) - { - skip_server(channel, query, whichserver); - if (query->server == whichserver) - next_server(channel, query, now); - return; - } - } - - end_query(channel, query, ARES_SUCCESS, abuf, alen); -} - -/* Close all the connections that are no longer usable. */ -static void process_broken_connections(ares_channel channel, - struct timeval *now) -{ - int i; - for (i = 0; i < channel->nservers; i++) - { - struct server_state *server = &channel->servers[i]; - if (server->is_broken) - { - handle_error(channel, i, now); - } - } -} - -/* Swap the contents of two lists */ -static void swap_lists(struct list_node* head_a, - struct list_node* head_b) -{ - int is_a_empty = ares__is_list_empty(head_a); - int is_b_empty = ares__is_list_empty(head_b); - struct list_node old_a = *head_a; - struct list_node old_b = *head_b; - - if (is_a_empty) { - ares__init_list_head(head_b); - } else { - *head_b = old_a; - old_a.next->prev = head_b; - old_a.prev->next = head_b; - } - if (is_b_empty) { - ares__init_list_head(head_a); - } else { - *head_a = old_b; - old_b.next->prev = head_a; - old_b.prev->next = head_a; - } -} - -static void handle_error(ares_channel channel, int whichserver, - struct timeval *now) -{ - struct server_state *server; - struct query *query; - struct list_node list_head; - struct list_node* list_node; - - server = &channel->servers[whichserver]; - - /* Reset communications with this server. */ - ares__close_sockets(channel, server); - - /* Tell all queries talking to this server to move on and not try this - * server again. We steal the current list of queries that were in-flight to - * this server, since when we call next_server this can cause the queries to - * be re-sent to this server, which will re-insert these queries in that - * same server->queries_to_server list. - */ - ares__init_list_head(&list_head); - swap_lists(&list_head, &(server->queries_to_server)); - for (list_node = list_head.next; list_node != &list_head; ) - { - query = list_node->data; - list_node = list_node->next; /* in case the query gets deleted */ - assert(query->server == whichserver); - skip_server(channel, query, whichserver); - next_server(channel, query, now); - } - /* Each query should have removed itself from our temporary list as - * it re-sent itself or finished up... - */ - assert(ares__is_list_empty(&list_head)); -} - -static void skip_server(ares_channel channel, struct query *query, - int whichserver) -{ - /* The given server gave us problems with this query, so if we have the - * luxury of using other servers, then let's skip the potentially broken - * server and just use the others. If we only have one server and we need to - * retry then we should just go ahead and re-use that server, since it's our - * only hope; perhaps we just got unlucky, and retrying will work (eg, the - * server timed out our TCP connection just as we were sending another - * request). - */ - if (channel->nservers > 1) - { - query->server_info[whichserver].skip_server = 1; - } -} - -static void next_server(ares_channel channel, struct query *query, - struct timeval *now) -{ - /* We need to try each server channel->tries times. We have channel->nservers - * servers to try. In total, we need to do channel->nservers * channel->tries - * attempts. Use query->try to remember how many times we already attempted - * this query. Use modular arithmetic to find the next server to try. */ - while (++(query->try_count) < (channel->nservers * channel->tries)) - { - struct server_state *server; - - /* Move on to the next server. */ - query->server = (query->server + 1) % channel->nservers; - server = &channel->servers[query->server]; - - /* We don't want to use this server if (1) we decided this connection is - * broken, and thus about to be closed, (2) we've decided to skip this - * server because of earlier errors we encountered, or (3) we already - * sent this query over this exact connection. - */ - if (!server->is_broken && - !query->server_info[query->server].skip_server && - !(query->using_tcp && - (query->server_info[query->server].tcp_connection_generation == - server->tcp_connection_generation))) - { - ares__send_query(channel, query, now); - return; - } - - /* You might think that with TCP we only need one try. However, even - * when using TCP, servers can time-out our connection just as we're - * sending a request, or close our connection because they die, or never - * send us a reply because they get wedged or tickle a bug that drops - * our request. - */ - } - - /* If we are here, all attempts to perform query failed. */ - end_query(channel, query, query->error_status, NULL, 0); -} - -void ares__send_query(ares_channel channel, struct query *query, - struct timeval *now) -{ - struct send_request *sendreq; - struct server_state *server; - int timeplus; - - server = &channel->servers[query->server]; - if (query->using_tcp) - { - /* Make sure the TCP socket for this server is set up and queue - * a send request. - */ - if (server->tcp_socket == ARES_SOCKET_BAD) - { - if (open_tcp_socket(channel, server) == -1) - { - skip_server(channel, query, query->server); - next_server(channel, query, now); - return; - } - } - sendreq = ares_malloc(sizeof(struct send_request)); - if (!sendreq) - { - end_query(channel, query, ARES_ENOMEM, NULL, 0); - return; - } - memset(sendreq, 0, sizeof(struct send_request)); - /* To make the common case fast, we avoid copies by using the query's - * tcpbuf for as long as the query is alive. In the rare case where the - * query ends while it's queued for transmission, then we give the - * sendreq its own copy of the request packet and put it in - * sendreq->data_storage. - */ - sendreq->data_storage = NULL; - sendreq->data = query->tcpbuf; - sendreq->len = query->tcplen; - sendreq->owner_query = query; - sendreq->next = NULL; - if (server->qtail) - server->qtail->next = sendreq; - else - { - SOCK_STATE_CALLBACK(channel, server->tcp_socket, 1, 1); - server->qhead = sendreq; - } - server->qtail = sendreq; - query->server_info[query->server].tcp_connection_generation = - server->tcp_connection_generation; - } - else - { - if (server->udp_socket == ARES_SOCKET_BAD) - { - if (open_udp_socket(channel, server) == -1) - { - skip_server(channel, query, query->server); - next_server(channel, query, now); - return; - } - } - if (socket_write(channel, server->udp_socket, query->qbuf, query->qlen) == -1) - { - /* FIXME: Handle EAGAIN here since it likely can happen. */ - skip_server(channel, query, query->server); - next_server(channel, query, now); - return; - } - } - - /* For each trip through the entire server list, double the channel's - * assigned timeout, avoiding overflow. If channel->timeout is negative, - * leave it as-is, even though that should be impossible here. - */ - timeplus = channel->timeout; - { - /* How many times do we want to double it? Presume sane values here. */ - const int shift = query->try_count / channel->nservers; - - /* Is there enough room to shift timeplus left that many times? - * - * To find out, confirm that all of the bits we'll shift away are zero. - * Stop considering a shift if we get to the point where we could shift - * a 1 into the sign bit (i.e. when shift is within two of the bit - * count). - * - * This has the side benefit of leaving negative numbers unchanged. - */ - if(shift <= (int)(sizeof(int) * CHAR_BIT - 1) - && (timeplus >> (sizeof(int) * CHAR_BIT - 1 - shift)) == 0) - { - timeplus <<= shift; - } - } - - query->timeout = *now; - timeadd(&query->timeout, timeplus); - /* Keep track of queries bucketed by timeout, so we can process - * timeout events quickly. - */ - ares__remove_from_list(&(query->queries_by_timeout)); - ares__insert_in_list( - &(query->queries_by_timeout), - &(channel->queries_by_timeout[query->timeout.tv_sec % - ARES_TIMEOUT_TABLE_SIZE])); - - /* Keep track of queries bucketed by server, so we can process server - * errors quickly. - */ - ares__remove_from_list(&(query->queries_to_server)); - ares__insert_in_list(&(query->queries_to_server), - &(server->queries_to_server)); -} - -/* - * setsocknonblock sets the given socket to either blocking or non-blocking - * mode based on the 'nonblock' boolean argument. This function is highly - * portable. - */ -static int setsocknonblock(ares_socket_t sockfd, /* operate on this */ - int nonblock /* TRUE or FALSE */) -{ -#if defined(USE_BLOCKING_SOCKETS) - - return 0; /* returns success */ - -#elif defined(HAVE_FCNTL_O_NONBLOCK) - - /* most recent unix versions */ - int flags; - flags = fcntl(sockfd, F_GETFL, 0); - if (FALSE != nonblock) - return fcntl(sockfd, F_SETFL, flags | O_NONBLOCK); - else - return fcntl(sockfd, F_SETFL, flags & (~O_NONBLOCK)); /* LCOV_EXCL_LINE */ - -#elif defined(HAVE_IOCTL_FIONBIO) - - /* older unix versions */ - int flags = nonblock ? 1 : 0; - return ioctl(sockfd, FIONBIO, &flags); - -#elif defined(HAVE_IOCTLSOCKET_FIONBIO) - -#ifdef WATT32 - char flags = nonblock ? 1 : 0; -#else - /* Windows */ - unsigned long flags = nonblock ? 1UL : 0UL; -#endif - return ioctlsocket(sockfd, FIONBIO, &flags); - -#elif defined(HAVE_IOCTLSOCKET_CAMEL_FIONBIO) - - /* Amiga */ - long flags = nonblock ? 1L : 0L; - return IoctlSocket(sockfd, FIONBIO, flags); - -#elif defined(HAVE_SETSOCKOPT_SO_NONBLOCK) - - /* BeOS */ - long b = nonblock ? 1L : 0L; - return setsockopt(sockfd, SOL_SOCKET, SO_NONBLOCK, &b, sizeof(b)); - -#else -# error "no non-blocking method was found/used/set" -#endif -} - -#if defined(IPV6_V6ONLY) && defined(WIN32) -/* It makes support for IPv4-mapped IPv6 addresses. - * Linux kernel, NetBSD, FreeBSD and Darwin: default is off; - * Windows Vista and later: default is on; - * DragonFly BSD: acts like off, and dummy setting; - * OpenBSD and earlier Windows: unsupported. - * Linux: controlled by /proc/sys/net/ipv6/bindv6only. - */ -static void set_ipv6_v6only(ares_socket_t sockfd, int on) -{ - (void)setsockopt(sockfd, IPPROTO_IPV6, IPV6_V6ONLY, (void *)&on, sizeof(on)); -} -#else -#define set_ipv6_v6only(s,v) -#endif - -static int configure_socket(ares_socket_t s, int family, ares_channel channel) -{ - union { - struct sockaddr sa; - struct sockaddr_in sa4; - struct sockaddr_in6 sa6; - } local; - - /* do not set options for user-managed sockets */ - if (channel->sock_funcs) - return 0; - - (void)setsocknonblock(s, TRUE); - -#if defined(FD_CLOEXEC) && !defined(MSDOS) - /* Configure the socket fd as close-on-exec. */ - if (fcntl(s, F_SETFD, FD_CLOEXEC) == -1) - return -1; /* LCOV_EXCL_LINE */ -#endif - - /* Set the socket's send and receive buffer sizes. */ - if ((channel->socket_send_buffer_size > 0) && - setsockopt(s, SOL_SOCKET, SO_SNDBUF, - (void *)&channel->socket_send_buffer_size, - sizeof(channel->socket_send_buffer_size)) == -1) - return -1; - - if ((channel->socket_receive_buffer_size > 0) && - setsockopt(s, SOL_SOCKET, SO_RCVBUF, - (void *)&channel->socket_receive_buffer_size, - sizeof(channel->socket_receive_buffer_size)) == -1) - return -1; - -#ifdef SO_BINDTODEVICE - if (channel->local_dev_name[0]) { - if (setsockopt(s, SOL_SOCKET, SO_BINDTODEVICE, - channel->local_dev_name, sizeof(channel->local_dev_name))) { - /* Only root can do this, and usually not fatal if it doesn't work, so */ - /* just continue on. */ - } - } -#endif - - if (family == AF_INET) { - if (channel->local_ip4) { - memset(&local.sa4, 0, sizeof(local.sa4)); - local.sa4.sin_family = AF_INET; - local.sa4.sin_addr.s_addr = htonl(channel->local_ip4); - if (bind(s, &local.sa, sizeof(local.sa4)) < 0) - return -1; - } - } - else if (family == AF_INET6) { - if (memcmp(channel->local_ip6, &ares_in6addr_any, - sizeof(channel->local_ip6)) != 0) { - memset(&local.sa6, 0, sizeof(local.sa6)); - local.sa6.sin6_family = AF_INET6; - memcpy(&local.sa6.sin6_addr, channel->local_ip6, - sizeof(channel->local_ip6)); - if (bind(s, &local.sa, sizeof(local.sa6)) < 0) - return -1; - } - set_ipv6_v6only(s, 0); - } - - return 0; -} - -static int open_tcp_socket(ares_channel channel, struct server_state *server) -{ - ares_socket_t s; - int opt; - ares_socklen_t salen; - union { - struct sockaddr_in sa4; - struct sockaddr_in6 sa6; - } saddr; - struct sockaddr *sa; - - switch (server->addr.family) - { - case AF_INET: - sa = (void *)&saddr.sa4; - salen = sizeof(saddr.sa4); - memset(sa, 0, salen); - saddr.sa4.sin_family = AF_INET; - if (server->addr.tcp_port) { - saddr.sa4.sin_port = aresx_sitous(server->addr.tcp_port); - } else { - saddr.sa4.sin_port = aresx_sitous(channel->tcp_port); - } - memcpy(&saddr.sa4.sin_addr, &server->addr.addrV4, - sizeof(server->addr.addrV4)); - break; - case AF_INET6: - sa = (void *)&saddr.sa6; - salen = sizeof(saddr.sa6); - memset(sa, 0, salen); - saddr.sa6.sin6_family = AF_INET6; - if (server->addr.tcp_port) { - saddr.sa6.sin6_port = aresx_sitous(server->addr.tcp_port); - } else { - saddr.sa6.sin6_port = aresx_sitous(channel->tcp_port); - } - memcpy(&saddr.sa6.sin6_addr, &server->addr.addrV6, - sizeof(server->addr.addrV6)); - break; - default: - return -1; /* LCOV_EXCL_LINE */ - } - - /* Acquire a socket. */ - s = ares__open_socket(channel, server->addr.family, SOCK_STREAM, 0); - if (s == ARES_SOCKET_BAD) - return -1; - - /* Configure it. */ - if (configure_socket(s, server->addr.family, channel) < 0) - { - ares__close_socket(channel, s); - return -1; - } - -#ifdef TCP_NODELAY - /* - * Disable the Nagle algorithm (only relevant for TCP sockets, and thus not - * in configure_socket). In general, in DNS lookups we're pretty much - * interested in firing off a single request and then waiting for a reply, - * so batching isn't very interesting. - */ - opt = 1; - if (channel->sock_funcs == 0 - && - setsockopt(s, IPPROTO_TCP, TCP_NODELAY, - (void *)&opt, sizeof(opt)) == -1) - { - ares__close_socket(channel, s); - return -1; - } -#endif - - if (channel->sock_config_cb) - { - int err = channel->sock_config_cb(s, SOCK_STREAM, - channel->sock_config_cb_data); - if (err < 0) - { - ares__close_socket(channel, s); - return err; - } - } - - /* Connect to the server. */ - if (ares__connect_socket(channel, s, sa, salen) == -1) - { - int err = SOCKERRNO; - - if (err != EINPROGRESS && err != EWOULDBLOCK) - { - ares__close_socket(channel, s); - return -1; - } - } - - if (channel->sock_create_cb) - { - int err = channel->sock_create_cb(s, SOCK_STREAM, - channel->sock_create_cb_data); - if (err < 0) - { - ares__close_socket(channel, s); - return err; - } - } - - SOCK_STATE_CALLBACK(channel, s, 1, 0); - server->tcp_buffer_pos = 0; - server->tcp_socket = s; - server->tcp_connection_generation = ++channel->tcp_connection_generation; - return 0; -} - -static int open_udp_socket(ares_channel channel, struct server_state *server) -{ - ares_socket_t s; - ares_socklen_t salen; - union { - struct sockaddr_in sa4; - struct sockaddr_in6 sa6; - } saddr; - struct sockaddr *sa; - - switch (server->addr.family) - { - case AF_INET: - sa = (void *)&saddr.sa4; - salen = sizeof(saddr.sa4); - memset(sa, 0, salen); - saddr.sa4.sin_family = AF_INET; - if (server->addr.udp_port) { - saddr.sa4.sin_port = aresx_sitous(server->addr.udp_port); - } else { - saddr.sa4.sin_port = aresx_sitous(channel->udp_port); - } - memcpy(&saddr.sa4.sin_addr, &server->addr.addrV4, - sizeof(server->addr.addrV4)); - break; - case AF_INET6: - sa = (void *)&saddr.sa6; - salen = sizeof(saddr.sa6); - memset(sa, 0, salen); - saddr.sa6.sin6_family = AF_INET6; - if (server->addr.udp_port) { - saddr.sa6.sin6_port = aresx_sitous(server->addr.udp_port); - } else { - saddr.sa6.sin6_port = aresx_sitous(channel->udp_port); - } - memcpy(&saddr.sa6.sin6_addr, &server->addr.addrV6, - sizeof(server->addr.addrV6)); - break; - default: - return -1; /* LCOV_EXCL_LINE */ - } - - /* Acquire a socket. */ - s = ares__open_socket(channel, server->addr.family, SOCK_DGRAM, 0); - if (s == ARES_SOCKET_BAD) - return -1; - - /* Set the socket non-blocking. */ - if (configure_socket(s, server->addr.family, channel) < 0) - { - ares__close_socket(channel, s); - return -1; - } - - if (channel->sock_config_cb) - { - int err = channel->sock_config_cb(s, SOCK_DGRAM, - channel->sock_config_cb_data); - if (err < 0) - { - ares__close_socket(channel, s); - return err; - } - } - - /* Connect to the server. */ - if (ares__connect_socket(channel, s, sa, salen) == -1) - { - int err = SOCKERRNO; - - if (err != EINPROGRESS && err != EWOULDBLOCK) - { - ares__close_socket(channel, s); - return -1; - } - } - - if (channel->sock_create_cb) - { - int err = channel->sock_create_cb(s, SOCK_DGRAM, - channel->sock_create_cb_data); - if (err < 0) - { - ares__close_socket(channel, s); - return err; - } - } - - SOCK_STATE_CALLBACK(channel, s, 1, 0); - - server->udp_socket = s; - return 0; -} - -static int same_questions(const unsigned char *qbuf, int qlen, - const unsigned char *abuf, int alen) -{ - struct { - const unsigned char *p; - int qdcount; - char *name; - long namelen; - int type; - int dnsclass; - } q, a; - int i, j; - - if (qlen < HFIXEDSZ || alen < HFIXEDSZ) - return 0; - - /* Extract qdcount from the request and reply buffers and compare them. */ - q.qdcount = DNS_HEADER_QDCOUNT(qbuf); - a.qdcount = DNS_HEADER_QDCOUNT(abuf); - if (q.qdcount != a.qdcount) - return 0; - - /* For each question in qbuf, find it in abuf. */ - q.p = qbuf + HFIXEDSZ; - for (i = 0; i < q.qdcount; i++) - { - /* Decode the question in the query. */ - if (ares_expand_name(q.p, qbuf, qlen, &q.name, &q.namelen) - != ARES_SUCCESS) - return 0; - q.p += q.namelen; - if (q.p + QFIXEDSZ > qbuf + qlen) - { - ares_free(q.name); - return 0; - } - q.type = DNS_QUESTION_TYPE(q.p); - q.dnsclass = DNS_QUESTION_CLASS(q.p); - q.p += QFIXEDSZ; - - /* Search for this question in the answer. */ - a.p = abuf + HFIXEDSZ; - for (j = 0; j < a.qdcount; j++) - { - /* Decode the question in the answer. */ - if (ares_expand_name(a.p, abuf, alen, &a.name, &a.namelen) - != ARES_SUCCESS) - { - ares_free(q.name); - return 0; - } - a.p += a.namelen; - if (a.p + QFIXEDSZ > abuf + alen) - { - ares_free(q.name); - ares_free(a.name); - return 0; - } - a.type = DNS_QUESTION_TYPE(a.p); - a.dnsclass = DNS_QUESTION_CLASS(a.p); - a.p += QFIXEDSZ; - - /* Compare the decoded questions. */ - if (strcasecmp(q.name, a.name) == 0 && q.type == a.type - && q.dnsclass == a.dnsclass) - { - ares_free(a.name); - break; - } - ares_free(a.name); - } - - ares_free(q.name); - if (j == a.qdcount) - return 0; - } - return 1; -} - -static int same_address(struct sockaddr *sa, struct ares_addr *aa) -{ - void *addr1; - void *addr2; - - if (sa->sa_family == aa->family) - { - switch (aa->family) - { - case AF_INET: - addr1 = &aa->addrV4; - addr2 = &(CARES_INADDR_CAST(struct sockaddr_in *, sa))->sin_addr; - if (memcmp(addr1, addr2, sizeof(aa->addrV4)) == 0) - return 1; /* match */ - break; - case AF_INET6: - addr1 = &aa->addrV6; - addr2 = &(CARES_INADDR_CAST(struct sockaddr_in6 *, sa))->sin6_addr; - if (memcmp(addr1, addr2, sizeof(aa->addrV6)) == 0) - return 1; /* match */ - break; - default: - break; /* LCOV_EXCL_LINE */ - } - } - return 0; /* different */ -} - -/* search for an OPT RR in the response */ -static int has_opt_rr(const unsigned char *abuf, int alen) -{ - unsigned int qdcount, ancount, nscount, arcount, i; - const unsigned char *aptr; - int status; - - if (alen < HFIXEDSZ) - return -1; - - /* Parse the answer header. */ - qdcount = DNS_HEADER_QDCOUNT(abuf); - ancount = DNS_HEADER_ANCOUNT(abuf); - nscount = DNS_HEADER_NSCOUNT(abuf); - arcount = DNS_HEADER_ARCOUNT(abuf); - - aptr = abuf + HFIXEDSZ; - - /* skip the questions */ - for (i = 0; i < qdcount; i++) - { - char* name; - long len; - status = ares_expand_name(aptr, abuf, alen, &name, &len); - if (status != ARES_SUCCESS) - return -1; - ares_free_string(name); - if (aptr + len + QFIXEDSZ > abuf + alen) - return -1; - aptr += len + QFIXEDSZ; - } - - /* skip the ancount and nscount */ - for (i = 0; i < ancount + nscount; i++) - { - char* name; - long len; - int dlen; - status = ares_expand_name(aptr, abuf, alen, &name, &len); - if (status != ARES_SUCCESS) - return -1; - ares_free_string(name); - if (aptr + len + RRFIXEDSZ > abuf + alen) - return -1; - aptr += len; - dlen = DNS_RR_LEN(aptr); - aptr += RRFIXEDSZ; - if (aptr + dlen > abuf + alen) - return -1; - aptr += dlen; - } - - /* search for rr type (41) - opt */ - for (i = 0; i < arcount; i++) - { - char* name; - long len; - int dlen; - status = ares_expand_name(aptr, abuf, alen, &name, &len); - if (status != ARES_SUCCESS) - return -1; - ares_free_string(name); - if (aptr + len + RRFIXEDSZ > abuf + alen) - return -1; - aptr += len; - - if (DNS_RR_TYPE(aptr) == T_OPT) - return 1; - - dlen = DNS_RR_LEN(aptr); - aptr += RRFIXEDSZ; - if (aptr + dlen > abuf + alen) - return -1; - aptr += dlen; - } - - return 0; -} - -static void end_query (ares_channel channel, struct query *query, int status, - unsigned char *abuf, int alen) -{ - int i; - - /* First we check to see if this query ended while one of our send - * queues still has pointers to it. - */ - for (i = 0; i < channel->nservers; i++) - { - struct server_state *server = &channel->servers[i]; - struct send_request *sendreq; - for (sendreq = server->qhead; sendreq; sendreq = sendreq->next) - if (sendreq->owner_query == query) - { - sendreq->owner_query = NULL; - assert(sendreq->data_storage == NULL); - if (status == ARES_SUCCESS) - { - /* We got a reply for this query, but this queued sendreq - * points into this soon-to-be-gone query's tcpbuf. Probably - * this means we timed out and queued the query for - * retransmission, then received a response before actually - * retransmitting. This is perfectly fine, so we want to keep - * the connection running smoothly if we can. But in the worst - * case we may have sent only some prefix of the query, with - * some suffix of the query left to send. Also, the buffer may - * be queued on multiple queues. To prevent dangling pointers - * to the query's tcpbuf and handle these cases, we just give - * such sendreqs their own copy of the query packet. - */ - sendreq->data_storage = ares_malloc(sendreq->len); - if (sendreq->data_storage != NULL) - { - memcpy(sendreq->data_storage, sendreq->data, sendreq->len); - sendreq->data = sendreq->data_storage; - } - } - if ((status != ARES_SUCCESS) || (sendreq->data_storage == NULL)) - { - /* We encountered an error (probably a timeout, suggesting the - * DNS server we're talking to is probably unreachable, - * wedged, or severely overloaded) or we couldn't copy the - * request, so mark the connection as broken. When we get to - * process_broken_connections() we'll close the connection and - * try to re-send requests to another server. - */ - server->is_broken = 1; - /* Just to be paranoid, zero out this sendreq... */ - sendreq->data = NULL; - sendreq->len = 0; - } - } - } - - /* Invoke the callback */ - query->callback(query->arg, status, query->timeouts, abuf, alen); - ares__free_query(query); - - /* Simple cleanup policy: if no queries are remaining, close all network - * sockets unless STAYOPEN is set. - */ - if (!(channel->flags & ARES_FLAG_STAYOPEN) && - ares__is_list_empty(&(channel->all_queries))) - { - for (i = 0; i < channel->nservers; i++) - ares__close_sockets(channel, &channel->servers[i]); - } -} - -void ares__free_query(struct query *query) -{ - /* Remove the query from all the lists in which it is linked */ - ares__remove_from_list(&(query->queries_by_qid)); - ares__remove_from_list(&(query->queries_by_timeout)); - ares__remove_from_list(&(query->queries_to_server)); - ares__remove_from_list(&(query->all_queries)); - /* Zero out some important stuff, to help catch bugs */ - query->callback = NULL; - query->arg = NULL; - /* Deallocate the memory associated with the query */ - ares_free(query->tcpbuf); - ares_free(query->server_info); - ares_free(query); -} - -ares_socket_t ares__open_socket(ares_channel channel, - int af, int type, int protocol) -{ - if (channel->sock_funcs) - return channel->sock_funcs->asocket(af, - type, - protocol, - channel->sock_func_cb_data); - else - return socket(af, type, protocol); -} - -int ares__connect_socket(ares_channel channel, - ares_socket_t sockfd, - const struct sockaddr *addr, - ares_socklen_t addrlen) -{ - if (channel->sock_funcs) - return channel->sock_funcs->aconnect(sockfd, - addr, - addrlen, - channel->sock_func_cb_data); - else - return connect(sockfd, addr, addrlen); -} - -void ares__close_socket(ares_channel channel, ares_socket_t s) -{ - if (channel->sock_funcs) - channel->sock_funcs->aclose(s, channel->sock_func_cb_data); - else - sclose(s); -} diff --git a/lib/c-ares-1.19.1/src/lib/ares_query.c b/lib/c-ares-1.19.1/src/lib/ares_query.c deleted file mode 100644 index 42323bec553..00000000000 --- a/lib/c-ares-1.19.1/src/lib/ares_query.c +++ /dev/null @@ -1,146 +0,0 @@ - -/* Copyright 1998 by the Massachusetts Institute of Technology. - * - * 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. - */ - -#include "ares_setup.h" - -#ifdef HAVE_NETINET_IN_H -# include -#endif - -#include "ares_nameser.h" - -#include "ares.h" -#include "ares_dns.h" -#include "ares_private.h" - -struct qquery { - ares_callback callback; - void *arg; -}; - -static void qcallback(void *arg, int status, int timeouts, unsigned char *abuf, int alen); - -static struct query* find_query_by_id(ares_channel channel, unsigned short id) -{ - unsigned short qid; - struct list_node* list_head; - struct list_node* list_node; - DNS_HEADER_SET_QID(((unsigned char*)&qid), id); - - /* Find the query corresponding to this packet. */ - list_head = &(channel->queries_by_qid[qid % ARES_QID_TABLE_SIZE]); - for (list_node = list_head->next; list_node != list_head; - list_node = list_node->next) - { - struct query *q = list_node->data; - if (q->qid == qid) - return q; - } - return NULL; -} - -/* a unique query id is generated using an rc4 key. Since the id may already - be used by a running query (as infrequent as it may be), a lookup is - performed per id generation. In practice this search should happen only - once per newly generated id -*/ -static unsigned short generate_unique_id(ares_channel channel) -{ - unsigned short id; - - do { - id = ares__generate_new_id(channel->rand_state); - } while (find_query_by_id(channel, id)); - - return (unsigned short)id; -} - -void ares_query(ares_channel channel, const char *name, int dnsclass, - int type, ares_callback callback, void *arg) -{ - struct qquery *qquery; - unsigned char *qbuf; - int qlen, rd, status; - - /* Compose the query. */ - rd = !(channel->flags & ARES_FLAG_NORECURSE); - status = ares_create_query(name, dnsclass, type, channel->next_id, rd, &qbuf, - &qlen, (channel->flags & ARES_FLAG_EDNS) ? channel->ednspsz : 0); - if (status != ARES_SUCCESS) - { - if (qbuf != NULL) ares_free(qbuf); - callback(arg, status, 0, NULL, 0); - return; - } - - channel->next_id = generate_unique_id(channel); - - /* Allocate and fill in the query structure. */ - qquery = ares_malloc(sizeof(struct qquery)); - if (!qquery) - { - ares_free_string(qbuf); - callback(arg, ARES_ENOMEM, 0, NULL, 0); - return; - } - qquery->callback = callback; - qquery->arg = arg; - - /* Send it off. qcallback will be called when we get an answer. */ - ares_send(channel, qbuf, qlen, qcallback, qquery); - ares_free_string(qbuf); -} - -static void qcallback(void *arg, int status, int timeouts, unsigned char *abuf, int alen) -{ - struct qquery *qquery = (struct qquery *) arg; - unsigned int ancount; - int rcode; - - if (status != ARES_SUCCESS) - qquery->callback(qquery->arg, status, timeouts, abuf, alen); - else - { - /* Pull the response code and answer count from the packet. */ - rcode = DNS_HEADER_RCODE(abuf); - ancount = DNS_HEADER_ANCOUNT(abuf); - - /* Convert errors. */ - switch (rcode) - { - case NOERROR: - status = (ancount > 0) ? ARES_SUCCESS : ARES_ENODATA; - break; - case FORMERR: - status = ARES_EFORMERR; - break; - case SERVFAIL: - status = ARES_ESERVFAIL; - break; - case NXDOMAIN: - status = ARES_ENOTFOUND; - break; - case NOTIMP: - status = ARES_ENOTIMP; - break; - case REFUSED: - status = ARES_EREFUSED; - break; - } - qquery->callback(qquery->arg, status, timeouts, abuf, alen); - } - ares_free(qquery); -} diff --git a/lib/c-ares-1.19.1/src/lib/ares_rand.c b/lib/c-ares-1.19.1/src/lib/ares_rand.c deleted file mode 100644 index 766c1e6ea9b..00000000000 --- a/lib/c-ares-1.19.1/src/lib/ares_rand.c +++ /dev/null @@ -1,279 +0,0 @@ -/* Copyright 1998 by the Massachusetts Institute of Technology. - * Copyright (C) 2007-2013 by Daniel Stenberg - * - * 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. - */ - -#include "ares_setup.h" -#include "ares.h" -#include "ares_private.h" -#include "ares_nowarn.h" -#include - -typedef enum { - ARES_RAND_OS = 1, /* OS-provided such as RtlGenRandom or arc4random */ - ARES_RAND_FILE = 2, /* OS file-backed random number generator */ - ARES_RAND_RC4 = 3 /* Internal RC4 based PRNG */ -} ares_rand_backend; - -typedef struct ares_rand_rc4 -{ - unsigned char S[256]; - size_t i; - size_t j; -} ares_rand_rc4; - -struct ares_rand_state -{ - ares_rand_backend type; - union { - FILE *rand_file; - ares_rand_rc4 rc4; - } state; -}; - - -/* Define RtlGenRandom = SystemFunction036. This is in advapi32.dll. There is - * no need to dynamically load this, other software used widely does not. - * http://blogs.msdn.com/michael_howard/archive/2005/01/14/353379.aspx - * https://docs.microsoft.com/en-us/windows/win32/api/ntsecapi/nf-ntsecapi-rtlgenrandom - */ -#ifdef _WIN32 -BOOLEAN WINAPI SystemFunction036(PVOID RandomBuffer, ULONG RandomBufferLength); -# ifndef RtlGenRandom -# define RtlGenRandom(a,b) SystemFunction036(a,b) -# endif -#endif - - -#define ARES_RC4_KEY_LEN 32 /* 256 bits */ - -#ifdef _MSC_VER -typedef unsigned __int64 cares_u64; -#else -typedef unsigned long long cares_u64; -#endif - -static unsigned int ares_u32_from_ptr(void *addr) -{ - if (sizeof(void *) == 8) { - return (unsigned int)((((cares_u64)addr >> 32) & 0xFFFFFFFF) | ((cares_u64)addr & 0xFFFFFFFF)); - } - return (unsigned int)((size_t)addr & 0xFFFFFFFF); -} - - -/* initialize an rc4 key as the last possible fallback. */ -static void ares_rc4_generate_key(ares_rand_rc4 *rc4_state, unsigned char *key, size_t key_len) -{ - size_t i; - size_t len = 0; - unsigned int data; - struct timeval tv; - - if (key_len != ARES_RC4_KEY_LEN) - return; - - /* Randomness is hard to come by. Maybe the system randomizes heap and stack addresses. - * Maybe the current timestamp give us some randomness. - * Use rc4_state (heap), &i (stack), and ares__tvnow() - */ - data = ares_u32_from_ptr(rc4_state); - memcpy(key + len, &data, sizeof(data)); - len += sizeof(data); - - data = ares_u32_from_ptr(&i); - memcpy(key + len, &data, sizeof(data)); - len += sizeof(data); - - tv = ares__tvnow(); - data = (unsigned int)((tv.tv_sec | tv.tv_usec) & 0xFFFFFFFF); - memcpy(key + len, &data, sizeof(data)); - len += sizeof(data); - - srand(ares_u32_from_ptr(rc4_state) | ares_u32_from_ptr(&i) | (unsigned int)((tv.tv_sec | tv.tv_usec) & 0xFFFFFFFF)); - - for (i=len; iS); i++) { - rc4_state->S[i] = i & 0xFF; - } - - for(i = 0, j = 0; i < 256; i++) { - j = (j + rc4_state->S[i] + key[i % sizeof(key)]) % 256; - ARES_SWAP_BYTE(&rc4_state->S[i], &rc4_state->S[j]); - } - - rc4_state->i = 0; - rc4_state->j = 0; -} - -/* Just outputs the key schedule, no need to XOR with any data since we have none */ -static void ares_rc4_prng(ares_rand_rc4 *rc4_state, unsigned char *buf, size_t len) -{ - unsigned char *S = rc4_state->S; - size_t i = rc4_state->i; - size_t j = rc4_state->j; - size_t cnt; - - for (cnt=0; cnti = i; - rc4_state->j = j; -} - - -static int ares__init_rand_engine(ares_rand_state *state) -{ - memset(state, 0, sizeof(*state)); - -#if defined(HAVE_ARC4RANDOM_BUF) || defined(_WIN32) - state->type = ARES_RAND_OS; - return 1; -#elif defined(CARES_RANDOM_FILE) - state->type = ARES_RAND_FILE; - state->state.rand_file = fopen(CARES_RANDOM_FILE, "rb"); - if (state->state.rand_file) { - setvbuf(state->state.rand_file, NULL, _IONBF, 0); - return 1; - } - /* Fall-Thru on failure to RC4 */ -#endif - - state->type = ARES_RAND_RC4; - ares_rc4_init(&state->state.rc4); - - /* Currently cannot fail */ - return 1; -} - - -ares_rand_state *ares__init_rand_state() -{ - ares_rand_state *state = NULL; - - state = ares_malloc(sizeof(*state)); - if (!state) - return NULL; - - if (!ares__init_rand_engine(state)) { - ares_free(state); - return NULL; - } - - return state; -} - - -static void ares__clear_rand_state(ares_rand_state *state) -{ - if (!state) - return; - - switch (state->type) { - case ARES_RAND_OS: - break; - case ARES_RAND_FILE: - fclose(state->state.rand_file); - break; - case ARES_RAND_RC4: - break; - } -} - - -static void ares__reinit_rand(ares_rand_state *state) -{ - ares__clear_rand_state(state); - ares__init_rand_engine(state); -} - - -void ares__destroy_rand_state(ares_rand_state *state) -{ - if (!state) - return; - - ares__clear_rand_state(state); - ares_free(state); -} - - -static void ares__rand_bytes(ares_rand_state *state, unsigned char *buf, size_t len) -{ - - while (1) { - size_t bytes_read = 0; - - switch (state->type) { - case ARES_RAND_OS: -#ifdef _WIN32 - RtlGenRandom(buf, len); - return; -#elif defined(HAVE_ARC4RANDOM_BUF) - arc4random_buf(buf, len); - return; -#else - /* Shouldn't be possible to be here */ - break; -#endif - - case ARES_RAND_FILE: - while (1) { - size_t rv = fread(buf + bytes_read, 1, len - bytes_read, state->state.rand_file); - if (rv == 0) - break; /* critical error, will reinit rand state */ - - bytes_read += rv; - if (bytes_read == len) - return; - } - break; - - case ARES_RAND_RC4: - ares_rc4_prng(&state->state.rc4, buf, len); - return; - } - - /* If we didn't return before we got here, that means we had a critical rand - * failure and need to reinitialized */ - ares__reinit_rand(state); - } -} - -unsigned short ares__generate_new_id(ares_rand_state *state) -{ - unsigned short r=0; - - ares__rand_bytes(state, (unsigned char *)&r, sizeof(r)); - return r; -} - diff --git a/lib/c-ares-1.19.1/src/lib/ares_search.c b/lib/c-ares-1.19.1/src/lib/ares_search.c deleted file mode 100644 index c4b0424f5ba..00000000000 --- a/lib/c-ares-1.19.1/src/lib/ares_search.c +++ /dev/null @@ -1,321 +0,0 @@ - -/* Copyright 1998 by the Massachusetts Institute of Technology. - * - * 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. - */ - -#include "ares_setup.h" - -#ifdef HAVE_STRINGS_H -# include -#endif - -#include "ares.h" -#include "ares_private.h" - -struct search_query { - /* Arguments passed to ares_search */ - ares_channel channel; - char *name; /* copied into an allocated buffer */ - int dnsclass; - int type; - ares_callback callback; - void *arg; - - int status_as_is; /* error status from trying as-is */ - int next_domain; /* next search domain to try */ - int trying_as_is; /* current query is for name as-is */ - int timeouts; /* number of timeouts we saw for this request */ - int ever_got_nodata; /* did we ever get ARES_ENODATA along the way? */ -}; - -static void search_callback(void *arg, int status, int timeouts, - unsigned char *abuf, int alen); -static void end_squery(struct search_query *squery, int status, - unsigned char *abuf, int alen); - -void ares_search(ares_channel channel, const char *name, int dnsclass, - int type, ares_callback callback, void *arg) -{ - struct search_query *squery; - char *s; - const char *p; - int status, ndots; - - /* Per RFC 7686, reject queries for ".onion" domain names with NXDOMAIN. */ - if (ares__is_onion_domain(name)) - { - callback(arg, ARES_ENOTFOUND, 0, NULL, 0); - return; - } - - /* If name only yields one domain to search, then we don't have - * to keep extra state, so just do an ares_query(). - */ - status = ares__single_domain(channel, name, &s); - if (status != ARES_SUCCESS) - { - callback(arg, status, 0, NULL, 0); - return; - } - if (s) - { - ares_query(channel, s, dnsclass, type, callback, arg); - ares_free(s); - return; - } - - /* Allocate a search_query structure to hold the state necessary for - * doing multiple lookups. - */ - squery = ares_malloc(sizeof(struct search_query)); - if (!squery) - { - callback(arg, ARES_ENOMEM, 0, NULL, 0); - return; - } - squery->channel = channel; - squery->name = ares_strdup(name); - if (!squery->name) - { - ares_free(squery); - callback(arg, ARES_ENOMEM, 0, NULL, 0); - return; - } - squery->dnsclass = dnsclass; - squery->type = type; - squery->status_as_is = -1; - squery->callback = callback; - squery->arg = arg; - squery->timeouts = 0; - squery->ever_got_nodata = 0; - - /* Count the number of dots in name. */ - ndots = 0; - for (p = name; *p; p++) - { - if (*p == '.') - ndots++; - } - - /* If ndots is at least the channel ndots threshold (usually 1), - * then we try the name as-is first. Otherwise, we try the name - * as-is last. - */ - if (ndots >= channel->ndots) - { - /* Try the name as-is first. */ - squery->next_domain = 0; - squery->trying_as_is = 1; - ares_query(channel, name, dnsclass, type, search_callback, squery); - } - else - { - /* Try the name as-is last; start with the first search domain. */ - squery->next_domain = 1; - squery->trying_as_is = 0; - status = ares__cat_domain(name, channel->domains[0], &s); - if (status == ARES_SUCCESS) - { - ares_query(channel, s, dnsclass, type, search_callback, squery); - ares_free(s); - } - else - { - /* failed, free the malloc()ed memory */ - ares_free(squery->name); - ares_free(squery); - callback(arg, status, 0, NULL, 0); - } - } -} - -static void search_callback(void *arg, int status, int timeouts, - unsigned char *abuf, int alen) -{ - struct search_query *squery = (struct search_query *) arg; - ares_channel channel = squery->channel; - char *s; - - squery->timeouts += timeouts; - - /* Stop searching unless we got a non-fatal error. */ - if (status != ARES_ENODATA && status != ARES_ESERVFAIL - && status != ARES_ENOTFOUND) - end_squery(squery, status, abuf, alen); - else - { - /* Save the status if we were trying as-is. */ - if (squery->trying_as_is) - squery->status_as_is = status; - - /* - * If we ever get ARES_ENODATA along the way, record that; if the search - * should run to the very end and we got at least one ARES_ENODATA, - * then callers like ares_gethostbyname() may want to try a T_A search - * even if the last domain we queried for T_AAAA resource records - * returned ARES_ENOTFOUND. - */ - if (status == ARES_ENODATA) - squery->ever_got_nodata = 1; - - if (squery->next_domain < channel->ndomains) - { - /* Try the next domain. */ - status = ares__cat_domain(squery->name, - channel->domains[squery->next_domain], &s); - if (status != ARES_SUCCESS) - end_squery(squery, status, NULL, 0); - else - { - squery->trying_as_is = 0; - squery->next_domain++; - ares_query(channel, s, squery->dnsclass, squery->type, - search_callback, squery); - ares_free(s); - } - } - else if (squery->status_as_is == -1) - { - /* Try the name as-is at the end. */ - squery->trying_as_is = 1; - ares_query(channel, squery->name, squery->dnsclass, squery->type, - search_callback, squery); - } - else { - if (squery->status_as_is == ARES_ENOTFOUND && squery->ever_got_nodata) { - end_squery(squery, ARES_ENODATA, NULL, 0); - } - else - end_squery(squery, squery->status_as_is, NULL, 0); - } - } -} - -static void end_squery(struct search_query *squery, int status, - unsigned char *abuf, int alen) -{ - squery->callback(squery->arg, status, squery->timeouts, abuf, alen); - ares_free(squery->name); - ares_free(squery); -} - -/* Concatenate two domains. */ -int ares__cat_domain(const char *name, const char *domain, char **s) -{ - size_t nlen = strlen(name); - size_t dlen = strlen(domain); - - *s = ares_malloc(nlen + 1 + dlen + 1); - if (!*s) - return ARES_ENOMEM; - memcpy(*s, name, nlen); - (*s)[nlen] = '.'; - memcpy(*s + nlen + 1, domain, dlen); - (*s)[nlen + 1 + dlen] = 0; - return ARES_SUCCESS; -} - -/* Determine if this name only yields one query. If it does, set *s to - * the string we should query, in an allocated buffer. If not, set *s - * to NULL. - */ -int ares__single_domain(ares_channel channel, const char *name, char **s) -{ - size_t len = strlen(name); - const char *hostaliases; - FILE *fp; - char *line = NULL; - int status; - size_t linesize; - const char *p, *q; - int error; - - /* If the name contains a trailing dot, then the single query is the name - * sans the trailing dot. - */ - if ((len > 0) && (name[len - 1] == '.')) - { - *s = ares_strdup(name); - return (*s) ? ARES_SUCCESS : ARES_ENOMEM; - } - - if (!(channel->flags & ARES_FLAG_NOALIASES) && !strchr(name, '.')) - { - /* The name might be a host alias. */ - hostaliases = getenv("HOSTALIASES"); - if (hostaliases) - { - fp = fopen(hostaliases, "r"); - if (fp) - { - while ((status = ares__read_line(fp, &line, &linesize)) - == ARES_SUCCESS) - { - if (strncasecmp(line, name, len) != 0 || - !ISSPACE(line[len])) - continue; - p = line + len; - while (ISSPACE(*p)) - p++; - if (*p) - { - q = p + 1; - while (*q && !ISSPACE(*q)) - q++; - *s = ares_malloc(q - p + 1); - if (*s) - { - memcpy(*s, p, q - p); - (*s)[q - p] = 0; - } - ares_free(line); - fclose(fp); - return (*s) ? ARES_SUCCESS : ARES_ENOMEM; - } - } - ares_free(line); - fclose(fp); - if (status != ARES_SUCCESS && status != ARES_EOF) - return status; - } - else - { - error = ERRNO; - switch(error) - { - case ENOENT: - case ESRCH: - break; - default: - DEBUGF(fprintf(stderr, "fopen() failed with error: %d %s\n", - error, strerror(error))); - DEBUGF(fprintf(stderr, "Error opening file: %s\n", - hostaliases)); - *s = NULL; - return ARES_EFILE; - } - } - } - } - - if (channel->flags & ARES_FLAG_NOSEARCH || channel->ndomains == 0) - { - /* No domain search to do; just try the name as-is. */ - *s = ares_strdup(name); - return (*s) ? ARES_SUCCESS : ARES_ENOMEM; - } - - *s = NULL; - return ARES_SUCCESS; -} diff --git a/lib/c-ares-1.19.1/src/lib/ares_send.c b/lib/c-ares-1.19.1/src/lib/ares_send.c deleted file mode 100644 index 542cf45f11a..00000000000 --- a/lib/c-ares-1.19.1/src/lib/ares_send.c +++ /dev/null @@ -1,129 +0,0 @@ - -/* Copyright 1998 by the Massachusetts Institute of Technology. - * - * 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. - */ - -#include "ares_setup.h" - -#ifdef HAVE_NETINET_IN_H -# include -#endif - -#include "ares_nameser.h" - -#include "ares.h" -#include "ares_dns.h" -#include "ares_private.h" - -void ares_send(ares_channel channel, const unsigned char *qbuf, int qlen, - ares_callback callback, void *arg) -{ - struct query *query; - int i, packetsz; - struct timeval now; - - /* Verify that the query is at least long enough to hold the header. */ - if (qlen < HFIXEDSZ || qlen >= (1 << 16)) - { - callback(arg, ARES_EBADQUERY, 0, NULL, 0); - return; - } - if (channel->nservers < 1) - { - callback(arg, ARES_ESERVFAIL, 0, NULL, 0); - return; - } - /* Allocate space for query and allocated fields. */ - query = ares_malloc(sizeof(struct query)); - if (!query) - { - callback(arg, ARES_ENOMEM, 0, NULL, 0); - return; - } - query->tcpbuf = ares_malloc(qlen + 2); - if (!query->tcpbuf) - { - ares_free(query); - callback(arg, ARES_ENOMEM, 0, NULL, 0); - return; - } - query->server_info = ares_malloc(channel->nservers * - sizeof(query->server_info[0])); - if (!query->server_info) - { - ares_free(query->tcpbuf); - ares_free(query); - callback(arg, ARES_ENOMEM, 0, NULL, 0); - return; - } - - /* Compute the query ID. Start with no timeout. */ - query->qid = DNS_HEADER_QID(qbuf); - query->timeout.tv_sec = 0; - query->timeout.tv_usec = 0; - - /* Form the TCP query buffer by prepending qlen (as two - * network-order bytes) to qbuf. - */ - query->tcpbuf[0] = (unsigned char)((qlen >> 8) & 0xff); - query->tcpbuf[1] = (unsigned char)(qlen & 0xff); - memcpy(query->tcpbuf + 2, qbuf, qlen); - query->tcplen = qlen + 2; - - /* Fill in query arguments. */ - query->qbuf = query->tcpbuf + 2; - query->qlen = qlen; - query->callback = callback; - query->arg = arg; - - /* Initialize query status. */ - query->try_count = 0; - - /* Choose the server to send the query to. If rotation is enabled, keep track - * of the next server we want to use. */ - query->server = channel->last_server; - if (channel->rotate == 1) - channel->last_server = (channel->last_server + 1) % channel->nservers; - - for (i = 0; i < channel->nservers; i++) - { - query->server_info[i].skip_server = 0; - query->server_info[i].tcp_connection_generation = 0; - } - - packetsz = (channel->flags & ARES_FLAG_EDNS) ? channel->ednspsz : PACKETSZ; - query->using_tcp = (channel->flags & ARES_FLAG_USEVC) || qlen > packetsz; - - query->error_status = ARES_ECONNREFUSED; - query->timeouts = 0; - - /* Initialize our list nodes. */ - ares__init_list_node(&(query->queries_by_qid), query); - ares__init_list_node(&(query->queries_by_timeout), query); - ares__init_list_node(&(query->queries_to_server), query); - ares__init_list_node(&(query->all_queries), query); - - /* Chain the query into the list of all queries. */ - ares__insert_in_list(&(query->all_queries), &(channel->all_queries)); - /* Keep track of queries bucketed by qid, so we can process DNS - * responses quickly. - */ - ares__insert_in_list( - &(query->queries_by_qid), - &(channel->queries_by_qid[query->qid % ARES_QID_TABLE_SIZE])); - - /* Perform the first query action. */ - now = ares__tvnow(); - ares__send_query(channel, query, &now); -} diff --git a/lib/c-ares-1.19.1/src/lib/ares_strcasecmp.c b/lib/c-ares-1.19.1/src/lib/ares_strcasecmp.c deleted file mode 100644 index f9c85e20966..00000000000 --- a/lib/c-ares-1.19.1/src/lib/ares_strcasecmp.c +++ /dev/null @@ -1,66 +0,0 @@ - - -/* Copyright 1998 by the Massachusetts Institute of Technology. - * - * 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. - */ - -#include "ares_setup.h" -#include "ares_strcasecmp.h" - -#ifndef HAVE_STRCASECMP -int ares_strcasecmp(const char *a, const char *b) -{ -#if defined(HAVE_STRCMPI) - return strcmpi(a, b); -#elif defined(HAVE_STRICMP) - return stricmp(a, b); -#else - size_t i; - - for (i = 0; i < (size_t)-1; i++) { - int c1 = ISUPPER(a[i]) ? tolower(a[i]) : a[i]; - int c2 = ISUPPER(b[i]) ? tolower(b[i]) : b[i]; - if (c1 != c2) - return c1-c2; - if (!c1) - break; - } - return 0; -#endif -} -#endif - -#ifndef HAVE_STRNCASECMP -int ares_strncasecmp(const char *a, const char *b, size_t n) -{ -#if defined(HAVE_STRNCMPI) - return strncmpi(a, b, n); -#elif defined(HAVE_STRNICMP) - return strnicmp(a, b, n); -#else - size_t i; - - for (i = 0; i < n; i++) { - int c1 = ISUPPER(a[i]) ? tolower(a[i]) : a[i]; - int c2 = ISUPPER(b[i]) ? tolower(b[i]) : b[i]; - if (c1 != c2) - return c1-c2; - if (!c1) - break; - } - return 0; -#endif -} -#endif - diff --git a/lib/c-ares-1.19.1/src/lib/ares_strcasecmp.h b/lib/c-ares-1.19.1/src/lib/ares_strcasecmp.h deleted file mode 100644 index 57d86f96342..00000000000 --- a/lib/c-ares-1.19.1/src/lib/ares_strcasecmp.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef HEADER_CARES_STRCASECMP_H -#define HEADER_CARES_STRCASECMP_H - - -/* Copyright 1998 by the Massachusetts Institute of Technology. - * - * 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. - */ - -#include "ares_setup.h" - -#ifndef HAVE_STRCASECMP -extern int ares_strcasecmp(const char *a, const char *b); -#endif - -#ifndef HAVE_STRNCASECMP -extern int ares_strncasecmp(const char *a, const char *b, size_t n); -#endif - -#endif /* HEADER_CARES_STRCASECMP_H */ diff --git a/lib/c-ares-1.19.1/src/lib/ares_strdup.c b/lib/c-ares-1.19.1/src/lib/ares_strdup.c deleted file mode 100644 index 39fc8692e75..00000000000 --- a/lib/c-ares-1.19.1/src/lib/ares_strdup.c +++ /dev/null @@ -1,42 +0,0 @@ - - -/* Copyright 1998 by the Massachusetts Institute of Technology. - * - * 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. - */ - -#include "ares_setup.h" -#include "ares_strdup.h" -#include "ares.h" -#include "ares_private.h" - -char *ares_strdup(const char *s1) -{ - size_t sz; - char * s2; - - if(s1) { - sz = strlen(s1); - if(sz < (size_t)-1) { - sz++; - if(sz < ((size_t)-1)) { - s2 = ares_malloc(sz); - if(s2) { - memcpy(s2, s1, sz); - return s2; - } - } - } - } - return (char *)NULL; -} diff --git a/lib/c-ares-1.19.1/src/lib/ares_strdup.h b/lib/c-ares-1.19.1/src/lib/ares_strdup.h deleted file mode 100644 index 67f2a74f5f1..00000000000 --- a/lib/c-ares-1.19.1/src/lib/ares_strdup.h +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef HEADER_CARES_STRDUP_H -#define HEADER_CARES_STRDUP_H - - -/* Copyright 1998 by the Massachusetts Institute of Technology. - * - * 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. - */ - -#include "ares_setup.h" - -extern char *ares_strdup(const char *s1); - -#endif /* HEADER_CARES_STRDUP_H */ diff --git a/lib/c-ares-1.19.1/src/lib/ares_strerror.c b/lib/c-ares-1.19.1/src/lib/ares_strerror.c deleted file mode 100644 index c3ecbd7b43c..00000000000 --- a/lib/c-ares-1.19.1/src/lib/ares_strerror.c +++ /dev/null @@ -1,56 +0,0 @@ - -/* Copyright 1998 by the Massachusetts Institute of Technology. - * - * 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. - */ - -#include "ares_setup.h" -#include -#include "ares.h" - -const char *ares_strerror(int code) -{ - /* Return a string literal from a table. */ - const char *errtext[] = { - "Successful completion", - "DNS server returned answer with no data", - "DNS server claims query was misformatted", - "DNS server returned general failure", - "Domain name not found", - "DNS server does not implement requested operation", - "DNS server refused query", - "Misformatted DNS query", - "Misformatted domain name", - "Unsupported address family", - "Misformatted DNS reply", - "Could not contact DNS servers", - "Timeout while contacting DNS servers", - "End of file", - "Error reading file", - "Out of memory", - "Channel is being destroyed", - "Misformatted string", - "Illegal flags specified", - "Given hostname is not numeric", - "Illegal hints flags specified", - "c-ares library initialization not yet performed", - "Error loading iphlpapi.dll", - "Could not find GetNetworkParams function", - "DNS query cancelled" - }; - - if(code >= 0 && code < (int)(sizeof(errtext) / sizeof(*errtext))) - return errtext[code]; - else - return "unknown"; -} diff --git a/lib/c-ares-1.19.1/src/lib/ares_strsplit.c b/lib/c-ares-1.19.1/src/lib/ares_strsplit.c deleted file mode 100644 index d3e90c4a8f6..00000000000 --- a/lib/c-ares-1.19.1/src/lib/ares_strsplit.c +++ /dev/null @@ -1,94 +0,0 @@ -/* Copyright (C) 2018 by John Schember - * - * 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. - */ - -#if defined(__MVS__) -#include -#endif - -#include "ares_setup.h" -#include "ares.h" -#include "ares_private.h" - -void ares__strsplit_free(char **elms, size_t num_elm) -{ - size_t i; - - if (elms == NULL) - return; - - for (i=0; i - * - * 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. - */ - -#include "ares_setup.h" - -/* Split a string on delms skipping empty or duplicate elements. - * - * param in String to split. - * param delms String of characters to treat as a delimitor. - * Each character in the string is a delimitor so - * there can be multiple delimitors to split on. - * E.g. ", " will split on all comma's and spaces. - * Duplicate entries are removed. - * param num_elm Return parameter of the number of elements - * in the result array. - * - * returns an allocated array of allocated string elements. - * - */ -char **ares__strsplit(const char *in, const char *delms, size_t *num_elm); - -/* Frees the result returned from ares__strsplit(). */ -void ares__strsplit_free(char **elms, size_t num_elm); - - -#endif /* HEADER_CARES_STRSPLIT_H */ - diff --git a/lib/c-ares-1.19.1/src/lib/ares_timeout.c b/lib/c-ares-1.19.1/src/lib/ares_timeout.c deleted file mode 100644 index 293e4af0216..00000000000 --- a/lib/c-ares-1.19.1/src/lib/ares_timeout.c +++ /dev/null @@ -1,88 +0,0 @@ - -/* Copyright 1998 by the Massachusetts Institute of Technology. - * - * 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. - */ - -#include "ares_setup.h" - -#ifdef HAVE_LIMITS_H -#include -#endif - -#include "ares.h" -#include "ares_private.h" - -/* return time offset between now and (future) check, in milliseconds */ -static long timeoffset(struct timeval *now, struct timeval *check) -{ - return (check->tv_sec - now->tv_sec)*1000 + - (check->tv_usec - now->tv_usec)/1000; -} - -/* WARNING: Beware that this is linear in the number of outstanding - * requests! You are probably far better off just calling ares_process() - * once per second, rather than calling ares_timeout() to figure out - * when to next call ares_process(). - */ -struct timeval *ares_timeout(ares_channel channel, struct timeval *maxtv, - struct timeval *tvbuf) -{ - struct query *query; - struct list_node* list_head; - struct list_node* list_node; - struct timeval now; - struct timeval nextstop; - long offset, min_offset; - - /* No queries, no timeout (and no fetch of the current time). */ - if (ares__is_list_empty(&(channel->all_queries))) - return maxtv; - - /* Find the minimum timeout for the current set of queries. */ - now = ares__tvnow(); - min_offset = -1; - - list_head = &(channel->all_queries); - for (list_node = list_head->next; list_node != list_head; - list_node = list_node->next) - { - query = list_node->data; - if (query->timeout.tv_sec == 0) - continue; - offset = timeoffset(&now, &query->timeout); - if (offset < 0) - offset = 0; - if (min_offset == -1 || offset < min_offset) - min_offset = offset; - } - - /* If we found a minimum timeout and it's sooner than the one specified in - * maxtv (if any), return it. Otherwise go with maxtv. - */ - if (min_offset != -1) - { - int ioffset = (min_offset > (long)INT_MAX) ? INT_MAX : (int)min_offset; - - nextstop.tv_sec = ioffset/1000; - nextstop.tv_usec = (ioffset%1000)*1000; - - if (!maxtv || ares__timedout(maxtv, &nextstop)) - { - *tvbuf = nextstop; - return tvbuf; - } - } - - return maxtv; -} diff --git a/lib/c-ares-1.19.1/src/lib/ares_version.c b/lib/c-ares-1.19.1/src/lib/ares_version.c deleted file mode 100644 index 4f8c42f2c9a..00000000000 --- a/lib/c-ares-1.19.1/src/lib/ares_version.c +++ /dev/null @@ -1,11 +0,0 @@ - -#include "ares_setup.h" -#include "ares.h" - -const char *ares_version(int *version) -{ - if(version) - *version = ARES_VERSION; - - return ARES_VERSION_STR; -} diff --git a/lib/c-ares-1.19.1/src/lib/ares_writev.c b/lib/c-ares-1.19.1/src/lib/ares_writev.c deleted file mode 100644 index e812c09e1c5..00000000000 --- a/lib/c-ares-1.19.1/src/lib/ares_writev.c +++ /dev/null @@ -1,79 +0,0 @@ - - -/* Copyright 1998 by the Massachusetts Institute of Technology. - * - * 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. - */ - -#include "ares_setup.h" - -#ifdef HAVE_LIMITS_H -# include -#endif - -#include "ares.h" -#include "ares_private.h" - -#ifndef HAVE_WRITEV -ares_ssize_t ares_writev(ares_socket_t s, const struct iovec *iov, int iovcnt) -{ - char *buffer, *bp; - int i; - size_t bytes = 0; - ares_ssize_t result; - - /* Validate iovcnt */ - if (iovcnt <= 0) - { - SET_ERRNO(EINVAL); - return (-1); - } - - /* Validate and find the sum of the iov_len values in the iov array */ - for (i = 0; i < iovcnt; i++) - { - if (iov[i].iov_len > INT_MAX - bytes) - { - SET_ERRNO(EINVAL); - return (-1); - } - bytes += iov[i].iov_len; - } - - if (bytes == 0) - return (0); - - /* Allocate a temporary buffer to hold the data */ - buffer = ares_malloc(bytes); - if (!buffer) - { - SET_ERRNO(ENOMEM); - return (-1); - } - - /* Copy the data into buffer */ - for (bp = buffer, i = 0; i < iovcnt; ++i) - { - memcpy (bp, iov[i].iov_base, iov[i].iov_len); - bp += iov[i].iov_len; - } - - /* Send buffer contents */ - result = swrite(s, buffer, bytes); - - ares_free(buffer); - - return (result); -} -#endif - diff --git a/lib/c-ares-1.19.1/src/lib/ares_writev.h b/lib/c-ares-1.19.1/src/lib/ares_writev.h deleted file mode 100644 index 65cea8708fc..00000000000 --- a/lib/c-ares-1.19.1/src/lib/ares_writev.h +++ /dev/null @@ -1,36 +0,0 @@ -#ifndef HEADER_CARES_WRITEV_H -#define HEADER_CARES_WRITEV_H - - -/* Copyright 1998 by the Massachusetts Institute of Technology. - * - * 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. - */ - -#include "ares_setup.h" -#include "ares.h" - -#ifndef HAVE_WRITEV - -/* Structure for scatter/gather I/O. */ -struct iovec -{ - void *iov_base; /* Pointer to data. */ - size_t iov_len; /* Length of data. */ -}; - -extern ares_ssize_t ares_writev(ares_socket_t s, const struct iovec *iov, int iovcnt); - -#endif - -#endif /* HEADER_CARES_WRITEV_H */ diff --git a/lib/c-ares-1.19.1/src/lib/bitncmp.h b/lib/c-ares-1.19.1/src/lib/bitncmp.h deleted file mode 100644 index 7b8d66c1662..00000000000 --- a/lib/c-ares-1.19.1/src/lib/bitncmp.h +++ /dev/null @@ -1,26 +0,0 @@ -#ifndef __ARES_BITNCMP_H -#define __ARES_BITNCMP_H - - -/* Copyright (C) 2005, 2013 by Dominick Meglio - * - * 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. - */ - -#ifndef HAVE_BITNCMP -int ares__bitncmp(const void *l, const void *r, int n); -#else -#define ares__bitncmp(x,y,z) bitncmp(x,y,z) -#endif - -#endif /* __ARES_BITNCMP_H */ diff --git a/lib/c-ares-1.19.1/src/lib/config-dos.h b/lib/c-ares-1.19.1/src/lib/config-dos.h deleted file mode 100644 index b241d69a5c6..00000000000 --- a/lib/c-ares-1.19.1/src/lib/config-dos.h +++ /dev/null @@ -1,115 +0,0 @@ -#ifndef HEADER_CONFIG_DOS_H -#define HEADER_CONFIG_DOS_H - - -/* ================================================================ */ -/* ares/config-dos.h - Hand crafted config file for DOS */ -/* ================================================================ */ - -#define PACKAGE "c-ares" - -#define HAVE_ERRNO_H 1 -#define HAVE_GETENV 1 -#define HAVE_GETTIMEOFDAY 1 -#define HAVE_IOCTLSOCKET 1 -#define HAVE_IOCTLSOCKET_FIONBIO 1 -#define HAVE_LIMITS_H 1 -#define HAVE_NET_IF_H 1 -#define HAVE_RECV 1 -#define HAVE_RECVFROM 1 -#define HAVE_SEND 1 -#define HAVE_STRDUP 1 -#define HAVE_STRICMP 1 -#define HAVE_STRUCT_IN6_ADDR 1 -#define HAVE_STRUCT_TIMEVAL 1 -#define HAVE_SYS_IOCTL_H 1 -#define HAVE_SYS_SOCKET_H 1 -#define HAVE_SYS_STAT_H 1 -#define HAVE_SYS_TYPES_H 1 -#define HAVE_TIME_H 1 -#define HAVE_UNISTD_H 1 -#define HAVE_WRITEV 1 - -#define NEED_MALLOC_H 1 - -#define RETSIGTYPE void -#define TIME_WITH_SYS_TIME 1 - -/* Qualifiers for send(), recv(), recvfrom() and getnameinfo(). */ - -#define SEND_TYPE_ARG1 int -#define SEND_QUAL_ARG2 const -#define SEND_TYPE_ARG2 void * -#define SEND_TYPE_ARG3 int -#define SEND_TYPE_ARG4 int -#define SEND_TYPE_RETV int - -#define RECV_TYPE_ARG1 int -#define RECV_TYPE_ARG2 void * -#define RECV_TYPE_ARG3 int -#define RECV_TYPE_ARG4 int -#define RECV_TYPE_RETV int - -#define RECVFROM_TYPE_ARG1 int -#define RECVFROM_TYPE_ARG2 void -#define RECVFROM_TYPE_ARG3 int -#define RECVFROM_TYPE_ARG4 int -#define RECVFROM_TYPE_ARG5 struct sockaddr -#define RECVFROM_TYPE_ARG6 int -#define RECVFROM_TYPE_RETV int -#define RECVFROM_TYPE_ARG2_IS_VOID 1 - -#define BSD - -/* Target HAVE_x section */ - -#if defined(DJGPP) - #undef _SSIZE_T - #include /* For 'ssize_t' */ - - #define HAVE_STRCASECMP 1 - #define HAVE_STRNCASECMP 1 - #define HAVE_SYS_TIME_H 1 - #define HAVE_VARIADIC_MACROS_GCC 1 - - /* Because djgpp <= 2.03 doesn't have snprintf() etc. */ - #if (DJGPP_MINOR < 4) - #define _MPRINTF_REPLACE - #endif - -#elif defined(__WATCOMC__) - #define HAVE_STRCASECMP 1 - -#elif defined(__HIGHC__) - #define HAVE_SYS_TIME_H 1 - #define strerror(e) strerror_s_((e)) -#endif - -#ifdef WATT32 - #define HAVE_AF_INET6 1 - #define HAVE_ARPA_INET_H 1 - #define HAVE_ARPA_NAMESER_H 1 - #define HAVE_CLOSE_S 1 - #define HAVE_GETHOSTNAME 1 - #define HAVE_NETDB_H 1 - #define HAVE_NETINET_IN_H 1 - #define HAVE_NETINET_TCP_H 1 - #define HAVE_PF_INET6 1 - #define HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID 1 - #define HAVE_STRUCT_ADDRINFO 1 - #define HAVE_STRUCT_IN6_ADDR 1 - #define HAVE_STRUCT_SOCKADDR_IN6 1 - #define HAVE_SYS_SOCKET_H 1 - #define HAVE_SYS_UIO_H 1 - #define NS_INADDRSZ 4 - #define HAVE_STRUCT_SOCKADDR_IN6 1 - - #define HAVE_GETSERVBYPORT_R 1 - #define GETSERVBYPORT_R_ARGS 5 -#endif - -#undef word -#undef byte - -#endif /* HEADER_CONFIG_DOS_H */ - diff --git a/lib/c-ares-1.19.1/src/lib/setup_once.h b/lib/c-ares-1.19.1/src/lib/setup_once.h deleted file mode 100644 index a8cfe6beccd..00000000000 --- a/lib/c-ares-1.19.1/src/lib/setup_once.h +++ /dev/null @@ -1,554 +0,0 @@ -#ifndef __SETUP_ONCE_H -#define __SETUP_ONCE_H - - -/* Copyright (C) 2004 - 2013 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. - */ - - -/******************************************************************** - * NOTICE * - * ======== * - * * - * Content of header files lib/setup_once.h and ares/setup_once.h * - * must be kept in sync. Modify the other one if you change this. * - * * - ********************************************************************/ - - -/* - * Inclusion of common header files. - */ - -#include -#include -#include -#include -#include - -#ifdef HAVE_ERRNO_H -#include -#endif - -#ifdef HAVE_SYS_TYPES_H -#include -#endif - -#ifdef NEED_MALLOC_H -#include -#endif - -#ifdef NEED_MEMORY_H -#include -#endif - -#ifdef HAVE_SYS_STAT_H -#include -#endif - -#ifdef HAVE_SYS_TIME_H -#include -#ifdef TIME_WITH_SYS_TIME -#include -#endif -#else -#ifdef HAVE_TIME_H -#include -#endif -#endif - -#ifdef WIN32 -#include -#include -#endif - -#if defined(HAVE_STDBOOL_H) && defined(HAVE_BOOL_T) -#include -#endif - -#ifdef HAVE_UNISTD_H -#include -#endif - -#ifdef __hpux -# if !defined(_XOPEN_SOURCE_EXTENDED) || defined(_KERNEL) -# ifdef _APP32_64BIT_OFF_T -# define OLD_APP32_64BIT_OFF_T _APP32_64BIT_OFF_T -# undef _APP32_64BIT_OFF_T -# else -# undef OLD_APP32_64BIT_OFF_T -# endif -# endif -#endif - -#ifdef HAVE_SYS_SOCKET_H -#include -#endif - -#ifdef __hpux -# if !defined(_XOPEN_SOURCE_EXTENDED) || defined(_KERNEL) -# ifdef OLD_APP32_64BIT_OFF_T -# define _APP32_64BIT_OFF_T OLD_APP32_64BIT_OFF_T -# undef OLD_APP32_64BIT_OFF_T -# endif -# endif -#endif - - -/* - * Definition of timeval struct for platforms that don't have it. - */ - -#ifndef HAVE_STRUCT_TIMEVAL -struct timeval { - long tv_sec; - long tv_usec; -}; -#endif - - -/* - * If we have the MSG_NOSIGNAL define, make sure we use - * it as the fourth argument of function send() - */ - -#ifdef HAVE_MSG_NOSIGNAL -#define SEND_4TH_ARG MSG_NOSIGNAL -#else -#define SEND_4TH_ARG 0 -#endif - - -#if defined(__minix) -/* Minix doesn't support recv on TCP sockets */ -#define sread(x,y,z) (ares_ssize_t)read((RECV_TYPE_ARG1)(x), \ - (RECV_TYPE_ARG2)(y), \ - (RECV_TYPE_ARG3)(z)) - -#elif defined(HAVE_RECV) -/* - * The definitions for the return type and arguments types - * of functions recv() and send() belong and come from the - * configuration file. Do not define them in any other place. - * - * HAVE_RECV is defined if you have a function named recv() - * which is used to read incoming data from sockets. If your - * function has another name then don't define HAVE_RECV. - * - * If HAVE_RECV is defined then RECV_TYPE_ARG1, RECV_TYPE_ARG2, - * RECV_TYPE_ARG3, RECV_TYPE_ARG4 and RECV_TYPE_RETV must also - * be defined. - * - * HAVE_SEND is defined if you have a function named send() - * which is used to write outgoing data on a connected socket. - * If yours has another name then don't define HAVE_SEND. - * - * If HAVE_SEND is defined then SEND_TYPE_ARG1, SEND_QUAL_ARG2, - * SEND_TYPE_ARG2, SEND_TYPE_ARG3, SEND_TYPE_ARG4 and - * SEND_TYPE_RETV must also be defined. - */ - -#if !defined(RECV_TYPE_ARG1) || \ - !defined(RECV_TYPE_ARG2) || \ - !defined(RECV_TYPE_ARG3) || \ - !defined(RECV_TYPE_ARG4) || \ - !defined(RECV_TYPE_RETV) - /* */ - Error Missing_definition_of_return_and_arguments_types_of_recv - /* */ -#else -#define sread(x,y,z) (ares_ssize_t)recv((RECV_TYPE_ARG1)(x), \ - (RECV_TYPE_ARG2)(y), \ - (RECV_TYPE_ARG3)(z), \ - (RECV_TYPE_ARG4)(0)) -#endif -#else /* HAVE_RECV */ -#ifndef sread - /* */ - Error Missing_definition_of_macro_sread - /* */ -#endif -#endif /* HAVE_RECV */ - - -#if defined(__minix) -/* Minix doesn't support send on TCP sockets */ -#define swrite(x,y,z) (ares_ssize_t)write((SEND_TYPE_ARG1)(x), \ - (SEND_TYPE_ARG2)(y), \ - (SEND_TYPE_ARG3)(z)) - -#elif defined(HAVE_SEND) -#if !defined(SEND_TYPE_ARG1) || \ - !defined(SEND_QUAL_ARG2) || \ - !defined(SEND_TYPE_ARG2) || \ - !defined(SEND_TYPE_ARG3) || \ - !defined(SEND_TYPE_ARG4) || \ - !defined(SEND_TYPE_RETV) - /* */ - Error Missing_definition_of_return_and_arguments_types_of_send - /* */ -#else -#define swrite(x,y,z) (ares_ssize_t)send((SEND_TYPE_ARG1)(x), \ - (SEND_TYPE_ARG2)(y), \ - (SEND_TYPE_ARG3)(z), \ - (SEND_TYPE_ARG4)(SEND_4TH_ARG)) -#endif -#else /* HAVE_SEND */ -#ifndef swrite - /* */ - Error Missing_definition_of_macro_swrite - /* */ -#endif -#endif /* HAVE_SEND */ - - -#if 0 -#if defined(HAVE_RECVFROM) -/* - * Currently recvfrom is only used on udp sockets. - */ -#if !defined(RECVFROM_TYPE_ARG1) || \ - !defined(RECVFROM_TYPE_ARG2) || \ - !defined(RECVFROM_TYPE_ARG3) || \ - !defined(RECVFROM_TYPE_ARG4) || \ - !defined(RECVFROM_TYPE_ARG5) || \ - !defined(RECVFROM_TYPE_ARG6) || \ - !defined(RECVFROM_TYPE_RETV) - /* */ - Error Missing_definition_of_return_and_arguments_types_of_recvfrom - /* */ -#else -#define sreadfrom(s,b,bl,f,fl) (ares_ssize_t)recvfrom((RECVFROM_TYPE_ARG1) (s), \ - (RECVFROM_TYPE_ARG2 *)(b), \ - (RECVFROM_TYPE_ARG3) (bl), \ - (RECVFROM_TYPE_ARG4) (0), \ - (RECVFROM_TYPE_ARG5 *)(f), \ - (RECVFROM_TYPE_ARG6 *)(fl)) -#endif -#else /* HAVE_RECVFROM */ -#ifndef sreadfrom - /* */ - Error Missing_definition_of_macro_sreadfrom - /* */ -#endif -#endif /* HAVE_RECVFROM */ - - -#ifdef RECVFROM_TYPE_ARG6_IS_VOID -# define RECVFROM_ARG6_T int -#else -# define RECVFROM_ARG6_T RECVFROM_TYPE_ARG6 -#endif -#endif /* if 0 */ - - -/* - * Function-like macro definition used to close a socket. - */ - -#if defined(HAVE_CLOSESOCKET) -# define sclose(x) closesocket((x)) -#elif defined(HAVE_CLOSESOCKET_CAMEL) -# define sclose(x) CloseSocket((x)) -#elif defined(HAVE_CLOSE_S) -# define sclose(x) close_s((x)) -#else -# define sclose(x) close((x)) -#endif - - -/* - * Uppercase macro versions of ANSI/ISO is*() functions/macros which - * avoid negative number inputs with argument byte codes > 127. - */ - -#define ISSPACE(x) (isspace((int) ((unsigned char)x))) -#define ISDIGIT(x) (isdigit((int) ((unsigned char)x))) -#define ISALNUM(x) (isalnum((int) ((unsigned char)x))) -#define ISXDIGIT(x) (isxdigit((int) ((unsigned char)x))) -#define ISGRAPH(x) (isgraph((int) ((unsigned char)x))) -#define ISALPHA(x) (isalpha((int) ((unsigned char)x))) -#define ISPRINT(x) (isprint((int) ((unsigned char)x))) -#define ISUPPER(x) (isupper((int) ((unsigned char)x))) -#define ISLOWER(x) (islower((int) ((unsigned char)x))) -#define ISASCII(x) (isascii((int) ((unsigned char)x))) - -#define ISBLANK(x) (int)((((unsigned char)x) == ' ') || \ - (((unsigned char)x) == '\t')) - -#define TOLOWER(x) (tolower((int) ((unsigned char)x))) - - -/* - * 'bool' stuff compatible with HP-UX headers. - */ - -#if defined(__hpux) && !defined(HAVE_BOOL_T) - typedef int bool; -# define false 0 -# define true 1 -# define HAVE_BOOL_T -#endif - - -/* - * 'bool' exists on platforms with , i.e. C99 platforms. - * On non-C99 platforms there's no bool, so define an enum for that. - * On C99 platforms 'false' and 'true' also exist. Enum uses a - * global namespace though, so use bool_false and bool_true. - */ - -#ifndef HAVE_BOOL_T - typedef enum { - bool_false = 0, - bool_true = 1 - } bool; - -/* - * Use a define to let 'true' and 'false' use those enums. There - * are currently no use of true and false in libcurl proper, but - * there are some in the examples. This will cater for any later - * code happening to use true and false. - */ -# define false bool_false -# define true bool_true -# define HAVE_BOOL_T -#endif - - -/* - * Redefine TRUE and FALSE too, to catch current use. With this - * change, 'bool found = 1' will give a warning on MIPSPro, but - * 'bool found = TRUE' will not. Change tested on IRIX/MIPSPro, - * AIX 5.1/Xlc, Tru64 5.1/cc, w/make test too. - */ - -#ifndef TRUE -#define TRUE true -#endif -#ifndef FALSE -#define FALSE false -#endif - - -/* - * Macro WHILE_FALSE may be used to build single-iteration do-while loops, - * avoiding compiler warnings. Mostly intended for other macro definitions. - */ - -#define WHILE_FALSE while(0) - -#if defined(_MSC_VER) && !defined(__POCC__) -# undef WHILE_FALSE -# if (_MSC_VER < 1500) -# define WHILE_FALSE while(1, 0) -# else -# define WHILE_FALSE \ -__pragma(warning(push)) \ -__pragma(warning(disable:4127)) \ -while(0) \ -__pragma(warning(pop)) -# endif -#endif - - -/* - * Typedef to 'int' if sig_atomic_t is not an available 'typedefed' type. - */ - -#ifndef HAVE_SIG_ATOMIC_T -typedef int sig_atomic_t; -#define HAVE_SIG_ATOMIC_T -#endif - - -/* - * Convenience SIG_ATOMIC_T definition - */ - -#ifdef HAVE_SIG_ATOMIC_T_VOLATILE -#define SIG_ATOMIC_T static sig_atomic_t -#else -#define SIG_ATOMIC_T static volatile sig_atomic_t -#endif - - -/* - * Default return type for signal handlers. - */ - -#ifndef RETSIGTYPE -#define RETSIGTYPE void -#endif - - -/* - * Macro used to include code only in debug builds. - */ - -#ifdef DEBUGBUILD -#define DEBUGF(x) x -#else -#define DEBUGF(x) do { } WHILE_FALSE -#endif - - -/* - * Macro used to include assertion code only in debug builds. - */ - -#if defined(DEBUGBUILD) && defined(HAVE_ASSERT_H) -#define DEBUGASSERT(x) assert(x) -#else -#define DEBUGASSERT(x) do { } WHILE_FALSE -#endif - - -/* - * Macro SOCKERRNO / SET_SOCKERRNO() returns / sets the *socket-related* errno - * (or equivalent) on this platform to hide platform details to code using it. - */ - -#ifdef USE_WINSOCK -#define SOCKERRNO ((int)WSAGetLastError()) -#define SET_SOCKERRNO(x) (WSASetLastError((int)(x))) -#else -#define SOCKERRNO (errno) -#define SET_SOCKERRNO(x) (errno = (x)) -#endif - - -/* - * Macro ERRNO / SET_ERRNO() returns / sets the NOT *socket-related* errno - * (or equivalent) on this platform to hide platform details to code using it. - */ - -#if defined(WIN32) && !defined(WATT32) -#define ERRNO ((int)GetLastError()) -#define SET_ERRNO(x) (SetLastError((DWORD)(x))) -#else -#define ERRNO (errno) -#define SET_ERRNO(x) (errno = (x)) -#endif - - -/* - * Portable error number symbolic names defined to Winsock error codes. - */ - -#ifdef USE_WINSOCK -#undef EBADF /* override definition in errno.h */ -#define EBADF WSAEBADF -#undef EINTR /* override definition in errno.h */ -#define EINTR WSAEINTR -#undef EINVAL /* override definition in errno.h */ -#define EINVAL WSAEINVAL -#undef EWOULDBLOCK /* override definition in errno.h */ -#define EWOULDBLOCK WSAEWOULDBLOCK -#undef EINPROGRESS /* override definition in errno.h */ -#define EINPROGRESS WSAEINPROGRESS -#undef EALREADY /* override definition in errno.h */ -#define EALREADY WSAEALREADY -#undef ENOTSOCK /* override definition in errno.h */ -#define ENOTSOCK WSAENOTSOCK -#undef EDESTADDRREQ /* override definition in errno.h */ -#define EDESTADDRREQ WSAEDESTADDRREQ -#undef EMSGSIZE /* override definition in errno.h */ -#define EMSGSIZE WSAEMSGSIZE -#undef EPROTOTYPE /* override definition in errno.h */ -#define EPROTOTYPE WSAEPROTOTYPE -#undef ENOPROTOOPT /* override definition in errno.h */ -#define ENOPROTOOPT WSAENOPROTOOPT -#undef EPROTONOSUPPORT /* override definition in errno.h */ -#define EPROTONOSUPPORT WSAEPROTONOSUPPORT -#define ESOCKTNOSUPPORT WSAESOCKTNOSUPPORT -#undef EOPNOTSUPP /* override definition in errno.h */ -#define EOPNOTSUPP WSAEOPNOTSUPP -#define EPFNOSUPPORT WSAEPFNOSUPPORT -#undef EAFNOSUPPORT /* override definition in errno.h */ -#define EAFNOSUPPORT WSAEAFNOSUPPORT -#undef EADDRINUSE /* override definition in errno.h */ -#define EADDRINUSE WSAEADDRINUSE -#undef EADDRNOTAVAIL /* override definition in errno.h */ -#define EADDRNOTAVAIL WSAEADDRNOTAVAIL -#undef ENETDOWN /* override definition in errno.h */ -#define ENETDOWN WSAENETDOWN -#undef ENETUNREACH /* override definition in errno.h */ -#define ENETUNREACH WSAENETUNREACH -#undef ENETRESET /* override definition in errno.h */ -#define ENETRESET WSAENETRESET -#undef ECONNABORTED /* override definition in errno.h */ -#define ECONNABORTED WSAECONNABORTED -#undef ECONNRESET /* override definition in errno.h */ -#define ECONNRESET WSAECONNRESET -#undef ENOBUFS /* override definition in errno.h */ -#define ENOBUFS WSAENOBUFS -#undef EISCONN /* override definition in errno.h */ -#define EISCONN WSAEISCONN -#undef ENOTCONN /* override definition in errno.h */ -#define ENOTCONN WSAENOTCONN -#define ESHUTDOWN WSAESHUTDOWN -#define ETOOMANYREFS WSAETOOMANYREFS -#undef ETIMEDOUT /* override definition in errno.h */ -#define ETIMEDOUT WSAETIMEDOUT -#undef ECONNREFUSED /* override definition in errno.h */ -#define ECONNREFUSED WSAECONNREFUSED -#undef ELOOP /* override definition in errno.h */ -#define ELOOP WSAELOOP -#ifndef ENAMETOOLONG /* possible previous definition in errno.h */ -#define ENAMETOOLONG WSAENAMETOOLONG -#endif -#define EHOSTDOWN WSAEHOSTDOWN -#undef EHOSTUNREACH /* override definition in errno.h */ -#define EHOSTUNREACH WSAEHOSTUNREACH -#ifndef ENOTEMPTY /* possible previous definition in errno.h */ -#define ENOTEMPTY WSAENOTEMPTY -#endif -#define EPROCLIM WSAEPROCLIM -#define EUSERS WSAEUSERS -#define EDQUOT WSAEDQUOT -#define ESTALE WSAESTALE -#define EREMOTE WSAEREMOTE -#endif - - -/* - * Actually use __32_getpwuid() on 64-bit VMS builds for getpwuid() - */ - -#if defined(__VMS) && \ - defined(__INITIAL_POINTER_SIZE) && (__INITIAL_POINTER_SIZE == 64) -#define getpwuid __32_getpwuid -#endif - - -/* - * Macro argv_item_t hides platform details to code using it. - */ - -#ifdef __VMS -#define argv_item_t __char_ptr32 -#else -#define argv_item_t char * -#endif - - -/* - * We use this ZERO_NULL to avoid picky compiler warnings, - * when assigning a NULL pointer to a function pointer var. - */ - -#define ZERO_NULL 0 - - -#endif /* __SETUP_ONCE_H */ diff --git a/lib/c-ares-1.19.1/src/lib/windows_port.c b/lib/c-ares-1.19.1/src/lib/windows_port.c deleted file mode 100644 index 03acd1c1e2b..00000000000 --- a/lib/c-ares-1.19.1/src/lib/windows_port.c +++ /dev/null @@ -1,22 +0,0 @@ -#include "ares_setup.h" - - -/* only do the following on windows - */ -#if (defined(WIN32) || defined(WATT32)) && !defined(MSDOS) - -#ifdef __WATCOMC__ -/* - * Watcom needs a DllMain() in order to initialise the clib startup code. - */ -BOOL -WINAPI DllMain (HINSTANCE hnd, DWORD reason, LPVOID reserved) -{ - (void) hnd; - (void) reason; - (void) reserved; - return (TRUE); -} -#endif - -#endif /* WIN32 builds only */ diff --git a/lib/c-ares-1.19.1/src/tools/acountry.c b/lib/c-ares-1.19.1/src/tools/acountry.c deleted file mode 100644 index 00a6e67e138..00000000000 --- a/lib/c-ares-1.19.1/src/tools/acountry.c +++ /dev/null @@ -1,655 +0,0 @@ -/* - * - * IP-address/hostname to country converter. - * - * Problem; you want to know where IP a.b.c.d is located. - * - * Use ares_gethostbyname ("d.c.b.a.zz.countries.nerd.dk") - * and get the CNAME (host->h_name). Result will be: - * CNAME = zz.countries.nerd.dk with address 127.0.x.y (ver 1) or - * CNAME = .zz.countries.nerd.dk with address 127.0.x.y (ver 2) - * - * The 2 letter country code is in and the ISO-3166 country - * number is in x.y (number = x*256 + y). Version 2 of the protocol is missing - * the number. - * - * Ref: http://countries.nerd.dk/more.html - * - * Written by G. Vanem 2006, 2007 - * - * NB! This program may not be big-endian aware. - * - * 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. - */ - -#include "ares_setup.h" - -#ifdef HAVE_STRINGS_H -#include -#endif - -#if defined(WIN32) && !defined(WATT32) - #include -#else - #include - #include - #include -#endif - -#include "ares.h" -#include "ares_getopt.h" -#include "ares_nowarn.h" - -#ifndef HAVE_STRDUP -# include "ares_strdup.h" -# define strdup(ptr) ares_strdup(ptr) -#endif - -#ifndef HAVE_STRCASECMP -# include "ares_strcasecmp.h" -# define strcasecmp(p1,p2) ares_strcasecmp(p1,p2) -#endif - -#ifndef HAVE_STRNCASECMP -# include "ares_strcasecmp.h" -# define strncasecmp(p1,p2,n) ares_strncasecmp(p1,p2,n) -#endif - -#ifndef INADDR_NONE -#define INADDR_NONE 0xffffffff -#endif - -/* By using a double cast, we can get rid of the bogus warning of - * warning: cast from 'const struct sockaddr *' to 'const struct sockaddr_in6 *' increases required alignment from 1 to 4 [-Wcast-align] - */ -#define CARES_INADDR_CAST(type, var) ((type)((void *)var)) - -static const char *usage = "acountry [-?hdv] {host|addr} ...\n"; -static const char nerd_fmt[] = "%u.%u.%u.%u.zz.countries.nerd.dk"; -static const char *nerd_ver1 = nerd_fmt + 14; /* .countries.nerd.dk */ -static const char *nerd_ver2 = nerd_fmt + 11; /* .zz.countries.nerd.dk */ -static int verbose = 0; - -#define TRACE(fmt) do { \ - if (verbose > 0) \ - printf fmt ; \ - } WHILE_FALSE - -static void wait_ares(ares_channel channel); -static void callback(void *arg, int status, int timeouts, struct hostent *host); -static void callback2(void *arg, int status, int timeouts, struct hostent *host); -static void find_country_from_cname(const char *cname, struct in_addr addr); -static void print_help_info_acountry(void); - -static void Abort(const char *fmt, ...) -{ - va_list args; - va_start(args, fmt); - vfprintf(stderr, fmt, args); - va_end(args); - exit(1); -} - -int main(int argc, char **argv) -{ - ares_channel channel; - int ch, status; - -#if defined(WIN32) && !defined(WATT32) - WORD wVersionRequested = MAKEWORD(USE_WINSOCK,USE_WINSOCK); - WSADATA wsaData; - WSAStartup(wVersionRequested, &wsaData); -#endif - - status = ares_library_init(ARES_LIB_INIT_ALL); - if (status != ARES_SUCCESS) - { - fprintf(stderr, "ares_library_init: %s\n", ares_strerror(status)); - return 1; - } - - while ((ch = ares_getopt(argc, argv, "dvh?")) != -1) - switch (ch) - { - case 'd': -#ifdef WATT32 - dbug_init(); -#endif - break; - case 'v': - verbose++; - break; - case 'h': - print_help_info_acountry(); - break; - case '?': - print_help_info_acountry(); - break; - default: - Abort(usage); - } - - argc -= optind; - argv += optind; - if (argc < 1) - Abort(usage); - - status = ares_init(&channel); - if (status != ARES_SUCCESS) - { - fprintf(stderr, "ares_init: %s\n", ares_strerror(status)); - return 1; - } - - /* Initiate the queries, one per command-line argument. */ - for ( ; *argv; argv++) - { - struct in_addr addr; - char *buf; - - /* If this fails, assume '*argv' is a host-name that - * must be resolved first - */ - if (ares_inet_pton(AF_INET, *argv, &addr) != 1) - { - ares_gethostbyname(channel, *argv, AF_INET, callback2, &addr); - wait_ares(channel); - if (addr.s_addr == INADDR_NONE) - { - printf("Failed to lookup %s\n", *argv); - continue; - } - } - - buf = malloc(100); - sprintf(buf, nerd_fmt, - (unsigned int)(addr.s_addr >> 24), - (unsigned int)((addr.s_addr >> 16) & 255), - (unsigned int)((addr.s_addr >> 8) & 255), - (unsigned int)(addr.s_addr & 255)); - TRACE(("Looking up %s...", buf)); - fflush(stdout); - ares_gethostbyname(channel, buf, AF_INET, callback, buf); - } - - wait_ares(channel); - ares_destroy(channel); - - ares_library_cleanup(); - -#if defined(WIN32) && !defined(WATT32) - WSACleanup(); -#endif - - return 0; -} - -/* - * Wait for the queries to complete. - */ -static void wait_ares(ares_channel channel) -{ - for (;;) - { - struct timeval *tvp, tv; - fd_set read_fds, write_fds; - int nfds; - - FD_ZERO(&read_fds); - FD_ZERO(&write_fds); - nfds = ares_fds(channel, &read_fds, &write_fds); - if (nfds == 0) - break; - tvp = ares_timeout(channel, NULL, &tv); - nfds = select(nfds, &read_fds, &write_fds, NULL, tvp); - if (nfds < 0) - continue; - ares_process(channel, &read_fds, &write_fds); - } -} - -/* - * This is the callback used when we have the IP-address of interest. - * Extract the CNAME and figure out the country-code from it. - */ -static void callback(void *arg, int status, int timeouts, struct hostent *host) -{ - const char *name = (const char*)arg; - const char *cname; - char buf[20]; - - (void)timeouts; - - if (!host || status != ARES_SUCCESS) - { - printf("Failed to lookup %s: %s\n", name, ares_strerror(status)); - free(arg); - return; - } - - TRACE(("\nFound address %s, name %s\n", - ares_inet_ntop(AF_INET,(const char*)host->h_addr,buf,sizeof(buf)), - host->h_name)); - - cname = host->h_name; /* CNAME gets put here */ - if (!cname) - printf("Failed to get CNAME for %s\n", name); - else - find_country_from_cname(cname, *(CARES_INADDR_CAST(struct in_addr *, host->h_addr))); - free(arg); -} - -/* - * This is the callback used to obtain the IP-address of the host of interest. - */ -static void callback2(void *arg, int status, int timeouts, struct hostent *host) -{ - struct in_addr *addr = (struct in_addr*) arg; - - (void)timeouts; - if (!host || status != ARES_SUCCESS) - memset(addr, INADDR_NONE, sizeof(*addr)); - else - memcpy(addr, host->h_addr, sizeof(*addr)); -} - -struct search_list { - int country_number; /* ISO-3166 country number */ - char short_name[3]; /* A2 short country code */ - const char *long_name; /* normal country name */ - }; - -static const struct search_list *list_lookup(int number, const struct search_list *list, int num) -{ - while (num > 0 && list->long_name) - { - if (list->country_number == number) - return (list); - num--; - list++; - } - return (NULL); -} - -/* - * Ref: https://en.wikipedia.org/wiki/ISO_3166-1 - */ -static const struct search_list country_list[] = { - { 4, "af", "Afghanistan" }, - { 248, "ax", "Åland Island" }, - { 8, "al", "Albania" }, - { 12, "dz", "Algeria" }, - { 16, "as", "American Samoa" }, - { 20, "ad", "Andorra" }, - { 24, "ao", "Angola" }, - { 660, "ai", "Anguilla" }, - { 10, "aq", "Antarctica" }, - { 28, "ag", "Antigua & Barbuda" }, - { 32, "ar", "Argentina" }, - { 51, "am", "Armenia" }, - { 533, "aw", "Aruba" }, - { 36, "au", "Australia" }, - { 40, "at", "Austria" }, - { 31, "az", "Azerbaijan" }, - { 44, "bs", "Bahamas" }, - { 48, "bh", "Bahrain" }, - { 50, "bd", "Bangladesh" }, - { 52, "bb", "Barbados" }, - { 112, "by", "Belarus" }, - { 56, "be", "Belgium" }, - { 84, "bz", "Belize" }, - { 204, "bj", "Benin" }, - { 60, "bm", "Bermuda" }, - { 64, "bt", "Bhutan" }, - { 68, "bo", "Bolivia" }, - { 535, "bq", "Bonaire, Sint Eustatius and Saba" }, /* Formerly 'Bonaire' / 'Netherlands Antilles' */ - { 70, "ba", "Bosnia & Herzegovina" }, - { 72, "bw", "Botswana" }, - { 74, "bv", "Bouvet Island" }, - { 76, "br", "Brazil" }, - { 86, "io", "British Indian Ocean Territory" }, - { 96, "bn", "Brunei Darussalam" }, - { 100, "bg", "Bulgaria" }, - { 854, "bf", "Burkina Faso" }, - { 108, "bi", "Burundi" }, - { 116, "kh", "Cambodia" }, - { 120, "cm", "Cameroon" }, - { 124, "ca", "Canada" }, - { 132, "cv", "Cape Verde" }, - { 136, "ky", "Cayman Islands" }, - { 140, "cf", "Central African Republic" }, - { 148, "td", "Chad" }, - { 152, "cl", "Chile" }, - { 156, "cn", "China" }, - { 162, "cx", "Christmas Island" }, - { 166, "cc", "Cocos Islands" }, - { 170, "co", "Colombia" }, - { 174, "km", "Comoros" }, - { 178, "cg", "Congo" }, - { 180, "cd", "Congo" }, - { 184, "ck", "Cook Islands" }, - { 188, "cr", "Costa Rica" }, - { 384, "ci", "Cote d'Ivoire" }, - { 191, "hr", "Croatia" }, - { 192, "cu", "Cuba" }, - { 531, "cw", "Curaçao" }, - { 196, "cy", "Cyprus" }, - { 203, "cz", "Czech Republic" }, - { 208, "dk", "Denmark" }, - { 262, "dj", "Djibouti" }, - { 212, "dm", "Dominica" }, - { 214, "do", "Dominican Republic" }, - { 218, "ec", "Ecuador" }, - { 818, "eg", "Egypt" }, - { 222, "sv", "El Salvador" }, - { 226, "gq", "Equatorial Guinea" }, - { 232, "er", "Eritrea" }, - { 233, "ee", "Estonia" }, - { 748, "sz", "Eswatini" }, /* Formerly Swaziland */ - { 231, "et", "Ethiopia" }, - { 65281, "eu", "European Union" }, /* 127.0.255.1 */ - { 238, "fk", "Falkland Islands" }, - { 234, "fo", "Faroe Islands" }, - { 242, "fj", "Fiji" }, - { 246, "fi", "Finland" }, - { 250, "fr", "France" }, - { 249, "fx", "France, Metropolitan" }, - { 254, "gf", "French Guiana" }, - { 258, "pf", "French Polynesia" }, - { 260, "tf", "French Southern Territories" }, - { 266, "ga", "Gabon" }, - { 270, "gm", "Gambia" }, - { 268, "ge", "Georgia" }, - { 276, "de", "Germany" }, - { 288, "gh", "Ghana" }, - { 292, "gi", "Gibraltar" }, - { 300, "gr", "Greece" }, - { 304, "gl", "Greenland" }, - { 308, "gd", "Grenada" }, - { 312, "gp", "Guadeloupe" }, - { 316, "gu", "Guam" }, - { 320, "gt", "Guatemala" }, - { 831, "gg", "Guernsey" }, - { 324, "gn", "Guinea" }, - { 624, "gw", "Guinea-Bissau" }, - { 328, "gy", "Guyana" }, - { 332, "ht", "Haiti" }, - { 334, "hm", "Heard & Mc Donald Islands" }, - { 336, "va", "Holy See" }, /* Vatican City */ - { 340, "hn", "Honduras" }, - { 344, "hk", "Hong kong" }, - { 348, "hu", "Hungary" }, - { 352, "is", "Iceland" }, - { 356, "in", "India" }, - { 360, "id", "Indonesia" }, - { 364, "ir", "Iran" }, - { 368, "iq", "Iraq" }, - { 372, "ie", "Ireland" }, - { 833, "im", "Isle of Man" }, - { 376, "il", "Israel" }, - { 380, "it", "Italy" }, - { 388, "jm", "Jamaica" }, - { 392, "jp", "Japan" }, - { 832, "je", "Jersey" }, - { 400, "jo", "Jordan" }, - { 398, "kz", "Kazakhstan" }, - { 404, "ke", "Kenya" }, - { 296, "ki", "Kiribati" }, - { 408, "kp", "Korea (north)" }, - { 410, "kr", "Korea (south)" }, - { 0, "xk", "Kosovo" }, /* https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2 */ - { 414, "kw", "Kuwait" }, - { 417, "kg", "Kyrgyzstan" }, - { 418, "la", "Laos" }, - { 428, "lv", "Latvia" }, - { 422, "lb", "Lebanon" }, - { 426, "ls", "Lesotho" }, - { 430, "lr", "Liberia" }, - { 434, "ly", "Libya" }, - { 438, "li", "Liechtenstein" }, - { 440, "lt", "Lithuania" }, - { 442, "lu", "Luxembourg" }, - { 446, "mo", "Macao" }, - { 450, "mg", "Madagascar" }, - { 454, "mw", "Malawi" }, - { 458, "my", "Malaysia" }, - { 462, "mv", "Maldives" }, - { 466, "ml", "Mali" }, - { 470, "mt", "Malta" }, - { 584, "mh", "Marshall Islands" }, - { 474, "mq", "Martinique" }, - { 478, "mr", "Mauritania" }, - { 480, "mu", "Mauritius" }, - { 175, "yt", "Mayotte" }, - { 484, "mx", "Mexico" }, - { 583, "fm", "Micronesia" }, - { 498, "md", "Moldova" }, - { 492, "mc", "Monaco" }, - { 496, "mn", "Mongolia" }, - { 499, "me", "Montenegro" }, - { 500, "ms", "Montserrat" }, - { 504, "ma", "Morocco" }, - { 508, "mz", "Mozambique" }, - { 104, "mm", "Myanmar" }, - { 516, "na", "Namibia" }, - { 520, "nr", "Nauru" }, - { 524, "np", "Nepal" }, - { 528, "nl", "Netherlands" }, - { 540, "nc", "New Caledonia" }, - { 554, "nz", "New Zealand" }, - { 558, "ni", "Nicaragua" }, - { 562, "ne", "Niger" }, - { 566, "ng", "Nigeria" }, - { 570, "nu", "Niue" }, - { 574, "nf", "Norfolk Island" }, - { 807, "mk", "North Macedonia" }, /* 'Macedonia' until February 2019 */ - { 580, "mp", "Northern Mariana Islands" }, - { 578, "no", "Norway" }, - { 512, "om", "Oman" }, - { 586, "pk", "Pakistan" }, - { 585, "pw", "Palau" }, - { 275, "ps", "Palestinian Territory" }, - { 591, "pa", "Panama" }, - { 598, "pg", "Papua New Guinea" }, - { 600, "py", "Paraguay" }, - { 604, "pe", "Peru" }, - { 608, "ph", "Philippines" }, - { 612, "pn", "Pitcairn" }, - { 616, "pl", "Poland" }, - { 620, "pt", "Portugal" }, - { 630, "pr", "Puerto Rico" }, - { 634, "qa", "Qatar" }, - { 638, "re", "Reunion" }, - { 642, "ro", "Romania" }, - { 643, "ru", "Russian Federation" }, - { 646, "rw", "Rwanda" }, - { 0, "bl", "Saint Barthélemy" }, /* https://en.wikipedia.org/wiki/ISO_3166-2:BL */ - { 659, "kn", "Saint Kitts & Nevis" }, - { 662, "lc", "Saint Lucia" }, - { 663, "mf", "Saint Martin" }, - { 670, "vc", "Saint Vincent" }, - { 882, "ws", "Samoa" }, - { 674, "sm", "San Marino" }, - { 678, "st", "Sao Tome & Principe" }, - { 682, "sa", "Saudi Arabia" }, - { 686, "sn", "Senegal" }, - { 688, "rs", "Serbia" }, - { 690, "sc", "Seychelles" }, - { 694, "sl", "Sierra Leone" }, - { 702, "sg", "Singapore" }, - { 534, "sx", "Sint Maarten" }, - { 703, "sk", "Slovakia" }, - { 705, "si", "Slovenia" }, - { 90, "sb", "Solomon Islands" }, - { 706, "so", "Somalia" }, - { 710, "za", "South Africa" }, - { 239, "gs", "South Georgia & South Sandwich Is." }, - { 728, "ss", "South Sudan" }, - { 724, "es", "Spain" }, - { 144, "lk", "Sri Lanka" }, - { 654, "sh", "St. Helena" }, - { 666, "pm", "St. Pierre & Miquelon" }, - { 736, "sd", "Sudan" }, - { 740, "sr", "Suriname" }, - { 744, "sj", "Svalbard & Jan Mayen Islands" }, - { 752, "se", "Sweden" }, - { 756, "ch", "Switzerland" }, - { 760, "sy", "Syrian Arab Republic" }, - { 158, "tw", "Taiwan" }, - { 762, "tj", "Tajikistan" }, - { 834, "tz", "Tanzania" }, - { 764, "th", "Thailand" }, - { 626, "tl", "Timor-Leste" }, - { 768, "tg", "Togo" }, - { 772, "tk", "Tokelau" }, - { 776, "to", "Tonga" }, - { 780, "tt", "Trinidad & Tobago" }, - { 788, "tn", "Tunisia" }, - { 792, "tr", "Turkey" }, - { 795, "tm", "Turkmenistan" }, - { 796, "tc", "Turks & Caicos Islands" }, - { 798, "tv", "Tuvalu" }, - { 800, "ug", "Uganda" }, - { 804, "ua", "Ukraine" }, - { 784, "ae", "United Arab Emirates" }, - { 826, "gb", "United Kingdom" }, - { 840, "us", "United States" }, - { 581, "um", "United States Minor Outlying Islands" }, - { 858, "uy", "Uruguay" }, - { 860, "uz", "Uzbekistan" }, - { 548, "vu", "Vanuatu" }, - { 862, "ve", "Venezuela" }, - { 704, "vn", "Vietnam" }, - { 92, "vg", "Virgin Islands (British)" }, - { 850, "vi", "Virgin Islands (US)" }, - { 876, "wf", "Wallis & Futuna Islands" }, - { 732, "eh", "Western Sahara" }, - { 887, "ye", "Yemen" }, - { 894, "zm", "Zambia" }, - { 716, "zw", "Zimbabwe" } - }; - -/* - * Check if start of 'str' is simply an IPv4 address. - */ -#define BYTE_OK(x) ((x) >= 0 && (x) <= 255) - -static int is_addr(char *str, char **end) -{ - int a0, a1, a2, a3, num, rc = 0, length = 0; - - num = sscanf(str,"%3d.%3d.%3d.%3d%n",&a0,&a1,&a2,&a3,&length); - if( (num == 4) && - BYTE_OK(a0) && BYTE_OK(a1) && BYTE_OK(a2) && BYTE_OK(a3) && - length >= (3+4)) - { - rc = 1; - *end = str + length; - } - return rc; -} - -/* - * Find the country-code and name from the CNAME. E.g.: - * version 1: CNAME = zzno.countries.nerd.dk with address 127.0.2.66 - * yields ccode_A" = "no" and cnumber 578 (2.66). - * version 2: CNAME = .zz.countries.nerd.dk with address 127.0.2.66 - * yields cnumber 578 (2.66). ccode_A is ""; - */ -static void find_country_from_cname(const char *cname, struct in_addr addr) -{ - const struct search_list *country; - char ccode_A2[3], *ccopy, *dot_4; - int cnumber, z0, z1, ver_1, ver_2; - unsigned long ip; - - ip = ntohl(addr.s_addr); - z0 = TOLOWER(cname[0]); - z1 = TOLOWER(cname[1]); - ccopy = strdup(cname); - dot_4 = NULL; - - ver_1 = (z0 == 'z' && z1 == 'z' && !strcasecmp(cname+4,nerd_ver1)); - ver_2 = (is_addr(ccopy,&dot_4) && !strcasecmp(dot_4,nerd_ver2)); - - if (ver_1) - { - const char *dot = strchr(cname, '.'); - if (dot != cname+4) - { - printf("Unexpected CNAME %s (ver_1)\n", cname); - free(ccopy); - return; - } - } - else if (ver_2) - { - z0 = TOLOWER(dot_4[1]); - z1 = TOLOWER(dot_4[2]); - if (z0 != 'z' && z1 != 'z') - { - printf("Unexpected CNAME %s (ver_2)\n", cname); - free(ccopy); - return; - } - } - else - { - printf("Unexpected CNAME %s (ver?)\n", cname); - free(ccopy); - return; - } - - if (ver_1) - { - ccode_A2[0] = (char)TOLOWER(cname[2]); - ccode_A2[1] = (char)TOLOWER(cname[3]); - ccode_A2[2] = '\0'; - } - else - ccode_A2[0] = '\0'; - - cnumber = ip & 0xFFFF; - - TRACE(("Found country-code `%s', number %d\n", - ver_1 ? ccode_A2 : "", cnumber)); - - country = list_lookup(cnumber, country_list, - sizeof(country_list) / sizeof(country_list[0])); - if (!country) - printf("Name for country-number %d not found.\n", cnumber); - else - { - if (ver_1) - { - if ((country->short_name[0] != ccode_A2[0]) || - (country->short_name[1] != ccode_A2[1]) || - (country->short_name[2] != ccode_A2[2])) - printf("short-name mismatch; %s vs %s\n", - country->short_name, ccode_A2); - } - printf("%s (%s), number %d.\n", - country->long_name, country->short_name, cnumber); - } - free(ccopy); -} - -/* Information from the man page. Formatting taken from man -h */ -static void print_help_info_acountry(void) { - printf("acountry, version %s\n\n", ARES_VERSION_STR); - printf("usage: acountry [-hdv] host|addr ...\n\n" - " h : Display this help and exit.\n" - " d : Print some extra debugging output.\n" - " v : Be more verbose. Print extra information.\n\n"); - exit(0); -} diff --git a/lib/c-ares-1.19.1/src/tools/adig.c b/lib/c-ares-1.19.1/src/tools/adig.c deleted file mode 100644 index cf5bd4d3f2f..00000000000 --- a/lib/c-ares-1.19.1/src/tools/adig.c +++ /dev/null @@ -1,988 +0,0 @@ -/* Copyright 1998 by the Massachusetts Institute of Technology. - * - * - * 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. - */ - -#include "ares_setup.h" - -#ifdef HAVE_NETINET_IN_H -# include -#endif -#ifdef HAVE_ARPA_INET_H -# include -#endif -#ifdef HAVE_NETDB_H -# include -#endif - -#include "ares_nameser.h" - -#ifdef HAVE_STRINGS_H -# include -#endif - -#include "ares.h" -#include "ares_dns.h" -#include "ares_getopt.h" -#include "ares_nowarn.h" - -#ifndef HAVE_STRDUP -# include "ares_strdup.h" -# define strdup(ptr) ares_strdup(ptr) -#endif - -#ifndef HAVE_STRCASECMP -# include "ares_strcasecmp.h" -# define strcasecmp(p1,p2) ares_strcasecmp(p1,p2) -#endif - -#ifndef HAVE_STRNCASECMP -# include "ares_strcasecmp.h" -# define strncasecmp(p1,p2,n) ares_strncasecmp(p1,p2,n) -#endif - -#ifdef WATT32 -#undef WIN32 /* Redefined in MingW headers */ -#endif - - -struct nv { - const char *name; - int value; -}; - -static const struct nv flags[] = { - { "usevc", ARES_FLAG_USEVC }, - { "primary", ARES_FLAG_PRIMARY }, - { "igntc", ARES_FLAG_IGNTC }, - { "norecurse", ARES_FLAG_NORECURSE }, - { "stayopen", ARES_FLAG_STAYOPEN }, - { "noaliases", ARES_FLAG_NOALIASES } -}; -static const int nflags = sizeof(flags) / sizeof(flags[0]); - -static const struct nv classes[] = { - { "IN", C_IN }, - { "CHAOS", C_CHAOS }, - { "HS", C_HS }, - { "ANY", C_ANY } -}; -static const int nclasses = sizeof(classes) / sizeof(classes[0]); - -static const struct nv types[] = { - { "A", T_A }, - { "NS", T_NS }, - { "MD", T_MD }, - { "MF", T_MF }, - { "CNAME", T_CNAME }, - { "SOA", T_SOA }, - { "MB", T_MB }, - { "MG", T_MG }, - { "MR", T_MR }, - { "NULL", T_NULL }, - { "WKS", T_WKS }, - { "PTR", T_PTR }, - { "HINFO", T_HINFO }, - { "MINFO", T_MINFO }, - { "MX", T_MX }, - { "TXT", T_TXT }, - { "RP", T_RP }, - { "AFSDB", T_AFSDB }, - { "X25", T_X25 }, - { "ISDN", T_ISDN }, - { "RT", T_RT }, - { "NSAP", T_NSAP }, - { "NSAP_PTR", T_NSAP_PTR }, - { "SIG", T_SIG }, - { "KEY", T_KEY }, - { "PX", T_PX }, - { "GPOS", T_GPOS }, - { "AAAA", T_AAAA }, - { "LOC", T_LOC }, - { "SRV", T_SRV }, - { "AXFR", T_AXFR }, - { "MAILB", T_MAILB }, - { "MAILA", T_MAILA }, - { "NAPTR", T_NAPTR }, - { "DS", T_DS }, - { "SSHFP", T_SSHFP }, - { "RRSIG", T_RRSIG }, - { "NSEC", T_NSEC }, - { "DNSKEY", T_DNSKEY }, - { "CAA", T_CAA }, - { "URI", T_URI }, - { "ANY", T_ANY } -}; -static const int ntypes = sizeof(types) / sizeof(types[0]); - -static const char *opcodes[] = { - "QUERY", "IQUERY", "STATUS", "(reserved)", "NOTIFY", - "(unknown)", "(unknown)", "(unknown)", "(unknown)", - "UPDATEA", "UPDATED", "UPDATEDA", "UPDATEM", "UPDATEMA", - "ZONEINIT", "ZONEREF" -}; - -static const char *rcodes[] = { - "NOERROR", "FORMERR", "SERVFAIL", "NXDOMAIN", "NOTIMP", "REFUSED", - "(unknown)", "(unknown)", "(unknown)", "(unknown)", "(unknown)", - "(unknown)", "(unknown)", "(unknown)", "(unknown)", "NOCHANGE" -}; - -static void callback(void *arg, int status, int timeouts, - unsigned char *abuf, int alen); -static const unsigned char *display_question(const unsigned char *aptr, - const unsigned char *abuf, - int alen); -static const unsigned char *display_rr(const unsigned char *aptr, - const unsigned char *abuf, int alen); -static int convert_query (char **name, int use_bitstring); -static const char *type_name(int type); -static const char *class_name(int dnsclass); -static void usage(void); -static void destroy_addr_list(struct ares_addr_node *head); -static void append_addr_list(struct ares_addr_node **head, - struct ares_addr_node *node); -static void print_help_info_adig(void); - -int main(int argc, char **argv) -{ - ares_channel channel; - int c, i, optmask = ARES_OPT_FLAGS, dnsclass = C_IN, type = T_A; - int status, nfds, count; - int use_ptr_helper = 0; - struct ares_options options; - struct hostent *hostent; - fd_set read_fds, write_fds; - struct timeval *tvp, tv; - struct ares_addr_node *srvr, *servers = NULL; - -#ifdef USE_WINSOCK - WORD wVersionRequested = MAKEWORD(USE_WINSOCK,USE_WINSOCK); - WSADATA wsaData; - WSAStartup(wVersionRequested, &wsaData); -#endif - - status = ares_library_init(ARES_LIB_INIT_ALL); - if (status != ARES_SUCCESS) - { - fprintf(stderr, "ares_library_init: %s\n", ares_strerror(status)); - return 1; - } - - options.flags = ARES_FLAG_NOCHECKRESP; - options.servers = NULL; - options.nservers = 0; - while ((c = ares_getopt(argc, argv, "dh?f:s:c:t:T:U:x")) != -1) - { - switch (c) - { - case 'd': -#ifdef WATT32 - dbug_init(); -#endif - break; - case 'h': - print_help_info_adig(); - break; - case '?': - print_help_info_adig(); - break; - case 'f': - /* Add a flag. */ - for (i = 0; i < nflags; i++) - { - if (strcmp(flags[i].name, optarg) == 0) - break; - } - if (i < nflags) - options.flags |= flags[i].value; - else - usage(); - break; - - case 's': - /* User-specified name servers override default ones. */ - srvr = malloc(sizeof(struct ares_addr_node)); - if (!srvr) - { - fprintf(stderr, "Out of memory!\n"); - destroy_addr_list(servers); - return 1; - } - append_addr_list(&servers, srvr); - if (ares_inet_pton(AF_INET, optarg, &srvr->addr.addr4) > 0) - srvr->family = AF_INET; - else if (ares_inet_pton(AF_INET6, optarg, &srvr->addr.addr6) > 0) - srvr->family = AF_INET6; - else - { - hostent = gethostbyname(optarg); - if (!hostent) - { - fprintf(stderr, "adig: server %s not found.\n", optarg); - destroy_addr_list(servers); - return 1; - } - switch (hostent->h_addrtype) - { - case AF_INET: - srvr->family = AF_INET; - memcpy(&srvr->addr.addr4, hostent->h_addr, - sizeof(srvr->addr.addr4)); - break; - case AF_INET6: - srvr->family = AF_INET6; - memcpy(&srvr->addr.addr6, hostent->h_addr, - sizeof(srvr->addr.addr6)); - break; - default: - fprintf(stderr, - "adig: server %s unsupported address family.\n", optarg); - destroy_addr_list(servers); - return 1; - } - } - /* Notice that calling ares_init_options() without servers in the - * options struct and with ARES_OPT_SERVERS set simultaneously in - * the options mask, results in an initialization with no servers. - * When alternative name servers have been specified these are set - * later calling ares_set_servers() overriding any existing server - * configuration. To prevent initial configuration with default - * servers that will be discarded later, ARES_OPT_SERVERS is set. - * If this flag is not set here the result shall be the same but - * ares_init_options() will do needless work. */ - optmask |= ARES_OPT_SERVERS; - break; - - case 'c': - /* Set the query class. */ - for (i = 0; i < nclasses; i++) - { - if (strcasecmp(classes[i].name, optarg) == 0) - break; - } - if (i < nclasses) - dnsclass = classes[i].value; - else - usage(); - break; - - case 't': - /* Set the query type. */ - for (i = 0; i < ntypes; i++) - { - if (strcasecmp(types[i].name, optarg) == 0) - break; - } - if (i < ntypes) - type = types[i].value; - else - usage(); - break; - - case 'T': - /* Set the TCP port number. */ - if (!ISDIGIT(*optarg)) - usage(); - options.tcp_port = (unsigned short)strtol(optarg, NULL, 0); - options.flags |= ARES_FLAG_USEVC; - optmask |= ARES_OPT_TCP_PORT; - break; - - case 'U': - /* Set the UDP port number. */ - if (!ISDIGIT(*optarg)) - usage(); - options.udp_port = (unsigned short)strtol(optarg, NULL, 0); - optmask |= ARES_OPT_UDP_PORT; - break; - - case 'x': - use_ptr_helper++; - break; - } - } - argc -= optind; - argv += optind; - if (argc == 0) - usage(); - - status = ares_init_options(&channel, &options, optmask); - - if (status != ARES_SUCCESS) - { - fprintf(stderr, "ares_init_options: %s\n", - ares_strerror(status)); - return 1; - } - - if(servers) - { - status = ares_set_servers(channel, servers); - destroy_addr_list(servers); - if (status != ARES_SUCCESS) - { - fprintf(stderr, "ares_init_options: %s\n", - ares_strerror(status)); - return 1; - } - } - - /* Initiate the queries, one per command-line argument. If there is - * only one query to do, supply NULL as the callback argument; - * otherwise, supply the query name as an argument so we can - * distinguish responses for the user when printing them out. - */ - for (i = 1; *argv; i++, argv++) - { - char *query = *argv; - - if (type == T_PTR && dnsclass == C_IN && use_ptr_helper) - if (!convert_query (&query, use_ptr_helper >= 2)) - continue; - - ares_query(channel, query, dnsclass, type, callback, i < argc-1 ? (void*)query : NULL); - } - - /* Wait for all queries to complete. */ - for (;;) - { - FD_ZERO(&read_fds); - FD_ZERO(&write_fds); - nfds = ares_fds(channel, &read_fds, &write_fds); - if (nfds == 0) - break; - tvp = ares_timeout(channel, NULL, &tv); - count = select(nfds, &read_fds, &write_fds, NULL, tvp); - if (count < 0 && (status = SOCKERRNO) != EINVAL) - { - printf("select fail: %d", status); - return 1; - } - ares_process(channel, &read_fds, &write_fds); - } - - ares_destroy(channel); - - ares_library_cleanup(); - -#ifdef USE_WINSOCK - WSACleanup(); -#endif - - return 0; -} - -static void callback(void *arg, int status, int timeouts, - unsigned char *abuf, int alen) -{ - char *name = (char *) arg; - int id, qr, opcode, aa, tc, rd, ra, rcode; - unsigned int qdcount, ancount, nscount, arcount, i; - const unsigned char *aptr; - - (void) timeouts; - - /* Display the query name if given. */ - if (name) - printf("Answer for query %s:\n", name); - - /* Display an error message if there was an error, but only stop if - * we actually didn't get an answer buffer. - */ - if (status != ARES_SUCCESS) - { - printf("%s\n", ares_strerror(status)); - if (!abuf) - return; - } - - /* Won't happen, but check anyway, for safety. */ - if (alen < HFIXEDSZ) - return; - - /* Parse the answer header. */ - id = DNS_HEADER_QID(abuf); - qr = DNS_HEADER_QR(abuf); - opcode = DNS_HEADER_OPCODE(abuf); - aa = DNS_HEADER_AA(abuf); - tc = DNS_HEADER_TC(abuf); - rd = DNS_HEADER_RD(abuf); - ra = DNS_HEADER_RA(abuf); - rcode = DNS_HEADER_RCODE(abuf); - qdcount = DNS_HEADER_QDCOUNT(abuf); - ancount = DNS_HEADER_ANCOUNT(abuf); - nscount = DNS_HEADER_NSCOUNT(abuf); - arcount = DNS_HEADER_ARCOUNT(abuf); - - /* Display the answer header. */ - printf("id: %d\n", id); - printf("flags: %s%s%s%s%s\n", - qr ? "qr " : "", - aa ? "aa " : "", - tc ? "tc " : "", - rd ? "rd " : "", - ra ? "ra " : ""); - printf("opcode: %s\n", opcodes[opcode]); - printf("rcode: %s\n", rcodes[rcode]); - - /* Display the questions. */ - printf("Questions:\n"); - aptr = abuf + HFIXEDSZ; - for (i = 0; i < qdcount; i++) - { - aptr = display_question(aptr, abuf, alen); - if (aptr == NULL) - return; - } - - /* Display the answers. */ - printf("Answers:\n"); - for (i = 0; i < ancount; i++) - { - aptr = display_rr(aptr, abuf, alen); - if (aptr == NULL) - return; - } - - /* Display the NS records. */ - printf("NS records:\n"); - for (i = 0; i < nscount; i++) - { - aptr = display_rr(aptr, abuf, alen); - if (aptr == NULL) - return; - } - - /* Display the additional records. */ - printf("Additional records:\n"); - for (i = 0; i < arcount; i++) - { - aptr = display_rr(aptr, abuf, alen); - if (aptr == NULL) - return; - } -} - -static const unsigned char *display_question(const unsigned char *aptr, - const unsigned char *abuf, - int alen) -{ - char *name; - int type, dnsclass, status; - long len; - - /* Parse the question name. */ - status = ares_expand_name(aptr, abuf, alen, &name, &len); - if (status != ARES_SUCCESS) - return NULL; - aptr += len; - - /* Make sure there's enough data after the name for the fixed part - * of the question. - */ - if (aptr + QFIXEDSZ > abuf + alen) - { - ares_free_string(name); - return NULL; - } - - /* Parse the question type and class. */ - type = DNS_QUESTION_TYPE(aptr); - dnsclass = DNS_QUESTION_CLASS(aptr); - aptr += QFIXEDSZ; - - /* Display the question, in a format sort of similar to how we will - * display RRs. - */ - printf("\t%-15s.\t", name); - if (dnsclass != C_IN) - printf("\t%s", class_name(dnsclass)); - printf("\t%s\n", type_name(type)); - ares_free_string(name); - return aptr; -} - -static const unsigned char *display_rr(const unsigned char *aptr, - const unsigned char *abuf, int alen) -{ - const unsigned char *p; - int type, dnsclass, ttl, dlen, status, i; - long len; - int vlen; - char addr[46]; - union { - unsigned char * as_uchar; - char * as_char; - } name; - - /* Parse the RR name. */ - status = ares_expand_name(aptr, abuf, alen, &name.as_char, &len); - if (status != ARES_SUCCESS) - return NULL; - aptr += len; - - /* Make sure there is enough data after the RR name for the fixed - * part of the RR. - */ - if (aptr + RRFIXEDSZ > abuf + alen) - { - ares_free_string(name.as_char); - return NULL; - } - - /* Parse the fixed part of the RR, and advance to the RR data - * field. */ - type = DNS_RR_TYPE(aptr); - dnsclass = DNS_RR_CLASS(aptr); - ttl = DNS_RR_TTL(aptr); - dlen = DNS_RR_LEN(aptr); - aptr += RRFIXEDSZ; - if (aptr + dlen > abuf + alen) - { - ares_free_string(name.as_char); - return NULL; - } - - /* Display the RR name, class, and type. */ - printf("\t%-15s.\t%d", name.as_char, ttl); - if (dnsclass != C_IN) - printf("\t%s", class_name(dnsclass)); - printf("\t%s", type_name(type)); - ares_free_string(name.as_char); - - /* Display the RR data. Don't touch aptr. */ - switch (type) - { - case T_CNAME: - case T_MB: - case T_MD: - case T_MF: - case T_MG: - case T_MR: - case T_NS: - case T_PTR: - /* For these types, the RR data is just a domain name. */ - status = ares_expand_name(aptr, abuf, alen, &name.as_char, &len); - if (status != ARES_SUCCESS) - return NULL; - printf("\t%s.", name.as_char); - ares_free_string(name.as_char); - break; - - case T_HINFO: - /* The RR data is two length-counted character strings. */ - p = aptr; - len = *p; - if (p + len + 1 > aptr + dlen) - return NULL; - status = ares_expand_string(p, abuf, alen, &name.as_uchar, &len); - if (status != ARES_SUCCESS) - return NULL; - printf("\t%s", name.as_char); - ares_free_string(name.as_char); - p += len; - len = *p; - if (p + len + 1 > aptr + dlen) - return NULL; - status = ares_expand_string(p, abuf, alen, &name.as_uchar, &len); - if (status != ARES_SUCCESS) - return NULL; - printf("\t%s", name.as_char); - ares_free_string(name.as_char); - break; - - case T_MINFO: - /* The RR data is two domain names. */ - p = aptr; - status = ares_expand_name(p, abuf, alen, &name.as_char, &len); - if (status != ARES_SUCCESS) - return NULL; - printf("\t%s.", name.as_char); - ares_free_string(name.as_char); - p += len; - status = ares_expand_name(p, abuf, alen, &name.as_char, &len); - if (status != ARES_SUCCESS) - return NULL; - printf("\t%s.", name.as_char); - ares_free_string(name.as_char); - break; - - case T_MX: - /* The RR data is two bytes giving a preference ordering, and - * then a domain name. - */ - if (dlen < 2) - return NULL; - printf("\t%d", (int)DNS__16BIT(aptr)); - status = ares_expand_name(aptr + 2, abuf, alen, &name.as_char, &len); - if (status != ARES_SUCCESS) - return NULL; - printf("\t%s.", name.as_char); - ares_free_string(name.as_char); - break; - - case T_SOA: - /* The RR data is two domain names and then five four-byte - * numbers giving the serial number and some timeouts. - */ - p = aptr; - status = ares_expand_name(p, abuf, alen, &name.as_char, &len); - if (status != ARES_SUCCESS) - return NULL; - printf("\t%s.\n", name.as_char); - ares_free_string(name.as_char); - p += len; - status = ares_expand_name(p, abuf, alen, &name.as_char, &len); - if (status != ARES_SUCCESS) - return NULL; - printf("\t\t\t\t\t\t%s.\n", name.as_char); - ares_free_string(name.as_char); - p += len; - if (p + 20 > aptr + dlen) - return NULL; - printf("\t\t\t\t\t\t( %u %u %u %u %u )", - DNS__32BIT(p), DNS__32BIT(p+4), - DNS__32BIT(p+8), DNS__32BIT(p+12), - DNS__32BIT(p+16)); - break; - - case T_TXT: - /* The RR data is one or more length-counted character - * strings. */ - p = aptr; - while (p < aptr + dlen) - { - len = *p; - if (p + len + 1 > aptr + dlen) - return NULL; - status = ares_expand_string(p, abuf, alen, &name.as_uchar, &len); - if (status != ARES_SUCCESS) - return NULL; - printf("\t%s", name.as_char); - ares_free_string(name.as_char); - p += len; - } - break; - - case T_CAA: - - p = aptr; - - /* Flags */ - printf(" %u", (int)*p); - p += 1; - - /* Remainder of record */ - vlen = (int)dlen - ((char)*p) - 2; - - /* The Property identifier, one of: - - "issue", - - "iodef", or - - "issuewild" */ - status = ares_expand_string(p, abuf, alen, &name.as_uchar, &len); - if (status != ARES_SUCCESS) - return NULL; - printf(" %s", name.as_char); - ares_free_string(name.as_char); - p += len; - - if (p + vlen > abuf + alen) - return NULL; - - /* A sequence of octets representing the Property Value */ - printf(" %.*s", vlen, p); - break; - - case T_A: - /* The RR data is a four-byte Internet address. */ - if (dlen != 4) - return NULL; - printf("\t%s", ares_inet_ntop(AF_INET,aptr,addr,sizeof(addr))); - break; - - case T_AAAA: - /* The RR data is a 16-byte IPv6 address. */ - if (dlen != 16) - return NULL; - printf("\t%s", ares_inet_ntop(AF_INET6,aptr,addr,sizeof(addr))); - break; - - case T_WKS: - /* Not implemented yet */ - break; - - case T_SRV: - /* The RR data is three two-byte numbers representing the - * priority, weight, and port, followed by a domain name. - */ - - printf("\t%d", (int)DNS__16BIT(aptr)); - printf(" %d", (int)DNS__16BIT(aptr + 2)); - printf(" %d", (int)DNS__16BIT(aptr + 4)); - - status = ares_expand_name(aptr + 6, abuf, alen, &name.as_char, &len); - if (status != ARES_SUCCESS) - return NULL; - printf("\t%s.", name.as_char); - ares_free_string(name.as_char); - break; - - case T_URI: - /* The RR data is two two-byte numbers representing the - * priority and weight, followed by a target. - */ - - printf("\t%d ", (int)DNS__16BIT(aptr)); - printf("%d \t\t", (int)DNS__16BIT(aptr+2)); - p = aptr +4; - for (i=0; i "d.c.b.a".in-addr.arpa" for an IPv4 address. - * "a.b.c....x.y.z" -> "z.y.x....c.d.e.IP6.ARPA" for an IPv6 address. - * - * An example from 'dig -x PTR 2001:470:1:1b9::31': - * - * QUESTION SECTION: - * 1.3.0.0.0.0.0.0.0.0.0.0.0.0.0.0.9.b.1.0.1.0.0.0.0.7.4.0.1.0.0.2.IP6.ARPA. IN PTR - * - * ANSWER SECTION: - * 1.3.0.0.0.0.0.0.0.0.0.0.0.0.0.0.9.b.1.0.1.0.0.0.0.7.4.0.1.0.0.2.IP6.ARPA. 254148 IN PTR ipv6.cybernode.com. - * - * If 'use_bitstring == 1', try to use the more compact RFC-2673 bitstring format. - * Thus the above 'dig' query should become: - * [x13000000000000009b10100007401002].IP6.ARPA. IN PTR - */ -static int convert_query (char **name_p, int use_bitstring) -{ -#ifndef MAX_IP6_RR -#define MAX_IP6_RR (16*sizeof(".x.x") + sizeof(".IP6.ARPA") + 1) -#endif - -#ifdef HAVE_INET_PTON - #define ACCEPTED_RETVAL4 1 - #define ACCEPTED_RETVAL6 1 -#else - #define ACCEPTED_RETVAL4 32 - #define ACCEPTED_RETVAL6 128 -#endif - - static char new_name [MAX_IP6_RR]; - static const char hex_chars[] = "0123456789ABCDEF"; - - union { - struct in_addr addr4; - struct ares_in6_addr addr6; - } addr; - - if (ares_inet_pton (AF_INET, *name_p, &addr.addr4) == 1) - { - unsigned long laddr = ntohl(addr.addr4.s_addr); - unsigned long a1 = (laddr >> 24UL) & 0xFFUL; - unsigned long a2 = (laddr >> 16UL) & 0xFFUL; - unsigned long a3 = (laddr >> 8UL) & 0xFFUL; - unsigned long a4 = laddr & 0xFFUL; - - snprintf(new_name, sizeof(new_name), "%lu.%lu.%lu.%lu.in-addr.arpa", a4, a3, a2, a1); - *name_p = new_name; - return (1); - } - - if (ares_inet_pton(AF_INET6, *name_p, &addr.addr6) == 1) - { - char *c = new_name; - const unsigned char *ip = (const unsigned char*) &addr.addr6; - int max_i = (int)sizeof(addr.addr6) - 1; - int i, hi, lo; - - /* Use the more compact RFC-2673 notation? - * Currently doesn't work or unsupported by the DNS-servers I've tested against. - */ - if (use_bitstring) - { - *c++ = '\\'; - *c++ = '['; - *c++ = 'x'; - for (i = max_i; i >= 0; i--) - { - hi = ip[i] >> 4; - lo = ip[i] & 15; - *c++ = hex_chars [lo]; - *c++ = hex_chars [hi]; - } - strcpy (c, "].IP6.ARPA"); - } - else - { - for (i = max_i; i >= 0; i--) - { - hi = ip[i] >> 4; - lo = ip[i] & 15; - *c++ = hex_chars [lo]; - *c++ = '.'; - *c++ = hex_chars [hi]; - *c++ = '.'; - } - strcpy (c, "IP6.ARPA"); - } - *name_p = new_name; - return (1); - } - printf("Address %s was not legal for this query.\n", *name_p); - return (0); -} - -static const char *type_name(int type) -{ - int i; - - for (i = 0; i < ntypes; i++) - { - if (types[i].value == type) - return types[i].name; - } - return "(unknown)"; -} - -static const char *class_name(int dnsclass) -{ - int i; - - for (i = 0; i < nclasses; i++) - { - if (classes[i].value == dnsclass) - return classes[i].name; - } - return "(unknown)"; -} - -static void usage(void) -{ - fprintf(stderr, "usage: adig [-h] [-d] [-f flag] [-s server] [-c class] " - "[-t type] [-T|U port] [-x|-xx] name ...\n"); - exit(1); -} - -static void destroy_addr_list(struct ares_addr_node *head) -{ - while(head) - { - struct ares_addr_node *detached = head; - head = head->next; - free(detached); - } -} - -static void append_addr_list(struct ares_addr_node **head, - struct ares_addr_node *node) -{ - struct ares_addr_node *last; - node->next = NULL; - if(*head) - { - last = *head; - while(last->next) - last = last->next; - last->next = node; - } - else - *head = node; -} - - -/* Information from the man page. Formatting taken from man -h */ -static void print_help_info_adig(void) { - printf("adig, version %s\n\n", ARES_VERSION_STR); - printf("usage: adig [-h] [-d] [-f flag] [[-s server] ...] [-T|U port] [-c class] [-t type] [-x|-xx] name ...\n\n" - " h : Display this help and exit.\n" - " d : Print some extra debugging output.\n\n" - " f flag : Add a behavior control flag. Possible values are\n" - " igntc - ignore to query in TCP to get truncated UDP answer,\n" - " noaliases - don't honor the HOSTALIASES environment variable,\n" - " norecurse - don't query upstream servers recursively,\n" - " primary - use the first server,\n" - " stayopen - don't close the communication sockets, and\n" - " usevc - use TCP only.\n" - " s server : Connect to the specified DNS server, instead of the system's default one(s).\n" - " Servers are tried in round-robin, if the previous one failed.\n" - " T port : Connect to the specified TCP port of DNS server.\n" - " U port : Connect to the specified UDP port of DNS server.\n" - " c class : Set the query class. Possible values for class are ANY, CHAOS, HS and IN (default)\n" - " t type : Query records of the specified type.\n" - " Possible values for type are A (default), AAAA, AFSDB, ANY, AXFR,\n" - " CNAME, GPOS, HINFO, ISDN, KEY, LOC, MAILA, MAILB, MB, MD, MF, MG,\n" - " MINFO, MR, MX, NAPTR, NS, NSAP, NSAP_PTR, NULL, PTR, PX, RP, RT,\n" - " SIG, SOA, SRV, TXT, URI, WKS and X25.\n\n" - " -x : For a '-t PTR a.b.c.d' lookup, query for 'd.c.b.a.in-addr.arpa.'\n" - " -xx : As above, but for IPv6, compact the format into a bitstring like\n" - " '[xabcdef00000000000000000000000000].IP6.ARPA.'\n"); - exit(0); -} diff --git a/lib/c-ares-1.19.1/src/tools/ahost.c b/lib/c-ares-1.19.1/src/tools/ahost.c deleted file mode 100644 index 8ac2106698b..00000000000 --- a/lib/c-ares-1.19.1/src/tools/ahost.c +++ /dev/null @@ -1,228 +0,0 @@ -/* Copyright 1998 by the Massachusetts Institute of Technology. - * - * - * 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. - */ - -#include "ares_setup.h" - -#if !defined(WIN32) || defined(WATT32) -#include -#include -#include -#endif - -#ifdef HAVE_STRINGS_H -#include -#endif - -#include "ares.h" -#include "ares_dns.h" -#include "ares_getopt.h" -#include "ares_ipv6.h" -#include "ares_nowarn.h" - -#ifndef HAVE_STRDUP -# include "ares_strdup.h" -# define strdup(ptr) ares_strdup(ptr) -#endif - -#ifndef HAVE_STRCASECMP -# include "ares_strcasecmp.h" -# define strcasecmp(p1,p2) ares_strcasecmp(p1,p2) -#endif - -#ifndef HAVE_STRNCASECMP -# include "ares_strcasecmp.h" -# define strncasecmp(p1,p2,n) ares_strncasecmp(p1,p2,n) -#endif - -static void callback(void *arg, int status, int timeouts, struct hostent *host); -static void usage(void); -static void print_help_info_ahost(void); - -int main(int argc, char **argv) -{ - struct ares_options options; - int optmask = 0; - ares_channel channel; - int status, nfds, c, addr_family = AF_INET; - fd_set read_fds, write_fds; - struct timeval *tvp, tv; - struct in_addr addr4; - struct ares_in6_addr addr6; - -#ifdef USE_WINSOCK - WORD wVersionRequested = MAKEWORD(USE_WINSOCK,USE_WINSOCK); - WSADATA wsaData; - WSAStartup(wVersionRequested, &wsaData); -#endif - - memset(&options, 0, sizeof(options)); - - status = ares_library_init(ARES_LIB_INIT_ALL); - if (status != ARES_SUCCESS) - { - fprintf(stderr, "ares_library_init: %s\n", ares_strerror(status)); - return 1; - } - - while ((c = ares_getopt(argc,argv,"dt:h?s:")) != -1) - { - switch (c) - { - case 'd': -#ifdef WATT32 - dbug_init(); -#endif - break; - case 's': - optmask |= ARES_OPT_DOMAINS; - options.ndomains++; - options.domains = (char **)realloc(options.domains, - options.ndomains * sizeof(char *)); - options.domains[options.ndomains - 1] = strdup(optarg); - break; - case 't': - if (!strcasecmp(optarg,"a")) - addr_family = AF_INET; - else if (!strcasecmp(optarg,"aaaa")) - addr_family = AF_INET6; - else if (!strcasecmp(optarg,"u")) - addr_family = AF_UNSPEC; - else - usage(); - break; - case 'h': - print_help_info_ahost(); - break; - case '?': - print_help_info_ahost(); - break; - default: - usage(); - break; - } - } - - argc -= optind; - argv += optind; - if (argc < 1) - usage(); - - status = ares_init_options(&channel, &options, optmask); - if (status != ARES_SUCCESS) - { - fprintf(stderr, "ares_init: %s\n", ares_strerror(status)); - return 1; - } - - /* Initiate the queries, one per command-line argument. */ - for ( ; *argv; argv++) - { - if (ares_inet_pton(AF_INET, *argv, &addr4) == 1) - { - ares_gethostbyaddr(channel, &addr4, sizeof(addr4), AF_INET, callback, - *argv); - } - else if (ares_inet_pton(AF_INET6, *argv, &addr6) == 1) - { - ares_gethostbyaddr(channel, &addr6, sizeof(addr6), AF_INET6, callback, - *argv); - } - else - { - ares_gethostbyname(channel, *argv, addr_family, callback, *argv); - } - } - - /* Wait for all queries to complete. */ - for (;;) - { - int res; - FD_ZERO(&read_fds); - FD_ZERO(&write_fds); - nfds = ares_fds(channel, &read_fds, &write_fds); - if (nfds == 0) - break; - tvp = ares_timeout(channel, NULL, &tv); - res = select(nfds, &read_fds, &write_fds, NULL, tvp); - if (-1 == res) - break; - ares_process(channel, &read_fds, &write_fds); - } - - ares_destroy(channel); - - ares_library_cleanup(); - -#ifdef USE_WINSOCK - WSACleanup(); -#endif - - return 0; -} - -static void callback(void *arg, int status, int timeouts, struct hostent *host) -{ - char **p; - - (void)timeouts; - - if (status != ARES_SUCCESS) - { - fprintf(stderr, "%s: %s\n", (char *) arg, ares_strerror(status)); - return; - } - - for (p = host->h_addr_list; *p; p++) - { - char addr_buf[46] = "??"; - - ares_inet_ntop(host->h_addrtype, *p, addr_buf, sizeof(addr_buf)); - printf("%-32s\t%s", host->h_name, addr_buf); -#if 0 - if (host->h_aliases[0]) - { - int i; - - printf (", Aliases: "); - for (i = 0; host->h_aliases[i]; i++) - printf("%s ", host->h_aliases[i]); - } -#endif - puts(""); - } -} - -static void usage(void) -{ - fprintf(stderr, "usage: ahost [-h] [-d] [-s {domain}] [-t {a|aaaa|u}] {host|addr} ...\n"); - exit(1); -} - -/* Information from the man page. Formatting taken from man -h */ -static void print_help_info_ahost(void) { - printf("ahost, version %s\n\n", ARES_VERSION_STR); - printf("usage: ahost [-h] [-d] [[-s domain] ...] [-t a|aaaa|u] host|addr ...\n\n" - " h : Display this help and exit.\n" - " d : Print some extra debugging output.\n\n" - " s domain : Specify the domain to search instead of using the default values\n" - " from /etc/resolv.conf. This option only has an effect on\n" - " platforms that use /etc/resolv.conf for DNS configuration;\n" - " it has no effect on other platforms (such as Win32 or Android).\n\n" - " t type : If type is \"a\", print the A record (default).\n" - " If type is \"aaaa\", print the AAAA record.\n" - " If type is \"u\", look for either AAAA or A record (in that order).\n\n"); - exit(0); -} diff --git a/lib/c-ares-1.19.1/src/tools/ares_getopt.c b/lib/c-ares-1.19.1/src/tools/ares_getopt.c deleted file mode 100644 index 1e02d086866..00000000000 --- a/lib/c-ares-1.19.1/src/tools/ares_getopt.c +++ /dev/null @@ -1,122 +0,0 @@ -/* - * Original file name getopt.c Initial import into the c-ares source tree - * on 2007-04-11. Lifted from version 5.2 of the 'Open Mash' project with - * the modified BSD license, BSD license without the advertising clause. - * - */ - -/* - * getopt.c -- - * - * Standard UNIX getopt function. Code is from BSD. - * - * Copyright (c) 1987-2001 The Regents of the University of California. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * A. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * B. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * C. Neither the names of the copyright holders nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS - * IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -/* #if !defined(lint) - * static char sccsid[] = "@(#)getopt.c 8.2 (Berkeley) 4/2/94"; - * #endif - */ - -#include -#include -#include -#include "ares_getopt.h" - -int opterr = 1, /* if error message should be printed */ - optind = 1; /* index into parent argv vector */ -int optopt = 0; /* character checked for validity */ -static int optreset; /* reset getopt */ -char *optarg; /* argument associated with option */ - -#define BADCH (int)'?' -#define BADARG (int)':' -#define EMSG (char *)"" - -/* - * ares_getopt -- - * Parse argc/argv argument vector. - */ -int -ares_getopt(int nargc, char * const nargv[], const char *ostr) -{ - static char *place = EMSG; /* option letter processing */ - char *oli; /* option letter list index */ - - if (optreset || !*place) { /* update scanning pointer */ - optreset = 0; - if (optind >= nargc || *(place = nargv[optind]) != '-') { - place = EMSG; - return (EOF); - } - if (place[1] && *++place == '-') { /* found "--" */ - ++optind; - place = EMSG; - return (EOF); - } - } /* option letter okay? */ - if ((optopt = (int)*place++) == (int)':' || - (oli = strchr(ostr, optopt)) == NULL) { - /* - * if the user didn't specify '-' as an option, - * assume it means EOF. - */ - if (optopt == (int)'-') - return (EOF); - if (!*place) - ++optind; - if (opterr && *ostr != ':') - (void)fprintf(stderr, - "%s: illegal option -- %c\n", __FILE__, optopt); - return (BADCH); - } - if (*++oli != ':') { /* don't need argument */ - optarg = NULL; - if (!*place) - ++optind; - } - else { /* need an argument */ - if (*place) /* no white space */ - optarg = place; - else if (nargc <= ++optind) { /* no arg */ - place = EMSG; - if (*ostr == ':') - return (BADARG); - if (opterr) - (void)fprintf(stderr, - "%s: option requires an argument -- %c\n", - __FILE__, optopt); - return (BADCH); - } - else /* white space */ - optarg = nargv[optind]; - place = EMSG; - ++optind; - } - return (optopt); /* dump back option letter */ -} diff --git a/lib/c-ares-1.19.1/test/ares-fuzz.c b/lib/c-ares-1.19.1/test/ares-fuzz.c deleted file mode 100644 index 5526f46284e..00000000000 --- a/lib/c-ares-1.19.1/test/ares-fuzz.c +++ /dev/null @@ -1,63 +0,0 @@ -/* - * General driver to allow command-line fuzzer (i.e. afl) to - * exercise the libFuzzer entrypoint. - */ - -#include -#include -#include -#include -#include -#ifdef WIN32 -#include -#else -#include -#endif - -#define kMaxAflInputSize (1 << 20) -static unsigned char afl_buffer[kMaxAflInputSize]; - -#ifdef __AFL_LOOP -/* If we are built with afl-clang-fast, use persistent mode */ -#define KEEP_FUZZING(count) __AFL_LOOP(1000) -#else -/* If we are built with afl-clang, execute each input once */ -#define KEEP_FUZZING(count) ((count) < 1) -#endif - -/* In ares-test-fuzz.c and ares-test-fuzz-name.c: */ -int LLVMFuzzerTestOneInput(const unsigned char *data, unsigned long size); - -static void ProcessFile(int fd) { - int count = read(fd, afl_buffer, kMaxAflInputSize); - /* - * Make a copy of the data so that it's not part of a larger - * buffer (where buffer overflows would go unnoticed). - */ - unsigned char *copied_data = (unsigned char *)malloc(count); - memcpy(copied_data, afl_buffer, count); - LLVMFuzzerTestOneInput(copied_data, count); - free(copied_data); -} - -int main(int argc, char *argv[]) { - if (argc == 1) { - int count = 0; - while (KEEP_FUZZING(count)) { - ProcessFile(fileno(stdin)); - count++; - } - } else { - int ii; - for (ii = 1; ii < argc; ++ii) { - int fd = open(argv[ii], O_RDONLY); - if (fd < 0) { - fprintf(stderr, "Failed to open '%s'\n", argv[ii]); - continue; - } - ProcessFile(fd); - close(fd); - } - } - return 0; -} diff --git a/lib/c-ares-1.19.1/test/ares-test-ai.h b/lib/c-ares-1.19.1/test/ares-test-ai.h deleted file mode 100644 index 7cf27e33069..00000000000 --- a/lib/c-ares-1.19.1/test/ares-test-ai.h +++ /dev/null @@ -1,57 +0,0 @@ -#ifndef ARES_TEST_AI_H -#define ARES_TEST_AI_H - -#include -#include "gtest/gtest.h" -#include "gmock/gmock.h" -#include "ares-test.h" - -namespace ares { -namespace test { - -class MockChannelTestAI - : public MockChannelOptsTest, - public ::testing::WithParamInterface< std::pair > { - public: - MockChannelTestAI() : MockChannelOptsTest(1, GetParam().first, GetParam().second, nullptr, 0) {} -}; - -class MockUDPChannelTestAI - : public MockChannelOptsTest, - public ::testing::WithParamInterface { - public: - MockUDPChannelTestAI() : MockChannelOptsTest(1, GetParam(), false, nullptr, 0) {} -}; - -class MockTCPChannelTestAI - : public MockChannelOptsTest, - public ::testing::WithParamInterface { - public: - MockTCPChannelTestAI() : MockChannelOptsTest(1, GetParam(), true, nullptr, 0) {} -}; - - -// Test fixture that uses a default channel. -class DefaultChannelTestAI : public LibraryTest { - public: - DefaultChannelTestAI() : channel_(nullptr) { - EXPECT_EQ(ARES_SUCCESS, ares_init(&channel_)); - EXPECT_NE(nullptr, channel_); - } - - ~DefaultChannelTestAI() { - ares_destroy(channel_); - channel_ = nullptr; - } - - // Process all pending work on ares-owned file descriptors. - void Process(); - - protected: - ares_channel channel_; -}; - -} -} - -#endif diff --git a/lib/c-ares-1.19.1/test/ares-test-fuzz-name.c b/lib/c-ares-1.19.1/test/ares-test-fuzz-name.c deleted file mode 100644 index 82df74370c7..00000000000 --- a/lib/c-ares-1.19.1/test/ares-test-fuzz-name.c +++ /dev/null @@ -1,23 +0,0 @@ -#include -#include -#include - -#include "ares.h" -// Include ares internal file for DNS protocol constants -#include "ares_nameser.h" - -// Entrypoint for Clang's libfuzzer, exercising query creation. -int LLVMFuzzerTestOneInput(const unsigned char *data, - unsigned long size) { - // Null terminate the data. - char *name = malloc(size + 1); - name[size] = '\0'; - memcpy(name, data, size); - - unsigned char *buf = NULL; - int buflen = 0; - ares_create_query(name, C_IN, T_AAAA, 1234, 0, &buf, &buflen, 1024); - free(buf); - free(name); - return 0; -} diff --git a/lib/c-ares-1.19.1/test/ares-test-fuzz.c b/lib/c-ares-1.19.1/test/ares-test-fuzz.c deleted file mode 100644 index ddd6583c071..00000000000 --- a/lib/c-ares-1.19.1/test/ares-test-fuzz.c +++ /dev/null @@ -1,59 +0,0 @@ -#include - -#include "ares.h" - -// Entrypoint for Clang's libfuzzer -int LLVMFuzzerTestOneInput(const unsigned char *data, - unsigned long size) { - // Feed the data into each of the ares_parse_*_reply functions. - struct hostent *host = NULL; - struct ares_addrttl info[5]; - int count = 5; - ares_parse_a_reply(data, size, &host, info, &count); - if (host) ares_free_hostent(host); - - host = NULL; - struct ares_addr6ttl info6[5]; - count = 5; - ares_parse_aaaa_reply(data, size, &host, info6, &count); - if (host) ares_free_hostent(host); - - host = NULL; - unsigned char addrv4[4] = {0x10, 0x20, 0x30, 0x40}; - ares_parse_ptr_reply(data, size, addrv4, sizeof(addrv4), AF_INET, &host); - if (host) ares_free_hostent(host); - - host = NULL; - ares_parse_ns_reply(data, size, &host); - if (host) ares_free_hostent(host); - - struct ares_srv_reply* srv = NULL; - ares_parse_srv_reply(data, size, &srv); - if (srv) ares_free_data(srv); - - struct ares_mx_reply* mx = NULL; - ares_parse_mx_reply(data, size, &mx); - if (mx) ares_free_data(mx); - - struct ares_txt_reply* txt = NULL; - ares_parse_txt_reply(data, size, &txt); - if (txt) ares_free_data(txt); - - struct ares_soa_reply* soa = NULL; - ares_parse_soa_reply(data, size, &soa); - if (soa) ares_free_data(soa); - - struct ares_naptr_reply* naptr = NULL; - ares_parse_naptr_reply(data, size, &naptr); - if (naptr) ares_free_data(naptr); - - struct ares_caa_reply* caa = NULL; - ares_parse_caa_reply(data, size, &caa); - if (caa) ares_free_data(caa); - - struct ares_uri_reply* uri = NULL; - ares_parse_uri_reply(data, size, &uri); - if (uri) ares_free_data(uri); - - return 0; -} diff --git a/lib/c-ares-1.19.1/test/ares-test-internal.cc b/lib/c-ares-1.19.1/test/ares-test-internal.cc deleted file mode 100644 index 40cc82b86ec..00000000000 --- a/lib/c-ares-1.19.1/test/ares-test-internal.cc +++ /dev/null @@ -1,632 +0,0 @@ -#include "ares-test.h" -#include "dns-proto.h" - -#include - -#ifdef HAVE_UNISTD_H -#include -#endif -#include - -extern "C" { -// Remove command-line defines of package variables for the test project... -#undef PACKAGE_NAME -#undef PACKAGE_BUGREPORT -#undef PACKAGE_STRING -#undef PACKAGE_TARNAME -// ... so we can include the library's config without symbol redefinitions. -#include "ares_setup.h" -#include "ares_nowarn.h" -#include "ares_inet_net_pton.h" -#include "ares_data.h" -#include "ares_strsplit.h" -#include "ares_private.h" -#include "bitncmp.h" - -#ifdef HAVE_ARPA_INET_H -#include -#endif -#ifdef HAVE_SYS_UIO_H -# include -#endif -} - -#include -#include - -namespace ares { -namespace test { - -#ifndef CARES_SYMBOL_HIDING -void CheckPtoN4(int size, unsigned int value, const char *input) { - struct in_addr a4; - a4.s_addr = 0; - uint32_t expected = htonl(value); - EXPECT_EQ(size, ares_inet_net_pton(AF_INET, input, &a4, sizeof(a4))) - << " for input " << input; - EXPECT_EQ(expected, a4.s_addr) << " for input " << input; -} -#endif - -#ifndef CARES_SYMBOL_HIDING -TEST_F(LibraryTest, Strsplit) { - using std::vector; - using std::string; - size_t n; - struct { - vector inputs; - vector delimiters; - vector> expected; - } data = { - { - "", - " ", - " ", - "example.com, example.co", - " a, b, A,c, d, e,,,D,e,e,E", - }, - { ", ", ", ", ", ", ", ", ", " }, - { - {}, {}, {}, - { "example.com", "example.co" }, - { "a", "b", "c", "d", "e" }, - }, - }; - for(size_t i = 0; i < data.inputs.size(); i++) { - char **out = ares__strsplit(data.inputs.at(i).c_str(), - data.delimiters.at(i).c_str(), &n); - if(data.expected.at(i).size() == 0) { - EXPECT_EQ(out, nullptr); - } - else { - EXPECT_EQ(n, data.expected.at(i).size()); - for(size_t j = 0; j < n && j < data.expected.at(i).size(); j++) { - EXPECT_STREQ(out[j], data.expected.at(i).at(j).c_str()); - } - } - ares__strsplit_free(out, n); - } -} -#endif - -TEST_F(LibraryTest, InetPtoN) { - struct in_addr a4; - struct in6_addr a6; - -#ifndef CARES_SYMBOL_HIDING - uint32_t expected; - - CheckPtoN4(4 * 8, 0x01020304, "1.2.3.4"); - CheckPtoN4(4 * 8, 0x81010101, "129.1.1.1"); - CheckPtoN4(4 * 8, 0xC0010101, "192.1.1.1"); - CheckPtoN4(4 * 8, 0xE0010101, "224.1.1.1"); - CheckPtoN4(4 * 8, 0xE1010101, "225.1.1.1"); - CheckPtoN4(4, 0xE0000000, "224"); - CheckPtoN4(4 * 8, 0xFD000000, "253"); - CheckPtoN4(4 * 8, 0xF0010101, "240.1.1.1"); - CheckPtoN4(4 * 8, 0x02030405, "02.3.4.5"); - CheckPtoN4(3 * 8, 0x01020304, "1.2.3.4/24"); - CheckPtoN4(3 * 8, 0x01020300, "1.2.3/24"); - CheckPtoN4(2 * 8, 0xa0000000, "0xa"); - CheckPtoN4(0, 0x02030405, "2.3.4.5/000"); - CheckPtoN4(1 * 8, 0x01020000, "1.2/8"); - CheckPtoN4(2 * 8, 0x01020000, "0x0102/16"); - CheckPtoN4(4 * 8, 0x02030405, "02.3.4.5"); - - EXPECT_EQ(16 * 8, ares_inet_net_pton(AF_INET6, "::", &a6, sizeof(a6))); - EXPECT_EQ(16 * 8, ares_inet_net_pton(AF_INET6, "::1", &a6, sizeof(a6))); - EXPECT_EQ(16 * 8, ares_inet_net_pton(AF_INET6, "1234:5678::", &a6, sizeof(a6))); - EXPECT_EQ(16 * 8, ares_inet_net_pton(AF_INET6, "12:34::ff", &a6, sizeof(a6))); - EXPECT_EQ(16 * 8, ares_inet_net_pton(AF_INET6, "12:34::ffff:1.2.3.4", &a6, sizeof(a6))); - EXPECT_EQ(23, ares_inet_net_pton(AF_INET6, "12:34::ffff:1.2.3.4/23", &a6, sizeof(a6))); - EXPECT_EQ(3 * 8, ares_inet_net_pton(AF_INET6, "12:34::ff/24", &a6, sizeof(a6))); - EXPECT_EQ(0, ares_inet_net_pton(AF_INET6, "12:34::ff/0", &a6, sizeof(a6))); - EXPECT_EQ(16 * 8, ares_inet_net_pton(AF_INET6, "12:34::ffff:0.2", &a6, sizeof(a6))); - EXPECT_EQ(16 * 8, ares_inet_net_pton(AF_INET6, "1234:1234:1234:1234:1234:1234:1234:1234", &a6, sizeof(a6))); - EXPECT_EQ(2, ares_inet_net_pton(AF_INET6, "0::00:00:00/2", &a6, sizeof(a6))); - - // Various malformed versions - EXPECT_EQ(-1, ares_inet_net_pton(AF_INET, "", &a4, sizeof(a4))); - EXPECT_EQ(-1, ares_inet_net_pton(AF_INET, " ", &a4, sizeof(a4))); - EXPECT_EQ(-1, ares_inet_net_pton(AF_INET, "0x", &a4, sizeof(a4))); - EXPECT_EQ(-1, ares_inet_net_pton(AF_INET, "0x ", &a4, sizeof(a4))); - EXPECT_EQ(-1, ares_inet_net_pton(AF_INET, "x0", &a4, sizeof(a4))); - EXPECT_EQ(-1, ares_inet_net_pton(AF_INET, "0xXYZZY", &a4, sizeof(a4))); - EXPECT_EQ(-1, ares_inet_net_pton(AF_INET, "xyzzy", &a4, sizeof(a4))); - EXPECT_EQ(-1, ares_inet_net_pton(AF_INET+AF_INET6, "1.2.3.4", &a4, sizeof(a4))); - EXPECT_EQ(-1, ares_inet_net_pton(AF_INET, "257.2.3.4", &a4, sizeof(a4))); - EXPECT_EQ(-1, ares_inet_net_pton(AF_INET, "002.3.4.x", &a4, sizeof(a4))); - EXPECT_EQ(-1, ares_inet_net_pton(AF_INET, "00.3.4.x", &a4, sizeof(a4))); - EXPECT_EQ(-1, ares_inet_net_pton(AF_INET, "2.3.4.x", &a4, sizeof(a4))); - EXPECT_EQ(-1, ares_inet_net_pton(AF_INET, "2.3.4.5.6", &a4, sizeof(a4))); - EXPECT_EQ(-1, ares_inet_net_pton(AF_INET, "2.3.4.5.6/12", &a4, sizeof(a4))); - EXPECT_EQ(-1, ares_inet_net_pton(AF_INET, "2.3.4:5", &a4, sizeof(a4))); - EXPECT_EQ(-1, ares_inet_net_pton(AF_INET, "2.3.4.5/120", &a4, sizeof(a4))); - EXPECT_EQ(-1, ares_inet_net_pton(AF_INET, "2.3.4.5/1x", &a4, sizeof(a4))); - EXPECT_EQ(-1, ares_inet_net_pton(AF_INET, "2.3.4.5/x", &a4, sizeof(a4))); - EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, "12:34::ff/240", &a6, sizeof(a6))); - EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, "12:34::ff/02", &a6, sizeof(a6))); - EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, "12:34::ff/2y", &a6, sizeof(a6))); - EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, "12:34::ff/y", &a6, sizeof(a6))); - EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, "12:34::ff/", &a6, sizeof(a6))); - EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, "", &a6, sizeof(a6))); - EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, ":x", &a6, sizeof(a6))); - EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, ":", &a6, sizeof(a6))); - EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, ": :1234", &a6, sizeof(a6))); - EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, "::12345", &a6, sizeof(a6))); - EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, "1234::2345:3456::0011", &a6, sizeof(a6))); - EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, "1234:1234:1234:1234:1234:1234:1234:1234:", &a6, sizeof(a6))); - EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, "1234:1234:1234:1234:1234:1234:1234:1234::", &a6, sizeof(a6))); - EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, "1234:1234:1234:1234:1234:1234:1234:1.2.3.4", &a6, sizeof(a6))); - EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, ":1234:1234:1234:1234:1234:1234:1234:1234", &a6, sizeof(a6))); - EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, ":1234:1234:1234:1234:1234:1234:1234:1234:", &a6, sizeof(a6))); - EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, "1234:1234:1234:1234:1234:1234:1234:1234:5678", &a6, sizeof(a6))); - EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, "1234:1234:1234:1234:1234:1234:1234:1234:5678:5678", &a6, sizeof(a6))); - EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, "1234:1234:1234:1234:1234:1234:1234:1234:5678:5678:5678", &a6, sizeof(a6))); - EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, "12:34::ffff:257.2.3.4", &a6, sizeof(a6))); - EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, "12:34::ffff:1.2.3.4.5.6", &a6, sizeof(a6))); - EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, "12:34::ffff:1.2.3.4.5", &a6, sizeof(a6))); - EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, "12:34::ffff:1.2.3.z", &a6, sizeof(a6))); - EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, "12:34::ffff:1.2.3001.4", &a6, sizeof(a6))); - EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, "12:34::ffff:1.2.3..4", &a6, sizeof(a6))); - EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, "12:34::ffff:1.2.3.", &a6, sizeof(a6))); - - // Hex constants are allowed. - EXPECT_EQ(4 * 8, ares_inet_net_pton(AF_INET, "0x01020304", &a4, sizeof(a4))); - expected = htonl(0x01020304); - EXPECT_EQ(expected, a4.s_addr); - EXPECT_EQ(4 * 8, ares_inet_net_pton(AF_INET, "0x0a0b0c0d", &a4, sizeof(a4))); - expected = htonl(0x0a0b0c0d); - EXPECT_EQ(expected, a4.s_addr); - EXPECT_EQ(4 * 8, ares_inet_net_pton(AF_INET, "0x0A0B0C0D", &a4, sizeof(a4))); - expected = htonl(0x0a0b0c0d); - EXPECT_EQ(expected, a4.s_addr); - EXPECT_EQ(-1, ares_inet_net_pton(AF_INET, "0x0xyz", &a4, sizeof(a4))); - EXPECT_EQ(4 * 8, ares_inet_net_pton(AF_INET, "0x1122334", &a4, sizeof(a4))); - expected = htonl(0x11223340); - EXPECT_EQ(expected, a4.s_addr); // huh? - - // No room, no room. - EXPECT_EQ(-1, ares_inet_net_pton(AF_INET, "1.2.3.4", &a4, sizeof(a4) - 1)); - EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, "12:34::ff", &a6, sizeof(a6) - 1)); - EXPECT_EQ(-1, ares_inet_net_pton(AF_INET, "0x01020304", &a4, 2)); - EXPECT_EQ(-1, ares_inet_net_pton(AF_INET, "0x01020304", &a4, 0)); - EXPECT_EQ(-1, ares_inet_net_pton(AF_INET, "0x0a0b0c0d", &a4, 0)); - EXPECT_EQ(-1, ares_inet_net_pton(AF_INET, "0x0xyz", &a4, 0)); - EXPECT_EQ(-1, ares_inet_net_pton(AF_INET, "0x1122334", &a4, sizeof(a4) - 1)); - EXPECT_EQ(-1, ares_inet_net_pton(AF_INET, "253", &a4, sizeof(a4) - 1)); -#endif - - EXPECT_EQ(1, ares_inet_pton(AF_INET, "1.2.3.4", &a4)); - EXPECT_EQ(1, ares_inet_pton(AF_INET6, "12:34::ff", &a6)); - EXPECT_EQ(1, ares_inet_pton(AF_INET6, "12:34::ffff:1.2.3.4", &a6)); - EXPECT_EQ(0, ares_inet_pton(AF_INET, "xyzzy", &a4)); - EXPECT_EQ(-1, ares_inet_pton(AF_INET+AF_INET6, "1.2.3.4", &a4)); -} - -TEST_F(LibraryTest, FreeCorruptData) { - // ares_free_data(p) expects that there is a type field and a marker - // field in the memory before p. Feed it incorrect versions of each. - struct ares_data *data = (struct ares_data *)malloc(sizeof(struct ares_data)); - void* p = &(data->data); - - // Invalid type - data->type = (ares_datatype)99; - data->mark = ARES_DATATYPE_MARK; - ares_free_data(p); - - // Invalid marker - data->type = (ares_datatype)ARES_DATATYPE_MX_REPLY; - data->mark = ARES_DATATYPE_MARK + 1; - ares_free_data(p); - - // Null pointer - ares_free_data(nullptr); - - free(data); -} - -#ifndef CARES_SYMBOL_HIDING -TEST_F(LibraryTest, FreeLongChain) { - struct ares_addr_node *data = nullptr; - for (int ii = 0; ii < 100000; ii++) { - struct ares_addr_node *prev = (struct ares_addr_node*)ares_malloc_data(ARES_DATATYPE_ADDR_NODE); - prev->next = data; - data = prev; - } - - ares_free_data(data); -} - -TEST(LibraryInit, StrdupFailures) { - EXPECT_EQ(ARES_SUCCESS, ares_library_init(ARES_LIB_INIT_ALL)); - char* copy = ares_strdup("string"); - EXPECT_NE(nullptr, copy); - ares_free(copy); - ares_library_cleanup(); -} - -TEST_F(LibraryTest, StrdupFailures) { - SetAllocFail(1); - char* copy = ares_strdup("string"); - EXPECT_EQ(nullptr, copy); -} - -TEST_F(LibraryTest, MallocDataFail) { - EXPECT_EQ(nullptr, ares_malloc_data((ares_datatype)99)); - SetAllocSizeFail(sizeof(struct ares_data)); - EXPECT_EQ(nullptr, ares_malloc_data(ARES_DATATYPE_MX_REPLY)); -} - -TEST(Misc, Bitncmp) { - byte a[4] = {0x80, 0x01, 0x02, 0x03}; - byte b[4] = {0x80, 0x01, 0x02, 0x04}; - byte c[4] = {0x01, 0xFF, 0x80, 0x02}; - EXPECT_GT(0, ares__bitncmp(a, b, sizeof(a)*8)); - EXPECT_LT(0, ares__bitncmp(b, a, sizeof(a)*8)); - EXPECT_EQ(0, ares__bitncmp(a, a, sizeof(a)*8)); - - for (int ii = 1; ii < (3*8+5); ii++) { - EXPECT_EQ(0, ares__bitncmp(a, b, ii)); - EXPECT_EQ(0, ares__bitncmp(b, a, ii)); - EXPECT_LT(0, ares__bitncmp(a, c, ii)); - EXPECT_GT(0, ares__bitncmp(c, a, ii)); - } - - // Last byte differs at 5th bit - EXPECT_EQ(0, ares__bitncmp(a, b, 3*8 + 3)); - EXPECT_EQ(0, ares__bitncmp(a, b, 3*8 + 4)); - EXPECT_EQ(0, ares__bitncmp(a, b, 3*8 + 5)); - EXPECT_GT(0, ares__bitncmp(a, b, 3*8 + 6)); - EXPECT_GT(0, ares__bitncmp(a, b, 3*8 + 7)); -} - -TEST_F(LibraryTest, Casts) { - ares_ssize_t ssz = 100; - unsigned int u = 100; - int i = 100; - long l = 100; - - unsigned int ru = aresx_sztoui(ssz); - EXPECT_EQ(u, ru); - int ri = aresx_sztosi(ssz); - EXPECT_EQ(i, ri); - - ri = aresx_sltosi(l); - EXPECT_EQ(l, (long)ri); -} - -TEST_F(LibraryTest, ReadLine) { - TempFile temp("abcde\n0123456789\nXYZ\n012345678901234567890\n\n"); - FILE *fp = fopen(temp.filename(), "r"); - size_t bufsize = 4; - char *buf = (char *)ares_malloc(bufsize); - - EXPECT_EQ(ARES_SUCCESS, ares__read_line(fp, &buf, &bufsize)); - EXPECT_EQ("abcde", std::string(buf)); - EXPECT_EQ(ARES_SUCCESS, ares__read_line(fp, &buf, &bufsize)); - EXPECT_EQ("0123456789", std::string(buf)); - EXPECT_EQ(ARES_SUCCESS, ares__read_line(fp, &buf, &bufsize)); - EXPECT_EQ("XYZ", std::string(buf)); - SetAllocFail(1); - EXPECT_EQ(ARES_ENOMEM, ares__read_line(fp, &buf, &bufsize)); - EXPECT_EQ(nullptr, buf); - - fclose(fp); - ares_free(buf); -} - -TEST_F(LibraryTest, ReadLineNoBuf) { - TempFile temp("abcde\n0123456789\nXYZ\n012345678901234567890"); - FILE *fp = fopen(temp.filename(), "r"); - size_t bufsize = 0; - char *buf = nullptr; - - SetAllocFail(1); - EXPECT_EQ(ARES_ENOMEM, ares__read_line(fp, &buf, &bufsize)); - - EXPECT_EQ(ARES_SUCCESS, ares__read_line(fp, &buf, &bufsize)); - EXPECT_EQ("abcde", std::string(buf)); - EXPECT_EQ(ARES_SUCCESS, ares__read_line(fp, &buf, &bufsize)); - EXPECT_EQ("0123456789", std::string(buf)); - EXPECT_EQ(ARES_SUCCESS, ares__read_line(fp, &buf, &bufsize)); - EXPECT_EQ("XYZ", std::string(buf)); - EXPECT_EQ(ARES_SUCCESS, ares__read_line(fp, &buf, &bufsize)); - EXPECT_EQ("012345678901234567890", std::string(buf)); - - fclose(fp); - ares_free(buf); -} - -TEST(Misc, GetHostent) { - TempFile hostsfile("1.2.3.4 example.com \n" - " 2.3.4.5\tgoogle.com www.google.com\twww2.google.com\n" - "#comment\n" - "4.5.6.7\n" - "1.3.5.7 \n" - "::1 ipv6.com"); - struct hostent *host = nullptr; - FILE *fp = fopen(hostsfile.filename(), "r"); - ASSERT_NE(nullptr, fp); - EXPECT_EQ(ARES_EBADFAMILY, ares__get_hostent(fp, AF_INET+AF_INET6, &host)); - rewind(fp); - - EXPECT_EQ(ARES_SUCCESS, ares__get_hostent(fp, AF_INET, &host)); - ASSERT_NE(nullptr, host); - std::stringstream ss1; - ss1 << HostEnt(host); - EXPECT_EQ("{'example.com' aliases=[] addrs=[1.2.3.4]}", ss1.str()); - ares_free_hostent(host); - host = nullptr; - - EXPECT_EQ(ARES_SUCCESS, ares__get_hostent(fp, AF_INET, &host)); - ASSERT_NE(nullptr, host); - std::stringstream ss2; - ss2 << HostEnt(host); - EXPECT_EQ("{'google.com' aliases=[www.google.com, www2.google.com] addrs=[2.3.4.5]}", ss2.str()); - ares_free_hostent(host); - host = nullptr; - - EXPECT_EQ(ARES_EOF, ares__get_hostent(fp, AF_INET, &host)); - - rewind(fp); - EXPECT_EQ(ARES_SUCCESS, ares__get_hostent(fp, AF_INET6, &host)); - ASSERT_NE(nullptr, host); - std::stringstream ss3; - ss3 << HostEnt(host); - EXPECT_EQ("{'ipv6.com' aliases=[] addrs=[0000:0000:0000:0000:0000:0000:0000:0001]}", ss3.str()); - ares_free_hostent(host); - host = nullptr; - EXPECT_EQ(ARES_EOF, ares__get_hostent(fp, AF_INET6, &host)); - fclose(fp); -} - -TEST_F(LibraryTest, GetHostentAllocFail) { - TempFile hostsfile("1.2.3.4 example.com alias1 alias2\n"); - struct hostent *host = nullptr; - FILE *fp = fopen(hostsfile.filename(), "r"); - ASSERT_NE(nullptr, fp); - - for (int ii = 1; ii <= 8; ii++) { - rewind(fp); - ClearFails(); - SetAllocFail(ii); - host = nullptr; - EXPECT_EQ(ARES_ENOMEM, ares__get_hostent(fp, AF_INET, &host)) << ii; - } - fclose(fp); -} - -TEST_F(DefaultChannelTest, GetAddrInfoHostsPositive) { - TempFile hostsfile("1.2.3.4 example.com \n" - " 2.3.4.5\tgoogle.com www.google.com\twww2.google.com\n" - "#comment\n" - "4.5.6.7\n" - "1.3.5.7 \n" - "::1 ipv6.com"); - EnvValue with_env("CARES_HOSTS", hostsfile.filename()); - struct ares_addrinfo_hints hints = {}; - AddrInfoResult result = {}; - hints.ai_family = AF_INET; - hints.ai_flags = ARES_AI_CANONNAME | ARES_AI_ENVHOSTS | ARES_AI_NOSORT; - ares_getaddrinfo(channel_, "example.com", NULL, &hints, AddrInfoCallback, &result); - Process(); - EXPECT_TRUE(result.done_); - std::stringstream ss; - ss << result.ai_; - EXPECT_EQ("{example.com addr=[1.2.3.4]}", ss.str()); -} - -TEST_F(DefaultChannelTest, GetAddrInfoHostsSpaces) { - TempFile hostsfile("1.2.3.4 example.com \n" - " 2.3.4.5\tgoogle.com www.google.com\twww2.google.com\n" - "#comment\n" - "4.5.6.7\n" - "1.3.5.7 \n" - "::1 ipv6.com"); - EnvValue with_env("CARES_HOSTS", hostsfile.filename()); - struct ares_addrinfo_hints hints = {}; - AddrInfoResult result = {}; - hints.ai_family = AF_INET; - hints.ai_flags = ARES_AI_CANONNAME | ARES_AI_ENVHOSTS | ARES_AI_NOSORT; - ares_getaddrinfo(channel_, "google.com", NULL, &hints, AddrInfoCallback, &result); - Process(); - EXPECT_TRUE(result.done_); - std::stringstream ss; - ss << result.ai_; - EXPECT_EQ("{www.google.com->google.com, www2.google.com->google.com addr=[2.3.4.5]}", ss.str()); -} - -TEST_F(DefaultChannelTest, GetAddrInfoHostsByALias) { - TempFile hostsfile("1.2.3.4 example.com \n" - " 2.3.4.5\tgoogle.com www.google.com\twww2.google.com\n" - "#comment\n" - "4.5.6.7\n" - "1.3.5.7 \n" - "::1 ipv6.com"); - EnvValue with_env("CARES_HOSTS", hostsfile.filename()); - struct ares_addrinfo_hints hints = {}; - AddrInfoResult result = {}; - hints.ai_family = AF_INET; - hints.ai_flags = ARES_AI_CANONNAME | ARES_AI_ENVHOSTS | ARES_AI_NOSORT; - ares_getaddrinfo(channel_, "www2.google.com", NULL, &hints, AddrInfoCallback, &result); - Process(); - EXPECT_TRUE(result.done_); - std::stringstream ss; - ss << result.ai_; - EXPECT_EQ("{www.google.com->google.com, www2.google.com->google.com addr=[2.3.4.5]}", ss.str()); -} - -TEST_F(DefaultChannelTest, GetAddrInfoHostsIPV6) { - TempFile hostsfile("1.2.3.4 example.com \n" - " 2.3.4.5\tgoogle.com www.google.com\twww2.google.com\n" - "#comment\n" - "4.5.6.7\n" - "1.3.5.7 \n" - "::1 ipv6.com"); - EnvValue with_env("CARES_HOSTS", hostsfile.filename()); - struct ares_addrinfo_hints hints = {}; - AddrInfoResult result = {}; - hints.ai_family = AF_INET6; - hints.ai_flags = ARES_AI_CANONNAME | ARES_AI_ENVHOSTS | ARES_AI_NOSORT; - ares_getaddrinfo(channel_, "ipv6.com", NULL, &hints, AddrInfoCallback, &result); - Process(); - EXPECT_TRUE(result.done_); - std::stringstream ss; - ss << result.ai_; - EXPECT_EQ("{ipv6.com addr=[[0000:0000:0000:0000:0000:0000:0000:0001]]}", ss.str()); -} - -TEST_F(LibraryTest, GetAddrInfoAllocFail) { - TempFile hostsfile("1.2.3.4 example.com alias1 alias2\n"); - struct ares_addrinfo_hints hints; - unsigned short port = 80; - - memset(&hints, 0, sizeof(hints)); - hints.ai_family = AF_INET; - - FILE *fp = fopen(hostsfile.filename(), "r"); - ASSERT_NE(nullptr, fp); - - for (int ii = 1; ii <= 3; ii++) { - rewind(fp); - ClearFails(); - SetAllocFail(ii); - struct ares_addrinfo ai; - EXPECT_EQ(ARES_ENOMEM, ares__readaddrinfo(fp, "example.com", port, &hints, &ai)) << ii; - } - fclose(fp); -} - -TEST(Misc, OnionDomain) { - EXPECT_EQ(0, ares__is_onion_domain("onion.no")); - EXPECT_EQ(0, ares__is_onion_domain(".onion.no")); - EXPECT_EQ(1, ares__is_onion_domain(".onion")); - EXPECT_EQ(1, ares__is_onion_domain(".onion.")); - EXPECT_EQ(1, ares__is_onion_domain("yes.onion")); - EXPECT_EQ(1, ares__is_onion_domain("yes.onion.")); - EXPECT_EQ(1, ares__is_onion_domain("YES.ONION")); - EXPECT_EQ(1, ares__is_onion_domain("YES.ONION.")); -} -#endif - -#ifdef CARES_EXPOSE_STATICS -// These tests access internal static functions from the library, which -// are only exposed when CARES_EXPOSE_STATICS has been configured. As such -// they are tightly couple to the internal library implementation details. -extern "C" char *ares_striendstr(const char*, const char*); -TEST_F(LibraryTest, Striendstr) { - EXPECT_EQ(nullptr, ares_striendstr("abc", "12345")); - EXPECT_NE(nullptr, ares_striendstr("abc12345", "12345")); - EXPECT_NE(nullptr, ares_striendstr("abcxyzzy", "XYZZY")); - EXPECT_NE(nullptr, ares_striendstr("xyzzy", "XYZZY")); - EXPECT_EQ(nullptr, ares_striendstr("xyxzy", "XYZZY")); - EXPECT_NE(nullptr, ares_striendstr("", "")); - const char *str = "plugh"; - EXPECT_NE(nullptr, ares_striendstr(str, str)); -} -extern "C" int ares__single_domain(ares_channel, const char*, char**); -TEST_F(DefaultChannelTest, SingleDomain) { - TempFile aliases("www www.google.com\n"); - EnvValue with_env("HOSTALIASES", aliases.filename()); - - SetAllocSizeFail(128); - char *ptr = nullptr; - EXPECT_EQ(ARES_ENOMEM, ares__single_domain(channel_, "www", &ptr)); - - channel_->flags |= ARES_FLAG_NOSEARCH|ARES_FLAG_NOALIASES; - EXPECT_EQ(ARES_SUCCESS, ares__single_domain(channel_, "www", &ptr)); - EXPECT_EQ("www", std::string(ptr)); - ares_free(ptr); - ptr = nullptr; - - SetAllocFail(1); - EXPECT_EQ(ARES_ENOMEM, ares__single_domain(channel_, "www", &ptr)); - EXPECT_EQ(nullptr, ptr); -} -#endif - -TEST_F(DefaultChannelTest, SaveInvalidChannel) { - int saved = channel_->nservers; - channel_->nservers = -1; - struct ares_options opts; - int optmask = 0; - EXPECT_EQ(ARES_ENODATA, ares_save_options(channel_, &opts, &optmask)); - channel_->nservers = saved; -} - -// Need to put this in own function due to nested lambda bug -// in VS2013. (C2888) -static int configure_socket(ares_socket_t s) { - // transposed from ares-process, simplified non-block setter. -#if defined(USE_BLOCKING_SOCKETS) - return 0; /* returns success */ -#elif defined(HAVE_FCNTL_O_NONBLOCK) - /* most recent unix versions */ - int flags; - flags = fcntl(s, F_GETFL, 0); - return fcntl(s, F_SETFL, flags | O_NONBLOCK); -#elif defined(HAVE_IOCTL_FIONBIO) - /* older unix versions */ - int flags = 1; - return ioctl(s, FIONBIO, &flags); -#elif defined(HAVE_IOCTLSOCKET_FIONBIO) -#ifdef WATT32 - char flags = 1; -#else - /* Windows */ - unsigned long flags = 1UL; -#endif - return ioctlsocket(s, FIONBIO, &flags); -#elif defined(HAVE_IOCTLSOCKET_CAMEL_FIONBIO) - /* Amiga */ - long flags = 1L; - return IoctlSocket(s, FIONBIO, flags); -#elif defined(HAVE_SETSOCKOPT_SO_NONBLOCK) - /* BeOS */ - long b = 1L; - return setsockopt(s, SOL_SOCKET, SO_NONBLOCK, &b, sizeof(b)); -#else -# error "no non-blocking method was found/used/set" -#endif -} - -// TODO: This should not really be in this file, but we need ares config -// flags, and here they are available. -const struct ares_socket_functions VirtualizeIO::default_functions = { - [](int af, int type, int protocol, void *) -> ares_socket_t { - auto s = ::socket(af, type, protocol); - if (s == ARES_SOCKET_BAD) { - return s; - } - if (configure_socket(s) != 0) { - sclose(s); - return ares_socket_t(-1); - } - return s; - }, - [](ares_socket_t s, void * p) { - return :: sclose(s); - }, - [](ares_socket_t s, const struct sockaddr * addr, socklen_t len, void *) { - return ::connect(s, addr, len); - }, - [](ares_socket_t s, void * dst, size_t len, int flags, struct sockaddr * addr, socklen_t * alen, void *) -> ares_ssize_t { -#ifdef HAVE_RECVFROM - return ::recvfrom(s, reinterpret_cast(dst), len, flags, addr, alen); -#else - return sread(s, dst, len); -#endif - }, - [](ares_socket_t s, const struct iovec * vec, int len, void *) { -#ifndef HAVE_WRITEV - return ares_writev(s, vec, len); -#else - return :: writev(s, vec, len); -#endif - } -}; - - -} // namespace test -} // namespace ares diff --git a/lib/c-ares-1.19.1/test/ares-test.h b/lib/c-ares-1.19.1/test/ares-test.h deleted file mode 100644 index 9337915ebbd..00000000000 --- a/lib/c-ares-1.19.1/test/ares-test.h +++ /dev/null @@ -1,494 +0,0 @@ -// -*- mode: c++ -*- -#ifndef ARES_TEST_H -#define ARES_TEST_H - -#include "ares_setup.h" -#include "ares.h" - -#include "dns-proto.h" -// Include ares internal file for DNS protocol constants -#include "ares_nameser.h" - -#include "gtest/gtest.h" -#include "gmock/gmock.h" - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif -#if defined(HAVE_USER_NAMESPACE) && defined(HAVE_UTS_NAMESPACE) -#define HAVE_CONTAINER -#endif - -#include -#include -#include -#include -#include -#include -#include -#include - -namespace ares { - -typedef unsigned char byte; - -namespace test { - -extern bool verbose; -extern int mock_port; -extern const std::vector both_families; -extern const std::vector ipv4_family; -extern const std::vector ipv6_family; - -extern const std::vector> both_families_both_modes; -extern const std::vector> ipv4_family_both_modes; -extern const std::vector> ipv6_family_both_modes; - -// Which parameters to use in tests -extern std::vector families; -extern std::vector> families_modes; - -// Process all pending work on ares-owned file descriptors, plus -// optionally the given set-of-FDs + work function. -void ProcessWork(ares_channel channel, - std::function()> get_extrafds, - std::function process_extra); -std::set NoExtraFDs(); - -// Test fixture that ensures library initialization, and allows -// memory allocations to be failed. -class LibraryTest : public ::testing::Test { - public: - LibraryTest() { - EXPECT_EQ(ARES_SUCCESS, - ares_library_init_mem(ARES_LIB_INIT_ALL, - &LibraryTest::amalloc, - &LibraryTest::afree, - &LibraryTest::arealloc)); - } - ~LibraryTest() { - ares_library_cleanup(); - ClearFails(); - } - // Set the n-th malloc call (of any size) from the library to fail. - // (nth == 1 means the next call) - static void SetAllocFail(int nth); - // Set the next malloc call for the given size to fail. - static void SetAllocSizeFail(size_t size); - // Remove any pending alloc failures. - static void ClearFails(); - - static void *amalloc(size_t size); - static void* arealloc(void *ptr, size_t size); - static void afree(void *ptr); - private: - static bool ShouldAllocFail(size_t size); - static unsigned long long fails_; - static std::map size_fails_; -}; - -// Test fixture that uses a default channel. -class DefaultChannelTest : public LibraryTest { - public: - DefaultChannelTest() : channel_(nullptr) { - EXPECT_EQ(ARES_SUCCESS, ares_init(&channel_)); - EXPECT_NE(nullptr, channel_); - } - - ~DefaultChannelTest() { - ares_destroy(channel_); - channel_ = nullptr; - } - - // Process all pending work on ares-owned file descriptors. - void Process(); - - protected: - ares_channel channel_; -}; - -// Test fixture that uses a default channel with the specified lookup mode. -class DefaultChannelModeTest - : public LibraryTest, - public ::testing::WithParamInterface { - public: - DefaultChannelModeTest() : channel_(nullptr) { - struct ares_options opts = {0}; - opts.lookups = strdup(GetParam().c_str()); - int optmask = ARES_OPT_LOOKUPS; - EXPECT_EQ(ARES_SUCCESS, ares_init_options(&channel_, &opts, optmask)); - EXPECT_NE(nullptr, channel_); - free(opts.lookups); - } - - ~DefaultChannelModeTest() { - ares_destroy(channel_); - channel_ = nullptr; - } - - // Process all pending work on ares-owned file descriptors. - void Process(); - - protected: - ares_channel channel_; -}; - -// Mock DNS server to allow responses to be scripted by tests. -class MockServer { - public: - MockServer(int family, int port); - ~MockServer(); - - // Mock method indicating the processing of a particular - // request. - MOCK_METHOD2(OnRequest, void(const std::string& name, int rrtype)); - - // Set the reply to be sent next; the query ID field will be overwritten - // with the value from the request. - void SetReplyData(const std::vector& reply) { reply_ = reply; } - void SetReply(const DNSPacket* reply) { SetReplyData(reply->data()); } - void SetReplyQID(int qid) { qid_ = qid; } - - // The set of file descriptors that the server handles. - std::set fds() const; - - // Process activity on a file descriptor. - void ProcessFD(int fd); - - // Ports the server is responding to - int udpport() const { return udpport_; } - int tcpport() const { return tcpport_; } - - private: - void ProcessRequest(int fd, struct sockaddr_storage* addr, int addrlen, - int qid, const std::string& name, int rrtype); - void ProcessPacket(int fd, struct sockaddr_storage *addr, socklen_t addrlen, - byte *data, int len); - int udpport_; - int tcpport_; - int udpfd_; - int tcpfd_; - std::set connfds_; - std::vector reply_; - int qid_; -}; - -// Test fixture that uses a mock DNS server. -class MockChannelOptsTest : public LibraryTest { - public: - MockChannelOptsTest(int count, int family, bool force_tcp, struct ares_options* givenopts, int optmask); - ~MockChannelOptsTest(); - - // Process all pending work on ares-owned and mock-server-owned file descriptors. - void Process(); - - protected: - // NiceMockServer doesn't complain about uninteresting calls. - typedef testing::NiceMock NiceMockServer; - typedef std::vector< std::unique_ptr > NiceMockServers; - - std::set fds() const; - void ProcessFD(int fd); - - static NiceMockServers BuildServers(int count, int family, int base_port); - - NiceMockServers servers_; - // Convenience reference to first server. - NiceMockServer& server_; - ares_channel channel_; -}; - -class MockChannelTest - : public MockChannelOptsTest, - public ::testing::WithParamInterface< std::pair > { - public: - MockChannelTest() : MockChannelOptsTest(1, GetParam().first, GetParam().second, nullptr, 0) {} -}; - -class MockUDPChannelTest - : public MockChannelOptsTest, - public ::testing::WithParamInterface { - public: - MockUDPChannelTest() : MockChannelOptsTest(1, GetParam(), false, nullptr, 0) {} -}; - -class MockTCPChannelTest - : public MockChannelOptsTest, - public ::testing::WithParamInterface { - public: - MockTCPChannelTest() : MockChannelOptsTest(1, GetParam(), true, nullptr, 0) {} -}; - -// gMock action to set the reply for a mock server. -ACTION_P2(SetReplyData, mockserver, data) { - mockserver->SetReplyData(data); -} -ACTION_P2(SetReply, mockserver, reply) { - mockserver->SetReply(reply); -} -ACTION_P2(SetReplyQID, mockserver, qid) { - mockserver->SetReplyQID(qid); -} -// gMock action to cancel a channel. -ACTION_P2(CancelChannel, mockserver, channel) { - ares_cancel(channel); -} - -// C++ wrapper for struct hostent. -struct HostEnt { - HostEnt() : addrtype_(-1) {} - HostEnt(const struct hostent* hostent); - std::string name_; - std::vector aliases_; - int addrtype_; // AF_INET or AF_INET6 - std::vector addrs_; -}; -std::ostream& operator<<(std::ostream& os, const HostEnt& result); - -// Structure that describes the result of an ares_host_callback invocation. -struct HostResult { - HostResult() : done_(false), status_(0), timeouts_(0) {} - // Whether the callback has been invoked. - bool done_; - // Explicitly provided result information. - int status_; - int timeouts_; - // Contents of the hostent structure, if provided. - HostEnt host_; -}; -std::ostream& operator<<(std::ostream& os, const HostResult& result); - -// Structure that describes the result of an ares_callback invocation. -struct SearchResult { - // Whether the callback has been invoked. - bool done_; - // Explicitly provided result information. - int status_; - int timeouts_; - std::vector data_; -}; -std::ostream& operator<<(std::ostream& os, const SearchResult& result); - -// Structure that describes the result of an ares_nameinfo_callback invocation. -struct NameInfoResult { - // Whether the callback has been invoked. - bool done_; - // Explicitly provided result information. - int status_; - int timeouts_; - std::string node_; - std::string service_; -}; -std::ostream& operator<<(std::ostream& os, const NameInfoResult& result); - -struct AddrInfoDeleter { - void operator() (ares_addrinfo *ptr) { - if (ptr) ares_freeaddrinfo(ptr); - } -}; - -// C++ wrapper for struct ares_addrinfo. -using AddrInfo = std::unique_ptr; - -std::ostream& operator<<(std::ostream& os, const AddrInfo& result); - -// Structure that describes the result of an ares_addrinfo_callback invocation. -struct AddrInfoResult { - AddrInfoResult() : done_(false), status_(-1), timeouts_(0) {} - // Whether the callback has been invoked. - bool done_; - // Explicitly provided result information. - int status_; - int timeouts_; - // Contents of the ares_addrinfo structure, if provided. - AddrInfo ai_; -}; -std::ostream& operator<<(std::ostream& os, const AddrInfoResult& result); - -// Standard implementation of ares callbacks that fill out the corresponding -// structures. -void HostCallback(void *data, int status, int timeouts, - struct hostent *hostent); -void SearchCallback(void *data, int status, int timeouts, - unsigned char *abuf, int alen); -void NameInfoCallback(void *data, int status, int timeouts, - char *node, char *service); -void AddrInfoCallback(void *data, int status, int timeouts, - struct ares_addrinfo *res); - -// Retrieve the name servers used by a channel. -std::vector GetNameServers(ares_channel channel); - - -// RAII class to temporarily create a directory of a given name. -class TransientDir { - public: - TransientDir(const std::string& dirname); - ~TransientDir(); - - private: - std::string dirname_; -}; - -// C++ wrapper around tempnam() -std::string TempNam(const char *dir, const char *prefix); - -// RAII class to temporarily create file of a given name and contents. -class TransientFile { - public: - TransientFile(const std::string &filename, const std::string &contents); - ~TransientFile(); - - protected: - std::string filename_; -}; - -// RAII class for a temporary file with the given contents. -class TempFile : public TransientFile { - public: - TempFile(const std::string& contents); - const char* filename() const { return filename_.c_str(); } -}; - -#ifdef _WIN32 -extern "C" { - -static int setenv(const char *name, const char *value, int overwrite) -{ - char *buffer; - size_t buf_size; - - if (name == NULL) - return -1; - - if (value == NULL) - value = ""; /* For unset */ - - if (!overwrite && getenv(name) != NULL) { - return -1; - } - - buf_size = strlen(name) + strlen(value) + 1 /* = */ + 1 /* NULL */; - buffer = (char *)malloc(buf_size); - _snprintf(buffer, buf_size, "%s=%s", name, value); - _putenv(buffer); - free(buffer); - return 0; -} - -static int unsetenv(const char *name) -{ - return setenv(name, NULL, 1); -} - -} /* extern "C" */ -#endif - -// RAII class for a temporary environment variable value. -class EnvValue { - public: - EnvValue(const char *name, const char *value) : name_(name), restore_(false) { - char *original = getenv(name); - if (original) { - restore_ = true; - original_ = original; - } - setenv(name_.c_str(), value, 1); - } - ~EnvValue() { - if (restore_) { - setenv(name_.c_str(), original_.c_str(), 1); - } else { - unsetenv(name_.c_str()); - } - } - private: - std::string name_; - bool restore_; - std::string original_; -}; - - -#ifdef HAVE_CONTAINER -// Linux-specific functionality for running code in a container, implemented -// in ares-test-ns.cc -typedef std::function VoidToIntFn; -typedef std::vector> NameContentList; - -class ContainerFilesystem { - public: - ContainerFilesystem(NameContentList files, const std::string& mountpt); - ~ContainerFilesystem(); - std::string root() const { return rootdir_; }; - std::string mountpt() const { return mountpt_; }; - private: - void EnsureDirExists(const std::string& dir); - std::string rootdir_; - std::string mountpt_; - std::list dirs_; - std::vector> files_; -}; - -int RunInContainer(ContainerFilesystem* fs, const std::string& hostname, - const std::string& domainname, VoidToIntFn fn); - -#define ICLASS_NAME(casename, testname) Contained##casename##_##testname -#define CONTAINED_TEST_F(casename, testname, hostname, domainname, files) \ - class ICLASS_NAME(casename, testname) : public casename { \ - public: \ - ICLASS_NAME(casename, testname)() {} \ - static int InnerTestBody(); \ - }; \ - TEST_F(ICLASS_NAME(casename, testname), _) { \ - ContainerFilesystem chroot(files, ".."); \ - VoidToIntFn fn(ICLASS_NAME(casename, testname)::InnerTestBody); \ - EXPECT_EQ(0, RunInContainer(&chroot, hostname, domainname, fn)); \ - } \ - int ICLASS_NAME(casename, testname)::InnerTestBody() - -#endif - -/* Assigns virtual IO functions to a channel. These functions simply call - * the actual system functions. - */ -class VirtualizeIO { -public: - VirtualizeIO(ares_channel); - ~VirtualizeIO(); - - static const ares_socket_functions default_functions; -private: - ares_channel channel_; -}; - -/* - * Slightly white-box macro to generate two runs for a given test case: - * One with no modifications, and one with all IO functions set to use - * the virtual io structure. - * Since no magic socket setup or anything is done in the latter case - * this should probably only be used for test with very vanilla IO - * requirements. - */ -#define VCLASS_NAME(casename, testname) Virt##casename##_##testname -#define VIRT_NONVIRT_TEST_F(casename, testname) \ - class VCLASS_NAME(casename, testname) : public casename { \ - public: \ - VCLASS_NAME(casename, testname)() {} \ - void InnerTestBody(); \ - }; \ - GTEST_TEST_(casename, testname, VCLASS_NAME(casename, testname), \ - ::testing::internal::GetTypeId()) { \ - InnerTestBody(); \ - } \ - GTEST_TEST_(casename, testname##_virtualized, \ - VCLASS_NAME(casename, testname), \ - ::testing::internal::GetTypeId()) { \ - VirtualizeIO vio(channel_); \ - InnerTestBody(); \ - } \ - void VCLASS_NAME(casename, testname)::InnerTestBody() - -} // namespace test -} // namespace ares - -#endif diff --git a/lib/c-ares-1.19.1/test/buildconf b/lib/c-ares-1.19.1/test/buildconf deleted file mode 100755 index 5a9d7a34607..00000000000 --- a/lib/c-ares-1.19.1/test/buildconf +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -autoreconf -iv \ No newline at end of file diff --git a/lib/c-ares-1.19.1/test/configure.ac b/lib/c-ares-1.19.1/test/configure.ac deleted file mode 100644 index 9ed28dae49c..00000000000 --- a/lib/c-ares-1.19.1/test/configure.ac +++ /dev/null @@ -1,25 +0,0 @@ -AC_PREREQ(2.57) -AC_INIT([c-ares-test],[-],[-]) -AC_CONFIG_SRCDIR([ares-test.cc]) -AC_CONFIG_MACRO_DIR([../m4]) - -AM_INIT_AUTOMAKE([no-define]) -m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) - -AX_REQUIRE_DEFINED([AX_CXX_COMPILE_STDCXX_11]) -AX_REQUIRE_DEFINED([AX_PTHREAD]) - -dnl Checks for programs. -AC_PROG_CXX -AX_CXX_COMPILE_STDCXX_11([noext],[mandatory]) -LT_INIT -AC_SUBST(LIBTOOL_DEPS) -AX_PTHREAD -AX_CODE_COVERAGE -AX_CHECK_USER_NAMESPACE -AX_CHECK_UTS_NAMESPACE - -AC_CHECK_HEADERS(netdb.h netinet/tcp.h) -AC_CONFIG_HEADERS([config.h]) -AC_CONFIG_FILES([Makefile]) -AC_OUTPUT diff --git a/lib/c-ares-1.19.1/test/dns-dump.cc b/lib/c-ares-1.19.1/test/dns-dump.cc deleted file mode 100644 index f00a2d4cf6a..00000000000 --- a/lib/c-ares-1.19.1/test/dns-dump.cc +++ /dev/null @@ -1,40 +0,0 @@ -#include -#include -#ifdef _MSC_VER -# include -#else -# include -#endif - -#include -#include - -#include "dns-proto.h" - -namespace ares { - -static void ShowFile(const char* filename) { - int fd = open(filename, O_RDONLY); - if (fd < 0) { - std::cerr << "Failed to open '" << filename << "'" << std::endl; - return; - } - std::vector contents; - while (true) { - unsigned char buffer[1024]; - int len = read(fd, buffer, sizeof(buffer)); - if (len <= 0) break; - contents.insert(contents.end(), buffer, buffer + len); - } - std::cout << PacketToString(contents) << std::endl; -} - -} // namespace ares - -int main(int argc, char* argv[]) { - for (int ii = 1; ii < argc; ++ii) { - ares::ShowFile(argv[ii]); - } - return 0; -} - diff --git a/lib/c-ares-1.19.1/test/dns-proto.h b/lib/c-ares-1.19.1/test/dns-proto.h deleted file mode 100644 index d8a8e579936..00000000000 --- a/lib/c-ares-1.19.1/test/dns-proto.h +++ /dev/null @@ -1,254 +0,0 @@ -// -*- mode: c++ -*- -#ifndef DNS_PROTO_H -#define DNS_PROTO_H -// Utilities for processing DNS packet contents - -#include "ares_setup.h" -#include "ares.h" -// Include ares internal file for DNS protocol constants -#include "ares_nameser.h" - -#include -#include -#include - -namespace ares { - -typedef unsigned char byte; - -std::string HexDump(std::vector data); -std::string HexDump(const byte *data, int len); -std::string HexDump(const char *data, int len); - -std::string StatusToString(int status); -std::string RcodeToString(int rcode); -std::string RRTypeToString(int rrtype); -std::string ClassToString(int qclass); -std::string AddressToString(const void* addr, int len); - -// Convert DNS protocol data to strings. -// Note that these functions are not defensive; they assume -// a validly formatted input, and so should not be used on -// externally-determined inputs. -std::string PacketToString(const std::vector& packet); -std::string QuestionToString(const std::vector& packet, - const byte** data, int* len); -std::string RRToString(const std::vector& packet, - const byte** data, int* len); - - -// Manipulate DNS protocol data. -void PushInt32(std::vector* data, int value); -void PushInt16(std::vector* data, int value); -std::vector EncodeString(const std::string& name); - -struct DNSQuestion { - DNSQuestion(const std::string& name, int rrtype, int qclass) - : name_(name), rrtype_(rrtype), qclass_(qclass) {} - DNSQuestion(const std::string& name, int rrtype) - : name_(name), rrtype_(rrtype), qclass_(C_IN) {} - virtual ~DNSQuestion() {} - virtual std::vector data() const; - std::string name_; - int rrtype_; - int qclass_; -}; - -struct DNSRR : public DNSQuestion { - DNSRR(const std::string& name, int rrtype, int qclass, int ttl) - : DNSQuestion(name, rrtype, qclass), ttl_(ttl) {} - DNSRR(const std::string& name, int rrtype, int ttl) - : DNSQuestion(name, rrtype), ttl_(ttl) {} - virtual ~DNSRR() {} - virtual std::vector data() const = 0; - int ttl_; -}; - -struct DNSAddressRR : public DNSRR { - DNSAddressRR(const std::string& name, int rrtype, int ttl, - const byte* addr, int addrlen) - : DNSRR(name, rrtype, ttl), addr_(addr, addr + addrlen) {} - DNSAddressRR(const std::string& name, int rrtype, int ttl, - const std::vector& addr) - : DNSRR(name, rrtype, ttl), addr_(addr) {} - virtual std::vector data() const; - std::vector addr_; -}; - -struct DNSARR : public DNSAddressRR { - DNSARR(const std::string& name, int ttl, const byte* addr, int addrlen) - : DNSAddressRR(name, T_A, ttl, addr, addrlen) {} - DNSARR(const std::string& name, int ttl, const std::vector& addr) - : DNSAddressRR(name, T_A, ttl, addr) {} -}; - -struct DNSAaaaRR : public DNSAddressRR { - DNSAaaaRR(const std::string& name, int ttl, const byte* addr, int addrlen) - : DNSAddressRR(name, T_AAAA, ttl, addr, addrlen) {} - DNSAaaaRR(const std::string& name, int ttl, const std::vector& addr) - : DNSAddressRR(name, T_AAAA, ttl, addr) {} -}; - -struct DNSSingleNameRR : public DNSRR { - DNSSingleNameRR(const std::string& name, int rrtype, int ttl, - const std::string& other) - : DNSRR(name, rrtype, ttl), other_(other) {} - virtual std::vector data() const; - std::string other_; -}; - -struct DNSCnameRR : public DNSSingleNameRR { - DNSCnameRR(const std::string& name, int ttl, const std::string& other) - : DNSSingleNameRR(name, T_CNAME, ttl, other) {} -}; - -struct DNSNsRR : public DNSSingleNameRR { - DNSNsRR(const std::string& name, int ttl, const std::string& other) - : DNSSingleNameRR(name, T_NS, ttl, other) {} -}; - -struct DNSPtrRR : public DNSSingleNameRR { - DNSPtrRR(const std::string& name, int ttl, const std::string& other) - : DNSSingleNameRR(name, T_PTR, ttl, other) {} -}; - -struct DNSTxtRR : public DNSRR { - DNSTxtRR(const std::string& name, int ttl, const std::vector& txt) - : DNSRR(name, T_TXT, ttl), txt_(txt) {} - virtual std::vector data() const; - std::vector txt_; -}; - -struct DNSMxRR : public DNSRR { - DNSMxRR(const std::string& name, int ttl, int pref, const std::string& other) - : DNSRR(name, T_MX, ttl), pref_(pref), other_(other) {} - virtual std::vector data() const; - int pref_; - std::string other_; -}; - -struct DNSSrvRR : public DNSRR { - DNSSrvRR(const std::string& name, int ttl, - int prio, int weight, int port, const std::string& target) - : DNSRR(name, T_SRV, ttl), prio_(prio), weight_(weight), port_(port), target_(target) {} - virtual std::vector data() const; - int prio_; - int weight_; - int port_; - std::string target_; -}; - -struct DNSUriRR : public DNSRR { - DNSUriRR(const std::string& name, int ttl, - int prio, int weight, const std::string& target) - : DNSRR(name, T_URI, ttl), prio_(prio), weight_(weight), target_(target) {} - virtual std::vector data() const; - int prio_; - int weight_; - std::string target_; -}; - -struct DNSSoaRR : public DNSRR { - DNSSoaRR(const std::string& name, int ttl, - const std::string& nsname, const std::string& rname, - int serial, int refresh, int retry, int expire, int minimum) - : DNSRR(name, T_SOA, ttl), nsname_(nsname), rname_(rname), - serial_(serial), refresh_(refresh), retry_(retry), - expire_(expire), minimum_(minimum) {} - virtual std::vector data() const; - std::string nsname_; - std::string rname_; - int serial_; - int refresh_; - int retry_; - int expire_; - int minimum_; -}; - -struct DNSNaptrRR : public DNSRR { - DNSNaptrRR(const std::string& name, int ttl, - int order, int pref, - const std::string& flags, - const std::string& service, - const std::string& regexp, - const std::string& replacement) - : DNSRR(name, T_NAPTR, ttl), order_(order), pref_(pref), - flags_(flags), service_(service), regexp_(regexp), replacement_(replacement) {} - virtual std::vector data() const; - int order_; - int pref_; - std::string flags_; - std::string service_; - std::string regexp_; - std::string replacement_; -}; - -struct DNSOption { - int code_; - std::vector data_; -}; - -struct DNSOptRR : public DNSRR { - DNSOptRR(int extrcode, int udpsize) - : DNSRR("", T_OPT, static_cast(udpsize), extrcode) {} - virtual std::vector data() const; - std::vector opts_; -}; - -struct DNSPacket { - DNSPacket() - : qid_(0), response_(false), opcode_(O_QUERY), - aa_(false), tc_(false), rd_(false), ra_(false), - z_(false), ad_(false), cd_(false), rcode_(NOERROR) {} - // Convenience functions that take ownership of given pointers. - DNSPacket& add_question(DNSQuestion *q) { - questions_.push_back(std::unique_ptr(q)); - return *this; - } - DNSPacket& add_answer(DNSRR *q) { - answers_.push_back(std::unique_ptr(q)); - return *this; - } - DNSPacket& add_auth(DNSRR *q) { - auths_.push_back(std::unique_ptr(q)); - return *this; - } - DNSPacket& add_additional(DNSRR *q) { - adds_.push_back(std::unique_ptr(q)); - return *this; - } - // Chainable setters. - DNSPacket& set_qid(int qid) { qid_ = qid; return *this; } - DNSPacket& set_response(bool v = true) { response_ = v; return *this; } - DNSPacket& set_aa(bool v = true) { aa_ = v; return *this; } - DNSPacket& set_tc(bool v = true) { tc_ = v; return *this; } - DNSPacket& set_rd(bool v = true) { rd_ = v; return *this; } - DNSPacket& set_ra(bool v = true) { ra_ = v; return *this; } - DNSPacket& set_z(bool v = true) { z_ = v; return *this; } - DNSPacket& set_ad(bool v = true) { ad_ = v; return *this; } - DNSPacket& set_cd(bool v = true) { cd_ = v; return *this; } - DNSPacket& set_rcode(int rcode) { rcode_ = rcode; return *this; } - - // Return the encoded packet. - std::vector data() const; - - int qid_; - bool response_; - int opcode_; - bool aa_; - bool tc_; - bool rd_; - bool ra_; - bool z_; - bool ad_; - bool cd_; - int rcode_; - std::vector> questions_; - std::vector> answers_; - std::vector> auths_; - std::vector> adds_; -}; - -} // namespace ares - -#endif diff --git a/lib/c-ares-1.19.1/AUTHORS b/lib/c-ares-1.23.0/AUTHORS similarity index 100% rename from lib/c-ares-1.19.1/AUTHORS rename to lib/c-ares-1.23.0/AUTHORS diff --git a/lib/c-ares-1.19.1/CHANGES b/lib/c-ares-1.23.0/CHANGES similarity index 78% rename from lib/c-ares-1.19.1/CHANGES rename to lib/c-ares-1.23.0/CHANGES index d465143131d..04945fa35d4 100644 --- a/lib/c-ares-1.19.1/CHANGES +++ b/lib/c-ares-1.23.0/CHANGES @@ -1,5554 +1,5965 @@ Changelog for the c-ares project. Generated with git2changes.pl -Version 1.19.1 (22 May 2023) - -bradh352 (22 May 2023) -- Makefile.inc Windows requires tabs not spaces for nmake - -GitHub (22 May 2023) -- [Daniel Stenberg brought this change] - - ares_expand_name: fix compiler warnings (#522) - - Fix some compiler warnings (not introduced in this release) - - Fix By: Daniel Stenberg (@bagder) +Version 1.23.0 (28 Nov 2023) -bradh352 (22 May 2023) -- windows MSVC compiler fix on 32bit +GitHub (28 Nov 2023) +- [Brad House brought this change] -- update security advisory links + 1.23.0 release prep (#641) -- minor CI issues fixes for imported inet_net_pton +Brad House (28 Nov 2023) +- add missing manpage to distribution list -- ares_rand static analysis fixes from CI +- clang-format -- windows build fix +- remove a simply -- security release notes +- fix doc typo -GitHub (22 May 2023) -- [Brad House brought this change] +- ares_init_options with ARES_OPT_UDP_PORT wrong byte order + + Regression from c-ares 1.19.1, ARES_OPT_UDP_PORT and ARES_OPT_TCP_PORT are + specified from the user in host-byte order, but there was a regression that + caused it to be read as if it was network byte order. + + Fixes Bug: #640 + Reported By: @Flow86 + Fix By: Brad House (@bradh352) - Merge pull request from GHSA-9g78-jv2r-p7vc +- fix ares_threadsafety() prototype +GitHub (28 Nov 2023) - [Brad House brought this change] - Merge pull request from GHSA-x6mf-cxr9-8q6v + Basic Thread Safety (#636) - * Merged latest OpenBSD changes for inet_net_pton_ipv6() into c-ares. - * Always use our own IP conversion functions now, do not delegate to OS - so we can have consistency in testing and fuzzing. - * Removed bogus test cases that never should have passed. - * Add new test case for crash bug found. + c-ares does not have any concept of thread-safety. It has always been 100% up to the implementor to ensure they never call c-ares from more than one thread at a time. This patch adds basic thread-safety support, which can be disabled at compile time if not desired. It uses a single recursive mutex per channel, which should be extremely quick when uncontested so overhead should be minimal. + + Fixes Bug: #610 + + Also sets the stage to implement #611 Fix By: Brad House (@bradh352) -- [Brad House brought this change] +- [petrvh brought this change] - Merge pull request from GHSA-8r8p-23f3-64c2 + ares_getaddrinfo(): do not use search domains if ARES_FLAG_NOSEARCH is set (#638) - * segment random number generation into own file + c-ares init options defines a flag ARES_FLAG_NOSEARCH that is supposed to prevent search using configured domain suffixes, however when using ares_getaddrinfo() the flag was ignored and domain suffixes were used anyway. - * abstract random code to make it more modular so we can have multiple backends + Configuring zero domains to search also does not work (if ndomains == 0 default domain search list is loaded regardless of the flag ARES_OPT_DOMAINS being set). - * rand: add support for arc4random_buf() and also direct CARES_RANDOM_FILE reading + This change adds a check for the ARES_FLAG_NOSEARCH in as_is_only() function that is used by ares_getaddrinfo() to decide if to try to query next possible name ( next_dns_lookup() ) - * autotools: fix detection of arc4random_buf + Fix By: @petrvh + +Brad House (25 Nov 2023) +- Fix MacOS version test - * rework initial rc4 seed for PRNG as last fallback + It appears that the Issue #454 wasn't really fixed for some reason. This commit should fix the detection. - * rc4: more proper implementation, simplified for clarity + Fix By: Brad House (@bradh352) + +Daniel Stenberg (24 Nov 2023) +- CI: codespell - * clarifications + Closes #635 -bradh352 (20 May 2023) -- add public release note information +GitHub (24 Nov 2023) +- [Christian Clauss brought this change] -- bump version to 1.19.1 + Fix typos discovered by codespell (#634) + + % `codespell --ignore-words-list="aas,aci,acter,atleast,contentss,firey,fo,sais,seh,statics"` + * https://pypi.org/project/codespell + + Fix By: Christian Clauss (@cclauss) -GitHub (6 May 2023) -- [Gregor Jasny brought this change] +Brad House (22 Nov 2023) +- environment is meant as an override for sysconfig - test: fix warning about uninitialized memory (#515) +GitHub (22 Nov 2023) +- [Ignat brought this change] + + Support attempts and timeout options from resolv.conf (#632) - fix warning in tests + c-ares parses only antique version of options for timeout and number of retries from resolv.conf (`retrans` and `retry` are missing in modern documentation https://man7.org/linux/man-pages/man5/resolv.conf.5.html). - Fix By: Gregor Jasny (@gjasny) + I add support of `attempts` and `timeout` options + + Fix By: Ignat (@Kontakter) -- [lifenjoiner brought this change] +- [Brad House brought this change] - Turn off IPV6_V6ONLY on Windows if it is supported (#520) + more precise timeout calculation (#633) - Turn off IPV6_V6ONLY on Windows if it is supported, support for IPv4-mapped IPv6 addresses. + The timeout calculation was occurring with millisecond precision, but on some systems, there is microsecond precision which could mean we'd tell a user a timeout time prior to the actual timeout. - IPV6_V6ONLY refs: - https://en.wikipedia.org/wiki/IPv6#IPv4-mapped_IPv6_addresses - https://github.com/golang/go/blob/master/src/net/ipsock_posix.go - https://en.wikipedia.org/wiki/Unix-like - off: - https://www.kernel.org/doc/html/latest/networking/ip-sysctl.html#proc-sys-net-ipv6-variables - https://man.netbsd.org/inet6.4 - https://man.freebsd.org/cgi/man.cgi?query=inet6 - https://github.com/apple-oss-distributions/xnu/blob/main/bsd/man/man4/inet6.4 - on: - https://learn.microsoft.com/en-us/windows/win32/winsock/ipproto-ipv6-socket-options - acts like off, but returns 1 and dummy setting: - https://man.dragonflybsd.org/?command=inet6 - https://man.dragonflybsd.org/?command=ip6 - unsupported and read-only returns 1: - https://man.openbsd.org/inet6.4 + Fixes Bug: #631 + Fix By: Brad House (@bradh352) + +- [Christian Clauss brought this change] + + INSTALL.md: Fix typo (#630) - default value refs: - https://datatracker.ietf.org/doc/html/rfc3493#section-5.3 - https://www.kernel.org/doc/html/latest/networking/ip-sysctl.html#proc-sys-net-ipv6-variables + Fix By: Christian Clauss (@cclauss) + +Brad House (19 Nov 2023) +- SonarCloud: fix minor codesmells + +- fix test case regression due to missing parens + +- now that warnings are enabled on test cases, clear a bunch of warnings +- CMake: CXXFLAGS environment wasn't being read because C++ compiler was enabled after settings warnings. + +- fix additional windows test warnings + +- cleanup some Windows warnings in test + +- clang-format + +GitHub (19 Nov 2023) - [Brad House brought this change] - Merge pull request from GHSA-54xr-f67r-4pc4 - - * CARES_RANDOM_FILE should always default to /dev/urandom + Fix Windows UWP (Store) building and add to CI/CD (#627) - During cross-compilation, CARES_RANDOM_FILE may not be able to be appropriately - detected, therefore we should always set it to /dev/urandom and allow the - entity requesting compilation override the value. The code does appropriately - fall back if CARES_RANDOM_FILE cannot be opened. + When building for UWP (WindowsStore), additional headers are needed and some functions are not available. This also adds AppVeyor CI/CD support to catch these issues in the future. - * use set not option + Fix By: Deal (@halx99) and Brad House (@bradh352) -bradh352 (18 Mar 2023) -- ares_getaddrinfo using service of "0" should be allowed +Brad House (19 Nov 2023) +- ares_set_servers_*() should allow an empty server list - As per #517 glibc allows a service/servname of "0" to be treated the - same as if NULL was provided. Also, add a sanity check to ensure - the port number is in range instead of a blind cast. + For historic reasons, we have users depending on ares_set_servers_*() + to return ARES_SUCCESS when passing no servers and actually *clear* + the server list. It appears they do this for test cases to simulate + DNS unavailable or similar. Presumably they could achieve the same + effect in other ways (point to localhost on a port that isn't in use). + But it seems like this might be wide-spread enough to cause headaches + so we just will document and test for this behavior, clearly it hasn't + caused "issues" for anyone with the old behavior. + + See: https://github.com/nodejs/node/pull/50800 - Fixes: #517 Fix By: Brad House (@bradh352) -GitHub (10 Feb 2023) -- [Nikolaos Chatzikonstantinou brought this change] +GitHub (19 Nov 2023) +- [Brad House brought this change] - fix memory leak in ares_send (#511) + Query Cache support (#625) - When the condition channel->nservers < 1 holds, the function returns - prematurely, without deallocating query->tcpbuf. We rearrange the - check to be done prior to the allocations, avoiding the memory - leak. In this way, we also avoid unnecessary allocations if - channel->nservers < 1 holds. + This PR implements a query cache at the lowest possible level, the actual dns request and response messages. Only successful and `NXDOMAIN` responses are cached. The lowest TTL in the response message determines the cache validity period for the response, and is capped at the configuration value for `qcache_max_ttl`. For `NXDOMAIN` responses, the SOA record is evaluated. - Fix By: Nikolaos Chatzikonstantinou (@createyourpersonalaccount) - -- [Nikolaos Chatzikonstantinou brought this change] - - change comment style to old-style (#513) + For a query to match the cache, the opcode, flags, and each question's class, type, and name are all evaluated. This is to prevent matching a cached entry for a subtly different query (such as if the RD flag is set on one request and not another). - Following the README.md guidelines, + For things like ares_getaddrinfo() or ares_search() that may spawn multiple queries, each individual message received is cached rather than the overarching response. This makes it possible for one query in the sequence to be purged from the cache while others still return cached results which means there is no chance of ever returning stale data. - "Comments must be written in the old-style" + We have had a lot of user requests to return TTLs on all the various parsers like `ares_parse_caa_reply()`, and likely this is because they want to implement caching mechanisms of their own, thus this PR should solve those issues as well. - the comment is changed to the old style. + Due to the internal data structures we have these days, this PR is less than 500 lines of new code. - Fix By: Nikolaos Chatzikonstantinou (@createyourpersonalaccount) + Fixes #608 + + Fix By: Brad House (@bradh352) -- [Nikolaos Chatzikonstantinou brought this change] +Version 1.22.1 (17 Nov 2023) - use strncasecmp in ares__strsplit (#512) +GitHub (17 Nov 2023) +- [Brad House brought this change] + + 1.22.1 release prep (#624) + +Brad House (17 Nov 2023) +- ares__htable_strvp should be case-insensitive + +- optimize: large /etc/hosts files reading - strncasecmp on platforms that don't already have it is already #define'd to a private implementation. There is no need to have OS-specific logic. Also removes ares__strsplit.h as a header as ares_private.h already includes it. + profiling found some hot paths that could be optimized to reduce + insert times into the cache. - Fix By: Nikolaos Chatzikonstantinou (@createyourpersonalaccount) - -- [Yijie Ma brought this change] + Fix By: Brad House (@bradh352) - Fix a typo in ares_init_options.3 (#510) +- Fix /etc/hosts processing performance with all entries using same IP address - that -> than + Some users use blacklist files like https://github.com/StevenBlack/hosts which + can contain 200k+ host entries all pointing to 0.0.0.0. Due to the merge + logic in the new hosts processor, all those entries will be associated as + aliases for the same ip address. - Fix By: Yijie Ma (@yijiem) + The first issue is that it attempts to check the status of all the hosts for + the merged entry, when it should only be checking the new hosts added to the + merged entry, so this caused exponential time as the entries got longer. + + The next issue is if searching for one of those hosts, it would append all + the matches as cnames/aliases, but there is zero use for 200k aliases + being appended to a lookup, so we are artificially capping this to 100. + + Bug report reference: https://bugs.gentoo.org/917400 + + Fix By: Brad House (@bradh352) -- [Douglas R. Reno brought this change] +- new badges - Watcom Portability Improvements (#509) - - - Modify the Watcom Makefile for the source code reorganization (#352) - - Add *.map files into .gitignore - - Fix build errors with Watcom's builtin Windows SDK (which is rather - outdated). It's smart enough to understand Windows Vista, but doesn't - have PMIB_UNICASTIPADDRESS_TABLE or MIB_IPFORWARD_ROW2. +- OpenWatcom: time_t is unsigned, change math using time_t to promote to a 64bit signed integer + +- fix more docs + +GitHub (15 Nov 2023) +- [Gregor Jasny brought this change] + + Fix typos and man page whatis entry (#619) - It may be possible to use a different Windows SDK with the Watcom - compiler, such as the most recent Windows 10 SDK. Alternatively the SDK - in OpenWatcom 2.0 (which is in development) should fix this. + Those issues were detected by lintian. - I have no problems testing this Makefile prior to releases, just give me - a ping. + Fix By: Gregor Jasny (@gjasny) + +- [Douglas R. Reno brought this change] + + Fix building c-ares-1.22.0 and higher under Watcom. (#623) - Tested with Windows Vista, Windows 7, and Windows 10 using 'adig', - 'acountry', and 'ahost'. This also seems to work on Windows XP, though - this is likely due to the compiler in use. + Update config-win32.h to define HAVE_STDINT_H when OpenWatcom is in use. Fix By: Douglas R. Reno (@renodr) - Fixes Bug: #352 -- [Jay Freeman (saurik) brought this change] +Brad House (15 Nov 2023) +- OpenWatcom: fix PR building - ignore aminclude_static.am, as generated by AX_AM_MACROS_STATIC (#508) +- CI/CD: Add OpenWatcom + +- CI/CD: Add OpenWatcom + +- CI/CD: Add OpenWatcom + +- CI/CD: Add OpenWatcom + +- CI/CD: Add OpenWatcom + +- CI/CD: Add OpenWatcom + +- CI/CD: Add OpenWatcom + +- warnings: try to prevent warnings due to automatic integer promotion + +- only push to coverity weekly or on explicit coverity_scan branch commits + +- try to cleanup bogus compiler warnings + +- try to cleanup bogus compiler warnings + +- additional test coverage + +- Coverity: omit tests + +- Coverity: more + +- Coverity: silence false positives + +Version 1.22.0 (14 Nov 2023) + +Brad House (14 Nov 2023) +- fix workflow + +- try a different coverity workflow + +GitHub (14 Nov 2023) +- [Brad House brought this change] + + coverity workflow (#618) + +Brad House (14 Nov 2023) +- typos + +- getaddrinfo ESERVICE + +GitHub (14 Nov 2023) +- [Brad House brought this change] + + Release 1.22.0 (#616) + +Brad House (13 Nov 2023) +- SonarCloud: minor codesmells + +- clang-format + +- Extended RCODE in OPT RR PsuedoRecord should not be exposed directly, it should be presented as part of the normal rcode + +- Slight fixes for PR #615 - Fix By: Jay Freeman (@saurik) + 1. the maxtimeout must come at the end of the structure + 2. fix comment form to be C style + 3. fix timeplus randomness if statement -- [Jay Freeman (saurik) brought this change] +GitHub (13 Nov 2023) +- [Brad House brought this change] - sync ax_pthread.m4 with upstream (#507) + Add DNS record manpages (#615) - The version in the repository is many years old so this PR simply pulls in the latest - available revision from: - http://git.savannah.gnu.org/gitweb/?p=autoconf-archive.git;a=tree;f=m4 + The new DNS record parser and writer needs manpages. This PR implements those. - Fix By: Jay Freeman (@saurik) + Fix By: Brad House (@bradh352) -- [Chilledheart brought this change] +- [Ignat brought this change] - Windows: Invalid stack variable out of scope for HOSTS file path (#502) + Randomize retry penalties to prevent thundering herd type issues (#606) - In some conditions Windows might try to use a stack address that has gone out of scope when determining where to read the hosts data from for file lookups. + The retry timeout values were using a fixed calculation which could cause multiple simultaneous queries to timeout and retry at the exact same time. If a DNS server is throttling requests, this could cause the issue to never self-resolve due to all requests recurring at the same instance again. - Fix By: @Chilledheart + This PR also creates a maximum timeout option to make sure the random value selected does not exceed this value. + + Fix By: Ignat (@Kontakter) + +Brad House (13 Nov 2023) +- fix typos +- some simplification and better error handling + +- SonarCloud: fix some minor codesmells + +GitHub (12 Nov 2023) - [Brad House brought this change] - sync ax_cxx_compile_stdcxx_11.m4 with upstream (#505) + Implement ares_reinit() to reload system configuration into existing channel (#614) - It was reported that ax_cxx_compile_stdcxx_11.m4 was not compatible with uclibc. - The version in the repository is many years old so this PR simply pulls in the latest - available revision from: - http://git.savannah.gnu.org/gitweb/?p=autoconf-archive.git;a=tree;f=m4 + This PR implements ares_reinit() to safely reload a channel's configuration even if there are existing queries. This function can be called when system configuration is detected to be changed, however since c-ares isn't thread aware, care must be taken to ensure no other c-ares calls are in progress at the time this function is called. Also, this function may update the open file descriptor list so care must also be taken to wake any event loops and reprocess the list of file descriptors. + + Fixes Bug #301 - Fixes Bug: #504 Fix By: Brad House (@bradh352) -Version 1.19.0 (18 Jan 2023) +Brad House (11 Nov 2023) +- test case ensures tag for caa is not blank -bradh352 (18 Jan 2023) -- Prep for 1.19.0 release +- 0-length strings are ok -- Fix inverted logic in 25523e2 +- SonarCloud: fix up codesmells + +GitHub (11 Nov 2023) +- [Brad House brought this change] + + rewrite adig using new helpers (#607) - Fix .localhost. handling in prior commit + adig previously performed manual parsing of the DNS records. Now it can focus strictly on formatting of output data for printing. It simply iterates across the parsed DNS packet and queries for the RRs, parameters for each RR, and the datatypes for each parameter. adig will now automatically pick up new RRs from the c-ares library due to the dynamic nature. - Fix By: Brad House (@bradh352) - -- RFC6761 localhost definition includes subdomains + The adig format also now more closely resembles that of BIND's `dig` output. - RFC6761 6.3 states: - The domain "localhost." and any names falling within ".localhost." + A few more helpers needed to be added to the c-ares library that were missing. There ware a couple of minor bugs and enhancements also needed. - We were only honoring "localhost". + Example: + ``` + ./adig -t ANY www.google.com + + ; <<>> c-ares DiG 1.21.0 <<>> www.google.com + ;; Got answer: + ;; ->>HEADER<<- opcode: QUERY, status: RCODE, id: 23913 + ;; flags: qr rd ra; QUERY: 1, ANSWER: 11, AUTHORITY: 0, ADDITIONAL: 1 + + ;; OPT PSEUDOSECTION: + ; EDNS: version: 0, flags: 0; udp: 512 + ;; QUESTION SECTION: + ;www.google.com. IN ANY + + ;; ANSWER SECTION: + www.google.com. 162 IN A 142.251.107.99 + www.google.com. 162 IN A 142.251.107.105 + www.google.com. 162 IN A 142.251.107.103 + www.google.com. 162 IN A 142.251.107.147 + www.google.com. 162 IN A 142.251.107.104 + www.google.com. 162 IN A 142.251.107.106 + www.google.com. 162 IN AAAA 2607:f8b0:400c:c32::93 + www.google.com. 162 IN AAAA 2607:f8b0:400c:c32::69 + www.google.com. 162 IN AAAA 2607:f8b0:400c:c32::68 + www.google.com. 162 IN AAAA 2607:f8b0:400c:c32::6a + www.google.com. 21462 IN HTTPS 1 . alpn="h2,h3" + + ;; MSG SIZE rcvd: 276 + ``` - Fixes: #477 Fix By: Brad House (@bradh352) -- docs: ARES_OPT_UDP_PORT and ARES_OPT_TCP_PORT docs wrong byte order +- [Brad House brought this change] + + make dns parser/writer public (#604) - As per #487, documentation states the port should be in network byte - order, but we can see from the test cases using MockServers on - different ports that this is not the case, it is definitely in host - byte order. + This PR makes the c-ares parser introduced in 1.21, and the new writer, along with associated helpers public. These helpers are contained in a new public header of `ares_dns_record.h` which should _**not**_ be included directly, instead simply including `ares.h` is sufficient. This will address #587, as well as #470. + + A follow-up PR will be made which will transform `adig` to use the new parsers and helpers. + + This PR does not currently add man pages for these public functions, that will be in a follow-up PR once the `adig` migration is done which may expose additional needed helpers. + + The two aforementioned PRs will be done before the 1.22 release. Fix By: Brad House (@bradh352) -GitHub (18 Jan 2023) -- [hopper-vul brought this change] +Brad House (9 Nov 2023) +- options helpers: fix dereference to properly return params - Add str len check in config_sortlist to avoid stack overflow (#497) - - In ares_set_sortlist, it calls config_sortlist(..., sortstr) to parse - the input str and initialize a sortlist configuration. - - However, ares_set_sortlist has not any checks about the validity of the input str. - It is very easy to create an arbitrary length stack overflow with the unchecked - `memcpy(ipbuf, str, q-str);` and `memcpy(ipbufpfx, str, q-str);` - statements in the config_sortlist call, which could potentially cause severe - security impact in practical programs. - - This commit add necessary check for `ipbuf` and `ipbufpfx` which avoid the - potential stack overflows. +- clang-format + +GitHub (9 Nov 2023) +- [Brad House brought this change] + + Add SVCB and HTTPS RR (RFC 9460) (#603) - fixes #496 + This PR adds parsing and writing support for SVCB and HTTPS RRs as defined in RFC 9460. - Fix By: @hopper-vul - -bradh352 (18 Jan 2023) -- Fix build due to str-split sed gone wrong + This should fix #566 Fix By: Brad House (@bradh352) -- cirrus-ci: switch to scan-build-py for MacOS +- [Brad House brought this change] + + OPT RR should support parsing key/value options (#602) - MacOS seems to work better with scan-build-py + The OPT RR record has some seldom used options with a 16bit key and a binary value. The current parser and writer was not supporting this. This PR adds support. The same format is also used for SVCB/HTTPS records, so getting this in there is necessary to support that RR type. + + Also, we split the Binary record format into BIN and BINP, where BINP is an indicator that the binary data is _likely_ printable and will guarantee a NULL terminator. This is helpful for those attempting to print RRs. Fix By: Brad House (@bradh352) -- ares_strsplit* -> ares__strsplit* to comply with internal function naming +Brad House (8 Nov 2023) +- SonarCloud: fix some easy codesmells + +- clang-format + +- Mark a couple of parameters as const in the public API + +GitHub (7 Nov 2023) +- [Brad House brought this change] + + Add TLSA record support (#600) - Inspired by #495, but was missing test cases and would failed to build. + As per #470, c-ares is missing a parser for the TLSA record format (RFC 6698). This PR introduces that parser. - Fix By: Brad House (@bradh352), Daniel Stenberg (@bagder) + Once the new parser interface becomes public and this PR is merged, then #470 can be closed. + + Fix By: Brad House (@bradh352) -- Cirrus-CI: MacOS Homebrew has changed from /usr/local/opt to /opt/homebrew +Brad House (7 Nov 2023) +- memory leak in test case + +- fix bad variable reference + +- DNS Write: fix name compression + +- SonarCloud: fix codesmells + +- Coverage: add tests for writing and parsing various record formats + +GitHub (7 Nov 2023) +- [Brad House brought this change] + + DNS Record Write (#598) - Fix paths for homebrew. + The `ares_dns_record_t` data structure created in the prior release is capable of holding a complete parsed DNS message and also provides all helpers in order to fill in the data structure. This PR adds write capabilities for this data structure to form a complete message and supports features such as DNS name compression as defined in RFC1035. Though this message writing capability goes further than c-ares internally needs, external users may find it useful ... and we may find it useful for test validation as well. + + This also replaces the existing message writing code in `ares_create_query()`, as well rewriting the request message without EDNS in ares_process.c's `process_answer()`. Fix By: Brad House (@bradh352) -- cirrus-ci: iOS build needs to use ARM MacOS image +Brad House (6 Nov 2023) +- PATH_RESOLV_CONF: use empty string instead of NULL to prevent warnings + +- build fix + +- const: fix some usecases + +- remove tests that depend on randomness + +GitHub (5 Nov 2023) +- [Brad House brought this change] + + Use EDNS by default (#596) - CirrusCI removed Intel-based MacOS images. Need to switch - iOS builds to use new ARM images as well. + All DNS servers support EDNS, by using this by default, it will allow larger responses without the need to switch to TCP. If by chance a DNS server is hit that doesn't support EDNS, this is detected due to the lack of the OPT RR in the response and will be automatically retried without EDNS. Fix By: Brad House (@bradh352) -- cirrus-ci: new MacOS image +- [Brad House brought this change] + + `ares_channel` -> `ares_channel_t *`: don't bury the pointer (#595) - Cirrus-CI has recently EOL'd Intel MacOS VMs, switch to the latest - ARM-based image. + `ares_channel` is defined as `typedef struct ares_channeldata *ares_channel;`. The problem with this, is it embeds the pointer into the typedef, which means an `ares_channel` can never be declared as `const` as if you write `const ares_channel channel`, that expands to `struct ares_channeldata * const ares_channel` and not `const struct ares_channeldata *channel`. + + We will now typedef `ares_channel_t` as `typedef struct ares_channeldata ares_channel_t;`, so if you write `const ares_channel_t *channel`, it properly expands to `const struct ares_channeldata *channel`. + + We are maintaining the old typedef for API compatibility with existing integrations, and due to typedef expansion this should not even cause any compiler warnings for existing code. There are no ABI implications with this change. I could be convinced to keep existing public functions as `ares_channel` if a sufficient argument exists, but internally we really need make this change for modern best practices. + + This change will allow us to internally use `const ares_channel_t *` where appropriate. Whether or not we decide to change any public interfaces to use `const` may require further discussion on if there might be ABI implications (I don't think so, but I'm also not 100% sure what a compiler internally does with `const` when emitting machine code ... I think more likely ABI implications would occur going the opposite direction). + + FYI, This PR was done via a combination of sed and clang-format, the only manual code change was the addition of the new typedef, and a couple doc fixes :) Fix By: Brad House (@bradh352) -- acountry was passing stack variable to callback +Brad House (4 Nov 2023) +- win32 warnings look good, remove commented out block + +- more msvc warnings + +- fix + +- docs: document setting servers can be done live + +- SonarCloud: more easy codesmells + +- clang-format + +- SonarCloud: fix up codesmells + +GitHub (3 Nov 2023) +- [Brad House brought this change] + + Dynamic Server List (#594) - Recent ASAN versions picked up that acountry was passing stack - variables to ares_gethostbyname() then leaving the stack context. - We will now allocate a buffer for this. + This PR makes the server list a dynamic sorted list of servers. The sort order is [ consecutive failures, system config index ]. The server list can be updated via ares_set_servers_*(). Any queries currently directed to servers that are no longer in the list will be automatically re-queued to a different server. + + Also, any time a failure occurs on the server, the sort order of the servers will be updated so that the one with the fewest consecutive failures is chosen for the next query that goes on the wire, this way bad or non-responsive servers are automatically isolated. + + Since the server list is now dynamic, the tracking of query failures per server has been removed and instead is relying on the server sort order as previously described. This simplifies the logic while also reducing the amount of memory required per query. However, because of this dynamic nature, it may not be easy to determine the server attempt order for enqueued queries if there have been any failures. + + If using the ARES_OPT_ROTATE, this is now implemented to be a random selection of the configured servers. Since the server list is dynamic, its not possible to go to the next server as configuration could have changed between queries or attempts for the same query. + + Finally, this PR moved some existing functions into new files to logically separate them. + + This should address issues #550 and #440, while also setting the framework to implement #301. #301 needs a little more effort since it configures things other than the servers themselves (domains, search, sortlist, lookups), which need to make sure they can be safely updated. Fix By: Brad House (@bradh352) -GitHub (13 Dec 2022) -- [Daniel Stenberg brought this change] +Brad House (1 Nov 2023) +- no reason to run LSAN, ASAN already does it - docs: reformat/cleanup man pages SYNOPSIS sections (#494) +GitHub (31 Oct 2023) +- [Brad House brought this change] + + AppVeyor: update compiler versions, use Msys2, and Windows fixes (#593) - To make them render "nicer" in both terminals and on the website. + AppVeyor was using Visual Studio 2015 along with old versions of MinGW. Update to the latest AppVeyor provides and also add an MSYS2 build test using MinGW which will use the bleeding edge version. - - Removes the bold - - Removes .PP lines - - Indents them more like proper code style + When researching #590 this also uncovered a bug in cmake not properly detecting if_indextoname() on windows. This has been corrected as well as the underlying issue reported in #590. - Fix By: Daniel Stenberg (@bagder) + Fix By: Brad House (@bradh352) and Jonas Kvinge (@jonaski) -- [Nikolaos Chatzikonstantinou brought this change] +Brad House (31 Oct 2023) +- Coverage: add some code misuse test cases - bug fix: new ares_strsplit (#492) +- hosts file parsing should set success at end of loop + +- fix windows localhost for ares_gethostbyname_file() when /etc/hosts doesn't have an entry + +- SonarCloud: fix up codesmells (const, unneeded casts, reduce complexity) + +GitHub (30 Oct 2023) +- [Brad House brought this change] + + Replace hosts parser, add caching capabilities (#591) + + HOSTS FILE PROCESSING OVERVIEW + ============================== + The hosts file on the system contains static entries to be processed locally + rather than querying the nameserver. Each row is an IP address followed by + a list of space delimited hostnames that match the ip address. This is used + for both forward and reverse lookups. + + We are caching the entire parsed hosts file for performance reasons. Some + files may be quite sizable and as per Issue #458 can approach 1/2MB in size, + and the parse overhead on a rapid succession of queries can be quite large. + The entries are stored in forwards and backwards hashtables so we can get + O(1) performance on lookup. The file is cached until the file modification + timestamp changes (or 60s if there is no implemented stat() capability). + + The hosts file processing is quite unique. It has to merge all related hosts + and ips into a single entry due to file formatting requirements. For + instance take the below: + ``` + 127.0.0.1 localhost.localdomain localhost + ::1 localhost.localdomain localhost + 192.168.1.1 host.example.com host + 192.168.1.5 host.example.com host + 2620:1234::1 host.example.com host6.example.com host6 host + ``` + This will yield 2 entries. + 1) ips: `127.0.0.1,::1` + hosts: `localhost.localdomain,localhost` + 2) ips: `192.168.1.1,192.168.1.5,2620:1234::1` + hosts: `host.example.com,host,host6.example.com,host6` - * add ares_strsplit unit test + It could be argued that if searching for `192.168.1.1` that the `host6` + hostnames should not be returned, but this implementation will return them + since they are related (both ips have the fqdn of host.example.com). It is + unlikely this will matter in the real world. - The test reveals a bug in the implementation of ares_strsplit when the - make_set parameter is set to 1, as distinct domains are confused for - equal: - out = ares_strsplit("example.com, example.co", ", ", 1, &n); + Fix By: Brad House (@bradh352) + +- [Brad House brought this change] + + cleanups: split functions out into different files, rename some to be more logical (#589) + +Brad House (27 Oct 2023) +- fix comment + +- recursive git attributes + +Version 1.21.0 (26 Oct 2023) + +Brad House (26 Oct 2023) +- SonarCloud: reduce reported complexity that exists for no reason. + +- SonarCloud: fix some #undef codesmells + +- formatting + +- document ARES_RR_* records + +- no reason to limit on truncation + +- linguist fixes + +- don't use test cases to determine language of c-ares + +- fix grammar + +- fix count + +GitHub (25 Oct 2023) +- [Brad House brought this change] + + 1.21.0 release prep (#585) + +Brad House (25 Oct 2023) +- fix build warning + +GitHub (25 Oct 2023) +- [Brad House brought this change] + + SonarCloud: clean up more codesmells (#584) + +Brad House (25 Oct 2023) +- resolve reported memory leaks + +- add test vector said to cause a memory leak + +GitHub (25 Oct 2023) +- [Brad House brought this change] + + sonarcloud: fix more codesmells (#583) + +- [Brad House brought this change] + + sonarcloud easy codesmells (#582) - evaluates to n = 1 with out = { "example.com" }. + Fix By: Brad House (@bradh352) + +- [Brad House brought this change] + + Modernization: replace multiple hand-parsers with new memory-safe parser (#581) - * bugfix and cleanup of ares_strsplit + New DNS record parsing code. The old code was basically just some helper macros and functions for parsing an entire DNS message. The caller had to know the RFCs to use the parsers, except for some pre-made exceptions. The new parsing code parses the entire DNS message into an opaque data structure in a memory safe manner with various accessors for reading and manipulating the data. - The purpose of ares_strsplit in c-ares is to split a comma-delimited - string of unique (up to letter case) domains. However, because the - terminating NUL byte was not checked in the substrings when comparing - for uniqueness, the function would sometimes drop domains it should - not. For example, + The existing parser helpers for the various record types were reimplemented as wrappers around the new parser. - ares_strsplit("example.com, example.co", ",") + The accessors allow easy iteration across the DNS record datastructure, and can be used to easily create dig-like output without needing to know anything about the various record types and formats as dynamic helpers are provided for enumeration of values and data types of those values. - would only result in a single domain "example.com". + At some point in the future, this new DNS record structure, accessors, and parser will be exposed publicly. This is not done at this point as we don't want to do that until the API is completely stable. Likely a write() function to output the DNS record back into an actual message buffer will be introduced with the stable API as well. - Aside from this bugfix, the following cleanup is performed: + Some subtle bugs in the existing code were uncovered, some which had test cases which turned out to be bogus. Validation with third-party implementations (e.g. BIND9) were performed to validate such cases were indeed bugs. - 1. The tokenization now happens with the help of strcspn instead of the - custom function is_delim. - 2. The function list_contains has been inlined. - 3. The interface of ares_strsplit has been simplified by removing the - parameter make_set since in practice it was always 1. - 4. There are fewer passes over the input string. - 5. We resize the table using realloc() down to its minimum size. - 6. The docstring of ares_strsplit is updated and also a couple typos - are fixed. + Adding additional RR parsers such as for TLSA (#470) or SVCB/HTTPS (#566) are trivial now since focus can be put on only parsing the data within the RR, not the entire message. That said, as the new parser is not yet public, it isn't clear the best way to expose any new RRs (probably best to wait for the new parser to be public rather than hacking in another legacy function). - There occurs a single use of ares_strsplit and since the make_set - parameter has been removed, the call in ares_init.c is modified - accordingly. The unit test for ares_strsplit is also updated. + Some additional RRs that are part of DNS RFC1035 or EDNS RFC6891 that didn't have previously implemented parsers are now also implemented (e.g. HINFO, OPT). Any unrecognized RRs are encapsulated into a "RAW_RR" as binary data which can be inserted or extracted, but are otherwise not interpreted in any way. - Fix By: Nikolaos Chatzikonstantinou (@createyourpersonalaccount) + Fix By: Brad House (@bradh352) -bradh352 (23 Oct 2022) -- CirrusCI: update freebsd image +- [Gregor Jasny brought this change] + + feat: use CMake to control symbol visibility (#574) - Old FreeBSD image for CirrusCI has issues with newer symbols, update to later one. + In contrast to #572 this solution does not need any extra headers. But it is also limited to GCC-like compilers. - Fix By: Brad House (@bradh352) + Fix By: Gregor Jasny (@gjasny) -GitHub (23 Oct 2022) -- [Stephen Sachs brought this change] +- [Brad House brought this change] - Fix Intel compiler deprecated options (#485) + remove ares_nowarn helpers #580 - Options `-we ###` and `-wd ###` should not include a whitespace. They are also deprecated and `-diag-error` and `-diag-disable` are their replacements. + Now that the code internally is using proper datatypes, there is no longer a need for ares_nowarn helpers. Remove them. - Intel compiler 2021.6 is not able to be used in configure without the proposed patch. + Fix By: Brad House (@bradh352) + +Brad House (16 Oct 2023) +- clang-format: fix structure alignment - Fix By: Stephen Sachs (@stephenmsachs) + It appears the structure alignment chosen just doesn't work right. + Switch to 'left', it appears to be mostly correct. + + Fix By: Brad House (@bradh352) -- [Jonathan Ringer brought this change] +GitHub (15 Oct 2023) +- [Brad House brought this change] - Allow for CMake to use absolute install paths (#486) + Reformat code using clang-format (#579) - Generated libcares.pc could have bad paths when using absolute paths. + c-ares uses multiple code styles, standardize on one. Talking with @bagder he feels strongly about maintaining an 80 column limit, but feels less strongly about things I feel strongly about (like alignment). - Fix By: Jonathan Ringer (@jonringer) + Can re-run the formatter on the codebase via: + ``` + clang-format -i */*.c */*.h */*/*.c */*/*.h + ``` + + Fix By: Brad House (@bradh352) -- [Thomas Dreibholz brought this change] +Brad House (15 Oct 2023) +- inet_ntop requires ares_private.h - Fix for issue #488: ensure that the number of iovec entries does not exceed system limits. (#489) +- SonarCloud: Fix additional code smells - c-ares could try to exceed maximum number of iovec entries supported by system. + Fix By: Brad House (@bradh352) + +- SonarCloud: Ignore codesmells c89 doesn't support - Fix By: Thomas Dreibholz (@dreibh) + C89 doesn't support iterator declaration in for loop, kill warning. + + Fix By: Brad House (@bradh352) -- [bsergean brought this change] +GitHub (15 Oct 2023) +- [Brad House brought this change] - Add include guards to ares_data.h (#491) + set compiler standard to ISO C90/ANSI C89 (#577) - All the other header files in the src/lib folder do have an include guard so it look like an overthought. + SonarCloud is outputting some code smells for things that aren't possible for C89. Hopefully setting the code standard to C89/C90 properly will fix those bogus warnings. - Fix By: @bsergean + Fix By: Brad House (@bradh352) -- [Brad Spencer brought this change] +Brad House (15 Oct 2023) +- fix new ares_strcpy to ensure null termination - Fix typo in docs for ares_process_fd (#490) +- build fix + +GitHub (15 Oct 2023) +- [Brad House brought this change] + + SonarCloud: Fix up codesmells due to strlen(), strcpy(), and strncpy() (#576) - A single letter was missing + Create ares_strlen() and ares_strcpy() in order to resolve SonarCloud codesmells related to their use. - Fix By: Brad Spencer (@b-spencer) + ares_strlen() just becomes null-safe. + + ares_strcpy() is equivalent to strlcpy(), so unlike strncpy() it guarantees NULL termination. + + Fix By: Brad House (@bradh352) -- [lifenjoiner brought this change] +Brad House (15 Oct 2023) +- SonarCloud: try to appease it better - tools: refine help (#481) +- SonarCloud: Fix reported bugs - fix invalid help options and documentation typos + SonarCloud reported a few bugs, this commit should fix those reports. - Fix By: @lifenjoiner + Fix By: Brad House (@bradh352) -- [lifenjoiner brought this change] +GitHub (15 Oct 2023) +- [Brad House brought this change] - Git: ignore CMake temporary files (#480) + Fix internal datatype usage and warnings (#573) - exclude more files from git + PR #568 increased the warning levels and c-ares code emitted a bunch of warnings. This PR fixes those warnings and starts transitioning internal data types into more proper forms (e.g. data lengths should be size_t not int). It does, however, have to manually cast back to what the public API needs due to API and ABI compliance (we aren't looking to break integrations, just clean up internals). - Fix By: @lifenjoiner + Fix By: Brad House (@bradh352) -- [lifenjoiner brought this change] +Brad House (15 Oct 2023) +- SonarCloud: exclude tests - adig: fix `-T` option (#479) +- fix source directories + +GitHub (15 Oct 2023) +- [Brad House brought this change] + + Sonarcloud (#575) + +- [Brad House brought this change] + + Increase compiler warnings by default (#568) - Helper was missing flag to enable TCP mode of operation. + c-ares was missing a couple of common compiler warnings during building that are widely recognized as a best practice. This PR makes no code changes, only build system changes to increase warning levels. - Fix By: @lifenjoiner + This PR does cause some new warnings to be emitted, a follow-up PR will address those. + + Fix By: Brad House (@bradh352) -- [Frank brought this change] +- [Brad House brought this change] - Add vcpkg installation instructions (#478) + introduce ares_bool_t datatype (#570) - Update to include vcpkg installation instructions + c-ares currently uses int for boolean, which can be confusing as there are some functions which return int but use '0' as the success condition. Some internal variable usage is similar. Lets try to identify the boolean use cases and split them out into their own data type of ares_bool_t. Since we're trying to keep C89 compatibility, we can't rely on stdbool.h or the _Bool C99 data type, so we'll define our own. - Fix By: @FrankXie05 + Also, chose using an enum rather than say unsigned char or int because of the type safety benefits it provides. Compilers should warn if you try to pass, ARES_TRUE on to a ares_status_t enum (or similar) since they are different enums. + + Fix By: Brad House (@bradh352) -- [marc-groundctl brought this change] +Brad House (12 Oct 2023) +- Socket callbacks were passed SOCK_STREAM instead of SOCK_DGRAM on udp + + A regression was introduced in 1.20.0 that would pass SOCK_STREAM on udp + connections due to code refactoring. If a client application validated this + data, it could cause issues as seen in gRPC. + + Fixes Issue: #571 + Fix By: Brad House (@bradh352) - Convert total timeout to per-query (#467) +- Enhance test of ares_getsock() - On Apple platforms, libresolv reports the total timeout in retrans, not the per-query time. This patch undoes that math to get the per-query time, which is what c-ares expects. This is not perfect because libresolv is inconsistent on whether the timeout is multiplied by retry or retry+1, but I don't see any way to distinguish these cases. + In an attempt to see if ares_getsock() was broken as per #571, do + further sanity checks of the results of ares_getsock(). It seems + as though ares_getsock() is fine. - Fix By: Marc Aldorasi (@marc-groundctl) + Fix By: Brad House (@bradh352) -- [marc-groundctl brought this change] +GitHub (10 Oct 2023) +- [Brad House brought this change] - Don't include version info in the static library (#468) + Tool: STAYOPEN flag could make tools not terminate (#569) - The static library should not contain version info, since it would be linked into an executable or dll with its own version info. + If a flag is set to keep the connections to the DNS servers open even if there are no queries, the tools would not exit until the remote server closed the connection due to the user of ares_fds() to determine if there are any active queries. Instead, rely on ares_timeout() returning NULL if there are no active queries (technically this returns the value passed to max_tv in ares_timeout(), but in our use case, that is always NULL). - Fix By: @marc-groundctl + Fixes Issue: #452 + Fix By: Brad House (@bradh352) -- [Ridge Kennedy brought this change] +- [Brad House brought this change] - Fix ares_getaddrinfo() numerical address fast path with AF_UNSPEC (#469) + ares_status_t enum for status codes (#567) - The conversion of numeric IPv4 addresses in fake_addrinfo() is broken when - the family is AF_UNSPEC. The initial call to ares_inet_pton with AF_INET - will succeed, but the subsequent call using AF_INET6 will fail. This results - in the fake_addrinfo() fast path failing, and ares_getaddrinfo() making a - query when none should be required. + The list of possible error codes in c-ares was a #define list. This not only doesn't provide for any sort of type safety but it also lacks clarification on what a function may return or what it takes, as an int could be an ares status, a boolean, or possibly even a length in the current code. - Resolve this by only attempting the call to ares_inet_pton with AF_INET6 - if the initial call with AF_INET was unsuccessful. + We are not changing any public APIs as though the C standard states the underlying size and type of an enum is int, there are compiler attributes to override this as well as compiler flags like -fshort-enums. GCC in particular is known to expand an enum's width based on the data values (e.g., it can emit a 64bit integer enum). - Fix By: Ridge Kennedy (@ridgek) + All internal usages should be changed by this PR, but of course, there may be some I missed. + + Fix By: Brad House (@bradh352) -- [Manish Mehra brought this change] +Daniel Stenberg (9 Oct 2023) +- docs: provide better man page references + + When referring to another c-ares function use \fI function(3) \fP to let + the webpage rendering find and cross-link them appropriately. + + SEE ALSO references should be ".BR name (3),", with a space before the + open parenthesis. This helps the manpage to HTML renderer. + + Closes #565 - Configurable hosts path for file_lookup (#465) +Version 1.20.1 (8 Oct 2023) + +GitHub (8 Oct 2023) +- [Daniel Stenberg brought this change] + + ares-test: silence warning (#564) - This changeset adds support for configurable hosts file - ARES_OPT_HOSTS_FILE (similar to ARES_OPT_RESOLVCONF). + warning: comparison of integer expressions of different signedness - Co-authored-by: Manish Mehra (@mmehra) + Fix By: Daniel Stenberg (@bagder) -bradh352 (27 Apr 2022) -- CMake: Windows DLLs lack version information +Brad House (8 Oct 2023) +- fix README.md + +GitHub (8 Oct 2023) +- [Brad House brought this change] + + 1.20.1 release (#563) + +- [Brad House brought this change] + + fix reference to freed memory (#562) - The cares.rc was not included in the build for CMake. Conditionally - add it when building for Windows. + Issue #561 shows free'd memory could be accessed in some error conditions. + Fixes Issue #561 Fix By: Brad House (@bradh352) - Fixes Bug: #460 -GitHub (27 Apr 2022) -- [Kai Pastor brought this change] +Brad House (8 Oct 2023) +- reported build/test systems may timeout on intensive tests. reduce test case to still be relevant but to reduce false positive errors - CMake: Guard target creation in exported config (#464) +GitHub (8 Oct 2023) +- [Gregor Jasny brought this change] + + Regression: Fix typo in fuzzcheck target name (#559) - User projects may call 'find_package(c-ares)' multiple times (e.g. - via dependencies), but targets must be created only once. - Shared and static target must be treated independently. + This seems to be a vim'esque typo introduced with c1b00c41. - Fix By: Kai Pastor (@dg0yt) + Fix By: Gregor Jasny (@gjasny) -bradh352 (27 Apr 2022) -- Honor valid DNS result even if other class returned an error - - When using ares_getaddrinfo() with PF_UNSPEC, if a DNS server returned - good data on an A record, followed by bad data on an AAAA record, the - good record would be thrown away and an error returned. +Version 1.20.0 (6 Oct 2023) + +Brad House (6 Oct 2023) +- fix slist search off by 1 + +GitHub (6 Oct 2023) +- [Brad House brought this change] + + 1.20.0 release prep (#557) + +- [Brad House brought this change] + + ares__buf should return standard error codes. more helpers implemented. (#558) - If we got a good response from one of the two queries, regardless of - the order returned, we should honor that. + The purpose of this PR is to hopefully make the private API of this set of routines less likely to need to be changed in a future release. While this is not a public API, it could become harder in the future to change usage as it becomes more widely used within c-ares. - Fix By: Dmitry Karpov (dkarpov@roku.com) - Signed Off By: Brad House (@bradh352) + Fix By: Brad House (@bradh352) -GitHub (2 Apr 2022) -- [Sam James brought this change] +- [Brad House brought this change] - configure.ac: fix STDC_HEADERS typo (#459) - - There is no autoconf macro called STDC_HEADERS. AC_HEADER_STDC however does - exist and it defines the STDC_HEADERS macro for use. + Update from 1989 MIT license text to modern MIT license text (#556) - Not clear that STDC_HEADERS from its use in the repo is needed but - would rather not meddle with it for now. + ares (and thus c-ares) was originally licensed under the 1989 MIT license text: + https://fedoraproject.org/wiki/Licensing:MIT#Old_Style_(no_advertising_without_permission) - Fixes an annoying warning on `./configure`: - ``` - /var/tmp/portage/net-dns/c-ares-1.18.1/work/c-ares-1.18.1/configure: 24546: STDC_HEADERS: not found - ``` + This change updates the license to the modern MIT license as recognized here: + https://opensource.org/license/mit/ - Signed-off-by: Sam James - -bradh352 (2 Mar 2022) -- Asterisks should be allowed in host validation as CNAMEs may reference wildcard domains + care has been taken to ensure correct attributions remain for the authors contained within the copyright headers, and all authors with attributions in the headers have been contacted for approval regarding the change. Any authors which were not able to be contacted, the original copyright maintains, luckily that exists in only a single file `ares_parse_caa_reply.c` at this time. - CloudFlare appears to use this logic in CNAMEs as per - https://github.com/nodejs/node/issues/42171 + Please see PR #556 for the documented approvals by each contributor. - Fixes: #457 Fix By: Brad House (@bradh352) -- Don't return on file lookup failure, set status +- [Brad House brought this change] + + Test Harness: use ares_timeout() to calculate the value to pass to select() these days. (#555) - When resolving a host via /etc/hosts, don't return with a predefined - error as there may be other tries. + The test framework was using 100ms timeout passed to select(), and not using ares_timeout() to calculate the actual recommended value based on the queries in queue. Using ares_timeout() tests the functionality of ares_timeout() itself and will provide more responsive results. Fix By: Brad House (@bradh352) -- 'localhost' special treatment enhancement +- [Brad House brought this change] + + Fix for TCP back to back queries (#552) - Since localhost is special-cased, any errors should be ignored when - reading /etc/hosts as otherwise we could return an error if there - were for instance an invalidly formatted /etc/hosts or if /etc/hosts - had a permissions error while reading. + As per #266, TCP queries are basically broken. If we get a partial reply, things just don't work, but unlike UDP, TCP may get fragmented and we need to properly handle that. - This exact behavior appears to have been seen on OS/400 PASE - environments which allows AIX binares to run. + I've started creating a basic parser/buffer framework for c-ares for memory safety reasons, but it also helps for things like this where we shouldn't be manually tracking positions and fetching only a couple of bytes at a time from a socket. This parser/buffer will be expanded and used more in the future. + This also resolves #206 by allowing NULL to be specified for some socket callbacks so they will auto-route to the built-in c-ares functions. + + Fixes: #206, #266 Fix By: Brad House (@bradh352) -- If chain building c-ares as part of another project, detect of res_servicename could fail (#451) +- [Brad House brought this change] + + remove acountry from built tools as nerd.dk is gone (#554) - If libresolv is already included with the build, c-ares wouldn't properly detect its use. + The acountry utility required a third party DNSBL service from nerd.dk in order to operate. That service has been offline for about a year and there is no other comparable service offering. We are keeping the code in the repository as an example, but no longer building it. - May fix: #451 - Fix by: Brad House (@bradh352) - -- no analyze capability on ios - -- attempt to use scan-build on ios - -- disable tests on ios - -- fix switch statement - -- code coverage had gotten disabled + Fixes: #537 + Fix By: Brad House (@bradh352) -- looks like shell expansion doesn't work with cirrus-ci, lets do it another way +- [Brad House brought this change] -- attempt to autobuild for iOS + Don't requeue any queries for getaddrinfo() during destruction. (#553) + + During ares_destroy(), any outstanding queries are terminated, however ares_getaddrinfo() had an ordering issue with status codes which in some circumstances could lead to a new query being enqueued rather than honoring the termination. + + Fixes #532 + Fix By: @Chilledheart and Brad House (@bradh352) -GitHub (8 Dec 2021) - [Brad House brought this change] - Windows: rework/simplify initialization code, drop long EOL systems (#445) + ares_getaddrinfo(): Fail faster on AF_UNSPEC if we've already received one address class (#551) - There was a lot of windows initialization code specific to the era that predates Windows Vista such as reading DNS configuration from the registry, and dynamically loading libraries to get access to functions that didn't exist in XP or earlier releases. + As per #541, when using AF_UNSPEC with ares_getaddrinfo() (and in turn with ares_gethostbynam()) if we receive a successful response for one address class, we should not allow the other address class to continue on with retries, just return the address class we have. - Vista was released in January 2007, and was EOL'd in 2017, and support for Vista is still maintained with this patch set. + This will limit the overall query time to whatever timeout remains for the pending query for the other address class, it will not, however, terminate the other query as it may still prove to be successful (possibly coming in less than a millisecond later) and we'd want that result still. It just turns off additional error processing to get the result back quicker. - XP was EOL'd in Apr 8 2014. + Fixes Bug: #541 + Fix By: Brad House (@bradh352) + +- [Sam Morris brought this change] + + Avoid producing an ill-formed result when qualifying a name with the root domain (#546) - I believe the last OS based on something earlier than Vista was POSReady 2009, as it was XP based for some reason, and that was EOL'd in January 2019. Considering any POS system falls under the PCI-DSS rules, they aren't allow to run POSReady 2009 any more so there is no reason to try to continue supporting such systems. + This prevents the result of qualifying "name" with "." being "name.." which is ill-formed. - We have also targeted with our build system Vista support for the last few years, and while developers could change the target, we haven't had any reports that they have. + Fixes Bug: #545 + Fix By: Sam Morris (@yrro) -bradh352 (9 Nov 2021) -- Fix memory leak in reading /etc/hosts +- [Brad House brought this change] + + Configuration option to limit number of UDP queries per ephemeral port (#549) - When an /etc/hosts lookup is performed, but fails with ENOTFOUND, and - a valid RFC6761 Section 6.3 fallback is performed, it could overwrite - variables that were already set and therefore leave the pointers - dangling, never to be cleaned up. + Add a new ARES_OPT_UDP_MAX_QUERIES option with udp_max_queries parameter that can be passed to ares_init_options(). This value defaults to 0 (unlimited) to maintain existing compatibility, any positive number will cause new UDP ephemeral ports to be created once the threshold is reached, we'll call these 'connections' even though its technically wrong for UDP. - Clean up explicitly on ENOTFOUND when returning from the file parser. + Implementation Details: + * Each server entry in a channel now has a linked-list of connections/ports for udp and tcp. The first connection in the list is the one most likely to be eligible to accept new queries. + * Queries are now tracked by connection rather than by server. + * Every time a query is detached from a connection, the connection that it was attached to will be checked to see if it needs to be cleaned up. + * Insertion, lookup, and searching for connections has been implemented as O(1) complexity so the number of connections will not impact performance. + * Remove is_broken from the server, it appears it would be set and immediately unset, so must have been invalidated via a prior patch. A future patch should probably track consecutive server errors and de-prioritize such servers. The code right now will always try servers in the order of configuration, so a bad server in the list will always be tried and may rely on timeout logic to try the next. + * Various other cleanups to remove code duplication and for clarification. - Fixes: #439 + Fixes Bug: #444 Fix By: Brad House (@bradh352) -GitHub (2 Nov 2021) -- [Bobby Reynolds brought this change] +- [Brad House brought this change] - Fix cross-compilation from Windows to Linux due to CPACK logic (#436) - - When determining value for CPACK_PACKAGE_ARCHITECTURE, prefer to use - value from CMAKE_SYSTEM_PROCESSOR before falling back to uname output. + its not 1991 anymore, lower default timeout and retry count (#542) - Additionally, if building from a Windows host, emit a fatal error - instead of attempting to call uname. + A lot of time has passed since the original timeouts and retry counts were chosen. We have on and off issues reported due to this. Even on geostationary satellite links, latency is worst case around 1.5s. This PR changes the per-server timeout to 2s and the retry count lowered from 4 to 3. - Fix By: Bobby Reynolds (@reynoldsbd) + Fix By: Brad House (@bradh352) -bradh352 (1 Nov 2021) -- fix coveralls link +- [Brad House brought this change] -- coveralls needs token + Modernization: Implement base data-structures and replace usage (#540) + + c-ares currently lacks modern data structures that can make coding easier and more efficient. This PR implements a new linked list, skip list (sorted linked list), and hashtable implementation that are easy to use and hard to misuse. Though these implementations use more memory allocations than the prior implementation, the ability to more rapidly iterate on the codebase is a bigger win than any marginal performance difference (which is unlikely to be visible, modern systems are much more powerful than when c-ares was initially created). + + The data structure implementation favors readability and audit-ability over performance, however using the algorithmically correct data type for the purpose should offset any perceived losses. + + The primary motivation for this PR is to facilitate future implementation for Issues #444, #135, #458, and possibly #301 + + A couple additional notes: + + The ares_timeout() function is now O(1) complexity instead of O(n) due to the use of a skiplist. + Some obscure bugs were uncovered which were actually being incorrectly validated in the test cases. These have been addressed in this PR but are not explicitly discussed. + Fixed some dead code warnings in ares_rand for systems that don't need rc4 + + Fix By: Brad House (@bradh352) -- coveralls appears to require git +- [Jérôme Duval brought this change] -- fix a couple of coveralls vars + fix missing prefix for CMake generated libcares.pc (#530) + + 'pkg-config grpc --cflags' complains with: + Variable 'prefix' not defined in libcares.pc + + Fix By: Jérôme Duval (@korli) -- more coveralls fixes +bradh352 (11 Jul 2023) +- windows get_DNS_Windows port fix for ipv6 -- add code coverage libs to LDADD instead of _LIBS +- windows get_DNS_Windows port is in network byte order -- make verbose +- backoff to debian 11 due to coverage check failure -- try to fix code coverage building +- extend on PR #534, windows should also honor a port -- need -y for install +GitHub (11 Jul 2023) +- [Brad House brought this change] -- try to fix asan/ubsan/lsan when built with clang. try to support code coverage properly. + Support configuration of DNS server ports (#534) + + As per https://man.openbsd.org/OpenBSD-5.1/resolv.conf.5 we should + support bracketed syntax for resolv.conf entries to contain an optional + port number. + + We also need to utilize this format for configuration of MacOS + DNS servers as seen when using the Viscosity OpenVPN client, where + it starts a private DNS server listening on localhost on a non-standard + port. + + Fix By: Brad House (@bradh352) -- try another path +Daniel Stenberg (9 Jun 2023) +- provide SPDX identifiers and a REUSE CI job to verify + + All files have their licence and copyright information clearly + identifiable. If not in the file header, they are set separately in + .reuse/dep5. + + All used license texts are provided in LICENSES/ -- fix pip +GitHub (30 May 2023) +- [Alexey A Tikhonov brought this change] -- attempt to enable some other build types that travis supported + Remove unreachable code as reported by Coverity (#527) + + Coverity reported some code as unreachable. A manual inspection confirmed the reports. + + Fix By: Alexey A Tikhonov (@alexey-tikhonov) -Version 1.18.1 (26 Oct 2021) +- [Ben Noordhuis brought this change] -bradh352 (26 Oct 2021) -- missed version + rand: add support for getrandom() (#526) + + glibc provides arc4random_buf() but musl does not and /dev/urandom is + not always available. -- 1.18.1 release prep +- [Tim Wojtulewicz brought this change] -- ares_getaddrinfo() was returning the wrong size for ai_addrlen + Replace uses of sprintf with snprintf (#525) - ai_addrlen was erroneously returning 16 bytes instead of the - sizeof(struct sockaddr_in6). This is a regression introduced - in 1.18.0. + sprintf isn't safe even if you think you are using it right. Switch to snprintf(). - Reported by: James Brown - Fix By: Brad House (@bradh352) + Fix By: Tim Wojtulewicz (@timwoj) -- Windows: autotools force linking to iphlpapi +bradh352 (23 May 2023) +- update version and release procedure -GitHub (26 Oct 2021) -- [Gregor Jasny brought this change] +GitHub (22 May 2023) +- [Douglas R. Reno brought this change] - Fix typo detected by lintian (#434) + INSTALL.md: Add Watcom instructions and update Windows documentation URLs (#524) - typo in docs for ares_parse_uri_reply + This commit adds instructions on how to use the WATCOM compiler to build c-ares. This was just tested on c-ares-1.19.1 and works well. - Fix By: Gregor Jasny (@gjasny) - -Version 1.18.0 (25 Oct 2021) + While going through the links for the C Runtime documentation for Windows systems, I discovered that all three of the KB articles that were linked are now nonexistent. This commit replaces KB94248 with the current replacement available on Microsoft's website, which also makes the other two KB articles obsolete. + + Fix By: Douglas R. Reno (@renodr) -bradh352 (25 Oct 2021) -- replace Travis badge with Cirrus-CI badge +Version 1.19.1 (22 May 2023) -- c-ares 1.18.0 release prep +bradh352 (22 May 2023) +- Makefile.inc Windows requires tabs not spaces for nmake -GitHub (21 Oct 2021) -- [Jérôme Duval brought this change] +GitHub (22 May 2023) +- [Daniel Stenberg brought this change] - Haiku: port (#431) + ares_expand_name: fix compiler warnings (#522) - Port for Haiku. Slight CMake changes, header changes, and resolv.conf/hosts paths specific to Haiku. + Fix some compiler warnings (not introduced in this release) - Port By: Jérôme Duval (@korli) - -bradh352 (19 Oct 2021) -- valgrind: fix reported invalid read - -- make sure distcheck runs - -- detect oddities and skip test if necessary + Fix By: Daniel Stenberg (@bagder) -- fix null ptr deref in strlen +bradh352 (22 May 2023) +- windows MSVC compiler fix on 32bit -- bend over backwards for testing file access, something is weird on debian +- update security advisory links -- chmod(fn, 0) is failing on debian +- minor CI issues fixes for imported inet_net_pton -- maybe process needs to be called +- ares_rand static analysis fixes from CI -- split test output +- windows build fix -- clean up a couple of compiler warnings +- security release notes -- use helper function for addrinfo to simplify code +GitHub (22 May 2023) +- [Brad House brought this change] -- INSTANTIATE_TEST_CASE_P -> INSTANTIATE_TEST_SUITE_P as new convention in googletest + Merge pull request from GHSA-9g78-jv2r-p7vc -- gmock: update from 1.8.0 to 1.11.0 +- [Brad House brought this change] -- Cirrus-CI: fix debian arm build - -- Cirrus-CI: more updates for proper testing - -- install proper packages for asan and analyze - -- fix crash in tests - -- try to disable container tests - -- need g++ for tests on debian - -- try cirrus-ci again - -- whitespace - -- start bringing up cirrus-ci - -- prep for adding new ci - -- fix cut and paste error - -GitHub (18 Oct 2021) -- [Brad House brought this change] - - RFC6761: special case "localhost" (#430) - - As per RFC6761 Section 6.3, "localhost" lookups need to be special cased to return loopback addresses, and not forward queries to recursive dns servers. + Merge pull request from GHSA-x6mf-cxr9-8q6v - We first look up via files (/etc/hosts or equivalent), and if that fails, we then attempt a system-specific address enumeration for loopback addresses (currently Windows-only), and finally fallback to ::1 and 127.0.0.1. + * Merged latest OpenBSD changes for inet_net_pton_ipv6() into c-ares. + * Always use our own IP conversion functions now, do not delegate to OS + so we can have consistency in testing and fuzzing. + * Removed bogus test cases that never should have passed. + * Add new test case for crash bug found. Fix By: Brad House (@bradh352) - Fixes Bug: #399 - [Brad House brought this change] - Reimplement ares_gethostbyname() by wrapping ares_getaddrinfo() (#428) - - ares_gethostbyname() and ares_getaddrinfo() do a lot of similar things, however ares_getaddrinfo() has some desirable behaviors that should be imported into ares_gethostbyname(). For one, it sorts the address lists for the most likely to succeed based on the current system routes. Next, when AF_UNSPEC is specified, it properly handles search lists instead of first searching all of AF_INET6 then AF_INET, since ares_gethostbyname() searches in parallel. Therefore, this PR should also resolve the issues attempted in #94. + Merge pull request from GHSA-8r8p-23f3-64c2 - A few things this PR does: + * segment random number generation into own file - 1. ares_parse_a_reply() and ares_parse_aaaa_reply() had very similar code to translate struct ares_addrinfo into a struct hostent as well as into struct ares_addrttl/ares_addr6ttl this has been split out into helper functions of ares__addrinfo2hostent() and ares__addrinfo2addrttl() to prevent this duplicative code. + * abstract random code to make it more modular so we can have multiple backends - 2. ares_getaddrinfo() was apparently never honoring HOSTALIASES, and this was discovered once ares_gethostbyname() was turned into a wrapper, the affected test cases started failing. + * rand: add support for arc4random_buf() and also direct CARES_RANDOM_FILE reading - 3. A slight API modification to save the query hostname into struct ares_addrinfo as the last element of name. Since this is the last element, and all user-level instances of struct ares_addrinfo are allocated internally by c-ares, this is not an ABI-breaking change nor would it impact any API compatibility. This was needed since struct hostent has an h_name element. + * autotools: fix detection of arc4random_buf - 4. Test Framework: MockServer tests via TCP would fail if more than 1 request was received at a time which is common when ares_getaddrinfo() queries for both A and AAAA records simultaneously. Infact, this was a long standing issue in which the ares_getaddrinfo() test were bypassing TCP alltogether. This has been corrected, the message is now processed in a loop. + * rework initial rc4 seed for PRNG as last fallback - 5. Some tests had to be updated for overall correctness as they were invalid but somehow passing prior to this change. + * rc4: more proper implementation, simplified for clarity - Change By: Brad House (@bradh352) + * clarifications -bradh352 (9 Oct 2021) -- ares_getaddrinfo() missing sanity check to fix #426 +bradh352 (20 May 2023) +- add public release note information -- ares_getaddrinfo(): continue to next domain in search if query returns ARES_ENODATA +- bump version to 1.19.1 + +GitHub (6 May 2023) +- [Gregor Jasny brought this change] + + test: fix warning about uninitialized memory (#515) - Some DNS servers may behave badly and return a valid response with no data, in this - case, continue on to the next search domain, but cache the result. + fix warning in tests - Fixes Bug: #426 - Fix By: Brad House (@bradh352) + Fix By: Gregor Jasny (@gjasny) -- Allow '/' as a valid character for a returned name +- [lifenjoiner brought this change] + + Turn off IPV6_V6ONLY on Windows if it is supported (#520) - As of c-ares 1.17.2, a CNAME an in-addr.arpa delegation broke due - to not allowing '/'. This needs to be allowed to not break valid - functionality. + Turn off IPV6_V6ONLY on Windows if it is supported, support for IPv4-mapped IPv6 addresses. - Fixes Bug: #427 - Reported By: Adrian (@leftshift) - Fix By: Brad House (@bradh352) + IPV6_V6ONLY refs: + https://en.wikipedia.org/wiki/IPv6#IPv4-mapped_IPv6_addresses + https://github.com/golang/go/blob/master/src/net/ipsock_posix.go + https://en.wikipedia.org/wiki/Unix-like + off: + https://www.kernel.org/doc/html/latest/networking/ip-sysctl.html#proc-sys-net-ipv6-variables + https://man.netbsd.org/inet6.4 + https://man.freebsd.org/cgi/man.cgi?query=inet6 + https://github.com/apple-oss-distributions/xnu/blob/main/bsd/man/man4/inet6.4 + on: + https://learn.microsoft.com/en-us/windows/win32/winsock/ipproto-ipv6-socket-options + acts like off, but returns 1 and dummy setting: + https://man.dragonflybsd.org/?command=inet6 + https://man.dragonflybsd.org/?command=ip6 + unsupported and read-only returns 1: + https://man.openbsd.org/inet6.4 + + default value refs: + https://datatracker.ietf.org/doc/html/rfc3493#section-5.3 + https://www.kernel.org/doc/html/latest/networking/ip-sysctl.html#proc-sys-net-ipv6-variables -Daniel Stenberg (5 Oct 2021) -- libcares.pc.in: update the URL +- [Brad House brought this change] -bradh352 (8 Sep 2021) -- ares_expand_name should allow underscores (_) as SRV records legitimately use them + Merge pull request from GHSA-54xr-f67r-4pc4 - c-ares 1.17.2 introduced response validation to prevent a security issue, however - it did not have (_) listed as a valid character for domain name responses which - caused issues when a CNAME referenced a SRV record which contained underscores. + * CARES_RANDOM_FILE should always default to /dev/urandom - While RFC2181 section 11 does explicitly state not to do validation, that applies - to servers not clients. + During cross-compilation, CARES_RANDOM_FILE may not be able to be appropriately + detected, therefore we should always set it to /dev/urandom and allow the + entity requesting compilation override the value. The code does appropriately + fall back if CARES_RANDOM_FILE cannot be opened. - Fixes: #424 - Fix By: Brad House (@bradh352) + * use set not option -Daniel Stenberg (7 Sep 2021) -- domain: update to use c-ares.org +bradh352 (18 Mar 2023) +- ares_getaddrinfo using service of "0" should be allowed - Closes #423 - -- mailing list: moved to lists.haxx.se + As per #517 glibc allows a service/servname of "0" to be treated the + same as if NULL was provided. Also, add a sanity check to ensure + the port number is in range instead of a blind cast. + + Fixes: #517 + Fix By: Brad House (@bradh352) -GitHub (3 Sep 2021) -- [Biswapriyo Nath brought this change] +GitHub (10 Feb 2023) +- [Nikolaos Chatzikonstantinou brought this change] - CMake: Fix build in cygwin (#422) + fix memory leak in ares_send (#511) - As cygwin environment has both socket.h and winsock2.h headers check WIN32 not to include the later one here + When the condition channel->nservers < 1 holds, the function returns + prematurely, without deallocating query->tcpbuf. We rearrange the + check to be done prior to the allocations, avoiding the memory + leak. In this way, we also avoid unnecessary allocations if + channel->nservers < 1 holds. - Fix By: Biswapriyo Nath (@Biswa96) - -bradh352 (23 Aug 2021) -- make building more verbose - -- add appveyor cmake/mingw static-only build + Fix By: Nikolaos Chatzikonstantinou (@createyourpersonalaccount) -GitHub (17 Aug 2021) -- [Sinan Kaya brought this change] +- [Nikolaos Chatzikonstantinou brought this change] - CMake: lower case advapi32 for cross-building with mingw (#420) + change comment style to old-style (#513) - When cross compiling with yocto's meta-mingw layer, getting a dependency - error. + Following the README.md guidelines, - This is caused by the fact that advapi32 is lower case in mingw builds. + "Comments must be written in the old-style" - Fix By: Sinan Kaya + the comment is changed to the old style. + + Fix By: Nikolaos Chatzikonstantinou (@createyourpersonalaccount) -bradh352 (17 Aug 2021) -- autotools: add ax_check_gnu_make.m4 +- [Nikolaos Chatzikonstantinou brought this change] -- autotools: add ax_require_defined.m4 + use strncasecmp in ares__strsplit (#512) + + strncasecmp on platforms that don't already have it is already #define'd to a private implementation. There is no need to have OS-specific logic. Also removes ares__strsplit.h as a header as ares_private.h already includes it. + + Fix By: Nikolaos Chatzikonstantinou (@createyourpersonalaccount) -- autotools: dont use newer AC_CHECK_INCLUDES_DEFAULT, don't quote AC_ERROR_MSG +- [Yijie Ma brought this change] -- import more files needed by newer ax_code_coverage.m4 + Fix a typo in ares_init_options.3 (#510) + + that -> than + + Fix By: Yijie Ma (@yijiem) -- import more files needed by newer ax_code_coverage.m4 +- [Douglas R. Reno brought this change] -- work around autoreconf -fiv first call returning 'error: too many loops' + Watcom Portability Improvements (#509) + + - Modify the Watcom Makefile for the source code reorganization (#352) + - Add *.map files into .gitignore + - Fix build errors with Watcom's builtin Windows SDK (which is rather + outdated). It's smart enough to understand Windows Vista, but doesn't + have PMIB_UNICASTIPADDRESS_TABLE or MIB_IPFORWARD_ROW2. + + It may be possible to use a different Windows SDK with the Watcom + compiler, such as the most recent Windows 10 SDK. Alternatively the SDK + in OpenWatcom 2.0 (which is in development) should fix this. + + I have no problems testing this Makefile prior to releases, just give me + a ping. + + Tested with Windows Vista, Windows 7, and Windows 10 using 'adig', + 'acountry', and 'ahost'. This also seems to work on Windows XP, though + this is likely due to the compiler in use. + + Fix By: Douglas R. Reno (@renodr) + Fixes Bug: #352 -- restore zz40-xc-ovr.m4 +- [Jay Freeman (saurik) brought this change] -- autotools: processed configure.ac through autoupdate + ignore aminclude_static.am, as generated by AX_AM_MACROS_STATIC (#508) + + Fix By: Jay Freeman (@saurik) -- autotools. update ax_code_coverage.m4 to latest. don't use deprecated AC_HELP_STRING +- [Jay Freeman (saurik) brought this change] -- pull out some old autotools cruft + sync ax_pthread.m4 with upstream (#507) + + The version in the repository is many years old so this PR simply pulls in the latest + available revision from: + http://git.savannah.gnu.org/gitweb/?p=autoconf-archive.git;a=tree;f=m4 + + Fix By: Jay Freeman (@saurik) -GitHub (17 Aug 2021) -- [Felix Yan brought this change] +- [Chilledheart brought this change] - Provide ares_nameser.h as a public interface (#417) + Windows: Invalid stack variable out of scope for HOSTS file path (#502) - NodeJS needs ares_nameser.h as a pubic header. + In some conditions Windows might try to use a stack address that has gone out of scope when determining where to read the hosts data from for file lookups. - Fixes: #415 - Fix By: Felix Yan (@felixonmars) + Fix By: @Chilledheart -- [Felix Yan brought this change] +- [Brad House brought this change] - Fix building when latest ax_code_coverage.m4 is imported (#418) + sync ax_cxx_compile_stdcxx_11.m4 with upstream (#505) - ax_code_coverage.m4 dropped the @CODE_COVERAGE_RULES@ macro, so we need to switch to the latest recommendation from the m4 file. This requires updates to Makefile.am. + It was reported that ax_cxx_compile_stdcxx_11.m4 was not compatible with uclibc. + The version in the repository is many years old so this PR simply pulls in the latest + available revision from: + http://git.savannah.gnu.org/gitweb/?p=autoconf-archive.git;a=tree;f=m4 - Fix By: Felix Yan (@felixonmars) + Fixes Bug: #504 + Fix By: Brad House (@bradh352) -bradh352 (12 Aug 2021) -- bump version to match current release +Version 1.19.0 (18 Jan 2023) -GitHub (12 Aug 2021) -- [dhrumilrana brought this change] +bradh352 (18 Jan 2023) +- Prep for 1.19.0 release - z/OS minor update, add missing semicolon in ares_init.c (#414) +- Fix inverted logic in 25523e2 - Build fix for z/OS + Fix .localhost. handling in prior commit - Fix by: Dhrumil Rana (@dhrumilrana) - -- [Daniel Bevenius brought this change] + Fix By: Brad House (@bradh352) - add build to .gitignore (#410) +- RFC6761 localhost definition includes subdomains - This commit adds the build directory to be ignored by git. + RFC6761 6.3 states: + The domain "localhost." and any names falling within ".localhost." - The motivation for adding this to .gitignore as opposed to - .git/info/exclude is that the CMake example in INSTALL.md uses build - as the name of the directory to be used by CMake. This will cause - git to report build as an untracked file. + We were only honoring "localhost". - Fix By: Daniel Bevenius (@danbev) - -- [Martin Holeš brought this change] + Fixes: #477 + Fix By: Brad House (@bradh352) - Add support for URI(Uniform Resource Identifier) records. (#411) +- docs: ARES_OPT_UDP_PORT and ARES_OPT_TCP_PORT docs wrong byte order - Add ares_parse_uri_reply() for parsing URI DNS replies. + As per #487, documentation states the port should be in network byte + order, but we can see from the test cases using MockServers on + different ports that this is not the case, it is definitely in host + byte order. - Fix By: Martin Holeš (@martin-256) - -Daniel Stenberg (10 Aug 2021) -- ares_getaddrinfo.3: available since 1.16.0 - -- README.md: use https:// links - -Version 1.17.2 (24 Jul 2021) - -bradh352 (24 Jul 2021) -- fix typo - -- prep for 1.17.2 release + Fix By: Brad House (@bradh352) -GitHub (30 Jun 2021) -- [jeanpierrecartal brought this change] +GitHub (18 Jan 2023) +- [hopper-vul brought this change] - Replace strdup() with ares_strdup() (#408) + Add str len check in config_sortlist to avoid stack overflow (#497) - strdup() is used in src/lib/ares_parse_a_reply.c and src/lib/ares_parse_aaaa_reply.c whereas allocated memory is freed using ares_free(). + In ares_set_sortlist, it calls config_sortlist(..., sortstr) to parse + the input str and initialize a sortlist configuration. - Bug: 407 - Fix By: Jean-pierre Cartal (@jeanpierrecartal) - -- [Brad House brought this change] - - Validate hostnames in DNS responses and discard from malicious servers (#406) + However, ares_set_sortlist has not any checks about the validity of the input str. + It is very easy to create an arbitrary length stack overflow with the unchecked + `memcpy(ipbuf, str, q-str);` and `memcpy(ipbufpfx, str, q-str);` + statements in the config_sortlist call, which could potentially cause severe + security impact in practical programs. - To prevent possible users having XSS issues due to intentionally malformed DNS replies, validate hostnames returned in responses and return EBADRESP if they are not valid. + This commit add necessary check for `ipbuf` and `ipbufpfx` which avoid the + potential stack overflows. - It is not clear what legitimate issues this may cause at this point. + fixes #496 - Bug Reported By: philipp.jeitner@sit.fraunhofer.de - Fix By: Brad House (@bradh352) + Fix By: @hopper-vul -bradh352 (11 Jun 2021) -- ares_expand_name(): fix formatting and handling of root name response - - Fixes issue introduced in prior commit with formatting and handling - of parsing a root name response which should not be escaped. +bradh352 (18 Jan 2023) +- Fix build due to str-split sed gone wrong - Fix By: Brad House + Fix By: Brad House (@bradh352) -- ares_expand_name() should escape more characters +- cirrus-ci: switch to scan-build-py for MacOS - RFC1035 5.1 specifies some reserved characters and escaping sequences - that are allowed to be specified. Expand the list of reserved characters - and also escape non-printable characters using the \DDD format as - specified in the RFC. + MacOS seems to work better with scan-build-py - Bug Reported By: philipp.jeitner@sit.fraunhofer.de Fix By: Brad House (@bradh352) -GitHub (15 Apr 2021) -- [HALX99 brought this change] - - Fix can't get dns server on macos and ios (#401) +- ares_strsplit* -> ares__strsplit* to comply with internal function naming - If DNS configuration didn't include search domains on MacOS (or iOS) it would throw an error instead of ignoring. + Inspired by #495, but was missing test cases and would failed to build. - Fix By: @halx99 - -- [catalinh-bd brought this change] + Fix By: Brad House (@bradh352), Daniel Stenberg (@bagder) - Bugfix/crash in ares sortaddrinfo (#400) +- Cirrus-CI: MacOS Homebrew has changed from /usr/local/opt to /opt/homebrew - The bug was generated because there was no check for the number - of items in the list and invalid memory was accesed when the list - was empty. There is a check for null after calling malloc but on - some systems it always returns a valid address for size equals 0. - Relates To: #392, 0903dcecabca283d0fa771632892dc7592b7a66d + Fix paths for homebrew. - Fix By: @catalinh-bd + Fix By: Brad House (@bradh352) -bradh352 (2 Mar 2021) -- Null deref if ares_getaddrinfo() is terminated with ares_destroy() - - ares_freeaddrinfo() was not checking for a Null ptr during cleanup of - an aborted query. +- cirrus-ci: iOS build needs to use ARM MacOS image - Once that was resolved it uncovered another possible issue with - multiple simultaneous underlying queries being outstanding and - possibly prematurely cleaning up the handle. + CirrusCI removed Intel-based MacOS images. Need to switch + iOS builds to use new ARM images as well. - Reported By: Michael Kourlas Fix By: Brad House (@bradh352) -GitHub (18 Feb 2021) -- [Brad House brought this change] - - CMake: RANDOM_FILE not defined #397 +- cirrus-ci: new MacOS image - RANDOM_FILE was never defined by cmake, causing RC4 key generation to use the less secure rand() method. + Cirrus-CI has recently EOL'd Intel MacOS VMs, switch to the latest + ARM-based image. - Also, due to clashes with chain-building from other projects (e.g. curl) that may define RANDOM_FILE, this was renamed to CARES_RANDOM_FILE. + Fix By: Brad House (@bradh352) + +- acountry was passing stack variable to callback - This is the proposed change for #396 + Recent ASAN versions picked up that acountry was passing stack + variables to ares_gethostbyname() then leaving the stack context. + We will now allocate a buffer for this. Fix By: Brad House (@bradh352) -- [Anton Danielsson brought this change] +GitHub (13 Dec 2022) +- [Daniel Stenberg brought this change] - CMake: fix Make install for iOS/MacOS (#395) + docs: reformat/cleanup man pages SYNOPSIS sections (#494) - INSTALL TARGETS were missing the BUNDLE DESTINATION + To make them render "nicer" in both terminals and on the website. - Fix By: Anton Danielsson (@anton-danielsson) + - Removes the bold + - Removes .PP lines + - Indents them more like proper code style + + Fix By: Daniel Stenberg (@bagder) -- [František Dvořák brought this change] +- [Nikolaos Chatzikonstantinou brought this change] - Fix build with autotools out of source tree (#394) + bug fix: new ares_strsplit (#492) - Add missing include directory, which fixes the build with autotools in separated build directory. + * add ares_strsplit unit test - Fix By: František Dvořák (@valtri) - -bradh352 (15 Jan 2021) -- fuzzing: HAVE_CONFIG_H may not be defined so cannot include ares_setup.h. Its not needed even though we include ares_nameser.h - -- remove redundant header checks - -- properly detect netinet/tcp.h on openbsd - -- more portability updates - -- renamed nameser.h to ares_nameser.h requires Makefile.inc update for distributed files - -- more portability updates - -- remove bad files - -- portability updates for test cases + The test reveals a bug in the implementation of ares_strsplit when the + make_set parameter is set to 1, as distinct domains are confused for + equal: + + out = ares_strsplit("example.com, example.co", ", ", 1, &n); + + evaluates to n = 1 with out = { "example.com" }. + + * bugfix and cleanup of ares_strsplit + + The purpose of ares_strsplit in c-ares is to split a comma-delimited + string of unique (up to letter case) domains. However, because the + terminating NUL byte was not checked in the substrings when comparing + for uniqueness, the function would sometimes drop domains it should + not. For example, + + ares_strsplit("example.com, example.co", ",") + + would only result in a single domain "example.com". + + Aside from this bugfix, the following cleanup is performed: + + 1. The tokenization now happens with the help of strcspn instead of the + custom function is_delim. + 2. The function list_contains has been inlined. + 3. The interface of ares_strsplit has been simplified by removing the + parameter make_set since in practice it was always 1. + 4. There are fewer passes over the input string. + 5. We resize the table using realloc() down to its minimum size. + 6. The docstring of ares_strsplit is updated and also a couple typos + are fixed. + + There occurs a single use of ares_strsplit and since the make_set + parameter has been removed, the call in ares_init.c is modified + accordingly. The unit test for ares_strsplit is also updated. + + Fix By: Nikolaos Chatzikonstantinou (@createyourpersonalaccount) -- Portability Updates for arpa/nameser.h (#388) +bradh352 (23 Oct 2022) +- CirrusCI: update freebsd image - There is too much inconsistency between platforms for arpa/nameser.h and arpa/nameser_compat.h for the way the current files are structured. Still load the respective system files but make our private nameser.h more forgiving. + Old FreeBSD image for CirrusCI has issues with newer symbols, update to later one. - Fixes: #388 Fix By: Brad House (@bradh352) -- ares_parse_ptr_reply() handle NULL for addr/addr_len. Fixes #392 +GitHub (23 Oct 2022) +- [Stephen Sachs brought this change] + + Fix Intel compiler deprecated options (#485) - NodeJS passes NULL for addr and 0 for addrlen parameters to ares_parse_ptr_reply(). On systems where malloc(0) returned NULL, this would cause the function to return ARES_ENOMEM, but the cleanup wasn't handled properly and would crash. + Options `-we ###` and `-wd ###` should not include a whitespace. They are also deprecated and `-diag-error` and `-diag-disable` are their replacements. - This patche fixes that bug, and also hardens ares_free_hostent() to not leak memory during cleanup. + Intel compiler 2021.6 is not able to be used in configure without the proposed patch. - Fixes: #392 - Fix By: Brad House (@bradh352) + Fix By: Stephen Sachs (@stephenmsachs) -- Define behavior of malloc(0) +- [Jonathan Ringer brought this change] + + Allow for CMake to use absolute install paths (#486) - Some systems may return either NULL or a valid pointer on malloc(0). c-ares should never call malloc(0) so lets return NULL so we're more likely to find an issue if it were to occur. + Generated libcares.pc could have bad paths when using absolute paths. + + Fix By: Jonathan Ringer (@jonringer) -GitHub (24 Dec 2020) -- [dhrumilrana brought this change] +- [Thomas Dreibholz brought this change] - z/OS: port (#390) + Fix for issue #488: ensure that the number of iovec entries does not exceed system limits. (#489) - Port c-ares to z/OS. + c-ares could try to exceed maximum number of iovec entries supported by system. - Fix By: Dhrumil Rana (@dhrumilrana) + Fix By: Thomas Dreibholz (@dreibh) -- [vburdo brought this change] +- [bsergean brought this change] - Use unbuffered stdio for /dev/urandom to read only requested data (#391) + Add include guards to ares_data.h (#491) - Buffered fread() reads 4096 bytes which is completely unnecessary and potentially may cause problems. - I discovered this on private linux configuration where custom /dev/urandom implementation has poor performance. + All the other header files in the src/lib folder do have an include guard so it look like an overthought. - Fix By: @vburdo + Fix By: @bsergean -- [Jay Freeman (saurik) brought this change] +- [Brad Spencer brought this change] - This relative header #include needs to use quotes. (#386) + Fix typo in docs for ares_process_fd (#490) - Fix By: Jay Freeman (@saurik) - -bradh352 (23 Nov 2020) -- Win32: Fix tools build with autotools static library - When c-ares is being built as static on Win32, CARES_STATICLIB must - be defined, but it wasn't being pulled in for the tools. + A single letter was missing - Fixes: #384 - Fix By: Brad House (@bradh352) + Fix By: Brad Spencer (@b-spencer) -- Loosen requirements for static c-ares library when building tests - - It appears that when building tests, it would hardcode enabling building - of the c-ares static library. This was probably due to Windows limitations - in symbol visibility. +- [lifenjoiner brought this change] + + tools: refine help (#481) - This change will use the static library if it exists for tests, always. - Otherwise, it will only forcibly enable static libraries for tests on - Windows. + fix invalid help options and documentation typos - Fixes: #380 - Fix By: Brad House (@bradh352) + Fix By: @lifenjoiner -- Remove legacy comment about ahost/acountry/adig targets +- [lifenjoiner brought this change] -- Distribute fuzzinput/fuzznames for fuzz tests + Git: ignore CMake temporary files (#480) - The fuzz test files were not being distributed. This doesn't appear to be - a regression, it looks like they have never been distributed. + exclude more files from git - Fixes: #379 - Fix By: Brad House (@bradh352) - -Version 1.17.1 (19 Nov 2020) + Fix By: @lifenjoiner -GitHub (19 Nov 2020) -- [Brad House brought this change] +- [lifenjoiner brought this change] - Travis: add iOS target built with CMake (#378) + adig: fix `-T` option (#479) - Issue #377 suggested that CMake builds for iOS with c-ares were broken. This PR adds an automatic Travis build for iOS CMake. + Helper was missing flag to enable TCP mode of operation. - Fix By: Brad House (@bradh352) - -bradh352 (18 Nov 2020) -- fix build + Fix By: @lifenjoiner -GitHub (18 Nov 2020) -- [Fabrice Fontaine brought this change] +- [Frank brought this change] - External projects were using non-public header ares_dns.h, make public again (#376) + Add vcpkg installation instructions (#478) - It appears some outside projects were relying on macros in ares_dns.h, even though it doesn't appear that header was ever meant to be public. That said, we don't want to break external integrators so we should distribute this header again. + Update to include vcpkg installation instructions - Fix By: Fabrice Fontaine (@ffontaine) - -bradh352 (17 Nov 2020) -- note that so versioning has moved to configure.ac + Fix By: @FrankXie05 -- note about 1.17.1 +- [marc-groundctl brought this change] -- fix sed gone wrong + Convert total timeout to per-query (#467) + + On Apple platforms, libresolv reports the total timeout in retrans, not the per-query time. This patch undoes that math to get the per-query time, which is what c-ares expects. This is not perfect because libresolv is inconsistent on whether the timeout is multiplied by retry or retry+1, but I don't see any way to distinguish these cases. + + Fix By: Marc Aldorasi (@marc-groundctl) -GitHub (17 Nov 2020) -- [Daniel Stenberg brought this change] +- [marc-groundctl brought this change] - autotools cleanup (#372) + Don't include version info in the static library (#468) - * remove: install-sh mkinstalldirs + The static library should not contain version info, since it would be linked into an executable or dll with its own version info. - They're generated when needed, no need to store in it. + Fix By: @marc-groundctl + +- [Ridge Kennedy brought this change] + + Fix ares_getaddrinfo() numerical address fast path with AF_UNSPEC (#469) - * buildconf: remove custom logic with autoreconf + The conversion of numeric IPv4 addresses in fake_addrinfo() is broken when + the family is AF_UNSPEC. The initial call to ares_inet_pton with AF_INET + will succeed, but the subsequent call using AF_INET6 will fail. This results + in the fake_addrinfo() fast path failing, and ares_getaddrinfo() making a + query when none should be required. - Fix By: Daniel Stenberg (@bagder) - -bradh352 (17 Nov 2020) -- attempt to fix 1.17.0 release distribution issues + Resolve this by only attempting the call to ares_inet_pton with AF_INET6 + if the initial call with AF_INET was unsuccessful. + + Fix By: Ridge Kennedy (@ridgek) -Version 1.17.0 (16 Nov 2020) +- [Manish Mehra brought this change] -bradh352 (16 Nov 2020) -- 1.17.0 release prep + Configurable hosts path for file_lookup (#465) + + This changeset adds support for configurable hosts file + ARES_OPT_HOSTS_FILE (similar to ARES_OPT_RESOLVCONF). + + Co-authored-by: Manish Mehra (@mmehra) -- ares_getaddrinfo(): duplicate hints ai_socktype and ai_protocol into output +bradh352 (27 Apr 2022) +- CMake: Windows DLLs lack version information - ai_socktype and ai_protocol were ignored from the hints input. They are now - duplicated into the output as expected. Currently no sanity checks on - proper values are taking place. + The cares.rc was not included in the build for CMake. Conditionally + add it when building for Windows. - Fixes: #317 Fix By: Brad House (@bradh352) + Fixes Bug: #460 -- ares_parse_{a,aaaa}_reply could return larger *naddrttls than passed in +GitHub (27 Apr 2022) +- [Kai Pastor brought this change] + + CMake: Guard target creation in exported config (#464) - If there are more ttls returned than the maximum provided by the requestor, then - the *naddrttls response would be larger than the actual number of elements in - the addrttls array. + User projects may call 'find_package(c-ares)' multiple times (e.g. + via dependencies), but targets must be created only once. + Shared and static target must be treated independently. - This bug could lead to invalid memory accesses in applications using c-ares. + Fix By: Kai Pastor (@dg0yt) + +bradh352 (27 Apr 2022) +- Honor valid DNS result even if other class returned an error - This behavior appeared to break with PR #257 + When using ares_getaddrinfo() with PF_UNSPEC, if a DNS server returned + good data on an A record, followed by bad data on an AAAA record, the + good record would be thrown away and an error returned. - Fixes: #371 - Reported By: Momtchil Momtchev (@mmomtchev) - Fix By: Brad House (@bradh352) + If we got a good response from one of the two queries, regardless of + the order returned, we should honor that. + + Fix By: Dmitry Karpov (dkarpov@roku.com) + Signed Off By: Brad House (@bradh352) -GitHub (5 Nov 2020) -- [Dustin Lundquist brought this change] +GitHub (2 Apr 2022) +- [Sam James brought this change] - docs: ares_set_local_ip4() uses host byte order (#368) + configure.ac: fix STDC_HEADERS typo (#459) - Properly document brain-dead behavior of ares_set_local_ip4() using host byte order instead of expected network byte order. + There is no autoconf macro called STDC_HEADERS. AC_HEADER_STDC however does + exist and it defines the STDC_HEADERS macro for use. - Fix By: Dustin Lundquist - -- [Łukasz Marszał brought this change] - - empty hquery->name could lead to invalid memory access (#367) + Not clear that STDC_HEADERS from its use in the repo is needed but + would rather not meddle with it for now. - If hquery->name is empty (=="\0"), &hquery->name[strlen(hquery->name)-1] would point to "random" place in memory. This is causing some of my address sanitizer tests to fail. + Fixes an annoying warning on `./configure`: + ``` + /var/tmp/portage/net-dns/c-ares-1.18.1/work/c-ares-1.18.1/configure: 24546: STDC_HEADERS: not found + ``` - Fix By: Łukasz Marszał (@lmarszal) + Signed-off-by: Sam James -bradh352 (28 Sep 2020) -- Fix OSSFuzz reported issue in CAA reply parsing +bradh352 (2 Mar 2022) +- Asterisks should be allowed in host validation as CNAMEs may reference wildcard domains - OSS-Fuzz is reporting a use-of-uninitialized-value: - https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=26012 + CloudFlare appears to use this logic in CNAMEs as per + https://github.com/nodejs/node/issues/42171 - Reported By: David Drysdale (@daviddrysdale) - -GitHub (26 Sep 2020) -- [David Hotham brought this change] + Fixes: #457 + Fix By: Brad House (@bradh352) - fuzz CAA parsing (#363) +- Don't return on file lookup failure, set status - Add fuzz support for CAA parsing + When resolving a host via /etc/hosts, don't return with a predefined + error as there may be other tries. - Fix By: David Hotham (@dimbleby) - -- [Daniela Sonnenschein brought this change] + Fix By: Brad House (@bradh352) - Allow parsing of CAA Resource Record (#360) +- 'localhost' special treatment enhancement - CAA (Certification Authority Authorization) was introduced in RFC 6844. - This has been obsoleted by RFC 8659. This commit added the possibility - to query CAA resource records with adig and adds a parser for CAA - records, that can be used in conjunction with ares_query(3). + Since localhost is special-cased, any errors should be ignored when + reading /etc/hosts as otherwise we could return an error if there + were for instance an invalidly formatted /etc/hosts or if /etc/hosts + had a permissions error while reading. - Closes Bug: #292 - Fix By: Daniela Sonnenschein (@lxdicted) + This exact behavior appears to have been seen on OS/400 PASE + environments which allows AIX binares to run. + + Fix By: Brad House (@bradh352) -Daniel Stenberg (17 Sep 2020) -- docs: remove the html and pdf make targets +- If chain building c-ares as part of another project, detect of res_servicename could fail (#451) - They're rarely used in our daily work flow and mostly just add friction, + If libresolv is already included with the build, c-ares wouldn't properly detect its use. - Closes #362 + May fix: #451 + Fix by: Brad House (@bradh352) -bradh352 (14 Sep 2020) -- ares_process needs to always include nameser.h as it has compat +- no analyze capability on ios -- Define T_OPT if system doesn't provide it +- attempt to use scan-build on ios -GitHub (12 Sep 2020) -- [Gisle Vanem brought this change] +- disable tests on ios - Change the mailman links (#358) - - Links when wrapping become misleading. Insert newline to prevent wrapping. - - Fix By: Gisle Vanem (@gvanem) +- fix switch statement -- [Gisle Vanem brought this change] +- code coverage had gotten disabled - [adig] Update man-page for the '-x' option (#357) - - Fix By: Gisle Vanem (@gvanem) +- looks like shell expansion doesn't work with cirrus-ci, lets do it another way -- [Gisle Vanem brought this change] +- attempt to autobuild for iOS - [adig] add '-x' option. (#356) +GitHub (8 Dec 2021) +- [Brad House brought this change] + + Windows: rework/simplify initialization code, drop long EOL systems (#445) - Added a 'dig-style' '-x' option. Also support '-xx' for a - IPv6 bit-string PTR query. + There was a lot of windows initialization code specific to the era that predates Windows Vista such as reading DNS configuration from the registry, and dynamically loading libraries to get access to functions that didn't exist in XP or earlier releases. - Fix By: Gisle Vanem (@gvanem) - -bradh352 (12 Sep 2020) -- fix indentation - -- ns_t_opt -> T_OPT - -GitHub (12 Sep 2020) -- [Gisle Vanem brought this change] - - Fixes for Watt-32 on djgpp + Windows (#355) + Vista was released in January 2007, and was EOL'd in 2017, and support for Vista is still maintained with this patch set. - No longer any relation to libcurl since '/packages/DOS/common.dj' is dropped. - This Makefile.dj has been tested on Win-10 only (using the Windows hosted djgpp cross compiler). + XP was EOL'd in Apr 8 2014. - Fix By: Gisle Vanem (@gvanem) + I believe the last OS based on something earlier than Vista was POSReady 2009, as it was XP based for some reason, and that was EOL'd in January 2019. Considering any POS system falls under the PCI-DSS rules, they aren't allow to run POSReady 2009 any more so there is no reason to try to continue supporting such systems. + + We have also targeted with our build system Vista support for the last few years, and while developers could change the target, we haven't had any reports that they have. -- [Gisle Vanem brought this change] +bradh352 (9 Nov 2021) +- Fix memory leak in reading /etc/hosts + + When an /etc/hosts lookup is performed, but fails with ENOTFOUND, and + a valid RFC6761 Section 6.3 fallback is performed, it could overwrite + variables that were already set and therefore leave the pointers + dangling, never to be cleaned up. + + Clean up explicitly on ENOTFOUND when returning from the file parser. + + Fixes: #439 + Fix By: Brad House (@bradh352) - Fixes for Watt-32 on Windows and MSDOS (#354) +GitHub (2 Nov 2021) +- [Bobby Reynolds brought this change] + + Fix cross-compilation from Windows to Linux due to CPACK logic (#436) - Move the prototype to 'ares_private.h'. + When determining value for CPACK_PACKAGE_ARCHITECTURE, prefer to use + value from CMAKE_SYSTEM_PROCESSOR before falling back to uname output. - Fix By: Gisle Vanem (@gvanem) + Additionally, if building from a Windows host, emit a fatal error + instead of attempting to call uname. + + Fix By: Bobby Reynolds (@reynoldsbd) -bradh352 (11 Sep 2020) -- update path for include +bradh352 (1 Nov 2021) +- fix coveralls link -- remove stale information +- coveralls needs token -- remove stale information +- coveralls appears to require git -Brad House (9 Sep 2020) -- silence compiler warnings +- fix a couple of coveralls vars -- Remove stale msvc files from makefile +- more coveralls fixes -GitHub (9 Sep 2020) -- [Brad House brought this change] +- add code coverage libs to LDADD instead of _LIBS - Reorganize source tree (#349) - - Originally started by Daniel Stenberg (@bagder) with #123, this patch reorganizes the c-ares source tree to have a more modern layout. It also fixes out of tree builds for autotools, and automatically builds the tests if tests are enabled. All tests are passing which tests each of the supported build systems (autotools, cmake, nmake, mingw gmake). There may be some edge cases that will have to be caught later on for things I'm not aware of. - - Fix By: Brad House (@bradh352) +- make verbose -Brad House (1 Sep 2020) -- remove CURLDEBUG as per #82 +- try to fix code coverage building -GitHub (1 Sep 2020) -- [Erik Lax brought this change] +- need -y for install - Detect remote DNS server does not support EDNS as per RFC 6891 (#244) - - EDNS retry should be based on FORMERR returned without an OPT RR record as per https://tools.ietf.org/html/rfc6891#section-7 rather than just treating any unexpected error condition as a reason to disable EDNS on the channel. - - Fix By: Erik Lax (@eriklax) +- try to fix asan/ubsan/lsan when built with clang. try to support code coverage properly. -Brad House (27 Aug 2020) -- Fix for #345, don't use 'true' use 1 +- try another path -GitHub (27 Aug 2020) -- [Seraphime Kirkovski brought this change] +- fix pip - ares_gethostbyname: Fix AF_UNSPEC support when using an ip address (#204) - - fake_hostent() was not supporting AF_UNSPEC, so when an ip address was specified when using AF_UNSPEC it would attempt to do a DNS lookup rather than returning a fake hostent using the ip address. - - Fix By: Seraphime Kirkovski (@Seraphime) +- attempt to enable some other build types that travis supported -- [apenn-msft brought this change] +Version 1.18.1 (26 Oct 2021) - Tests should use dynamic system-assigned ports rather than static port (#346) - - The c-ares test suite was hardcoded to use port 5300 (and possibly 5301, 5302) for the test suite. Especially in containers, there may be no guarantee these ports are available and cause tests to fail when they could otherwise succeed. Instead, request the system to assign a port to use dynamically. This is now the default. To override, the test suite still takes the "-p " option as it always has and will honor that. - - Fix By: Anthony Penniston (@apenn-msft) +bradh352 (26 Oct 2021) +- missed version -Brad House (25 Aug 2020) -- Unset members of the addr struct contain garbage values (#343) +- 1.18.1 release prep + +- ares_getaddrinfo() was returning the wrong size for ai_addrlen - When generating the ares_sockaddr data by getaddrinfo() it was only filling - in certain members while leaving others uninitialized. This left garbage - data if a user tried to use the unset values. memset() the ares_sockaddr - to 0 prior to filling in the values to prevent this. + ai_addrlen was erroneously returning 16 bytes instead of the + sizeof(struct sockaddr_in6). This is a regression introduced + in 1.18.0. - Reported By: @SmorkalovG + Reported by: James Brown Fix By: Brad House (@bradh352) -GitHub (24 Aug 2020) -- [Jonathan Maye-Hobbs brought this change] - - FQDN with trailing period should be queried first with larger ndot value (#345) - - If a query is performed for dynamodb.us-east-1.amazonaws.com. with ndots=5, it was attempting to search the search domains rather than just attempting the FQDN that was passed it. This patch now at least attempts the FQDN first. - - We may need to determine if we should abort any further searching, however as is probably intended. - - Fix by: Jonathan Maye-Hobbs (@wheelpharoah) +- Windows: autotools force linking to iphlpapi -- [Gisle Vanem brought this change] +GitHub (26 Oct 2021) +- [Gregor Jasny brought this change] - Update acountry.c country code list (#341) + Fix typo detected by lintian (#434) - Updated country_list[]: - * 2-letter ISO-3166 country-codes. - * Add, rename some names + codes in accordance with latest table at https://en.wikipedia.org/wiki/ISO_3166-1. + typo in docs for ares_parse_uri_reply - Fix By: Gisle Vanem (@gvanem) + Fix By: Gregor Jasny (@gjasny) -- [Bulat Gaifullin brought this change] +Version 1.18.0 (25 Oct 2021) - Test case should honor flag HAVE_WRITEV rather than WIN32 (#344) - - Test cases where not honoring the HAVE_WRITEV flag but instead using WIN32 to determine if WRITEV was available or not. This patch fixes that. - - Fix By: Bulat Gaifullin (@bgaifullin) +bradh352 (25 Oct 2021) +- replace Travis badge with Cirrus-CI badge -Brad House (18 Jul 2020) -- Ensure c89 support - - A couple of for loops in Mac-specific code were using integer declarations - inside a for loop. Move the declaration to the top of the preceding - code block to retain c89 compliance. - - Reported By: Jeffrey Walton +- c-ares 1.18.0 release prep -GitHub (2 Jul 2020) -- [Fionn Fitzmaurice brought this change] +GitHub (21 Oct 2021) +- [Jérôme Duval brought this change] - Avoid buffer overflow in RC4 loop comparison (#336) - - The rc4 function iterates over a buffer of size buffer_len who's maximum - value is INT_MAX with a counter of type short that is not guaranteed to - have maximum size INT_MAX. - - In circumstances where short is narrower than int and where buffer_len - is larger than the maximum value of a short, it may be possible to loop - infinitely as counter will overflow and never be greater than or equal - to buffer_len. + Haiku: port (#431) - The solution is to make the comparison be between types of equal width. - This commit defines counter as an int. + Port for Haiku. Slight CMake changes, header changes, and resolv.conf/hosts paths specific to Haiku. - Fix By: Fionn Fitzmaurice (@fionn) - -- [anonymoushelpishere brought this change] + Port By: Jérôme Duval (@korli) - Updated help information for adig, acountry, and ahost. (#334) - - Provide more descriptive help information for various utilities. - - Fix By: @anonymoushelpishere +bradh352 (19 Oct 2021) +- valgrind: fix reported invalid read -- [lutianxiong brought this change] +- make sure distcheck runs - avoid read-heap-buffer-overflow (#332) - - Fix invalid read in ares_parse_soa_reply.c found during fuzzing - - Fixes Bug: #333 - Fix By: lutianxiong (@ltx2018) +- detect oddities and skip test if necessary -- [Ivan Baidakou brought this change] +- fix null ptr deref in strlen - Fix: sizeof(sizeof(addr.saX)) -> sizeof(addr.saX) in readaddrinfo (#331) - - Looks like a sed-gone-wrong, a sizeof inside of a sizeof. - - Fix By: Ivan Baidakou (@basiliscos) +- bend over backwards for testing file access, something is weird on debian -Version 1.16.1 (11 May 2020) +- chmod(fn, 0) is failing on debian -Brad House (11 May 2020) -- c-ares 1.16.1 release prep +- maybe process needs to be called -- update travis to use xcode11.4 +- split test output -- Prevent possible double-free in ares_getaddrinfo() if ares_destroy() is called - - In the event that ares_destroy() is called prior to ares_getaddrinfo() completing, - it would result in an invalid read and double-free due to calling end_hquery() twice. - - Reported By: Jann Horn @ Google Project Zero +- clean up a couple of compiler warnings -GitHub (30 Apr 2020) -- [shelley vohr brought this change] +- use helper function for addrinfo to simplify code - fix: windows UNICODE incompatibilities with ares_getaddrinfo (#328) - - Fixes the following compatibility issues: - * Use RegQueryValueExA instead of RegQueryValueEx - * Use ExpandEnvironmentStringsA instead of ExpandEnvironmentStrings - * Use RegOpenKeyExA instead of RegOpenKeyExA - * Use GetWindowsDirectoryA instead of GetWindowsDirectoryA - - Fix By: Shelley Vohr (@codebytere) - Closes: #327 +- INSTANTIATE_TEST_CASE_P -> INSTANTIATE_TEST_SUITE_P as new convention in googletest -Brad House (13 Apr 2020) -- travis: CloudFlare does not allow T_ANY requests, so live tests that use it fail. Disable. +- gmock: update from 1.8.0 to 1.11.0 -- travis: bump macos image to the latest +- Cirrus-CI: fix debian arm build -- cast-align warnings are false for struct sockaddr, silence - - Create a macro to silence false cast-align warnings when casting - struct sockaddr * to struct sockaddr_in * and struct sockaddr_in6 *. - - Fix By: Brad House (@bradh352) +- Cirrus-CI: more updates for proper testing -- MacOS: Enable libresolv support for retrieving DNS servers like iOS does. +- install proper packages for asan and analyze -GitHub (10 Apr 2020) -- [Dmitry Igrishin brought this change] +- fix crash in tests - CMake: Populate the INCLUDE_DIRECTORIES property of installed targets (#323) - - Populate the INCLUDE_DIRECTORIES property of installed targets - - Fix By: Dmitry Igrishin (@dmitigr) +- try to disable container tests -Brad House (10 Apr 2020) -- travis: make valgrind use cmake for tests +- need g++ for tests on debian -- dont try to use libtool to run valgrind +- try cirrus-ci again -- valgrind requires libtool installed to wrap tests +- whitespace -- scan build 7 +- start bringing up cirrus-ci -- fix travis live test +- prep for adding new ci -- add debug for travis +- fix cut and paste error -- try without sudo +GitHub (18 Oct 2021) +- [Brad House brought this change] -- attempt to modernize travis build environment + RFC6761: special case "localhost" (#430) + + As per RFC6761 Section 6.3, "localhost" lookups need to be special cased to return loopback addresses, and not forward queries to recursive dns servers. + + We first look up via files (/etc/hosts or equivalent), and if that fails, we then attempt a system-specific address enumeration for loopback addresses (currently Windows-only), and finally fallback to ::1 and 127.0.0.1. + + Fix By: Brad House (@bradh352) + Fixes Bug: #399 -GitHub (6 Apr 2020) -- [Teemu R brought this change] +- [Brad House brought this change] - Allow TXT records on CHAOS qclass (#321) + Reimplement ares_gethostbyname() by wrapping ares_getaddrinfo() (#428) - Some DNS servers intentionally "misuse" the obsoleted CHAOS (CH) qclass to provide things like `version.bind`, `version.server`, `authors.bind`, `hostname.bind` and `id.server`. + ares_gethostbyname() and ares_getaddrinfo() do a lot of similar things, however ares_getaddrinfo() has some desirable behaviors that should be imported into ares_gethostbyname(). For one, it sorts the address lists for the most likely to succeed based on the current system routes. Next, when AF_UNSPEC is specified, it properly handles search lists instead of first searching all of AF_INET6 then AF_INET, since ares_gethostbyname() searches in parallel. Therefore, this PR should also resolve the issues attempted in #94. - C-ares was not allowing such use cases. + A few things this PR does: - Fix By: Teemu R. (@rytilahti) - -Brad House (5 Apr 2020) -- Remove warnings from ares_getaddrinfo.3 man page + 1. ares_parse_a_reply() and ares_parse_aaaa_reply() had very similar code to translate struct ares_addrinfo into a struct hostent as well as into struct ares_addrttl/ares_addr6ttl this has been split out into helper functions of ares__addrinfo2hostent() and ares__addrinfo2addrttl() to prevent this duplicative code. - As reported in #319, non-standard macros of .IN were used. - Replace with .RS/.RE. + 2. ares_getaddrinfo() was apparently never honoring HOSTALIASES, and this was discovered once ares_gethostbyname() was turned into a wrapper, the affected test cases started failing. - Fixes: #319 - Fix By: Brad House (@bradh352) - -- ares_getaddrinfo man page render better for man2html - -- update man pages to render better for man2html - -Version 1.16.0 (12 Mar 2020) - -Brad House (12 Mar 2020) -- 1.16.0 release notes draft - -- attempt to fix double-free introduced in e0517f9 + 3. A slight API modification to save the query hostname into struct ares_addrinfo as the last element of name. Since this is the last element, and all user-level instances of struct ares_addrinfo are allocated internally by c-ares, this is not an ABI-breaking change nor would it impact any API compatibility. This was needed since struct hostent has an h_name element. + + 4. Test Framework: MockServer tests via TCP would fail if more than 1 request was received at a time which is common when ares_getaddrinfo() queries for both A and AAAA records simultaneously. Infact, this was a long standing issue in which the ares_getaddrinfo() test were bypassing TCP alltogether. This has been corrected, the message is now processed in a loop. + + 5. Some tests had to be updated for overall correctness as they were invalid but somehow passing prior to this change. + + Change By: Brad House (@bradh352) -GitHub (12 Mar 2020) -- [David Drysdale brought this change] +bradh352 (9 Oct 2021) +- ares_getaddrinfo() missing sanity check to fix #426 - test: fuzzer input triggering double free (#315) +- ares_getaddrinfo(): continue to next domain in search if query returns ARES_ENODATA - OSS-Fuzz has reported a double-free with the fuzzer input file - included here; run with: - ./test/aresfuzz test/fuzzinput/clusterfuzz-5637790584012800 + Some DNS servers may behave badly and return a valid response with no data, in this + case, continue on to the next search domain, but cache the result. - Bisecting the failure points to commit e0517f97d988 ("Parse SOA records - from ns_t_any response (#103)") - -- [Brad House brought this change] + Fixes Bug: #426 + Fix By: Brad House (@bradh352) - CMake: Install Manpages (#314) +- Allow '/' as a valid character for a returned name - CMake wasn't installing manpages. + As of c-ares 1.17.2, a CNAME an in-addr.arpa delegation broke due + to not allowing '/'. This needs to be allowed to not break valid + functionality. - Fixes #297 + Fixes Bug: #427 + Reported By: Adrian (@leftshift) Fix By: Brad House (@bradh352) -- [Brad House brought this change] +Daniel Stenberg (5 Oct 2021) +- libcares.pc.in: update the URL - Enable cmake tests for AppVeyor (#313) +bradh352 (8 Sep 2021) +- ares_expand_name should allow underscores (_) as SRV records legitimately use them - Tests require linking against the static library on Windows otherwise the symbols are not exported for internals being tested. + c-ares 1.17.2 introduced response validation to prevent a security issue, however + it did not have (_) listed as a valid character for domain name responses which + caused issues when a CNAME referenced a SRV record which contained underscores. + + While RFC2181 section 11 does explicitly state not to do validation, that applies + to servers not clients. + Fixes: #424 Fix By: Brad House (@bradh352) -Brad House (11 Mar 2020) -- Add AppVeyor badge +Daniel Stenberg (7 Sep 2021) +- domain: update to use c-ares.org + + Closes #423 -- bump c-ares version to 1.16.0. test AppVeyor integration. +- mailing list: moved to lists.haxx.se -GitHub (11 Mar 2020) -- [Brad House brought this change] +GitHub (3 Sep 2021) +- [Biswapriyo Nath brought this change] - replace all usages of inet_addr() with ares_inet_pton() which is more proper (#312) + CMake: Fix build in cygwin (#422) - Replace usage of inet_addr() with ares_inet_pton() which is more appropriate and fixes issues with legitimate addresses like 255.255.255.0. IPv6 already used this. + As cygwin environment has both socket.h and winsock2.h headers check WIN32 not to include the later one here - Fixes #309 - Fix By: Brad House (@bradh352) + Fix By: Biswapriyo Nath (@Biswa96) -- [Brad House brought this change] +bradh352 (23 Aug 2021) +- make building more verbose - CMake: Generate WinPDB files during build (#311) - - Build and Install PDB (Windows Debug Symbol) files if supported by underlying system. - - Also update AppVeyor to test cmake builds. - - Fixes #245 - Fix By: Piotr Pietraszkiewicz (@ppietrasa) and Brad House (@bradh352) +- add appveyor cmake/mingw static-only build -- [Brad House brought this change] +GitHub (17 Aug 2021) +- [Sinan Kaya brought this change] - CMake: Rework library function checking (#310) + CMake: lower case advapi32 for cross-building with mingw (#420) - CHECK_LIBRARY_EXISTS(), while it takes a function name, does not actually verify the function exists in the library being evaluated. Instead, if the function is found in any dependent library, and the referenced library also exists, it returns true. This is not desirable. + When cross compiling with yocto's meta-mingw layer, getting a dependency + error. - Wrap with a Macro to change the behavior. + This is caused by the fact that advapi32 is lower case in mingw builds. - Fixes: #307 - Fix By: Brad House (@bradh352) + Fix By: Sinan Kaya -- [Dron Rathore brought this change] +bradh352 (17 Aug 2021) +- autotools: add ax_check_gnu_make.m4 - Parse SOA records from ns_t_any response (#103) - - Added the capability of parsing SOA record from a response buffer of ns_t_any type query, this implementation doesn't interfere with existing T_SOA query's response as that too is treated as a list of records. The function returns ARES_EBADRESP if no SOA record is found(as per RFC). - - The basic idea of sticking to RFC that a ns_t_any too should return an SOA record is something open for discussion but I have kept the functionality intact as it was previously i.e the function returns ARES_EBADRESP if it doesn't find a SOA record regardless of which response it is parsing i.e. T_SOA or T_ANY. - - Note that asking for T_ANY is generally a bad idea: - - https://blog.cloudflare.com/what-happened-next-the-deprecation-of-any/ - - https://tools.ietf.org/html/draft-ietf-dnsop-refuse-any - - Bug: #102 - Fix By: Dron Rathore (@DronRathore) +- autotools: add ax_require_defined.m4 -- [Stephen Bryant brought this change] +- autotools: dont use newer AC_CHECK_INCLUDES_DEFAULT, don't quote AC_ERROR_MSG - Added CPack functionality for generating RPM or DEB packages (#283) - - Added CPack functionality for generating RPM or DEB packages - - ie: run `cpack -G RPM` (or "DEB") after building with CMake. - - The current configuration creates 3 separate packages for the shared library, - the development files and the tools. - - Fix By: Stephen Bryant (@bf-bryants) +- import more files needed by newer ax_code_coverage.m4 -- [tjwalton brought this change] +- import more files needed by newer ax_code_coverage.m4 - ares_gethostbyname: Return ENODATA if no valid A or AAAA record found (#304) - - ares_gethostbyname() was returning ESUCCESS when no A or AAAA record was found but a CNAME pointing nowhere was present. ENODATA should be returned instead, however the hosts pointer will still be present to provide the alias list. - - * Return ENODATA if no valid A or AAAA record found - * Fix and update test ParseAReplyNoData. - * Add test for new ENODATA behaviour in ares_gethostbyname. - - Fixes Bug #303 - Fix By: @tjwalton +- work around autoreconf -fiv first call returning 'error: too many loops' -- [Michal Rostecki brought this change] +- restore zz40-xc-ovr.m4 - test: Separate live tests from SetServers* tests (#299) - - Before this change, SetServers, SetServersPorts and SetServersCSV - contained test cases trying to make DNS queries with the google.com - hostname, which requires Internet connectivity. Tests with that - requirement should be defined in the ares-test-live.cc file and contain - "Live" prefix to filter them out with `--gtest_filter=-*.Live*` on - machines without Internet connectivity. - - Fix By: Michal Rostecki (@mrostecki) +- autotools: processed configure.ac through autoupdate -- [Adam Majer brought this change] +- autotools. update ax_code_coverage.m4 to latest. don't use deprecated AC_HELP_STRING - Only count valid addresses when response parsing (#302) - - When ares_parse_a_reply or ares_parse_aaaa_reply is called in case - where another AAAA and A responses exist, the resulting ares_addrttl - count is invalid and the structure points to gibberish. +- pull out some old autotools cruft + +GitHub (17 Aug 2021) +- [Felix Yan brought this change] + + Provide ares_nameser.h as a public interface (#417) - This is a regression since 1.15. + NodeJS needs ares_nameser.h as a pubic header. - Issue: https://github.com/c-ares/c-ares/issues/300 - Fix By: Adam Majer (@AdamMajer) + Fixes: #415 + Fix By: Felix Yan (@felixonmars) -Brad House (24 Dec 2019) -- [Kyle Edwards brought this change] +- [Felix Yan brought this change] - CMake: Provide c-ares version in package export file (#296) + Fix building when latest ax_code_coverage.m4 is imported (#418) - The CMake package export file should provide version information. + ax_code_coverage.m4 dropped the @CODE_COVERAGE_RULES@ macro, so we need to switch to the latest recommendation from the m4 file. This requires updates to Makefile.am. - Fix By: Kyle Edwards (@KyleFromKitware) + Fix By: Felix Yan (@felixonmars) -- [Ben Noordhuis brought this change] +bradh352 (12 Aug 2021) +- bump version to match current release - Accept invalid /etc/resolv.conf lookup values, ability to build container tests (#274) - - * Add CARES_BUILD_CONTAINER_TESTS CMake option to add ability to build the Linux-only containerized tests. - * Accept invalid /etc/resolv.conf lookup values +GitHub (12 Aug 2021) +- [dhrumilrana brought this change] + + z/OS minor update, add missing semicolon in ares_init.c (#414) - Before this commit invalid `lookup` values resulted in c-ares not using - any lookups without any clear indication why. After this commit it uses - the default "fb". + Build fix for z/OS - Fix By: Ben Noordhuis (@bnoordhuis) + Fix by: Dhrumil Rana (@dhrumilrana) -- [Christian Ammer brought this change] +- [Daniel Bevenius brought this change] - Parallel A and AAAA lookups in `ares_getaddrinfo` (#290) - - A and AAAA lookups for ares_getaddrinfo() are now performed in parallel. + add build to .gitignore (#410) - For this change `ares_search` was removed from `ares_getaddrinfo`. - Instead `ares_query` in combination with `next_dns_lookup` are - doing the suffix search. + This commit adds the build directory to be ignored by git. - Adding support for `.onion` addresses which are tested by - `TEST_F(DefaultChannelTest, GetAddrinfoOnionDomain)` + The motivation for adding this to .gitignore as opposed to + .git/info/exclude is that the CMake example in INSTALL.md uses build + as the name of the directory to be used by CMake. This will cause + git to report build as an untracked file. - Fix By: Christian Ammer (@ChristianAmmer) + Fix By: Daniel Bevenius (@danbev) -- [Vy Nguyen brought this change] +- [Martin Holeš brought this change] - Move variables into the block where it is used to avoid unused-vars (#281) + Add support for URI(Uniform Resource Identifier) records. (#411) - Warning uncovered with [-Werror, -Wunused-variables] + Add ares_parse_uri_reply() for parsing URI DNS replies. - Fix By: Vy Nguyen (@oontvoo) + Fix By: Martin Holeš (@martin-256) -- [Vy Nguyen brought this change] +Daniel Stenberg (10 Aug 2021) +- ares_getaddrinfo.3: available since 1.16.0 - Rename local macros to avoid conflicting with system ones and remove unsed variables. (Otherwise code will break once compiled with [-Werror,-Wmacro-redefined,-Wunused-variable] ) (#280) - - Fix new getaddrinfo code to not redefine macros on some systems. - - Fix By: Vy Nguyen (@oontvoo) +- README.md: use https:// links -- [Egor Pugin brought this change] +Version 1.17.2 (24 Jul 2021) - [ares_getenv] Return NULL in all cases. (#279) - - if ares_getenv is defined, it must return a value on all platforms. - - Fix By: Egor Pugin (@egorpugin) +bradh352 (24 Jul 2021) +- fix typo -- [Abhishek Arya brought this change] +- prep for 1.17.2 release - Add OSS-Fuzz fuzzing badge (#278) +GitHub (30 Jun 2021) +- [jeanpierrecartal brought this change] + + Replace strdup() with ares_strdup() (#408) - Adds based on instructions at - https://google.github.io/oss-fuzz/getting-started/new-project-guide/#status-badge + strdup() is used in src/lib/ares_parse_a_reply.c and src/lib/ares_parse_aaaa_reply.c whereas allocated memory is freed using ares_free(). - Patch By: Abhishek Arya (@inferno-chromium) + Bug: 407 + Fix By: Jean-pierre Cartal (@jeanpierrecartal) -- [Peter Eisentraut brought this change] +- [Brad House brought this change] - ares_init_options.3: Fix layout (#275) + Validate hostnames in DNS responses and discard from malicious servers (#406) - 7e6af8e inserted the documentation of resolvconf_path in the middle of - the item for ednspsz, leading to broken layout. Fix that. + To prevent possible users having XSS issues due to intentionally malformed DNS replies, validate hostnames returned in responses and return EBADRESP if they are not valid. - Fix By: Peter Eisentraut (@petere) + It is not clear what legitimate issues this may cause at this point. + + Bug Reported By: philipp.jeitner@sit.fraunhofer.de + Fix By: Brad House (@bradh352) -- [Gregor Jasny brought this change] +bradh352 (11 Jun 2021) +- ares_expand_name(): fix formatting and handling of root name response + + Fixes issue introduced in prior commit with formatting and handling + of parsing a root name response which should not be escaped. + + Fix By: Brad House - manpages: Fix typos detected by lintian (#269) +- ares_expand_name() should escape more characters + RFC1035 5.1 specifies some reserved characters and escaping sequences + that are allowed to be specified. Expand the list of reserved characters + and also escape non-printable characters using the \DDD format as + specified in the RFC. - Fix By: Gregor Jasny (@gjasny) + Bug Reported By: philipp.jeitner@sit.fraunhofer.de + Fix By: Brad House (@bradh352) -- [lifenjoiner brought this change] +GitHub (15 Apr 2021) +- [HALX99 brought this change] - keep command line usage up to date (#256) + Fix can't get dns server on macos and ios (#401) - adig and ahost built-in help did not match args taken. + If DNS configuration didn't include search domains on MacOS (or iOS) it would throw an error instead of ignoring. - Fix-By: @lifenjoiner + Fix By: @halx99 -- [Dan Noé brought this change] +- [catalinh-bd brought this change] - ares-test.cc: Handle nullptr in AddrInfo ostream. (#268) + Bugfix/crash in ares sortaddrinfo (#400) - The const AddrInfo& argument to operator<< overload for AddrInfo can be - a nullptr unique_ptr. Handle this explicitly by printing {nullptr} if - the rest of the function cannot be safely executed. + The bug was generated because there was no check for the number + of items in the list and invalid memory was accesed when the list + was empty. There is a check for null after calling malloc but on + some systems it always returns a valid address for size equals 0. + Relates To: #392, 0903dcecabca283d0fa771632892dc7592b7a66d - Fix-by: Dan Noé - -- [Dan Noé brought this change] + Fix By: @catalinh-bd - Add missing limits.h include from ares_getaddrinfo.c (#267) +bradh352 (2 Mar 2021) +- Null deref if ares_getaddrinfo() is terminated with ares_destroy() - This files references INT_MAX, but does not include limits.h. This can - cause a build failure on some platforms. Include limits.h if we have it. + ares_freeaddrinfo() was not checking for a Null ptr during cleanup of + an aborted query. - Fix-by: Dan Noé + Once that was resolved it uncovered another possible issue with + multiple simultaneous underlying queries being outstanding and + possibly prematurely cleaning up the handle. + + Reported By: Michael Kourlas + Fix By: Brad House (@bradh352) -- [Andrew Selivanov brought this change] +GitHub (18 Feb 2021) +- [Brad House brought this change] - fix fuzzer docs and add missing getaddrinfo docs (#265) + CMake: RANDOM_FILE not defined #397 - There is a fix for a bit outdated clang fuzzer docs and ares_getaddrinfo docs. + RANDOM_FILE was never defined by cmake, causing RC4 key generation to use the less secure rand() method. - Fix By: Andrew Selivanov (@ki11roy) + Also, due to clashes with chain-building from other projects (e.g. curl) that may define RANDOM_FILE, this was renamed to CARES_RANDOM_FILE. + + This is the proposed change for #396 + + Fix By: Brad House (@bradh352) -- [Andrew Selivanov brought this change] +- [Anton Danielsson brought this change] - Fix leak and crash in ares_parse_a/aaaa_reply (#264) + CMake: fix Make install for iOS/MacOS (#395) - * fix leak if naddress of particular type found - * fix segfault when wanted ttls count lesser than count of result records - * add fuzzer input files that trigger problems (from #263) + INSTALL TARGETS were missing the BUNDLE DESTINATION - Reported-By: David Drysdale (@daviddrysdale) - Fix-By: Andrew Selivanov (@ki11roy) + Fix By: Anton Danielsson (@anton-danielsson) -- [Andrew Selivanov brought this change] +- [František Dvořák brought this change] - fix segfault when parsing wrong type of record (#262) + Fix build with autotools out of source tree (#394) - Fixes segfault when trying to ares_parse_aaaa with AF_INET and vise versa. + Add missing include directory, which fixes the build with autotools in separated build directory. - Fix By: Andrew Selivanov (@ki11roy) + Fix By: František Dvořák (@valtri) -- work around mingw compile failure +bradh352 (15 Jan 2021) +- fuzzing: HAVE_CONFIG_H may not be defined so cannot include ares_setup.h. Its not needed even though we include ares_nameser.h -- c++ requires explicit casts +- remove redundant header checks -- support EnvValue on Windows by implementing setenv/unsetenv +- properly detect netinet/tcp.h on openbsd -- [Andrew Selivanov brought this change] +- more portability updates - getaddrinfo enhancements (#257) - - * Service support has been added to getaddrinfo. - * ares_parse_a/aaaa_record now share code with the addrinfo parser. - * Private ares_addrinfo structure with useful extensions such as ttls (including cname ttls), - as well as the ability to list multiple cnames in chain of lookups - - Work By: Andrew Selivanov @ki11roy +- renamed nameser.h to ares_nameser.h requires Makefile.inc update for distributed files -- [Andrew Selivanov brought this change] +- more portability updates - fix ares__sortaddrinfo, use wrappers for sock_funcs (#258) +- remove bad files + +- portability updates for test cases + +- Portability Updates for arpa/nameser.h (#388) - Some socket functions weren't exposed for use by other areas of the library. Expose - those and make use of them in ares__sortaddrinfo(). + There is too much inconsistency between platforms for arpa/nameser.h and arpa/nameser_compat.h for the way the current files are structured. Still load the respective system files but make our private nameser.h more forgiving. - Fix By: Andrew Selivanov (@ki11roy) + Fixes: #388 + Fix By: Brad House (@bradh352) -- Fix c89 compilation support broken by .onion rejection changes +- ares_parse_ptr_reply() handle NULL for addr/addr_len. Fixes #392 - Move .onion check lower after all variables have been declared. + NodeJS passes NULL for addr and 0 for addrlen parameters to ares_parse_ptr_reply(). On systems where malloc(0) returned NULL, this would cause the function to return ARES_ENOMEM, but the cleanup wasn't handled properly and would crash. - Bug: #246 + This patche fixes that bug, and also hardens ares_free_hostent() to not leak memory during cleanup. + + Fixes: #392 + Fix By: Brad House (@bradh352) -- [kedixa brought this change] +- Define behavior of malloc(0) + + Some systems may return either NULL or a valid pointer on malloc(0). c-ares should never call malloc(0) so lets return NULL so we're more likely to find an issue if it were to occur. - getaddrinfo: callback must be called on bad domain (#249) +GitHub (24 Dec 2020) +- [dhrumilrana brought this change] + + z/OS: port (#390) - Due to an order of incrementing the remaining queries and calling ares_query, on a bad domain - the registered callback wouldn't be called. + Port c-ares to z/OS. - Bug: #248 - Fixed-By: @kedixa + Fix By: Dhrumil Rana (@dhrumilrana) -- [Darrin W. Cullop brought this change] +- [vburdo brought this change] - Windows ARM/ARM64 requires AdvApi32 (#252) + Use unbuffered stdio for /dev/urandom to read only requested data (#391) - Fix link issues caused by missing library that appears to only be required on ARM (though - docs don't list this restriction). Doesn't hurt to require it everywhere. + Buffered fread() reads 4096 bytes which is completely unnecessary and potentially may cause problems. + I discovered this on private linux configuration where custom /dev/urandom implementation has poor performance. - Bug: #251 - Fixed-By: Darrin Cullop (@dwcullop) + Fix By: @vburdo -- [kedixa brought this change] +- [Jay Freeman (saurik) brought this change] - getaddrinfo: avoid infinite loop in case of NXDOMAIN(#240) (#242) + This relative header #include needs to use quotes. (#386) - There are two possible causes for infinite loops fo NXDOMAIN, based on how many dots are in the domain name (one for < ARES_OPT_NDOTS and one for >= ARES_OPT_NDOTS), where it will repeat the same query over and over as the hquery->next_domain doesn't increment. + Fix By: Jay Freeman (@saurik) + +bradh352 (23 Nov 2020) +- Win32: Fix tools build with autotools static library + When c-ares is being built as static on Win32, CARES_STATICLIB must + be defined, but it wasn't being pulled in for the tools. - Fix By: @kedixa + Fixes: #384 + Fix By: Brad House (@bradh352) -- Portability fix for ares__sortaddrinfo() +- Loosen requirements for static c-ares library when building tests - replace uint32_t with unsigned int and socklen_t with ares_socklen_t + It appears that when building tests, it would hardcode enabling building + of the c-ares static library. This was probably due to Windows limitations + in symbol visibility. - By: Brad House + This change will use the static library if it exists for tests, always. + Otherwise, it will only forcibly enable static libraries for tests on + Windows. + + Fixes: #380 + Fix By: Brad House (@bradh352) -- [Khaidi Chu brought this change] +- Remove legacy comment about ahost/acountry/adig targets - fix: init bufp before reject .onion to make it can be free correctly (#241) +- Distribute fuzzinput/fuzznames for fuzz tests - When querying a .onion domain, it returns directly without setting bufp to NULL. A subsequent free() that occurs can cause a segmentation fault. + The fuzz test files were not being distributed. This doesn't appear to be + a regression, it looks like they have never been distributed. - Fix By: Khaidi Chu (@XadillaX) + Fixes: #379 + Fix By: Brad House (@bradh352) -- [Andrew Selivanov brought this change] +Version 1.17.1 (19 Nov 2020) - Add ares__sortaddrinfo() to support getaddrinfo() sorted results (#239) - - This is a port of RFC 6724 compliant sorting function from Android Bionic project: - https://android.googlesource.com/platform/bionic/+/e919b116d35aa7deb24ddece69c491e24c3b0d6f/libc/netbsd/net/getaddrinfo.c - - The latest version is essentially the same, except two additional parameters to test connection with (mark/uid): - https://android.googlesource.com/platform/bionic/+/master/libc/dns/net/getaddrinfo.c - - Please note that even that version has some restrictions. It doesn't support some rules from RFC 6724: +GitHub (19 Nov 2020) +- [Brad House brought this change] + + Travis: add iOS target built with CMake (#378) - Rule 3 (Avoid deprecated addresses) - Rule 4 (Prefer home addresses) - Rule 7 (Prefer native transport) + Issue #377 suggested that CMake builds for iOS with c-ares were broken. This PR adds an automatic Travis build for iOS CMake. - Submitted By: Andrew Selivanov (@ki11roy) + Fix By: Brad House (@bradh352) -- [Christian Ammer brought this change] - - Increase portability of `ares-test-mock-ai.cc` (#235) - - * using portable ares_inet_pton and updated includes in ares-test-mock-ai - * forgot to remove deleted ares-test-ai.cc in Makefile.inc - - Fix By: Christian Ammer (@ChristianAmmer) +bradh352 (18 Nov 2020) +- fix build +GitHub (18 Nov 2020) - [Fabrice Fontaine brought this change] - m4/xc-cc-check.m4: use XC_CHECK_BUILD_FLAGS (#236) + External projects were using non-public header ares_dns.h, make public again (#376) - Use XC_CHECK_BUILD_FLAGS instead of XC_CHECK_USER_FLAGS. - Otherwise it complains of CPPFLAGS in CFLAGS. - [Retrieved from: - https://git.buildroot.net/buildroot/tree/package/c-ares/0001-use_check_build_instead_of_check_user.patch] + It appears some outside projects were relying on macros in ares_dns.h, even though it doesn't appear that header was ever meant to be public. That said, we don't want to break external integrators so we should distribute this header again. - Signed-off-by: Gustavo Zacarias - Signed-off-by: Fabrice Fontaine - Submitted by: Fabrice Fontaine + Fix By: Fabrice Fontaine (@ffontaine) -- [Christian Ammer brought this change] +bradh352 (17 Nov 2020) +- note that so versioning has moved to configure.ac - Bugfix for `ares_getaddrinfo` and additional unit tests (#234) +- note about 1.17.1 + +- fix sed gone wrong + +GitHub (17 Nov 2020) +- [Daniel Stenberg brought this change] + + autotools cleanup (#372) - This PullRequest fixes a bug in the function add_to_addrinfo which task is to add new addrinfo items to the ai_next linked list. Also additional unit tests for testing ares_getaddrinfo will be added: + * remove: install-sh mkinstalldirs - Additional mock server test classes (ares-test-mock-ai.cc): - MockTCPChannelTestAI - MockExtraOptsTestAI - MockNoCheckRespChannelTestAI - MockEDNSChannelTestAI - RotateMultiMockTestAI - NoRotateMultiMockTestAI + They're generated when needed, no need to store in it. - Additional live tests (ares-test-live-ai.cc): - LiveGetHostByNameV4 - LiveGetHostByNameV6 - LiveGetHostByNameV4AndV6 + * buildconf: remove custom logic with autoreconf - Fix By: Christian Ammer (@ChristianAmmer) + Fix By: Daniel Stenberg (@bagder) -- [Christian Ammer brought this change] +bradh352 (17 Nov 2020) +- attempt to fix 1.17.0 release distribution issues - Remaining queries counter fix, additional unit tests for `ares_getaddrinfo` (#233) - - Remaining queries counter fix, added tests (ParallelLookups, - SearchDomains, SearchDomainsServFailOnAAAA). Removed unnecessary - if and commented code in test. - - Fix By: Christian Ammer (@ChristianAmmer) +Version 1.17.0 (16 Nov 2020) -- [Christian Ammer brought this change] +bradh352 (16 Nov 2020) +- 1.17.0 release prep - Add initial implementation for ares_getaddrinfo (#112) - - Initial implementation for ares_getaddrinfo(). It is NOT compliant with RFC6724, though - it is expected to come closer to conformance prior to the next release. +- ares_getaddrinfo(): duplicate hints ai_socktype and ai_protocol into output - Features not supported include sorted addresses and honoring of service and hints - parameters. + ai_socktype and ai_protocol were ignored from the hints input. They are now + duplicated into the output as expected. Currently no sanity checks on + proper values are taking place. - Implementation by: Christian Ammer (@ChristianAmmer) - -- [Ben Noordhuis brought this change] + Fixes: #317 + Fix By: Brad House (@bradh352) - test: fix bad expectation in ipv6 localhost test (#227) +- ares_parse_{a,aaaa}_reply could return larger *naddrttls than passed in - The LiveGetLocalhostByAddrV6 test expected to see "localhost" in the - result when doing an address-to-name lookup for ::1 but on my system - that resolves to "ip6-loopback" because of this stanza in /etc/hosts: + If there are more ttls returned than the maximum provided by the requestor, then + the *naddrttls response would be larger than the actual number of elements in + the addrttls array. - $ grep ^::1 /etc/hosts - ::1 ip6-localhost ip6-loopback + This bug could lead to invalid memory accesses in applications using c-ares. - Fix By: Ben Noordhuis (@bnoordhuis) - Bug: #85 + This behavior appeared to break with PR #257 + + Fixes: #371 + Reported By: Momtchil Momtchev (@mmomtchev) + Fix By: Brad House (@bradh352) -- [Ben Noordhuis brought this change] +GitHub (5 Nov 2020) +- [Dustin Lundquist brought this change] - ares_version.h: bump version (#230) + docs: ares_set_local_ip4() uses host byte order (#368) - Version change not committed from maketgz.sh + Properly document brain-dead behavior of ares_set_local_ip4() using host byte order instead of expected network byte order. - Bug: #229 - -Daniel Stenberg (24 Oct 2018) -- ares_library_init_android.3: minor syntax edits, fixed AVAILABILITY - -Version 1.15.0 (23 Oct 2018) - -Brad House (23 Oct 2018) -- last minute 1.15.0 addition + Fix By: Dustin Lundquist -- [Ben Noordhuis brought this change] +- [Łukasz Marszał brought this change] - Report ARES_ENOTFOUND for .onion domain names as per RFC7686. (#228) + empty hquery->name could lead to invalid memory access (#367) - Quoting RFC 7686: + If hquery->name is empty (=="\0"), &hquery->name[strlen(hquery->name)-1] would point to "random" place in memory. This is causing some of my address sanitizer tests to fail. - Name Resolution APIs and Libraries (...) MUST either respond - to requests for .onion names by resolving them according to - [tor-rendezvous] or by responding with NXDOMAIN. + Fix By: Łukasz Marszał (@lmarszal) + +bradh352 (28 Sep 2020) +- Fix OSSFuzz reported issue in CAA reply parsing - A legacy client may inadvertently attempt to resolve a .onion - name through the DNS. This causes a disclosure that the client - is attempting to use Tor to reach a specific service. Malicious - resolvers could be engineered to capture and record such leaks, - which might have very adverse consequences for the well-being - of the user. + OSS-Fuzz is reporting a use-of-uninitialized-value: + https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=26012 - Bug: #196 - Fix By: Ben Noordhuis @bnoordhuis + Reported By: David Drysdale (@daviddrysdale) -- prepare for c-ares 1.15.0 release +GitHub (26 Sep 2020) +- [David Hotham brought this change] -- AIX Build Fix + fuzz CAA parsing (#363) - AIX attempts to include both nameser_compat.h and onameser_compat.h. It appears - the proper fix is to define _USE_IRS so that only nameser_compat.h is used. + Add fuzz support for CAA parsing - Bug: #224 - Fix By: Brad House (@bradh352) + Fix By: David Hotham (@dimbleby) -- Fix crash in ares_dup() due to new ARES_OPT_RESOLVCONF - - ares_dup() calls ares_init_options() by making its own fake option - mask since the original mask isn't stored but ARES_OPT_RESOLVCONF - was always set, instead of conditionally set. This caused a crash - because ares_strdup() isn't NULL-safe if no custom path was set. +- [Daniela Sonnenschein brought this change] + + Allow parsing of CAA Resource Record (#360) - Made ares_dup() set ARES_OPT_RESOLVCONF conditionally. + CAA (Certification Authority Authorization) was introduced in RFC 6844. + This has been obsoleted by RFC 8659. This commit added the possibility + to query CAA resource records with adig and adds a parser for CAA + records, that can be used in conjunction with ares_query(3). - Fix By: Brad House (@bradh352) - -- [Sarat Addepalli brought this change] + Closes Bug: #292 + Fix By: Daniela Sonnenschein (@lxdicted) - Add ares_init_options() configurability for path to resolv.conf file +Daniel Stenberg (17 Sep 2020) +- docs: remove the html and pdf make targets - Add resolvconf_path to end of struct ares_options with ARES_OPT_RESOLVCONF option - so on Unix-like systems a custom path can be specified. If no path is specified, - /etc/resolv.conf is used like normal. + They're rarely used in our daily work flow and mostly just add friction, - Fix By: Sarat Addepalli @SirR4T - Fixes Bug: #220 - Review By: Brad House @bradh352 - -- remove stale variables - -- fix prototype name for ares_strsplit_free() - -- add missing prototype + Closes #362 -- simplify ares_strsplit() and create ares_strsplit_free() helper function +bradh352 (14 Sep 2020) +- ares_process needs to always include nameser.h as it has compat -- missing ares_strsplit.h from HHEADERS for inclusion in distribution +- Define T_OPT if system doesn't provide it -- [Ruslan Baratov brought this change] +GitHub (12 Sep 2020) +- [Gisle Vanem brought this change] - Add CARES_BUILD_TOOLS CMake option (#214) + Change the mailman links (#358) - Add ability to exclude building of tools (adig, ahost, acountry) in CMake. This should also close #200. + Links when wrapping become misleading. Insert newline to prevent wrapping. - Fix By: Ruslan Baratov (@ruslo) - Bug: #200 + Fix By: Gisle Vanem (@gvanem) -- [flyingdutchman23 brought this change] +- [Gisle Vanem brought this change] - Style. Whitespace cleanup. (#213) - - Small whitespace cleanups. + [adig] Update man-page for the '-x' option (#357) - Fix By: @flyingdutchman23 + Fix By: Gisle Vanem (@gvanem) -- [John Schember brought this change] +- [Gisle Vanem brought this change] - Android: Support for domain search suffix (#211) + [adig] add '-x' option. (#356) - Fixes issue #207. Uses LinkProperties.getDomains() to get a list of search domains and adds them to the suffix list. This also adds a new helper function to split strings into an array based on multiple delimiters replacing multiple other functions for dealing with string splitting. + Added a 'dig-style' '-x' option. Also support '-xx' for a + IPv6 bit-string PTR query. - Submitter: John Schember (@user-none) - Fixes: #207 - Approved-by: Brad House (@bradh352) + Fix By: Gisle Vanem (@gvanem) -- [afalin brought this change] +bradh352 (12 Sep 2020) +- fix indentation - Improve DNS suffixes extracting from WinNT registry (#202) - - Join all global and connection specific suffix lists. Use 'HKLM\Software\Policies\Microsoft\Windows NT\DNSClient\SearchList', 'HKLM\System\CurrentControlSet\Services\Tcpip\Parameters\Domain' as global suffix lists. - - Fix By: @afalin +- ns_t_opt -> T_OPT -- Be consistent with indention in CMakeLists.txt +GitHub (12 Sep 2020) +- [Gisle Vanem brought this change] + + Fixes for Watt-32 on djgpp + Windows (#355) - The imported TRANSFORM_MAKEFILE_INC function from curl used space indention - but the rest of the file used tabs. Go ahead and make it tabs for - consistency as well. + No longer any relation to libcurl since '/packages/DOS/common.dj' is dropped. + This Makefile.dj has been tested on Win-10 only (using the Windows hosted djgpp cross compiler). - Committed By: Brad House + Fix By: Gisle Vanem (@gvanem) -- [flyingdutchman23 brought this change] +- [Gisle Vanem brought this change] - Fix modern gcc warning: argument to 'sizeof' in 'strncpy' call is the same expression as the source + Fixes for Watt-32 on Windows and MSDOS (#354) - Silence warning about using src to determine number of bytes to copy. - In this case it doesn't matter whether it is `src` or `dest`. So there - is no functionality change. + Move the prototype to 'ares_private.h'. - Bug: #210 - Fix By: @flyingdutchman23 + Fix By: Gisle Vanem (@gvanem) -- [Andi Schnebinger brought this change] +bradh352 (11 Sep 2020) +- update path for include - fix stringop-overflow warning of GCC (#201) - - When using a modern GCC to compile c-ares, there is a stringop-overflow warning. - This patch simply silences the false-positive warning, there is no actual code flaw. - - Bug: https://github.com/c-ares/c-ares/pull/201 - Fixed By: Andi Schnebinger @Iniesta8 +- remove stale information -GitHub (18 May 2018) -- [David Drysdale brought this change] +- remove stale information - travis: do coverage in "coverage" build (#195) - - Fixes #194, a mistake from commit a255081f2c3c ("travis: Only do - coverage/distcheck on normal build") +Brad House (9 Sep 2020) +- silence compiler warnings -Brad House (17 May 2018) -- [Brad Spencer brought this change] +- Remove stale msvc files from makefile - Apply the IPv6 server blacklist to all nameserver sources, not just Windows (#193) - - For #164, I mentioned that it seemed like the IPv6 nameserver blacklist should apply to all OSes. In a mailing list post, @bradh352 agreed and suggested that I file a PR to make it so. +GitHub (9 Sep 2020) +- [Brad House brought this change] + + Reorganize source tree (#349) - This moves the blacklist check from being Windows-specific to being a general feature of config_nameservers(), no matter the nameserver source. It also simplifies the ares_ipv6_server_blacklisted() implementation to not parse and re-parse the blacklisted IPv6 addresses from strings on every check. I think they're almost as easy to read as a sequence of hex bytes in an array initializer, and it's definitely less work on each trip through the code. + Originally started by Daniel Stenberg (@bagder) with #123, this patch reorganizes the c-ares source tree to have a more modern layout. It also fixes out of tree builds for autotools, and automatically builds the tests if tests are enabled. All tests are passing which tests each of the supported build systems (autotools, cmake, nmake, mingw gmake). There may be some edge cases that will have to be caught later on for things I'm not aware of. - Fix By: Brad Spencer @b-spencer - PR: https://github.com/c-ares/c-ares/pull/193 + Fix By: Brad House (@bradh352) -- [Brad Spencer brought this change] +Brad House (1 Sep 2020) +- remove CURLDEBUG as per #82 - Fix warnings emitted by MSVC when using -W4 (#192) - - These changes fix a few warnings emitted by recent versions of MSVC when compiling with -W4. Half of the changes are in Windows-specific code, and the other half should be safe no matter the compiler or OS. +GitHub (1 Sep 2020) +- [Erik Lax brought this change] + + Detect remote DNS server does not support EDNS as per RFC 6891 (#244) - The allocation function change is probably the only one that needs explanation. MSVC gives warnings about the function pointers not being stable across DLL boundaries or something to that effect, so for Windows, I've made them be called indirectly, which at least made the compiler happy. I can't say I've tested every linking combination on Windows with them before or after the change, but it seems harmless. + EDNS retry should be based on FORMERR returned without an OPT RR record as per https://tools.ietf.org/html/rfc6891#section-7 rather than just treating any unexpected error condition as a reason to disable EDNS on the channel. - Fix By: Brad Spencer @b-spencer - PR: https://github.com/c-ares/c-ares/pull/192 + Fix By: Erik Lax (@eriklax) -- [David Hotham brought this change] +Brad House (27 Aug 2020) +- Fix for #345, don't use 'true' use 1 - Prevent changing name servers while queries are outstanding (#191) +GitHub (27 Aug 2020) +- [Seraphime Kirkovski brought this change] + + ares_gethostbyname: Fix AF_UNSPEC support when using an ip address (#204) - Changing name servers doesn't work, per #41. Better to return an error code than to crash. + fake_hostent() was not supporting AF_UNSPEC, so when an ip address was specified when using AF_UNSPEC it would attempt to do a DNS lookup rather than returning a fake hostent using the ip address. - Fix-by: David Hotham @dimbleby - -David Drysdale (15 May 2018) -- [Tobias Nießen brought this change] - - Fix comment in ares_rules.h (#189) + Fix By: Seraphime Kirkovski (@Seraphime) -Brad House (6 May 2018) -- [Brad Spencer brought this change] +- [apenn-msft brought this change] - Harden and rationalize c-ares timeout computation (#187) + Tests should use dynamic system-assigned ports rather than static port (#346) - * Harden and rationalize c-ares timeout computation - * Remove the rand() part of the timeout calculation completely. + The c-ares test suite was hardcoded to use port 5300 (and possibly 5301, 5302) for the test suite. Especially in containers, there may be no guarantee these ports are available and cause tests to fail when they could otherwise succeed. Instead, request the system to assign a port to use dynamically. This is now the default. To override, the test suite still takes the "-p " option as it always has and will honor that. - When c-ares sends a DNS query, it computes the timeout for that request as follows: + Fix By: Anthony Penniston (@apenn-msft) + +Brad House (25 Aug 2020) +- Unset members of the addr struct contain garbage values (#343) - timeplus = channel->timeout << (query->try_count / channel->nservers); - timeplus = (timeplus * (9 + (rand () & 7))) / 16; - I see two issues with this code. Firstly, when either try_count or channel->timeout are large enough, this can end up as an illegal shift. + When generating the ares_sockaddr data by getaddrinfo() it was only filling + in certain members while leaving others uninitialized. This left garbage + data if a user tried to use the unset values. memset() the ares_sockaddr + to 0 prior to filling in the values to prevent this. - Secondly, the algorithm for adding the random timeout (added in 2009) is surprising. The original commit that introduced this algorithm says it was done to avoid a "packet storm". But, the algorithm appears to only reduce the timeout by an amount proportional to the scaled timeout's magnitude. It isn't clear to me that, for example, cutting a 30 second timeout almost in half to roughly 17 seconds is appropriate. Even with the default timeout of 5000 ms, this algorithm computes values between 2812 ms and 5000 ms, which is enough to cause a slightly latent DNS response to get spuriously dropped. + Reported By: @SmorkalovG + Fix By: Brad House (@bradh352) + +GitHub (24 Aug 2020) +- [Jonathan Maye-Hobbs brought this change] + + FQDN with trailing period should be queried first with larger ndot value (#345) - If preventing the timers from all expiring at the same time really is desirable, then it seems better to extend the timeout by a small factor so that the application gets at least the timeout it asked for, and maybe a little more. In my experience, this is common practice for timeouts: applications expect that a timeout will happen at or after the designated time (but not before), allowing for delay in detecting and reporting the timeout. Furthermore, it seems like the timeout shouldn't be extended by very much (we don't want a 30 second timeout changing into a 45 second timeout, either). + If a query is performed for dynamodb.us-east-1.amazonaws.com. with ndots=5, it was attempting to search the search domains rather than just attempting the FQDN that was passed it. This patch now at least attempts the FQDN first. - Consider also the documentation of channel->timeout in ares_init_options(): + We may need to determine if we should abort any further searching, however as is probably intended. - The number of milliseconds each name server is given to respond to a query on the first try. (After the first try, the timeout algorithm becomes more complicated, but scales linearly with the value of timeout.) The default is five seconds. + Fix by: Jonathan Maye-Hobbs (@wheelpharoah) + +- [Gisle Vanem brought this change] + + Update acountry.c country code list (#341) - In the current implementation, even the first try does not use the value that the user supplies; it will use anywhere between 56% and 100% of that value. + Updated country_list[]: + * 2-letter ISO-3166 country-codes. + * Add, rename some names + codes in accordance with latest table at https://en.wikipedia.org/wiki/ISO_3166-1. - The attached patch attempts to address all of these concerns without trying to make the algorithm much more sophisticated. After performing a safe shift, this patch simply adds a small random timeout to the computed value of between 0 ms and 511 ms. I could see limiting the random amount to be no greater than a proportion of the configured magnitude, but I can't see scaling the random with the overall computed timeout. As far as I understand, the goal is just to schedule retries "not at the same exact time", so a small difference seems sufficient. + Fix By: Gisle Vanem (@gvanem) + +- [Bulat Gaifullin brought this change] + + Test case should honor flag HAVE_WRITEV rather than WIN32 (#344) - UPDATE: randomization removed. + Test cases where not honoring the HAVE_WRITEV flag but instead using WIN32 to determine if WRITEV was available or not. This patch fixes that. - Closes PR #187 - Fix by: Brad Spencer + Fix By: Bulat Gaifullin (@bgaifullin) -- distribute ares_android.h +Brad House (18 Jul 2020) +- Ensure c89 support - Distribute ares_android.h when a release distribution package is - created. + A couple of for loops in Mac-specific code were using integer declarations + inside a for loop. Move the declaration to the top of the preceding + code block to retain c89 compliance. - Reported By: Andrey Khranovsky - Bug: https://c-ares.haxx.se/mail/c-ares-archive-2018-04/0000.shtml + Reported By: Jeffrey Walton -- ares_set_servers_csv() on failure should not leave channel in a bad state +GitHub (2 Jul 2020) +- [Fionn Fitzmaurice brought this change] + + Avoid buffer overflow in RC4 loop comparison (#336) - If bad data is passed to ares_set_servers_csv() or - ares_set_servers_ports_csv() it will clear the existing channel - configured DNS servers, then a call to ares_send() will fail due - to a bad malloc which may have undefined behavior. + The rc4 function iterates over a buffer of size buffer_len who's maximum + value is INT_MAX with a counter of type short that is not guaranteed to + have maximum size INT_MAX. - The fix now only clears existing servers on success. An additional - sanity check was added in ares_send() to ensure nservers >= 1 or - will result in ARES_ESERVFAIL. + In circumstances where short is narrower than int and where buffer_len + is larger than the maximum value of a short, it may be possible to loop + infinitely as counter will overflow and never be greater than or equal + to buffer_len. - Bug: https://c-ares.haxx.se/mail/c-ares-archive-2018-03/0000.shtml - Reported-by: Francisco Sedano Crippa - -- docs: Not all manpages are listed + The solution is to make the comparison be between types of equal width. + This commit defines counter as an int. - Some docs aren't installed or not showing up on - https://c-ares.haxx.se/docs.html - due to not being listed in Makefile.inc. Add missing docs and - ensure docs are alphabetized. + Fix By: Fionn Fitzmaurice (@fionn) -Version 1.14.0 (16 Feb 2018) +- [anonymoushelpishere brought this change] -Daniel Stenberg (16 Feb 2018) -- ares_android.c: fix warning: ISO C forbids an empty translation unit + Updated help information for adig, acountry, and ahost. (#334) + + Provide more descriptive help information for various utilities. + + Fix By: @anonymoushelpishere -- RELEASE-NOTES: some more work we did and people who helped +- [lutianxiong brought this change] -Brad House (16 Feb 2018) -- travis: skip Autotools style testing for cmake + avoid read-heap-buffer-overflow (#332) - Fix cmake test build by skipping autotools portion of test script. - -- travis: standardize CMake test off of Autotools tests + Fix invalid read in ares_parse_soa_reply.c found during fuzzing - Instead of running 'make test', run the tests directly like autotools - does. It provides more verbose output. + Fixes Bug: #333 + Fix By: lutianxiong (@ltx2018) -- travis: Enable building tests for CMake +- [Ivan Baidakou brought this change] + + Fix: sizeof(sizeof(addr.saX)) -> sizeof(addr.saX) in readaddrinfo (#331) - Travis should auto-build and run tests for cmake builds now that - PR #168 is merged. + Looks like a sed-gone-wrong, a sizeof inside of a sizeof. + + Fix By: Ivan Baidakou (@basiliscos) -- fix version in pkgconfig +Version 1.16.1 (11 May 2020) -- Add version update to CMakeLists in maketgz +Brad House (11 May 2020) +- c-ares 1.16.1 release prep -- Release prep. Add support for pkgconfig in cmake, set versions appropriately +- update travis to use xcode11.4 -Gregor Jasny (15 Feb 2018) -- CMake: Add tests +- Prevent possible double-free in ares_getaddrinfo() if ares_destroy() is called + + In the event that ares_destroy() is called prior to ares_getaddrinfo() completing, + it would result in an invalid read and double-free due to calling end_hquery() twice. + + Reported By: Jann Horn @ Google Project Zero -Brad House (14 Feb 2018) -- [Gregor Jasny brought this change] +GitHub (30 Apr 2020) +- [shelley vohr brought this change] - Use cmake3 package provided by Ubuntu (#182) + fix: windows UNICODE incompatibilities with ares_getaddrinfo (#328) + + Fixes the following compatibility issues: + * Use RegQueryValueExA instead of RegQueryValueEx + * Use ExpandEnvironmentStringsA instead of ExpandEnvironmentStrings + * Use RegOpenKeyExA instead of RegOpenKeyExA + * Use GetWindowsDirectoryA instead of GetWindowsDirectoryA + + Fix By: Shelley Vohr (@codebytere) + Closes: #327 -- Cmake 3.1 instead of 3.2.1 should be the minimum +Brad House (13 Apr 2020) +- travis: CloudFlare does not allow T_ANY requests, so live tests that use it fail. Disable. -- Update RELEASE-NOTES and RELEASE-PROCEDURE.md to prepare for next release +- travis: bump macos image to the latest -- get rid of c++ style comments +- cast-align warnings are false for struct sockaddr, silence + + Create a macro to silence false cast-align warnings when casting + struct sockaddr * to struct sockaddr_in * and struct sockaddr_in6 *. + + Fix By: Brad House (@bradh352) -- Use trusty for all builds, precise is EOL. Update clang and cmake versions. +- MacOS: Enable libresolv support for retrieving DNS servers like iOS does. -- Current CMakeLists.txt doesn't support 2.8.12 anymore, we need to bump the version to 3.2.1 minimum +GitHub (10 Apr 2020) +- [Dmitry Igrishin brought this change] -- Re-organize sections in INSTALL.md and add CMake section + CMake: Populate the INCLUDE_DIRECTORIES property of installed targets (#323) + + Populate the INCLUDE_DIRECTORIES property of installed targets + + Fix By: Dmitry Igrishin (@dmitigr) -- [Sergey Kolomenkin brought this change] +Brad House (10 Apr 2020) +- travis: make valgrind use cmake for tests - remove compilation warnings in MSVC (#47) +- dont try to use libtool to run valgrind -- document handling of timeouts for ares_process and ares_process_fd to close PR #57 +- valgrind requires libtool installed to wrap tests -- As per Issue #155, since we do not require gethostname() during init, if it fails, there's no reason for init to fail as it is only used to populate the domain +- scan build 7 -GitHub (7 Feb 2018) -- [David Drysdale brought this change] +- fix travis live test - Document WSAStartup requirement (#180) +- add debug for travis -David Drysdale (6 Feb 2018) -- [Antonio Tajuelo brought this change] - - Added coderelease.io badge to readme.md for letting people subscribe to new versions (#174) - -- [Sheel Bedi brought this change] - - Update year in LICENSE.md to 2018 (#170) - -GitHub (4 Feb 2018) -- [David Drysdale brought this change] +- try without sudo - travis: use VM not container for {L,A}SAN builds (#177) - - As per https://github.com/travis-ci/travis-ci/issues/9033, container - based builds do not currently allow ptrace, which is used by LSAN and - ASAN. +- attempt to modernize travis build environment -Brad House (3 Feb 2018) -- [acthompson-google-com brought this change] +GitHub (6 Apr 2020) +- [Teemu R brought this change] - Android JNI code leaks local references in some cases (#175) + Allow TXT records on CHAOS qclass (#321) - * Add Google LLC to AUTHORS. + Some DNS servers intentionally "misuse" the obsoleted CHAOS (CH) qclass to provide things like `version.bind`, `version.server`, `authors.bind`, `hostname.bind` and `id.server`. - * android: Explicitly delete all JNI local references, and cache JNI method IDs at initialization. + C-ares was not allowing such use cases. - * android: Only return ARES_ENOTINITIALIZED on failures in initialization code. - -Gregor Jasny (2 Jan 2018) -- Embed fused Google Test 1.8.0 + Fix By: Teemu R. (@rytilahti) -Brad House (21 Dec 2017) -- [John Schember brought this change] +Brad House (5 Apr 2020) +- Remove warnings from ares_getaddrinfo.3 man page + + As reported in #319, non-standard macros of .IN were used. + Replace with .RS/.RE. + + Fixes: #319 + Fix By: Brad House (@bradh352) - android: Check returns for obj and classes are not NULL. Document API levels for various Android functions and objects used. (#166) +- ares_getaddrinfo man page render better for man2html -- CARES_CHECK_TYPE should reference variable so a warning is not produced for -Werror compatibility +- update man pages to render better for man2html -- [Brad Spencer brought this change] +Version 1.16.0 (12 Mar 2020) - Fix computation of IPv6 blacklist mask for values of netmask > 8. (#164) +Brad House (12 Mar 2020) +- 1.16.0 release notes draft -David Drysdale (14 Dec 2017) -- travis: Only do coverage/distcheck on normal build +- attempt to fix double-free introduced in e0517f9 -- travis: only do pip install on Linux +GitHub (12 Mar 2020) +- [David Drysdale brought this change] -- travis: only test in IPv4 mode + test: fuzzer input triggering double free (#315) - Travis' Trusty environment does not support IPv6. - -- test: allow restriction to one IP address family + OSS-Fuzz has reported a double-free with the fuzzer input file + included here; run with: + ./test/aresfuzz test/fuzzinput/clusterfuzz-5637790584012800 + + Bisecting the failure points to commit e0517f97d988 ("Parse SOA records + from ns_t_any response (#103)") -- [Roman Teterin brought this change] +- [Brad House brought this change] - Fix a typo in init_by_resolv_conf (#160) + CMake: Install Manpages (#314) + + CMake wasn't installing manpages. + + Fixes #297 + Fix By: Brad House (@bradh352) -Brad House (11 Dec 2017) -- @gvanem says MSVC -RTCc option fails, looks erroneous to me, but the additional mask is harmless +- [Brad House brought this change] -- Fix some other mingw warnings + Enable cmake tests for AppVeyor (#313) + + Tests require linking against the static library on Windows otherwise the symbols are not exported for internals being tested. + + Fix By: Brad House (@bradh352) -- Issue #143, get rid of windows build warning due to passing 'char **' to argument expecting 'const char **' +Brad House (11 Mar 2020) +- Add AppVeyor badge -- [Gregor Jasny brought this change] +- bump c-ares version to 1.16.0. test AppVeyor integration. - Distribute CMake files (#130) +GitHub (11 Mar 2020) +- [Brad House brought this change] -- Android variants may not have __system_property_get + replace all usages of inet_addr() with ares_inet_pton() which is more proper (#312) - Some android systems like ARM64 may not have the __system_property_get - symbol in libc (but still have it in the public headers). Detect this - condition at build time. The __system_property_get method of retrieving - name servers is deprecated as of Oreo so should strictly be a fallback - mechanism anyhow. - -David Drysdale (9 Nov 2017) -- [David Hotham brought this change] + Replace usage of inet_addr() with ares_inet_pton() which is more appropriate and fixes issues with legitimate addresses like 255.255.255.0. IPv6 already used this. + + Fixes #309 + Fix By: Brad House (@bradh352) - Wrong function name throughout man page (#154) +- [Brad House brought this change] -- ares_data.c: iterate through substructs when freeing + CMake: Generate WinPDB files during build (#311) - Previous code recursed into substructures, which makes it more likely - that large/heavily-nested responses could use up lots of stack. + Build and Install PDB (Windows Debug Symbol) files if supported by underlying system. + + Also update AppVeyor to test cmake builds. + + Fixes #245 + Fix By: Piotr Pietraszkiewicz (@ppietrasa) and Brad House (@bradh352) -- test: test ares_free_data on long chain of structs +- [Brad House brought this change] -- [Felix Yan brought this change] + CMake: Rework library function checking (#310) + + CHECK_LIBRARY_EXISTS(), while it takes a function name, does not actually verify the function exists in the library being evaluated. Instead, if the function is found in any dependent library, and the referenced library also exists, it returns true. This is not desirable. + + Wrap with a Macro to change the behavior. + + Fixes: #307 + Fix By: Brad House (@bradh352) - Fix a typo in inet_ntop.c (#151) +- [Dron Rathore brought this change] -Daniel Stenberg (29 Sep 2017) -- ares_gethostbyname.3: fix callback status values + Parse SOA records from ns_t_any response (#103) - - ARES_ENOTFOUND means the _name_ wasn't found + Added the capability of parsing SOA record from a response buffer of ns_t_any type query, this implementation doesn't interfere with existing T_SOA query's response as that too is treated as a list of records. The function returns ARES_EBADRESP if no SOA record is found(as per RFC). - - ARES_ENODATA can be returned when a resolve fails + The basic idea of sticking to RFC that a ns_t_any too should return an SOA record is something open for discussion but I have kept the functionality intact as it was previously i.e the function returns ARES_EBADRESP if it doesn't find a SOA record regardless of which response it is parsing i.e. T_SOA or T_ANY. - Reported-by: Jakub Hrozek - Bug: https://c-ares.haxx.se/mail/c-ares-archive-2011-06/0012.shtml + Note that asking for T_ANY is generally a bad idea: + - https://blog.cloudflare.com/what-happened-next-the-deprecation-of-any/ + - https://tools.ietf.org/html/draft-ietf-dnsop-refuse-any + + Bug: #102 + Fix By: Dron Rathore (@DronRathore) -Brad House (28 Sep 2017) -- [John Schember brought this change] +- [Stephen Bryant brought this change] - Fix DNS server lookup breaking with Android O due to Android removing access to net.dns# system properties. (#148) + Added CPack functionality for generating RPM or DEB packages (#283) - As of Android 8 (Oreo) access to net.dns# has been removed (https://developer.android.com/about/versions/oreo/android-8.0-changes.html). The reasoning given is that it, "improves privacy on the platform". Currently c-ares uses this to get the list of DNS servers. + Added CPack functionality for generating RPM or DEB packages - Now the only way to access the DNS server list is by using the Connectivity Manager though Java. This adds the necessary JNI code to use the Connectivity Manager and pull the DNS server list. The old way using __system_property_get with net.dns# remains for compatibilty. + ie: run `cpack -G RPM` (or "DEB") after building with CMake. - Using the Connectivity Manager requires the ACCESS_NETWORK_STATE permission to be set on the app. Existing applications most likely are not setting this and keeping the previous method as a fallback will at the very least ensure those apps don't break on older versions of Android. They will need to add this permission for Android 8 compatibility. + The current configuration creates 3 separate packages for the shared library, + the development files and the tools. - Included in the patch are two initalization functions which are required. The JVM must be registered as well as the Connectivity Manager itself. There is no way to get the Connectivity Manager except though Java. Either being passed down to C directly or by passing in an Android Context which can be used to get the Connectivity Manager. Examples are provided in the documentation. + Fix By: Stephen Bryant (@bf-bryants) -- [Konstantinos Sofokleous brought this change] +- [tjwalton brought this change] - allow linking against the static msvc runtime library (#133) + ares_gethostbyname: Return ENODATA if no valid A or AAAA record found (#304) - allow linking against the static msvc runtime library + ares_gethostbyname() was returning ESUCCESS when no A or AAAA record was found but a CNAME pointing nowhere was present. ENODATA should be returned instead, however the hosts pointer will still be present to provide the alias list. + + * Return ENODATA if no valid A or AAAA record found + * Fix and update test ParseAReplyNoData. + * Add test for new ENODATA behaviour in ares_gethostbyname. + + Fixes Bug #303 + Fix By: @tjwalton -- [Gergely Nagy brought this change] +- [Michal Rostecki brought this change] - Force using the ANSI versions of WinAPI functions (#142) + test: Separate live tests from SetServers* tests (#299) - When compiling c-ares with a build system that defines UNICODE, - bad versions of WinAPI functions are used causing failures or even - crashes. When windows.h is included in MBCS mode (like in the default - build system), the ..A versions are the same as using the one without - any suffix. - -- [cmake] build fix on Solaris + Before this change, SetServers, SetServersPorts and SetServersCSV + contained test cases trying to make DNS queries with the google.com + hostname, which requires Internet connectivity. Tests with that + requirement should be defined in the ares-test-live.cc file and contain + "Live" prefix to filter them out with `--gtest_filter=-*.Live*` on + machines without Internet connectivity. + + Fix By: Michal Rostecki (@mrostecki) -GitHub (11 Sep 2017) -- [Brad House brought this change] +- [Adam Majer brought this change] - Win32 exclude legacy ipv6 subnets (#144) + Only count valid addresses when response parsing (#302) - win32 ipv6: add infrastructure to exclude ipv6 subnets that are known to cause issues + When ares_parse_a_reply or ares_parse_aaaa_reply is called in case + where another AAAA and A responses exist, the resulting ares_addrttl + count is invalid and the structure points to gibberish. + + This is a regression since 1.15. + + Issue: https://github.com/c-ares/c-ares/issues/300 + Fix By: Adam Majer (@AdamMajer) -- [David Drysdale brought this change] +Brad House (24 Dec 2019) +- [Kyle Edwards brought this change] - windows: only look for ancient compilers (#146) + CMake: Provide c-ares version in package export file (#296) - Also drop the use of a versioned output directory; just use - .\msvc + The CMake package export file should provide version information. + + Fix By: Kyle Edwards (@KyleFromKitware) -- [David Drysdale brought this change] +- [Ben Noordhuis brought this change] - ares_init_options.3: match up sock_state_cb args (#141) + Accept invalid /etc/resolv.conf lookup values, ability to build container tests (#274) - Fixes #140 + * Add CARES_BUILD_CONTAINER_TESTS CMake option to add ability to build the Linux-only containerized tests. + * Accept invalid /etc/resolv.conf lookup values + + Before this commit invalid `lookup` values resulted in c-ares not using + any lookups without any clear indication why. After this commit it uses + the default "fb". + + Fix By: Ben Noordhuis (@bnoordhuis) -Daniel Stenberg (25 Aug 2017) -- [Anna Henningsen brought this change] +- [Christian Ammer brought this change] - gethostbyaddr: fail with `ECANCELLED` for `ares_cancel()` + Parallel A and AAAA lookups in `ares_getaddrinfo` (#290) - When `ares_cancel()` was invoked, `ares_gethostbyaddr()` - queries would fail with `ENOTFOUND` instead of `ECANCELLED`. + A and AAAA lookups for ares_getaddrinfo() are now performed in parallel. - It seems appropriate to treat `ares_cancel()` like `ares_destroy()`, - but I would appreciate review of the correctness of this change. + For this change `ares_search` was removed from `ares_getaddrinfo`. + Instead `ares_query` in combination with `next_dns_lookup` are + doing the suffix search. - Ref: https://github.com/nodejs/node/issues/14814 + Adding support for `.onion` addresses which are tested by + `TEST_F(DefaultChannelTest, GetAddrinfoOnionDomain)` - Closes #138 - -David Drysdale (18 Aug 2017) -- [David Hotham brought this change] + Fix By: Christian Ammer (@ChristianAmmer) - support most recent Visual Studio 2017 +- [Vy Nguyen brought this change] -Brad House (26 Jul 2017) -- Preserve original DNS server order on Windows for equal metrics. + Move variables into the block where it is used to avoid unused-vars (#281) - qsort is not stable, in order to make it stable we need to record - the original index and add it as a secondary sort value when the - metrics are equal to prevent using DNS servers that may not work - at all as reported by some users. + Warning uncovered with [-Werror, -Wunused-variables] + + Fix By: Vy Nguyen (@oontvoo) -David Drysdale (15 Jul 2017) -- [Anna Henningsen brought this change] +- [Vy Nguyen brought this change] - ares_parse_naptr_reply: make buffer length check more accurate + Rename local macros to avoid conflicting with system ones and remove unsed variables. (Otherwise code will break once compiled with [-Werror,-Wmacro-redefined,-Wunused-variable] ) (#280) - 9478908a490a6bf009ba58d81de8c1d06d50a117 introduced a length check - for records parsed by `ares_parse_naptr_reply()`. However, that - function is designed to parse replies which also contain non-NAPTR - records; for A records, the `rr_len > 7` check will fail as there - are only 4 bytes of payload. - In particular, parsing ANY replies for NAPTR records was broken - by that patch. + Fix new getaddrinfo code to not redefine macros on some systems. - Fix that by moving the check into the case in which it is already - known that the record is a NAPTR record. - -- appveyor: run dnsdump as a sanity check - -- travis: run dnsdump as a sanity check + Fix By: Vy Nguyen (@oontvoo) -- test: use ares_free_string() throughout - - As pointed out by Gisle Vanem in #125. +- [Egor Pugin brought this change] -Daniel Stenberg (3 Jul 2017) -- RELEASE-PROCEDURE.md: how to release + [ares_getenv] Return NULL in all cases. (#279) - Fixes #115 - Closes #116 - -David Drysdale (2 Jul 2017) -- test: Build dnsdump on Windows too + if ares_getenv is defined, it must return a value on all platforms. - Thanks to Gisle Vanem for showing the way: - https://github.com/c-ares/c-ares/commit/b701af8a24cf9d173b1dbe5faedcea34642e92da#commitcomment-22830845 - -Brad House (26 Jun 2017) -- [Christian Ammer brought this change] + Fix By: Egor Pugin (@egorpugin) - fix statement like #define - ares ssize_t define had a trailing semicolon (#120) +- [Abhishek Arya brought this change] -David Drysdale (21 Jun 2017) -- test: distribute the fuzzcheck.sh script + Add OSS-Fuzz fuzzing badge (#278) - The TESTS target runs fuzzcheck.sh so make sure it is included - in the distributed tarball. + Adds based on instructions at + https://google.github.io/oss-fuzz/getting-started/new-project-guide/#status-badge - (The test itself will be pointless when run on a distribution, because - the fuzzing corpus directories are not shipped, but at least this - means that `make -C test test` should work.) + Patch By: Abhishek Arya (@inferno-chromium) -- test: run the name-parsing corpus check too +- [Peter Eisentraut brought this change] -Daniel Stenberg (21 Jun 2017) -- dist: don't build/ship PDF versions in release archives + ares_init_options.3: Fix layout (#275) - ... experience says very few read them and they can still get build by - those who want them.a - -- ares_version.h: bump version - -Version 1.13.0 (20 Jun 2017) - -Daniel Stenberg (20 Jun 2017) -- RELEASE-NOTES: 1.13.0 - -- ares_set_socket_functions.3: added in 1.13.0 - -David Drysdale (18 Jun 2017) -- ares_parse_naptr_reply: check sufficient data + 7e6af8e inserted the documentation of resolvconf_path in the middle of + the item for ednspsz, leading to broken layout. Fix that. - Check that there is enough data for the required elements - of an NAPTR record (2 int16, 3 bytes for string lengths) - before processing a record. - -- test: Feed in short NAPTR + Fix By: Peter Eisentraut (@petere) -- test: Add fuzz input with short NAPTR +- [Gregor Jasny brought this change] -- test: add ares_parse_naptr_reply to fuzzer + manpages: Fix typos detected by lintian (#269) + + + Fix By: Gregor Jasny (@gjasny) -- [noiz brought this change] +- [lifenjoiner brought this change] - Update ares.h to support compiling with QNX + keep command line usage up to date (#256) + + adig and ahost built-in help did not match args taken. + + Fix-By: @lifenjoiner -- [Dionna Glaze brought this change] +- [Dan Noé brought this change] - Simple changes to appease stricter compilers. + ares-test.cc: Handle nullptr in AddrInfo ostream. (#268) - ares_process.c uses htonl, which needs included. - ares_getnameinfo.c uses a dynamically selected format string for - sprintf, which -Wformat-literal doesn't like. Usually one would use - inttypes.h and a format string "%" PRIu32, but C99 is too new for some - supported platforms. + The const AddrInfo& argument to operator<< overload for AddrInfo can be + a nullptr unique_ptr. Handle this explicitly by printing {nullptr} if + the rest of the function cannot be safely executed. + + Fix-by: Dan Noé -GitHub (16 Jun 2017) -- [Gregor Jasny brought this change] +- [Dan Noé brought this change] - CMake: Emulate interface library on import (#108) + Add missing limits.h include from ares_getaddrinfo.c (#267) - Closes: #104 - Signed-off-by: Gregor Jasny + This files references INT_MAX, but does not include limits.h. This can + cause a build failure on some platforms. Include limits.h if we have it. + + Fix-by: Dan Noé -Brad House (6 Jun 2017) -- [ChristianAmmer brought this change] +- [Andrew Selivanov brought this change] - Added support for Windows DNS Suffix Search List (#93) + fix fuzzer docs and add missing getaddrinfo docs (#265) - This change solves issue #53. + There is a fix for a bit outdated clang fuzzer docs and ares_getaddrinfo docs. - Support for suffix search lists was already built in for Linux. The search list could be set via set_search. With this change the suffix search list from Windows is read from the registry and then set into the ares configuration via set_search. There are two sources for the search list: + Fix By: Andrew Selivanov (@ki11roy) + +- [Andrew Selivanov brought this change] + + Fix leak and crash in ares_parse_a/aaaa_reply (#264) - The global DNS suffix search list. - The primary and connection specific DNS suffixes if the global is not available. + * fix leak if naddress of particular type found + * fix segfault when wanted ttls count lesser than count of result records + * add fuzzer input files that trigger problems (from #263) - Contributed by @ChristianAmmer + Reported-By: David Drysdale (@daviddrysdale) + Fix-By: Andrew Selivanov (@ki11roy) -Daniel Stenberg (25 May 2017) -- [Thomas Köckerbauer brought this change] +- [Andrew Selivanov brought this change] - configure: do not heck for ar if specified manually + fix segfault when parsing wrong type of record (#262) - Closes #62 + Fixes segfault when trying to ares_parse_aaaa with AF_INET and vise versa. + + Fix By: Andrew Selivanov (@ki11roy) -David Drysdale (23 May 2017) -- ares_expand_name: limit number of indirections +- work around mingw compile failure -- test: fuzz input file that takes a while to process +- c++ requires explicit casts -- test: copy data in fuzz regression driver - - Oops. +- support EnvValue on Windows by implementing setenv/unsetenv -GitHub (23 May 2017) -- [David Drysdale brought this change] +- [Andrew Selivanov brought this change] - Convert char from ISO-8859-1 to UTF-8 (#99) + getaddrinfo enhancements (#257) - Fixes #97 - -- [Gregor Jasny brought this change] - - travis: Use trusty for cmake builds (#109) + * Service support has been added to getaddrinfo. + * ares_parse_a/aaaa_record now share code with the addrinfo parser. + * Private ares_addrinfo structure with useful extensions such as ttls (including cname ttls), + as well as the ability to list multiple cnames in chain of lookups - kubuntu-backports dropped the CMake package for Precise + Work By: Andrew Selivanov @ki11roy -David Drysdale (2 May 2017) -- [David Hotham brought this change] +- [Andrew Selivanov brought this change] - msvc_ver.inc support most recent Visual Studio 2017 (#101) + fix ares__sortaddrinfo, use wrappers for sock_funcs (#258) + + Some socket functions weren't exposed for use by other areas of the library. Expose + those and make use of them in ares__sortaddrinfo(). + + Fix By: Andrew Selivanov (@ki11roy) -- test: use io.h not unistd.h for Windows +- Fix c89 compilation support broken by .onion rejection changes + + Move .onion check lower after all variables have been declared. + + Bug: #246 -- test: try building fuzz binaries on Windows +- [kedixa brought this change] -- test: stick to int in ares-fuzz.c + getaddrinfo: callback must be called on bad domain (#249) - Using int rather than ares_ssize_t means this file - needs no c-ares dependency - it's a general driver for - any libFuzzer-style entrypoint. - -- test: force ARES_OPT_NOROTATE for no-rotate tests + Due to an order of incrementing the remaining queries and calling ares_query, on a bad domain + the registered callback wouldn't be called. + + Bug: #248 + Fixed-By: @kedixa -- test: check expected NOROTATE value +- [Darrin W. Cullop brought this change] -- ares_create_query: use ares_free not naked free + Windows ARM/ARM64 requires AdvApi32 (#252) - Accidentally added in commit 65c71be1cbe5 - ("ares_create_query: avoid single-byte buffer overwrite") - -Brad House (17 Mar 2017) -- Need ares.h for ares_ssize_t + Fix link issues caused by missing library that appears to only be required on ARM (though + docs don't list this restriction). Doesn't hurt to require it everywhere. + + Bug: #251 + Fixed-By: Darrin Cullop (@dwcullop) -- tests should not use ssize_t, use ares_ssize_t +- [kedixa brought this change] -GitHub (16 Mar 2017) -- [Brad House brought this change] + getaddrinfo: avoid infinite loop in case of NXDOMAIN(#240) (#242) + + There are two possible causes for infinite loops fo NXDOMAIN, based on how many dots are in the domain name (one for < ARES_OPT_NDOTS and one for >= ARES_OPT_NDOTS), where it will repeat the same query over and over as the hquery->next_domain doesn't increment. + + Fix By: @kedixa - Portability updates for legacy systems. (#92) +- Portability fix for ares__sortaddrinfo() - Socklen_t should not be used in code, instead ares_socklen_t should be used. - Convert ssize_t to ares_ssize_t for portability since the public API now exposes this. + replace uint32_t with unsigned int and socklen_t with ares_socklen_t + + By: Brad House -David Drysdale (14 Mar 2017) -- [Michael Osei brought this change] +- [Khaidi Chu brought this change] - Update msvc_ver.inc (#91) + fix: init bufp before reject .onion to make it can be free correctly (#241) - For Visual Studio 2017 builds + When querying a .onion domain, it returns directly without setting bufp to NULL. A subsequent free() that occurs can cause a segmentation fault. + + Fix By: Khaidi Chu (@XadillaX) -Daniel Stenberg (13 Mar 2017) -- [Brad House brought this change] +- [Andrew Selivanov brought this change] - Windows DNS server sorting (#81) + Add ares__sortaddrinfo() to support getaddrinfo() sorted results (#239) - Original Patch From Brad Spencer: - https://c-ares.haxx.se/mail/c-ares-archive-2016-04/0000.shtml - - My modifications include: - * Dynamically find GetBestRoute2 since it is a Windows Vista+ symbol, and will fall back to prior behavior when not available. - * Prefer get_DNS_AdaptersAddresses as the modifications should alleviate the concerns which caused us to prefer get_DNS_NetworkParams - * Update AppVeyor to use MinGW-w64 instead of the legacy MinGW - * Fix compile error in test suite for Windows. - - Original message from patch below: - - From: Brad Spencer - Date: Fri, 29 Apr 2016 14:26:23 -0300 - - On Windows, the c-ares DNS resolver tries first to get a full list of - DNS server addresses by enumerating the system's IPv4/v6 interfaces and - then getting the per-interface DNS server lists from those interfaces - and joining them together. The OS, at least in the way the c-ares - prefers to query them (which also may be the only or best way in some - environments), does not provide a unified list of DNS servers ordered - according to "current network conditions". Currently, c-ares will then - try to use them in whatever order the nested enumeration produces, which - may result in DNS requests being sent to servers on one interface - (hosting the current default route, for example) that are only intended - to be used via another interface (intended to be used when the first - interface is not available, for example). This, in turn, can lead to - spurious failures and timeouts simply because of the server address - order that resulted because of the enumeration process. + This is a port of RFC 6724 compliant sorting function from Android Bionic project: + https://android.googlesource.com/platform/bionic/+/e919b116d35aa7deb24ddece69c491e24c3b0d6f/libc/netbsd/net/getaddrinfo.c - This patch makes the (safe?) assumption that there is no other better - rule to chose which interface's DNS server list should be prioritized. - After all, a DNS lookup isn't something "per network"; applications - don't look up "these DNS names on this interface and those DNS names on - that interface". There is a single resource pool of DNS servers and the - application should presume that any server will give it the "right" - answer. However, even if all DNS servers are assumed to give equally - useful responses, it is reasonable to expect that some DNS servers will - not accept requests on all interfaces. This patch avoids the problem by - sorting the DNS server addresses using the Windows IPv4/v6 routing tables. + The latest version is essentially the same, except two additional parameters to test connection with (mark/uid): + https://android.googlesource.com/platform/bionic/+/master/libc/dns/net/getaddrinfo.c - For example, a request to DNS server C on interface 2 that is actually - sent over interface 1 (which may happen to have the default route) may - be rejected by or not delivered to DNS server C. So, better to use DNS - servers A and B associated with interface 1, at least as a first try. + Please note that even that version has some restrictions. It doesn't support some rules from RFC 6724: - By using the metric of the route to the DNS server itself as a proxy for - priority of the DNS server in the list, this patch is able to adapt - dynamically to changes in the interface list, the DNS server lists per - interface, which interfaces are active, the routing table, and so on, - while always picking a good "best" DNS server first. + Rule 3 (Avoid deprecated addresses) + Rule 4 (Prefer home addresses) + Rule 7 (Prefer native transport) - In cases where any DNS server on any interface will do, this patch still - seems useful because it will prioritize a lower-metric route's (and thus - interface's) servers. + Submitted By: Andrew Selivanov (@ki11roy) -David Drysdale (22 Feb 2017) -- [Sergii Pylypenko brought this change] +- [Christian Ammer brought this change] - docs: fixed references to ares_set_local_ip4 and ares_set_local_ip6 + Increase portability of `ares-test-mock-ai.cc` (#235) + + * using portable ares_inet_pton and updated includes in ares-test-mock-ai + * forgot to remove deleted ares-test-ai.cc in Makefile.inc + + Fix By: Christian Ammer (@ChristianAmmer) -- [Calle Wilund brought this change] +- [Fabrice Fontaine brought this change] - ares test: fix win32 build errors with virtual socket function tests + m4/xc-cc-check.m4: use XC_CHECK_BUILD_FLAGS (#236) - The added api requires both some typedefs not previously imported - into the test build + the test code did not fully deal with - socket differences on windows. + Use XC_CHECK_BUILD_FLAGS instead of XC_CHECK_USER_FLAGS. + Otherwise it complains of CPPFLAGS in CFLAGS. + [Retrieved from: + https://git.buildroot.net/buildroot/tree/package/c-ares/0001-use_check_build_instead_of_check_user.patch] + + Signed-off-by: Gustavo Zacarias + Signed-off-by: Fabrice Fontaine + Submitted by: Fabrice Fontaine -- [Calle Wilund brought this change] +- [Christian Ammer brought this change] - ares_process: fix return type of socket_create function (win32 warning) + Bugfix for `ares_getaddrinfo` and additional unit tests (#234) + + This PullRequest fixes a bug in the function add_to_addrinfo which task is to add new addrinfo items to the ai_next linked list. Also additional unit tests for testing ares_getaddrinfo will be added: + + Additional mock server test classes (ares-test-mock-ai.cc): + MockTCPChannelTestAI + MockExtraOptsTestAI + MockNoCheckRespChannelTestAI + MockEDNSChannelTestAI + RotateMultiMockTestAI + NoRotateMultiMockTestAI + + Additional live tests (ares-test-live-ai.cc): + LiveGetHostByNameV4 + LiveGetHostByNameV6 + LiveGetHostByNameV4AndV6 + + Fix By: Christian Ammer (@ChristianAmmer) -Daniel Stenberg (31 Jan 2017) -- [Calle Wilund brought this change] +- [Christian Ammer brought this change] - ares_set_socket_functions: Add man page + Remaining queries counter fix, additional unit tests for `ares_getaddrinfo` (#233) - Providing some rudimentary documentation for the added functionality + Remaining queries counter fix, added tests (ParallelLookups, + SearchDomains, SearchDomainsServFailOnAAAA). Removed unnecessary + if and commented code in test. - Closes #72 + Fix By: Christian Ammer (@ChristianAmmer) -- [Calle Wilund brought this change] +- [Christian Ammer brought this change] - ares-test: Add test helpers and cases for virtual socket IO + Add initial implementation for ares_getaddrinfo (#112) - * Added test case macro to automatically run tests twice, once "normal", - once with virtual IO. - * Changed most "live" query tests to run in dual mode to verify - at least simple socket IO via virtual functions - * Added test case for settings/duping socket functions & callback data + Initial implementation for ares_getaddrinfo(). It is NOT compliant with RFC6724, though + it is expected to come closer to conformance prior to the next release. + + Features not supported include sorted addresses and honoring of service and hints + parameters. + + Implementation by: Christian Ammer (@ChristianAmmer) -- [elcallio brought this change] +- [Ben Noordhuis brought this change] - Implement using virtual socket IO functions when set + test: fix bad expectation in ipv6 localhost test (#227) - Uses virtual socket IO functions when set on a channel. - Note that no socket options are set, nor is any binding - done by the library in this case, since the client defining - these is probably more suited to deal with this. + The LiveGetLocalhostByAddrV6 test expected to see "localhost" in the + result when doing an address-to-name lookup for ::1 but on my system + that resolves to "ip6-loopback" because of this stanza in /etc/hosts: + + $ grep ^::1 /etc/hosts + ::1 ip6-localhost ip6-loopback + + Fix By: Ben Noordhuis (@bnoordhuis) + Bug: #85 -- [elcallio brought this change] +- [Ben Noordhuis brought this change] - Add virtual function set for socket IO + ares_version.h: bump version (#230) - Defines a structure of basic create, close, read/write - functions as virtual function calls, settable for individual - c-ares channels. + Version change not committed from maketgz.sh + + Bug: #229 -David Drysdale (30 Jan 2017) -- test: ignore aresfuzzname binary +Daniel Stenberg (24 Oct 2018) +- ares_library_init_android.3: minor syntax edits, fixed AVAILABILITY -Gregor Jasny (14 Jan 2017) -- [Stephen Sorley brought this change] +Version 1.15.0 (23 Oct 2018) - Always use check_symbol_exists instead of check_function_exists. +Brad House (23 Oct 2018) +- last minute 1.15.0 addition -- Also add includes to TARGETS_INST_DEST +- [Ben Noordhuis brought this change] -- [Stephen Sorley brought this change] + Report ARES_ENOTFOUND for .onion domain names as per RFC7686. (#228) + + Quoting RFC 7686: + + Name Resolution APIs and Libraries (...) MUST either respond + to requests for .onion names by resolving them according to + [tor-rendezvous] or by responding with NXDOMAIN. + + A legacy client may inadvertently attempt to resolve a .onion + name through the DNS. This causes a disclosure that the client + is attempting to use Tor to reach a specific service. Malicious + resolvers could be engineered to capture and record such leaks, + which might have very adverse consequences for the well-being + of the user. + + Bug: #196 + Fix By: Ben Noordhuis @bnoordhuis - Windows build fixes +- prepare for c-ares 1.15.0 release -- CMake: Export targets +- AIX Build Fix + + AIX attempts to include both nameser_compat.h and onameser_compat.h. It appears + the proper fix is to define _USE_IRS so that only nameser_compat.h is used. + + Bug: #224 + Fix By: Brad House (@bradh352) -- CMake: Use GNUInstallDirs for install location defaults +- Fix crash in ares_dup() due to new ARES_OPT_RESOLVCONF + + ares_dup() calls ares_init_options() by making its own fake option + mask since the original mask isn't stored but ARES_OPT_RESOLVCONF + was always set, instead of conditionally set. This caused a crash + because ares_strdup() isn't NULL-safe if no custom path was set. + + Made ares_dup() set ARES_OPT_RESOLVCONF conditionally. + + Fix By: Brad House (@bradh352) -David Drysdale (11 Jan 2017) -- Update Makefile.am for renamed INSTALL.md +- [Sarat Addepalli brought this change] -GitHub (11 Jan 2017) -- [David Drysdale brought this change] + Add ares_init_options() configurability for path to resolv.conf file + + Add resolvconf_path to end of struct ares_options with ARES_OPT_RESOLVCONF option + so on Unix-like systems a custom path can be specified. If no path is specified, + /etc/resolv.conf is used like normal. + + Fix By: Sarat Addepalli @SirR4T + Fixes Bug: #220 + Review By: Brad House @bradh352 - docs: convert INSTALL to MarkDown & tweak (#83) +- remove stale variables -- [Gregor Jasny brought this change] +- fix prototype name for ares_strsplit_free() - Merge pull request #77 from stephen-sorley/cmake_modernize - - Updated CMake minimum version to 2.8.12. +- add missing prototype -Stephen Sorley (4 Jan 2017) -- Changed executables to depend directly on internal libcares target, instead of against - the external-facing alias targets. +- simplify ares_strsplit() and create ares_strsplit_free() helper function -- Updated Travis to pull CMake 2.8.12 from kubuntu-backports ppa. +- missing ares_strsplit.h from HHEADERS for inclusion in distribution -- Updated CMake minimum version to 2.8.12. +- [Ruslan Baratov brought this change] + + Add CARES_BUILD_TOOLS CMake option (#214) - Changed the way usage requirements (include dirs, compile defs, dependent libraries) are specified, to match the recommended standard practice for modern CMake. This involves using target-specific functions (target_include_directories, target_compile_definitions, etc.), along with the PUBLIC, PRIVATE or INTERFACE modifiers. + Add ability to exclude building of tools (adig, ahost, acountry) in CMake. This should also close #200. - Updated chain-building support to imitate new-style Find modules (import libs), instead of old-style Find modules (cache variables). + Fix By: Ruslan Baratov (@ruslo) + Bug: #200 -David Drysdale (26 Dec 2016) -- [Chris Araman brought this change] +- [flyingdutchman23 brought this change] - configure: clock_gettime workaround (#75) + Style. Whitespace cleanup. (#213) - Commits 7518c26, c41726b, and bc14ee7 brought this workaround to the CMake build system. This expands it to the autoconf build system. + Small whitespace cleanups. - Fixes #71 + Fix By: @flyingdutchman23 -- test: add fuzz entrypoint for ares_create_query() +- [John Schember brought this change] -- test: Add gTest/gMock files to SOURCES + Android: Support for domain search suffix (#211) - Built tarballs are not including all of the files needed - to build the test suite because they are missing from the - _SOURCES variable in Makefile.am. - -- travis: Move build scripts under travis/ + Fixes issue #207. Uses LinkProperties.getDomains() to get a list of search domains and adds them to the suffix list. This also adds a new helper function to split strings into an array based on multiple delimiters replacing multiple other functions for dealing with string splitting. - Travis doesn't always propagate errors in inline multi-line - scripts, so move them all to be explicit shell scripts, each - with set -e. + Submitter: John Schember (@user-none) + Fixes: #207 + Approved-by: Brad House (@bradh352) -- travis: check distributed tarball builds +- [afalin brought this change] -Daniel Stenberg (25 Oct 2016) -- dist: ship msvc_ver.inc too + Improve DNS suffixes extracting from WinNT registry (#202) - Reported-by: Bruce Stephens + Join all global and connection specific suffix lists. Use 'HKLM\Software\Policies\Microsoft\Windows NT\DNSClient\SearchList', 'HKLM\System\CurrentControlSet\Services\Tcpip\Parameters\Domain' as global suffix lists. - Fixes #69 + Fix By: @afalin -- [Aaron Bieber brought this change] +- Be consistent with indention in CMakeLists.txt + + The imported TRANSFORM_MAKEFILE_INC function from curl used space indention + but the rest of the file used tabs. Go ahead and make it tabs for + consistency as well. + + Committed By: Brad House - fix build on OpenBSD +- [flyingdutchman23 brought this change] -- ares_version.h: bump, working on 1.12.1 now + Fix modern gcc warning: argument to 'sizeof' in 'strncpy' call is the same expression as the source + + Silence warning about using src to determine number of bytes to copy. + In this case it doesn't matter whether it is `src` or `dest`. So there + is no functionality change. + + Bug: #210 + Fix By: @flyingdutchman23 -GitHub (18 Oct 2016) -- [Gregor Jasny brought this change] +- [Andi Schnebinger brought this change] - Merge pull request #64 from bradh352/master + fix stringop-overflow warning of GCC (#201) - Add CMake build system support to C-Ares. + When using a modern GCC to compile c-ares, there is a stringop-overflow warning. + This patch simply silences the false-positive warning, there is no actual code flaw. + + Bug: https://github.com/c-ares/c-ares/pull/201 + Fixed By: Andi Schnebinger @Iniesta8 -Brad House (5 Oct 2016) -- suggested PROJECT_NAME change broke chain building as it needs the magic PROJECT_NAME set in the ADD_LIBRARY for matching. Fix to make both goals work +GitHub (18 May 2018) +- [David Drysdale brought this change] -- update MacOSX 10.12 detection + travis: do coverage in "coverage" build (#195) + + Fixes #194, a mistake from commit a255081f2c3c ("travis: Only do + coverage/distcheck on normal build") -- Expand XCode clock_gettime fix to include MacOS 10.12, not just iOS10 +Brad House (17 May 2018) +- [Brad Spencer brought this change] -David Drysdale (4 Oct 2016) -- Revert "travis: work around bug in PyCParser" + Apply the IPv6 server blacklist to all nameserver sources, not just Windows (#193) - This reverts commit a24a10a348fc00b8cfd684d91894a1df14880ea9. + For #164, I mentioned that it seemed like the IPv6 nameserver blacklist should apply to all OSes. In a mailing list post, @bradh352 agreed and suggested that I file a PR to make it so. + + This moves the blacklist check from being Windows-specific to being a general feature of config_nameservers(), no matter the nameserver source. It also simplifies the ares_ipv6_server_blacklisted() implementation to not parse and re-parse the blacklisted IPv6 addresses from strings on every check. I think they're almost as easy to read as a sequence of hex bytes in an array initializer, and it's definitely less work on each trip through the code. + + Fix By: Brad Spencer @b-spencer + PR: https://github.com/c-ares/c-ares/pull/193 -- travis: work around bug in PyCParser +- [Brad Spencer brought this change] + + Fix warnings emitted by MSVC when using -W4 (#192) - See https://github.com/pyca/cryptography/issues/3187 + These changes fix a few warnings emitted by recent versions of MSVC when compiling with -W4. Half of the changes are in Windows-specific code, and the other half should be safe no matter the compiler or OS. + + The allocation function change is probably the only one that needs explanation. MSVC gives warnings about the function pointers not being stable across DLL boundaries or something to that effect, so for Windows, I've made them be called indirectly, which at least made the compiler happy. I can't say I've tested every linking combination on Windows with them before or after the change, but it seems harmless. + + Fix By: Brad Spencer @b-spencer + PR: https://github.com/c-ares/c-ares/pull/192 -Brad House (3 Oct 2016) -- PROJECT_SOURCE_DIR instead of CMAKE_CURRENT_SOURCE_DIR as per @gjasny +- [David Hotham brought this change] -- use a project name of c-ares as per @gjasny + Prevent changing name servers while queries are outstanding (#191) + + Changing name servers doesn't work, per #41. Better to return an error code than to crash. + + Fix-by: David Hotham @dimbleby -- Import curl conversion of Makefile.inc to cmake form dynamically as per bdoetsch@ameritech.net to make maintaining multiple build systems easier +David Drysdale (15 May 2018) +- [Tobias Nießen brought this change] -Daniel Stenberg (30 Sep 2016) -- dist: add ares_library_initialized.* to the tarball + Fix comment in ares_rules.h (#189) -David Drysdale (30 Sep 2016) -- test: check ares_create_query with too-long name +Brad House (6 May 2018) +- [Brad Spencer brought this change] -Daniel Stenberg (30 Sep 2016) -- man pages: minor formatting edits + Harden and rationalize c-ares timeout computation (#187) + + * Harden and rationalize c-ares timeout computation + * Remove the rand() part of the timeout calculation completely. + + When c-ares sends a DNS query, it computes the timeout for that request as follows: + + timeplus = channel->timeout << (query->try_count / channel->nservers); + timeplus = (timeplus * (9 + (rand () & 7))) / 16; + I see two issues with this code. Firstly, when either try_count or channel->timeout are large enough, this can end up as an illegal shift. + + Secondly, the algorithm for adding the random timeout (added in 2009) is surprising. The original commit that introduced this algorithm says it was done to avoid a "packet storm". But, the algorithm appears to only reduce the timeout by an amount proportional to the scaled timeout's magnitude. It isn't clear to me that, for example, cutting a 30 second timeout almost in half to roughly 17 seconds is appropriate. Even with the default timeout of 5000 ms, this algorithm computes values between 2812 ms and 5000 ms, which is enough to cause a slightly latent DNS response to get spuriously dropped. + + If preventing the timers from all expiring at the same time really is desirable, then it seems better to extend the timeout by a small factor so that the application gets at least the timeout it asked for, and maybe a little more. In my experience, this is common practice for timeouts: applications expect that a timeout will happen at or after the designated time (but not before), allowing for delay in detecting and reporting the timeout. Furthermore, it seems like the timeout shouldn't be extended by very much (we don't want a 30 second timeout changing into a 45 second timeout, either). + + Consider also the documentation of channel->timeout in ares_init_options(): + + The number of milliseconds each name server is given to respond to a query on the first try. (After the first try, the timeout algorithm becomes more complicated, but scales linearly with the value of timeout.) The default is five seconds. + + In the current implementation, even the first try does not use the value that the user supplies; it will use anywhere between 56% and 100% of that value. + + The attached patch attempts to address all of these concerns without trying to make the algorithm much more sophisticated. After performing a safe shift, this patch simply adds a small random timeout to the computed value of between 0 ms and 511 ms. I could see limiting the random amount to be no greater than a proportion of the configured magnitude, but I can't see scaling the random with the overall computed timeout. As far as I understand, the goal is just to schedule retries "not at the same exact time", so a small difference seems sufficient. + + UPDATE: randomization removed. + + Closes PR #187 + Fix by: Brad Spencer -Brad House (29 Sep 2016) -- merge fc7917e from @daviddrysdale ... travis build updates for cmake +- distribute ares_android.h + + Distribute ares_android.h when a release distribution package is + created. + + Reported By: Andrey Khranovsky + Bug: https://c-ares.haxx.se/mail/c-ares-archive-2018-04/0000.shtml -- cleanups as per @gjasny ... Use naked IF statements and use NOT DEFINED +- ares_set_servers_csv() on failure should not leave channel in a bad state + + If bad data is passed to ares_set_servers_csv() or + ares_set_servers_ports_csv() it will clear the existing channel + configured DNS servers, then a call to ares_send() will fail due + to a bad malloc which may have undefined behavior. + + The fix now only clears existing servers on success. An additional + sanity check was added in ares_send() to ensure nservers >= 1 or + will result in ARES_ESERVFAIL. + + Bug: https://c-ares.haxx.se/mail/c-ares-archive-2018-03/0000.shtml + Reported-by: Francisco Sedano Crippa -Version 1.12.0 (29 Sep 2016) +- docs: Not all manpages are listed + + Some docs aren't installed or not showing up on + https://c-ares.haxx.se/docs.html + due to not being listed in Makefile.inc. Add missing docs and + ensure docs are alphabetized. -Daniel Stenberg (29 Sep 2016) -- RELEASE-NOTES: 1.12.0 +Version 1.14.0 (16 Feb 2018) -- [David Drysdale brought this change] +Daniel Stenberg (16 Feb 2018) +- ares_android.c: fix warning: ISO C forbids an empty translation unit - ares-test-misc: test ares_create_query with escaped trailing dot +- RELEASE-NOTES: some more work we did and people who helped -- ares_create_query: avoid single-byte buffer overwrite +Brad House (16 Feb 2018) +- travis: skip Autotools style testing for cmake - ... when the name ends with an escaped dot. + Fix cmake test build by skipping autotools portion of test script. + +- travis: standardize CMake test off of Autotools tests - CVE-2016-5180 + Instead of running 'make test', run the tests directly like autotools + does. It provides more verbose output. + +- travis: Enable building tests for CMake - Bug: https://c-ares.haxx.se/adv_20160929.html + Travis should auto-build and run tests for cmake builds now that + PR #168 is merged. -Brad House (29 Sep 2016) -- CMake: Unify library versioning with the libtool methodology to make keeping library versions in sync easier with the autotools build system +- fix version in pkgconfig -Daniel Stenberg (29 Sep 2016) -- ares_library_initialized.3: added +- Add version update to CMakeLists in maketgz -- make: bump CARES_VERSION_INFO for release +- Release prep. Add support for pkgconfig in cmake, set versions appropriately -David Drysdale (29 Sep 2016) -- man: update ares_init_options.3 +Gregor Jasny (15 Feb 2018) +- CMake: Add tests -Daniel Stenberg (29 Sep 2016) -- ares_library_init.3: corrected the ares_library_init_mem proto +Brad House (14 Feb 2018) +- [Gregor Jasny brought this change] -Brad House (28 Sep 2016) -- XCode v8 introduced clock_gettime() for iOS v10. However, it is a weak symbol, which means when earlier iOS versions try to use clock_gettime() it results in a crash due to the missing symbol. Detect this condition and do not set HAVE_CLOCK_GETTIME_MONOTONIC. + Use cmake3 package provided by Ubuntu (#182) -- Adds cmake build system support to C-Ares. - - The patch does not modify any source files, it only adds 3 new files - (CMakelists.txt, ares_build.h.cmake, ares_config.h.cmake) which form the - build system. I've tried to go through as much of the autotools tests and - extracted what I thought was appropriate, though many of the tests aren't - as in-depth in CMake as they are for autotools ... it is unclear why some - of them exist at all, I'm guessing for legacy systems that CMake probably - doesn't support anyhow. - - Building the library, and examples (adig, ahost, acountry) plus installation - should work across a large number of tested platforms. The tests have not - yet been integrated. +- Cmake 3.1 instead of 3.2.1 should be the minimum -Daniel Stenberg (27 Sep 2016) -- README.md: remove space from link +- Update RELEASE-NOTES and RELEASE-PROCEDURE.md to prepare for next release -- README: link to the correct c-ares badge! - - Reported-by: David Hotham - - Fixes #63 +- get rid of c++ style comments -- docs: minor formatting edits +- Use trusty for all builds, precise is EOL. Update clang and cmake versions. -- ares_destroy.3: formatting polish +- Current CMakeLists.txt doesn't support 2.8.12 anymore, we need to bump the version to 3.2.1 minimum -- ares_init.3: split the init docs into two separate man pages +- Re-organize sections in INSTALL.md and add CMake section -- SECURITY: point to the vulnerabilities page now +- [Sergey Kolomenkin brought this change] -- RELEASE-NOTES: synced with daa7235b1a5 + remove compilation warnings in MSVC (#47) -- ares_create_query.3: edit language - - Tried to make the man page more readable. +- document handling of timeouts for ares_process and ares_process_fd to close PR #57 -David Drysdale (26 Sep 2016) -- test: fix gMock to work with gcc >= 6.x - - Taken from: - https://github.com/google/googletest/issues/705#issuecomment-235067917 +- As per Issue #155, since we do not require gethostname() during init, if it fails, there's no reason for init to fail as it is only used to populate the domain -Daniel Stenberg (26 Sep 2016) -- [Brad House brought this change] +GitHub (7 Feb 2018) +- [David Drysdale brought this change] - headers: remove checks for and defines of variable sizes - - ... they're not really used and by avoiding them in the ares_build.h - output we make the public header less dependent on data sizes. + Document WSAStartup requirement (#180) -David Drysdale (24 Sep 2016) -- api: add ARES_OPT_NOROTATE optmask value - - Fix up a couple of problems with configuring whether c-ares rotates - between different name servers between requests. - - Firstly, ares_save_options() returns (in *optmask) the value of - (channel->optmask & ARES_OPT_ROTATE), which doesn't necessarily - indicate whether the channel is or is not actually doing rotation. - This can be confusing/incorrect if: - - the channel was originally configured without ARES_OPT_ROTATE - (so it appears that the channel is not rotating) - - the /etc/resolv.conf file includes the 'rotate' option - (so the channel is actually performing rotation). - - Secondly, it is not possible to reliably configure a channel - to not-rotate; leaving off ARES_OPT_ROTATE is not enough, since - a 'rotate' option in /etc/resolv.conf will turn it on again. - - Therefore: - - add an ARES_OPT_NOROTATE optmask value to allow explicit - configuration of no-rotate behaviour - - in ares_save_options(), report the value of channel->rotate - as exactly one of (optmask & ARES_OPT_ROTATE) or - (optmask & ARES_OPT_NOROTATE). - - In terms of back-compatibility: - - existing apps that set ARES_OPT_ROTATE will continue to rotate, - and to have ARES_OPT_ROTATE reported back from ares_save_options() - - existing apps that don't set ARES_OPT_ROTATE will continue to - use local config/defaults to decide whether to rotate, and will - now get ARES_OPT_ROTATE or ARES_OPT_NOROTATE reported back from - ares_save_options() rather than 0. +David Drysdale (6 Feb 2018) +- [Antonio Tajuelo brought this change] -- ares_init_options: only propagate init failures from options + Added coderelease.io badge to readme.md for letting people subscribe to new versions (#174) + +- [Sheel Bedi brought this change] + + Update year in LICENSE.md to 2018 (#170) + +GitHub (4 Feb 2018) +- [David Drysdale brought this change] + + travis: use VM not container for {L,A}SAN builds (#177) - Commit 46bb820be3a8 ("ares_init_options: don't lose init failure") - changed init behaviour so that earlier errors in initialization - weren't lost. In particular, if the user passes in specific - options but they are not applied (e.g. because of an allocation - failure), that failure needs to be reported back to the user; this - also applies when duplicating a channel with ares_dup(). + As per https://github.com/travis-ci/travis-ci/issues/9033, container + based builds do not currently allow ptrace, which is used by LSAN and + ASAN. + +Brad House (3 Feb 2018) +- [acthompson-google-com brought this change] + + Android JNI code leaks local references in some cases (#175) - However, other initialization failures can be ignored and - overridden -- in particular, if init_by_resolv_conf() or - init_by_environment() fail, then falling back to default values - is OK. + * Add Google LLC to AUTHORS. - So only preserve failures from the init_by_options() stage, not - from all initialization stages. + * android: Explicitly delete all JNI local references, and cache JNI method IDs at initialization. - Fixes issue 60. + * android: Only return ARES_ENOTINITIALIZED on failures in initialization code. -- test: Force reinstall of libtool on OSX - - Travis build environment appears to have changed. +Gregor Jasny (2 Jan 2018) +- Embed fused Google Test 1.8.0 -- test: Add valgrind build variant +Brad House (21 Dec 2017) +- [John Schember brought this change] -- test: Add null pointer to gtest args - - GoogleTest assumes that there is a null pointer in argv[argc], - so make it look like that. Without this change, tests run with - command-line arguments get memory errors under valgrind/ASAN. + android: Check returns for obj and classes are not NULL. Document API levels for various Android functions and objects used. (#166) -Daniel Stenberg (21 Aug 2016) -- AUTHOR: maybe gitgub isn't really an author =) +- CARES_CHECK_TYPE should reference variable so a warning is not produced for -Werror compatibility -- AUTHORS: added contributors from the git log +- [Brad Spencer brought this change] -- LICENSE.md: add a stand-alone license file - - Just the MIT license used in the top the source files moved out to a - stand-alone file for easier reference and discovery. + Fix computation of IPv6 blacklist mask for values of netmask > 8. (#164) -- README: added "CII best practices" badge +David Drysdale (14 Dec 2017) +- travis: Only do coverage/distcheck on normal build -- SECURITY.md: suggested "security process" for the project +- travis: only do pip install on Linux -David Drysdale (17 Aug 2016) -- test: Add Clang static analysis build to Travis +- travis: only test in IPv4 mode - Run scan-build over the library source code, but skip the - tests. Needs a later Clang install in Travis + Travis' Trusty environment does not support IPv6. -- test: more info on how to run fuzz testing +- test: allow restriction to one IP address family -- test: make fuzzer driver code C not C++ +- [Roman Teterin brought this change] -- test: fuzzer mode for AFL's persistent mode - - When fuzzing with AFL, if the LLVM-based instrumentation is - used (via the afl-clang-fast wrapper), then it is possible to - have a single execution of the fuzzer program iterate multiple - times over the fuzzing entrypoint (similar to libFuzzer's normal - mode of execution) with different data. This is much (e.g. 10x) - faster. - - Add code to support this, by checking whether __AFL_LOOP is - defined at compile-time. - - Also, shift the code to effectively be C rather than C++. + Fix a typo in init_by_resolv_conf (#160) -- test: simplify deps for fuzzer entrypoint - - No need to depend on the rest of the test code (ares-test.h) for - the fuzzer entrypoint; this makes the entrypoint slightly simpler - to build with LLVM's libFuzzer. - - Also shift the code to effectively be C rather than C++ +Brad House (11 Dec 2017) +- @gvanem says MSVC -RTCc option fails, looks erroneous to me, but the additional mask is harmless -- test: disable MinGW tests - - The test binary built in the MinGW build is failing for some - reason. It works for me when I build locally, so I'm guessing - it's down to some sort of AppVeyor environment issue. - - Disable for now. +- Fix some other mingw warnings -Daniel Stenberg (16 Aug 2016) -- read_tcp_data: remove superfluous NULL check - - CID 56884 by Coverity. The pointer is already derefenced before this - point so it can't be NULL here anyway. +- Issue #143, get rid of windows build warning due to passing 'char **' to argument expecting 'const char **' -- web: http => https +- [Gregor Jasny brought this change] -GitHub (20 Jul 2016) -- [David Drysdale brought this change] + Distribute CMake files (#130) - Merge pull request #59 from fuze/master +- Android variants may not have __system_property_get - Update msvc_ver.inc for VS2015 Update 3 + Some android systems like ARM64 may not have the __system_property_get + symbol in libc (but still have it in the public headers). Detect this + condition at build time. The __system_property_get method of retrieving + name servers is deprecated as of Oreo so should strictly be a fallback + mechanism anyhow. -- [Chris Araman brought this change] +David Drysdale (9 Nov 2017) +- [David Hotham brought this change] - Update msvc_ver.inc + Wrong function name throughout man page (#154) + +- ares_data.c: iterate through substructs when freeing - support Visual Studio 2015 Update 3 + Previous code recursed into substructures, which makes it more likely + that large/heavily-nested responses could use up lots of stack. -David Drysdale (2 May 2016) -- Fix trailing comment for #endif +- test: test ares_free_data on long chain of structs -Daniel Stenberg (30 Apr 2016) -- email: use Gisle's "new" address +- [Felix Yan brought this change] -David Drysdale (18 Apr 2016) -- test: drop superfluous fuzz inputs - - Where there are multiple fuzz input files that only differ in - the first two bytes (the query ID), just keep the first such - file. + Fix a typo in inet_ntop.c (#151) -svante karlsson (15 Apr 2016) -- Update msvc_ver.inc +Daniel Stenberg (29 Sep 2017) +- ares_gethostbyname.3: fix callback status values - support Visual Studio 2015 Update 2 + - ARES_ENOTFOUND means the _name_ wasn't found + + - ARES_ENODATA can be returned when a resolve fails + + Reported-by: Jakub Hrozek + Bug: https://c-ares.haxx.se/mail/c-ares-archive-2011-06/0012.shtml -David Drysdale (31 Mar 2016) -- test: Run fuzzcheck.sh in Travis build +Brad House (28 Sep 2017) +- [John Schember brought this change] -- test: add fuzzing check script to tests + Fix DNS server lookup breaking with Android O due to Android removing access to net.dns# system properties. (#148) - Add a test script that runs the fuzzing command over the - corpus of DNS packets. This doesn't actually do any fuzzing - (it just runs them as inputs without generating any variations) - but it does ensure that the fuzzing entrypoint is still working. - -- test: allow multiple files in aresfuzz command line + As of Android 8 (Oreo) access to net.dns# has been removed (https://developer.android.com/about/versions/oreo/android-8.0-changes.html). The reasoning given is that it, "improves privacy on the platform". Currently c-ares uses this to get the list of DNS servers. - If no arguments are specified, use stdin as input. - Otherwise treat each argument as a filename and feed - its contents to the fuzz entrypoint. - -- test: Add corpus of DNS packets + Now the only way to access the DNS server list is by using the Connectivity Manager though Java. This adds the necessary JNI code to use the Connectivity Manager and pull the DNS server list. The old way using __system_property_get with net.dns# remains for compatibilty. - For fuzz testing it is useful to start from a corpus of valid - packets, so fill out the test/fuzzinput/ directory with a bunch - of inputs. + Using the Connectivity Manager requires the ACCESS_NETWORK_STATE permission to be set on the app. Existing applications most likely are not setting this and keeping the previous method as a fallback will at the very least ensure those apps don't break on older versions of Android. They will need to add this permission for Android 8 compatibility. - These packets were generated by temporarily modifying the c-ares - process_answer() function to save off any incoming response messages. - -- test: Add utility to show DNS packet from file + Included in the patch are two initalization functions which are required. The JVM must be registered as well as the Connectivity Manager itself. There is no way to get the Connectivity Manager except though Java. Either being passed down to C directly or by passing in an Android Context which can be used to get the Connectivity Manager. Examples are provided in the documentation. -- [nordsturm brought this change] +- [Konstantinos Sofokleous brought this change] - Fix nsort initialization + allow linking against the static msvc runtime library (#133) - Author: Alexander Drachevskiy - http://c-ares.haxx.se/mail/c-ares-archive-2014-07/0004.shtml - http://c-ares.haxx.se/mail/c-ares-archive-2014-07/0014.shtml + allow linking against the static msvc runtime library -- test: Check setting nsort=0 option is respected +- [Gergely Nagy brought this change] -- test: Update fuzzing function prototype + Force using the ANSI versions of WinAPI functions (#142) - libFuzzer changed expected return type from void to int - in LLVM 3.8. + When compiling c-ares with a build system that defines UNICODE, + bad versions of WinAPI functions are used causing failures or even + crashes. When windows.h is included in MBCS mode (like in the default + build system), the ..A versions are the same as using the one without + any suffix. -- Explicitly clear struct servent before use - - On a build where MSAN has been manually set up (which involves - using an MSAN-instrumented version of the standard C++ library, see - https://github.com/google/sanitizers/wiki/MemorySanitizerLibcxxHowTo) - there's a warning about use of uninitialized memory here. It - might be a false positive, but the fix is trivial so include it. +- [cmake] build fix on Solaris -- test: for AF_UNSPEC, return CNAME only for AAAA, but valid A record - - Also shuffle expected responses rsp6/rsp4 into the order they will occur. +GitHub (11 Sep 2017) +- [Brad House brought this change] -- [Chris Araman brought this change] - - msvc_ver.inc: support Visual Studio 2015 Update 1 - -- build: commonize MSVC version detection + Win32 exclude legacy ipv6 subnets (#144) - Remove the need to copy/paste version number mapping between - Makefile.msvc and test/Makefile.msvc. - -- test: Use different name in live test + win32 ipv6: add infrastructure to exclude ipv6 subnets that are known to cause issues -- test: Only pass unused args to GoogleTest +- [David Drysdale brought this change] -- ahost.c: add cast to fix C++ compile + windows: only look for ancient compilers (#146) - If ahost.c is force-compiled as C++ the missing cast from - (void *) to (char **) is problematic. + Also drop the use of a versioned output directory; just use + .\msvc -- ares_library_cleanup: reset ares_realloc too +- [David Drysdale brought this change] + + ares_init_options.3: match up sock_state_cb args (#141) - Otherwise a subsequent use of the library might use a previous - incarnation's realloc() implementation. + Fixes #140 -Daniel Stenberg (9 Mar 2016) -- [Brad House brought this change] +Daniel Stenberg (25 Aug 2017) +- [Anna Henningsen brought this change] - configure: check if tests can get built before enabled + gethostbyaddr: fail with `ECANCELLED` for `ares_cancel()` - The current approach for disabling tests is not a good solution because - it forces you to pass --disable-tests, rather than auto-detect if your - system can support the tests in the first place. Many (most?) systems - do not have C++11. This also causes issues when chain-building c-ares, - the hosting system needs to be updated to support passing this - additional flag if necessary, it doesn't seem reasonable to add this - requirement which breaks compatibility. + When `ares_cancel()` was invoked, `ares_gethostbyaddr()` + queries would fail with `ENOTFOUND` instead of `ECANCELLED`. - This change auto-detects if the system can build the tests and - automatically disable them if it cannot. If you pass --enable-tests to - configure and the system cannot build them either due to lack of system - support, or because cross-compilation is being used, it will throw an - appropriate error since the user indicated they really did want the - tests. - -David Drysdale (3 Mar 2016) -- [Viktor Szakats brought this change] + It seems appropriate to treat `ares_cancel()` like `ares_destroy()`, + but I would appreciate review of the correctness of this change. + + Ref: https://github.com/nodejs/node/issues/14814 + + Closes #138 - Makefile.m32: add support for CROSSPREFIX +David Drysdale (18 Aug 2017) +- [David Hotham brought this change] -- [Viktor Szakats brought this change] + support most recent Visual Studio 2017 - Makefile.m32: add support for extra flags +Brad House (26 Jul 2017) +- Preserve original DNS server order on Windows for equal metrics. - Allow specification of CARES_{LD,C}FLAG_EXTRAS envvars - for mingw + qsort is not stable, in order to make it stable we need to record + the original index and add it as a secondary sort value when the + metrics are equal to prevent using DNS servers that may not work + at all as reported by some users. -- test: Build with MinGW on AppVeyor +David Drysdale (15 Jul 2017) +- [Anna Henningsen brought this change] -- test: avoid in6addr_* constants + ares_parse_naptr_reply: make buffer length check more accurate - These aren't available on MinGW, so use explicit addresses instead. - -- test: add missing #includes for dns-proto.cc - -- [Gregor Jasny brought this change] - - Fix man page typos detected by Lintian - -Daniel Stenberg (19 Feb 2016) -- configure: acknowledge --disable-tests + 9478908a490a6bf009ba58d81de8c1d06d50a117 introduced a length check + for records parsed by `ares_parse_naptr_reply()`. However, that + function is designed to parse replies which also contain non-NAPTR + records; for A records, the `rr_len > 7` check will fail as there + are only 4 bytes of payload. + In particular, parsing ANY replies for NAPTR records was broken + by that patch. - Fixes #44 - -- AUTHORS: added contributors from the 1.11.0 release + Fix that by moving the check into the case in which it is already + known that the record is a NAPTR record. -- bump: start working on the next version +- appveyor: run dnsdump as a sanity check -Version 1.11.0 (19 Feb 2016) +- travis: run dnsdump as a sanity check -Daniel Stenberg (19 Feb 2016) -- RELEASE-NOTES: final edits for 1.11.0 +- test: use ares_free_string() throughout + + As pointed out by Gisle Vanem in #125. -David Drysdale (15 Feb 2016) -- ares_dup.3: remove mention of nonexistent function +Daniel Stenberg (3 Jul 2017) +- RELEASE-PROCEDURE.md: how to release - ares_dup_options() doesn't exist, so don't document it. + Fixes #115 + Closes #116 -- test: skip repeated build steps +David Drysdale (2 Jul 2017) +- test: Build dnsdump on Windows too - Top-level buildconf/configure now triggers for the - test/ subdir too, so don't need to do explicitly. + Thanks to Gisle Vanem for showing the way: + https://github.com/c-ares/c-ares/commit/b701af8a24cf9d173b1dbe5faedcea34642e92da#commitcomment-22830845 -- test: namespaces unavailable when cross-compiling +Brad House (26 Jun 2017) +- [Christian Ammer brought this change] -Daniel Stenberg (13 Feb 2016) -- configure: only run configure in test when NOT cross-compiling - - ... as the tests won't run cross-compiled anyway + fix statement like #define - ares ssize_t define had a trailing semicolon (#120) -David Drysdale (13 Feb 2016) -- test: prefer ON_CALL to EXPECT_CALL to reduce flakes +David Drysdale (21 Jun 2017) +- test: distribute the fuzzcheck.sh script - For UDP tests, there's a chance of a retry. EXPECT_CALL only - expects a single request to arrive at the server; ON_CALL allows - for a UDP retry and repeats the same answer. + The TESTS target runs fuzzcheck.sh so make sure it is included + in the distributed tarball. - Note that ON_CALL and EXPECT_CALL can't be mixed in the same - test, and that tests that have a varied sequence of responses - for the same repeated request still have to use EXPECT_CALL. + (The test itself will be pointless when run on a distribution, because + the fuzzing corpus directories are not shipped, but at least this + means that `make -C test test` should work.) -Daniel Stenberg (13 Feb 2016) -- configure: run configure in 'test' too +- test: run the name-parsing corpus check too + +Daniel Stenberg (21 Jun 2017) +- dist: don't build/ship PDF versions in release archives - Having the test dir completely stand-alone causes too many issues for - users and devs. It still needs to be built specifically. + ... experience says very few read them and they can still get build by + those who want them.a -- configure: build silently by default +- ares_version.h: bump version -- buildconf: run test/buildconf too if present +Version 1.13.0 (20 Jun 2017) -- test/configure: build silently by default +Daniel Stenberg (20 Jun 2017) +- RELEASE-NOTES: 1.13.0 -- [Gregor Jasny brought this change] +- ares_set_socket_functions.3: added in 1.13.0 - dist: Distribute README.md +David Drysdale (18 Jun 2017) +- ares_parse_naptr_reply: check sufficient data - Closes #42 + Check that there is enough data for the required elements + of an NAPTR record (2 int16, 3 bytes for string lengths) + before processing a record. -Version 1.11.0 (11 Feb 2016) +- test: Feed in short NAPTR -Daniel Stenberg (11 Feb 2016) -- Makefile.am: distribute the test dir too +- test: Add fuzz input with short NAPTR -- RELEASE-NOTES: synced with 385582bd14b68a +- test: add ares_parse_naptr_reply to fuzzer -- [Nicolas \"Pixel\" Noble brought this change] +- [noiz brought this change] - ares_win32_init: make LoadLibrary work when using UNICODE too - - Closes #17 + Update ares.h to support compiling with QNX -David Drysdale (11 Feb 2016) -- Use "resolve" as synonym of "dns" in nsswitch.conf - - Modern Linux systems may have libnss_resolve from systemd as the - resolver, which is then configured in /etc/nsswitch.conf with - the "resolve" keyword rather than "dns". - - Fixes #33 +- [Dionna Glaze brought this change] -- ares_set_socket_callback: make manpage match code + Simple changes to appease stricter compilers. - The code in ares_process.c that invokes the socket creation/connection - callback only checks for rc < 0, not for standard ares error codes. + ares_process.c uses htonl, which needs included. + ares_getnameinfo.c uses a dynamically selected format string for + sprintf, which -Wformat-literal doesn't like. Usually one would use + inttypes.h and a format string "%" PRIu32, but C99 is too new for some + supported platforms. -- Merge pull request #36 from AGWA-forks/master - - Add ares_set_socket_configure_callback() +GitHub (16 Jun 2017) +- [Gregor Jasny brought this change] -- test: Update init tests to match behaviour + CMake: Emulate interface library on import (#108) - Unreadable config files are now treated the same way - as absent config files. + Closes: #104 + Signed-off-by: Gregor Jasny -- [Fedor Indutny brought this change] +Brad House (6 Jun 2017) +- [ChristianAmmer brought this change] - Ignore `fopen` errors to use default values + Added support for Windows DNS Suffix Search List (#93) - After 46bb820be3a83520e70e6c5f0c5133253fcd69cd `init_by_resolv_conf` - errors are no longer swallowed in `ares_init_options`. This has exposed - a previously unknown bug in `lookups` initialization code. + This change solves issue #53. - If there is no lookup configuration in `resolv.conf`, - `init_by_resolv_conf` will attempt to read it from other files available - on the system. However, some of these files may have restricted - permissions (like `600`), which will lead to `EACCESS` errno, which in - turn is handled like a fatal error by `init_by_resolv_conf`. + Support for suffix search lists was already built in for Linux. The search list could be set via set_search. With this change the suffix search list from Windows is read from the registry and then set into the ares configuration via set_search. There are two sources for the search list: - However, it sounds illogical that this error should be handled as a - fatal. There is a `init_by_defaults` call that overrides `lookups` with - default value, and certainly possible absence of lookup information is - the reason why this function exists in a first place! + The global DNS suffix search list. + The primary and connection specific DNS suffixes if the global is not available. - I suggest handling any `fopen` errors as non-fatal ones, allowing to - pick up the `lookups` value from different config files, or to pick up - default value. + Contributed by @ChristianAmmer -Andrew Ayer (9 Feb 2016) -- Document callback type in man page for ares_set_socket_callback +Daniel Stenberg (25 May 2017) +- [Thomas Köckerbauer brought this change] -- Add ares_set_socket_configure_callback() + configure: do not heck for ar if specified manually - This function sets a callback that is invoked after the socket is - created, but before the connection is established. This is an ideal - time to customize various socket options. - -David Drysdale (9 Feb 2016) -- test: ares_set_socket_callback failure behaviour + Closes #62 -- test: Check ares_parse_txt_reply_ext() entrypoint +David Drysdale (23 May 2017) +- ares_expand_name: limit number of indirections -- [Fedor Indutny brought this change] +- test: fuzz input file that takes a while to process - txt: introduce `ares_parse_txt_reply_ext` +- test: copy data in fuzz regression driver - Introduce `ares_txt_ext` structure with an extra `record_start` - field, which indicates a start of a new TXT record, thus allowing to - differentiate the chunks in the same record, from a chunks in a - different record. - - Introduce a new API method: `ares_parse_txt_reply_ext` that works with - this kind of struct. + Oops. -- doc: Update missed repo references +GitHub (23 May 2017) +- [David Drysdale brought this change] -- doc: Update docs on contributing + Convert char from ISO-8859-1 to UTF-8 (#99) + + Fixes #97 -- test: Run command line tools in Travis +- [Gregor Jasny brought this change] + + travis: Use trusty for cmake builds (#109) - Do a quick execution of each of the command line tools - in the continuous integration build, so that any (say) - sanitizer failures show up. + kubuntu-backports dropped the CMake package for Precise -- acountry: drop inert test +David Drysdale (2 May 2017) +- [David Hotham brought this change] + + msvc_ver.inc support most recent Visual Studio 2017 (#101) + +- test: use io.h not unistd.h for Windows + +- test: try building fuzz binaries on Windows + +- test: stick to int in ares-fuzz.c - If ver_1 is true, then z0 and z1 must both be 'z', and so - (z0 != 'z' && z1 != 'z') can never be true. + Using int rather than ares_ssize_t means this file + needs no c-ares dependency - it's a general driver for + any libFuzzer-style entrypoint. + +- test: force ARES_OPT_NOROTATE for no-rotate tests + +- test: check expected NOROTATE value + +- ares_create_query: use ares_free not naked free - CID 56879, pointed out by Coverity. + Accidentally added in commit 65c71be1cbe5 + ("ares_create_query: avoid single-byte buffer overwrite") -- doc: update badge locations to master repo +Brad House (17 Mar 2017) +- Need ares.h for ares_ssize_t -- test: Enable maintainer mode + debug in Travis +- tests should not use ssize_t, use ares_ssize_t -- test: Add an iOS build target +GitHub (16 Mar 2017) +- [Brad House brought this change] -- test: Ignore SIGPIPE in tests + Portability updates for legacy systems. (#92) + + Socklen_t should not be used in code, instead ares_socklen_t should be used. + Convert ssize_t to ares_ssize_t for portability since the public API now exposes this. -- test: More initialization tests +David Drysdale (14 Mar 2017) +- [Michael Osei brought this change] -- test: Improve containerized test mechanism + Update msvc_ver.inc (#91) - Aim is to ensure that code coverage information can escape the - container. To do this: - - Enter a new mount namespace too, so that we can... - - Bind mount the expected source directory into the container - - Share memory with the sub-process so coverage information is - shared too. + For Visual Studio 2017 builds -- test: Make contained tests easier to write +Daniel Stenberg (13 Mar 2017) +- [Brad House brought this change] -- test: Add framework for containerized testing + Windows DNS server sorting (#81) - On Linux we can potentially use user and UTS namespaces to run a test - in a pseudo-container with: - - arbitrary filesystem (e.g. /etc/resolv.conf, /etc/nsswitch.conf, /etc/hosts) - - arbitrary hostname/domainname. + Original Patch From Brad Spencer: + https://c-ares.haxx.se/mail/c-ares-archive-2016-04/0000.shtml - Include a first pass at the framework code to allow this, along with a - first test case that uses the container. - -- test: Use a longer timeout for less flakiness + My modifications include: + * Dynamically find GetBestRoute2 since it is a Windows Vista+ symbol, and will fall back to prior behavior when not available. + * Prefer get_DNS_AdaptersAddresses as the modifications should alleviate the concerns which caused us to prefer get_DNS_NetworkParams + * Update AppVeyor to use MinGW-w64 instead of the legacy MinGW + * Fix compile error in test suite for Windows. - Having occasional test failures from timeout before multiple - queries can complete, so up the default timeout for the test - from 100ms to 1500ms. - -- test: Make failure tests more robust + Original message from patch below: - Different platforms will do different numbers of allocations - in the processing of a given API call; just check that the - return code is either success or ENOMEM, and free off any - returned state in the former case. + From: Brad Spencer + Date: Fri, 29 Apr 2016 14:26:23 -0300 - Also cope with ECONNREFUSED as well as ENOTFOUND. - -- test: Get test code building under Windows + On Windows, the c-ares DNS resolver tries first to get a full list of + DNS server addresses by enumerating the system's IPv4/v6 interfaces and + then getting the per-interface DNS server lists from those interfaces + and joining them together. The OS, at least in the way the c-ares + prefers to query them (which also may be the only or best way in some + environments), does not provide a unified list of DNS servers ordered + according to "current network conditions". Currently, c-ares will then + try to use them in whatever order the nested enumeration produces, which + may result in DNS requests being sent to servers on one interface + (hosting the current default route, for example) that are only intended + to be used via another interface (intended to be used when the first + interface is not available, for example). This, in turn, can lead to + spurious failures and timeouts simply because of the server address + order that resulted because of the enumeration process. - - Initial nmake file based off library nmake file - - Cast socket call arguments to (char *) - - Use wrapper sclose() that maps to closesocket() or close() - - Build a config.h indicating presence of headers - - Conditionally include netdb.h - - Remove unnecessary include of sys/socket.h - - Force longer bitmask for allocation failure tracking - - Call WSAStartup() / WSACleanup() in main() - - Set TCP_NODELAY for mock server - - Turn on tests in AppVeyor build + This patch makes the (safe?) assumption that there is no other better + rule to chose which interface's DNS server list should be prioritized. + After all, a DNS lookup isn't something "per network"; applications + don't look up "these DNS names on this interface and those DNS names on + that interface". There is a single resource pool of DNS servers and the + application should presume that any server will give it the "right" + answer. However, even if all DNS servers are assumed to give equally + useful responses, it is reasonable to expect that some DNS servers will + not accept requests on all interfaces. This patch avoids the problem by + sorting the DNS server addresses using the Windows IPv4/v6 routing tables. + + For example, a request to DNS server C on interface 2 that is actually + sent over interface 1 (which may happen to have the default route) may + be rejected by or not delivered to DNS server C. So, better to use DNS + servers A and B associated with interface 1, at least as a first try. + + By using the metric of the route to the DNS server itself as a proxy for + priority of the DNS server in the list, this patch is able to adapt + dynamically to changes in the interface list, the DNS server lists per + interface, which interfaces are active, the routing table, and so on, + while always picking a good "best" DNS server first. + + In cases where any DNS server on any interface will do, this patch still + seems useful because it will prioritize a lower-metric route's (and thus + interface's) servers. -- test: Disable tests that manipulate env on Windows +David Drysdale (22 Feb 2017) +- [Sergii Pylypenko brought this change] -- test: Move file lists into Makefile.inc - - In preparation for a Win32 build of the test suite. + docs: fixed references to ares_set_local_ip4 and ares_set_local_ip6 -- test: Add a simple multi-server test - - Check rotate option does something +- [Calle Wilund brought this change] -- test: Allow for multiple mock servers + ares test: fix win32 build errors with virtual socket function tests - - Update the MockServer to allow separate specification of - UDP and TCP ports - - Have an array of mock servers listening on consecutive - sets of ports. - - Rename Process(fd) to ProcessFD(fd) to avoid confusion. - - Initialize channel by using the new ares_set_servers_ports() - entrypoint, so multiple ports on the same loopback address - can be used. + The added api requires both some typedefs not previously imported + into the test build + the test code did not fully deal with + socket differences on windows. -- test: Update test for set/get_servers variants - - Ports are significant in the _ports_ variant functions, so update test to cope. +- [Calle Wilund brought this change] -- test: Make GetNameServers() utility function port-aware - - Also make it generally available. + ares_process: fix return type of socket_create function (win32 warning) -- test: more testing, including of internal static functions +Daniel Stenberg (31 Jan 2017) +- [Calle Wilund brought this change] -- test: more tests, especially fallback processing + ares_set_socket_functions: Add man page - - Make mock server listen on UDP + TCP in parallel. - - Test UDP->TCP fallback on truncation - - Test EDNS->no-EDNS fallback - - Test some environment init options - - Test nonsense reply + Providing some rudimentary documentation for the added functionality - test: short response + Closes #72 -- test: more tests, particularly of initialization +- [Calle Wilund brought this change] -- test: Run mock tests over both TCP and UDP + ares-test: Add test helpers and cases for virtual socket IO - With the exception of a few tests that make use of the timed - retry aspect of UDP. - -- test: Run mock tests over both IPv4 and IPv6 - -- test: Add more tests for edge cases + * Added test case macro to automatically run tests twice, once "normal", + once with virtual IO. + * Changed most "live" query tests to run in dual mode to verify + at least simple socket IO via virtual functions + * Added test case for settings/duping socket functions & callback data -- test: more nooks and crannies of pton functions +- [elcallio brought this change] -- test: More tests for PTR parsing + Implement using virtual socket IO functions when set + + Uses virtual socket IO functions when set on a channel. + Note that no socket options are set, nor is any binding + done by the library in this case, since the client defining + these is probably more suited to deal with this. -- test: Use of HOSTALIAS environment variable +- [elcallio brought this change] -- test: Add RAII utility classes for testing + Add virtual function set for socket IO - - TempFile holds specific contents - - EnvValue sets an environment variable + Defines a structure of basic create, close, read/write + functions as virtual function calls, settable for individual + c-ares channels. -- test: More search domain scenarios +David Drysdale (30 Jan 2017) +- test: ignore aresfuzzname binary -- test: Remove duplicate flags from Makefile.am +Gregor Jasny (14 Jan 2017) +- [Stephen Sorley brought this change] -- test: Make test code leak-free + Always use check_symbol_exists instead of check_function_exists. -- test: More tests - - - test use of sortlist - - test gethostbyname(AF_UNSPEC) +- Also add includes to TARGETS_INST_DEST -- test: Test ares_gethostbyname_file() +- [Stephen Sorley brought this change] -- test: Add more tests of ares_getnameinfo() + Windows build fixes -- test: Tweak tests, add alloc failure test +- CMake: Export targets -- test: Test init with options +- CMake: Use GNUInstallDirs for install location defaults -- test: More tests - - - ares_inet_net_pton() variants - - ares_getsock() variants +David Drysdale (11 Jan 2017) +- Update Makefile.am for renamed INSTALL.md -- test: Expose ProcessWork() function +GitHub (11 Jan 2017) +- [David Drysdale brought this change] -- test: More parsing tests - - Including: - - Split each parse function test set out into separate files. - - Add an allocation failure test for each parsing function. - - Add error check test for each parsing function. + docs: convert INSTALL to MarkDown & tweak (#83) -- test: Add various additional tests +- [Gregor Jasny brought this change] -- test: More tests + Merge pull request #77 from stephen-sorley/cmake_modernize - Include tests of internal functions, based on the value of the - CARES_SYMBOL_HIDING macro; need to configure the library with - --disable-symbol-hiding to enable these tests. + Updated CMake minimum version to 2.8.12. -- test: Allow command line override of mock server port +Stephen Sorley (4 Jan 2017) +- Changed executables to depend directly on internal libcares target, instead of against + the external-facing alias targets. -- test: Add README.md documentation +- Updated Travis to pull CMake 2.8.12 from kubuntu-backports ppa. -- test: Temporarily avoid latest Python requests package +- Updated CMake minimum version to 2.8.12. - Currently get error from Travis on this install step, and downgrading one - version appears to fix the problem. + Changed the way usage requirements (include dirs, compile defs, dependent libraries) are specified, to match the recommended standard practice for modern CMake. This involves using target-specific functions (target_include_directories, target_compile_definitions, etc.), along with the PUBLIC, PRIVATE or INTERFACE modifiers. - "Could not find any downloads that satisfy the requirement pyOpenSSL>=0.13 - (from requests[security])" + Updated chain-building support to imitate new-style Find modules (import libs), instead of old-style Find modules (cache variables). -- test: Add AppVeyor config file for Windows build +David Drysdale (26 Dec 2016) +- [Chris Araman brought this change] -- test: Add configuration for a Travis build - - Cover Linux & OSX on the container infrastructure, but install - a later G++ to satisfy the tests' need for C++11. - - Use a build matrix to include a variety of build variants: - - ASAN - - UBSAN - - LSAN - - Coverage via coveralls.io + configure: clock_gettime workaround (#75) - test: invoke ASAN and coverage in Travis build + Commits 7518c26, c41726b, and bc14ee7 brought this workaround to the CMake build system. This expands it to the autoconf build system. - Also shift to use explicit build matrix + Fixes #71 + +- test: add fuzz entrypoint for ares_create_query() + +- test: Add gTest/gMock files to SOURCES - test: Use coveralls.io for coverage tracking + Built tarballs are not including all of the files needed + to build the test suite because they are missing from the + _SOURCES variable in Makefile.am. + +- travis: Move build scripts under travis/ - test: Add a build with UBSAN + Travis doesn't always propagate errors in inline multi-line + scripts, so move them all to be explicit shell scripts, each + with set -e. + +- travis: check distributed tarball builds + +Daniel Stenberg (25 Oct 2016) +- dist: ship msvc_ver.inc too - Also expand and re-order the setting of environment variables - for easier modification. + Reported-by: Bruce Stephens - test: Add LSAN build to Travis config + Fixes #69 -- test: Add initial unit tests for c-ares library +- [Aaron Bieber brought this change] + + fix build on OpenBSD + +- ares_version.h: bump, working on 1.12.1 now + +GitHub (18 Oct 2016) +- [Gregor Jasny brought this change] + + Merge pull request #64 from bradh352/master - The tests are written in C++11, using the GoogleTest and GoogleMock - frameworks. They have their own independent autoconf setup, so that - users of the library need not have a C++ compiler just to get c-ares - working (however, the test/configure.ac file does assume the use of - a shared top-level m4/ directory). However, this autoconf setup has - only been tested on Linux and OSX so far. + Add CMake build system support to C-Ares. + +Brad House (5 Oct 2016) +- suggested PROJECT_NAME change broke chain building as it needs the magic PROJECT_NAME set in the ADD_LIBRARY for matching. Fix to make both goals work + +- update MacOSX 10.12 detection + +- Expand XCode clock_gettime fix to include MacOS 10.12, not just iOS10 + +David Drysdale (4 Oct 2016) +- Revert "travis: work around bug in PyCParser" - Run with "./arestest", or "./arestest -v" to see extra debug info. - The GoogleTest options for running specific tests are also - available (e.g. "./arestest --gtest_filter=*Live*"). + This reverts commit a24a10a348fc00b8cfd684d91894a1df14880ea9. + +- travis: work around bug in PyCParser - The tests are nowhere near complete yet (currently hitting around - 60% coverage as reported by gcov), but they do include examples - of a few different styles of testing: + See https://github.com/pyca/cryptography/issues/3187 + +Brad House (3 Oct 2016) +- PROJECT_SOURCE_DIR instead of CMAKE_CURRENT_SOURCE_DIR as per @gjasny + +- use a project name of c-ares as per @gjasny + +- Import curl conversion of Makefile.inc to cmake form dynamically as per bdoetsch@ameritech.net to make maintaining multiple build systems easier + +Daniel Stenberg (30 Sep 2016) +- dist: add ares_library_initialized.* to the tarball + +David Drysdale (30 Sep 2016) +- test: check ares_create_query with too-long name + +Daniel Stenberg (30 Sep 2016) +- man pages: minor formatting edits + +Brad House (29 Sep 2016) +- merge fc7917e from @daviddrysdale ... travis build updates for cmake + +- cleanups as per @gjasny ... Use naked IF statements and use NOT DEFINED + +Version 1.12.0 (29 Sep 2016) + +Daniel Stenberg (29 Sep 2016) +- RELEASE-NOTES: 1.12.0 + +- [David Drysdale brought this change] + + ares-test-misc: test ares_create_query with escaped trailing dot + +- ares_create_query: avoid single-byte buffer overwrite - - There are live tests (ares-test-live.cc), which assume that the - current machine has a valid DNS setup and connection to the - internet; these tests issue queries for real domains but don't - particularly check what gets returned. The tests will fail on - an offline machine. + ... when the name ends with an escaped dot. - - There a few mock tests (ares-test-mock.cc) that set up a fake DNS - server and inject its port into the c-ares library configuration. - These tests allow specific response messages to be crafted and - injected, and so are likely to be used for many more tests in - future. + CVE-2016-5180 - - To make this generation/injection easier, the dns-proto.h file - includes C++ helper classes for building DNS packets. + Bug: https://c-ares.haxx.se/adv_20160929.html + +Brad House (29 Sep 2016) +- CMake: Unify library versioning with the libtool methodology to make keeping library versions in sync easier with the autotools build system + +Daniel Stenberg (29 Sep 2016) +- ares_library_initialized.3: added + +- make: bump CARES_VERSION_INFO for release + +David Drysdale (29 Sep 2016) +- man: update ares_init_options.3 + +Daniel Stenberg (29 Sep 2016) +- ares_library_init.3: corrected the ares_library_init_mem proto + +Brad House (28 Sep 2016) +- XCode v8 introduced clock_gettime() for iOS v10. However, it is a weak symbol, which means when earlier iOS versions try to use clock_gettime() it results in a crash due to the missing symbol. Detect this condition and do not set HAVE_CLOCK_GETTIME_MONOTONIC. + +- Adds cmake build system support to C-Ares. - - Other library entrypoints that don't require network activity - (e.g. ares_parse_*_reply) are tested directly. + The patch does not modify any source files, it only adds 3 new files + (CMakelists.txt, ares_build.h.cmake, ares_config.h.cmake) which form the + build system. I've tried to go through as much of the autotools tests and + extracted what I thought was appropriate, though many of the tests aren't + as in-depth in CMake as they are for autotools ... it is unclear why some + of them exist at all, I'm guessing for legacy systems that CMake probably + doesn't support anyhow. - - There are few tests of library-internal functions that are not - normally visible to API users (in ares-test-internal.cc). + Building the library, and examples (adig, ahost, acountry) plus installation + should work across a large number of tested platforms. The tests have not + yet been integrated. + +Daniel Stenberg (27 Sep 2016) +- README.md: remove space from link + +- README: link to the correct c-ares badge! - - A couple of the tests use a helper method of the test fixture to - inject memory allocation failures, using the earlier change to the - library to allow override of malloc/realloc/free. + Reported-by: David Hotham - - There is also an entrypoint to allow Clang's libfuzzer to drive - the packet parsing code in ares_parse_*_reply, together with a - standalone wrapper for it (./aresfuzz) to allow use of afl-fuzz - for further fuzz testing. + Fixes #63 -- test: Add local copy of GoogleMock/GoogleTest 1.7.0 - - Don't check in gtest/m4 files, as they are unused and interfere - with the top-level configure process. +- docs: minor formatting edits -- doc: Show build badges in README.md - - Note that these URLs will need to be updated if/when the test branch - gets pulled into the master repo/branch. +- ares_destroy.3: formatting polish -- doc: Convert README to README.md +- ares_init.3: split the init docs into two separate man pages + +- SECURITY: point to the vulnerabilities page now + +- RELEASE-NOTES: synced with daa7235b1a5 + +- ares_create_query.3: edit language - Gives better display on GitHub + Tried to make the man page more readable. -- doc: Update in preparation for next release +David Drysdale (26 Sep 2016) +- test: fix gMock to work with gcc >= 6.x - Assume 1.11.0 is next (as there are various API additions). - Also add myself to AUTHORS. + Taken from: + https://github.com/google/googletest/issues/705#issuecomment-235067917 -- build: Allow header compilation by Windows C++ compiler +Daniel Stenberg (26 Sep 2016) +- [Brad House brought this change] -- build: Expose whether symbol hiding is on + headers: remove checks for and defines of variable sizes - Adding the CARES_SYMBOL_HIDING definition allows the test suite to - detect whether internal symbols are available or not. + ... they're not really used and by avoiding them in the ares_build.h + output we make the public header less dependent on data sizes. -- build: Add autoconf macros for C++11 code using pthreads +David Drysdale (24 Sep 2016) +- api: add ARES_OPT_NOROTATE optmask value - Pull in testing macros from the GNU autoconf archive to allow - configure scripts to test for and setup use of a C++11 compiler - (AX_CXX_COMPILE_STDCXX_11) and the pthreads library (AX_PTHREAD). + Fix up a couple of problems with configuring whether c-ares rotates + between different name servers between requests. - Note that these macros are not used by the main library autoconf, - just by the tests (which share the same m4/ directory). - -- build: Add a code coverage option + Firstly, ares_save_options() returns (in *optmask) the value of + (channel->optmask & ARES_OPT_ROTATE), which doesn't necessarily + indicate whether the channel is or is not actually doing rotation. + This can be confusing/incorrect if: + - the channel was originally configured without ARES_OPT_ROTATE + (so it appears that the channel is not rotating) + - the /etc/resolv.conf file includes the 'rotate' option + (so the channel is actually performing rotation). - Configure with: - ./configure --enable-code-coverage - Show coverage output with: - make code-coverage-capture + Secondly, it is not possible to reliably configure a channel + to not-rotate; leaving off ARES_OPT_ROTATE is not enough, since + a 'rotate' option in /etc/resolv.conf will turn it on again. - Built on m4/ax_code_coverage.m4 from the GNU autoconf archive - to provide the macros to check for presence of gcov + lcov; - upstream macro modified to: - - Remove use of $(AM_DEFAULT_VERBOSITY) , as earlier versions of - autoconf (such as the one used by default on Travis) do not have this. - - Rather than automatically defining CODE_COVERAGE_RULES to be a set - of makefile rules that use ifeq/endif (which is GNU make-specific), - instead only define CODE_COVERAGE_RULES if coverages is turned on, - and in that case don't use conditionals in the makefile. + Therefore: + - add an ARES_OPT_NOROTATE optmask value to allow explicit + configuration of no-rotate behaviour + - in ares_save_options(), report the value of channel->rotate + as exactly one of (optmask & ARES_OPT_ROTATE) or + (optmask & ARES_OPT_NOROTATE). + + In terms of back-compatibility: + - existing apps that set ARES_OPT_ROTATE will continue to rotate, + and to have ARES_OPT_ROTATE reported back from ares_save_options() + - existing apps that don't set ARES_OPT_ROTATE will continue to + use local config/defaults to decide whether to rotate, and will + now get ARES_OPT_ROTATE or ARES_OPT_NOROTATE reported back from + ares_save_options() rather than 0. -- api: Add entrypoints to allow use of per-server ports +- ares_init_options: only propagate init failures from options - Add user-visible entrypoints ares_{get,set}_servers_ports(3), which - take struct ares_addr_port_node rather than struct ares_addr_node. - This structure includes a UDP and TCP port number; if this is set - to zero, the channel-wide port values are used as before. + Commit 46bb820be3a8 ("ares_init_options: don't lose init failure") + changed init behaviour so that earlier errors in initialization + weren't lost. In particular, if the user passes in specific + options but they are not applied (e.g. because of an allocation + failure), that failure needs to be reported back to the user; this + also applies when duplicating a channel with ares_dup(). - Similarly, add a new ares_set_servers_ports_csv(3) entrypoint, which - is analogous to ares_set_servers(3) except it doesn't ignore any - specified port information; instead, any per-server specified port - is used as both the UDP and TCP port for that server. + However, other initialization failures can be ignored and + overridden -- in particular, if init_by_resolv_conf() or + init_by_environment() fail, then falling back to default values + is OK. - The internal struct ares_addr is extended to hold the UDP/TCP ports, - stored in network order, with the convention that a value of zero - indicates that the channel-wide UDP/TCP port should be used. + So only preserve failures from the init_by_options() stage, not + from all initialization stages. - For the internal implementation of ares_dup(3), shift to use the - _ports() version of the get/set functions, so port information is - transferred correctly to the new channel. + Fixes issue 60. + +- test: Force reinstall of libtool on OSX - Update manpages, and add missing ares_set_servers_csv to the lists - while we're at it + Travis build environment appears to have changed. -- api: Add ares_set_sortlist(3) entrypoint +- test: Add valgrind build variant + +- test: Add null pointer to gtest args + + GoogleTest assumes that there is a null pointer in argv[argc], + so make it look like that. Without this change, tests run with + command-line arguments get memory errors under valgrind/ASAN. + +Daniel Stenberg (21 Aug 2016) +- AUTHOR: maybe gitgub isn't really an author =) + +- AUTHORS: added contributors from the git log + +- LICENSE.md: add a stand-alone license file + + Just the MIT license used in the top the source files moved out to a + stand-alone file for easier reference and discovery. + +- README: added "CII best practices" badge + +- SECURITY.md: suggested "security process" for the project + +David Drysdale (17 Aug 2016) +- test: Add Clang static analysis build to Travis + + Run scan-build over the library source code, but skip the + tests. Needs a later Clang install in Travis + +- test: more info on how to run fuzz testing + +- test: make fuzzer driver code C not C++ + +- test: fuzzer mode for AFL's persistent mode + + When fuzzing with AFL, if the LLVM-based instrumentation is + used (via the afl-clang-fast wrapper), then it is possible to + have a single execution of the fuzzer program iterate multiple + times over the fuzzing entrypoint (similar to libFuzzer's normal + mode of execution) with different data. This is much (e.g. 10x) + faster. - Allow explicit configuration of the channel's sortlist, by - specifying a string in the same format as the equivalent - /etc/resolv.conf option. + Add code to support this, by checking whether __AFL_LOOP is + defined at compile-time. - This allows library users to perform the same configuration - that is available via /etc/resolv.conf, but without needing - to change that file. + Also, shift the code to effectively be C rather than C++. -- api: Allow injection of user-specified malloc/free functions +- test: simplify deps for fuzzer entrypoint - Add a new ares_library_init_mem() initialization function for the - library which allows the library user to specify their own malloc, - realloc & free equivalents for use library-wide. + No need to depend on the rest of the test code (ares-test.h) for + the fuzzer entrypoint; this makes the entrypoint slightly simpler + to build with LLVM's libFuzzer. - Store these function pointers in library-wide global variables, - defaulting to libc's malloc(), realloc() and free(). + Also shift the code to effectively be C rather than C++ + +- test: disable MinGW tests - Change all calls to malloc, realloc and free to use the function pointer - instead. Also ensure that ares_strdup() is always available - (even if the local environment includes strdup(3)), and change the - library code to always use it. + The test binary built in the MinGW build is failing for some + reason. It works for me when I build locally, so I'm guessing + it's down to some sort of AppVeyor environment issue. - Convert calls to calloc() to use ares_malloc() + memset + Disable for now. -- api: Add option to expose some internal functions +Daniel Stenberg (16 Aug 2016) +- read_tcp_data: remove superfluous NULL check - Purely for testing, add --enable-expose-statics option to configure - which converts some static internal functions to be externally visible. + CID 56884 by Coverity. The pointer is already derefenced before this + point so it can't be NULL here anyway. -- api: Expose the ares_library_initialized() function +- web: http => https -- ahost: Allow repeated -s options - - This also removes a potential leak where later -s options would - replace earlier ones without freeing the relevant string. +GitHub (20 Jul 2016) +- [David Drysdale brought this change] -- Mark unhittable lines + Merge pull request #59 from fuze/master - Add comments for the benefit of the lcov tool, marking - lines that cannot be hit. Typically these are fall-back - protection arms that are already covered by earlier checks, - and so it's not worth taking out the unhittable code (in case - someone changes the code between the two places in future). - -- ares_set_servers_csv.3: make return type match code + Update msvc_ver.inc for VS2015 Update 3 -- bitncmp: update comment to match code behaviour +- [Chris Araman brought this change] -- ares_striendstr: fix so non-NULL return can happen + Update msvc_ver.inc - This looks to have been broken since it was first introduced in 2005 in - commit aba0b775ea30 ("Added ares_getnameinfo which mimics the - getnameinfo API") + support Visual Studio 2015 Update 3 -- config_sortlist: free any existing sortlist on (re)alloc failure - - If we get an allocation failure on 2nd or later entry in the sortlist, the - code would return ENOMEM but still leave the initial entries allocated. - Ensure that *sortlist is set to NULL whenever ENOMEM is returned. +David Drysdale (2 May 2016) +- Fix trailing comment for #endif -- ares_dup: clear new channel on failure +Daniel Stenberg (30 Apr 2016) +- email: use Gisle's "new" address + +David Drysdale (18 Apr 2016) +- test: drop superfluous fuzz inputs - If the attempt to transfer IPv6 servers from the old to the new channel - fails, the previous code would still return a channel to the user even though - an error return code was generated. This makes it likely that users would - leak the channel, so explicitly clear the channel in this case. + Where there are multiple fuzz input files that only differ in + the first two bytes (the query ID), just keep the first such + file. -- ares_init_options: don't lose init failure +svante karlsson (15 Apr 2016) +- Update msvc_ver.inc - If (say) init_by_options() fails, the subsequent call to - init_by_defaults() was overwriting the return code with - success. Still call init_by_defaults() regardless, but track - its return value separately + support Visual Studio 2015 Update 2 -- ares_gethostbyname: don't leak valid-but-empty hostent +David Drysdale (31 Mar 2016) +- test: Run fuzzcheck.sh in Travis build + +- test: add fuzzing check script to tests - If an AF_UNSPEC query gets a valid response to its AAAA query, - but which has no IPv6 addresses in it, then the code chains on to - a A record query. However, the hostent from the AAAA response - was being leaked along the way (because it gets replaced before - the follow-on end_hquery() invocation). + Add a test script that runs the fuzzing command over the + corpus of DNS packets. This doesn't actually do any fuzzing + (it just runs them as inputs without generating any variations) + but it does ensure that the fuzzing entrypoint is still working. -- ares_parse_txt_reply: propagate errors from per-substring loop +- test: allow multiple files in aresfuzz command line - If we get an allocation failure when processing a particular substring in a - TXT record, that failure is silently lost; fix that by propagating errors from - the inner loop to the outer loop. + If no arguments are specified, use stdin as input. + Otherwise treat each argument as a filename and feed + its contents to the fuzz entrypoint. -- process_answer: fix things up correctly when removing EDNS option +- test: Add corpus of DNS packets - When a server rejects an EDNS-equipped request, we retry without - the EDNS option. However, in TCP mode, the 2-byte length prefix was - being calculated wrong -- it was built from the answer length rather than - the length of the original request. + For fuzz testing it is useful to start from a corpus of valid + packets, so fill out the test/fuzzinput/ directory with a bunch + of inputs. - Also, it is theoretically possible that the call to realloc() might change - the data pointed to; to allow for this, qbuf also needs updating. + These packets were generated by temporarily modifying the c-ares + process_answer() function to save off any incoming response messages. + +- test: Add utility to show DNS packet from file + +- [nordsturm brought this change] + + Fix nsort initialization - (Both these fixes were actually included in a patchset sent on the mailing - list in Oct 2012, but were included with other functional changes that - didn't get merged: - http://c-ares.haxx.se/mail/c-ares-archive-2012-10/0004.shtml) + Author: Alexander Drachevskiy + http://c-ares.haxx.se/mail/c-ares-archive-2014-07/0004.shtml + http://c-ares.haxx.se/mail/c-ares-archive-2014-07/0014.shtml -- ares__read_line: clear buf pointer on realloc failure +- test: Check setting nsort=0 option is respected -- ares_expand_name: check for valid bits in label length +- test: Update fuzzing function prototype - The top two bits of the label length indicate whether this is a - label length (00) or an index to a name elsewhere in the message - (11). RFC1035 4.1.4 says that the other possible values for the - top two bits (01, 10) are reserved for future use. + libFuzzer changed expected return type from void to int + in LLVM 3.8. -Daniel Stenberg (23 Jan 2016) -- [Gregor Jasny brought this change] +- Explicitly clear struct servent before use + + On a build where MSAN has been manually set up (which involves + using an MSAN-instrumented version of the standard C++ library, see + https://github.com/google/sanitizers/wiki/MemorySanitizerLibcxxHowTo) + there's a warning about use of uninitialized memory here. It + might be a false positive, but the fix is trivial so include it. - Fix typos detected by lintian +- test: for AF_UNSPEC, return CNAME only for AAAA, but valid A record - Closes #32 + Also shuffle expected responses rsp6/rsp4 into the order they will occur. -- [Gregor Jasny brought this change] +- [Chris Araman brought this change] - Distribute all man pages + msvc_ver.inc: support Visual Studio 2015 Update 1 -- README.cares: s/I/Daniel +- build: commonize MSVC version detection - ... and add a pointer to an existing version of the original area 1.1.1 - package.a + Remove the need to copy/paste version number mapping between + Makefile.msvc and test/Makefile.msvc. -- read_tcp_data: don't try to use NULL pointer after malloc failure - - CID 56884, pointed out by Coverity. We really should make this function - return an error code so that a malloc() failure can return back a major - failure. +- test: Use different name in live test -- configure_socket: explicitly ignore return code - - CID 56889 in Coverity pointed out the return code from setsocknonblock() - is ignored, and this added typecast to (void) makes it explicit. +- test: Only pass unused args to GoogleTest -- ahost: check the select() return code +- ahost.c: add cast to fix C++ compile - Fixes CID 137189, pointed out by Coverity + If ahost.c is force-compiled as C++ the missing cast from + (void *) to (char **) is problematic. -David Drysdale (18 Jan 2016) -- Fix buildconf on platforms using glibtoolize +- ares_library_cleanup: reset ares_realloc too - Commit c49a87eea538 changed buildconf to only check for - libtoolize, but missed a line + Otherwise a subsequent use of the library might use a previous + incarnation's realloc() implementation. -- Don't exit loop early leaving uninitialized entries - - Update for commit affc63cba875d. +Daniel Stenberg (9 Mar 2016) +- [Brad House brought this change] + + configure: check if tests can get built before enabled - The original patch from Gregor Jasny did not have the break - statement; I incorrectly added it to prevent continuing the loop. - However, the later entries in the array would then be left - uninitialized, causing problems for later cleanup. + The current approach for disabling tests is not a good solution because + it forces you to pass --disable-tests, rather than auto-detect if your + system can support the tests in the first place. Many (most?) systems + do not have C++11. This also causes issues when chain-building c-ares, + the hosting system needs to be updated to support passing this + additional flag if necessary, it doesn't seem reasonable to add this + requirement which breaks compatibility. - So fix to match Gregor's original patch, with apologies. + This change auto-detects if the system can build the tests and + automatically disable them if it cannot. If you pass --enable-tests to + configure and the system cannot build them either due to lack of system + support, or because cross-compilation is being used, it will throw an + appropriate error since the user indicated they really did want the + tests. -Daniel Stenberg (18 Jan 2016) -- buildconf: remove check for libtool, it only requires libtoolize +David Drysdale (3 Mar 2016) +- [Viktor Szakats brought this change] -David Drysdale (17 Jan 2016) -- [Gregor Jasny brought this change] + Makefile.m32: add support for CROSSPREFIX - Use libresolv to initialize cares on iPhone targets - - On iPhone targets like iOS, watchOS or tvOS the file - /etc/resolv.conf cannot be used to configure cares. +- [Viktor Szakats brought this change] + + Makefile.m32: add support for extra flags - Instead the resolver library is queried for configuration - values. + Allow specification of CARES_{LD,C}FLAG_EXTRAS envvars + for mingw + +- test: Build with MinGW on AppVeyor + +- test: avoid in6addr_* constants - CC: Yury Kirpichev + These aren't available on MinGW, so use explicit addresses instead. -Daniel Stenberg (17 Jan 2016) -- README: updated to new repo URL +- test: add missing #includes for dns-proto.cc + +- [Gregor Jasny brought this change] -David Drysdale (14 Jan 2016) -- [Lei Shi brought this change] + Fix man page typos detected by Lintian - Fixing slow DNS lookup issue +Daniel Stenberg (19 Feb 2016) +- configure: acknowledge --disable-tests - This patch is fixing the dns lookup issue due to dummy dns information - of a disconnected adapter(in my case is a bluetooth adapter). I changed - the dns lookup policy to try GetNetworkParams first because the - GetNetworkParams provides the most reliable dns information (lots of - checks were done by system). I also filter out inoperable adapter in - DNS_AdaptersAddresses in case GetNetworkParams fail. + Fixes #44 -- Merge pull request #30 from p-push/vs-2015 - - Support Visual Studio 2015 +- AUTHORS: added contributors from the 1.11.0 release -Oleg Pudeyev (3 Jan 2016) -- [Gisle Vanem brought this change] +- bump: start working on the next version - Support Visual Studio 2015 +Version 1.11.0 (19 Feb 2016) -David Drysdale (11 Nov 2015) -- [Andrew Andkjar brought this change] +Daniel Stenberg (19 Feb 2016) +- RELEASE-NOTES: final edits for 1.11.0 - added another version case to Makefile.msvc +David Drysdale (15 Feb 2016) +- ares_dup.3: remove mention of nonexistent function - nmake version 11.00.61030.0 resolves to CC_VERS_NUM = 110 + ares_dup_options() doesn't exist, so don't document it. -- Merge pull request #26 from bitbouncer/vs-2013 +- test: skip repeated build steps - added define for visual studio 2013 - -svante karlsson (25 Jun 2015) -- added define for visual studio 2013 + Top-level buildconf/configure now triggers for the + test/ subdir too, so don't need to do explicitly. -Jakub Hrozek (6 Nov 2014) -- ares__read_line: free buf on realloc failure +- test: namespaces unavailable when cross-compiling -- Destroy options if ares_save_options fails +Daniel Stenberg (13 Feb 2016) +- configure: only run configure in test when NOT cross-compiling - It's possible that, if ares_save_options failed, the opts structure - would contain some allocated memory. Calling ares_destroy_options in - this case is safe, because ares_save_options zeroes out the memory - initially. - -- [David Drysdale brought this change] + ... as the tests won't run cross-compiled anyway - Continue loop if space for hostname not large enough +David Drysdale (13 Feb 2016) +- test: prefer ON_CALL to EXPECT_CALL to reduce flakes - When attempting to build a search domain from the local hostname - (used as a fallback when no other methods have given a search - domain), the code doubles the buffer size on each loop iteration. + For UDP tests, there's a chance of a retry. EXPECT_CALL only + expects a single request to arrive at the server; ON_CALL allows + for a UDP retry and repeats the same answer. - However, the loop previously had a WHILE_FALSE terminator so the continue - statement exited the loop rather than going round again. + Note that ON_CALL and EXPECT_CALL can't be mixed in the same + test, and that tests that have a varied sequence of responses + for the same repeated request still have to use EXPECT_CALL. -Daniel Stenberg (30 Oct 2014) -- ares_getnameinfo.3: there is no ares_getaddrinfo +Daniel Stenberg (13 Feb 2016) +- configure: run configure in 'test' too + + Having the test dir completely stand-alone causes too many issues for + users and devs. It still needs to be built specifically. + +- configure: build silently by default + +- buildconf: run test/buildconf too if present + +- test/configure: build silently by default -David Drysdale (30 Sep 2014) - [Gregor Jasny brought this change] - Prevent tmpbuf from overrunning - - Fix Coverity error CID 56886. + dist: Distribute README.md - Signed-off-by: Gregor Jasny + Closes #42 -- [Gregor Jasny brought this change] +Version 1.11.0 (11 Feb 2016) - Re-start loop if select fails +Daniel Stenberg (11 Feb 2016) +- Makefile.am: distribute the test dir too + +- RELEASE-NOTES: synced with 385582bd14b68a + +- [Nicolas \"Pixel\" Noble brought this change] + + ares_win32_init: make LoadLibrary work when using UNICODE too - Fix Coverity error CID 56882 + Closes #17 + +David Drysdale (11 Feb 2016) +- Use "resolve" as synonym of "dns" in nsswitch.conf - Signed-off-by: Gregor Jasny + Modern Linux systems may have libnss_resolve from systemd as the + resolver, which is then configured in /etc/nsswitch.conf with + the "resolve" keyword rather than "dns". + + Fixes #33 -- [Gregor Jasny brought this change] +- ares_set_socket_callback: make manpage match code + + The code in ares_process.c that invokes the socket creation/connection + callback only checks for rc < 0, not for standard ares error codes. - Free temporary variable in error path +- Merge pull request #36 from AGWA-forks/master - Fix Coverity CID 56890 + Add ares_set_socket_configure_callback() + +- test: Update init tests to match behaviour - Signed-off-by: Gregor Jasny + Unreadable config files are now treated the same way + as absent config files. -- [Gregor Jasny brought this change] +- [Fedor Indutny brought this change] - Fix integer shift overflow if both tcp_socket and udp_socket are set + Ignore `fopen` errors to use default values - The problem occurs if at the start of the loop the sockindex is at the - last valid ARES_GETSOCK_MAXNUM position. If then both udp_socket and - tcp_socket are valid, sockindex gets incremented for UDP first and - points one entry behind the array for the tcp block. - So the fix is to check after every increment of sockindex if it is still - valid. + After 46bb820be3a83520e70e6c5f0c5133253fcd69cd `init_by_resolv_conf` + errors are no longer swallowed in `ares_init_options`. This has exposed + a previously unknown bug in `lookups` initialization code. - Fix Coverity error CID 56878 + If there is no lookup configuration in `resolv.conf`, + `init_by_resolv_conf` will attempt to read it from other files available + on the system. However, some of these files may have restricted + permissions (like `600`), which will lead to `EACCESS` errno, which in + turn is handled like a fatal error by `init_by_resolv_conf`. - Signed-off-by: Gregor Jasny + However, it sounds illogical that this error should be handled as a + fatal. There is a `init_by_defaults` call that overrides `lookups` with + default value, and certainly possible absence of lookup information is + the reason why this function exists in a first place! + + I suggest handling any `fopen` errors as non-fatal ones, allowing to + pick up the `lookups` value from different config files, or to pick up + default value. -- [Gregor Jasny brought this change] +Andrew Ayer (9 Feb 2016) +- Document callback type in man page for ares_set_socket_callback - Null check before dereference - - Fix Coverity error CID 56880 +- Add ares_set_socket_configure_callback() - Signed-off-by: Gregor Jasny - -Jakub Hrozek (28 Jul 2014) -- [Gisle Vanem brought this change] + This function sets a callback that is invoked after the socket is + created, but before the connection is established. This is an ideal + time to customize various socket options. - Comment in ares_ipv6.h +David Drysdale (9 Feb 2016) +- test: ares_set_socket_callback failure behaviour -David Drysdale (25 Jul 2014) -- CONTRIBUTING: add file to indicate mailing list is preferred +- test: Check ares_parse_txt_reply_ext() entrypoint -- Add -t u option to ahost - - Add an option to allow specification of the AF_UNSPEC - address family. +- [Fedor Indutny brought this change] -Jakub Hrozek (24 Jul 2014) -- host_callback: Fall back to AF_INET on searching with AF_UNSPEC + txt: introduce `ares_parse_txt_reply_ext` - Previously, when an ares_gethostbyname() searched with AF_UNSPEC and the - first AF_INET6 call only returned CNAMEs, the host_callback never - retried AF_INET. + Introduce `ares_txt_ext` structure with an extra `record_start` + field, which indicates a start of a new TXT record, thus allowing to + differentiate the chunks in the same record, from a chunks in a + different record. - This patch makes sure than on ARES_SUCCESS, the result of AF_INET6 is - taken as authoritative only if the result contains some addresses. + Introduce a new API method: `ares_parse_txt_reply_ext` that works with + this kind of struct. -- [David Drysdale brought this change] +- doc: Update missed repo references - Move memset call below platform-specific declarations - - A GitHub commenter [1] says that my recent change to ahost.c has - problems compiling on Windows + C89 platforms. - - [1] https://github.com/bagder/c-ares/commit/ee22246507c9#commitcomment-6587616 +- doc: Update docs on contributing -- [David Drysdale brought this change] +- test: Run command line tools in Travis + + Do a quick execution of each of the command line tools + in the continuous integration build, so that any (say) + sanitizer failures show up. - Update ahost man page to describe -s option. +- acountry: drop inert test - Commit ee22246507c9 added the -s option to the - ahost command, but neglected to update the man page to - describe it. + If ver_1 is true, then z0 and z1 must both be 'z', and so + (z0 != 'z' && z1 != 'z') can never be true. - Also fix typo in description of -t option. + CID 56879, pointed out by Coverity. -- ares_parse_soa_reply: Do not leak rr_name on allocation failure - - If ares_malloc_data failed, already allocated rr_name would go out of - scope. +- doc: update badge locations to master repo -- [David Drysdale brought this change] +- test: Enable maintainer mode + debug in Travis - Don't override explicitly specified search domains - - Only set search domains from /etc/resolv.conf if there isn't a value - already present in the channel. +- test: Add an iOS build target -- [David Drysdale brought this change] +- test: Ignore SIGPIPE in tests - Allow specification of search domain in ahost - - Add the "-s domain" command line option to override the search - domains. +- test: More initialization tests -Daniel Stenberg (12 May 2014) -- Revert "ares_parse_aaaa_reply: fix leak when reply contains 1 alias and no address" +- test: Improve containerized test mechanism - This reverts commit 440110b303fdbfadb3ad53d30eeb98cc45d70451. - -- [Frederic Germain brought this change] + Aim is to ensure that code coverage information can escape the + container. To do this: + - Enter a new mount namespace too, so that we can... + - Bind mount the expected source directory into the container + - Share memory with the sub-process so coverage information is + shared too. - ares_parse_aaaa_reply: fix leak when reply contains 1 alias and no address +- test: Make contained tests easier to write -- [Doug Kwan brought this change] +- test: Add framework for containerized testing + + On Linux we can potentially use user and UTS namespaces to run a test + in a pseudo-container with: + - arbitrary filesystem (e.g. /etc/resolv.conf, /etc/nsswitch.conf, /etc/hosts) + - arbitrary hostname/domainname. + + Include a first pass at the framework code to allow this, along with a + first test case that uses the container. - ares_build.h: fix building on 64-bit powerpc - - There are two issues. +- test: Use a longer timeout for less flakiness - 1. gcc actually does not use __ppc__ and __ppc64__ but __PPC__ and - __PPC64__. The tests of __ILP32__ and __LP64__ are sufficient for gcc. + Having occasional test failures from timeout before multiple + queries can complete, so up the default timeout for the test + from 100ms to 1500ms. + +- test: Make failure tests more robust - 2. clang defines __GNU__ and defines both __ppc64__ and __ppc__ when - targeting ppc64. This makes CARES_SIZEOF_LONG to be 4 on a ppc64 system - when building with clang. + Different platforms will do different numbers of allocations + in the processing of a given API call; just check that the + return code is either success or ENOMEM, and free off any + returned state in the former case. - My patch is two change the order of the checks so that we check the - 64-bit case first. - -- refresh: updated now with automake 1.14 - -- [David Drysdale brought this change] + Also cope with ECONNREFUSED as well as ENOTFOUND. - single_domain: Invalid memory access for empty string input +- test: Get test code building under Windows - We noticed a small buglet in ares_search() when it gets an empty string - as input -- the single_domain() utility function in ares_search.c - accesses invalid memory (before the start of the string). + - Initial nmake file based off library nmake file + - Cast socket call arguments to (char *) + - Use wrapper sclose() that maps to closesocket() or close() + - Build a config.h indicating presence of headers + - Conditionally include netdb.h + - Remove unnecessary include of sys/socket.h + - Force longer bitmask for allocation failure tracking + - Call WSAStartup() / WSACleanup() in main() + - Set TCP_NODELAY for mock server + - Turn on tests in AppVeyor build -Guenter Knauf (31 Aug 2013) -- Fixed warning 'type specifier missing'. +- test: Disable tests that manipulate env on Windows -Daniel Stenberg (30 Aug 2013) -- [Tor Arntsen brought this change] +- test: Move file lists into Makefile.inc + + In preparation for a Win32 build of the test suite. - ares_rules.h: CARES_SIZEOF_LONG doesn't exist anymore, don't test for it +- test: Add a simple multi-server test - It was removed in f19387dd72432 + Check rotate option does something -- nowarn: use instead of configure for size of long +- test: Allow for multiple mock servers - This makes the header file much more multi-arch friendly and can be used - as-is with both 32 bit and 64 bit builds. + - Update the MockServer to allow separate specification of + UDP and TCP ports + - Have an array of mock servers listening on consecutive + sets of ports. + - Rename Process(fd) to ProcessFD(fd) to avoid confusion. + - Initialize channel by using the new ares_set_servers_ports() + entrypoint, so multiple ports on the same loopback address + can be used. -- timeoffset: made static and private +- test: Update test for set/get_servers variants - ares__timeoffset() was only used once within this single source file + Ports are significant in the _ports_ variant functions, so update test to cope. -- timeadd: make static +- test: Make GetNameServers() utility function port-aware - ares__timeadd() was only ever used from within the same source + Also make it generally available. -Yang Tse (18 Jul 2013) -- xc-am-iface.m4: comments refinement +- test: more testing, including of internal static functions -- configure: fix 'subdir-objects' distclean related issue +- test: more tests, especially fallback processing - See XC_AMEND_DISTCLEAN comments for details. + - Make mock server listen on UDP + TCP in parallel. + - Test UDP->TCP fallback on truncation + - Test EDNS->no-EDNS fallback + - Test some environment init options + - Test nonsense reply + + test: short response -- configure: automake 1.14 compatibility tweak (use XC_AUTOMAKE) +- test: more tests, particularly of initialization -- xc-am-iface.m4: provide XC_AUTOMAKE macro +- test: Run mock tests over both TCP and UDP + + With the exception of a few tests that make use of the timed + retry aspect of UDP. -Daniel Stenberg (12 May 2013) -- gitignore: ignore all ares_*pdf but also CHANGES.dist +- test: Run mock tests over both IPv4 and IPv6 -- bump: start working towards 1.10.1 +- test: Add more tests for edge cases -Version 1.10.0 (12 May 2013) +- test: more nooks and crannies of pton functions -Daniel Stenberg (12 May 2013) -- RELEASE-NOTES: two more bug fixes +- test: More tests for PTR parsing -- [Keith Shaw brought this change] +- test: Use of HOSTALIAS environment variable - ares_set_servers_csv: fixed IPv6 address parsing +- test: Add RAII utility classes for testing - Fixed bug that caused the last part of an IPv6 address to be parsed as - the port number when the last part is all numeric. + - TempFile holds specific contents + - EnvValue sets an environment variable -- nroff: fix two syntax mistakes - - ares_parse_a_reply and ares_parse_aaaa_reply both had two \fB instead of - \fP - - Reported-by: Alexander Klauer - Bug: http://c-ares.haxx.se/mail/c-ares-archive-2013-03/0010.shtml +- test: More search domain scenarios -- [Alex Loukissas brought this change] +- test: Remove duplicate flags from Makefile.am - build: fix build on msvc11 +- test: Make test code leak-free -- Makefile.am: increment -version-info for 1.10.0 release +- test: More tests + + - test use of sortlist + - test gethostbyname(AF_UNSPEC) -- README: remove unnecessary comment +- test: Test ares_gethostbyname_file() -- ares_version.h: copyright end range year is now 2013 +- test: Add more tests of ares_getnameinfo() -- RELEASE-NOTES: synced with fb0737f3a0a1c37 +- test: Tweak tests, add alloc failure test -- [Paul Saab brought this change] +- test: Test init with options - ares_parse_aaaa_reply: Plug memory leak +- test: More tests - This change is similar to ares_parse_a_reply.c in commit - bffd67f16a8f42fe6dbf79ab2e39d92eea05c8a6 + - ares_inet_net_pton() variants + - ares_getsock() variants -- [Patrick Valsecchi brought this change] +- test: Expose ProcessWork() function - ares_parse_txt_reply: return a ares_txt_reply node for each sub-string +- test: More parsing tests - Previously, the function would wrongly return all substrings merged into - one. + Including: + - Split each parse function test set out into separate files. + - Add an allocation failure test for each parsing function. + - Add error check test for each parsing function. -- [Alexander Klauer brought this change] +- test: Add various additional tests - library init: documentation update +- test: More tests - This commit updates the documentation of ares_library_init() and - ares_library_cleanup() with regard to the newly introduced reference - counting of initializations and deinitializations. - -- [Alexander Klauer brought this change] + Include tests of internal functions, based on the value of the + CARES_SYMBOL_HIDING macro; need to configure the library with + --disable-symbol-hiding to enable these tests. - library init: be recursive - - Previously, a single call to ares_library_cleanup() would deinitialise - the c-ares library, regardless of how many times ares_library_init() was - called. This behaviour may cause problems in programs linking two or - more libraries which, in turn, use c-ares. The present commit fixes this - problem, deinitializing the library only after a number of calls to - ares_library_cleanup() matching the number of calls to - ares_library_init(). +- test: Allow command line override of mock server port -- [Patrick Valsecchi brought this change] +- test: Add README.md documentation - protocol parsing: check input data stricter +- test: Temporarily avoid latest Python requests package - ... so that bad length fields aren't blindly accepted + Currently get error from Travis on this install step, and downgrading one + version appears to fix the problem. - Bug: http://c-ares.haxx.se/mail/c-ares-archive-2013-04/0016.shtml + "Could not find any downloads that satisfy the requirement pyOpenSSL>=0.13 + (from requests[security])" -Guenter Knauf (11 Apr 2013) -- Create ares_build.h when buidling from Git. +- test: Add AppVeyor config file for Windows build -- Added -DCARES_STATICLIB to CFLAGS. +- test: Add configuration for a Travis build - Currently this static makefile does only support building the - static library libcares.a. - -Daniel Stenberg (8 Apr 2013) -- [Alexander Klauer brought this change] - - .gitignore: ignore patch files + Cover Linux & OSX on the container infrastructure, but install + a later G++ to satisfy the tests' need for C++11. - This commit adds a line to .gitignore to the effect that patch files - generated by 'git format-patch' are excluded from the repository. - -- [Alexander Klauer brought this change] - - ares_destroy() documentation: no new requests + Use a build matrix to include a variety of build variants: + - ASAN + - UBSAN + - LSAN + - Coverage via coveralls.io - Clarify that no new requests may be added to a resolver channel that is - currently being destroyed. - -- [Alexander Klauer brought this change] - - Documentation: properly document ARES_ECANCELLED + test: invoke ASAN and coverage in Travis build - This commit clarifies the behaviour of ares_cancel() with respect to - callbacks and adds missing documentation of ARES_ECANCELLED to the man - pages of the affected functions. - -- [Alexander Klauer brought this change] - - ares_cancel(): cancel requests safely + Also shift to use explicit build matrix - An invocation of ares_cancel() walks through the request list, calling - the callbacks of all pending requests on a channel. Previously, if such - a callback added a new request to the channel, the request list might - not end up empty, causing an abort by assertion failure. The present - commit ensures that precisely all requests present upon entry of - ares_cancel() are cancelled, and that adding new requests through - callbacks is safe. - -Yang Tse (10 Mar 2013) -- ares.h: stricter CARES_EXTERN linkage decorations logic + test: Use coveralls.io for coverage tracking - No API change involved. + test: Add a build with UBSAN + + Also expand and re-order the setting of environment variables + for easier modification. + + test: Add LSAN build to Travis config -- ares_build.h.dist: enhance non-configure GCC ABI detection logic +- test: Add initial unit tests for c-ares library + + The tests are written in C++11, using the GoogleTest and GoogleMock + frameworks. They have their own independent autoconf setup, so that + users of the library need not have a C++ compiler just to get c-ares + working (however, the test/configure.ac file does assume the use of + a shared top-level m4/ directory). However, this autoconf setup has + only been tested on Linux and OSX so far. + + Run with "./arestest", or "./arestest -v" to see extra debug info. + The GoogleTest options for running specific tests are also + available (e.g. "./arestest --gtest_filter=*Live*"). + + The tests are nowhere near complete yet (currently hitting around + 60% coverage as reported by gcov), but they do include examples + of a few different styles of testing: - GCC specific adjustments: + - There are live tests (ares-test-live.cc), which assume that the + current machine has a valid DNS setup and connection to the + internet; these tests issue queries for real domains but don't + particularly check what gets returned. The tests will fail on + an offline machine. - - check __ILP32__ before 32 and 64bit processor architectures in - order to detect ILP32 programming model on 64 bit processors - which, of course, also support LP64 programming model, when using - gcc 4.7 or newer. + - There a few mock tests (ares-test-mock.cc) that set up a fake DNS + server and inject its port into the c-ares library configuration. + These tests allow specific response messages to be crafted and + injected, and so are likely to be used for many more tests in + future. - - keep 32bit processor architecture checks in order to support gcc - versions older than 4.7 which don't define __ILP32__ + - To make this generation/injection easier, the dns-proto.h file + includes C++ helper classes for building DNS packets. - - check __LP64__ for gcc 3.3 and newer, while keeping 64bit processor - architecture checks for older versions which don't define __LP64__ - -Daniel Stenberg (9 Mar 2013) -- ares.h: there is no ares_free_soa function - -Yang Tse (9 Mar 2013) -- Makefile.am: empty AM_LDFLAGS definition for automake 1.7 compatibility - -- ares_inet_ntop.3: s/socklen_t/ares_socklen_t - -- configure: use XC_LIBTOOL for portability across libtool versions - -- xc-lt-iface.m4: provide XC_LIBTOOL macro - -- Makefile.am: use AM_CPPFLAGS instead of INCLUDES - -- inet_ntop.c: s/socklen_t/ares_socklen_t - -- inet_ntop.c: s/socklen_t/ares_socklen_t for portability - -Daniel Stenberg (19 Feb 2013) -- ares.h: s/socklen_t/ares_socklen_t for portability - -- ares_inet_ntop.3: 4th argument is socklen_t! - -- spell inet correctly! - -- ares_inet_pton/ntop: cleanup + - Other library entrypoints that don't require network activity + (e.g. ares_parse_*_reply) are tested directly. - Make sure that the symbols are always exported and present in c-ares. + - There are few tests of library-internal functions that are not + normally visible to API users (in ares-test-internal.cc). - Make the headers prefixed with 'ares'. + - A couple of the tests use a helper method of the test fixture to + inject memory allocation failures, using the earlier change to the + library to allow override of malloc/realloc/free. - Removed the inet_ntop.h version as it no longer features any content. - -- ares_inet_ntop/ares_inet_pton: added man pages - -Yang Tse (15 Feb 2013) -- [Gisle Vanem brought this change] + - There is also an entrypoint to allow Clang's libfuzzer to drive + the packet parsing code in ares_parse_*_reply, together with a + standalone wrapper for it (./aresfuzz) to allow use of afl-fuzz + for further fuzz testing. - curl_setup_once.h: definition of HAVE_CLOSE_S defines sclose() to close_s() +- test: Add local copy of GoogleMock/GoogleTest 1.7.0 + + Don't check in gtest/m4 files, as they are unused and interfere + with the top-level configure process. -- [Gisle Vanem brought this change] +- doc: Show build badges in README.md + + Note that these URLs will need to be updated if/when the test branch + gets pulled into the master repo/branch. - config-dos.h: define HAVE_CLOSE_S for MSDOS/Watt-32 +- doc: Convert README to README.md + + Gives better display on GitHub -- [Gisle Vanem brought this change] +- doc: Update in preparation for next release + + Assume 1.11.0 is next (as there are various API additions). + Also add myself to AUTHORS. - config-dos.h: define strerror() to strerror_s_() for High-C +- build: Allow header compilation by Windows C++ compiler -Daniel Stenberg (13 Feb 2013) -- ares_get_datatype: removed unused function +- build: Expose whether symbol hiding is on - it was also wrongly named as internal functions require two underscores + Adding the CARES_SYMBOL_HIDING definition allows the test suite to + detect whether internal symbols are available or not. -- ares__bitncmp: use two underscores for private functions +- build: Add autoconf macros for C++11 code using pthreads - It used a single one previously making it look like a public one - -- ares__generate_new_id: moved to ares_query.c + Pull in testing macros from the GNU autoconf archive to allow + configure scripts to test for and setup use of a C++11 compiler + (AX_CXX_COMPILE_STDCXX_11) and the pthreads library (AX_PTHREAD). - ... and ares__rc4 is turned into a local static function. + Note that these macros are not used by the main library autoconf, + just by the tests (which share the same m4/ directory). -- ares__swap_lists: make private and static +- build: Add a code coverage option - ... since there's only one user, make it static within ares_process.c - -Yang Tse (13 Feb 2013) -- Makefile.msvc: add four VS version strings - -Daniel Stenberg (13 Feb 2013) -- ares_expand_name.3: clarify how to free the data + Configure with: + ./configure --enable-code-coverage + Show coverage output with: + make code-coverage-capture + + Built on m4/ax_code_coverage.m4 from the GNU autoconf archive + to provide the macros to check for presence of gcov + lcov; + upstream macro modified to: + - Remove use of $(AM_DEFAULT_VERBOSITY) , as earlier versions of + autoconf (such as the one used by default on Travis) do not have this. + - Rather than automatically defining CODE_COVERAGE_RULES to be a set + of makefile rules that use ifeq/endif (which is GNU make-specific), + instead only define CODE_COVERAGE_RULES if coverages is turned on, + and in that case don't use conditionals in the makefile. -Yang Tse (30 Jan 2013) -- zz40-xc-ovr.m4: fix 'wc' detection - follow-up 2 +- api: Add entrypoints to allow use of per-server ports - - Fix a pair of single quotes to double quotes. + Add user-visible entrypoints ares_{get,set}_servers_ports(3), which + take struct ares_addr_port_node rather than struct ares_addr_node. + This structure includes a UDP and TCP port number; if this is set + to zero, the channel-wide port values are used as before. - URL: http://curl.haxx.se/mail/lib-2013-01/0355.html - Reported by: Tor Arntsen + Similarly, add a new ares_set_servers_ports_csv(3) entrypoint, which + is analogous to ares_set_servers(3) except it doesn't ignore any + specified port information; instead, any per-server specified port + is used as both the UDP and TCP port for that server. + + The internal struct ares_addr is extended to hold the UDP/TCP ports, + stored in network order, with the convention that a value of zero + indicates that the channel-wide UDP/TCP port should be used. + + For the internal implementation of ares_dup(3), shift to use the + _ports() version of the get/set functions, so port information is + transferred correctly to the new channel. + + Update manpages, and add missing ares_set_servers_csv to the lists + while we're at it -- zz40-xc-ovr.m4: fix 'wc' detection - follow-up +- api: Add ares_set_sortlist(3) entrypoint - - Take into account that 'wc' may return leading spaces and/or tabs. + Allow explicit configuration of the channel's sortlist, by + specifying a string in the same format as the equivalent + /etc/resolv.conf option. - - Set initial IFS to space, tab and newline. + This allows library users to perform the same configuration + that is available via /etc/resolv.conf, but without needing + to change that file. -- zz40-xc-ovr.m4: fix 'wc' detection +- api: Allow injection of user-specified malloc/free functions - - Take into account that 'wc' may return leading spaces. + Add a new ares_library_init_mem() initialization function for the + library which allows the library user to specify their own malloc, + realloc & free equivalents for use library-wide. - - Set internationalization behavior variables. + Store these function pointers in library-wide global variables, + defaulting to libc's malloc(), realloc() and free(). - Tor Arntsen analyzed and reported the issue. + Change all calls to malloc, realloc and free to use the function pointer + instead. Also ensure that ares_strdup() is always available + (even if the local environment includes strdup(3)), and change the + library code to always use it. - URL: http://curl.haxx.se/mail/lib-2013-01/0351.html + Convert calls to calloc() to use ares_malloc() + memset -- zz40-xc-ovr.m4: check another three basic utilities +- api: Add option to expose some internal functions + + Purely for testing, add --enable-expose-statics option to configure + which converts some static internal functions to be externally visible. -- zz40-xc-ovr.m4: 1.0 interface stabilization +- api: Expose the ares_library_initialized() function + +- ahost: Allow repeated -s options - - Stabilization results in 4 public interface m4 macros: - XC_CONFIGURE_PREAMBLE - XC_CONFIGURE_PREAMBLE_VER_MAJOR - XC_CONFIGURE_PREAMBLE_VER_MINOR - XC_CHECK_PATH_SEPARATOR - - Avoid one level of internal indirection - - Update comments - - Drop XC_OVR_ZZ40 macro + This also removes a potential leak where later -s options would + replace earlier ones without freeing the relevant string. -- zz40-xc-ovr.m4: emit witness message in configure BODY +- Mark unhittable lines - This avoids witness message in output when running configure --help, - while sending the message to config.log for other configure runs. + Add comments for the benefit of the lcov tool, marking + lines that cannot be hit. Typically these are fall-back + protection arms that are already covered by earlier checks, + and so it's not worth taking out the unhittable code (in case + someone changes the code between the two places in future). -- zz40-xc-ovr.m4: truly do version conditional overriding +- ares_set_servers_csv.3: make return type match code + +- bitncmp: update comment to match code behaviour + +- ares_striendstr: fix so non-NULL return can happen - - version conditional overriding - - catch unexpanded XC macros - - fix double words in comments + This looks to have been broken since it was first introduced in 2005 in + commit aba0b775ea30 ("Added ares_getnameinfo which mimics the + getnameinfo API") -- zz40-xc-ovr.m4: fix variable assignment of subshell output bashism +- config_sortlist: free any existing sortlist on (re)alloc failure - Tor Arntsen analyzed and reported the issue. + If we get an allocation failure on 2nd or later entry in the sortlist, the + code would return ENOMEM but still leave the initial entries allocated. + Ensure that *sortlist is set to NULL whenever ENOMEM is returned. + +- ares_dup: clear new channel on failure - URL: http://curl.haxx.se/mail/lib-2013-01/0306.html + If the attempt to transfer IPv6 servers from the old to the new channel + fails, the previous code would still return a channel to the user even though + an error return code was generated. This makes it likely that users would + leak the channel, so explicitly clear the channel in this case. -- zz40-xc-ovr.m4: reinstate strict AC_REQUIRE macro dependencies +- ares_init_options: don't lose init failure + + If (say) init_by_options() fails, the subsequent call to + init_by_defaults() was overwriting the return code with + success. Still call init_by_defaults() regardless, but track + its return value separately -- zz40-xc-ovr.m4: avoid double single-quote usage +- ares_gethostbyname: don't leak valid-but-empty hostent + + If an AF_UNSPEC query gets a valid response to its AAAA query, + but which has no IPv6 addresses in it, then the code chains on to + a A record query. However, the hostent from the AAAA response + was being leaked along the way (because it gets replaced before + the follow-on end_hquery() invocation). -- zz40-xc-ovr.m4: parentheses balancing of 'case' statements +- ares_parse_txt_reply: propagate errors from per-substring loop - m4 quadrigraph shell comment technique allows proper autoconf - parentheses balancing in shell 'case' statements. The presence - of unbalanced parentheses may otherwise trigger expansion bugs. + If we get an allocation failure when processing a particular substring in a + TXT record, that failure is silently lost; fix that by propagating errors from + the inner loop to the outer loop. -- zz40-xc-ovr.m4: internals overhauling +- process_answer: fix things up correctly when removing EDNS option - - Update comments - - Execute commands in subshells - - Faster path separator check - - Fix missing 'test' command - - Rename private macros - - Minimize AC_REQUIRE usage + When a server rejects an EDNS-equipped request, we retry without + the EDNS option. However, in TCP mode, the 2-byte length prefix was + being calculated wrong -- it was built from the answer length rather than + the length of the original request. + + Also, it is theoretically possible that the call to realloc() might change + the data pointed to; to allow for this, qbuf also needs updating. + + (Both these fixes were actually included in a patchset sent on the mailing + list in Oct 2012, but were included with other functional changes that + didn't get merged: + http://c-ares.haxx.se/mail/c-ares-archive-2012-10/0004.shtml) -- zz40-xc-ovr.m4: redirect errors and warnings to stderr +- ares__read_line: clear buf pointer on realloc failure -- configure: use XC_CONFIGURE_PREAMBLE early checks +- ares_expand_name: check for valid bits in label length - Some basic checks we make were placed early enough in generated - configure script when using autoconf 2.5X versions. Newer autoconf - versions expand these checks much further into the configure script, - rendering them useless. Using XC_CONFIGURE_PREAMBLE fixes placement - of early intended checks across all our autoconf supported versions. + The top two bits of the label length indicate whether this is a + label length (00) or an index to a name elsewhere in the message + (11). RFC1035 4.1.4 says that the other possible values for the + top two bits (01, 10) are reserved for future use. -- zz40-xc-ovr.m4: provide XC_CONFIGURE_PREAMBLE macro +Daniel Stenberg (23 Jan 2016) +- [Gregor Jasny brought this change] -- configure: autotools compatibility fixes - step I + Fix typos detected by lintian - Fix proper macro expansion order across autotools versions for - C compiler and preprocessor program checks. + Closes #32 -- configure: fix automake 1.13 compatibility - - Tested with: - - buildconf: autoconf version 2.69 - buildconf: autom4te version 2.69 - buildconf: autoheader version 2.69 - buildconf: automake version 1.13.1 - buildconf: aclocal version 1.13.1 - buildconf: libtool version 2.4 - buildconf: GNU m4 version 1.4.16 +- [Gregor Jasny brought this change] -- ares_private.h: use again memdebug.h instead of curl_memdebug.h + Distribute all man pages -- configure.ac: replace AM_CONFIG_HEADER with AC_CONFIG_HEADERS +- README.cares: s/I/Daniel - automake 1.13 errors if AM_CONFIG_HEADER is used in configure script. + ... and add a pointer to an existing version of the original area 1.1.1 + package.a -- cares-override.m4: provide AC_CONFIG_MACRO_DIR definition conditionally +- read_tcp_data: don't try to use NULL pointer after malloc failure - Provide a 'traceable' AC_CONFIG_MACRO_DIR definition only when using - an autoconf version that does not provide it, instead of what we were - doing up to now of providing and overriding AC_CONFIG_MACRO_DIR for - all autoconf versions. + CID 56884, pointed out by Coverity. We really should make this function + return an error code so that a malloc() failure can return back a major + failure. -- ares_private.h: use curl_memdebug.h instead of memdebug.h +- configure_socket: explicitly ignore return code + + CID 56889 in Coverity pointed out the return code from setsocknonblock() + is ignored, and this added typecast to (void) makes it explicit. -- vc6cares.dsp: add ares_create_query.c and ares_parse_soa_reply.c +- ahost: check the select() return code + + Fixes CID 137189, pointed out by Coverity -- cares-functions.m4: improve gethostname arg 2 data type check +David Drysdale (18 Jan 2016) +- Fix buildconf on platforms using glibtoolize + + Commit c49a87eea538 changed buildconf to only check for + libtoolize, but missed a line -- setup_once.h: HP-UX specific 'bool', 'false' and 'true' definitions. +- Don't exit loop early leaving uninitialized entries - Also reverts commit bceb40095a + Update for commit affc63cba875d. + + The original patch from Gregor Jasny did not have the break + statement; I incorrectly added it to prevent continuing the loop. + However, the later entries in the array would then be left + uninitialized, causing problems for later cleanup. + + So fix to match Gregor's original patch, with apologies. -- configure: check if compiler halts on function prototype mismatch +Daniel Stenberg (18 Jan 2016) +- buildconf: remove check for libtool, it only requires libtoolize -- cares-functions.m4: add gethostname arg 2 data type check and definition +David Drysdale (17 Jan 2016) +- [Gregor Jasny brought this change] -- cares-functions.m4: update thread-safeness detection of getaddrinfo() - - Take in account that POSIX standard Issue 7 drops h_errno support. Now, we also - consider getaddrinfo() to be thread-safe when (_POSIX_C_SOURCE >= 200809L) or - (_XOPEN_SOURCE >= 700) independently of whether h_errno exists or not. + Use libresolv to initialize cares on iPhone targets - Take in account that h_errno might be a modifiable lvalue not defined as - a C preprocessor macro. - -- setup_once.h: HP-UX issue workaround + On iPhone targets like iOS, watchOS or tvOS the file + /etc/resolv.conf cannot be used to configure cares. - Issue: When building a 32bit target with large file support HP-UX - header file may simultaneously provide two different - sets of declarations for sendfile and sendpath functions, one with - static and another with external linkage. Given that we do not use - mentioned functions we really don't care which linkage is the - appropriate one, but on the other hand, the double declaration emmits - warnings when using the HP-UX compiler and errors when using modern - gcc versions resulting in fatal compilation errors. + Instead the resolver library is queried for configuration + values. - Mentioned issue is now fixed as long as we don't use sendfile nor - sendpath functions. + CC: Yury Kirpichev -- setup_once.h: refactor inclusion of and - - Inclusion of these two header files now done in setup_once.h +Daniel Stenberg (17 Jan 2016) +- README: updated to new repo URL -- Header inclusion clean-up +David Drysdale (14 Jan 2016) +- [Lei Shi brought this change] + + Fixing slow DNS lookup issue - Remove header inclusions already done in setup_once.h + This patch is fixing the dns lookup issue due to dummy dns information + of a disconnected adapter(in my case is a bluetooth adapter). I changed + the dns lookup policy to try GetNetworkParams first because the + GetNetworkParams provides the most reliable dns information (lots of + checks were done by system). I also filter out inoperable adapter in + DNS_AdaptersAddresses in case GetNetworkParams fail. -- setup_once.h: HP-UX specific TRUE and FALSE definitions +- Merge pull request #30 from p-push/vs-2015 - Some HP-UX system headers require TRUE defined to 1 and FALSE to 0. + Support Visual Studio 2015 -- ares_timeout.c: fix compiler warning +Oleg Pudeyev (3 Jan 2016) +- [Gisle Vanem brought this change] -- ares_create_query.c: IRIX compilation fix + Support Visual Studio 2015 -- c-ares/nameser.h: add some T_* defines for ns_t_* values +David Drysdale (11 Nov 2015) +- [Andrew Andkjar brought this change] -Daniel Stenberg (7 Nov 2012) -- Revert "ares_parse_aaaa_reply: fix memory leak" + added another version case to Makefile.msvc - This reverts commit 50f25d8a4b2d16f4c5e0ef620238688b7a315c7a. + nmake version 11.00.61030.0 resolves to CC_VERS_NUM = 110 -- ares_parse_aaaa_reply: fix memory leak +- Merge pull request #26 from bitbouncer/vs-2013 - an allocated buffer was not freed in the successful case. + added define for visual studio 2013 -- [Gisle Vanem brought this change] +svante karlsson (25 Jun 2015) +- added define for visual studio 2013 - adig: perror() doesn't work for socket errors on windows - - ... so print the SOCKERRNO instead +Jakub Hrozek (6 Nov 2014) +- ares__read_line: free buf on realloc failure -- get_DNS_AdaptersAddresses: fix IPv6 parsing - - Use of the wrong define made the function not parse IPv6 addresses - properly. +- Destroy options if ares_save_options fails - Bug: http://c-ares.haxx.se/mail/c-ares-archive-2012-06/0028.shtml - Reported by: Saúl Ibarra Corretgé + It's possible that, if ares_save_options failed, the opts structure + would contain some allocated memory. Calling ares_destroy_options in + this case is safe, because ares_save_options zeroes out the memory + initially. -- version: bumped to 1.10.0 - - Due to the newly added function: ares_create_query() +- [David Drysdale brought this change] -- AUTHORS: synced with 83093ac450 + Continue loop if space for hostname not large enough - Added 21 authors since this document was last updated + When attempting to build a search domain from the local hostname + (used as a fallback when no other methods have given a search + domain), the code doubles the buffer size on each loop iteration. + + However, the loop previously had a WHILE_FALSE terminator so the continue + statement exited the loop rather than going round again. -- ares_create_query.3: mention when this is added +Daniel Stenberg (30 Oct 2014) +- ares_getnameinfo.3: there is no ares_getaddrinfo -- [hpopescu@ixiacom.com brought this change] +David Drysdale (30 Sep 2014) +- [Gregor Jasny brought this change] - Added new feature (rfc2671) + Prevent tmpbuf from overrunning + + Fix Coverity error CID 56886. + + Signed-off-by: Gregor Jasny -- code police: fix indents, < 80 columns, reflowed comments +- [Gregor Jasny brought this change] -Guenter Knauf (11 Jul 2012) -- Cleaned up version awk script. + Re-start loop if select fails + + Fix Coverity error CID 56882 + + Signed-off-by: Gregor Jasny -Daniel Stenberg (30 Jun 2012) -- [Gisle Vanem brought this change] +- [Gregor Jasny brought this change] - read_udp_packets: bail out loop on bad sockets + Free temporary variable in error path - I can see that recvfrom() in ares_process.c many times is called with - 'udp_socket' == ARES_SOCKET_BAD. The code takes care not to call - recv/recvfrom with ARES_SOCKET_BAD in the outer-loop. So should the - inner-loop. - -Yang Tse (29 Jun 2012) -- cares-compilers.m4: remove -Wstrict-aliasing=3 from clang + Fix Coverity CID 56890 - Currently it is unknown if there is any version of clang that - actually supports -Wstrict-aliasing. What is known is that there - are several that don't support it. - -- cares-compilers.m4: -Wstrict-aliasing=3 for warning enabled gcc and clang builds + Signed-off-by: Gregor Jasny -Daniel Stenberg (18 Jun 2012) -- version: work towards 1.9.2 (at least) +- [Gregor Jasny brought this change] -Version 1.9.1 (18 Jun 2012) + Fix integer shift overflow if both tcp_socket and udp_socket are set + + The problem occurs if at the start of the loop the sockindex is at the + last valid ARES_GETSOCK_MAXNUM position. If then both udp_socket and + tcp_socket are valid, sockindex gets incremented for UDP first and + points one entry behind the array for the tcp block. + So the fix is to check after every increment of sockindex if it is still + valid. + + Fix Coverity error CID 56878 + + Signed-off-by: Gregor Jasny -Daniel Stenberg (18 Jun 2012) -- RELEASE-NOTES: 1.9.1 coming up +- [Gregor Jasny brought this change] -Version 1.9.0 (16 Jun 2012) + Null check before dereference + + Fix Coverity error CID 56880 + + Signed-off-by: Gregor Jasny -Daniel Stenberg (16 Jun 2012) -- ares_version.h: next version is 1.9.0 +Jakub Hrozek (28 Jul 2014) +- [Gisle Vanem brought this change] -- [Marko Kreen brought this change] + Comment in ares_ipv6.h - ares_data.h: ARES_DATATYPE_SOA_REPLY is added in 1.9.0 +David Drysdale (25 Jul 2014) +- CONTRIBUTING: add file to indicate mailing list is preferred -- RELEASE-NOTES: synced with 979bf951d +- Add -t u option to ahost - Next release deemed to become 1.9.0 due to the new function - -- [Marko Kreen brought this change] + Add an option to allow specification of the AF_UNSPEC + address family. - SOA parser added +Jakub Hrozek (24 Jul 2014) +- host_callback: Fall back to AF_INET on searching with AF_UNSPEC - I need to do SOA queries, so here is a parser for them. + Previously, when an ares_gethostbyname() searched with AF_UNSPEC and the + first AF_INET6 call only returned CNAMEs, the host_callback never + retried AF_INET. - - ares_soa_reply: new struct - - ares_malloc_data/ares_free_soa: ARES_DATATYPE_SOA_REPLY - - ares_parse_soa_reply: actual function - -Yang Tse (14 Jun 2012) -- Kill compiler warning - -- Fix libcares.pc generation for static MingW* cross builds + This patch makes sure than on ARES_SUCCESS, the result of AF_INET6 is + taken as authoritative only if the result contains some addresses. -Daniel Stenberg (21 May 2012) -- [Nick Alcock brought this change] +- [David Drysdale brought this change] - Fix UDP and TCP port byte order in saved options. + Move memset call below platform-specific declarations - The UDP and TCP port are stored in network byte order in the - ares_channeldata, but are passed in to ares_init_options() in host byte - order. Thus we must return them from ares_save_options() in host byte - order too, or a duplicated channel will convert them again, leading to a - nonfunctional channel and a mysterious connection refused error from - ares_gethostbyname(). This breaks ares_dup(), thus the curl easy API - when c-ares is used by curl, and thus all the curl easy API's users. - -Yang Tse (28 Apr 2012) -- version: start working on 1.8.1-DEV + A GitHub commenter [1] says that my recent change to ahost.c has + problems compiling on Windows + C89 platforms. + + [1] https://github.com/bagder/c-ares/commit/ee22246507c9#commitcomment-6587616 -Version 1.8.0 (27 Apr 2012) +- [David Drysdale brought this change] -Daniel Stenberg (27 Apr 2012) -- RELEASE-NOTES: call next 1.8 instead + Update ahost man page to describe -s option. - Since we added a function, let's use a stricter bumping scheme + Commit ee22246507c9 added the -s option to the + ahost command, but neglected to update the man page to + describe it. + + Also fix typo in description of -t option. -Yang Tse (25 Apr 2012) -- INSTALL: some adjustments +- ares_parse_soa_reply: Do not leak rr_name on allocation failure + + If ares_malloc_data failed, already allocated rr_name would go out of + scope. -Daniel Stenberg (25 Apr 2012) -- GIT-INFO: mention buildconf +- [David Drysdale brought this change] -Yang Tse (25 Apr 2012) -- INSTALL: remove more sections that don't apply to c-ares + Don't override explicitly specified search domains + + Only set search domains from /etc/resolv.conf if there isn't a value + already present in the channel. -- ares_timeout.c: fix compiler warning +- [David Drysdale brought this change] -Daniel Stenberg (25 Apr 2012) -- [Ben Noordhuis brought this change] + Allow specification of search domain in ahost + + Add the "-s domain" command line option to override the search + domains. - Makefile.m32: fix mingw32 build +Daniel Stenberg (12 May 2014) +- Revert "ares_parse_aaaa_reply: fix leak when reply contains 1 alias and no address" - * add . to include path so ares_build.h is picked up - * make ar configurable to ease cross-compiling + This reverts commit 440110b303fdbfadb3ad53d30eeb98cc45d70451. -- RELEASE-NOTES: added what's happened since 1.7.5 +- [Frederic Germain brought this change] -Guenter Knauf (22 Apr 2012) -- Updated copyright year. + ares_parse_aaaa_reply: fix leak when reply contains 1 alias and no address -Yang Tse (21 Apr 2012) -- ares_init.c: Further refactoring of Windows system's DNS fetching code +- [Doug Kwan brought this change] -Guenter Knauf (20 Apr 2012) -- Android: small changes to dns property part. + ares_build.h: fix building on 64-bit powerpc - Prefix prop vars; kill var; use DNS_PROP_NAME_PREFIX macro. - -- Handle CNAME-only in ares_parse_aaaa_reply(). + There are two issues. - posted to the c-ares list by Peter Griess . - -- Add support for multiple DNS servers on Android. + 1. gcc actually does not use __ppc__ and __ppc64__ but __PPC__ and + __PPC64__. The tests of __ILP32__ and __LP64__ are sufficient for gcc. - Before, c-ares always used the first DNS server on Android, causing - network problems if this DNS server was not available. + 2. clang defines __GNU__ and defines both __ppc64__ and __ppc__ when + targeting ppc64. This makes CARES_SIZEOF_LONG to be 4 on a ppc64 system + when building with clang. - Signed-off-by: Geert Uytterhoeven - -- Added INSTALL so it gets into tarballs. - -- Added some more ifdefs to silent compiler warnings. + My patch is two change the order of the checks so that we check the + 64-bit case first. -Yang Tse (17 Apr 2012) -- INSTALL: remove a non c-ares section +- refresh: updated now with automake 1.14 -- cares-compilers.m4: -Wno-pedantic-ms-format for Windows gcc 4.5 builds - - When building a Windows target with gcc 4.5 or newer and strict compiler - warnings enabled use -Wno-pedantic-ms-format in addition to other flags. +- [David Drysdale brought this change] -- setup_once.h: tighten requirements for stdbool.h header inclusion + single_domain: Invalid memory access for empty string input - Include stdbool.h only when it is available and configure is capable of - detecting a proper 'bool' data type when the header is included. + We noticed a small buglet in ares_search() when it gets an empty string + as input -- the single_domain() utility function in ares_search.c + accesses invalid memory (before the start of the string). -- configure: NATIVE_WINDOWS no longer defined in config file +Guenter Knauf (31 Aug 2013) +- Fixed warning 'type specifier missing'. -- cares-compilers.m4: double underscore decoration for visibility attribute +Daniel Stenberg (30 Aug 2013) +- [Tor Arntsen brought this change] -- build adjustments: CARES_SYMBOL_HIDING no longer defined in config files + ares_rules.h: CARES_SIZEOF_LONG doesn't exist anymore, don't test for it - configure script now provides conditional definitions for Makefile.am - that result in CARES_SYMBOL_HIDING being defined by resulting makefiles - when appropriate. + It was removed in f19387dd72432 -- configure: Windows cross-compilation fixes +- nowarn: use instead of configure for size of long - CARES_BUILDING_LIBRARY and CARES_STATICLIB no longer defined in ares_config.h, - configure will generate appropriate conditionals so that mentioned symbols - get defined and used in Makefile derived from Makefile.am at compilation time. + This makes the header file much more multi-arch friendly and can be used + as-is with both 32 bit and 64 bit builds. -Guenter Knauf (17 Apr 2012) -- Added INSTALL file adapted from libcurl. +- timeoffset: made static and private - Not yet ready, and needs further edits. + ares__timeoffset() was only used once within this single source file -Yang Tse (16 Apr 2012) -- ares_init.c: get_iphlpapi_dns_info() refactoring +- timeadd: make static + + ares__timeadd() was only ever used from within the same source -Guenter Knauf (16 Apr 2012) -- Kill some more compiler warnings. +Yang Tse (18 Jul 2013) +- xc-am-iface.m4: comments refinement -- Kill compiler warning about unused var. +- configure: fix 'subdir-objects' distclean related issue + + See XC_AMEND_DISTCLEAN comments for details. -- Fixed my last commit: wrong preprocessor directive. +- configure: automake 1.14 compatibility tweak (use XC_AUTOMAKE) -- Check for __ANDROID__ in addition to ANDROID macro. +- xc-am-iface.m4: provide XC_AUTOMAKE macro -- Check for __ANDROID__ in addition to ANDROID macro. - - Posted to c-ares list by Wayne. +Daniel Stenberg (12 May 2013) +- gitignore: ignore all ares_*pdf but also CHANGES.dist -- Fix for Android to disable useless arpa/nameser.h. +- bump: start working towards 1.10.1 -- Fix for Android to include sys/select.h for fd_set. +Version 1.10.0 (12 May 2013) -Yang Tse (17 Mar 2012) -- ares_data.c: some NAPTR related fixes +Daniel Stenberg (12 May 2013) +- RELEASE-NOTES: two more bug fixes -Daniel Stenberg (16 Mar 2012) -- port numbers: convert them to network order! - - When the config options ARES_OPT_UDP_PORT or ARES_OPT_TCP_PORT are used, - make sure to convert them to network byte order! - - Bug: http://c-ares.haxx.se/mail/c-ares-archive-2012-02/0004.shtml +- [Keith Shaw brought this change] -- white space cleanup - - - Keep code within 80 columns + ares_set_servers_csv: fixed IPv6 address parsing - - Removed funny spaces after open paren and before closing paren - -- [Poul Thomas Lomholt brought this change] + Fixed bug that caused the last part of an IPv6 address to be parsed as + the port number when the last part is all numeric. - get_iphlpapi_dns_info: fix buffer overrun - - I experienced a buffer overrun exception in c-ares on Windows and - tracked it down to be an error in the calculation of the 'left' variable - in get_iphlpapi_dns_info(). +- nroff: fix two syntax mistakes - I changed the variable type of 'left' to a _signed_ type because of the - subtraction arithmetic; not sure if a long is the best choice - -- Merge pull request #7 from saghul/naptr + ares_parse_a_reply and ares_parse_aaaa_reply both had two \fB instead of + \fP - Added support for parsing NAPTR records - -saghul (23 Feb 2012) -- Added support for parsing NAPTR records - -Yang Tse (19 Jan 2012) -- ares_init.c: fix compiler warning on winsock builds + Reported-by: Alexander Klauer + Bug: http://c-ares.haxx.se/mail/c-ares-archive-2013-03/0010.shtml -- configure: libtool 1.5 tweaks +- [Alex Loukissas brought this change] -Daniel Stenberg (19 Dec 2011) -- ares_timeout.3: fix the NAME section - - It was clearly a copy n' paste error + build: fix build on msvc11 -Yang Tse (27 Sep 2011) -- [Albert Chin brought this change] +- Makefile.am: increment -version-info for 1.10.0 release - configure - m4: make CURL_CHECK_DEF ignore leading whitespace on symbol def - - When using Sun C compiler the preprocessor somehow inserts an extra space - in front of replaced symbol, breaking CURL_CHECK_DEF macro. To workaround - this, macro CURL_CHECK_DEF now ignores all leading whitespace in front of - symbol substitution result. +- README: remove unnecessary comment -- ares_init.c: fix segfault triggered in ares_init_options() upon previous - failure of init_by_defaults() and incomplete cleanup there. +- ares_version.h: copyright end range year is now 2013 -- ares_process.c: fix compiler warning +- RELEASE-NOTES: synced with fb0737f3a0a1c37 -- fix MSVC compiler warning 'conditional expression is constant' +- [Paul Saab brought this change] -- setup_once.h cleanup and sync + ares_parse_aaaa_reply: Plug memory leak + + This change is similar to ares_parse_a_reply.c in commit + bffd67f16a8f42fe6dbf79ab2e39d92eea05c8a6 -- [Denis Bilenko brought this change] +- [Patrick Valsecchi brought this change] - ares_getnameinfo: fix random results with c-ares 1.7.5 + ares_parse_txt_reply: return a ares_txt_reply node for each sub-string - In ares_getnameinfo memcpy did not copy enough bytes, causing - it to return arbitrary memory contents as a result. + Previously, the function would wrongly return all substrings merged into + one. -- warnings: fix another 'conversion may lose significant bits' compiler warning +- [Alexander Klauer brought this change] -- ares_dns.h: adjust DNS__16BIT and DNS__32BIT macro definitions + library init: documentation update - Fixing compiler warnings existing definitions triggered on these. + This commit updates the documentation of ares_library_init() and + ares_library_cleanup() with regard to the newly introduced reference + counting of initializations and deinitializations. -- ares_destroy.c: fix segfault in ares_destroy_options() +- [Alexander Klauer brought this change] -Daniel Stenberg (21 Aug 2011) -- ares_parse_srv_reply: silence compiler warnings + library init: be recursive - ... by adding ugly typecasts. + Previously, a single call to ares_library_cleanup() would deinitialise + the c-ares library, regardless of how many times ares_library_init() was + called. This behaviour may cause problems in programs linking two or + more libraries which, in turn, use c-ares. The present commit fixes this + problem, deinitializing the library only after a number of calls to + ares_library_cleanup() matching the number of calls to + ares_library_init(). + +- [Patrick Valsecchi brought this change] -- CHANGES: generate from script + protocol parsing: check input data stricter - The CHANGES file is now generated automatically with 'git2changes.pl', - invoked by the maketgz script which is used to build release archives. + ... so that bad length fields aren't blindly accepted - The former human edited CHANGES file was renamed to CHANGES.0 in git. - -Yang Tse (21 Aug 2011) -- Makefile.netware: SIZEOF_SHORT definition + Bug: http://c-ares.haxx.se/mail/c-ares-archive-2013-04/0016.shtml -- warnings: fix some 'conversion may lose significant bits' compiler warnings +Guenter Knauf (11 Apr 2013) +- Create ares_build.h when buidling from Git. -- configure: fix symbol hiding usability check +- Added -DCARES_STATICLIB to CFLAGS. - A more thorough test is done now in order to determine visibility attribute - usability, given that some compilers don't support visibility attribute on - all configurations. - -Daniel Stenberg (16 Aug 2011) -- 1.7.6: start working... + Currently this static makefile does only support building the + static library libcares.a. -Version 1.7.5 (16 Aug 2011) +Daniel Stenberg (8 Apr 2013) +- [Alexander Klauer brought this change] -Daniel Stenberg (16 Aug 2011) -- CHANGES: synced for 1.7.5 release + .gitignore: ignore patch files + + This commit adds a line to .gitignore to the effect that patch files + generated by 'git format-patch' are excluded from the repository. -- RELEASE-NOTES: synced with bb4096effef7f000 +- [Alexander Klauer brought this change] -Jakub Hrozek (15 Aug 2011) -- Only fall back to AF_INET searches when looking for AF_UNSPEC addresses + ares_destroy() documentation: no new requests + + Clarify that no new requests may be added to a resolver channel that is + currently being destroyed. -Yang Tse (10 Aug 2011) -- [Gisle Vanem brought this change] +- [Alexander Klauer brought this change] - ares_iphlpapi.h: Watcom C fix + Documentation: properly document ARES_ECANCELLED - Added "!defined(_WS2DEF_)" since Watcom doesn't have - a per type guard for the typedefs 'CSADDR_INFO' (that MingW has) or - 'SOCKET_ADDRESS' (that MSVC has). But we can use the header-guard for - instead. + This commit clarifies the behaviour of ares_cancel() with respect to + callbacks and adds missing documentation of ARES_ECANCELLED to the man + pages of the affected functions. -- [Gisle Vanem brought this change] +- [Alexander Klauer brought this change] + + ares_cancel(): cancel requests safely + + An invocation of ares_cancel() walks through the request list, calling + the callbacks of all pending requests on a channel. Previously, if such + a callback added a new request to the channel, the request list might + not end up empty, causing an abort by assertion failure. The present + commit ensures that precisely all requests present upon entry of + ares_cancel() are cancelled, and that adding new requests through + callbacks is safe. - Makefile.Watcom: - * The 'NTDDI_VERSION' needs to be raised to 0x05010000 - in order for SOCKADDR_STORAGE etc. to be typedefed. - * Replaced '-dUSE_WATT32' with '-dWATT32'. - * Added $(DEMOS) to the 'all' target and removed the 'demos' - target to be consistent with e.g. Makefile.msvc etc. - * 'ENABLE_IPV6' is no longer used. Hence removed the '%use_ipv6' construct. - * object-file order seems to be important (Watcom v.19). Hence - 'ares_getopt.obj' must be put after the .obj that references getopt(). +Yang Tse (10 Mar 2013) +- ares.h: stricter CARES_EXTERN linkage decorations logic + + No API change involved. -- cares-compilers.m4: CARES_CONVERT_INCLUDE_TO_ISYSTEM adjustments +- ares_build.h.dist: enhance non-configure GCC ABI detection logic + + GCC specific adjustments: - Add CARES_CHECK_COMPILER as a requirement. + - check __ILP32__ before 32 and 64bit processor architectures in + order to detect ILP32 programming model on 64 bit processors + which, of course, also support LP64 programming model, when using + gcc 4.7 or newer. - Ensure macro does nothing unless GNU_C or CLANG compiler is used. + - keep 32bit processor architecture checks in order to support gcc + versions older than 4.7 which don't define __ILP32__ - This should allow usage of this macro in unforeseen placements. + - check __LP64__ for gcc 3.3 and newer, while keeping 64bit processor + architecture checks for older versions which don't define __LP64__ + +Daniel Stenberg (9 Mar 2013) +- ares.h: there is no ares_free_soa function -- config-win32.h: comments adjustments - followup +Yang Tse (9 Mar 2013) +- Makefile.am: empty AM_LDFLAGS definition for automake 1.7 compatibility -- config-win32.h: comments adjustments +- ares_inet_ntop.3: s/socklen_t/ares_socklen_t -Daniel Stenberg (5 Aug 2011) -- [Tom Hughes brought this change] +- configure: use XC_LIBTOOL for portability across libtool versions - ares_parse_a_reply: fix memleak +- xc-lt-iface.m4: provide XC_LIBTOOL macro -Yang Tse (29 Jul 2011) -- cares-functions.m4 serial # bump +- Makefile.am: use AM_CPPFLAGS instead of INCLUDES -- Revert "configure: additional flag checks for fcntl() and socket()" - - This reverts commit 5f2a3b0e48f26d24cb1fefea0dccb92d417dcbf7. +- inet_ntop.c: s/socklen_t/ares_socklen_t -- configure: additional flag checks for fcntl() and socket() +- inet_ntop.c: s/socklen_t/ares_socklen_t for portability -- xc-translit.m4 fix quoting +Daniel Stenberg (19 Feb 2013) +- ares.h: s/socklen_t/ares_socklen_t for portability -- configure: avoid direct usage of AS_TR_* macros +- ares_inet_ntop.3: 4th argument is socklen_t! -- xc-translit.m4 provides transliteration macros with well defined behavior. +- spell inet correctly! -Jakub Hrozek (15 Jun 2011) -- Revert "Only fall back to AF_INET searches when looking for AF_UNSPEC addresses" - - This reverts commit b5823d65706af687c0e5110af8f0cfdcd068997d. +- ares_inet_pton/ntop: cleanup - This patch was not reviewed properly before pushing - -- Revert "Do not use sized constants in public headers" + Make sure that the symbols are always exported and present in c-ares. - This reverts commit 22c01e96f7b2ae9923e1baa50bfe3c0d22297a7d. + Make the headers prefixed with 'ares'. - This is a Red Hat specific patch that does not belong into upstream - -- Use correct sizeof in ares_getnameinfo() - -- Do not leak rr_name on failures inside ares_parse_ptr_reply - -- Do not leak rr_name on failures inside ares_parse_a_reply - -- Do not leak rr_name on failures inside ares_parse_aaaa_reply - -- Do not leak rr_name on failures inside ares_parse_ns_reply + Removed the inet_ntop.h version as it no longer features any content. -- Fix incorrect sizeof() in ares_save_options +- ares_inet_ntop/ares_inet_pton: added man pages -- Fix incorrect allocation in ares_parse_ptr_reply() +Yang Tse (15 Feb 2013) +- [Gisle Vanem brought this change] -- Only fall back to AF_INET searches when looking for AF_UNSPEC addresses + curl_setup_once.h: definition of HAVE_CLOSE_S defines sclose() to close_s() -- Do not use sized constants in public headers +- [Gisle Vanem brought this change] -Daniel Stenberg (13 Jun 2011) -- [Jakub Hrozek brought this change] + config-dos.h: define HAVE_CLOSE_S for MSDOS/Watt-32 - ares_free_hostent(NULL) should be a noop +- [Gisle Vanem brought this change] -Yang Tse (8 Jun 2011) -- configure: fix recvfrom 5th arg type qualifier detection (followup) + config-dos.h: define strerror() to strerror_s_() for High-C -- configure: fix recvfrom 5th arg type qualifier detection +Daniel Stenberg (13 Feb 2013) +- ares_get_datatype: removed unused function - Additionally remove whitespace from EOL + it was also wrongly named as internal functions require two underscores -Daniel Stenberg (4 Jun 2011) -- strlen: use size_t to receive the return +- ares__bitncmp: use two underscores for private functions + + It used a single one previously making it look like a public one -Yang Tse (4 Jun 2011) -- xlc: avoid preprocessor definition usage when linking +- ares__generate_new_id: moved to ares_query.c + + ... and ares__rc4 is turned into a local static function. -- ares_nowarn: icc 9.1 workaround +- ares__swap_lists: make private and static + + ... since there's only one user, make it static within ares_process.c -- ares_nowarn: header inclusion fix +Yang Tse (13 Feb 2013) +- Makefile.msvc: add four VS version strings -- ares_init: make ares_private.h last included header again +Daniel Stenberg (13 Feb 2013) +- ares_expand_name.3: clarify how to free the data -- compiler warning: fix +Yang Tse (30 Jan 2013) +- zz40-xc-ovr.m4: fix 'wc' detection - follow-up 2 - Fix compiler warning: conversion may lose significant bits + - Fix a pair of single quotes to double quotes. + + URL: http://curl.haxx.se/mail/lib-2013-01/0355.html + Reported by: Tor Arntsen -- compiler warning: fix +- zz40-xc-ovr.m4: fix 'wc' detection - follow-up - Fix compiler warning: variable was set but never used + - Take into account that 'wc' may return leading spaces and/or tabs. - Fix compiler warning: clobber ignored - -- ares_iphlpapi: fix compiler warnings + - Set initial IFS to space, tab and newline. -- winsock: compilation fixes +- zz40-xc-ovr.m4: fix 'wc' detection + + - Take into account that 'wc' may return leading spaces. + + - Set internationalization behavior variables. + + Tor Arntsen analyzed and reported the issue. - Provide winsock iphlpapi alternative definitions to prevent compilation - failures when using a variety of winsock header implementations. + URL: http://curl.haxx.se/mail/lib-2013-01/0351.html -Daniel Stenberg (17 May 2011) -- [David Stuart brought this change] +- zz40-xc-ovr.m4: check another three basic utilities - IPv6-on-windows: find DNS servers correctly +- zz40-xc-ovr.m4: 1.0 interface stabilization + + - Stabilization results in 4 public interface m4 macros: + XC_CONFIGURE_PREAMBLE + XC_CONFIGURE_PREAMBLE_VER_MAJOR + XC_CONFIGURE_PREAMBLE_VER_MINOR + XC_CHECK_PATH_SEPARATOR + - Avoid one level of internal indirection + - Update comments + - Drop XC_OVR_ZZ40 macro -- man pages: docs for the c-ares utility programs +- zz40-xc-ovr.m4: emit witness message in configure BODY + + This avoids witness message in output when running configure --help, + while sending the message to config.log for other configure runs. -- ares_parse_ns_reply.c: remove CVSism +- zz40-xc-ovr.m4: truly do version conditional overriding + + - version conditional overriding + - catch unexpanded XC macros + - fix double words in comments -Yang Tse (27 Mar 2011) -- build: fix header inclusion +- zz40-xc-ovr.m4: fix variable assignment of subshell output bashism + + Tor Arntsen analyzed and reported the issue. + + URL: http://curl.haxx.se/mail/lib-2013-01/0306.html -- getservbyport replacement for Win CE +- zz40-xc-ovr.m4: reinstate strict AC_REQUIRE macro dependencies -- renamed getplatform() to ares__getplatform() to avoid namespace pollution +- zz40-xc-ovr.m4: avoid double single-quote usage -- configure: fix libtool warning +- zz40-xc-ovr.m4: parentheses balancing of 'case' statements - Recent versions of libtool are now tracing usage of AC_CONFIG_MACRO_DIR - macro and warn heavily when not used in configure script along with - ACLOCAL_AMFLAGS in Makefile.am. So in order to make libtool happy - while keeping backwards compatibility this is added. + m4 quadrigraph shell comment technique allows proper autoconf + parentheses balancing in shell 'case' statements. The presence + of unbalanced parentheses may otherwise trigger expansion bugs. -- adig: RFC4034 resource record type detection +- zz40-xc-ovr.m4: internals overhauling - Can be tested with: adig -s 8.8.8.8 -t ANY example.com + - Update comments + - Execute commands in subshells + - Faster path separator check + - Fix missing 'test' command + - Rename private macros + - Minimize AC_REQUIRE usage -- nameser.h: RFC4034 resource record type definitions +- zz40-xc-ovr.m4: redirect errors and warnings to stderr -- build: move platform stuff to ares_platform.c and ares_platform.h +- configure: use XC_CONFIGURE_PREAMBLE early checks + + Some basic checks we make were placed early enough in generated + configure script when using autoconf 2.5X versions. Newer autoconf + versions expand these checks much further into the configure script, + rendering them useless. Using XC_CONFIGURE_PREAMBLE fixes placement + of early intended checks across all our autoconf supported versions. -- build: find out windows platform using GetVersionEx() +- zz40-xc-ovr.m4: provide XC_CONFIGURE_PREAMBLE macro -- build: use getenv() replacement function for systems which lack it +- configure: autotools compatibility fixes - step I + + Fix proper macro expansion order across autotools versions for + C compiler and preprocessor program checks. -- setup_once: system error codes for Windows CE +- configure: fix automake 1.13 compatibility + + Tested with: + + buildconf: autoconf version 2.69 + buildconf: autom4te version 2.69 + buildconf: autoheader version 2.69 + buildconf: automake version 1.13.1 + buildconf: aclocal version 1.13.1 + buildconf: libtool version 2.4 + buildconf: GNU m4 version 1.4.16 -- ares_search: use ERRNO macro for portability sake +- ares_private.h: use again memdebug.h instead of curl_memdebug.h -- System's errno.h inclusion cleanup follow-up. +- configure.ac: replace AM_CONFIG_HEADER with AC_CONFIG_HEADERS - System's errno.h is conditionally included from setup_once.h + automake 1.13 errors if AM_CONFIG_HEADER is used in configure script. -- Windows CE specific adjustment +- cares-override.m4: provide AC_CONFIG_MACRO_DIR definition conditionally - All versions of Windows CE support Winsock 1.1 + Provide a 'traceable' AC_CONFIG_MACRO_DIR definition only when using + an autoconf version that does not provide it, instead of what we were + doing up to now of providing and overriding AC_CONFIG_MACRO_DIR for + all autoconf versions. -- System's errno.h inclusion cleanup. - - System's errno.h is conditionally included from setup_once.h +- ares_private.h: use curl_memdebug.h instead of memdebug.h -- ares_init: fix gethostname error detection on winsock platforms +- vc6cares.dsp: add ares_create_query.c and ares_parse_soa_reply.c + +- cares-functions.m4: improve gethostname arg 2 data type check -- configure: r-enable temporarily disabled detection of system's inet_ntop() +- setup_once.h: HP-UX specific 'bool', 'false' and 'true' definitions. - Detection was temporarily disabled in commit 674e044ccb21f2f63537da53565fce868f + Also reverts commit bceb40095a -Daniel Stenberg (15 Mar 2011) -- configure: stop using the deprecated AM_INIT_AUTOMAKE syntax +- configure: check if compiler halts on function prototype mismatch -- [Gisle Vanem brought this change] +- cares-functions.m4: add gethostname arg 2 data type check and definition - Watt-32: use errno +- cares-functions.m4: update thread-safeness detection of getaddrinfo() - Make sure Watt-32 programs use 'errno' even on Win32 targets - -Guenter Knauf (18 Feb 2011) -- Removed commented CLFAGS no longer needed. + Take in account that POSIX standard Issue 7 drops h_errno support. Now, we also + consider getaddrinfo() to be thread-safe when (_POSIX_C_SOURCE >= 200809L) or + (_XOPEN_SOURCE >= 700) independently of whether h_errno exists or not. + + Take in account that h_errno might be a modifiable lvalue not defined as + a C preprocessor macro. -- Fixed CFLAGS for NetWare. +- setup_once.h: HP-UX issue workaround + + Issue: When building a 32bit target with large file support HP-UX + header file may simultaneously provide two different + sets of declarations for sendfile and sendpath functions, one with + static and another with external linkage. Given that we do not use + mentioned functions we really don't care which linkage is the + appropriate one, but on the other hand, the double declaration emmits + warnings when using the HP-UX compiler and errors when using modern + gcc versions resulting in fatal compilation errors. - Added -m32 to enable compilation with x86_64 compilers; - added conditional to set -fpcc-struct-return only for gcc compiler. + Mentioned issue is now fixed as long as we don't use sendfile nor + sendpath functions. -Daniel Stenberg (18 Feb 2011) -- [Gisle Vanem brought this change] +- setup_once.h: refactor inclusion of and + + Inclusion of these two header files now done in setup_once.h - Watt32: fix server init +- Header inclusion clean-up - Somewhere in the process, programs using the Watt-32 tcp/ip stack - stopped working. - -- [Dima Tisnek brought this change] + Remove header inclusions already done in setup_once.h - config_sortlist: (win32) missing else +- setup_once.h: HP-UX specific TRUE and FALSE definitions - Without an else there, contents of "pat" that could have been - successfully set just above, may be clobbered by successive unsuccessful - calls to "xxx_pton" or "ip_addr". - -Yang Tse (17 Jan 2011) -- Makefile.msvc: add a couple of VS version strings + Some HP-UX system headers require TRUE defined to 1 and FALSE to 0. -- Makefile.msvc: add a couple of VS version strings +- ares_timeout.c: fix compiler warning -- build: add install target to Makefile.msvc +- ares_create_query.c: IRIX compilation fix -Daniel Stenberg (27 Dec 2010) -- ares_set_servers_csv: remove unused variables +- c-ares/nameser.h: add some T_* defines for ns_t_* values -- init_by_resolv_conf: fix compiler warnings +Daniel Stenberg (7 Nov 2012) +- Revert "ares_parse_aaaa_reply: fix memory leak" - The code received the return codes in the 'status' variable without - using it. Instead we just ignore those particular errors. - -- getv4: Value stored to 'dst' is never read + This reverts commit 50f25d8a4b2d16f4c5e0ef620238688b7a315c7a. -- advance_tcp_send_queue: avoid NULL ptr dereference +- ares_parse_aaaa_reply: fix memory leak - If given a too large 'num_bytes' value, it would cause a NULL ptr - dereference. Instead the code will now break out of the loop at the end - of the list. - -- [Peter Pentchev brought this change] + an allocated buffer was not freed in the successful case. - configure: fix a bashism +- [Gisle Vanem brought this change] -- cleanup: avoid unsafe typecasts + adig: perror() doesn't work for socket errors on windows - Avoid the risk of reading 16bit data from an unaligned address by using - a macro that is adapted for this. - -- [Stefan Bühler brought this change] - - ares_expand_name: Fix encoded length for indirect root - -Yang Tse (18 Dec 2010) -- build: add some explicit file references to VS project files - -- config-win32: provide HAVE_ASSERT_H definition - -- build: include ares_nowarn in sample program VS project files - -- build: include ares_nowarn among SAMPLESOURCES and SAMPLEHEADERS + ... so print the SOCKERRNO instead -- configure: temporarily disable detection of system's inet_ntop() +- get_DNS_AdaptersAddresses: fix IPv6 parsing - This is done to allow compilation of ares_inet_ntop() by some daily - builds picky compilers that otherwise do not need this function. - -- changes: mention last fix - -- ares_inet_ntop: remove definition and usage of macro SPRINTF + Use of the wrong define made the function not parse IPv6 addresses + properly. - Existing definition of SPRINTF always resulted in sprintf() being used, - and sprintf() returning 'int' is already used throughout the library. + Bug: http://c-ares.haxx.se/mail/c-ares-archive-2012-06/0028.shtml + Reported by: Saúl Ibarra Corretgé -- ares_inet_ntop: reapply changes from previous c-ares version (III) +- version: bumped to 1.10.0 - - Replace 'u_char' with 'unsigned char'. - - Replace 'u_int' with 'unsigned int'. - - use macros ERRNO and SET_ERRNO() for errno handling. + Due to the newly added function: ares_create_query() -- ares_inet_ntop: reapply changes from previous c-ares version (II) +- AUTHORS: synced with 83093ac450 - - Remove rcsid. - - Adjust header file inclusions. - - ares_inet_ntop used only on systems without a proper inet_ntop function. + Added 21 authors since this document was last updated -- ares_inet_ntop: reapply changes from previous c-ares version (I) - - - Replace tabs with spaces. - - Use ANSI C style for function declarations and definitions. - - Use sizeof with parentheses. +- ares_create_query.3: mention when this is added -- ares_inet_ntop: fix off by one error triggering out of bounds write - - ares_inet_ntop would trigger an out of bounds write when the representation - of the address required 15 characters, due to not taking in account null - termination character. - - Full import of inet_ntop.c from bind-9.5.3rc1 to pull additional fixes. +- [hpopescu@ixiacom.com brought this change] -- ares_nowarn: add conditional inclusion of assert.h header + Added new feature (rfc2671) -- fix compiler warning: conversion may lose significant bits +- code police: fix indents, < 80 columns, reflowed comments -- ares_inet_net_pton: fix non-rejection of some malformed literals - - ares_inet_net_pton would return wrong values when excessively large, - and invalid, netmasks are used. Fixes are from bind-9.5.3rc1, - issue also described in the WLB-2008080064 advisory. +Guenter Knauf (11 Jul 2012) +- Cleaned up version awk script. -- setup_once: provide ISASCII macro +Daniel Stenberg (30 Jun 2012) +- [Gisle Vanem brought this change] -- configure: inet_net_pton function check adjustments - - Define HAVE_INET_NET_PTON only when system's inet_net_pton function is IPv6 - capable and is not affected by the WLB-2008080064 advisory. + read_udp_packets: bail out loop on bad sockets - HAVE_INET_NET_PTON_IPV6 is no longer defined nor used. + I can see that recvfrom() in ares_process.c many times is called with + 'udp_socket' == ARES_SOCKET_BAD. The code takes care not to call + recv/recvfrom with ARES_SOCKET_BAD in the outer-loop. So should the + inner-loop. -- ares_init: fix detection of semicolon comments in resolv.conf +Yang Tse (29 Jun 2012) +- cares-compilers.m4: remove -Wstrict-aliasing=3 from clang - File resolv.conf may either use a hash '#' or a semicolon ';' character as an - indication that the rest of the line is a comment. This fixes not recognizing - the semicolon as a valid comment indicator in resolv.conf. - -- version: start working on 1.7.5 + Currently it is unknown if there is any version of clang that + actually supports -Wstrict-aliasing. What is known is that there + are several that don't support it. -Version 1.7.4 (8 Dec 2010) +- cares-compilers.m4: -Wstrict-aliasing=3 for warning enabled gcc and clang builds -Daniel Stenberg (8 Dec 2010) -- release-preps: CHANGES and RELEASE-NOTES synced +Daniel Stenberg (18 Jun 2012) +- version: work towards 1.9.2 (at least) -- ares_set_local_*: added in 1.7.4, not before +Version 1.9.1 (18 Jun 2012) -Yang Tse (3 Dec 2010) -- build: provide SIZEOF_SIZE_T definition for non-configure builds +Daniel Stenberg (18 Jun 2012) +- RELEASE-NOTES: 1.9.1 coming up -- build: config.dos renamed to config-dos.h +Version 1.9.0 (16 Jun 2012) -- build: provide SIZEOF_SIZE_T netware definition +Daniel Stenberg (16 Jun 2012) +- ares_version.h: next version is 1.9.0 -- ares_gethostbyaddr: fix compiler warning: conversion may lose significant bits +- [Marko Kreen brought this change] -- configure: undo using autobuilds to temporarily verify strict aliasing warnings. + ares_data.h: ARES_DATATYPE_SOA_REPLY is added in 1.9.0 -- fix compiler warning: rounding, sign extension, or loss of accuracy may result +- RELEASE-NOTES: synced with 979bf951d + + Next release deemed to become 1.9.0 due to the new function -Daniel Stenberg (2 Dec 2010) -- [Ben Noordhuis brought this change] +- [Marko Kreen brought this change] - ares_parse_a_reply: fix CNAME response parsing + SOA parser added - Reply to a CNAME query doesn't contain addresses, causing - ares_parse_a_reply() to bail out with ARES_ENODATA + I need to do SOA queries, so here is a parser for them. - Bug: http://groups.google.com/group/nodejs/browse_thread/thread/a1268c9ea5e9ad9b + - ares_soa_reply: new struct + - ares_malloc_data/ares_free_soa: ARES_DATATYPE_SOA_REPLY + - ares_parse_soa_reply: actual function + +Yang Tse (14 Jun 2012) +- Kill compiler warning -Yang Tse (1 Dec 2010) -- fix compiler warning: conversion may lose significant bits +- Fix libcares.pc generation for static MingW* cross builds -- atoi: remove atoi usage +Daniel Stenberg (21 May 2012) +- [Nick Alcock brought this change] -- ares_init: fix compiler warning: conversion may lose significant bits + Fix UDP and TCP port byte order in saved options. + + The UDP and TCP port are stored in network byte order in the + ares_channeldata, but are passed in to ares_init_options() in host byte + order. Thus we must return them from ares_save_options() in host byte + order too, or a duplicated channel will convert them again, leading to a + nonfunctional channel and a mysterious connection refused error from + ares_gethostbyname(). This breaks ares_dup(), thus the curl easy API + when c-ares is used by curl, and thus all the curl easy API's users. -- configure: fix autoconf warning +Yang Tse (28 Apr 2012) +- version: start working on 1.8.1-DEV -- inet_pton: fix compiler warning +Version 1.8.0 (27 Apr 2012) -- configure: use autobuilds to temporarily verify strict aliasing warnings. +Daniel Stenberg (27 Apr 2012) +- RELEASE-NOTES: call next 1.8 instead - Temporarily, When cross-compiling with gcc 3.0 or later, enable strict aliasing - rules and warnings. Given that cross-compiled targets autobuilds do not run the - test-suite, there is no risk of running code that violates strict aliasing rules + Since we added a function, let's use a stricter bumping scheme -- ares_getnameinfo: Partially revert commit 85520d66e0ac7ac73411bc25e98769a88b2f - - Upon socket address family and length validation failure return ARES_ENOTIMP - in callback again, this is the error code documented in man page and used - mostly all over the library. +Yang Tse (25 Apr 2012) +- INSTALL: some adjustments -- ares_getnameinfo: Validate socket address family and length. - - Validate socket address family and that the socket address length is appropriate - for the specified family. Failure is reported with ARES_EBADFAMILY in callback. +Daniel Stenberg (25 Apr 2012) +- GIT-INFO: mention buildconf -- ares_getnameinfo: fix two compiler warnings +Yang Tse (25 Apr 2012) +- INSTALL: remove more sections that don't apply to c-ares -- Added another VS10 version string +- ares_timeout.c: fix compiler warning -- Fix GCC 4 compiler warning 'dereferencing type-punned pointer might break strict-aliasing rules'. +Daniel Stenberg (25 Apr 2012) +- [Ben Noordhuis brought this change] -- Revert commit 494274e653936335c255a47599970de3df21e7c4 + Makefile.m32: fix mingw32 build + + * add . to include path so ares_build.h is picked up + * make ar configurable to ease cross-compiling -- configure: fix autoconf 2.68 warning: no AC_LANG_SOURCE call detected in body +- RELEASE-NOTES: added what's happened since 1.7.5 -- Fix compiler warning: array subscript has type 'char' +Guenter Knauf (22 Apr 2012) +- Updated copyright year. -- Fix GCC 4 compiler warning 'dereferencing type-punned pointer might break strict-aliasing rules'. +Yang Tse (21 Apr 2012) +- ares_init.c: Further refactoring of Windows system's DNS fetching code -- Revert following commits: - 07bc7ea79509bcc9ef6e09151e81766ed00d3392 - 3392a50ea3f8573ea4b7a9d82b9833dab60cb0e9 - 9912637d32c9987719a1ea12db591aee2941891c - - The purpose of the whole patch was to silence a compiler warning triggered - with GCC 4 on file ares_process.c The specific compiler warning was - 'dereferencing type-punned pointer might break strict-aliasing rules'. +Guenter Knauf (20 Apr 2012) +- Android: small changes to dns property part. - A simpler patch will follow to equally silence the warning. - -- ares_options: reorder header inclusions to make inclusion of - ares_private.h the last included one again. + Prefix prop vars; kill var; use DNS_PROP_NAME_PREFIX macro. -Daniel Stenberg (12 Nov 2010) -- [Patrik Thunstrom brought this change] +- Handle CNAME-only in ares_parse_aaaa_reply(). + + posted to the c-ares list by Peter Griess . - adig: fix NAPTR parsing +- Add support for multiple DNS servers on Android. - I ran across a small "issue" in your adig example. + Before, c-ares always used the first DNS server on Android, causing + network problems if this DNS server was not available. - It is simply the last part of the NAPTR record, the replacement element, - which is not a string, as currently handled in adig, but a domain name. - -- ares_save_options: assignments instead of memcpy + Signed-off-by: Geert Uytterhoeven -- init_by_options: don't copy an empty sortlist - - If there aren't any sort items to copy, don't bother. Without this - little precaution it would do a malloc(0) which causes undefined - behaviors and is frowned upon by curl's memdebug-system. +- Added INSTALL so it gets into tarballs. -Guenter Knauf (3 Oct 2010) -- Minor Watcom makefile tweaks. +- Added some more ifdefs to silent compiler warnings. -Daniel Stenberg (30 Sep 2010) -- [Mike Crowe brought this change] +Yang Tse (17 Apr 2012) +- INSTALL: remove a non c-ares section - Fix lookup with HOSTALIASES set. - - ares__read_line returns ARES_EOF when it reaches the end of the - file. This will happen every time when reading to the end of the - HOSTALIASES file. Unfortunately single_domain treats this error as - being fatal. +- cares-compilers.m4: -Wno-pedantic-ms-format for Windows gcc 4.5 builds - Signed-off-by: Mike Crowe + When building a Windows target with gcc 4.5 or newer and strict compiler + warnings enabled use -Wno-pedantic-ms-format in addition to other flags. -Ben Greear (24 Aug 2010) -- Add missing break that caused get_ares_servers to fail. +- setup_once.h: tighten requirements for stdbool.h header inclusion - Reported-by: Ning Dong - Signed-off-by: Ben Greear + Include stdbool.h only when it is available and configure is capable of + detecting a proper 'bool' data type when the header is included. -Yang Tse (11 Aug 2010) -- configure: werror related adjustments +- configure: NATIVE_WINDOWS no longer defined in config file -Guenter Knauf (8 Aug 2010) -- Added copyright string to ares_version.h and make use of it in other files. +- cares-compilers.m4: double underscore decoration for visibility attribute -- Block created ares_build.h for NetWare to avoid usage from other platforms. +- build adjustments: CARES_SYMBOL_HIDING no longer defined in config files + + configure script now provides conditional definitions for Makefile.am + that result in CARES_SYMBOL_HIDING being defined by resulting makefiles + when appropriate. -- Fix to overwrite default libname. +- configure: Windows cross-compilation fixes + + CARES_BUILDING_LIBRARY and CARES_STATICLIB no longer defined in ares_config.h, + configure will generate appropriate conditionals so that mentioned symbols + get defined and used in Makefile derived from Makefile.am at compilation time. -- Some more Watcom makefile massage ... +Guenter Knauf (17 Apr 2012) +- Added INSTALL file adapted from libcurl. + + Not yet ready, and needs further edits. -- Some more Watcom makefile massage ... +Yang Tse (16 Apr 2012) +- ares_init.c: get_iphlpapi_dns_info() refactoring -Ben Greear (4 Aug 2010) -- sock-addr-storage: Detect and deal with lack of .ss_family member. - - AIX, at least, does not have sockaddr_storage.ss_family member. - Detect this in the configure logic and use proper #ifdefs in the - ares_process logic. - - Signed-off-by: Ben Greear - Tested-by: Tor Arntsen +Guenter Knauf (16 Apr 2012) +- Kill some more compiler warnings. -Guenter Knauf (3 Aug 2010) -- Added Watcom makefile based on libcurl's Makefile.Watcom. +- Kill compiler warning about unused var. -Ben Greear (31 Jul 2010) -- typo: Fix compile bug for platforms that don't have sockaddr_storage. - - Bug was introduced by me in previous commit. - - Signed-off-by: Ben Greear +- Fixed my last commit: wrong preprocessor directive. -- Fix aliasing warning in gcc 4.4.4 (at least). - - Should be no functional change, though the code gets a bit - ugglier. - - Signed-off-by: Ben Greear +- Check for __ANDROID__ in addition to ANDROID macro. -Daniel Stenberg (31 Jul 2010) -- ares_set_servers_csv: use ISDIGIT +- Check for __ANDROID__ in addition to ANDROID macro. - The IS*() set of macros are preferred to the regular is*() functions as - they help us avoid the most common pitfalls. + Posted to c-ares list by Wayne. -Ben Greear (30 Jul 2010) -- cast arg to isdigit to int - - Looks like it might silence a warning on Netware build. - - Signed-off-by: Ben Greear +- Fix for Android to disable useless arpa/nameser.h. -- remove all uses of uint32_t - - Previous fix forgot a few. - - Signed-off-by: Ben Greear +- Fix for Android to include sys/select.h for fd_set. -- fix signed v/s unsigned casts warning in ares_gethostbyaddr.c - - Signed-off-by: Ben Greear +Yang Tse (17 Mar 2012) +- ares_data.c: some NAPTR related fixes -- local-bind-fixup: Fix inet_pton warning. +Daniel Stenberg (16 Mar 2012) +- port numbers: convert them to network order! - Conditionally include for inet_pton - headers. + When the config options ARES_OPT_UDP_PORT or ARES_OPT_TCP_PORT are used, + make sure to convert them to network byte order! - Signed-off-by: Ben Greear + Bug: http://c-ares.haxx.se/mail/c-ares-archive-2012-02/0004.shtml -- build: Enable compiling with -Werror. - - This helps find compile warnings because they simply break - the build. - - To use: - ./configure --enable-warnings --enable-werror +- white space cleanup - Signed-off-by: Ben Greear - -- ipv6: Fix some build issues related to the local-bind feature. + - Keep code within 80 columns - Signed-off-by: Ben Greear - -Guenter Knauf (29 Jul 2010) -- Replaced uint32_t with unsigned int to fix broken builds on a couple of platforms. + - Removed funny spaces after open paren and before closing paren -Daniel Stenberg (18 Jul 2010) -- [Ben Greear brought this change] +- [Poul Thomas Lomholt brought this change] - local-bind: Support binding to local interface/IPs + get_iphlpapi_dns_info: fix buffer overrun - Add 3 new functions to set the local binding for the out-going - socket connection, and add ares_set_servers_csv() to set a - list of servers at once as a comma-separated string. + I experienced a buffer overrun exception in c-ares on Windows and + tracked it down to be an error in the calculation of the 'left' variable + in get_iphlpapi_dns_info(). - Signed-off-by: Ben Greear - -- version: now start on 1.7.4 - -- [Andrew C. Morrow brought this change] - - fix memory leak in ares_getnameinfo - -Version 1.7.3 (11 Jun 2010) - -Daniel Stenberg (11 Jun 2010) -- changelogs: updated for 1.7.3 - -- [BogDan Vatra brought this change] - - init: allow c-ares to work on Android OS - -- changelog: fill in the 1.7.2 changes - -- added another pdf to ignore - -Yang Tse (11 Jun 2010) -- add ares_parse_mx_reply.c to VS dsp file + I changed the variable type of 'left' to a _signed_ type because of the + subtraction arithmetic; not sure if a long is the best choice -Daniel Stenberg (10 Jun 2010) -- tarball: add $(CSOURCES) $(HHEADERS) to EXTRA_DIST +- Merge pull request #7 from saghul/naptr - It's not clear to me why we need this, but we apparently may - otherwise not get all files bundled in the dist tarball. - -- version: start working on 1.7.3 - -Version 1.7.2 (10 Jun 2010) - -Daniel Stenberg (10 Jun 2010) -- RELEASE-NOTES: 1.7.2 details added - -- [Jakub Hrozek brought this change] - - ares_init: Last, not first instance of domain or search should win - -- style: make code less than 80 columns wide - -Yang Tse (31 May 2010) -- [Tor Arntsen brought this change] - - improve alternative definition of bool to use enum instead of unsigned char - -- fix VS2010 compiler warnings - -Daniel Stenberg (18 Apr 2010) -- [Jérémy Lal brought this change] - - added ares_parse_mx_reply + Added support for parsing NAPTR records -- repair the file mode +saghul (23 Feb 2012) +- Added support for parsing NAPTR records -- remove all $Id$ lines +Yang Tse (19 Jan 2012) +- ares_init.c: fix compiler warning on winsock builds -- remove all .cvsignore files +- configure: libtool 1.5 tweaks -- spell fix +Daniel Stenberg (19 Dec 2011) +- ares_timeout.3: fix the NAME section - reported by Gregor Jasny on the mailing list - -- [Peter Pentchev brought this change] - - Fix a couple of typos and grammar nits. - -- ignore the GPG signature files too - -- start the journey towards 1.7.2 - -- no longer CVS tagging - -- ignore generated PDFs - -Version 1.7.1 (23 Mar 2010) + It was clearly a copy n' paste error -Daniel Stenberg (23 Mar 2010) -- 1.7.1 +Yang Tse (27 Sep 2011) +- [Albert Chin brought this change] -- made README the primary readme file + configure - m4: make CURL_CHECK_DEF ignore leading whitespace on symbol def - ... and did README.cares to contain a historic reason etc. + When using Sun C compiler the preprocessor somehow inserts an extra space + in front of replaced symbol, breaking CURL_CHECK_DEF macro. To workaround + this, macro CURL_CHECK_DEF now ignores all leading whitespace in front of + symbol substitution result. -- s/CVS/git +- ares_init.c: fix segfault triggered in ares_init_options() upon previous + failure of init_by_defaults() and incomplete cleanup there. -- git now, not CVS +- ares_process.c: fix compiler warning -- ignore lots of generated files +- fix MSVC compiler warning 'conditional expression is constant' diff --git a/lib/c-ares-1.19.1/CMakeLists.txt b/lib/c-ares-1.23.0/CMakeLists.txt similarity index 88% rename from lib/c-ares-1.19.1/CMakeLists.txt rename to lib/c-ares-1.23.0/CMakeLists.txt index 9379014296c..d1d0200ee51 100644 --- a/lib/c-ares-1.19.1/CMakeLists.txt +++ b/lib/c-ares-1.23.0/CMakeLists.txt @@ -1,4 +1,8 @@ -CMAKE_MINIMUM_REQUIRED (VERSION 3.1.0) +# Copyright (C) The c-ares project and its contributors +# SPDX-License-Identifier: MIT +CMAKE_MINIMUM_REQUIRED (VERSION 3.5.0) + +list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/") INCLUDE (CheckIncludeFiles) INCLUDE (CheckTypeSize) @@ -8,10 +12,10 @@ INCLUDE (CheckCSourceCompiles) INCLUDE (CheckStructHasMember) INCLUDE (CheckLibraryExists) -PROJECT (c-ares LANGUAGES C VERSION "1.19.1" ) +PROJECT (c-ares LANGUAGES C VERSION "1.23.0" ) # Set this version before release -SET (CARES_VERSION "1.19.1") +SET (CARES_VERSION "1.23.0") INCLUDE (GNUInstallDirs) # include this *AFTER* PROJECT(), otherwise paths are wrong. @@ -26,26 +30,38 @@ INCLUDE (GNUInstallDirs) # include this *AFTER* PROJECT(), otherwise paths are w # For example, a version of 4:0:2 would generate output such as: # libname.so -> libname.so.2 # libname.so.2 -> libname.so.2.2.0 -SET (CARES_LIB_VERSIONINFO "8:1:6") +SET (CARES_LIB_VERSIONINFO "11:0:9") -OPTION (CARES_STATIC "Build as a static library" OFF) -OPTION (CARES_SHARED "Build as a shared library" ON) -OPTION (CARES_INSTALL "Create installation targets (chain builders may want to disable this)" ON) -OPTION (CARES_STATIC_PIC "Build the static library as PIC (position independent)" OFF) -OPTION (CARES_BUILD_TESTS "Build and run tests" OFF) +OPTION (CARES_STATIC "Build as a static library" OFF) +OPTION (CARES_SHARED "Build as a shared library" ON) +OPTION (CARES_INSTALL "Create installation targets (chain builders may want to disable this)" ON) +OPTION (CARES_STATIC_PIC "Build the static library as PIC (position independent)" OFF) +OPTION (CARES_BUILD_TESTS "Build and run tests" OFF) OPTION (CARES_BUILD_CONTAINER_TESTS "Build and run container tests (implies CARES_BUILD_TESTS, Linux only)" OFF) -OPTION (CARES_BUILD_TOOLS "Build tools" ON) +OPTION (CARES_BUILD_TOOLS "Build tools" ON) +OPTION (CARES_SYMBOL_HIDING "Hide private symbols in shared libraries" OFF) +OPTION (CARES_THREADS "Build with thread-safety support" ON) SET (CARES_RANDOM_FILE "/dev/urandom" CACHE STRING "Suitable File / Device Path for entropy, such as /dev/urandom") +# Tests require a C++ compiler +IF (CARES_BUILD_TESTS OR CARES_BUILD_CONTAINER_TESTS) + set(CMAKE_CXX_STANDARD 11) + set(CMAKE_CXX_STANDARD_REQUIRED TRUE) + set(CMAKE_CXX_EXTENSIONS FALSE) + enable_language(CXX) +ENDIF () + # Tests require static to be enabled on Windows to be able to access otherwise hidden symbols -IF (CARES_BUILD_TESTS AND (NOT CARES_STATIC) AND WIN32) +IF ((CARES_BUILD_TESTS OR CARES_BUILD_CONTAINER_TESTS) AND (NOT CARES_STATIC) AND WIN32) SET (CARES_STATIC ON) SET (CARES_STATIC_PIC ON) - MESSAGE (WARNING "Static building was requested be disabled, but reenabled to support tests") + MESSAGE (WARNING "Static building was requested be disabled, but re-enabled to support tests") ENDIF () +INCLUDE (EnableWarnings) + # allow linking against the static runtime library in msvc IF (MSVC) OPTION (CARES_MSVC_STATIC_RUNTIME "Link against the static runtime library" OFF) @@ -68,6 +84,21 @@ IF (MSVC) ENDIF () ENDIF () +IF (CARES_SYMBOL_HIDING) + IF (CMAKE_VERSION VERSION_LESS 3.12) + MESSAGE (FATAL_ERROR "Hiding symbols requires CMake 3.12") + ENDIF () + CMAKE_POLICY (SET CMP0063 NEW) + SET (CARES_SYMBOL_SCOPE_EXTERN [=[__attribute__ ((visibility("default")))]=]) + CHECK_C_SOURCE_COMPILES (" + ${CARES_SYMBOL_SCOPE_EXTERN} int somefunc() { return 0; } + int main() { return somefunc(); } + " HAVE_VISIBILITY_ATTRIBUTE) + IF (NOT HAVE_VISIBILITY_ATTRIBUTE) + MESSAGE (FATAL_ERROR "C compiler does not accept visibility attribute") + ENDIF () +ENDIF () + # Keep build organized. SET (CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/${CMAKE_INSTALL_BINDIR}") SET (CMAKE_LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}") @@ -164,6 +195,7 @@ CARES_FUNCTION_IN_LIBRARY (clock_gettime rt HAVE_LIBRT) # Look for necessary includes CHECK_INCLUDE_FILES (sys/types.h HAVE_SYS_TYPES_H) +CHECK_INCLUDE_FILES (sys/random.h HAVE_SYS_RANDOM_H) CHECK_INCLUDE_FILES (sys/socket.h HAVE_SYS_SOCKET_H) CHECK_INCLUDE_FILES (sys/sockio.h HAVE_SYS_SOCKIO_H) CHECK_INCLUDE_FILES (arpa/inet.h HAVE_ARPA_INET_H) @@ -196,7 +228,6 @@ CHECK_INCLUDE_FILES (sys/uio.h HAVE_SYS_UIO_H) CHECK_INCLUDE_FILES (time.h HAVE_TIME_H) CHECK_INCLUDE_FILES (dlfcn.h HAVE_DLFCN_H) CHECK_INCLUDE_FILES (unistd.h HAVE_UNISTD_H) - # On OpenBSD, you must include sys/types.h before netinet/tcp.h IF (HAVE_SYS_TYPES_H) CHECK_INCLUDE_FILES ("sys/types.h;netinet/tcp.h" HAVE_NETINET_TCP_H) @@ -210,6 +241,8 @@ ENDIF () IF (WIN32) CHECK_INCLUDE_FILES ("winsock2.h;windows.h" HAVE_WINSOCK2_H) CHECK_INCLUDE_FILES ("winsock2.h;ws2tcpip.h;windows.h" HAVE_WS2TCPIP_H) +CHECK_INCLUDE_FILES ("winsock2.h;iphlpapi.h;windows.h" HAVE_IPHLPAPI_H) +CHECK_INCLUDE_FILES ("winsock2.h;netioapi.h;windows.h" HAVE_NETIOAPI_H) CHECK_INCLUDE_FILES ("winsock.h;windows.h" HAVE_WINSOCK_H) CHECK_INCLUDE_FILES (windows.h HAVE_WINDOWS_H) ENDIF () @@ -226,7 +259,7 @@ ELSEIF (CMAKE_SYSTEM_NAME STREQUAL "AIX") ELSEIF (CMAKE_SYSTEM_NAME STREQUAL "FreeBSD") # Don't define _XOPEN_SOURCE on FreeBSD, it actually reduces visibility instead of increasing it ELSEIF (WIN32) - LIST (APPEND SYSFLAGS -DWIN32_LEAN_AND_MEAN -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE -D_WIN32_WINNT=0x0600) + LIST (APPEND SYSFLAGS -DWIN32_LEAN_AND_MEAN -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE -D_WIN32_WINNT=0x0602) ENDIF () ADD_DEFINITIONS(${SYSFLAGS}) @@ -281,16 +314,19 @@ CARES_EXTRAINCLUDE_IFSET (HAVE_STDLIB_H stdlib.h) CARES_EXTRAINCLUDE_IFSET (HAVE_STRING_H string.h) CARES_EXTRAINCLUDE_IFSET (HAVE_STRINGS_H strings.h) CARES_EXTRAINCLUDE_IFSET (HAVE_SYS_IOCTL_H sys/ioctl.h) +CARES_EXTRAINCLUDE_IFSET (HAVE_SYS_RANDOM_H sys/random.h) CARES_EXTRAINCLUDE_IFSET (HAVE_SYS_SELECT_H sys/select.h) CARES_EXTRAINCLUDE_IFSET (HAVE_SYS_SOCKET_H sys/socket.h) CARES_EXTRAINCLUDE_IFSET (HAVE_SYS_SOCKIO_H sys/sockio.h) CARES_EXTRAINCLUDE_IFSET (HAVE_SYS_TIME_H sys/time.h) +CARES_EXTRAINCLUDE_IFSET (HAVE_SYS_STAT_H sys/stat.h) CARES_EXTRAINCLUDE_IFSET (HAVE_SYS_UIO_H sys/uio.h) CARES_EXTRAINCLUDE_IFSET (HAVE_TIME_H time.h) CARES_EXTRAINCLUDE_IFSET (HAVE_FCNTL_H fcntl.h) CARES_EXTRAINCLUDE_IFSET (HAVE_UNISTD_H unistd.h) CARES_EXTRAINCLUDE_IFSET (HAVE_WINSOCK2_H winsock2.h) CARES_EXTRAINCLUDE_IFSET (HAVE_WS2TCPIP_H ws2tcpip.h) +CARES_EXTRAINCLUDE_IFSET (HAVE_IPHLPAPI_H iphlpapi.h) CARES_EXTRAINCLUDE_IFSET (HAVE_WINDOWS_H windows.h) # Check Types @@ -365,6 +401,7 @@ CHECK_SYMBOL_EXISTS (gethostbyaddr "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_GETHOST CHECK_SYMBOL_EXISTS (gethostbyname "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_GETHOSTBYNAME) CHECK_SYMBOL_EXISTS (gethostname "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_GETHOSTNAME) CHECK_SYMBOL_EXISTS (getnameinfo "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_GETNAMEINFO) +CHECK_SYMBOL_EXISTS (getrandom "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_GETRANDOM) CHECK_SYMBOL_EXISTS (getservbyport_r "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_GETSERVBYPORT_R) CHECK_SYMBOL_EXISTS (getservbyname_r "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_GETSERVBYNAME_R) CHECK_SYMBOL_EXISTS (gettimeofday "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_GETTIMEOFDAY) @@ -394,7 +431,7 @@ CHECK_SYMBOL_EXISTS (strncmpi "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_STRNCMP CHECK_SYMBOL_EXISTS (strnicmp "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_STRNICMP) CHECK_SYMBOL_EXISTS (writev "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_WRITEV) CHECK_SYMBOL_EXISTS (arc4random_buf "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_ARC4RANDOM_BUF) - +CHECK_SYMBOL_EXISTS (stat "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_STAT) # On Android, the system headers may define __system_property_get(), but excluded # from libc. We need to perform a link test instead of a header/symbol test. @@ -406,6 +443,43 @@ SET (CMAKE_REQUIRED_DEFINITIONS) SET (CMAKE_REQUIRED_LIBRARIES) +################################################################################ +# Threading Support +# +IF (CARES_THREADS) + IF (WIN32) + # Do nothing, always has threads + ELSE () + # Need to prefer pthreads on platforms that may have more threading choices + # (e.g. Solaris) + SET (CMAKE_THREAD_PREFER_PTHREAD TRUE) + FIND_PACKAGE (Threads) + + IF (Threads_FOUND) + # Fix solaris9 bug due to libc having pthread_create() stubs that always fail. CMake + # doesn't realize that the real pthread functions aren't in libc, so sets the pthread + # library CAKE_THREAD_LIBS_INIT variable to blank instead of to the correct "-lpthread". + IF (CMAKE_SYSTEM_NAME STREQUAL "SunOS" AND NOT CMAKE_THREAD_LIBS_INIT) + SET (CMAKE_THREAD_LIBS_INIT "-lpthread") + ENDIF () + + # PThread functions. + CHECK_INCLUDE_FILES (pthread.h HAVE_PTHREAD_H) + CHECK_INCLUDE_FILES (pthread_np.h HAVE_PTHREAD_NP_H) + CARES_EXTRAINCLUDE_IFSET (HAVE_PTHREAD_H pthread.h) + CARES_EXTRAINCLUDE_IFSET (HAVE_PTHREAD_NP_H pthread_np.h) + CHECK_SYMBOL_EXISTS (pthread_init "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_PTHREAD_INIT) + # Make sure libcares.pc.cmake knows about thread libraries on static builds + LIST (APPEND CARES_DEPENDENT_LIBS ${CMAKE_THREAD_LIBS_INIT}) + ELSE () + MESSAGE (WARNING "Threading support not found, disabling...") + SET (CARES_THREADS OFF) + ENDIF () + ENDIF () +ENDIF () + + + ################################################################################ # recv, recvfrom, send, getnameinfo, gethostname # ARGUMENTS AND RETURN VALUES @@ -562,6 +636,9 @@ ENDIF () IF (HAVE_SYS_TYPES_H) SET (CARES_HAVE_SYS_TYPES_H 1) ENDIF () +IF (HAVE_SYS_RANDOM_H) + SET (CARES_HAVE_SYS_RANDOM_H 1) +ENDIF() IF (HAVE_SYS_SOCKET_H) SET (CARES_HAVE_SYS_SOCKET_H 1) ENDIF() diff --git a/lib/c-ares-1.19.1/CONTRIBUTING.md b/lib/c-ares-1.23.0/CONTRIBUTING.md similarity index 100% rename from lib/c-ares-1.19.1/CONTRIBUTING.md rename to lib/c-ares-1.23.0/CONTRIBUTING.md diff --git a/lib/c-ares-1.19.1/INSTALL.md b/lib/c-ares-1.23.0/INSTALL.md similarity index 93% rename from lib/c-ares-1.19.1/INSTALL.md rename to lib/c-ares-1.23.0/INSTALL.md index 0f9d95a5219..738375ec866 100644 --- a/lib/c-ares-1.19.1/INSTALL.md +++ b/lib/c-ares-1.23.0/INSTALL.md @@ -244,7 +244,7 @@ Ninja ----- Ninja is the next-generation build system meant for generators like CMake that -heavily parallize builds. Its use is very similar to the normal build: +heavily parallelize builds. Its use is very similar to the normal build: ```sh cd /path/to/cmake/source @@ -291,16 +291,12 @@ As a general rule, building a DLL with static CRT linkage is highly discouraged, and intermixing CRTs in the same app is something to avoid at any cost. -Reading and comprehension of Microsoft Knowledge Base articles -KB94248 and KB140584 is a must for any Windows developer. Especially +Reading and comprehension of the following Microsoft Learn article +is a must for any Windows developer. Especially important is full understanding if you are not going to follow the advice given above. - - [KB94248](http://support.microsoft.com/kb/94248/en-us) - How To Use the C Run-Time - - - [KB140584](http://support.microsoft.com/kb/140584/en-us) - How to link with the correct C Run-Time (CRT) library - - - [KB190799](http://msdn.microsoft.com/en-us/library/ms235460) - Potential Errors Passing CRT Objects Across DLL Boundaries + - [Use the C Run-Time](https://learn.microsoft.com/en-us/troubleshoot/developer/visualstudio/cpp/libraries/use-c-run-time) If your app is misbehaving in some strange way, or it is suffering from memory corruption, before asking for further help, please try @@ -397,6 +393,21 @@ You can build and install c-ares using [vcpkg](https://github.com/Microsoft/vcpk The c-ares port in vcpkg is kept up to date by Microsoft team members and community contributors. If the version is out of date, please [create an issue or pull request](https://github.com/Microsoft/vcpkg) on the vcpkg repository. +WATCOM +===== + +To build c-ares with OpenWatcom, you need to have at least version 1.9 of OpenWatcom. You can get the latest version from [http://openwatcom.org/ftp/install/](http://openwatcom.org/ftp/install/). Install the version that corresponds to your current host platform. + +After installing OpenWatcom, open a new command prompt and execute the following commands: + +``` + cd \path\to\cmake\source + buildconf.bat + wmake -u -f Makefile.Watcom +``` + +After running wmake, you should get adig.exe, ahost.exe, and the static and dynamic versions of libcares. + PORTS ===== diff --git a/lib/c-ares-1.23.0/LICENSE.md b/lib/c-ares-1.23.0/LICENSE.md new file mode 100644 index 00000000000..134145428aa --- /dev/null +++ b/lib/c-ares-1.23.0/LICENSE.md @@ -0,0 +1,27 @@ +# c-ares license + +MIT License + + +Copyright (c) 1998 Massachusetts Institute of Technology +Copyright (c) 2007 - 2023 Daniel Stenberg with many contributors, see AUTHORS +file. + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice (including the next +paragraph) shall be included in all copies or substantial portions of the +Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/lib/c-ares-1.19.1/Makefile.Watcom b/lib/c-ares-1.23.0/Makefile.Watcom similarity index 90% rename from lib/c-ares-1.19.1/Makefile.Watcom rename to lib/c-ares-1.23.0/Makefile.Watcom index 34e07bb4c6b..fddba58eed0 100644 --- a/lib/c-ares-1.19.1/Makefile.Watcom +++ b/lib/c-ares-1.23.0/Makefile.Watcom @@ -1,3 +1,5 @@ +# Copyright (C) The c-ares project and its contributors +# SPDX-License-Identifier: MIT # # Watcom / OpenWatcom / Win32 makefile for cares. # Quick hack by Guenter; comments to: /dev/nul @@ -17,7 +19,7 @@ LIBNAME = $(%libname) LIBNAME = cares !endif TARGETS = $(LIBNAME).dll $(LIBNAME)_imp.lib $(LIBNAME).lib -DEMOS = adig.exe ahost.exe acountry.exe +DEMOS = adig.exe ahost.exe CC = wcc386 LD = wlink @@ -39,8 +41,8 @@ MD = mkdir RD = rmdir /q /s 2>NUL CP = copy -CFLAGS = -3r -mf -hc -zff -zgf -zq -zm -zc -s -fr=con -w2 -fpi -oilrtfm -aa & - -wcd=201 -bt=nt -d+ -dWIN32 -dCARES_BUILDING_LIBRARY & +CFLAGS = -3r -mf -hc -zff -zgf -zq -zm -zc -s -fr=con -w2 -fpi -oilrtfm -aa & + -wcd=201 -bt=nt -d+ -dWIN32 -dCARES_BUILDING_LIBRARY & -dNTDDI_VERSION=0x06000000 -I. -I.\include -I.\src\lib $(SYS_INCL) LFLAGS = option quiet, map, caseexact, eliminate @@ -53,7 +55,7 @@ LFLAGS += debug all CFLAGS += -d0 !endif -CFLAGS += -d_WIN32_WINNT=0x0600 +CFLAGS += -d_WIN32_WINNT=0x0602 # # Change to suite. @@ -118,10 +120,6 @@ ahost.exe: $(OBJ_BASE)\tools\ares_getopt.obj $(LIBNAME).lib $(CC) $(CFLAGS) src\tools\ahost.c -fo=$(OBJ_BASE)\tools\ahost.obj $(LD) name $^@ system nt $(LFLAGS) file { $(OBJ_BASE)\tools\ahost.obj $[@ } library $]@, ws2_32.lib, iphlpapi.lib -acountry.exe: $(OBJ_BASE)\tools\ares_getopt.obj $(LIBNAME).lib - $(CC) $(CFLAGS) src\tools\acountry.c -fo=$(OBJ_BASE)\tools\acountry.obj - $(LD) name $^@ system nt $(LFLAGS) file { $(OBJ_BASE)\tools\acountry.obj $[@ } library $]@, ws2_32.lib, iphlpapi.lib - clean: .SYMBOLIC -$(RM) $(OBJS_STAT) -$(RM) $(OBJS_DYN) diff --git a/lib/c-ares-1.19.1/Makefile.am b/lib/c-ares-1.23.0/Makefile.am similarity index 53% rename from lib/c-ares-1.19.1/Makefile.am rename to lib/c-ares-1.23.0/Makefile.am index eef3d3d160e..d1ab53cb340 100644 --- a/lib/c-ares-1.19.1/Makefile.am +++ b/lib/c-ares-1.23.0/Makefile.am @@ -1,3 +1,24 @@ +############################################################# +# +# Copyright (C) the Massachusetts Institute of Technology. +# Copyright (C) Daniel Stenberg +# +# 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. +# +# SPDX-License-Identifier: MIT +# +############################################################# + AUTOMAKE_OPTIONS = foreign nostdinc 1.9.6 ACLOCAL_AMFLAGS = -I m4 --install @@ -9,8 +30,8 @@ EXTRA_DIST = AUTHORS CHANGES README.cares $(man_MANS) RELEASE-NOTES \ c-ares-config.cmake.in libcares.pc.cmake libcares.pc.in buildconf get_ver.awk \ maketgz TODO README.msvc $(MSVCFILES) INSTALL.md README.md LICENSE.md \ CMakeLists.txt Makefile.dj Makefile.m32 Makefile.netware Makefile.msvc \ - Makefile.Watcom AUTHORS CONTRIBUTING.md SECURITY.md TODO - + Makefile.Watcom AUTHORS CONTRIBUTING.md SECURITY.md TODO \ + cmake/EnableWarnings.cmake CLEANFILES = $(PDFPAGES) $(HTMLPAGES) diff --git a/lib/c-ares-1.19.1/Makefile.dj b/lib/c-ares-1.23.0/Makefile.dj similarity index 94% rename from lib/c-ares-1.19.1/Makefile.dj rename to lib/c-ares-1.23.0/Makefile.dj index a88aae219da..2f221888638 100644 --- a/lib/c-ares-1.19.1/Makefile.dj +++ b/lib/c-ares-1.23.0/Makefile.dj @@ -1,6 +1,7 @@ # # c-ares Makefile for djgpp/gcc/Watt-32. -# By Gisle Vanem 2004 - 2020. +# Copyright (C) Gisle Vanem +# SPDX-License-Identifier: MIT # include src/lib/Makefile.inc @@ -46,7 +47,7 @@ OBJECTS = $(addprefix $(OBJ_DIR)/, \ GENERATED = src/lib/ares_config.h \ include/ares_build.h -TARGETS = libcares.a acountry.exe adig.exe ahost.exe +TARGETS = libcares.a adig.exe ahost.exe .SECONDARY: $(OBJ_DIR)/ares_getopt.o diff --git a/lib/c-ares-1.19.1/Makefile.in b/lib/c-ares-1.23.0/Makefile.in similarity index 95% rename from lib/c-ares-1.19.1/Makefile.in rename to lib/c-ares-1.23.0/Makefile.in index 3dfa479a244..32f61b59fda 100644 --- a/lib/c-ares-1.19.1/Makefile.in +++ b/lib/c-ares-1.23.0/Makefile.in @@ -14,6 +14,27 @@ @SET_MAKE@ +############################################################# +# +# Copyright (C) the Massachusetts Institute of Technology. +# Copyright (C) Daniel Stenberg +# +# 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. +# +# SPDX-License-Identifier: MIT +# +############################################################# + VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ @@ -94,11 +115,15 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_ac_append_to_file.m4 \ $(top_srcdir)/m4/ax_ac_print_to_file.m4 \ $(top_srcdir)/m4/ax_add_am_macro_static.m4 \ $(top_srcdir)/m4/ax_am_macros_static.m4 \ + $(top_srcdir)/m4/ax_append_compile_flags.m4 \ + $(top_srcdir)/m4/ax_append_flag.m4 \ + $(top_srcdir)/m4/ax_check_compile_flag.m4 \ $(top_srcdir)/m4/ax_check_gnu_make.m4 \ $(top_srcdir)/m4/ax_code_coverage.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx_11.m4 \ $(top_srcdir)/m4/ax_file_escapes.m4 \ + $(top_srcdir)/m4/ax_pthread.m4 \ $(top_srcdir)/m4/ax_require_defined.m4 \ $(top_srcdir)/m4/cares-compilers.m4 \ $(top_srcdir)/m4/cares-confopts.m4 \ @@ -208,7 +233,7 @@ am__define_uniq_tagged_files = \ done | $(am__uniquify_input)` am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/libcares.pc.in \ AUTHORS INSTALL.md NEWS README.md TODO compile config.guess \ - config.sub depcomp install-sh ltmain.sh missing + config.sub install-sh ltmain.sh missing DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) @@ -336,6 +361,10 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_CXX = @PTHREAD_CXX@ +PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ @@ -355,6 +384,7 @@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ +ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ @@ -409,7 +439,8 @@ EXTRA_DIST = AUTHORS CHANGES README.cares $(man_MANS) RELEASE-NOTES \ c-ares-config.cmake.in libcares.pc.cmake libcares.pc.in buildconf get_ver.awk \ maketgz TODO README.msvc $(MSVCFILES) INSTALL.md README.md LICENSE.md \ CMakeLists.txt Makefile.dj Makefile.m32 Makefile.netware Makefile.msvc \ - Makefile.Watcom AUTHORS CONTRIBUTING.md SECURITY.md TODO + Makefile.Watcom AUTHORS CONTRIBUTING.md SECURITY.md TODO \ + cmake/EnableWarnings.cmake CLEANFILES = $(PDFPAGES) $(HTMLPAGES) DISTCLEANFILES = include/ares_build.h diff --git a/lib/c-ares-1.19.1/Makefile.m32 b/lib/c-ares-1.23.0/Makefile.m32 similarity index 82% rename from lib/c-ares-1.19.1/Makefile.m32 rename to lib/c-ares-1.23.0/Makefile.m32 index 66d28b1c146..a01fe235d13 100644 --- a/lib/c-ares-1.19.1/Makefile.m32 +++ b/lib/c-ares-1.23.0/Makefile.m32 @@ -1,10 +1,12 @@ ############################################################# # -## Makefile for building libcares.a with MingW32 (GCC-3.2) -## Use: make -f Makefile.m32 [demos] -## -## Quick hack by Guenter; comments to: /dev/nul +# Makefile for building libcares.a with MingW32 (GCC-3.2) +# Use: make -f Makefile.m32 [demos] # +# Quick hack by Guenter; comments to: /dev/nul +# +# Copyright (C) The c-ares project and its contributors +# SPDX-License-Identifier: MIT ######################################################## ## Nothing more to do below this line! @@ -17,7 +19,7 @@ RANLIB = $(CROSSPREFIX)ranlib #RM = rm -f CP = cp -afv -CFLAGS = $(CARES_CFLAG_EXTRAS) -O2 -Wall -I./include -I./src/lib -D_WIN32_WINNT=0x0600 +CFLAGS = $(CARES_CFLAG_EXTRAS) -O2 -Wall -I./include -I./src/lib -D_WIN32_WINNT=0x0602 CFLAGS += -DCARES_STATICLIB LDFLAGS = $(CARES_LDFLAG_EXTRAS) -s LIBS = -lws2_32 -liphlpapi @@ -34,7 +36,7 @@ $(LIB): $(OBJLIB) all: $(LIB) demos -demos: src/tools/adig.exe src/tools/ahost.exe src/tools/acountry.exe +demos: src/tools/adig.exe src/tools/ahost.exe tags: etags *.[ch] @@ -61,6 +63,7 @@ install: chmod u-w ${DESTDIR}${libdir}/$(LIB) ${INSTALL} -m 444 ${srcdir}/include/ares.h ${DESTDIR}${includedir} ${INSTALL} -m 444 ${srcdir}/include/ares_build.h ${DESTDIR}${includedir} + ${INSTALL} -m 444 ${srcdir}/include/ares_dns_record.h ${DESTDIR}${includedir} ${INSTALL} -m 444 ${srcdir}/include/ares_rules.h ${DESTDIR}${includedir} ${INSTALL} -m 444 ${srcdir}/include/ares_version.h ${DESTDIR}${includedir} (for man in $(MANPAGES); do \ @@ -68,7 +71,7 @@ install: done) clean: - $(RM) src/tools/ares_getopt.o $(OBJLIB) $(LIB) src/tools/adig.exe src/tools/ahost.exe src/tools/acountry.exe + $(RM) src/tools/ares_getopt.o $(OBJLIB) $(LIB) src/tools/adig.exe src/tools/ahost.exe distclean: clean $(RM) config.cache config.log config.status Makefile diff --git a/lib/c-ares-1.19.1/Makefile.msvc b/lib/c-ares-1.23.0/Makefile.msvc similarity index 90% rename from lib/c-ares-1.19.1/Makefile.msvc rename to lib/c-ares-1.23.0/Makefile.msvc index 62cc48fb3b5..0e774fbf33a 100644 --- a/lib/c-ares-1.19.1/Makefile.msvc +++ b/lib/c-ares-1.23.0/Makefile.msvc @@ -12,6 +12,8 @@ # 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. +# +# SPDX-License-Identifier: MIT # ------------------------------------------------------------------------------ # @@ -20,7 +22,7 @@ # Usage: nmake /f makefile.msvc CFG= # # must be one of: [ lib-release | lib-debug | dll-release | dll-debug } -# must be one of: [ ALL | c-ares | acountry | adig | ahost | clean } +# must be one of: [ ALL | c-ares | adig | ahost | clean } # # If a other than ALL or clean is given, becomes mandatory. # @@ -130,7 +132,7 @@ VALID_CFGSET = TRUE ! MESSAGE Usage: nmake /f makefile.msvc CFG= ! MESSAGE ! MESSAGE must be one of: [ lib-release | lib-debug | dll-release | dll-debug } -! MESSAGE must be one of: [ ALL | c-ares | acountry | adig | ahost | clean } +! MESSAGE must be one of: [ ALL | c-ares | adig | ahost | clean } ! MESSAGE ! MESSAGE If a other than ALL or clean is given, becomes mandatory. ! MESSAGE @@ -145,7 +147,6 @@ VALID_CFGSET = TRUE # -------------------------------------------------------- CARES_DIR = $(BASE_DIR)\cares -PROG1_DIR = $(BASE_DIR)\acountry PROG2_DIR = $(BASE_DIR)\adig PROG3_DIR = $(BASE_DIR)\ahost @@ -156,20 +157,16 @@ PROG3_DIR = $(BASE_DIR)\ahost !IF "$(VALID_CFGSET)" == "TRUE" CARES_OUTDIR = $(CARES_DIR)\$(CFG) -PROG1_OUTDIR = $(PROG1_DIR)\$(CFG) PROG2_OUTDIR = $(PROG2_DIR)\$(CFG) PROG3_OUTDIR = $(PROG3_DIR)\$(CFG) CARES_OBJDIR = $(CARES_OUTDIR)\obj -PROG1_OBJDIR = $(PROG1_OUTDIR)\obj PROG2_OBJDIR = $(PROG2_OUTDIR)\obj PROG3_OBJDIR = $(PROG3_OUTDIR)\obj !ELSE !UNDEF CARES_OUTDIR -!UNDEF PROG1_OUTDIR !UNDEF PROG2_OUTDIR !UNDEF PROG3_OUTDIR !UNDEF CARES_OBJDIR -!UNDEF PROG1_OBJDIR !UNDEF PROG2_OBJDIR !UNDEF PROG3_OBJDIR !ENDIF @@ -301,17 +298,6 @@ CARES_OBJS = $(CARES_OBJS:.c=.obj) CARES_OBJS = $(CARES_OBJS) $(CARES_OBJDIR)\cares.res !ENDIF -!IF [ECHO PROG1_OBJS=^$(PROG1_OBJDIR)\$(SAMPLESOURCES: = $(PROG1_OBJDIR^)\) > .\prog1_objs.inc] == 0 -!INCLUDE .\prog1_objs.inc -!IF [DEL .\prog1_objs.inc] -!ENDIF -!ELSE -!ERROR Problem generating PROG1_OBJS list. -!ENDIF -PROG1_OBJS = $(PROG1_OBJS:.c=.obj) -PROG1_OBJS = $(PROG1_OBJS:/=\) -PROG1_OBJS = $(PROG1_OBJS) $(PROG1_OBJDIR)\acountry.obj - !IF [ECHO PROG2_OBJS=^$(PROG2_OBJDIR)\$(SAMPLESOURCES: = $(PROG2_OBJDIR^)\) > .\prog2_objs.inc] == 0 !INCLUDE .\prog2_objs.inc !IF [DEL .\prog2_objs.inc] @@ -350,9 +336,6 @@ PROG3_OBJS = $(PROG3_OBJS) $(PROG3_OBJDIR)\ahost.obj {$(SRCDIR)\src\lib}.c{$(CARES_OBJDIR)}.obj: $(CC_CMD) $(CC_CFLAGS) $(CARES_CFLAGS) /Fo$@ /Fd$(@D)\ /c $< -{$(SRCDIR)\src\tools}.c{$(PROG1_OBJDIR)}.obj: - $(CC_CMD) $(CC_CFLAGS) $(SPROG_CFLAGS) /Fo$@ /Fd$(@D)\ /c $< - {$(SRCDIR)\src\tools}.c{$(PROG2_OBJDIR)}.obj: $(CC_CMD) $(CC_CFLAGS) $(SPROG_CFLAGS) /Fo$@ /Fd$(@D)\ /c $< @@ -362,9 +345,6 @@ PROG3_OBJS = $(PROG3_OBJS) $(PROG3_OBJDIR)\ahost.obj # Hack Alert! we reference ../lib/ files in the Makefile.inc for tools as they # share some files with the library itself. We need to hack around that here. -{$(SRCDIR)\src\lib}.c{$(PROG1_OBJDIR)\..\lib}.obj: - $(CC_CMD) $(CC_CFLAGS) $(SPROG_CFLAGS) /Fo$(PROG1_OBJDIR)\$(@F) /Fd$(PROG1_OBJDIR)\ /c $< - {$(SRCDIR)\src\lib}.c{$(PROG2_OBJDIR)\..\lib}.obj: $(CC_CMD) $(CC_CFLAGS) $(SPROG_CFLAGS) /Fo$(PROG2_OBJDIR)\$(@F) /Fd$(PROG2_OBJDIR)\ /c $< @@ -403,7 +383,7 @@ install: !IF "$(VALID_CFGSET)" == "TRUE" -ALL: c-ares acountry adig ahost +ALL: c-ares adig ahost @ # $(HHEADERS) $(CSOURCES) @@ -413,11 +393,6 @@ c-ares: $(CARES_OBJDIR) $(CARES_OBJS) $(CARES_OUTDIR) @if exist $(CARES_OUTDIR)\$(CARES_TARGET).manifest mt -nologo -manifest $(CARES_OUTDIR)\$(CARES_TARGET).manifest -outputresource:$(CARES_OUTDIR)\$(CARES_TARGET);2 ! ENDIF -# acountry.c $(SAMPLESOURCES) $(SAMPLEHEADERS) -acountry: c-ares $(PROG1_OBJDIR) $(PROG1_OBJS) $(PROG1_OUTDIR) - $(SPROG_LINK) $(SPROG_LFLAGS) /out:$(PROG1_OUTDIR)\acountry.exe $(PROG1_OBJS:..\lib=) - @if exist $(PROG1_OUTDIR)\acountry.exe.manifest mt -nologo -manifest $(PROG1_OUTDIR)\acountry.exe.manifest -outputresource:$(PROG1_OUTDIR)\acountry.exe;1 - # adig.c $(SAMPLESOURCES) $(SAMPLEHEADERS) adig: c-ares $(PROG2_OBJDIR) $(PROG2_OBJS) $(PROG2_OUTDIR) $(SPROG_LINK) $(SPROG_LFLAGS) /out:$(PROG2_OUTDIR)\adig.exe $(PROG2_OBJS:..\lib=) @@ -431,9 +406,6 @@ ahost: c-ares $(PROG3_OBJDIR) $(PROG3_OBJS) $(PROG3_OUTDIR) $(CARES_OUTDIR): $(CARES_DIR) @if not exist $(CARES_OUTDIR) mkdir $(CARES_OUTDIR) -$(PROG1_OUTDIR): $(PROG1_DIR) - @if not exist $(PROG1_OUTDIR) mkdir $(PROG1_OUTDIR) - $(PROG2_OUTDIR): $(PROG2_DIR) @if not exist $(PROG2_OUTDIR) mkdir $(PROG2_OUTDIR) @@ -443,9 +415,6 @@ $(PROG3_OUTDIR): $(PROG3_DIR) $(CARES_OBJDIR): $(CARES_OUTDIR) @if not exist $(CARES_OBJDIR) mkdir $(CARES_OBJDIR) -$(PROG1_OBJDIR): $(PROG1_OUTDIR) - @if not exist $(PROG1_OBJDIR) mkdir $(PROG1_OBJDIR) - $(PROG2_OBJDIR): $(PROG2_OUTDIR) @if not exist $(PROG2_OBJDIR) mkdir $(PROG2_OBJDIR) @@ -454,7 +423,6 @@ $(PROG3_OBJDIR): $(PROG3_OUTDIR) clean: @-RMDIR /S /Q $(CARES_OUTDIR) >NUL 2>&1 - @-RMDIR /S /Q $(PROG1_OUTDIR) >NUL 2>&1 @-RMDIR /S /Q $(PROG2_OUTDIR) >NUL 2>&1 @-RMDIR /S /Q $(PROG3_OUTDIR) >NUL 2>&1 @@ -469,6 +437,7 @@ install: @copy /y $(SRCDIR)\include\ares_build.h "$(INSTALL_DIR_INC)" >NUL @copy /y $(SRCDIR)\include\ares_rules.h "$(INSTALL_DIR_INC)" >NUL @copy /y $(SRCDIR)\include\ares_version.h "$(INSTALL_DIR_INC)" >NUL + @copy /y $(SRCDIR)\include\ares_dns_record.h "$(INSTALL_DIR_INC)" >NUL @echo Installed c-ares $(CFG) !ENDIF @@ -479,9 +448,6 @@ $(BASE_DIR): $(CARES_DIR): $(BASE_DIR) @if not exist $(CARES_DIR) mkdir $(CARES_DIR) -$(PROG1_DIR): $(BASE_DIR) - @if not exist $(PROG1_DIR) mkdir $(PROG1_DIR) - $(PROG2_DIR): $(BASE_DIR) @if not exist $(PROG2_DIR) mkdir $(PROG2_DIR) diff --git a/lib/c-ares-1.19.1/Makefile.netware b/lib/c-ares-1.23.0/Makefile.netware similarity index 97% rename from lib/c-ares-1.19.1/Makefile.netware rename to lib/c-ares-1.23.0/Makefile.netware index e1a8a5523ca..5ebbc76207d 100644 --- a/lib/c-ares-1.19.1/Makefile.netware +++ b/lib/c-ares-1.23.0/Makefile.netware @@ -1,9 +1,10 @@ ################################################################# # -## Makefile for building libcares (NetWare version - gnu make) -## Use: make -f Makefile.netware -## -## Comments to: Guenter Knauf http://www.gknw.de/phpbb +# Makefile for building libcares (NetWare version - gnu make) +# Use: make -f Makefile.netware +# +# Copyright (C) Guenter Knauf +# SPDX-License-Identifier: MIT # ################################################################# @@ -17,7 +18,7 @@ INSTDIR = ../ares-$(LIBCARES_VERSION_STR)-bin-nw endif # Edit the vars below to change NLM target settings. -TARGETS = adig.nlm ahost.nlm acountry.nlm +TARGETS = adig.nlm ahost.nlm LTARGET = libcares.$(LIBEXT) VERSION = $(LIBCARES_VERSION) COPYR = $(LIBCARES_COPYRIGHT_STR) @@ -91,7 +92,7 @@ ifeq ($(LIBARCH),LIBC) CFLAGS += -align 4 else # PRELUDE = $(SDK_CLIB)/imports/clibpre.o - # to avoid the __init_* / __deinit_* whoes dont use prelude from NDK + # to avoid the __init_* / __deinit_* whose dont use prelude from NDK PRELUDE = "$(MWCW_PATH)/libraries/runtime/prelude.obj" # CFLAGS += -include "$(MWCW_PATH)/headers/nlm_clib_prefix.h" CFLAGS += -align 1 @@ -113,7 +114,7 @@ ifeq ($(LIBARCH),LIBC) PRELUDE = $(SDK_LIBC)/imports/libcpre.gcc.o else # PRELUDE = $(SDK_CLIB)/imports/clibpre.gcc.o - # to avoid the __init_* / __deinit_* whoes dont use prelude from NDK + # to avoid the __init_* / __deinit_* whose dont use prelude from NDK # http://www.gknw.net/development/mk_nlm/gcc_pre.zip PRELUDE = $(NDK_ROOT)/pre/prelude.o CFLAGS += -include $(NDKBASE)/nlmconv/genlm.h diff --git a/lib/c-ares-1.19.1/NEWS b/lib/c-ares-1.23.0/NEWS similarity index 100% rename from lib/c-ares-1.19.1/NEWS rename to lib/c-ares-1.23.0/NEWS diff --git a/lib/c-ares-1.19.1/README.cares b/lib/c-ares-1.23.0/README.cares similarity index 100% rename from lib/c-ares-1.19.1/README.cares rename to lib/c-ares-1.23.0/README.cares diff --git a/lib/c-ares-1.19.1/README.md b/lib/c-ares-1.23.0/README.md similarity index 91% rename from lib/c-ares-1.19.1/README.md rename to lib/c-ares-1.23.0/README.md index b507a5c288e..29788a8a2df 100644 --- a/lib/c-ares-1.19.1/README.md +++ b/lib/c-ares-1.23.0/README.md @@ -6,7 +6,8 @@ c-ares [![Coverage Status](https://coveralls.io/repos/github/c-ares/c-ares/badge.svg)](https://coveralls.io/github/c-ares/c-ares) [![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/291/badge)](https://bestpractices.coreinfrastructure.org/projects/291) [![Fuzzing Status](https://oss-fuzz-build-logs.storage.googleapis.com/badges/c-ares.svg)](https://bugs.chromium.org/p/oss-fuzz/issues/list?sort=-opened&can=1&q=proj:c-ares) -[![Releases](https://coderelease.io/badge/c-ares/c-ares)](https://coderelease.io/github/repository/c-ares/c-ares) +[![Bugs](https://sonarcloud.io/api/project_badges/measure?project=c-ares_c-ares&metric=bugs)](https://sonarcloud.io/summary/new_code?id=c-ares_c-ares) +[![Coverity Scan Status](https://scan.coverity.com/projects/c-ares/badge.svg)](https://scan.coverity.com/projects/c-ares) This is c-ares, an asynchronous resolver library. It is intended for applications which need to perform DNS queries without blocking, or need to @@ -22,8 +23,7 @@ If you find bugs, correct flaws, have questions or have comments in general in regard to c-ares (or by all means the original ares too), get in touch with us on the c-ares mailing list: https://lists.haxx.se/listinfo/c-ares -c-ares is of course distributed under the same MIT-style license as the -original ares. +c-ares is distributed under the MIT license. You'll find all c-ares details and news here: https://c-ares.org/ diff --git a/lib/c-ares-1.19.1/README.msvc b/lib/c-ares-1.23.0/README.msvc similarity index 98% rename from lib/c-ares-1.19.1/README.msvc rename to lib/c-ares-1.23.0/README.msvc index 396f497db40..97d4f0cf583 100644 --- a/lib/c-ares-1.19.1/README.msvc +++ b/lib/c-ares-1.23.0/README.msvc @@ -28,7 +28,7 @@ depends on the MSVC compiler version being used to build c-ares. Below the MSVCXX folder there will exist four folders named 'cares', - 'ahost', 'acountry', and 'adig'. The 'cares' folder is the one that + 'ahost', and 'adig'. The 'cares' folder is the one that holds the c-ares libraries you have just generated, the other three hold sample programs that use the libraries. diff --git a/lib/c-ares-1.23.0/RELEASE-NOTES b/lib/c-ares-1.23.0/RELEASE-NOTES new file mode 100644 index 00000000000..cc80ccdcc1a --- /dev/null +++ b/lib/c-ares-1.23.0/RELEASE-NOTES @@ -0,0 +1,59 @@ +c-ares version 1.23.0 + +This is a feature and bugfix release. + +Features: + o Introduce optional (but on by default) thread-safety for the c-ares + library. This has no API nor ABI implications. [2] + o resolv.conf in modern systems uses attempts and timeouts options instead + of the old retrans and retry options. [6] + o Query caching support based on TTL of responses. Can be enabled via + ares_init_options() with ARES_OPT_QUERY_CACHE. [12] + +Bug Fixes: + o ares_init_options() for ARES_OPT_UDP_PORT and ARES_OPT_TCP_PORT accept the + port in host byte order, but it was reading it as network byte order. + Regression introduced in 1.20.0. [1] + o ares_init_options() for ARES_FLAG_NOSEARCH was not being honored for + ares_getaddrinfo() or ares_gethostbyname(). Regression introduced in + 1.16.0. [3] + o Autotools MacOS and iOS version check was failing [4] + o Environment variables passed to c-ares are meant to be an override for + system configuration. Regression introduced in 1.22.0. [5] + o Spelling fixes as detected by codespell. [7] + o The timeout returned by ares_timeout() was truncated to milliseconds but + validated to microseconds which could cause a user to attempt to process + timeouts prior to the timeout actually expiring. [8] + o CMake was not honoring CXXFLAGS passed in via the environment which could + cause compile and link errors with distribution hardening flags during + packaging. [9] + o Fix Windows UWP and Cygwin compilation. [10] + o ares_set_servers_*() for legacy reasons needs to accept an empty server list + and zero out all servers. This results in an inoperable channel and thus is + only used in simulation testing, but we don't want to break users. + Regression introduced in 1.21.0. [11] + +Thanks go to these friendly people for their efforts and contributions: + Brad House (@bradh352) + Christian Clauss (@cclauss) + Daniel Stenberg (@bagder) + Deal (@halx99) + Ignat (@Kontakter) + @petrvh +(6 contributors) + +References to bug reports and discussions on issues: + [1] = https://github.com/c-ares/c-ares/commit/fb52c3f + [2] = https://github.com/c-ares/c-ares/pull/636 + [3] = https://github.com/c-ares/c-ares/pull/638 + [4] = https://github.com/c-ares/c-ares/commit/f4d8c9a + [5] = https://github.com/c-ares/c-ares/commit/b674abd + [6] = https://github.com/c-ares/c-ares/pull/632 + [7] = https://github.com/c-ares/c-ares/pull/634 + [8] = https://github.com/c-ares/c-ares/pull/633 + [9] = https://github.com/c-ares/c-ares/commit/33ee6c0 + [10] = https://github.com/c-ares/c-ares/pull/627 + [11] = https://github.com/c-ares/c-ares/commit/320cefe + [12] = https://github.com/c-ares/c-ares/pull/625 + + diff --git a/lib/c-ares-1.19.1/SECURITY.md b/lib/c-ares-1.23.0/SECURITY.md similarity index 100% rename from lib/c-ares-1.19.1/SECURITY.md rename to lib/c-ares-1.23.0/SECURITY.md diff --git a/lib/c-ares-1.23.0/TODO b/lib/c-ares-1.23.0/TODO new file mode 100644 index 00000000000..3b200926e35 --- /dev/null +++ b/lib/c-ares-1.23.0/TODO @@ -0,0 +1,4 @@ +TODO +==== + +Please see https://github.com/c-ares/c-ares/issues diff --git a/lib/c-ares-1.19.1/acinclude.m4 b/lib/c-ares-1.23.0/acinclude.m4 similarity index 99% rename from lib/c-ares-1.19.1/acinclude.m4 rename to lib/c-ares-1.23.0/acinclude.m4 index c255198e5f4..2644cdfa34b 100644 --- a/lib/c-ares-1.19.1/acinclude.m4 +++ b/lib/c-ares-1.23.0/acinclude.m4 @@ -1,4 +1,5 @@ - +# Copyright (C) The c-ares project and its contributors +# SPDX-License-Identifier: MIT dnl CURL_CHECK_DEF (SYMBOL, [INCLUDES], [SILENT]) dnl ------------------------------------------------- diff --git a/lib/c-ares-1.19.1/aclocal.m4 b/lib/c-ares-1.23.0/aclocal.m4 similarity index 99% rename from lib/c-ares-1.19.1/aclocal.m4 rename to lib/c-ares-1.23.0/aclocal.m4 index ef2987bfa00..49403387854 100644 --- a/lib/c-ares-1.19.1/aclocal.m4 +++ b/lib/c-ares-1.23.0/aclocal.m4 @@ -1188,11 +1188,15 @@ m4_include([m4/ax_ac_append_to_file.m4]) m4_include([m4/ax_ac_print_to_file.m4]) m4_include([m4/ax_add_am_macro_static.m4]) m4_include([m4/ax_am_macros_static.m4]) +m4_include([m4/ax_append_compile_flags.m4]) +m4_include([m4/ax_append_flag.m4]) +m4_include([m4/ax_check_compile_flag.m4]) m4_include([m4/ax_check_gnu_make.m4]) m4_include([m4/ax_code_coverage.m4]) m4_include([m4/ax_cxx_compile_stdcxx.m4]) m4_include([m4/ax_cxx_compile_stdcxx_11.m4]) m4_include([m4/ax_file_escapes.m4]) +m4_include([m4/ax_pthread.m4]) m4_include([m4/ax_require_defined.m4]) m4_include([m4/cares-compilers.m4]) m4_include([m4/cares-confopts.m4]) diff --git a/lib/c-ares-1.19.1/test/aminclude_static.am b/lib/c-ares-1.23.0/aminclude_static.am similarity index 99% rename from lib/c-ares-1.19.1/test/aminclude_static.am rename to lib/c-ares-1.23.0/aminclude_static.am index 33c6e9f2f34..2348e334511 100644 --- a/lib/c-ares-1.19.1/test/aminclude_static.am +++ b/lib/c-ares-1.23.0/aminclude_static.am @@ -1,6 +1,6 @@ # aminclude_static.am generated automatically by Autoconf -# from AX_AM_MACROS_STATIC on Mon May 22 13:36:05 CEST 2023 +# from AX_AM_MACROS_STATIC on Thu Nov 30 13:40:06 CET 2023 # Code coverage diff --git a/lib/c-ares-1.19.1/buildconf b/lib/c-ares-1.23.0/buildconf similarity index 58% rename from lib/c-ares-1.19.1/buildconf rename to lib/c-ares-1.23.0/buildconf index 4e4c17e9991..94c6abc7c22 100755 --- a/lib/c-ares-1.19.1/buildconf +++ b/lib/c-ares-1.23.0/buildconf @@ -1,4 +1,6 @@ #!/bin/sh +# Copyright (C) The c-ares project and its contributors +# SPDX-License-Identifier: MIT echo "*** Do not use buildconf. Instead, just use: autoreconf -fi" >&2 exec ${AUTORECONF:-autoreconf} -fi "${@}" diff --git a/lib/c-ares-1.19.1/buildconf.bat b/lib/c-ares-1.23.0/buildconf.bat similarity index 85% rename from lib/c-ares-1.19.1/buildconf.bat rename to lib/c-ares-1.23.0/buildconf.bat index dcee45239b8..0227c885214 100644 --- a/lib/c-ares-1.19.1/buildconf.bat +++ b/lib/c-ares-1.23.0/buildconf.bat @@ -6,6 +6,9 @@ REM systems where there is no autotools support (i.e. Microsoft). REM REM This file is not included nor needed for c-ares' release REM archives, neither for c-ares' daily snapshot archives. +REM +REM Copyright (C) The c-ares project and its contributors +REM SPDX-License-Identifier: MIT if exist GIT-INFO goto start_doing ECHO ERROR: This file shall only be used with a c-ares git checkout. diff --git a/lib/c-ares-1.19.1/c-ares-config.cmake.in b/lib/c-ares-1.23.0/c-ares-config.cmake.in similarity index 90% rename from lib/c-ares-1.19.1/c-ares-config.cmake.in rename to lib/c-ares-1.23.0/c-ares-config.cmake.in index 1d05b24e547..f68ed832b98 100644 --- a/lib/c-ares-1.19.1/c-ares-config.cmake.in +++ b/lib/c-ares-1.23.0/c-ares-config.cmake.in @@ -1,3 +1,6 @@ +# Copyright (C) The c-ares project and its contributors +# SPDX-License-Identifier: MIT + @PACKAGE_INIT@ set_and_check(c-ares_INCLUDE_DIR "@PACKAGE_CMAKE_INSTALL_INCLUDEDIR@") diff --git a/lib/c-ares-1.23.0/cmake/EnableWarnings.cmake b/lib/c-ares-1.23.0/cmake/EnableWarnings.cmake new file mode 100644 index 00000000000..a394a8721f7 --- /dev/null +++ b/lib/c-ares-1.23.0/cmake/EnableWarnings.cmake @@ -0,0 +1,399 @@ +# Copyright (c) Monetra Technologies LLC +# SPDX-License-Identifier: MIT + +# EnableWarnings.cmake +# +# Checks for and turns on a large number of warning C flags. +# +# Adds the following helper functions: +# +# remove_warnings(... list of warnings ...) +# Turn off given list of individual warnings for all targets and subdirectories added after this. +# +# remove_all_warnings() +# Remove all warning flags, add -w to suppress built-in warnings. +# +# remove_all_warnings_from_targets(... list of targets ...) +# Suppress warnings for the given targets only. +# +# push_warnings() +# Save current warning flags by pushing them onto an internal stack. Note that modifications to the internal +# stack are only visible in the current CMakeLists.txt file and its children. +# +# Note: changing warning flags multiple times in the same directory only affects add_subdirectory() calls. +# Targets in the directory will always use the warning flags in effect at the end of the CMakeLists.txt +# file - this is due to really weird and annoying legacy behavior of CMAKE_C_FLAGS. +# +# pop_warnings() +# Restore the last set of flags that were saved with push_warnings(). Note that modifications to the internal +# stack are only visible in the current CMakeLists.txt file and its children. +# + +if (_internal_enable_warnings_already_run) + return() +endif () +set(_internal_enable_warnings_already_run TRUE) + +include(CheckCCompilerFlag) +include(CheckCXXCompilerFlag) + +get_property(languages GLOBAL PROPERTY ENABLED_LANGUAGES) + +# internal helper: _int_enable_warnings_set_flags_ex(langs_var configs_var [warnings flags]) +function(_int_enable_warnings_set_flags_ex langs_var configs_var) + if (NOT ARGN) + return() + endif () + + if (NOT ${configs_var}) + set(${configs_var} "NONE") + endif () + string(TOUPPER "${${configs_var}}" ${configs_var}) + + foreach(_flag ${ARGN}) + string(MAKE_C_IDENTIFIER "HAVE_${_flag}" varname) + + if ("C" IN_LIST ${langs_var}) + check_c_compiler_flag(${_flag} ${varname}) + if (${varname}) + foreach (config IN LISTS ${configs_var}) + if (config STREQUAL "NONE") + set(config) + else () + set(config "_${config}") + endif () + string(APPEND CMAKE_C_FLAGS${config} " ${_flag}") + endforeach () + endif () + endif () + + if ("CXX" IN_LIST ${langs_var}) + string(APPEND varname "_CXX") + check_cxx_compiler_flag(${_flag} ${varname}) + if (${varname}) + foreach (config IN LISTS ${configs_var}) + if (config STREQUAL "NONE") + set(config) + else () + set(config "_${config}") + endif () + string(APPEND CMAKE_CXX_FLAGS${config} " ${_flag}") + endforeach () + endif () + endif () + endforeach() + + foreach(lang C CXX) + foreach (config IN LISTS ${configs_var}) + string(TOUPPER "${config}" config) + if (config STREQUAL "NONE") + set(config) + else () + set(config "_${config}") + endif () + string(STRIP "${CMAKE_${lang}_FLAGS${config}}" CMAKE_${lang}_FLAGS${config}) + set(CMAKE_${lang}_FLAGS${config} "${CMAKE_${lang}_FLAGS${config}}" PARENT_SCOPE) + endforeach () + endforeach() +endfunction() + +# internal helper: _int_enable_warnings_set_flags(langs_var [warnings flags]) +macro(_int_enable_warnings_set_flags langs_var) + set(configs "NONE") + _int_enable_warnings_set_flags_ex(${langs_var} configs ${ARGN}) +endmacro() + +set(_flags_C) +set(_flags_CXX) +set(_debug_flags_C) +set(_debug_flags_CXX) + +if (MSVC) + # Visual Studio uses a completely different nomenclature for warnings than gcc/mingw/clang, so none of the + # "-W[name]" warnings will work. + + # W4 would be better but it produces unnecessary warnings like: + # * warning C4706: assignment within conditional expression + # Triggered when doing "while(1)" + # * warning C4115: 'timeval' : named type definition in parentheses + # * warning C4201: nonstandard extension used : nameless struct/union + # Triggered by system includes (commctrl.h, shtypes.h, Shlobj.h) + set(_flags + /W3 + /we4013 # Treat "function undefined, assuming extern returning int" warning as an error. https://docs.microsoft.com/en-us/cpp/error-messages/compiler-warnings/compiler-warning-level-3-c4013 + ) + + list(APPEND _flags_C ${_flags}) + list(APPEND _flags_CXX ${_flags}) + +elseif (CMAKE_C_COMPILER_ID MATCHES "Intel") + # Intel's compiler warning flags are more like Visual Studio than GCC, though the numbers aren't the same. + set(_flags + # Use warning level 3, quite wordy. + -w3 + # Disable warnings we don't care about (add more as they are encountered). + -wd383 # Spammy warning about initializing from a temporary object in C++ (which is done all the time ...). + -wd11074 # Diagnostic related to inlining. + -wd11076 # Diagnostic related to inlining. + ) + + list(APPEND _flags_C ${_flags}) + list(APPEND _flags_CXX ${_flags}) + +elseif (CMAKE_C_COMPILER_ID MATCHES "XL") + set (_flags + -qwarn64 + -qformat=all + -qflag=i:i + ) + list(APPEND _flags_C ${_flags}) + list(APPEND _flags_CXX ${_flags}) + +else () + # If we're compiling with GCC / Clang / MinGW (or anything else besides Visual Studio or Intel): + # C Flags: + list(APPEND _flags_C + -Wall + -Wextra + + # Enable additional warnings not covered by Wall and Wextra. + -Wcast-align + -Wconversion + -Wdeclaration-after-statement + -Wdouble-promotion + -Wfloat-equal + -Wformat-security + -Winit-self + -Wjump-misses-init + -Wlogical-op + -Wmissing-braces + -Wmissing-declarations + -Wmissing-format-attribute + -Wmissing-include-dirs + -Wmissing-prototypes + -Wnested-externs + -Wno-coverage-mismatch + -Wold-style-definition + -Wpacked + -Wpointer-arith + -Wredundant-decls + -Wshadow + -Wsign-conversion + -Wstrict-overflow + -Wstrict-prototypes + -Wtrampolines + -Wundef + -Wunused + -Wvariadic-macros + -Wvla + -Wwrite-strings + + # On Windows MinGW I think implicit fallthrough enabled by -Wextra must not default to 3 + -Wimplicit-fallthrough=3 + + # Treat implicit variable typing and implicit function declarations as errors. + -Werror=implicit-int + -Werror=implicit-function-declaration + + # Make MacOSX honor -mmacosx-version-min + -Werror=partial-availability + + # Some clang versions might warn if an argument like "-I/path/to/headers" is unused, + # silence these. + -Qunused-arguments + ) + + # C++ flags: + list(APPEND _flags_CXX + -Wall + -Wextra + + # Enable additional warnings not covered by Wall and Wextra. + -Wcast-align + -Wformat-security + -Wmissing-declarations + -Wmissing-format-attribute + -Wpacked-bitfield-compat + -Wredundant-decls + -Wvla + + # Turn off unused parameter warnings with C++ (they happen often in C++ and Qt). + -Wno-unused-parameter + + # Some clang versions might warn if an argument like "-I/path/to/headers" is unused, + # silence these. + -Qunused-arguments + ) + + # Note: when cross-compiling to Windows from Cygwin, the Qt Mingw packages have a bunch of + # noisy type-conversion warnings in headers. So, only enable those warnings if we're + # not building that configuration. + if (NOT (WIN32 AND (CMAKE_HOST_SYSTEM_NAME MATCHES "CYGWIN"))) + list(APPEND _flags_CXX + -Wconversion + -Wfloat-equal + -Wsign-conversion + ) + endif () + + # Add flags to force colored output even when output is redirected via pipe. + if (CMAKE_GENERATOR MATCHES "Ninja") + set(color_default TRUE) + else () + set(color_default FALSE) + endif () + option(FORCE_COLOR "Force compiler to always colorize, even when output is redirected." ${color_default}) + mark_as_advanced(FORCE FORCE_COLOR) + if (FORCE_COLOR) + set(_flags + -fdiagnostics-color=always # GCC + -fcolor-diagnostics # Clang + ) + list(APPEND _flags_C ${_flags}) + list(APPEND _flags_CXX ${_flags}) + endif () + + # Add -fno-omit-frame-pointer (and optionally -fno-inline) to make debugging and stack dumps nicer. + set(_flags + -fno-omit-frame-pointer + ) + option(M_NO_INLINE "Disable function inlining for RelWithDebInfo and Debug configurations?" FALSE) + if (M_NO_INLINE) + list(APPEND _flags + -fno-inline + ) + endif () + list(APPEND _debug_flags_C ${_flags}) + list(APPEND _debug_flags_CXX ${_flags}) +endif () + +# Check and set compiler flags. +set(_debug_configs + RelWithDebInfo + Debug +) +foreach(_lang ${languages}) + _int_enable_warnings_set_flags(_lang ${_flags_${_lang}}) + _int_enable_warnings_set_flags_ex(_lang _debug_configs ${_debug_flags_${_lang}}) + + # Ensure pure Debug builds are NOT optimized (not possible on Visual Studio). + # Any optimization of a Debug build will prevent debuggers like lldb from + # fully displaying backtraces and stepping. + if (NOT MSVC) + set(_config Debug) + _int_enable_warnings_set_flags_ex(_lang _config -O0) + endif () +endforeach() + + + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +# Helper functions + + +# This function can be called in subdirectories, to prune out warnings that they don't want. +# vararg: warning flags to remove from list of enabled warnings. All "no" flags after EXPLICIT_DISABLE +# will be added to C flags. +# +# Ex.: remove_warnings(-Wall -Wdouble-promotion -Wcomment) prunes those warnings flags from the compile command. +function(remove_warnings) + get_property(languages GLOBAL PROPERTY ENABLED_LANGUAGES) + set(langs C) + if ("CXX" IN_LIST languages) + list(APPEND langs CXX) + endif () + + foreach(lang ${langs}) + set(toadd) + set(in_explicit_disable FALSE) + foreach (flag ${ARGN}) + if (flag STREQUAL "EXPLICIT_DISABLE") + set(in_explicit_disable TRUE) + elseif (in_explicit_disable) + list(APPEND toadd "${flag}") + else () + string(REGEX REPLACE "${flag}([ \t]+|$)" "" CMAKE_${lang}_FLAGS "${CMAKE_${lang}_FLAGS}") + endif () + endforeach () + _int_enable_warnings_set_flags(lang ${toadd}) + string(STRIP "${CMAKE_${lang}_FLAGS}" CMAKE_${lang}_FLAGS) + set(CMAKE_${lang}_FLAGS "${CMAKE_${lang}_FLAGS}" PARENT_SCOPE) + endforeach() +endfunction() + + +# Explicitly suppress all warnings. As long as this flag is the last warning flag, warnings will be +# suppressed even if earlier flags enabled warnings. +function(remove_all_warnings) + get_property(languages GLOBAL PROPERTY ENABLED_LANGUAGES) + set(langs C) + if ("CXX" IN_LIST languages) + list(APPEND langs CXX) + endif () + + foreach(lang ${langs}) + string(REGEX REPLACE "[-/][Ww][^ \t]*([ \t]+|$)" "" CMAKE_${lang}_FLAGS "${CMAKE_${lang}_FLAGS}") + if (MSVC) + string(APPEND CMAKE_${lang}_FLAGS " /w") + else () + string(APPEND CMAKE_${lang}_FLAGS " -w") + endif () + string(STRIP "${CMAKE_${lang}_FLAGS}" CMAKE_${lang}_FLAGS) + set(CMAKE_${lang}_FLAGS "${CMAKE_${lang}_FLAGS}" PARENT_SCOPE) + endforeach() +endfunction() + + +function(remove_all_warnings_from_targets) + foreach (target ${ARGN}) + if (MSVC) + target_compile_options(${target} PRIVATE "/w") + else () + target_compile_options(${target} PRIVATE "-w") + endif () + endforeach() +endfunction() + + +# Save the current warning settings to an internal variable. +function(push_warnings) + get_property(languages GLOBAL PROPERTY ENABLED_LANGUAGES) + set(langs C) + if ("CXX" IN_LIST languages) + list(APPEND langs CXX) + endif () + + foreach(lang ${langs}) + if (CMAKE_${lang}_FLAGS MATCHES ";") + message(AUTHOR_WARNING "Cannot push warnings for ${lang}, CMAKE_${lang}_FLAGS contains semicolons") + continue() + endif () + # Add current flags to end of internal list. + list(APPEND _enable_warnings_internal_${lang}_flags_stack "${CMAKE_${lang}_FLAGS}") + # Propagate results up to caller's scope. + set(_enable_warnings_internal_${lang}_flags_stack "${_enable_warnings_internal_${lang}_flags_stack}" PARENT_SCOPE) + endforeach() +endfunction() + + +# Restore the current warning settings from an internal variable. +function(pop_warnings) + get_property(languages GLOBAL PROPERTY ENABLED_LANGUAGES) + set(langs C) + if ("CXX" IN_LIST languages) + list(APPEND langs CXX) + endif () + + foreach(lang ${langs}) + if (NOT _enable_warnings_internal_${lang}_flags_stack) + continue() + endif () + # Pop flags off of end of list, overwrite current flags with whatever we popped off. + list(GET _enable_warnings_internal_${lang}_flags_stack -1 CMAKE_${lang}_FLAGS) + list(REMOVE_AT _enable_warnings_internal_${lang}_flags_stack -1) + # Propagate results up to caller's scope. + set(_enable_warnings_internal_${lang}_flags_stack "${_enable_warnings_internal_${lang}_flags_stack}" PARENT_SCOPE) + string(STRIP "${CMAKE_${lang}_FLAGS}" CMAKE_${lang}_FLAGS) + set(CMAKE_${lang}_FLAGS "${CMAKE_${lang}_FLAGS}" PARENT_SCOPE) + endforeach() +endfunction() diff --git a/lib/c-ares-1.19.1/compile b/lib/c-ares-1.23.0/compile similarity index 100% rename from lib/c-ares-1.19.1/compile rename to lib/c-ares-1.23.0/compile diff --git a/lib/c-ares-1.19.1/config.guess b/lib/c-ares-1.23.0/config.guess similarity index 100% rename from lib/c-ares-1.19.1/config.guess rename to lib/c-ares-1.23.0/config.guess diff --git a/lib/c-ares-1.19.1/config.sub b/lib/c-ares-1.23.0/config.sub similarity index 100% rename from lib/c-ares-1.19.1/config.sub rename to lib/c-ares-1.23.0/config.sub diff --git a/lib/c-ares-1.19.1/configure b/lib/c-ares-1.23.0/configure similarity index 96% rename from lib/c-ares-1.19.1/configure rename to lib/c-ares-1.23.0/configure index 2f182e0ce31..481483327bb 100755 --- a/lib/c-ares-1.19.1/configure +++ b/lib/c-ares-1.23.0/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.71 for c-ares 1.19.1. +# Generated by GNU Autoconf 2.71 for c-ares 1.23.0. # # Report bugs to . # @@ -855,8 +855,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='c-ares' PACKAGE_TARNAME='c-ares' -PACKAGE_VERSION='1.19.1' -PACKAGE_STRING='c-ares 1.19.1' +PACKAGE_VERSION='1.23.0' +PACKAGE_STRING='c-ares 1.23.0' PACKAGE_BUGREPORT='c-ares mailing list: http://lists.haxx.se/listinfo/c-ares' PACKAGE_URL='' @@ -905,6 +905,11 @@ CARES_PRIVATE_LIBS CFLAG_CARES_SYMBOL_HIDING DOING_CARES_SYMBOL_HIDING_FALSE DOING_CARES_SYMBOL_HIDING_TRUE +PTHREAD_CFLAGS +PTHREAD_LIBS +PTHREAD_CXX +PTHREAD_CC +ax_pthread_config CARES_RANDOM_FILE DOING_NATIVE_WINDOWS_FALSE DOING_NATIVE_WINDOWS_TRUE @@ -1086,6 +1091,7 @@ enable_libtool_lock enable_libgcc with_random enable_nonblocking +enable_cares_threads enable_tests ' ac_precious_vars='build_alias @@ -1650,7 +1656,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures c-ares 1.19.1 to adapt to many kinds of systems. +\`configure' configures c-ares 1.23.0 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1721,7 +1727,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of c-ares 1.19.1:";; + short | recursive ) echo "Configuration of c-ares 1.23.0:";; esac cat <<\_ACEOF @@ -1763,6 +1769,7 @@ Optional Features: --enable-libgcc use libgcc when linking --enable-nonblocking Enable non-blocking communications --disable-nonblocking Disable non-blocking communications + --disable-cares-threads Disable building of thread safety support --enable-tests build test suite Optional Packages: @@ -1861,7 +1868,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -c-ares configure 1.19.1 +c-ares configure 1.23.0 generated by GNU Autoconf 2.71 Copyright (C) 2021 Free Software Foundation, Inc. @@ -2453,7 +2460,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by c-ares $as_me 1.19.1, which was +It was created by c-ares $as_me 1.23.0, which was generated by GNU Autoconf 2.71. Invocation command line was $ $0$ac_configure_args_raw @@ -3426,7 +3433,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu -CARES_VERSION_INFO="8:1:6" +CARES_VERSION_INFO="11:0:9" @@ -3563,20 +3570,17 @@ printf "%s\n" "yes" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable strict compiler warnings" >&5 printf %s "checking whether to enable strict compiler warnings... " >&6; } - OPT_COMPILER_WARNINGS="default" + OPT_COMPILER_WARNINGS="yes" # Check whether --enable-warnings was given. if test ${enable_warnings+y} then : - enableval=$enable_warnings; OPT_COMPILER_WARNINGS=$enableval + enableval=$enable_warnings; OPT_COMPILER_WARNINGS=yes fi case "$OPT_COMPILER_WARNINGS" in no) want_warnings="no" ;; - default) - want_warnings="$want_debug" - ;; *) want_warnings="yes" ;; @@ -7060,7 +7064,7 @@ fi # Define the identity of the package. PACKAGE='c-ares' - VERSION='1.19.1' + VERSION='1.23.0' printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h @@ -22714,26 +22718,13 @@ printf "%s\n" "$as_me: WARNING: compiler options rejected: $tmp_options" >&2;} # if test "$want_warnings" = "yes"; then tmp_CFLAGS="$tmp_CFLAGS -pedantic" - tmp_CFLAGS="$tmp_CFLAGS -Wall -Wextra" - tmp_CFLAGS="$tmp_CFLAGS -Wpointer-arith -Wwrite-strings" - tmp_CFLAGS="$tmp_CFLAGS -Wshadow" - tmp_CFLAGS="$tmp_CFLAGS -Winline -Wnested-externs" - tmp_CFLAGS="$tmp_CFLAGS -Wmissing-declarations" - tmp_CFLAGS="$tmp_CFLAGS -Wmissing-prototypes" + tmp_CFLAGS="$tmp_CFLAGS -Winline" tmp_CFLAGS="$tmp_CFLAGS -Wno-long-long" - tmp_CFLAGS="$tmp_CFLAGS -Wfloat-equal" tmp_CFLAGS="$tmp_CFLAGS -Wno-multichar -Wsign-compare" - tmp_CFLAGS="$tmp_CFLAGS -Wundef" tmp_CFLAGS="$tmp_CFLAGS -Wno-format-nonliteral" - tmp_CFLAGS="$tmp_CFLAGS -Wendif-labels -Wstrict-prototypes" - tmp_CFLAGS="$tmp_CFLAGS -Wdeclaration-after-statement" - tmp_CFLAGS="$tmp_CFLAGS -Wcast-align" + tmp_CFLAGS="$tmp_CFLAGS -Wendif-labels" tmp_CFLAGS="$tmp_CFLAGS -Wno-system-headers" tmp_CFLAGS="$tmp_CFLAGS -Wshorten-64-to-32" - # - if test "$compiler_num" -ge "101"; then - tmp_CFLAGS="$tmp_CFLAGS -Wunused" - fi fi ;; # @@ -22753,21 +22744,12 @@ printf "%s\n" "$as_me: WARNING: compiler options rejected: $tmp_options" >&2;} tmp_CFLAGS="$tmp_CFLAGS -pedantic" fi # - tmp_CFLAGS="$tmp_CFLAGS -Wall -W" - # - if test "$compiler_num" -ge "104"; then - tmp_CFLAGS="$tmp_CFLAGS -Wpointer-arith -Wwrite-strings" - if test "x$cross_compiling" != "xyes" || - test "$compiler_num" -ge "300"; then - tmp_CFLAGS="$tmp_CFLAGS -Wunused -Wshadow" - fi - fi + tmp_CFLAGS="$tmp_CFLAGS -W" # if test "$compiler_num" -ge "207"; then - tmp_CFLAGS="$tmp_CFLAGS -Winline -Wnested-externs" + tmp_CFLAGS="$tmp_CFLAGS -Winline" if test "x$cross_compiling" != "xyes" || test "$compiler_num" -ge "300"; then - tmp_CFLAGS="$tmp_CFLAGS -Wmissing-declarations" tmp_CFLAGS="$tmp_CFLAGS -Wmissing-prototypes" fi fi @@ -22777,9 +22759,7 @@ printf "%s\n" "$as_me: WARNING: compiler options rejected: $tmp_options" >&2;} fi # if test "$compiler_num" -ge "296"; then - tmp_CFLAGS="$tmp_CFLAGS -Wfloat-equal" tmp_CFLAGS="$tmp_CFLAGS -Wno-multichar -Wsign-compare" - tmp_CFLAGS="$tmp_CFLAGS -Wundef" fi # if test "$compiler_num" -ge "297"; then @@ -22791,26 +22771,18 @@ printf "%s\n" "$as_me: WARNING: compiler options rejected: $tmp_options" >&2;} fi # if test "$compiler_num" -ge "303"; then - tmp_CFLAGS="$tmp_CFLAGS -Wendif-labels -Wstrict-prototypes" - fi - # - if test "$compiler_num" -ge "304"; then - tmp_CFLAGS="$tmp_CFLAGS -Wdeclaration-after-statement" + tmp_CFLAGS="$tmp_CFLAGS -Wendif-labels" fi # if test "$compiler_num" -ge "400"; then tmp_CFLAGS="$tmp_CFLAGS -Wstrict-aliasing=3" fi - # - if test "$compiler_num" -ge "402"; then - tmp_CFLAGS="$tmp_CFLAGS -Wcast-align" - fi # if test "$compiler_num" -ge "403"; then tmp_CFLAGS="$tmp_CFLAGS -Wtype-limits -Wold-style-declaration" tmp_CFLAGS="$tmp_CFLAGS -Wmissing-parameter-type -Wempty-body" tmp_CFLAGS="$tmp_CFLAGS -Wclobbered -Wignored-qualifiers" - tmp_CFLAGS="$tmp_CFLAGS -Wconversion -Wno-sign-conversion -Wvla" + tmp_CFLAGS="$tmp_CFLAGS -Wno-sign-conversion" fi # if test "$compiler_num" -ge "405"; then @@ -22852,15 +22824,13 @@ printf "%s\n" "$as_me: WARNING: compiler options rejected: $tmp_options" >&2;} # if test "$want_warnings" = "yes"; then if test "$compiler_num" -gt "600"; then - tmp_CPPFLAGS="$tmp_CPPFLAGS -Wall -w2" + tmp_CPPFLAGS="$tmp_CPPFLAGS -w2" tmp_CPPFLAGS="$tmp_CPPFLAGS -Wcheck" tmp_CPPFLAGS="$tmp_CPPFLAGS -Wcomment" tmp_CPPFLAGS="$tmp_CPPFLAGS -Wdeprecated" tmp_CPPFLAGS="$tmp_CPPFLAGS -Wmissing-prototypes" tmp_CPPFLAGS="$tmp_CPPFLAGS -Wp64" - tmp_CPPFLAGS="$tmp_CPPFLAGS -Wpointer-arith" tmp_CPPFLAGS="$tmp_CPPFLAGS -Wreturn-type" - tmp_CPPFLAGS="$tmp_CPPFLAGS -Wshadow" tmp_CPPFLAGS="$tmp_CPPFLAGS -Wuninitialized" tmp_CPPFLAGS="$tmp_CPPFLAGS -Wunused-function" fi @@ -22910,8 +22880,7 @@ printf "%s\n" "$as_me: WARNING: compiler options rejected: $tmp_options" >&2;} TINY_C) # if test "$want_warnings" = "yes"; then - tmp_CFLAGS="$tmp_CFLAGS -Wall" - tmp_CFLAGS="$tmp_CFLAGS -Wwrite-strings" + tmp_CFLAGS="$tmp_CFLAGS" tmp_CFLAGS="$tmp_CFLAGS -Wunsupported" fi ;; @@ -22919,7 +22888,7 @@ printf "%s\n" "$as_me: WARNING: compiler options rejected: $tmp_options" >&2;} WATCOM_UNIX_C) # if test "$want_warnings" = "yes"; then - tmp_CFLAGS="$tmp_CFLAGS -Wall -Wextra" + tmp_CFLAGS="$tmp_CFLAGS" fi ;; # @@ -23077,6 +23046,172 @@ printf "%s\n" "$as_me: WARNING: compiler options rejected: $tmp_CFLAGS $tmp_CPPF fi +if test "$want_warnings" = "yes"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts " >&5 +printf %s "checking whether C compiler accepts ... " >&6; } +if test ${ax_cv_check_cflags__+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + ax_check_save_flags=$CFLAGS + CFLAGS="$CFLAGS " + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ax_cv_check_cflags__=yes +else $as_nop + ax_cv_check_cflags__=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + CFLAGS=$ax_check_save_flags +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags__" >&5 +printf "%s\n" "$ax_cv_check_cflags__" >&6; } +if test x"$ax_cv_check_cflags__" = xyes +then : + : +else $as_nop + : +fi + +if test ${CFLAGS+y} +then : + case " $CFLAGS " in + *" "*) + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : CFLAGS already contains "; } >&5 + (: CFLAGS already contains ) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; + *) + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : CFLAGS=\"\$CFLAGS \""; } >&5 + (: CFLAGS="$CFLAGS ") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + CFLAGS="$CFLAGS " + ;; + esac +else $as_nop + CFLAGS="" +fi + + + +for flag in -Wall \ + -Wextra \ + -Wcast-align \ + -Wconversion \ + -Wdeclaration-after-statement \ + -Wdouble-promotion \ + -Wfloat-equal \ + -Wformat-security \ + -Winit-self \ + -Wjump-misses-init \ + -Wlogical-op \ + -Wmissing-braces \ + -Wmissing-declarations \ + -Wmissing-format-attribute \ + -Wmissing-include-dirs \ + -Wmissing-prototypes \ + -Wnested-externs \ + -Wno-coverage-mismatch \ + -Wold-style-definition \ + -Wpacked \ + -Wpointer-arith \ + -Wredundant-decls \ + -Wshadow \ + -Wsign-conversion \ + -Wstrict-overflow \ + -Wstrict-prototypes \ + -Wtrampolines \ + -Wundef \ + -Wunused \ + -Wvariadic-macros \ + -Wvla \ + -Wwrite-strings \ + -Werror=implicit-int \ + -Werror=implicit-function-declaration \ + -Werror=partial-availability \ + ; do + as_CACHEVAR=`printf "%s\n" "ax_cv_check_cflags_-Werror_$flag" | $as_tr_sh` +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $flag" >&5 +printf %s "checking whether C compiler accepts $flag... " >&6; } +if eval test \${$as_CACHEVAR+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + ax_check_save_flags=$CFLAGS + CFLAGS="$CFLAGS -Werror $flag" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + eval "$as_CACHEVAR=yes" +else $as_nop + eval "$as_CACHEVAR=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + CFLAGS=$ax_check_save_flags +fi +eval ac_res=\$$as_CACHEVAR + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } +if test x"`eval 'as_val=${'$as_CACHEVAR'};printf "%s\n" "$as_val"'`" = xyes +then : + if test ${CFLAGS+y} +then : + case " $CFLAGS " in + *" $flag "*) + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : CFLAGS already contains \$flag"; } >&5 + (: CFLAGS already contains $flag) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; + *) + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : CFLAGS=\"\$CFLAGS \$flag\""; } >&5 + (: CFLAGS="$CFLAGS $flag") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + CFLAGS="$CFLAGS $flag" + ;; + esac +else $as_nop + CFLAGS="$flag" +fi + +else $as_nop + : +fi + +done + +fi + if test "$compiler_id" = "INTEL_UNIX_C"; then # if test "$compiler_num" -ge "1000"; then @@ -23626,7 +23761,7 @@ printf "%s\n" "#define HAVE_WS2TCPIP_H 1" >>confdefs.h ;; esac - CPPFLAGS="$CPPFLAGS -D_WIN32_WINNT=0x0600" + CPPFLAGS="$CPPFLAGS -D_WIN32_WINNT=0x0602" ;; *) ac_cv_header_winsock_h="no" @@ -24512,6 +24647,7 @@ printf %s "checking for iOS minimum version 10 or later... " >&6; } #include +#include #include int @@ -24555,6 +24691,7 @@ printf %s "checking for macOS minimum version 10.12 or later... " >&6; } #include +#include #include int @@ -25394,6 +25531,56 @@ if test "x$ac_cv_header_assert_h" = xyes then : printf "%s\n" "#define HAVE_ASSERT_H 1" >>confdefs.h +fi +ac_fn_c_check_header_compile "$LINENO" "iphlpapi.h" "ac_cv_header_iphlpapi_h" " +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_TIME_H +#include +#endif +#ifdef HAVE_ARPA_NAMESER_H +#include +#endif + +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#ifdef HAVE_NETINET_IN_H +#include +#endif + + +" +if test "x$ac_cv_header_iphlpapi_h" = xyes +then : + printf "%s\n" "#define HAVE_IPHLPAPI_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "netioapi.h" "ac_cv_header_netioapi_h" " +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_TIME_H +#include +#endif +#ifdef HAVE_ARPA_NAMESER_H +#include +#endif + +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#ifdef HAVE_NETINET_IN_H +#include +#endif + + +" +if test "x$ac_cv_header_netioapi_h" = xyes +then : + printf "%s\n" "#define HAVE_NETIOAPI_H 1" >>confdefs.h + fi ac_fn_c_check_header_compile "$LINENO" "netdb.h" "ac_cv_header_netdb_h" " #ifdef HAVE_SYS_TYPES_H @@ -29558,6 +29745,182 @@ printf "%s\n" "no" >&6; } fi +cares_includes_sys_random="\ +/* includes start */ +#ifdef HAVE_SYS_RANDOM_H +# include +#endif +/* includes end */" + ac_fn_c_check_header_compile "$LINENO" "sys/random.h" "ac_cv_header_sys_random_h" "$cares_includes_sys_random +" +if test "x$ac_cv_header_sys_random_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_RANDOM_H 1" >>confdefs.h + +fi + + + + # + tst_links_getrandom="unknown" + tst_proto_getrandom="unknown" + tst_compi_getrandom="unknown" + tst_allow_getrandom="unknown" + # + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if getrandom can be linked" >&5 +printf %s "checking if getrandom can be linked... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + /* Define getrandom to an innocuous variant, in case declares getrandom. + For example, HP-UX 11i declares gettimeofday. */ +#define getrandom innocuous_getrandom + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char getrandom (); below. */ + +#include +#undef getrandom + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char getrandom (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_getrandom || defined __stub___getrandom +choke me +#endif + +int +main (void) +{ +return getrandom (); + ; + return 0; +} + +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + tst_links_getrandom="yes" + +else $as_nop + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + tst_links_getrandom="no" + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + # + if test "$tst_links_getrandom" = "yes"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if getrandom is prototyped" >&5 +printf %s "checking if getrandom is prototyped... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + $cares_includes_sys_random + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "getrandom" >/dev/null 2>&1 +then : + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + tst_proto_getrandom="yes" + +else $as_nop + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + tst_proto_getrandom="no" + +fi +rm -rf conftest* + + fi + # + if test "$tst_proto_getrandom" = "yes"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if getrandom is compilable" >&5 +printf %s "checking if getrandom is compilable... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + + $cares_includes_sys_random + +int +main (void) +{ + + if(0 != getrandom(0, 0, 0)) + return 1; + + ; + return 0; +} + +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + tst_compi_getrandom="yes" + +else $as_nop + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + tst_compi_getrandom="no" + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + fi + # + if test "$tst_compi_getrandom" = "yes"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if getrandom usage allowed" >&5 +printf %s "checking if getrandom usage allowed... " >&6; } + if test "x$cares_disallow_getrandom" != "xyes"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + tst_allow_getrandom="yes" + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + tst_allow_getrandom="no" + fi + fi + # + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if getrandom might be used" >&5 +printf %s "checking if getrandom might be used... " >&6; } + if test "$tst_links_getrandom" = "yes" && + test "$tst_proto_getrandom" = "yes" && + test "$tst_compi_getrandom" = "yes" && + test "$tst_allow_getrandom" = "yes"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + +printf "%s\n" "#define HAVE_GETRANDOM 1" >>confdefs.h + + ac_cv_func_getrandom="yes" + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + ac_cv_func_getrandom="no" + fi + + # tst_links_getservbyport_r="unknown" tst_proto_getservbyport_r="unknown" @@ -33356,6 +33719,192 @@ printf "%s\n" "no" >&6; } fi +cares_includes_sys_stat="\ +/* includes start */ +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +/* includes end */" + ac_fn_c_check_header_compile "$LINENO" "sys/types.h" "ac_cv_header_sys_types_h" "$cares_includes_sys_stat +" +if test "x$ac_cv_header_sys_types_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_TYPES_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "sys/stat.h" "ac_cv_header_sys_stat_h" "$cares_includes_sys_stat +" +if test "x$ac_cv_header_sys_stat_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_STAT_H 1" >>confdefs.h + +fi + + + + # + tst_links_stat="unknown" + tst_proto_stat="unknown" + tst_compi_stat="unknown" + tst_allow_stat="unknown" + # + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if stat can be linked" >&5 +printf %s "checking if stat can be linked... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + /* Define stat to an innocuous variant, in case declares stat. + For example, HP-UX 11i declares gettimeofday. */ +#define stat innocuous_stat + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char stat (); below. */ + +#include +#undef stat + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char stat (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_stat || defined __stub___stat +choke me +#endif + +int +main (void) +{ +return stat (); + ; + return 0; +} + +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + tst_links_stat="yes" + +else $as_nop + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + tst_links_stat="no" + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + # + if test "$tst_links_stat" = "yes"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if stat is prototyped" >&5 +printf %s "checking if stat is prototyped... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + $cares_includes_sys_stat + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "stat" >/dev/null 2>&1 +then : + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + tst_proto_stat="yes" + +else $as_nop + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + tst_proto_stat="no" + +fi +rm -rf conftest* + + fi + # + if test "$tst_proto_stat" = "yes"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if stat is compilable" >&5 +printf %s "checking if stat is compilable... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + + $cares_includes_sys_types + $cares_includes_sys_stat + +int +main (void) +{ + + if(0 != stat(0, 0)) + return 1; + + ; + return 0; +} + +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + tst_compi_stat="yes" + +else $as_nop + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + tst_compi_stat="no" + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + fi + # + if test "$tst_compi_stat" = "yes"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if stat usage allowed" >&5 +printf %s "checking if stat usage allowed... " >&6; } + if test "x$cares_disallow_stat" != "xyes"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + tst_allow_stat="yes" + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + tst_allow_stat="no" + fi + fi + # + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if stat might be used" >&5 +printf %s "checking if stat might be used... " >&6; } + if test "$tst_links_stat" = "yes" && + test "$tst_proto_stat" = "yes" && + test "$tst_compi_stat" = "yes" && + test "$tst_allow_stat" = "yes"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + +printf "%s\n" "#define HAVE_STAT 1" >>confdefs.h + + ac_cv_func_stat="yes" + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + ac_cv_func_stat="no" + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for PF_INET6" >&5 @@ -34282,8 +34831,8 @@ printf "%s\n" "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h ;; #( *) - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: couldn't figure out endianess, assuming little endian!" >&5 -printf "%s\n" "$as_me: WARNING: couldn't figure out endianess, assuming little endian!" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: couldn't figure out endianness, assuming little endian!" >&5 +printf "%s\n" "$as_me: WARNING: couldn't figure out endianness, assuming little endian!" >&2;} ;; esac @@ -34363,6 +34912,810 @@ printf "%s\n" "$as_me: WARNING: non-blocking sockets disabled." >&2;} +# Check whether --enable-cares-threads was given. +if test ${enable_cares_threads+y} +then : + enableval=$enable_cares_threads; CARES_THREADS=${enableval} +else $as_nop + CARES_THREADS=yes +fi + + +if test "${CARES_THREADS}" = "yes" -a "x${ac_cv_native_windows}" != "xyes" ; then + + + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +ax_pthread_ok=no + +# We used to check for pthread.h first, but this fails if pthread.h +# requires special compiler flags (e.g. on Tru64 or Sequent). +# It gets checked for in the link test anyway. + +# First of all, check if the user has set any of the PTHREAD_LIBS, +# etcetera environment variables, and if threads linking works using +# them: +if test "x$PTHREAD_CFLAGS$PTHREAD_LIBS" != "x"; then + ax_pthread_save_CC="$CC" + ax_pthread_save_CFLAGS="$CFLAGS" + ax_pthread_save_LIBS="$LIBS" + if test "x$PTHREAD_CC" != "x" +then : + CC="$PTHREAD_CC" +fi + if test "x$PTHREAD_CXX" != "x" +then : + CXX="$PTHREAD_CXX" +fi + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS" >&5 +printf %s "checking for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char pthread_join (); +int +main (void) +{ +return pthread_join (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ax_pthread_ok=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_ok" >&5 +printf "%s\n" "$ax_pthread_ok" >&6; } + if test "x$ax_pthread_ok" = "xno"; then + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" + fi + CC="$ax_pthread_save_CC" + CFLAGS="$ax_pthread_save_CFLAGS" + LIBS="$ax_pthread_save_LIBS" +fi + +# We must check for the threads library under a number of different +# names; the ordering is very important because some systems +# (e.g. DEC) have both -lpthread and -lpthreads, where one of the +# libraries is broken (non-POSIX). + +# Create a list of thread flags to try. Items with a "," contain both +# C compiler flags (before ",") and linker flags (after ","). Other items +# starting with a "-" are C compiler flags, and remaining items are +# library names, except for "none" which indicates that we try without +# any flags at all, and "pthread-config" which is a program returning +# the flags for the Pth emulation library. + +ax_pthread_flags="pthreads none -Kthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" + +# The ordering *is* (sometimes) important. Some notes on the +# individual items follow: + +# pthreads: AIX (must check this before -lpthread) +# none: in case threads are in libc; should be tried before -Kthread and +# other compiler flags to prevent continual compiler warnings +# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) +# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads), Tru64 +# (Note: HP C rejects this with "bad form for `-t' option") +# -pthreads: Solaris/gcc (Note: HP C also rejects) +# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it +# doesn't hurt to check since this sometimes defines pthreads and +# -D_REENTRANT too), HP C (must be checked before -lpthread, which +# is present but should not be used directly; and before -mthreads, +# because the compiler interprets this as "-mt" + "-hreads") +# -mthreads: Mingw32/gcc, Lynx/gcc +# pthread: Linux, etcetera +# --thread-safe: KAI C++ +# pthread-config: use pthread-config program (for GNU Pth library) + +case $host_os in + + freebsd*) + + # -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) + # lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) + + ax_pthread_flags="-kthread lthread $ax_pthread_flags" + ;; + + hpux*) + + # From the cc(1) man page: "[-mt] Sets various -D flags to enable + # multi-threading and also sets -lpthread." + + ax_pthread_flags="-mt -pthread pthread $ax_pthread_flags" + ;; + + openedition*) + + # IBM z/OS requires a feature-test macro to be defined in order to + # enable POSIX threads at all, so give the user a hint if this is + # not set. (We don't define these ourselves, as they can affect + # other portions of the system API in unpredictable ways.) + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +# if !defined(_OPEN_THREADS) && !defined(_UNIX03_THREADS) + AX_PTHREAD_ZOS_MISSING +# endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "AX_PTHREAD_ZOS_MISSING" >/dev/null 2>&1 +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support." >&5 +printf "%s\n" "$as_me: WARNING: IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support." >&2;} +fi +rm -rf conftest* + + ;; + + solaris*) + + # On Solaris (at least, for some versions), libc contains stubbed + # (non-functional) versions of the pthreads routines, so link-based + # tests will erroneously succeed. (N.B.: The stubs are missing + # pthread_cleanup_push, or rather a function called by this macro, + # so we could check for that, but who knows whether they'll stub + # that too in a future libc.) So we'll check first for the + # standard Solaris way of linking pthreads (-mt -lpthread). + + ax_pthread_flags="-mt,-lpthread pthread $ax_pthread_flags" + ;; +esac + +# Are we compiling with Clang? + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC is Clang" >&5 +printf %s "checking whether $CC is Clang... " >&6; } +if test ${ax_cv_PTHREAD_CLANG+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ax_cv_PTHREAD_CLANG=no + # Note that Autoconf sets GCC=yes for Clang as well as GCC + if test "x$GCC" = "xyes"; then + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Note: Clang 2.7 lacks __clang_[a-z]+__ */ +# if defined(__clang__) && defined(__llvm__) + AX_PTHREAD_CC_IS_CLANG +# endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "AX_PTHREAD_CC_IS_CLANG" >/dev/null 2>&1 +then : + ax_cv_PTHREAD_CLANG=yes +fi +rm -rf conftest* + + fi + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_CLANG" >&5 +printf "%s\n" "$ax_cv_PTHREAD_CLANG" >&6; } +ax_pthread_clang="$ax_cv_PTHREAD_CLANG" + + +# GCC generally uses -pthread, or -pthreads on some platforms (e.g. SPARC) + +# Note that for GCC and Clang -pthread generally implies -lpthread, +# except when -nostdlib is passed. +# This is problematic using libtool to build C++ shared libraries with pthread: +# [1] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=25460 +# [2] https://bugzilla.redhat.com/show_bug.cgi?id=661333 +# [3] https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=468555 +# To solve this, first try -pthread together with -lpthread for GCC + +if test "x$GCC" = "xyes" +then : + ax_pthread_flags="-pthread,-lpthread -pthread -pthreads $ax_pthread_flags" +fi + +# Clang takes -pthread (never supported any other flag), but we'll try with -lpthread first + +if test "x$ax_pthread_clang" = "xyes" +then : + ax_pthread_flags="-pthread,-lpthread -pthread" +fi + + +# The presence of a feature test macro requesting re-entrant function +# definitions is, on some systems, a strong hint that pthreads support is +# correctly enabled + +case $host_os in + darwin* | hpux* | linux* | osf* | solaris*) + ax_pthread_check_macro="_REENTRANT" + ;; + + aix*) + ax_pthread_check_macro="_THREAD_SAFE" + ;; + + *) + ax_pthread_check_macro="--" + ;; +esac +if test "x$ax_pthread_check_macro" = "x--" +then : + ax_pthread_check_cond=0 +else $as_nop + ax_pthread_check_cond="!defined($ax_pthread_check_macro)" +fi + + +if test "x$ax_pthread_ok" = "xno"; then +for ax_pthread_try_flag in $ax_pthread_flags; do + + case $ax_pthread_try_flag in + none) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether pthreads work without any flags" >&5 +printf %s "checking whether pthreads work without any flags... " >&6; } + ;; + + *,*) + PTHREAD_CFLAGS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\1/"` + PTHREAD_LIBS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\2/"` + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether pthreads work with \"$PTHREAD_CFLAGS\" and \"$PTHREAD_LIBS\"" >&5 +printf %s "checking whether pthreads work with \"$PTHREAD_CFLAGS\" and \"$PTHREAD_LIBS\"... " >&6; } + ;; + + -*) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether pthreads work with $ax_pthread_try_flag" >&5 +printf %s "checking whether pthreads work with $ax_pthread_try_flag... " >&6; } + PTHREAD_CFLAGS="$ax_pthread_try_flag" + ;; + + pthread-config) + # Extract the first word of "pthread-config", so it can be a program name with args. +set dummy pthread-config; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ax_pthread_config+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ax_pthread_config"; then + ac_cv_prog_ax_pthread_config="$ax_pthread_config" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ax_pthread_config="yes" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_prog_ax_pthread_config" && ac_cv_prog_ax_pthread_config="no" +fi +fi +ax_pthread_config=$ac_cv_prog_ax_pthread_config +if test -n "$ax_pthread_config"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_config" >&5 +printf "%s\n" "$ax_pthread_config" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + if test "x$ax_pthread_config" = "xno" +then : + continue +fi + PTHREAD_CFLAGS="`pthread-config --cflags`" + PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" + ;; + + *) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for the pthreads library -l$ax_pthread_try_flag" >&5 +printf %s "checking for the pthreads library -l$ax_pthread_try_flag... " >&6; } + PTHREAD_LIBS="-l$ax_pthread_try_flag" + ;; + esac + + ax_pthread_save_CFLAGS="$CFLAGS" + ax_pthread_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" + + # Check for various functions. We must include pthread.h, + # since some functions may be macros. (On the Sequent, we + # need a special flag -Kthread to make this header compile.) + # We check for pthread_join because it is in -lpthread on IRIX + # while pthread_create is in libc. We check for pthread_attr_init + # due to DEC craziness with -lpthreads. We check for + # pthread_cleanup_push because it is one of the few pthread + # functions on Solaris that doesn't have a non-functional libc stub. + # We try pthread_create on general principles. + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +# if $ax_pthread_check_cond +# error "$ax_pthread_check_macro must be defined" +# endif + static void *some_global = NULL; + static void routine(void *a) + { + /* To avoid any unused-parameter or + unused-but-set-parameter warning. */ + some_global = a; + } + static void *start_routine(void *a) { return a; } +int +main (void) +{ +pthread_t th; pthread_attr_t attr; + pthread_create(&th, 0, start_routine, 0); + pthread_join(th, 0); + pthread_attr_init(&attr); + pthread_cleanup_push(routine, 0); + pthread_cleanup_pop(0) /* ; */ + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ax_pthread_ok=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + + CFLAGS="$ax_pthread_save_CFLAGS" + LIBS="$ax_pthread_save_LIBS" + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_ok" >&5 +printf "%s\n" "$ax_pthread_ok" >&6; } + if test "x$ax_pthread_ok" = "xyes" +then : + break +fi + + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" +done +fi + + +# Clang needs special handling, because older versions handle the -pthread +# option in a rather... idiosyncratic way + +if test "x$ax_pthread_clang" = "xyes"; then + + # Clang takes -pthread; it has never supported any other flag + + # (Note 1: This will need to be revisited if a system that Clang + # supports has POSIX threads in a separate library. This tends not + # to be the way of modern systems, but it's conceivable.) + + # (Note 2: On some systems, notably Darwin, -pthread is not needed + # to get POSIX threads support; the API is always present and + # active. We could reasonably leave PTHREAD_CFLAGS empty. But + # -pthread does define _REENTRANT, and while the Darwin headers + # ignore this macro, third-party headers might not.) + + # However, older versions of Clang make a point of warning the user + # that, in an invocation where only linking and no compilation is + # taking place, the -pthread option has no effect ("argument unused + # during compilation"). They expect -pthread to be passed in only + # when source code is being compiled. + # + # Problem is, this is at odds with the way Automake and most other + # C build frameworks function, which is that the same flags used in + # compilation (CFLAGS) are also used in linking. Many systems + # supported by AX_PTHREAD require exactly this for POSIX threads + # support, and in fact it is often not straightforward to specify a + # flag that is used only in the compilation phase and not in + # linking. Such a scenario is extremely rare in practice. + # + # Even though use of the -pthread flag in linking would only print + # a warning, this can be a nuisance for well-run software projects + # that build with -Werror. So if the active version of Clang has + # this misfeature, we search for an option to squash it. + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether Clang needs flag to prevent \"argument unused\" warning when linking with -pthread" >&5 +printf %s "checking whether Clang needs flag to prevent \"argument unused\" warning when linking with -pthread... " >&6; } +if test ${ax_cv_PTHREAD_CLANG_NO_WARN_FLAG+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ax_cv_PTHREAD_CLANG_NO_WARN_FLAG=unknown + # Create an alternate version of $ac_link that compiles and + # links in two steps (.c -> .o, .o -> exe) instead of one + # (.c -> exe), because the warning occurs only in the second + # step + ax_pthread_save_ac_link="$ac_link" + ax_pthread_sed='s/conftest\.\$ac_ext/conftest.$ac_objext/g' + ax_pthread_link_step=`printf "%s\n" "$ac_link" | sed "$ax_pthread_sed"` + ax_pthread_2step_ac_link="($ac_compile) && (echo ==== >&5) && ($ax_pthread_link_step)" + ax_pthread_save_CFLAGS="$CFLAGS" + for ax_pthread_try in '' -Qunused-arguments -Wno-unused-command-line-argument unknown; do + if test "x$ax_pthread_try" = "xunknown" +then : + break +fi + CFLAGS="-Werror -Wunknown-warning-option $ax_pthread_try -pthread $ax_pthread_save_CFLAGS" + ac_link="$ax_pthread_save_ac_link" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int main(void){return 0;} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_link="$ax_pthread_2step_ac_link" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int main(void){return 0;} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + break +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + done + ac_link="$ax_pthread_save_ac_link" + CFLAGS="$ax_pthread_save_CFLAGS" + if test "x$ax_pthread_try" = "x" +then : + ax_pthread_try=no +fi + ax_cv_PTHREAD_CLANG_NO_WARN_FLAG="$ax_pthread_try" + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" >&5 +printf "%s\n" "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" >&6; } + + case "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" in + no | unknown) ;; + *) PTHREAD_CFLAGS="$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG $PTHREAD_CFLAGS" ;; + esac + +fi # $ax_pthread_clang = yes + + + +# Various other checks: +if test "x$ax_pthread_ok" = "xyes"; then + ax_pthread_save_CFLAGS="$CFLAGS" + ax_pthread_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" + + # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for joinable pthread attribute" >&5 +printf %s "checking for joinable pthread attribute... " >&6; } +if test ${ax_cv_PTHREAD_JOINABLE_ATTR+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ax_cv_PTHREAD_JOINABLE_ATTR=unknown + for ax_pthread_attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main (void) +{ +int attr = $ax_pthread_attr; return attr /* ; */ + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ax_cv_PTHREAD_JOINABLE_ATTR=$ax_pthread_attr; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + done + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_JOINABLE_ATTR" >&5 +printf "%s\n" "$ax_cv_PTHREAD_JOINABLE_ATTR" >&6; } + if test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xunknown" && \ + test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xPTHREAD_CREATE_JOINABLE" && \ + test "x$ax_pthread_joinable_attr_defined" != "xyes" +then : + +printf "%s\n" "#define PTHREAD_CREATE_JOINABLE $ax_cv_PTHREAD_JOINABLE_ATTR" >>confdefs.h + + ax_pthread_joinable_attr_defined=yes + +fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether more special flags are required for pthreads" >&5 +printf %s "checking whether more special flags are required for pthreads... " >&6; } +if test ${ax_cv_PTHREAD_SPECIAL_FLAGS+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ax_cv_PTHREAD_SPECIAL_FLAGS=no + case $host_os in + solaris*) + ax_cv_PTHREAD_SPECIAL_FLAGS="-D_POSIX_PTHREAD_SEMANTICS" + ;; + esac + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_SPECIAL_FLAGS" >&5 +printf "%s\n" "$ax_cv_PTHREAD_SPECIAL_FLAGS" >&6; } + if test "x$ax_cv_PTHREAD_SPECIAL_FLAGS" != "xno" && \ + test "x$ax_pthread_special_flags_added" != "xyes" +then : + PTHREAD_CFLAGS="$ax_cv_PTHREAD_SPECIAL_FLAGS $PTHREAD_CFLAGS" + ax_pthread_special_flags_added=yes +fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for PTHREAD_PRIO_INHERIT" >&5 +printf %s "checking for PTHREAD_PRIO_INHERIT... " >&6; } +if test ${ax_cv_PTHREAD_PRIO_INHERIT+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main (void) +{ +int i = PTHREAD_PRIO_INHERIT; + return i; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ax_cv_PTHREAD_PRIO_INHERIT=yes +else $as_nop + ax_cv_PTHREAD_PRIO_INHERIT=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_PRIO_INHERIT" >&5 +printf "%s\n" "$ax_cv_PTHREAD_PRIO_INHERIT" >&6; } + if test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes" && \ + test "x$ax_pthread_prio_inherit_defined" != "xyes" +then : + +printf "%s\n" "#define HAVE_PTHREAD_PRIO_INHERIT 1" >>confdefs.h + + ax_pthread_prio_inherit_defined=yes + +fi + + CFLAGS="$ax_pthread_save_CFLAGS" + LIBS="$ax_pthread_save_LIBS" + + # More AIX lossage: compile with *_r variant + if test "x$GCC" != "xyes"; then + case $host_os in + aix*) + case "x/$CC" in #( + x*/c89|x*/c89_128|x*/c99|x*/c99_128|x*/cc|x*/cc128|x*/xlc|x*/xlc_v6|x*/xlc128|x*/xlc128_v6) : + #handle absolute path differently from PATH based program lookup + case "x$CC" in #( + x/*) : + + if as_fn_executable_p ${CC}_r +then : + PTHREAD_CC="${CC}_r" +fi + if test "x${CXX}" != "x" +then : + if as_fn_executable_p ${CXX}_r +then : + PTHREAD_CXX="${CXX}_r" +fi +fi + ;; #( + *) : + + for ac_prog in ${CC}_r +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_PTHREAD_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$PTHREAD_CC"; then + ac_cv_prog_PTHREAD_CC="$PTHREAD_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_PTHREAD_CC="$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +PTHREAD_CC=$ac_cv_prog_PTHREAD_CC +if test -n "$PTHREAD_CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PTHREAD_CC" >&5 +printf "%s\n" "$PTHREAD_CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + test -n "$PTHREAD_CC" && break +done +test -n "$PTHREAD_CC" || PTHREAD_CC="$CC" + + if test "x${CXX}" != "x" +then : + for ac_prog in ${CXX}_r +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_PTHREAD_CXX+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$PTHREAD_CXX"; then + ac_cv_prog_PTHREAD_CXX="$PTHREAD_CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_PTHREAD_CXX="$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +PTHREAD_CXX=$ac_cv_prog_PTHREAD_CXX +if test -n "$PTHREAD_CXX"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PTHREAD_CXX" >&5 +printf "%s\n" "$PTHREAD_CXX" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + test -n "$PTHREAD_CXX" && break +done +test -n "$PTHREAD_CXX" || PTHREAD_CXX="$CXX" + +fi + + ;; +esac + ;; #( + *) : + ;; +esac + ;; + esac + fi +fi + +test -n "$PTHREAD_CC" || PTHREAD_CC="$CC" +test -n "$PTHREAD_CXX" || PTHREAD_CXX="$CXX" + + + + + + +# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: +if test "x$ax_pthread_ok" = "xyes"; then + + : +else + ax_pthread_ok=no + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: threads requested but not supported" >&5 +printf "%s\n" "$as_me: WARNING: threads requested but not supported" >&2;} + CARES_THREADS=no + +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + if test "${CARES_THREADS}" = "yes" ; then + ac_fn_c_check_header_compile "$LINENO" "pthread.h" "ac_cv_header_pthread_h" "$ac_includes_default" +if test "x$ac_cv_header_pthread_h" = xyes +then : + printf "%s\n" "#define HAVE_PTHREAD_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "pthread_np.h" "ac_cv_header_pthread_np_h" "$ac_includes_default" +if test "x$ac_cv_header_pthread_np_h" = xyes +then : + printf "%s\n" "#define HAVE_PTHREAD_NP_H 1" >>confdefs.h + +fi + + LIBS="$PTHREAD_LIBS $LIBS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + CC="$PTHREAD_CC" + CXX="$PTHREAD_CXX" + fi +fi + +if test "${CARES_THREADS}" = "yes" ; then + +printf "%s\n" "#define CARES_THREADS 1 " >>confdefs.h + +fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether hiding of library internal symbols will actually happen" >&5 printf %s "checking whether hiding of library internal symbols will actually happen... " >&6; } CFLAG_CARES_SYMBOL_HIDING="" @@ -35178,7 +36531,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by c-ares $as_me 1.19.1, which was +This file was extended by c-ares $as_me 1.23.0, which was generated by GNU Autoconf 2.71. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -35246,7 +36599,7 @@ ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config='$ac_cs_config_escaped' ac_cs_version="\\ -c-ares config.status 1.19.1 +c-ares config.status 1.23.0 configured by $0, generated by GNU Autoconf 2.71, with options \\"\$ac_cs_config\\" diff --git a/lib/c-ares-1.19.1/configure.ac b/lib/c-ares-1.23.0/configure.ac similarity index 89% rename from lib/c-ares-1.19.1/configure.ac rename to lib/c-ares-1.23.0/configure.ac index 54e79d6e2a9..c69886ff3fe 100644 --- a/lib/c-ares-1.19.1/configure.ac +++ b/lib/c-ares-1.23.0/configure.ac @@ -1,9 +1,29 @@ +############################################################# +# +# Copyright (C) the Massachusetts Institute of Technology. +# Copyright (C) Daniel Stenberg +# +# 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. +# +# SPDX-License-Identifier: MIT +# +############################################################# AC_PREREQ([2.60]) -AC_INIT([c-ares], [1.19.1], +AC_INIT([c-ares], [1.23.0], [c-ares mailing list: http://lists.haxx.se/listinfo/c-ares]) -CARES_VERSION_INFO="8:1:6" +CARES_VERSION_INFO="11:0:9" dnl This flag accepts an argument of the form current[:revision[:age]]. So, dnl passing -version-info 3:12:1 sets current to 3, revision to 12, and age to dnl 1. @@ -182,6 +202,45 @@ CARES_SET_COMPILER_DEBUG_OPTS CARES_SET_COMPILER_OPTIMIZE_OPTS CARES_SET_COMPILER_WARNING_OPTS +if test "$want_warnings" = "yes"; then + AX_APPEND_COMPILE_FLAGS([-Wall \ + -Wextra \ + -Wcast-align \ + -Wconversion \ + -Wdeclaration-after-statement \ + -Wdouble-promotion \ + -Wfloat-equal \ + -Wformat-security \ + -Winit-self \ + -Wjump-misses-init \ + -Wlogical-op \ + -Wmissing-braces \ + -Wmissing-declarations \ + -Wmissing-format-attribute \ + -Wmissing-include-dirs \ + -Wmissing-prototypes \ + -Wnested-externs \ + -Wno-coverage-mismatch \ + -Wold-style-definition \ + -Wpacked \ + -Wpointer-arith \ + -Wredundant-decls \ + -Wshadow \ + -Wsign-conversion \ + -Wstrict-overflow \ + -Wstrict-prototypes \ + -Wtrampolines \ + -Wundef \ + -Wunused \ + -Wvariadic-macros \ + -Wvla \ + -Wwrite-strings \ + -Werror=implicit-int \ + -Werror=implicit-function-declaration \ + -Werror=partial-availability \ + ], [CFLAGS], [-Werror]) +fi + if test "$compiler_id" = "INTEL_UNIX_C"; then # if test "$compiler_num" -ge "1000"; then @@ -217,7 +276,7 @@ case X-"$ac_cv_native_windows" in CURL_CHECK_HEADER_WINSOCK CURL_CHECK_HEADER_WINSOCK2 CURL_CHECK_HEADER_WS2TCPIP - CPPFLAGS="$CPPFLAGS -D_WIN32_WINNT=0x0600" + CPPFLAGS="$CPPFLAGS -D_WIN32_WINNT=0x0602" ;; *) ac_cv_header_winsock_h="no" @@ -417,6 +476,7 @@ AS_IF([test "x$host_vendor" = "xapple"], [ AC_COMPILE_IFELSE([ AC_LANG_PROGRAM([[ #include +#include #include ]], [[ #if TARGET_OS_IPHONE == 0 || __IPHONE_OS_VERSION_MIN_REQUIRED < 100000 @@ -438,6 +498,7 @@ AS_IF([test "x$host_vendor" = "xapple"], [ AC_COMPILE_IFELSE([ AC_LANG_PROGRAM([[ #include +#include #include ]], [[ #ifndef MAC_OS_X_VERSION_10_12 @@ -511,6 +572,8 @@ AC_CHECK_HEADERS( sys/param.h \ sys/uio.h \ assert.h \ + iphlpapi.h \ + netioapi.h \ netdb.h \ netinet/in.h \ netinet/tcp.h \ @@ -666,6 +729,7 @@ CARES_CHECK_FUNC_GETENV CARES_CHECK_FUNC_GETHOSTBYADDR CARES_CHECK_FUNC_GETHOSTBYNAME CARES_CHECK_FUNC_GETHOSTNAME +CARES_CHECK_FUNC_GETRANDOM CARES_CHECK_FUNC_GETSERVBYPORT_R CARES_CHECK_FUNC_INET_NET_PTON CARES_CHECK_FUNC_INET_NTOP @@ -684,7 +748,7 @@ CARES_CHECK_FUNC_STRNCMPI CARES_CHECK_FUNC_STRNICMP CARES_CHECK_FUNC_WRITEV CARES_CHECK_FUNC_ARC4RANDOM_BUF - +CARES_CHECK_FUNC_STAT dnl check for AF_INET6 CARES_CHECK_CONSTANT( @@ -889,7 +953,7 @@ AC_C_BIGENDIAN( [AC_DEFINE(ARES_BIG_ENDIAN, 1, [define this if ares is built for a big endian system])], , - [AC_MSG_WARN([couldn't figure out endianess, assuming little endian!])] + [AC_MSG_WARN([couldn't figure out endianness, assuming little endian!])] ) dnl Check for user-specified random device @@ -908,6 +972,33 @@ fi CARES_CHECK_OPTION_NONBLOCKING CARES_CHECK_NONBLOCKING_SOCKET + +dnl ------------ THREADING -------------- +AC_ARG_ENABLE(cares-threads, + AC_HELP_STRING([--disable-cares-threads], [Disable building of thread safety support]), + [ CARES_THREADS=${enableval} ], + [ CARES_THREADS=yes ]) + +dnl windows always supports threads, only check non-windows systems. +if test "${CARES_THREADS}" = "yes" -a "x${ac_cv_native_windows}" != "xyes" ; then + AX_PTHREAD([ ], [ + AC_MSG_WARN([threads requested but not supported]) + CARES_THREADS=no + ]) + + if test "${CARES_THREADS}" = "yes" ; then + AC_CHECK_HEADERS([pthread.h pthread_np.h]) + LIBS="$PTHREAD_LIBS $LIBS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + CC="$PTHREAD_CC" + CXX="$PTHREAD_CXX" + fi +fi + +if test "${CARES_THREADS}" = "yes" ; then + AC_DEFINE([CARES_THREADS], [ 1 ], [Threading enabled]) +fi + CARES_CONFIGURE_SYMBOL_HIDING CARES_PRIVATE_LIBS="$LIBS" diff --git a/lib/c-ares-1.19.1/depcomp b/lib/c-ares-1.23.0/depcomp similarity index 100% rename from lib/c-ares-1.19.1/depcomp rename to lib/c-ares-1.23.0/depcomp diff --git a/lib/c-ares-1.19.1/docs/CMakeLists.txt b/lib/c-ares-1.23.0/docs/CMakeLists.txt similarity index 81% rename from lib/c-ares-1.19.1/docs/CMakeLists.txt rename to lib/c-ares-1.23.0/docs/CMakeLists.txt index 5b91d313e2f..3fcf39e8af6 100644 --- a/lib/c-ares-1.19.1/docs/CMakeLists.txt +++ b/lib/c-ares-1.23.0/docs/CMakeLists.txt @@ -1,3 +1,5 @@ +# Copyright (C) The c-ares project and its contributors +# SPDX-License-Identifier: MIT # Headers and Man Pages installation target IF (CARES_INSTALL) # ManPages diff --git a/lib/c-ares-1.23.0/docs/Makefile.am b/lib/c-ares-1.23.0/docs/Makefile.am new file mode 100644 index 00000000000..1aff3818850 --- /dev/null +++ b/lib/c-ares-1.23.0/docs/Makefile.am @@ -0,0 +1,10 @@ +# Copyright (C) The c-ares project and its contributors +# SPDX-License-Identifier: MIT + +AUTOMAKE_OPTIONS = foreign subdir-objects no-dependencies + +include Makefile.inc + +man_MANS = $(MANPAGES) + +EXTRA_DIST = $(MANPAGES) ahost.1 adig.1 Makefile.inc CMakeLists.txt diff --git a/lib/c-ares-1.19.1/docs/Makefile.in b/lib/c-ares-1.23.0/docs/Makefile.in similarity index 88% rename from lib/c-ares-1.19.1/docs/Makefile.in rename to lib/c-ares-1.23.0/docs/Makefile.in index b169b2a01d1..a5d5a70c999 100644 --- a/lib/c-ares-1.19.1/docs/Makefile.in +++ b/lib/c-ares-1.23.0/docs/Makefile.in @@ -14,9 +14,8 @@ @SET_MAKE@ -#*************************************************************************** - -########################################################################### +# Copyright (C) The c-ares project and its contributors +# SPDX-License-Identifier: MIT VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ @@ -97,11 +96,15 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_ac_append_to_file.m4 \ $(top_srcdir)/m4/ax_ac_print_to_file.m4 \ $(top_srcdir)/m4/ax_add_am_macro_static.m4 \ $(top_srcdir)/m4/ax_am_macros_static.m4 \ + $(top_srcdir)/m4/ax_append_compile_flags.m4 \ + $(top_srcdir)/m4/ax_append_flag.m4 \ + $(top_srcdir)/m4/ax_check_compile_flag.m4 \ $(top_srcdir)/m4/ax_check_gnu_make.m4 \ $(top_srcdir)/m4/ax_code_coverage.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx_11.m4 \ $(top_srcdir)/m4/ax_file_escapes.m4 \ + $(top_srcdir)/m4/ax_pthread.m4 \ $(top_srcdir)/m4/ax_require_defined.m4 \ $(top_srcdir)/m4/cares-compilers.m4 \ $(top_srcdir)/m4/cares-confopts.m4 \ @@ -263,6 +266,10 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_CXX = @PTHREAD_CXX@ +PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ @@ -282,6 +289,7 @@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ +ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ @@ -327,10 +335,74 @@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AUTOMAKE_OPTIONS = foreign subdir-objects no-dependencies + +# Copyright (C) The c-ares project and its contributors +# SPDX-License-Identifier: MIT MANPAGES = ares_cancel.3 \ ares_create_query.3 \ ares_destroy.3 \ ares_destroy_options.3 \ + ares_dns_class_fromstr.3 \ + ares_dns_class_t.3 \ + ares_dns_class_tostr.3 \ + ares_dns_datatype_t.3 \ + ares_dns_flags_t.3 \ + ares_dns_mapping.3 \ + ares_dns_opcode_tostr.3 \ + ares_dns_opt_datatype_t.3 \ + ares_dns_opt_get_datatype.3 \ + ares_dns_opt_get_name.3 \ + ares_dns_opcode_t.3 \ + ares_dns_parse.3 \ + ares_dns_rcode_t.3 \ + ares_dns_rcode_tostr.3 \ + ares_dns_record.3 \ + ares_dns_record_create.3 \ + ares_dns_record_get_flags.3 \ + ares_dns_record_get_id.3 \ + ares_dns_record_get_opcode.3 \ + ares_dns_record_get_rcode.3 \ + ares_dns_record_destroy.3 \ + ares_dns_record_query_add.3 \ + ares_dns_record_query_cnt.3 \ + ares_dns_record_query_get.3 \ + ares_dns_record_rr_add.3 \ + ares_dns_record_rr_cnt.3 \ + ares_dns_record_rr_del.3 \ + ares_dns_record_rr_get.3 \ + ares_dns_rec_type_fromstr.3 \ + ares_dns_rec_type_t.3 \ + ares_dns_rr.3 \ + ares_dns_rr_get_addr.3 \ + ares_dns_rr_get_addr6.3 \ + ares_dns_rr_get_bin.3 \ + ares_dns_rr_get_class.3 \ + ares_dns_rr_get_keys.3 \ + ares_dns_rr_get_name.3 \ + ares_dns_rr_get_opt.3 \ + ares_dns_rr_get_opt_byid.3 \ + ares_dns_rr_get_opt_cnt.3 \ + ares_dns_rr_get_str.3 \ + ares_dns_rr_get_type.3 \ + ares_dns_rr_get_ttl.3 \ + ares_dns_rr_get_u16.3 \ + ares_dns_rr_get_u32.3 \ + ares_dns_rr_get_u8.3 \ + ares_dns_rr_key_datatype.3 \ + ares_dns_rr_key_t.3 \ + ares_dns_rr_key_to_rec_type.3 \ + ares_dns_rr_key_tostr.3 \ + ares_dns_rr_set_addr.3 \ + ares_dns_rr_set_addr6.3 \ + ares_dns_rr_set_bin.3 \ + ares_dns_rr_set_opt.3 \ + ares_dns_rr_set_str.3 \ + ares_dns_rr_set_u16.3 \ + ares_dns_rr_set_u32.3 \ + ares_dns_rr_set_u8.3 \ + ares_dns_section_t.3 \ + ares_dns_section_tostr.3 \ + ares_dns_write.3 \ ares_dup.3 \ ares_expand_name.3 \ ares_expand_string.3 \ @@ -356,6 +428,7 @@ MANPAGES = ares_cancel.3 \ ares_library_init_android.3 \ ares_library_initialized.3 \ ares_mkquery.3 \ + ares_opt_param_t.3 \ ares_parse_a_reply.3 \ ares_parse_aaaa_reply.3 \ ares_parse_caa_reply.3 \ @@ -369,6 +442,7 @@ MANPAGES = ares_cancel.3 \ ares_parse_uri_reply.3 \ ares_process.3 \ ares_query.3 \ + ares_reinit.3 \ ares_save_options.3 \ ares_search.3 \ ares_send.3 \ @@ -384,11 +458,16 @@ MANPAGES = ares_cancel.3 \ ares_set_socket_functions.3 \ ares_set_sortlist.3 \ ares_strerror.3 \ + ares_svcb_param_t.3 \ + ares_threadsafety.3 \ ares_timeout.3 \ + ares_tlsa_match_t.3 \ + ares_tlsa_selector_t.3 \ + ares_tlsa_usage_t.3 \ ares_version.3 man_MANS = $(MANPAGES) -EXTRA_DIST = $(MANPAGES) ahost.1 adig.1 acountry.1 Makefile.inc CMakeLists.txt +EXTRA_DIST = $(MANPAGES) ahost.1 adig.1 Makefile.inc CMakeLists.txt all: all-am .SUFFIXES: diff --git a/lib/c-ares-1.23.0/docs/Makefile.inc b/lib/c-ares-1.23.0/docs/Makefile.inc new file mode 100644 index 00000000000..e81e0ca14f3 --- /dev/null +++ b/lib/c-ares-1.23.0/docs/Makefile.inc @@ -0,0 +1,129 @@ +# Copyright (C) The c-ares project and its contributors +# SPDX-License-Identifier: MIT +MANPAGES = ares_cancel.3 \ + ares_create_query.3 \ + ares_destroy.3 \ + ares_destroy_options.3 \ + ares_dns_class_fromstr.3 \ + ares_dns_class_t.3 \ + ares_dns_class_tostr.3 \ + ares_dns_datatype_t.3 \ + ares_dns_flags_t.3 \ + ares_dns_mapping.3 \ + ares_dns_opcode_tostr.3 \ + ares_dns_opt_datatype_t.3 \ + ares_dns_opt_get_datatype.3 \ + ares_dns_opt_get_name.3 \ + ares_dns_opcode_t.3 \ + ares_dns_parse.3 \ + ares_dns_rcode_t.3 \ + ares_dns_rcode_tostr.3 \ + ares_dns_record.3 \ + ares_dns_record_create.3 \ + ares_dns_record_get_flags.3 \ + ares_dns_record_get_id.3 \ + ares_dns_record_get_opcode.3 \ + ares_dns_record_get_rcode.3 \ + ares_dns_record_destroy.3 \ + ares_dns_record_query_add.3 \ + ares_dns_record_query_cnt.3 \ + ares_dns_record_query_get.3 \ + ares_dns_record_rr_add.3 \ + ares_dns_record_rr_cnt.3 \ + ares_dns_record_rr_del.3 \ + ares_dns_record_rr_get.3 \ + ares_dns_rec_type_fromstr.3 \ + ares_dns_rec_type_t.3 \ + ares_dns_rr.3 \ + ares_dns_rr_get_addr.3 \ + ares_dns_rr_get_addr6.3 \ + ares_dns_rr_get_bin.3 \ + ares_dns_rr_get_class.3 \ + ares_dns_rr_get_keys.3 \ + ares_dns_rr_get_name.3 \ + ares_dns_rr_get_opt.3 \ + ares_dns_rr_get_opt_byid.3 \ + ares_dns_rr_get_opt_cnt.3 \ + ares_dns_rr_get_str.3 \ + ares_dns_rr_get_type.3 \ + ares_dns_rr_get_ttl.3 \ + ares_dns_rr_get_u16.3 \ + ares_dns_rr_get_u32.3 \ + ares_dns_rr_get_u8.3 \ + ares_dns_rr_key_datatype.3 \ + ares_dns_rr_key_t.3 \ + ares_dns_rr_key_to_rec_type.3 \ + ares_dns_rr_key_tostr.3 \ + ares_dns_rr_set_addr.3 \ + ares_dns_rr_set_addr6.3 \ + ares_dns_rr_set_bin.3 \ + ares_dns_rr_set_opt.3 \ + ares_dns_rr_set_str.3 \ + ares_dns_rr_set_u16.3 \ + ares_dns_rr_set_u32.3 \ + ares_dns_rr_set_u8.3 \ + ares_dns_section_t.3 \ + ares_dns_section_tostr.3 \ + ares_dns_write.3 \ + ares_dup.3 \ + ares_expand_name.3 \ + ares_expand_string.3 \ + ares_fds.3 \ + ares_free_data.3 \ + ares_free_hostent.3 \ + ares_free_string.3 \ + ares_freeaddrinfo.3 \ + ares_get_servers.3 \ + ares_get_servers_ports.3 \ + ares_getaddrinfo.3 \ + ares_gethostbyaddr.3 \ + ares_gethostbyname.3 \ + ares_gethostbyname_file.3 \ + ares_getnameinfo.3 \ + ares_getsock.3 \ + ares_inet_ntop.3 \ + ares_inet_pton.3 \ + ares_init.3 \ + ares_init_options.3 \ + ares_library_cleanup.3 \ + ares_library_init.3 \ + ares_library_init_android.3 \ + ares_library_initialized.3 \ + ares_mkquery.3 \ + ares_opt_param_t.3 \ + ares_parse_a_reply.3 \ + ares_parse_aaaa_reply.3 \ + ares_parse_caa_reply.3 \ + ares_parse_mx_reply.3 \ + ares_parse_naptr_reply.3 \ + ares_parse_ns_reply.3 \ + ares_parse_ptr_reply.3 \ + ares_parse_soa_reply.3 \ + ares_parse_srv_reply.3 \ + ares_parse_txt_reply.3 \ + ares_parse_uri_reply.3 \ + ares_process.3 \ + ares_query.3 \ + ares_reinit.3 \ + ares_save_options.3 \ + ares_search.3 \ + ares_send.3 \ + ares_set_local_dev.3 \ + ares_set_local_ip4.3 \ + ares_set_local_ip6.3 \ + ares_set_servers.3 \ + ares_set_servers_csv.3 \ + ares_set_servers_ports.3 \ + ares_set_servers_ports_csv.3 \ + ares_set_socket_callback.3 \ + ares_set_socket_configure_callback.3 \ + ares_set_socket_functions.3 \ + ares_set_sortlist.3 \ + ares_strerror.3 \ + ares_svcb_param_t.3 \ + ares_threadsafety.3 \ + ares_timeout.3 \ + ares_tlsa_match_t.3 \ + ares_tlsa_selector_t.3 \ + ares_tlsa_usage_t.3 \ + ares_version.3 diff --git a/lib/c-ares-1.19.1/docs/adig.1 b/lib/c-ares-1.23.0/docs/adig.1 similarity index 64% rename from lib/c-ares-1.19.1/docs/adig.1 rename to lib/c-ares-1.23.0/docs/adig.1 index 52ff49b7395..f747d15b67b 100644 --- a/lib/c-ares-1.19.1/docs/adig.1 +++ b/lib/c-ares-1.23.0/docs/adig.1 @@ -1,3 +1,21 @@ +.\" +.\" Copyright (C) the Massachusetts Institute of Technology. +.\" Copyright (C) Daniel Stenberg +.\" +.\" 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. +.\" +.\" SPDX-License-Identifier: MIT +.\" .TH ADIG "1" "April 2011" "c-ares utilities" .SH NAME adig \- print information collected from Domain Name System (DNS) servers @@ -26,12 +44,13 @@ Print some extra debugging output. \fB\-f\fR flag Add a behavior control flag. Possible values for flag are - igntc - ignore to query in TCP to get truncated UDP answer, + igntc - ignore query truncation, return answer as-is instead of retrying + via tcp. noaliases - don't honor the HOSTALIASES environment variable, norecurse - don't query upstream servers recursively, - primary - use the first server, - stayopen - don't close the communication sockets, and - usevc - always use TCP. + primary - use the first server, + stayopen - don't close the communication sockets, and + usevc - always use TCP. .TP \fB\-h\fR, \fB\-?\fR Display this help and exit. @@ -43,27 +62,14 @@ Servers are tried in round-robin, if the previous one failed. \fB\-t\fR type Query records of specified type. Possible values for type are -A (default), AAAA, AFSDB, ANY, AXFR, CNAME, GPOS, HINFO, ISDN, KEY, LOC, MAILA, -MAILB, MB, MD, MF, MG, MINFO, MR, MX, NAPTR, NS, NSAP, NSAP_PTR, NULL, -PTR, PX, RP, RT, SIG, SOA, SRV, TXT, URI, WKS and X25. +A (default), AAAA, ANY, AXFR, CNAME, HINFO, MX, NAPTR, NS, PTR, SOA, SRV, TXT, +URI, CAA, SVCB, and HTTPS. .TP \fB\-T\fR port Connect to the specified TCP port of DNS server. .TP \fB\-U\fR port Connect to the specified UDP port of DNS server. -.TP -\fB\-x\fR -For an IPv4 \fB-t PTR a.b.c.d\fR lookup, query for -.br -\fBd.c.b.a.in-addr.arpa.\fR -This more often gives correct names in the \fBANSWER\fR. -.br -For an IPv6 \fB-t PTR addr\fR lookup, query for \fBa.b.c....z.IP6.ARPA.\fR -.TP -\fB\-xx\fR -As for \fB-x\fR and an IPv6 address, compact \fBa.b.c....z.IP6.ARPA.\fR into a RFC-2673 bit-string. -This compacted \fBbit-string\fR form is not supported by many DNS-servers. .SH "REPORTING BUGS" Report bugs to the c-ares mailing list: @@ -73,7 +79,7 @@ Report bugs to the c-ares mailing list: .PP acountry(1), ahost(1). .SH COPYRIGHT -This utility is based on code/ideas contained in sofware written by Greg Hudson (ares) +This utility is based on code/ideas contained in software written by Greg Hudson (ares) carrying the following notice: .br Copyright 1998 by the Massachusetts Institute of Technology. diff --git a/lib/c-ares-1.19.1/docs/ahost.1 b/lib/c-ares-1.23.0/docs/ahost.1 similarity index 68% rename from lib/c-ares-1.19.1/docs/ahost.1 rename to lib/c-ares-1.23.0/docs/ahost.1 index 07d9d1d18a1..3cad8b77813 100644 --- a/lib/c-ares-1.19.1/docs/ahost.1 +++ b/lib/c-ares-1.23.0/docs/ahost.1 @@ -1,3 +1,21 @@ +.\" +.\" Copyright (C) the Massachusetts Institute of Technology. +.\" Copyright (C) Daniel Stenberg +.\" +.\" 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. +.\" +.\" SPDX-License-Identifier: MIT +.\" .TH AHOST "1" "April 2011" "c-ares utilities" .SH NAME ahost \- print the A or AAAA record associated with a hostname or IP address @@ -41,7 +59,7 @@ Report bugs to the c-ares mailing list: .PP acountry(1), adig(1). .SH COPYRIGHT -This utility is based on code/ideas contained in sofware written by Greg Hudson (ares) +This utility is based on code/ideas contained in software written by Greg Hudson (ares) carrying the following notice: .br Copyright 1998 by the Massachusetts Institute of Technology. diff --git a/lib/c-ares-1.19.1/docs/ares_cancel.3 b/lib/c-ares-1.23.0/docs/ares_cancel.3 similarity index 94% rename from lib/c-ares-1.19.1/docs/ares_cancel.3 rename to lib/c-ares-1.23.0/docs/ares_cancel.3 index 1a2d3f5846e..0e11b6cae61 100644 --- a/lib/c-ares-1.19.1/docs/ares_cancel.3 +++ b/lib/c-ares-1.23.0/docs/ares_cancel.3 @@ -13,6 +13,8 @@ .\" this software for any purpose. It is provided "as is" .\" without express or implied warranty. .\" +.\" SPDX-License-Identifier: MIT +.\" .TH ARES_CANCEL 3 "31 March 2004" .SH NAME ares_cancel \- Cancel a resolve @@ -20,7 +22,7 @@ ares_cancel \- Cancel a resolve .nf #include -void ares_cancel(ares_channel \fIchannel\fP) +void ares_cancel(ares_channel_t *\fIchannel\fP) .fi .SH DESCRIPTION The \fBares_cancel(3)\fP function cancels all lookups/requests made on the the diff --git a/lib/c-ares-1.19.1/docs/ares_create_query.3 b/lib/c-ares-1.23.0/docs/ares_create_query.3 similarity index 97% rename from lib/c-ares-1.19.1/docs/ares_create_query.3 rename to lib/c-ares-1.23.0/docs/ares_create_query.3 index 1ab0624e413..1f5532e891d 100644 --- a/lib/c-ares-1.19.1/docs/ares_create_query.3 +++ b/lib/c-ares-1.23.0/docs/ares_create_query.3 @@ -13,6 +13,8 @@ .\" this software for any purpose. It is provided "as is" .\" without express or implied warranty. .\" +.\" SPDX-License-Identifier: MIT +.\" .TH ARES_CREATE_QUERY 3 "17 Aug 2012" .SH NAME ares_create_query \- Compose a single-question DNS query buffer @@ -77,6 +79,7 @@ Memory was exhausted. .SH AVAILABILITY Added in c-ares 1.10.0 .SH SEE ALSO +.BR ares_dns_record (3), .BR ares_expand_name (3), .BR ares_free_string (3), .BR ares_mkquery (3) diff --git a/lib/c-ares-1.19.1/docs/ares_destroy.3 b/lib/c-ares-1.23.0/docs/ares_destroy.3 similarity index 84% rename from lib/c-ares-1.19.1/docs/ares_destroy.3 rename to lib/c-ares-1.23.0/docs/ares_destroy.3 index 9cdee30aac6..a7924890367 100644 --- a/lib/c-ares-1.19.1/docs/ares_destroy.3 +++ b/lib/c-ares-1.23.0/docs/ares_destroy.3 @@ -13,6 +13,8 @@ .\" this software for any purpose. It is provided "as is" .\" without express or implied warranty. .\" +.\" SPDX-License-Identifier: MIT +.\" .TH ARES_DESTROY 3 "7 December 2004" .SH NAME ares_destroy \- Destroy a resolver channel @@ -20,7 +22,7 @@ ares_destroy \- Destroy a resolver channel .nf #include -void ares_destroy(ares_channel \fIchannel\fP) +void ares_destroy(ares_channel_t *\fIchannel\fP) .fi .SH DESCRIPTION The \fBares_destroy(3)\fP function destroys the name service channel @@ -31,9 +33,13 @@ by the channel. channel, passing a status of \fIARES_EDESTRUCTION\fP. These calls give the callbacks a chance to clean up any state which might have been stored in their arguments. A callback must not add new requests to a channel being destroyed. + +There is no ability to make this function thread-safe. No additional calls +using this channel may be made once this function is called. .SH SEE ALSO .BR ares_init (3), -.BR ares_cancel (3) +.BR ares_cancel (3), +.BR ares_threadsafety (3) .SH AUTHOR Greg Hudson, MIT Information Systems .br diff --git a/lib/c-ares-1.19.1/docs/ares_destroy_options.3 b/lib/c-ares-1.23.0/docs/ares_destroy_options.3 similarity index 97% rename from lib/c-ares-1.19.1/docs/ares_destroy_options.3 rename to lib/c-ares-1.23.0/docs/ares_destroy_options.3 index d3779b60cf4..96520d3de37 100644 --- a/lib/c-ares-1.19.1/docs/ares_destroy_options.3 +++ b/lib/c-ares-1.23.0/docs/ares_destroy_options.3 @@ -13,6 +13,8 @@ .\" this software for any purpose. It is provided "as is" .\" without express or implied warranty. .\" +.\" SPDX-License-Identifier: MIT +.\" .TH ARES_DESTROY_OPTIONS 3 "1 June 2007" .SH NAME ares_destroy_options \- Destroy options initialized with ares_save_options diff --git a/lib/c-ares-1.23.0/docs/ares_dns_class_fromstr.3 b/lib/c-ares-1.23.0/docs/ares_dns_class_fromstr.3 new file mode 100644 index 00000000000..4587b9a586e --- /dev/null +++ b/lib/c-ares-1.23.0/docs/ares_dns_class_fromstr.3 @@ -0,0 +1,4 @@ +.\" +.\" Copyright (C) Daniel Stenberg +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_mapping.3 diff --git a/lib/c-ares-1.23.0/docs/ares_dns_class_t.3 b/lib/c-ares-1.23.0/docs/ares_dns_class_t.3 new file mode 100644 index 00000000000..4acc581d297 --- /dev/null +++ b/lib/c-ares-1.23.0/docs/ares_dns_class_t.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_record.3 diff --git a/lib/c-ares-1.23.0/docs/ares_dns_class_tostr.3 b/lib/c-ares-1.23.0/docs/ares_dns_class_tostr.3 new file mode 100644 index 00000000000..4587b9a586e --- /dev/null +++ b/lib/c-ares-1.23.0/docs/ares_dns_class_tostr.3 @@ -0,0 +1,4 @@ +.\" +.\" Copyright (C) Daniel Stenberg +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_mapping.3 diff --git a/lib/c-ares-1.23.0/docs/ares_dns_datatype_t.3 b/lib/c-ares-1.23.0/docs/ares_dns_datatype_t.3 new file mode 100644 index 00000000000..4587b9a586e --- /dev/null +++ b/lib/c-ares-1.23.0/docs/ares_dns_datatype_t.3 @@ -0,0 +1,4 @@ +.\" +.\" Copyright (C) Daniel Stenberg +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_mapping.3 diff --git a/lib/c-ares-1.23.0/docs/ares_dns_flags_t.3 b/lib/c-ares-1.23.0/docs/ares_dns_flags_t.3 new file mode 100644 index 00000000000..4acc581d297 --- /dev/null +++ b/lib/c-ares-1.23.0/docs/ares_dns_flags_t.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_record.3 diff --git a/lib/c-ares-1.23.0/docs/ares_dns_mapping.3 b/lib/c-ares-1.23.0/docs/ares_dns_mapping.3 new file mode 100644 index 00000000000..6c2c905a5c5 --- /dev/null +++ b/lib/c-ares-1.23.0/docs/ares_dns_mapping.3 @@ -0,0 +1,302 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.\" +.TH ARES_DNS_MAPPINGS 3 "12 November 2023" +.SH NAME +ares_dns_class_fromstr, ares_dns_class_tostr, ares_dns_datatype_t, ares_dns_opcode_tostr, +ares_dns_opt_datatype_t, ares_dns_opt_get_datatype, ares_dns_opt_get_name, +ares_dns_rcode_tostr, ares_dns_rec_type_fromstr, ares_dns_rr_get_keys, +ares_dns_rr_key_datatype, ares_dns_rr_key_to_rec_type, ares_dns_rr_key_tostr, +ares_dns_section_tostr, ares_opt_param_t, ares_svcb_param_t \- +Helper functions for converting dns record identifiers to and from their +respective types, as well identifying datatypes for various records. +.SH SYNOPSIS +.nf +#include + +const char *ares_dns_rec_type_tostr(ares_dns_rec_type_t type); + +const char *ares_dns_class_tostr(ares_dns_class_t qclass); + +const char *ares_dns_opcode_tostr(ares_dns_opcode_t opcode); + +const char *ares_dns_rr_key_tostr(ares_dns_rr_key_t key); + +const char *ares_dns_section_tostr(ares_dns_section_t section); + +const char *ares_dns_rcode_tostr(ares_dns_rcode_t rcode); + +ares_bool_t ares_dns_class_fromstr(ares_dns_class_t *qclass, const char *str); + +ares_bool_t ares_dns_rec_type_fromstr(ares_dns_rec_type_t *qtype, + const char *str); + +const ares_dns_rr_key_t *ares_dns_rr_get_keys(ares_dns_rec_type_t type, + size_t *cnt); + +ares_dns_datatype_t ares_dns_rr_key_datatype(ares_dns_rr_key_t key); + +ares_dns_rec_type_t ares_dns_rr_key_to_rec_type(ares_dns_rr_key_t key); + +ares_dns_opt_datatype_t ares_dns_opt_get_datatype(ares_dns_rr_key_t key, + unsigned short opt); + +const char *ares_dns_opt_get_name(ares_dns_rr_key_t key, unsigned short opt); + +.fi +.SH ENUMERATIONS +.B ares_dns_datatype_t - +Data types associated with \fIares_dns_rr_key_t\fP: +.RS 4 +.B ARES_DATATYPE_INADDR +- IPv4 address as \fIstruct in_addr *\fP. Use \fIares_dns_rr_set_addr(3)\fP to +set and \fIares_dns_rr_get_addr(3)\fP to get. +.br +.B ARES_DATATYPE_INADDR6 +- IPv6 address as \fIstruct ares_in6_addr *\fP. Use \fIares_dns_rr_set_addr6(3)\fP to +set and \fIares_dns_rr_get_addr6(3)\fP to get. +.br +.B ARES_DATATYPE_U8 +- 8bit unsigned integer. Use \fIares_dns_rr_set_u8(3)\fP to +set and \fIares_dns_rr_get_u8(3)\fP to get. +.br +.B ARES_DATATYPE_U16 +- 16bit unsigned integer. Use \fIares_dns_rr_set_u16(3)\fP to +set and \fIares_dns_rr_get_u16(3)\fP to get. +.br +.B ARES_DATATYPE_U32 +- 32bit unsigned integer. Use \fIares_dns_rr_set_u32(3)\fP to +set and \fIares_dns_rr_get_u32(3)\fP to get. +.br +.B ARES_DATATYPE_NAME +- Null-terminated string of a domain name (series of labels). Use \fIares_dns_rr_set_str(3)\fP to +set and \fIares_dns_rr_get_str(3)\fP to get. +.br +.B ARES_DATATYPE_STR +- Null-terminated string. Use \fIares_dns_rr_set_str(3)\fP to +set and \fIares_dns_rr_get_str(3)\fP to get. +.br +.B ARES_DATATYPE_BIN +- Binary Data. Use \fIares_dns_rr_set_bin(3)\fP to +set and \fIares_dns_rr_get_bin(3)\fP to get. +.br +.B ARES_DATATYPE_BINP +- Officially defined as binary data, but likely printable. Guaranteed to have +a NULL terminator for convenience (not included in length). Use \fIares_dns_rr_set_bin(3)\fP to +set and \fIares_dns_rr_get_bin(3)\fP to get. +.br +.B ARES_DATATYPE_OPT +- Array of options. 16bit identifier, Binary data. Use \fIares_dns_rr_set_opt(3)\fP to +set and \fIares_dns_rr_get_opt(3)\fP to get. +.br +.RE + +.B ares_dns_opt_datatype_t - +Data types associated with \fIARES_DATATYPE_OPT\fP parameters if known as returned +by \fIares_dns_opt_get_datatype(3)\fP: +.RS 4 +.B ARES_OPT_DATATYPE_NONE +- No value allowed for this parameter +.br +.B ARES_OPT_DATATYPE_STR_LIST +- List of strings, each prefixed with a single octet representing the length as +defined by RFC 1035. Can use \fIares_expand_string(3)\fP until buffer is consumed. +.br +.B ARES_OPT_DATATYPE_U8_LIST +- List of 8bit unsigned integers, concatenated +.br +.B ARES_OPT_DATATYPE_U16 +- 16bit unsigned integer in network byte order +.br +.B ARES_OPT_DATATYPE_U16_LIST +- list of 16bit unsigned integers in network byte order, concatenated. +.br +.B ARES_OPT_DATATYPE_U32 +- 32bit unsigned integer in network byte order +.br +.B ARES_OPT_DATATYPE_U32_LIST +- list of 16bit unsigned integers in network byte order, concatenated. +.br +.B ARES_OPT_DATATYPE_INADDR4_LIST +- List of ipv4 addresses in network byte order, concatenated +.br +.B ARES_OPT_DATATYPE_INADDR6_LIST +- List of ipv6 addresses in network byte order, concatenated +.br +.B ARES_OPT_DATATYPE_BIN +- Binary Data +.br +.B ARES_OPT_DATATYPE_NAME +- DNS Domain Name binary format as defined in RFC1035, can use \fIares_expand_name(3)\fP +.br +.RE + +.B ares_svcb_param_t - +SVCB (and HTTPS) RR known parameters as returned by \fIares_dns_opt_get_datatype(3)\fP +with \fIARES_RR_SVCB_PARAMS\fP or \fIARES_RR_HTTPS_PARAMS\fP: +.RS 4 +.B ARES_SVCB_PARAM_MANDATORY +- Mandatory keys in this RR (RFC 9460 Section 8). Datatype: \fIARES_OPT_DATATYPE_U16_LIST\fP +.br +.B ARES_SVCB_PARAM_ALPN +- Additional supported protocols (RFC 9460 Section 7.1). Datatype: \fIARES_OPT_DATATYPE_STR_LIST\fP +.br +.B ARES_SVCB_PARAM_NO_DEFAULT_ALPN +- No support for default protocol (RFC 9460 Section 7.1). Datatype: \fIARES_OPT_DATATYPE_NONE\fP +.br +.B ARES_SVCB_PARAM_PORT +- Port for alternative endpoint (RFC 9460 Section 7.2). Datatype: \fIARES_OPT_DATATYPE_U16\fP +.br +.B ARES_SVCB_PARAM_IPV4HINT +- IPv4 address hints (RFC 9460 Section 7.3). Datatype: \fIARES_OPT_DATATYPE_INADDR4_LIST\fP +.br +.B ARES_SVCB_PARAM_ECH +- RESERVED (held for Encrypted ClientHello) +.br +.B ARES_SVCB_PARAM_IPV6HINT +- IPv6 address hints (RFC 9460 Section 7.3). Datatype: \fIARES_OPT_DATATYPE_INADDR6_LIST\fP +.br + +.RE + +.B ares_opt_param_t - +OPT RR known parameters as returned by \fIares_dns_opt_get_datatype(3)\fP +with \fIARES_RR_OPT_OPTIONS\fB: +.RS 4 +.B ARES_OPT_PARAM_LLQ +- RFC 8764. Apple's DNS Long-Lived Queries Protocol. Datatype: \fIARES_OPT_DATATYPE_BIN\fP +.br +.B ARES_OPT_PARAM_UL +- http://files.dns-sd.org/draft-sekar-dns-ul.txt: Update Lease. Datatype: \fIARES_OPT_DATATYPE_U32\fP +.br +.B ARES_OPT_PARAM_NSID +- RFC 5001. Name Server Identification. Datatype: \fIARES_OPT_DATATYPE_BIN\fP +.br +.B ARES_OPT_PARAM_DAU +- RFC 6975. DNSSEC Algorithm Understood. Datatype: \fIARES_OPT_DATATYPE_U8_LIST\fP +.br +.B ARES_OPT_PARAM_DHU +- RFC 6975. DS Hash Understood. Datatype: \fIARES_OPT_DATATYPE_U8_LIST\fP +.br +.B ARES_OPT_PARAM_N3U +- RFC 6975. NSEC3 Hash Understood. Datatype: \fIARES_OPT_DATATYPE_U8_LIST\fP +.br +.B ARES_OPT_PARAM_EDNS_CLIENT_SUBNET +- RFC 7871. Client Subnet. Datatype: \fIARES_OPT_DATATYPE_BIN\fP +.br +.B ARES_OPT_PARAM_EDNS_EXPIRE +- RFC 7314. Expire Timer. Datatype: \fIARES_OPT_DATATYPE_U32\fP +.br +.B ARES_OPT_PARAM_COOKIE +- RFC 7873. Client and Server Cookies. Datatype: \fIARES_OPT_DATATYPE_BIN\fP +.br +.B ARES_OPT_PARAM_EDNS_TCP_KEEPALIVE +- RFC 7828. TCP Keepalive timeout. Datatype: \fIARES_OPT_DATATYPE_U16\fP +.br +.B ARES_OPT_PARAM_PADDING +- RFC 7830. Padding. Datatype: \fIARES_OPT_DATATYPE_BIN\fP +.br +.B ARES_OPT_PARAM_CHAIN +- RFC 7901. Chain query requests. Datatype: \fIARES_OPT_DATATYPE_NAME\fP +.br +.B ARES_OPT_PARAM_EDNS_KEY_TAG +- RFC 8145. Signaling Trust Anchor Knowledge in DNSSEC. Datatype: \fIARES_OPT_DATATYPE_U16_LIST\fP +.br +.B ARES_OPT_PARAM_EXTENDED_DNS_ERROR +- RFC 8914. Extended ERROR code and message. Datatype: \fIARES_OPT_DATATYPE_BIN\fP +.br +.RE + +.SH DESCRIPTION +The \fIares_dns_rec_type_tostr(3)\fP function outputs a human readable DNS record +type from its numeric form passed in +.IR type . + +The \fIares_dns_class_tostr(3)\fP function outputs a human readable DNS class +from its numeric form passed in +.IR qclass . + +The \fIares_dns_opcode_tostr(3)\fP function outputs a human readable DNS opcode +from its numeric form in +.IR opcode . + +The \fIares_dns_rr_key_tostr(3)\fP function outputs a human readable DNS Resource +Record parameter name from its numeric form in +.IR key . + +The \fIares_dns_section_tostr(3)\fP function outputs a human readable DNS +message section from its numeric form in +.IR section . + +The \fIares_dns_rcode_tostr(3)\fP function outputs a human readable DNS +response code from its numeric form in +.IR rcode . + +The \fIares_dns_class_fromstr(3)\fP function outputs the DNS class in numeric +from from its string representation in +.IR str . +The result is stored into the variable pointed to by +.IR qclass . + +The \fIares_dns_rec_type_fromstr(3)\fP function outputs the DNS record type in +numeric from from its string representation in +.IR str . +The result is stored into the variable pointed to by +.IR qtype . + +The \fIares_dns_rr_get_keys(3)\fP function retrieves a list of parameters that +may be set or retrieved for the provided +.IR type . +The count of returned keys is stored into the variable pointed to by +.IR cnt . + +The \fIares_dns_rr_key_datatype(3)\fP function retrieves the associated datatype +for an RR parameter specified by +.IR key . + +The \fIares_dns_rr_key_to_rec_type(3)\fP function dereferences the provided RR +parameter specified by +.IR key +to the DNS Record Type it belongs. + +The \fIares_dns_opt_get_datatype(3)\fP function is used in association with +\fIares_dns_rr_set_opt(3)\fP and \fIares_dns_rr_get_opt(3)\fP to retrieve the +datatype of an option record contained within an RR as specified in +.IR key +if it is known. The raw option record identifier is provided by +.IR opt . + +The \fIares_dns_opt_get_name(3)\fP function is used in association with +\fIares_dns_rr_set_opt(3)\fP and \fIares_dns_rr_get_opt(3)\fP to retrieve human +readable parameter name of an option record contained within an RR as specified +in +.IR key +if it is known. The raw option record identifier is provided by +.IR opt . + +.SH RETURN VALUES +\fIares_dns_rec_type_tostr(3)\fP, \fIares_dns_class_tostr(3)\fP, +\fIares_dns_opcode_tostr(3)\fP, \fIares_dns_rr_key_tostr(3)\fP, +\fIares_dns_section_tostr(3)\fP, \fIares_dns_rcode_tostr(3)\fP, and +\fIares_dns_opt_get_name(3)\fP all return a human printable ASCII string, or +NULL on error. + +\fIares_dns_class_fromstr(3)\fP and \fIares_dns_rec_type_fromstr(3)\fP return +.B ARES_TRUE +on successful conversion, otherwise +.B ARES_FALSE. + +\fIares_dns_rr_get_keys(3)\fP returns an array of keys or NULL on failure. + +\fIares_dns_rr_key_datatype(3)\fP, \fIares_dns_rr_key_to_rec_type(3)\fP, and +\fIares_dns_opt_get_datatype(3)\fP return their respective integer values, or +0 on failure. + +.SH AVAILABILITY +These functions were first introduced in c-ares version 1.22.0. +.SH SEE ALSO +.BR ares_dns_record (3), +.BR ares_dns_rr (3), +.BR ares_init (3) +.SH AUTHOR +Copyright (C) 2023 The c-ares project and its members. diff --git a/lib/c-ares-1.23.0/docs/ares_dns_opcode_t.3 b/lib/c-ares-1.23.0/docs/ares_dns_opcode_t.3 new file mode 100644 index 00000000000..4acc581d297 --- /dev/null +++ b/lib/c-ares-1.23.0/docs/ares_dns_opcode_t.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_record.3 diff --git a/lib/c-ares-1.23.0/docs/ares_dns_opcode_tostr.3 b/lib/c-ares-1.23.0/docs/ares_dns_opcode_tostr.3 new file mode 100644 index 00000000000..4587b9a586e --- /dev/null +++ b/lib/c-ares-1.23.0/docs/ares_dns_opcode_tostr.3 @@ -0,0 +1,4 @@ +.\" +.\" Copyright (C) Daniel Stenberg +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_mapping.3 diff --git a/lib/c-ares-1.23.0/docs/ares_dns_opt_datatype_t.3 b/lib/c-ares-1.23.0/docs/ares_dns_opt_datatype_t.3 new file mode 100644 index 00000000000..4587b9a586e --- /dev/null +++ b/lib/c-ares-1.23.0/docs/ares_dns_opt_datatype_t.3 @@ -0,0 +1,4 @@ +.\" +.\" Copyright (C) Daniel Stenberg +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_mapping.3 diff --git a/lib/c-ares-1.23.0/docs/ares_dns_opt_get_datatype.3 b/lib/c-ares-1.23.0/docs/ares_dns_opt_get_datatype.3 new file mode 100644 index 00000000000..4587b9a586e --- /dev/null +++ b/lib/c-ares-1.23.0/docs/ares_dns_opt_get_datatype.3 @@ -0,0 +1,4 @@ +.\" +.\" Copyright (C) Daniel Stenberg +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_mapping.3 diff --git a/lib/c-ares-1.23.0/docs/ares_dns_opt_get_name.3 b/lib/c-ares-1.23.0/docs/ares_dns_opt_get_name.3 new file mode 100644 index 00000000000..4587b9a586e --- /dev/null +++ b/lib/c-ares-1.23.0/docs/ares_dns_opt_get_name.3 @@ -0,0 +1,4 @@ +.\" +.\" Copyright (C) Daniel Stenberg +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_mapping.3 diff --git a/lib/c-ares-1.23.0/docs/ares_dns_parse.3 b/lib/c-ares-1.23.0/docs/ares_dns_parse.3 new file mode 100644 index 00000000000..4acc581d297 --- /dev/null +++ b/lib/c-ares-1.23.0/docs/ares_dns_parse.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_record.3 diff --git a/lib/c-ares-1.23.0/docs/ares_dns_rcode_t.3 b/lib/c-ares-1.23.0/docs/ares_dns_rcode_t.3 new file mode 100644 index 00000000000..4acc581d297 --- /dev/null +++ b/lib/c-ares-1.23.0/docs/ares_dns_rcode_t.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_record.3 diff --git a/lib/c-ares-1.23.0/docs/ares_dns_rcode_tostr.3 b/lib/c-ares-1.23.0/docs/ares_dns_rcode_tostr.3 new file mode 100644 index 00000000000..4587b9a586e --- /dev/null +++ b/lib/c-ares-1.23.0/docs/ares_dns_rcode_tostr.3 @@ -0,0 +1,4 @@ +.\" +.\" Copyright (C) Daniel Stenberg +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_mapping.3 diff --git a/lib/c-ares-1.23.0/docs/ares_dns_rec_type_fromstr.3 b/lib/c-ares-1.23.0/docs/ares_dns_rec_type_fromstr.3 new file mode 100644 index 00000000000..4587b9a586e --- /dev/null +++ b/lib/c-ares-1.23.0/docs/ares_dns_rec_type_fromstr.3 @@ -0,0 +1,4 @@ +.\" +.\" Copyright (C) Daniel Stenberg +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_mapping.3 diff --git a/lib/c-ares-1.23.0/docs/ares_dns_rec_type_t.3 b/lib/c-ares-1.23.0/docs/ares_dns_rec_type_t.3 new file mode 100644 index 00000000000..4acc581d297 --- /dev/null +++ b/lib/c-ares-1.23.0/docs/ares_dns_rec_type_t.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_record.3 diff --git a/lib/c-ares-1.23.0/docs/ares_dns_record.3 b/lib/c-ares-1.23.0/docs/ares_dns_record.3 new file mode 100644 index 00000000000..39232417d09 --- /dev/null +++ b/lib/c-ares-1.23.0/docs/ares_dns_record.3 @@ -0,0 +1,380 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.\" +.TH ARES_DNS_RECORD 3 "12 November 2023" +.SH NAME +ares_dns_class_t, ares_dns_flags_t, ares_dns_opcode_t, ares_dns_parse, +ares_dns_rcode_t, ares_dns_record_create, ares_dns_record_destroy, +ares_dns_record_get_flags, ares_dns_record_get_id, ares_dns_record_get_opcode, +ares_dns_record_get_rcode, ares_dns_record_query_add, ares_dns_record_query_cnt, +ares_dns_record_query_get, ares_dns_rec_type_t, ares_dns_write \- +DNS Record parsing, writing, creating and destroying functions. +.SH SYNOPSIS +.nf +#include + +void ares_dns_record_destroy(ares_dns_record_t *dnsrec); + +ares_status_t ares_dns_parse(const unsigned char *buf, + size_t buf_len, unsigned int flags, + ares_dns_record_t **dnsrec); + +ares_status_t ares_dns_write(ares_dns_record_t *dnsrec, + unsigned char **buf, size_t *buf_len); + +ares_status_t ares_dns_record_create(ares_dns_record_t **dnsrec, + unsigned short id, + unsigned short flags, + ares_dns_opcode_t opcode, + ares_dns_rcode_t rcode); + +unsigned short ares_dns_record_get_id(const ares_dns_record_t *dnsrec); + +unsigned short ares_dns_record_get_flags(const ares_dns_record_t *dnsrec); + +ares_dns_opcode_t ares_dns_record_get_opcode(const ares_dns_record_t *dnsrec); + +ares_dns_rcode_t ares_dns_record_get_rcode(const ares_dns_record_t *dnsrec); + +ares_status_t ares_dns_record_query_add(ares_dns_record_t *dnsrec, + const char *name, + ares_dns_rec_type_t qtype, + ares_dns_class_t qclass); + +size_t ares_dns_record_query_cnt(const ares_dns_record_t *dnsrec); + +ares_status_t ares_dns_record_query_get(const ares_dns_record_t *dnsrec, + size_t idx, const char **name, + ares_dns_rec_type_t *qtype, + ares_dns_class_t *qclass); + +.fi +.SH ENUMERATIONS + +.B ares_dns_rec_type_t - +DNS Record types handled by c-ares. Some record types may only be valid +on requests, and some may only be valid on responses: +.RS 4 +.B ARES_REC_TYPE_A +- Host address +.br +.B ARES_REC_TYPE_NS +- Authoritative server +.br +.B ARES_REC_TYPE_CNAME +- Canonical name +.br +.B ARES_REC_TYPE_SOA +- Start of authority zone +.br +.B ARES_REC_TYPE_PTR +- Domain name pointer +.br +.B ARES_REC_TYPE_HINFO +- Host information +.br +.B ARES_REC_TYPE_MX +- Mail routing information +.br +.B ARES_REC_TYPE_TXT +- Text strings +.br +.B ARES_REC_TYPE_AAAA +- RFC 3596. Ip6 Address +.br +.B ARES_REC_TYPE_SRV +- RFC 2782. Server Selection +.br +.B ARES_REC_TYPE_NAPTR +- RFC 3403. Naming Authority Pointer +.br +.B ARES_REC_TYPE_OPT +- RFC 6891. EDNS0 option (meta-RR). Pseudo Record. +.br +.B ARES_REC_TYPE_TLSA +- RFC 6698. DNS-Based Authentication of Named Entities (DANE) Transport Layer Security (TLS) Protocol: TLSA +.br +.B ARES_REC_TYPE_SVCB +- RFC 9460. General Purpose Service Binding +.br +.B ARES_REC_TYPE_HTTPS - +- RFC 9460. Service Binding type for use with HTTPS +.br +.B ARES_REC_TYPE_ANY +- Wildcard match. Not response RR +.br +.B ARES_REC_TYPE_URI +- RFC 7553. Uniform Resource Identifier +.br +.B ARES_REC_TYPE_CAA +- RFC 6844. Certification Authority Authorization +.br +.B ARES_REC_TYPE_RAW_RR +- Used as an indicator that the RR record is not parsed, but provided in wire +format +.br +.RE + +.B ares_dns_class_t - +DNS Classes for requests and responses: +.RS 4 +.B ARES_CLASS_IN +- Internet +.br +.B ARES_CLASS_CHAOS +- CHAOS +.br +.B ARES_CLASS_HESOID +- Hesoid [Dyer 87] +.br +.B ARES_CLASS_NONE +- RFC 2136 +.br +.B ARES_CLASS_ANY +- Any class (requests only) +.br +.RE + +.B ares_dns_opcode_t - +DNS Header Opcodes: +.RS 4 +.B ARES_OPCODE_QUERY +- Standard query +.br +.B ARES_OPCODE_IQUERY +- Inverse query. Obsolete +.br +.B ARES_OPCODE_STATUS +- Name server status query +.br +.B ARES_OPCODE_NOTIFY +- Zone change notification (RFC 1996) +.br +.B ARES_OPCODE_UPDATE +- Zone update message (RFC2136) +.br +.RE + +.B ares_dns_flags_t - +DNS Header Flags: +.RS 4 +.B ARES_FLAG_QR +- QR. If set, is a response +.br +.B ARES_FLAG_AA +- Authoritative Answer. If set, is authoritative +.br +.B ARES_FLAG_TC +- Truncation. If set, is truncated response +.br +.B ARES_FLAG_RD +- Recursion Desired. If set, recursion is desired +.br +.B ARES_FLAG_RA +- Recursion Available. If set, server supports recursion +.br +.B ARES_FLAG_AD +- RFC 2065. Authentic Data bit indicates in a response that the data included +has been verified by the server providing it +.br +.B ARES_FLAG_CD +- RFC 2065. Checking Disabled bit indicates in a query that non-verified data +is acceptable to the resolver sending the query +.br +.RE + +.B ares_dns_rcode_t - +DNS Response codes from server: +.RS 4 +.B ARES_RCODE_NOERROR +- Success +.br +.B ARES_RCODE_FORMERR +- Format error. The name server was unable to interpret the query +.br +.B ARES_RCODE_SERVFAIL +- Server Failure. The name server was unable to process this query due to a +problem with the nameserver +.br +.B ARES_RCODE_NXDOMAIN +- Name Error. Meaningful only for responses from an authoritative name server, +this code signifies that the domain name referenced in the query does not exist. +.br +.B ARES_RCODE_NOTIMP +- Not implemented. The name server does not support the requested kind of query +.br +.B ARES_RCODE_REFUSED +- Refused. The name server refuses to perform the specified operation for policy +reasons. +.br +.B ARES_RCODE_YXDOMAIN +- RFC 2136. Some name that ought not to exist, does exist +.br +.B ARES_RCODE_YXRRSET +- RFC 2136. Some RRset that ought to not exist, does exist +.br +.B ARES_RCODE_NXRRSET +- RFC 2136. Some RRset that ought to exist, does not exist +.br +.B ARES_RCODE_NOTAUTH +- RFC 2136. The server is not authoritative for the zone named in the Zone section. +.br +.B ARES_RCODE_NOTZONE +- RFC 2136. A name used in the Prerequisite or Update Section is not within the +zone denoted by the Zone Section. +.br +.B ARES_RCODE_DSOTYPEI +- RFC 8409. DSO-TYPE Not implemented +.br +.B ARES_RCODE_BADSIG +- RFC 8945. TSIG Signature Failure +.br +.B ARES_RCODE_BADKEY +- RFC 8945. Key not recognized +.br +.B ARES_RCODE_BADTIME +- RFC 8945. Signature out of time window +.br +.B ARES_RCODE_BADMODE +- RFC 2930. Bad TKEY Mode +.br +.B ARES_RCODE_BADNAME +- RFC 2930. Duplicate Key Name +.br +.B ARES_RCODE_BADALG +- RFC 2930. Algorithm not supported +.br +.B ARES_RCODE_BADTRUNC +- RFC 8945. Bad Truncation +.br +.B ARES_RCODE_BADCOOKIE +- RFC 7973. Bad/missing Server Cookie +.br +.RE + + +.SH DESCRIPTION + +The \fIares_dns_record_destroy(3)\fP function destroys the memory associated +with the dns record created by either \fIares_dns_record_create(3)\fP or +\fIares_dns_parse(3)\fP passed in via +.IR dnsrec . + +The \fIares_dns_parse(3)\fP function parses the buffer provided in +.IR buf +with length provided in +.IR buf_len. +The +.IR flags +parameter can be one or more \fIares_dns_parse_flags_t\fP, or zero if no +flags are needed. The resulting dns record data structure is stored into the +variable pointed to by +.IR dnsrec +and must be destroyed using \fIares_dns_record_destroy(3)\fP. + +The \fIares_dns_write(3)\fP function takes a populated DNS record structure in +.IR dnsrec +and writes a wire-format DNS message into the variable pointed to by +.IR buf +and writes the length of the buffer into the variable pointed to by +.IR buf_len. +The buffer must be destroyed using \fIares_free_string(3)\fP. + +The \fIares_dns_record_create(3)\fP function creates an empty DNS record structure +in the variable pointed to by +.IR dnsrec. +The +.IR id +parameter is the DNS message id, however if passing to \fIares_send(3)\fP this +identifier will be overwritten, so should typically be 0. The +.IR flags +parameter is one or more \fIares_dns_flags_t\fP. The opcode is passed in the +.IR opcode +parameter and should typically be \fIARES_OPCODE_QUERY\fP. The response code +is meant mostly for responses and is passed in the +.IR rcode +parameter and is typically \fPARES_RCODE_NOERROR\fP. + + +The \fIares_dns_record_get_id(3)\fP function is used to retrieve the DNS +message id from the DNS record provided in the +.IR dnsrec +parameter. + +The \fIares_dns_record_get_flags(3)\fP function is used to retrieve the DNS +message flags from the DNS record provided in the +.IR dnsrec +parameter. + +The \fIares_dns_record_get_opcode(3)\fP function is used to retrieve the DNS +message flags from the DNS record provided in the +.IR dnsrec +parameter. + +The \fIares_dns_record_get_rcode(3)\fP function is used to retrieve the DNS +message response code from the DNS record provided in the +.IR dnsrec +parameter. + + +The \fIares_dns_record_query_add(3)\fP function is used to add a question to +the DNS record provided in the +.IR dnsrec +parameter. The domain name specified for the question is provided in the +.IR name +parameter, along with the question type in the +.IR qtype +parameter and the question class (typically \fIARES_CLASS_IN\fP) in the +.IR qclass +parameter. + +The \fIares_dns_record_query_cnt(3)\fP function is used to retrieve the number +of DNS questions in the DNS record provided in the +.IR dnsrec +parameter. + +The \fIares_dns_record_query_get(3)\fP function is used to retrieve the details +of a single DNS question in the provided +.IR dnsrec +parameter. The index provided in the +.IR idx +parameter must be less than the value returned from \fIares_dns_record_query_cnt(3)\fP. +The DNS question name will be returned in the variable pointed to by the +.IR name +parameter, this may be provided as NULL if the name is not needed. +The DNS question type will be returned in the variable pointed to by the +.IR qtype +parameter, this may be provided as NULL if the type is not needed. +The DNS question class will be returned in the variable pointed to by the +.IR qclass +parameter, this may be provided as NULL if the class is not needed. + + +.SH RETURN VALUES + +\fIares_dns_parse(3)\fP, \fIares_dns_write(3)\fP, \fIares_dns_record_create(3)\fP, +\fIares_dns_record_query_add(3)\fP, and \fIares_dns_record_query_get(3)\fP all +return an \fIares_status_t\fP error code. +.B ARES_SUCCESS +is returned on success, +.B ARES_ENOMEM +is returned on out of memory, +.B ARES_EFORMERR +is returned on misuse. + +\fIares_dns_record_get_id(3)\fP, \fIares_dns_record_get_flags(3)\fP, +\fIares_dns_record_get_opcode(3)\fP, \fIares_dns_record_get_rcode(3)\fP, and +\fIares_dns_record_query_cnt(3)\fP all returned their prescribed datatype +values and in general can't fail except for misuse cases, in which a 0 may +be returned, however 0 can also be a valid return value for most of these +functions. + + +.SH AVAILABILITY +These functions were first introduced in c-ares version 1.22.0. +.SH SEE ALSO +.BR ares_dns_mapping (3), +.BR ares_dns_rr (3), +.BR ares_free_string (3) +.SH AUTHOR +Copyright (C) 2023 The c-ares project and its members. diff --git a/lib/c-ares-1.23.0/docs/ares_dns_record_create.3 b/lib/c-ares-1.23.0/docs/ares_dns_record_create.3 new file mode 100644 index 00000000000..4acc581d297 --- /dev/null +++ b/lib/c-ares-1.23.0/docs/ares_dns_record_create.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_record.3 diff --git a/lib/c-ares-1.23.0/docs/ares_dns_record_destroy.3 b/lib/c-ares-1.23.0/docs/ares_dns_record_destroy.3 new file mode 100644 index 00000000000..4acc581d297 --- /dev/null +++ b/lib/c-ares-1.23.0/docs/ares_dns_record_destroy.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_record.3 diff --git a/lib/c-ares-1.23.0/docs/ares_dns_record_get_flags.3 b/lib/c-ares-1.23.0/docs/ares_dns_record_get_flags.3 new file mode 100644 index 00000000000..4acc581d297 --- /dev/null +++ b/lib/c-ares-1.23.0/docs/ares_dns_record_get_flags.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_record.3 diff --git a/lib/c-ares-1.23.0/docs/ares_dns_record_get_id.3 b/lib/c-ares-1.23.0/docs/ares_dns_record_get_id.3 new file mode 100644 index 00000000000..4acc581d297 --- /dev/null +++ b/lib/c-ares-1.23.0/docs/ares_dns_record_get_id.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_record.3 diff --git a/lib/c-ares-1.23.0/docs/ares_dns_record_get_opcode.3 b/lib/c-ares-1.23.0/docs/ares_dns_record_get_opcode.3 new file mode 100644 index 00000000000..4acc581d297 --- /dev/null +++ b/lib/c-ares-1.23.0/docs/ares_dns_record_get_opcode.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_record.3 diff --git a/lib/c-ares-1.23.0/docs/ares_dns_record_get_rcode.3 b/lib/c-ares-1.23.0/docs/ares_dns_record_get_rcode.3 new file mode 100644 index 00000000000..4acc581d297 --- /dev/null +++ b/lib/c-ares-1.23.0/docs/ares_dns_record_get_rcode.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_record.3 diff --git a/lib/c-ares-1.23.0/docs/ares_dns_record_query_add.3 b/lib/c-ares-1.23.0/docs/ares_dns_record_query_add.3 new file mode 100644 index 00000000000..4acc581d297 --- /dev/null +++ b/lib/c-ares-1.23.0/docs/ares_dns_record_query_add.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_record.3 diff --git a/lib/c-ares-1.23.0/docs/ares_dns_record_query_cnt.3 b/lib/c-ares-1.23.0/docs/ares_dns_record_query_cnt.3 new file mode 100644 index 00000000000..4acc581d297 --- /dev/null +++ b/lib/c-ares-1.23.0/docs/ares_dns_record_query_cnt.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_record.3 diff --git a/lib/c-ares-1.23.0/docs/ares_dns_record_query_get.3 b/lib/c-ares-1.23.0/docs/ares_dns_record_query_get.3 new file mode 100644 index 00000000000..4acc581d297 --- /dev/null +++ b/lib/c-ares-1.23.0/docs/ares_dns_record_query_get.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_record.3 diff --git a/lib/c-ares-1.23.0/docs/ares_dns_record_rr_add.3 b/lib/c-ares-1.23.0/docs/ares_dns_record_rr_add.3 new file mode 100644 index 00000000000..b93e4cd4e37 --- /dev/null +++ b/lib/c-ares-1.23.0/docs/ares_dns_record_rr_add.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_rr.3 diff --git a/lib/c-ares-1.23.0/docs/ares_dns_record_rr_cnt.3 b/lib/c-ares-1.23.0/docs/ares_dns_record_rr_cnt.3 new file mode 100644 index 00000000000..b93e4cd4e37 --- /dev/null +++ b/lib/c-ares-1.23.0/docs/ares_dns_record_rr_cnt.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_rr.3 diff --git a/lib/c-ares-1.23.0/docs/ares_dns_record_rr_del.3 b/lib/c-ares-1.23.0/docs/ares_dns_record_rr_del.3 new file mode 100644 index 00000000000..b93e4cd4e37 --- /dev/null +++ b/lib/c-ares-1.23.0/docs/ares_dns_record_rr_del.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_rr.3 diff --git a/lib/c-ares-1.23.0/docs/ares_dns_record_rr_get.3 b/lib/c-ares-1.23.0/docs/ares_dns_record_rr_get.3 new file mode 100644 index 00000000000..b93e4cd4e37 --- /dev/null +++ b/lib/c-ares-1.23.0/docs/ares_dns_record_rr_get.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_rr.3 diff --git a/lib/c-ares-1.23.0/docs/ares_dns_rr.3 b/lib/c-ares-1.23.0/docs/ares_dns_rr.3 new file mode 100644 index 00000000000..2999d18e3aa --- /dev/null +++ b/lib/c-ares-1.23.0/docs/ares_dns_rr.3 @@ -0,0 +1,631 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.\" +.TH ARES_DNS_RR 3 "12 November 2023" +.SH NAME +ares_dns_record_rr_add, ares_dns_record_rr_cnt, ares_dns_record_rr_del, +ares_dns_record_rr_get, ares_dns_rr_get_addr, ares_dns_rr_get_addr6, +ares_dns_rr_get_bin, ares_dns_rr_get_class, ares_dns_rr_get_name, +ares_dns_rr_get_opt, ares_dns_rr_get_opt_byid, ares_dns_rr_get_opt_cnt, +ares_dns_rr_get_str, ares_dns_rr_get_ttl, ares_dns_rr_get_type, +ares_dns_rr_get_u16, ares_dns_rr_get_u32, ares_dns_rr_get_u8, ares_dns_rr_key_t, +ares_dns_rr_set_addr, ares_dns_rr_set_addr6, ares_dns_rr_set_bin, +ares_dns_rr_set_opt, ares_dns_rr_set_str, ares_dns_rr_set_u16, +ares_dns_rr_set_u32, ares_dns_rr_set_u8, ares_dns_section_t, ares_tlsa_match_t, +ares_tlsa_selector_t, ares_tlsa_usage_t \- +DNS Resource Record creating, reading, and writing functions. +.SH SYNOPSIS +.nf +#include + +size_t ares_dns_record_rr_cnt(const ares_dns_record_t *dnsrec, + ares_dns_section_t sect); + +ares_status_t ares_dns_record_rr_add(ares_dns_rr_t **rr_out, + ares_dns_record_t *dnsrec, + ares_dns_section_t sect, + const char *name, + ares_dns_rec_type_t type, + ares_dns_class_t rclass, + unsigned int ttl); + +ares_dns_rr_t *ares_dns_record_rr_get(ares_dns_record_t *dnsrec, + ares_dns_section_t sect, + size_t idx); + +ares_status_t ares_dns_record_rr_del(ares_dns_record_t *dnsrec, + ares_dns_section_t sect, + size_t idx); + +const char *ares_dns_rr_get_name(const ares_dns_rr_t *rr); + +ares_dns_rec_type_t ares_dns_rr_get_type(const ares_dns_rr_t *rr); + +ares_dns_class_t ares_dns_rr_get_class(const ares_dns_rr_t *rr); + +unsigned int ares_dns_rr_get_ttl(const ares_dns_rr_t *rr); + +ares_status_t ares_dns_rr_set_addr(ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key, + const struct in_addr *addr); + +ares_status_t ares_dns_rr_set_addr6(ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key, + const struct ares_in6_addr *addr); + +ares_status_t ares_dns_rr_set_str(ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key, + const char *val); + +ares_status_t ares_dns_rr_set_u8(ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key, + unsigned char val); + +ares_status_t ares_dns_rr_set_u16(ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key, + unsigned short val); + +ares_status_t ares_dns_rr_set_u32(ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key, + unsigned int val); + +ares_status_t ares_dns_rr_set_bin(ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key, + const unsigned char *val, + size_t len); + +ares_status_t ares_dns_rr_set_opt(ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key, + unsigned short opt, + const unsigned char *val, + size_t val_len); + +const struct in_addr *ares_dns_rr_get_addr(const ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key); + +const struct ares_in6_addr *ares_dns_rr_get_addr6(const ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key); + +const char *ares_dns_rr_get_str(const ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key); + +unsigned char ares_dns_rr_get_u8(const ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key); + +unsigned short ares_dns_rr_get_u16(const ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key); + +unsigned int ares_dns_rr_get_u32(const ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key); + +const unsigned char *ares_dns_rr_get_bin(const ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key, + size_t *len); + +size_t ares_dns_rr_get_opt_cnt(const ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key); + +unsigned short ares_dns_rr_get_opt(const ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key, + size_t idx, + const unsigned char **val, + size_t *val_len); + +ares_bool_t ares_dns_rr_get_opt_byid(const ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key, + unsigned short opt, + const unsigned char **val, + size_t *val_len); + +.fi +.SH ENUMERATIONS + +.B ares_dns_section_t - +DNS RR section types: +.RS 4 +.B ARES_SECTION_ANSWER +- Answer section +.br +.B ARES_SECTION_AUTHORITY +- Authority section +.br +.B ARES_SECTION_ADDITIONAL +- Additional Information section +.br +.RE + +.B ares_dns_rr_key_t - +Keys used for handling RR record parameters: +.RS 4 +.B ARES_RR_A_ADDR +- A Record. Address. Datatype: \fIARES_DATATYPE_INADDR\fP +.br +.B ARES_RR_NS_NSDNAME +- NS Record. Name. Datatype: \fIARES_DATATYPE_NAME\fP +.br +.B ARES_RR_CNAME_CNAME +- CNAME Record. CName. Datatype: \fIARES_DATATYPE_NAME\fP +.br +.B ARES_RR_SOA_MNAME +- SOA Record. MNAME, Primary Source of Data. Datatype: \fIARES_DATATYPE_NAME\fP +.br +.B ARES_RR_SOA_RNAME +- SOA Record. RNAME, Mailbox of person responsible. Datatype: \fIARES_DATATYPE_NAME\fP +.br +.B ARES_RR_SOA_SERIAL +- SOA Record. Serial, version. Datatype: \fIARES_DATATYPE_U32\fP +.br +.B ARES_RR_SOA_REFRESH +- SOA Record. Refresh, zone refersh interval. Datatype: \fIARES_DATATYPE_U32\fP +.br +.B ARES_RR_SOA_RETRY +- SOA Record. Retry, failed refresh retry interval. Datatype: \fIARES_DATATYPE_U32\fP +.br +.B ARES_RR_SOA_EXPIRE +- SOA Record. Expire, upper limit on authority. Datatype: \fIARES_DATATYPE_U32\fP +.br +.B ARES_RR_SOA_MINIMUM +- SOA Record. Minimum, RR TTL. Datatype: \fIARES_DATATYPE_U32\fP +.br +.B ARES_RR_PTR_DNAME +- PTR Record. DNAME, pointer domain. Datatype: \fIARES_DATATYPE_NAME\fP +.br +.B ARES_RR_HINFO_CPU +- HINFO Record. CPU. Datatype: \fIARES_DATATYPE_STR\fP +.br +.B ARES_RR_HINFO_OS +- HINFO Record. OS. Datatype: \fIARES_DATATYPE_STR\fP +.br +.B ARES_RR_MX_PREFERENCE +- MX Record. Preference. Datatype: \fIARES_DATATYPE_U16\fP +.br +.B ARES_RR_MX_EXCHANGE +- MX Record. Exchange, domain. Datatype: \fIARES_DATATYPE_NAME\fP +.br +.B ARES_RR_TXT_DATA +- TXT Record. Data. Datatype: \fIARES_DATATYPE_BINP\fP +.br +.B ARES_RR_AAAA_ADDR +- AAAA Record. Address. Datatype: \fIARES_DATATYPE_INADDR6\fP +.br +.B ARES_RR_SRV_PRIORITY +- SRV Record. Priority. Datatype: \fIARES_DATATYPE_U16\fP +.br +.B ARES_RR_SRV_WEIGHT +- SRV Record. Weight. Datatype: \fIARES_DATATYPE_U16\fP +.br +.B ARES_RR_SRV_PORT +- SRV Record. Port. Datatype: \fIARES_DATATYPE_U16\fP +.br +.B ARES_RR_SRV_TARGET +- SRV Record. Target domain. Datatype: \fIARES_DATATYPE_NAME\fP +.br +.B ARES_RR_NAPTR_ORDER +- NAPTR Record. Order. Datatype: \fIARES_DATATYPE_U16\fP +.br +.B ARES_RR_NAPTR_PREFERENCE +- NAPTR Record. Preference. Datatype: \fIARES_DATATYPE_U16\fP +.br +.B ARES_RR_NAPTR_FLAGS +- NAPTR Record. Flags. Datatype: \fIARES_DATATYPE_STR\fP +.br +.B ARES_RR_NAPTR_SERVICES +- NAPTR Record. Services. Datatype: \fIARES_DATATYPE_STR\fP +.br +.B ARES_RR_NAPTR_REGEXP +- NAPTR Record. Regexp. Datatype: \fIARES_DATATYPE_STR\fP +.br +.B ARES_RR_NAPTR_REPLACEMENT +- NAPTR Record. Replacement. Datatype: \fIARES_DATATYPE_NAME\fP +.br +.B ARES_RR_OPT_UDP_SIZE +- OPT Record. UDP Size. Datatype: \fIARES_DATATYPE_U16\fP +.br +.B ARES_RR_OPT_VERSION +- OPT Record. Version. Datatype: \fIARES_DATATYPE_U8\fP +.br +.B ARES_RR_OPT_FLAGS +- OPT Record. Flags. Datatype: \fIARES_DATATYPE_U16\fP +.br +.B ARES_RR_OPT_OPTIONS +- OPT Record. Options. See \fIares_opt_param_t\fP. Datatype: \fIARES_DATATYPE_OPT\fP +.br +.B ARES_RR_TLSA_CERT_USAGE +- TLSA Record. Certificate Usage. See \fIares_tlsa_usage_t\fP. Datatype: \fIARES_DATATYPE_U8\fP +.br +.B ARES_RR_TLSA_SELECTOR +- TLSA Record. Selector. See \fIares_tlsa_selector_t\fP. Datatype: \fIARES_DATATYPE_U8\fP +.br +.B ARES_RR_TLSA_MATCH +- TLSA Record. Matching Type. See \fIares_tlsa_match_t\fP. Datatype: \fIARES_DATATYPE_U8\fP +.br +.B ARES_RR_TLSA_DATA +- TLSA Record. Certificate Association Data. Datatype: \fIARES_DATATYPE_BIN\fP +.br +.B ARES_RR_SVCB_PRIORITY +- SVCB Record. SvcPriority. Datatype: \fIARES_DATATYPE_U16\fP +.br +.B ARES_RR_SVCB_TARGET +- SVCB Record. TargetName. Datatype: \fIARES_DATATYPE_NAME\fP +.br +.B ARES_RR_SVCB_PARAMS +- SVCB Record. SvcParams. See \fIares_svcb_param_t\fP. Datatype: \fIARES_DATATYPE_OPT\fP +.br +.B ARES_RR_HTTPS_PRIORITY +- HTTPS Record. SvcPriority. Datatype: \fIARES_DATATYPE_U16\fP +.br +.B ARES_RR_HTTPS_TARGET +- HTTPS Record. TargetName. Datatype: \fIARES_DATATYPE_NAME\fP +.br +.B ARES_RR_HTTPS_PARAMS +- HTTPS Record. SvcParams. See \fIares_svcb_param_t\fP. Datatype: \fIARES_DATATYPE_OPT\fP +.br +.B ARES_RR_URI_PRIORITY +- URI Record. Priority. Datatype: \fIARES_DATATYPE_U16\fP +.br +.B ARES_RR_URI_WEIGHT +- URI Record. Weight. Datatype: \fIARES_DATATYPE_U16\fP +.br +.B ARES_RR_URI_TARGET +- URI Record. Target domain. Datatype: \fIARES_DATATYPE_NAME\fP +.br +.B ARES_RR_CAA_CRITICAL +- CAA Record. Critical flag. Datatype: \fIARES_DATATYPE_U8\fP +.br +.B ARES_RR_CAA_TAG +- CAA Record. Tag/Property. Datatype: \fIARES_DATATYPE_STR\fP +.br +.B ARES_RR_CAA_VALUE +- CAA Record. Value. Datatype: \fIARES_DATATYPE_BINP\fP +.br +.B ARES_RR_RAW_RR_TYPE +- RAW Record. RR Type. Datatype: \fIARES_DATATYPE_U16\fP +.br +.B ARES_RR_RAW_RR_DATA +- RAW Record. RR Data. Datatype: \fIARES_DATATYPE_BIN\fP +.br +.RE + +.B ares_tlsa_usage_t - +TLSA Record \fIARES_RR_TLSA_CERT_USAGE\fP known values +.RS 4 +.B ARES_TLSA_USAGE_CA +- Certificate Usage 0. CA Constraint +.br +.B ARES_TLSA_USAGE_SERVICE +- Certificate Usage 1. Service Certificate Constraint +.br +.B ARES_TLSA_USAGE_TRUSTANCHOR +- Certificate Usage 2. Trust Anchor Assertion +.br +.B ARES_TLSA_USAGE_DOMAIN +- Certificate Usage 3. Domain-issued certificate +.br +.RE + +.B ares_tlsa_selector_t - +TLSA Record \fIARES_RR_TLSA_SELECTOR\fP known values: +.RS 4 +.B ARES_TLSA_SELECTOR_FULL +- Full Certificate +.br +.B ARES_TLSA_SELECTOR_SUBJPUBKEYINFO +- DER-encoded SubjectPublicKeyInfo +.br +.RE + +.B ares_tlsa_match_t - +TLSA Record \fIARES_RR_TLSA_MATCH\fP known values: +.RS 4 +.B ARES_TLSA_MATCH_EXACT +- Exact match +.br +.B ARES_TLSA_MATCH_SHA256 +- Sha256 match +.br +.B ARES_TLSA_MATCH_SHA512 +- Sha512 match +.br +.RE + + +.SH DESCRIPTION + +The \fIares_dns_record_rr_cnt(3)\fP function returns the number of resource +records in the DNS record provided by the +.IR dnsrec +parameter for the section provided in the +.IR sect +parameter. + +The \fIares_dns_record_rr_add(3)\fP function adds a new resource record entry +the the DNS record provided by the +.IR dnsrec +parameter. The resulting resource record is stored into the variable pointed to by +.IR rr_out. +The DNS section the resource record belongs to is specified by the +.IR sect +parameter. The domain name associated with the resource record is specified by the +.IR name +parameter, which can not be NULL but may be an empty string, or ".". The resource +record type is specified in the +.IR type +parameter, along with the DNS record class in the +.IR rclass +parameter, and the Time To Live (TTL) in the +.IR ttl +parameter. + + +The \fIares_dns_record_rr_get(3)\fP function is used to retrieve the resource +record pointer from the DNS record provided in the +.IR dnsrec +parameter, for the resource record section provided in the +.IR sect +parameter, for the specified index in the +.IR idx +parameter. The index must be less than \fIares_dns_record_rr_cnt(3)\fP. + + +The \fIares_dns_record_rr_del(3)\fP is used to delete a resource record from +the DNS record specified in the +.IR dnsrec +parameter. Its primary use is to remove a \fIARES_REC_TYPE_OPT\fP record when +needing to retry a query without EDNS support. The DNS RR section is specified +via the +.IR sect +parameter, and the index to remove is specified in the +.IR idx +parameter. The index must be less than \fIares_dns_record_rr_cnt(3)\fP. + + +The \fIares_dns_rr_get_name(3)\fP function is used to retrieve the resource +record domain name from the Resource Record pointer provided in the +.IR rr +parameter. + +The \fIares_dns_rr_get_type(3)\fP function is used to retrieve the resource +record type from the Resource Record pointer provided in the +.IR rr +parameter. + +The \fIares_dns_rr_get_class(3)\fP function is used to retrieve the resource +record class from the Resource Record pointer provided in the +.IR rr +parameter. + +The \fIares_dns_rr_get_ttl(3)\fP function is used to retrieve the resource +record class Time to Live (TTL) from the Resource Record pointer provided in the +.IR rr +parameter. + +The \fIares_dns_rr_set_addr(3)\fP function is used to set an IPv4 address for the +associated resource record key/parameter when the datatype is \fIARES_DATATYPE_INADDR\fP. +The resource record to be modified is provided in the +.IR dns_rr +parameter, the key/parameter is provided in the +.IR key +parameter, and the value is provided in the +.IR addr +parameter. + +The \fIares_dns_rr_set_addr6(3)\fP function is used to set an IPv6 address for the +associated resource record key/parameter when the datatype is \fIARES_DATATYPE_INADDR6\fP. +The resource record to be modified is provided in the +.IR dns_rr +parameter, the key/parameter is provided in the +.IR key +parameter, and the value is provided in the +.IR addr +parameter. + +The \fIares_dns_rr_set_str(3)\fP function is used to set a string for the +associated resource record key/parameter when the datatype is \fIARES_DATATYPE_STR\fP +or \fIARES_DATATYPE_NAME\fP. Most strings are limited to 255 bytes, +however some records, such as a TXT record may allow longer as they are output +as multiple strings. The resource record to be modified is +provided in the +.IR dns_rr +parameter, the key/parameter is provided in the +.IR key +parameter, and the value is provided in the +.IR val +parameter. + +The \fIares_dns_rr_set_u8(3)\fP function is used to set an 8bit unsigned value for the +associated resource record key/parameter when the datatype is \fIARES_DATATYPE_U8\fP. +The resource record to be modified is provided in the +.IR dns_rr +parameter, the key/parameter is provided in the +.IR key +parameter, and the value is provided in the +.IR val +parameter. + +The \fIares_dns_rr_set_u16(3)\fP function is used to set an 16bit unsigned value for the +associated resource record key/parameter when the datatype is \fIARES_DATATYPE_U16\fP. +The resource record to be modified is provided in the +.IR dns_rr +parameter, the key/parameter is provided in the +.IR key +parameter, and the value is provided in the +.IR val +parameter. + +The \fIares_dns_rr_set_u32(3)\fP function is used to set an 32bit unsigned value for the +associated resource record key/parameter when the datatype is \fIARES_DATATYPE_U32\fP. +The resource record to be modified is provided in the +.IR dns_rr +parameter, the key/parameter is provided in the +.IR key +parameter, and the value is provided in the +.IR val +parameter. + +The \fIares_dns_rr_set_bin(3)\fP function is used to set an binary value for the +associated resource record key/parameter when the datatype is \fIARES_DATATYPE_BIN\fP +or \fIARES_DATATYPE_BINP\fP. +The resource record to be modified is provided in the +.IR dns_rr +parameter, the key/parameter is provided in the +.IR key +parameter, and the value is provided in the +.IR val +parameter. And the associated value length is provided in the +.IR len +parameter. + +The \fIares_dns_rr_set_opt(3)\fP function is used to set option/parameter keys and +values for the resource record when the datatype if \fIARES_DATATYPE_OPT\fP. The +resource record to be modified is provided in the +.IR dns_rr +parameter. They key/parameter is provided in the +.IR key +parameter. The option/parameter value specific to the resource record is provided +in the +.IR opt +parameter, and this is left to the user to determine the appropriate value to +use. Some known values may be provided by \fIares_svcb_param_t\fP and \fIares_opt_param_t\fP +enumerations. The value for the option is always provided in binary form in +.IR val +with length provided in +.IR val_len. + +The \fIares_dns_rr_get_addr(3)\fP function is used to retrieve the IPv4 address +from the resource record when the datatype is \fIARES_DATATYPE_INADDR\fP. The +resource record is provided in the +.IR dns_rr +parameter and the key/parameter to retrieve is provided in the +.IR key +parameter. + +The \fIares_dns_rr_get_addr6(3)\fP function is used to retrieve the IPv6 address +from the resource record when the datatype is \fIARES_DATATYPE_INADDR6\fP. The +resource record is provided in the +.IR dns_rr +parameter and the key/parameter to retrieve is provided in the +.IR key +parameter. + +The \fIares_dns_rr_get_str(3)\fP function is used to retrieve a string +from the resource record when the datatype is \fIARES_DATATYPE_STR\fP or +\fIARES_DATATYPE_NAME\fP. The resource record is provided in the +.IR dns_rr +parameter and the key/parameter to retrieve is provided in the +.IR key +parameter. + +The \fIares_dns_rr_get_u8(3)\fP function is used to retrieve an 8bit integer +from the resource record when the datatype is \fIARES_DATATYPE_U8\fP. +The resource record is provided in the +.IR dns_rr +parameter and the key/parameter to retrieve is provided in the +.IR key +parameter. + +The \fIares_dns_rr_get_u16(3)\fP function is used to retrieve a 16bit integer +from the resource record when the datatype is \fIARES_DATATYPE_U16\fP. +The resource record is provided in the +.IR dns_rr +parameter and the key/parameter to retrieve is provided in the +.IR key +parameter. + +The \fIares_dns_rr_get_u32(3)\fP function is used to retrieve a 32bit integer +from the resource record when the datatype is \fIARES_DATATYPE_U32\fP. +The resource record is provided in the +.IR dns_rr +parameter and the key/parameter to retrieve is provided in the +.IR key +parameter. + +The \fIares_dns_rr_get_bin(3)\fP function is used to retrieve binary data +from the resource record when the datatype is \fIARES_DATATYPE_BIN\fP or +\fIARES_DATATYPE_BINP\fP. +The resource record is provided in the +.IR dns_rr +parameter and the key/parameter to retrieve is provided in the +.IR key +parameter, and length is stored into the variable pointed to by +.IR len. + +The \fIares_dns_rr_get_opt_cnt(3)\fP function is used to retrieve the count +of options/parameters associated with the resource record when the datatype +is \fIARES_DATATYPE_OPT\fP. +The resource record is provided in the +.IR dns_rr +parameter and the key/parameter to retrieve is provided in the +.IR key. + +The \fIares_dns_rr_get_opt(3)\fP function is used to retrieve binary option data +from the resource record when the datatype is \fIARES_DATATYPE_OPT\fP for the +specified index. +The resource record is provided in the +.IR dns_rr +parameter and the key/parameter to retrieve is provided in the +.IR key +parameter, the index to retrieve the option data from is provided in the +.IR idx +parameter. The value is stored into the variable pointed to by +.IR val +and length is stored into the variable pointed to by +.IR val_len. + +The \fIares_dns_rr_get_opt_byid(3)\fP function is used to retrieve binary option data +from the resource record when the datatype is \fIARES_DATATYPE_OPT\fP for the +specified option identifier, if it exists. +The resource record is provided in the +.IR dns_rr +parameter and the key/parameter to retrieve is provided in the +.IR key +parameter, the identifier to retrieve the option data from is provided in the +.IR opt +parameter. The value is stored into the variable pointed to by +.IR val +and length is stored into the variable pointed to by +.IR val_len. + + +.SH RETURN VALUES + +\fIares_dns_record_rr_cnt(3)\fP and \fIares_dns_rr_get_opt_cnt(3)\fP return the +respective counts. + +\fIares_dns_record_rr_add(3)\fP, \fIares_dns_record_rr_del(3)\fP, +\fIares_dns_rr_set_addr(3)\fP, \fIares_dns_rr_set_addr6(3)\fP, +\fIares_dns_rr_set_str(3)\fP, \fIares_dns_rr_set_u8(3)\fP, +\fIares_dns_rr_set_u16(3)\fP, \fIares_dns_rr_set_u32(3)\fP, +\fIares_dns_rr_set_bin(3)\fP, and \fIares_dns_rr_set_opt(3)\fP all +return an \fIares_status_t\fP error code. +.B ARES_SUCCESS +is returned on success, +.B ARES_ENOMEM +is returned on out of memory, +.B ARES_EFORMERR +is returned on misuse. + + +\fIares_dns_rr_get_name(3)\fP, \fIares_dns_rr_get_type(3)\fP, +\fIares_dns_rr_get_class(3)\fP, \fIares_dns_rr_get_ttl(3)\fP, +\fIares_dns_rr_get_addr(3)\fP, \fIares_dns_rr_get_addr6(3)\fP, +\fIares_dns_rr_get_str(3)\fP, \fIares_dns_rr_get_u8(3)\fP, +\fIares_dns_rr_get_u16(3)\fP, \fIares_dns_rr_get_u32(3)\fP, +\fIares_dns_rr_get_bin(3)\fP, \fIares_dns_rr_get_opt(3)\fP all return their +prescribed datatype values and in general can't fail except for misuse cases, +in which a 0 (or NULL) may be returned, however 0 can also be a valid return +value for most of these functions. + +\fIares_dns_record_rr_get(3)\fP will return the requested resource record +pointer or NULL on failure (misuse). + +\fIares_dns_rr_get_opt_byid(3)\fP will return ARES_TRUE if the option was +found, otherwise ARES_FALSE if not found (or misuse). + +.SH AVAILABILITY +These functions were first introduced in c-ares version 1.22.0. +.SH SEE ALSO +.BR ares_dns_mapping (3), +.BR ares_dns_record (3), +.BR ares_free_string (3) +.SH AUTHOR +Copyright (C) 2023 The c-ares project and its members. diff --git a/lib/c-ares-1.23.0/docs/ares_dns_rr_get_addr.3 b/lib/c-ares-1.23.0/docs/ares_dns_rr_get_addr.3 new file mode 100644 index 00000000000..b93e4cd4e37 --- /dev/null +++ b/lib/c-ares-1.23.0/docs/ares_dns_rr_get_addr.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_rr.3 diff --git a/lib/c-ares-1.23.0/docs/ares_dns_rr_get_addr6.3 b/lib/c-ares-1.23.0/docs/ares_dns_rr_get_addr6.3 new file mode 100644 index 00000000000..b93e4cd4e37 --- /dev/null +++ b/lib/c-ares-1.23.0/docs/ares_dns_rr_get_addr6.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_rr.3 diff --git a/lib/c-ares-1.23.0/docs/ares_dns_rr_get_bin.3 b/lib/c-ares-1.23.0/docs/ares_dns_rr_get_bin.3 new file mode 100644 index 00000000000..b93e4cd4e37 --- /dev/null +++ b/lib/c-ares-1.23.0/docs/ares_dns_rr_get_bin.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_rr.3 diff --git a/lib/c-ares-1.23.0/docs/ares_dns_rr_get_class.3 b/lib/c-ares-1.23.0/docs/ares_dns_rr_get_class.3 new file mode 100644 index 00000000000..b93e4cd4e37 --- /dev/null +++ b/lib/c-ares-1.23.0/docs/ares_dns_rr_get_class.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_rr.3 diff --git a/lib/c-ares-1.23.0/docs/ares_dns_rr_get_keys.3 b/lib/c-ares-1.23.0/docs/ares_dns_rr_get_keys.3 new file mode 100644 index 00000000000..a7758577c5b --- /dev/null +++ b/lib/c-ares-1.23.0/docs/ares_dns_rr_get_keys.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_mapping.3 diff --git a/lib/c-ares-1.23.0/docs/ares_dns_rr_get_name.3 b/lib/c-ares-1.23.0/docs/ares_dns_rr_get_name.3 new file mode 100644 index 00000000000..b93e4cd4e37 --- /dev/null +++ b/lib/c-ares-1.23.0/docs/ares_dns_rr_get_name.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_rr.3 diff --git a/lib/c-ares-1.23.0/docs/ares_dns_rr_get_opt.3 b/lib/c-ares-1.23.0/docs/ares_dns_rr_get_opt.3 new file mode 100644 index 00000000000..b93e4cd4e37 --- /dev/null +++ b/lib/c-ares-1.23.0/docs/ares_dns_rr_get_opt.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_rr.3 diff --git a/lib/c-ares-1.23.0/docs/ares_dns_rr_get_opt_byid.3 b/lib/c-ares-1.23.0/docs/ares_dns_rr_get_opt_byid.3 new file mode 100644 index 00000000000..b93e4cd4e37 --- /dev/null +++ b/lib/c-ares-1.23.0/docs/ares_dns_rr_get_opt_byid.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_rr.3 diff --git a/lib/c-ares-1.23.0/docs/ares_dns_rr_get_opt_cnt.3 b/lib/c-ares-1.23.0/docs/ares_dns_rr_get_opt_cnt.3 new file mode 100644 index 00000000000..b93e4cd4e37 --- /dev/null +++ b/lib/c-ares-1.23.0/docs/ares_dns_rr_get_opt_cnt.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_rr.3 diff --git a/lib/c-ares-1.23.0/docs/ares_dns_rr_get_str.3 b/lib/c-ares-1.23.0/docs/ares_dns_rr_get_str.3 new file mode 100644 index 00000000000..b93e4cd4e37 --- /dev/null +++ b/lib/c-ares-1.23.0/docs/ares_dns_rr_get_str.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_rr.3 diff --git a/lib/c-ares-1.23.0/docs/ares_dns_rr_get_ttl.3 b/lib/c-ares-1.23.0/docs/ares_dns_rr_get_ttl.3 new file mode 100644 index 00000000000..b93e4cd4e37 --- /dev/null +++ b/lib/c-ares-1.23.0/docs/ares_dns_rr_get_ttl.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_rr.3 diff --git a/lib/c-ares-1.23.0/docs/ares_dns_rr_get_type.3 b/lib/c-ares-1.23.0/docs/ares_dns_rr_get_type.3 new file mode 100644 index 00000000000..b93e4cd4e37 --- /dev/null +++ b/lib/c-ares-1.23.0/docs/ares_dns_rr_get_type.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_rr.3 diff --git a/lib/c-ares-1.23.0/docs/ares_dns_rr_get_u16.3 b/lib/c-ares-1.23.0/docs/ares_dns_rr_get_u16.3 new file mode 100644 index 00000000000..b93e4cd4e37 --- /dev/null +++ b/lib/c-ares-1.23.0/docs/ares_dns_rr_get_u16.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_rr.3 diff --git a/lib/c-ares-1.23.0/docs/ares_dns_rr_get_u32.3 b/lib/c-ares-1.23.0/docs/ares_dns_rr_get_u32.3 new file mode 100644 index 00000000000..b93e4cd4e37 --- /dev/null +++ b/lib/c-ares-1.23.0/docs/ares_dns_rr_get_u32.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_rr.3 diff --git a/lib/c-ares-1.23.0/docs/ares_dns_rr_get_u8.3 b/lib/c-ares-1.23.0/docs/ares_dns_rr_get_u8.3 new file mode 100644 index 00000000000..b93e4cd4e37 --- /dev/null +++ b/lib/c-ares-1.23.0/docs/ares_dns_rr_get_u8.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_rr.3 diff --git a/lib/c-ares-1.23.0/docs/ares_dns_rr_key_datatype.3 b/lib/c-ares-1.23.0/docs/ares_dns_rr_key_datatype.3 new file mode 100644 index 00000000000..4587b9a586e --- /dev/null +++ b/lib/c-ares-1.23.0/docs/ares_dns_rr_key_datatype.3 @@ -0,0 +1,4 @@ +.\" +.\" Copyright (C) Daniel Stenberg +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_mapping.3 diff --git a/lib/c-ares-1.23.0/docs/ares_dns_rr_key_t.3 b/lib/c-ares-1.23.0/docs/ares_dns_rr_key_t.3 new file mode 100644 index 00000000000..b93e4cd4e37 --- /dev/null +++ b/lib/c-ares-1.23.0/docs/ares_dns_rr_key_t.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_rr.3 diff --git a/lib/c-ares-1.23.0/docs/ares_dns_rr_key_to_rec_type.3 b/lib/c-ares-1.23.0/docs/ares_dns_rr_key_to_rec_type.3 new file mode 100644 index 00000000000..4587b9a586e --- /dev/null +++ b/lib/c-ares-1.23.0/docs/ares_dns_rr_key_to_rec_type.3 @@ -0,0 +1,4 @@ +.\" +.\" Copyright (C) Daniel Stenberg +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_mapping.3 diff --git a/lib/c-ares-1.23.0/docs/ares_dns_rr_key_tostr.3 b/lib/c-ares-1.23.0/docs/ares_dns_rr_key_tostr.3 new file mode 100644 index 00000000000..4587b9a586e --- /dev/null +++ b/lib/c-ares-1.23.0/docs/ares_dns_rr_key_tostr.3 @@ -0,0 +1,4 @@ +.\" +.\" Copyright (C) Daniel Stenberg +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_mapping.3 diff --git a/lib/c-ares-1.23.0/docs/ares_dns_rr_set_addr.3 b/lib/c-ares-1.23.0/docs/ares_dns_rr_set_addr.3 new file mode 100644 index 00000000000..b93e4cd4e37 --- /dev/null +++ b/lib/c-ares-1.23.0/docs/ares_dns_rr_set_addr.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_rr.3 diff --git a/lib/c-ares-1.23.0/docs/ares_dns_rr_set_addr6.3 b/lib/c-ares-1.23.0/docs/ares_dns_rr_set_addr6.3 new file mode 100644 index 00000000000..b93e4cd4e37 --- /dev/null +++ b/lib/c-ares-1.23.0/docs/ares_dns_rr_set_addr6.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_rr.3 diff --git a/lib/c-ares-1.23.0/docs/ares_dns_rr_set_bin.3 b/lib/c-ares-1.23.0/docs/ares_dns_rr_set_bin.3 new file mode 100644 index 00000000000..b93e4cd4e37 --- /dev/null +++ b/lib/c-ares-1.23.0/docs/ares_dns_rr_set_bin.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_rr.3 diff --git a/lib/c-ares-1.23.0/docs/ares_dns_rr_set_opt.3 b/lib/c-ares-1.23.0/docs/ares_dns_rr_set_opt.3 new file mode 100644 index 00000000000..b93e4cd4e37 --- /dev/null +++ b/lib/c-ares-1.23.0/docs/ares_dns_rr_set_opt.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_rr.3 diff --git a/lib/c-ares-1.23.0/docs/ares_dns_rr_set_str.3 b/lib/c-ares-1.23.0/docs/ares_dns_rr_set_str.3 new file mode 100644 index 00000000000..b93e4cd4e37 --- /dev/null +++ b/lib/c-ares-1.23.0/docs/ares_dns_rr_set_str.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_rr.3 diff --git a/lib/c-ares-1.23.0/docs/ares_dns_rr_set_u16.3 b/lib/c-ares-1.23.0/docs/ares_dns_rr_set_u16.3 new file mode 100644 index 00000000000..b93e4cd4e37 --- /dev/null +++ b/lib/c-ares-1.23.0/docs/ares_dns_rr_set_u16.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_rr.3 diff --git a/lib/c-ares-1.23.0/docs/ares_dns_rr_set_u32.3 b/lib/c-ares-1.23.0/docs/ares_dns_rr_set_u32.3 new file mode 100644 index 00000000000..b93e4cd4e37 --- /dev/null +++ b/lib/c-ares-1.23.0/docs/ares_dns_rr_set_u32.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_rr.3 diff --git a/lib/c-ares-1.23.0/docs/ares_dns_rr_set_u8.3 b/lib/c-ares-1.23.0/docs/ares_dns_rr_set_u8.3 new file mode 100644 index 00000000000..b93e4cd4e37 --- /dev/null +++ b/lib/c-ares-1.23.0/docs/ares_dns_rr_set_u8.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_rr.3 diff --git a/lib/c-ares-1.23.0/docs/ares_dns_section_t.3 b/lib/c-ares-1.23.0/docs/ares_dns_section_t.3 new file mode 100644 index 00000000000..b93e4cd4e37 --- /dev/null +++ b/lib/c-ares-1.23.0/docs/ares_dns_section_t.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_rr.3 diff --git a/lib/c-ares-1.23.0/docs/ares_dns_section_tostr.3 b/lib/c-ares-1.23.0/docs/ares_dns_section_tostr.3 new file mode 100644 index 00000000000..4587b9a586e --- /dev/null +++ b/lib/c-ares-1.23.0/docs/ares_dns_section_tostr.3 @@ -0,0 +1,4 @@ +.\" +.\" Copyright (C) Daniel Stenberg +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_mapping.3 diff --git a/lib/c-ares-1.23.0/docs/ares_dns_write.3 b/lib/c-ares-1.23.0/docs/ares_dns_write.3 new file mode 100644 index 00000000000..4acc581d297 --- /dev/null +++ b/lib/c-ares-1.23.0/docs/ares_dns_write.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_record.3 diff --git a/lib/c-ares-1.19.1/docs/ares_dup.3 b/lib/c-ares-1.23.0/docs/ares_dup.3 similarity index 88% rename from lib/c-ares-1.19.1/docs/ares_dup.3 rename to lib/c-ares-1.23.0/docs/ares_dup.3 index 925c0cdd5f7..15b81a666c2 100644 --- a/lib/c-ares-1.19.1/docs/ares_dup.3 +++ b/lib/c-ares-1.23.0/docs/ares_dup.3 @@ -13,6 +13,8 @@ .\" this software for any purpose. It is provided "as is" .\" without express or implied warranty. .\" +.\" SPDX-License-Identifier: MIT +.\" .TH ARES_DUP 3 "26 May 2009" .SH NAME ares_dup \- Duplicate a resolver channel @@ -20,7 +22,7 @@ ares_dup \- Duplicate a resolver channel .nf #include -int ares_dup(ares_channel *\fIdest\fP, ares_channel \fIsource\fP) +int ares_dup(ares_channel_t **\fIdest\fP, ares_channel_t *\fIsource\fP) .fi .SH DESCRIPTION The \fBares_dup(3)\fP function duplicates an existing communications channel @@ -29,9 +31,9 @@ set the variable pointed to by \fIdest\fP to a handle used to identify the name service channel. The caller should invoke \fIares_destroy(3)\fP on the handle when the channel is no longer needed. .SH SEE ALSO -.BR ares_destroy(3), -.BR ares_init(3), -.BR ares_library_init(3) +.BR ares_destroy (3), +.BR ares_init (3), +.BR ares_library_init (3) .SH AVAILABILITY \fIares_dup(3)\fP was added in c-ares 1.6.0 .SH AUTHOR diff --git a/lib/c-ares-1.19.1/docs/ares_expand_name.3 b/lib/c-ares-1.23.0/docs/ares_expand_name.3 similarity index 96% rename from lib/c-ares-1.19.1/docs/ares_expand_name.3 rename to lib/c-ares-1.23.0/docs/ares_expand_name.3 index e750ab89162..2f3866bb00f 100644 --- a/lib/c-ares-1.19.1/docs/ares_expand_name.3 +++ b/lib/c-ares-1.23.0/docs/ares_expand_name.3 @@ -13,6 +13,8 @@ .\" this software for any purpose. It is provided "as is" .\" without express or implied warranty. .\" +.\" SPDX-License-Identifier: MIT +.\" .TH ARES_EXPAND_NAME 3 "20 Nov 2009" .SH NAME ares_expand_name \- Expand a DNS-encoded domain name @@ -58,7 +60,8 @@ The encoded domain name was malformed and could not be expanded. .B ARES_ENOMEM Memory was exhausted. .SH SEE ALSO -.BR ares_mkquery (3), ares_free_string (3) +.BR ares_mkquery (3), +.BR ares_free_string (3) .SH AUTHOR Greg Hudson, MIT Information Systems .br diff --git a/lib/c-ares-1.19.1/docs/ares_expand_string.3 b/lib/c-ares-1.23.0/docs/ares_expand_string.3 similarity index 98% rename from lib/c-ares-1.19.1/docs/ares_expand_string.3 rename to lib/c-ares-1.23.0/docs/ares_expand_string.3 index 89037424f1f..572881853d7 100644 --- a/lib/c-ares-1.19.1/docs/ares_expand_string.3 +++ b/lib/c-ares-1.23.0/docs/ares_expand_string.3 @@ -13,6 +13,8 @@ .\" this software for any purpose. It is provided "as is" .\" without express or implied warranty. .\" +.\" SPDX-License-Identifier: MIT +.\" .TH ARES_EXPAND_NAME 3 "20 Nov 2009" .SH NAME ares_expand_string \- Expand a length encoded string diff --git a/lib/c-ares-1.19.1/docs/ares_fds.3 b/lib/c-ares-1.23.0/docs/ares_fds.3 similarity index 95% rename from lib/c-ares-1.19.1/docs/ares_fds.3 rename to lib/c-ares-1.23.0/docs/ares_fds.3 index 07063fb008f..bbb6b2e8abe 100644 --- a/lib/c-ares-1.19.1/docs/ares_fds.3 +++ b/lib/c-ares-1.23.0/docs/ares_fds.3 @@ -13,6 +13,8 @@ .\" this software for any purpose. It is provided "as is" .\" without express or implied warranty. .\" +.\" SPDX-License-Identifier: MIT +.\" .TH ARES_FDS 3 "23 July 1998" .SH NAME ares_fds \- return file descriptors to select on @@ -20,7 +22,7 @@ ares_fds \- return file descriptors to select on .nf #include -int ares_fds(ares_channel \fIchannel\fP, +int ares_fds(ares_channel_t *\fIchannel\fP, fd_set *\fIread_fds\fP, fd_set *\fIwrite_fds\fP) .fi diff --git a/lib/c-ares-1.23.0/docs/ares_free_data.3 b/lib/c-ares-1.23.0/docs/ares_free_data.3 new file mode 100644 index 00000000000..67cde08e50e --- /dev/null +++ b/lib/c-ares-1.23.0/docs/ares_free_data.3 @@ -0,0 +1,81 @@ +.\" +.\" Copyright 1998 by the Massachusetts Institute of Technology. +.\" Copyright (C) 2004-2010 by Daniel Stenberg +.\" +.\" 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. +.\" +.\" SPDX-License-Identifier: MIT +.\" +.TH ARES_FREE_DATA 3 "5 March 2010" +.SH NAME +ares_free_data \- Free data allocated by several c-ares functions +.SH SYNOPSIS +.nf +#include + +void ares_free_data(void *\fIdataptr\fP) +.fi +.SH DESCRIPTION +.PP +The \fBares_free_data(3)\fP function frees one or more data structures +allocated and returned by several c-ares functions. Specifically the data +returned by the following list of functions must be deallocated using this +function. +.TP 5 +.B ares_get_servers(3) +When used to free the data returned by \fIares_get_servers(3)\fP this will +free the whole linked list of ares_addr_node structures returned by +\fIares_get_servers(3)\fP. +.TP +.B ares_parse_srv_reply(3) +When used to free the data returned by \fIares_parse_srv_reply(3)\fP this will +free the whole linked list of ares_srv_reply structures returned by +\fIares_parse_srv_reply(3)\fP, along with any additional storage associated +with those structures. +.TP +.B ares_parse_mx_reply(3) +When used to free the data returned by \fIares_parse_mx_reply(3)\fP this will +free the whole linked list of ares_mx_reply structures returned by +\fIares_parse_mx_reply(3)\fP, along with any additional storage associated +with those structures. +.TP +.B ares_parse_txt_reply(3) +When used to free the data returned by \fIares_parse_txt_reply(3)\fP this will +free the whole linked list of ares_txt_reply structures returned by +\fIares_parse_txt_reply(3)\fP, along with any additional storage associated +with those structures. +.TP +.B ares_parse_soa_reply(3) +When used to free the data returned by \fIares_parse_soa_reply(3)\fP this will +free the ares_soa_reply structure, along with any additional storage +associated with those structure. +.B ares_parse_uri_reply(3) +When used to free the data returned by \fIares_parse_uri_reply(3)\fP this will +free list of ares_uri_reply structures, along with any additional storage +associated with those structure. +.SH RETURN VALUE +The \fIares_free_data(3)\fP function does not return a value. +.SH AVAILABILITY +This function was first introduced in c-ares version 1.7.0. +.SH SEE ALSO +.BR ares_get_servers (3), +.BR ares_parse_srv_reply (3), +.BR ares_parse_mx_reply (3), +.BR ares_parse_txt_reply (3), +.BR ares_parse_soa_reply (3) +.SH AUTHOR +Yang Tse +.PP +Copyright 1998 by the Massachusetts Institute of Technology. +.br +Copyright (C) 2004-2010 by Daniel Stenberg. diff --git a/lib/c-ares-1.19.1/docs/ares_free_hostent.3 b/lib/c-ares-1.23.0/docs/ares_free_hostent.3 similarity index 97% rename from lib/c-ares-1.19.1/docs/ares_free_hostent.3 rename to lib/c-ares-1.23.0/docs/ares_free_hostent.3 index 7c92724e70c..ef7840800bf 100644 --- a/lib/c-ares-1.19.1/docs/ares_free_hostent.3 +++ b/lib/c-ares-1.23.0/docs/ares_free_hostent.3 @@ -13,6 +13,8 @@ .\" this software for any purpose. It is provided "as is" .\" without express or implied warranty. .\" +.\" SPDX-License-Identifier: MIT +.\" .TH ARES_FREE_HOSTENT 3 "23 July 1998" .SH NAME ares_free_hostent \- Free host structure allocated by ares functions diff --git a/lib/c-ares-1.19.1/docs/ares_free_string.3 b/lib/c-ares-1.23.0/docs/ares_free_string.3 similarity index 96% rename from lib/c-ares-1.19.1/docs/ares_free_string.3 rename to lib/c-ares-1.23.0/docs/ares_free_string.3 index d8a8e4689b5..7a4063f8f7c 100644 --- a/lib/c-ares-1.19.1/docs/ares_free_string.3 +++ b/lib/c-ares-1.23.0/docs/ares_free_string.3 @@ -13,6 +13,8 @@ .\" this software for any purpose. It is provided "as is" .\" without express or implied warranty. .\" +.\" SPDX-License-Identifier: MIT +.\" .TH ARES_FREE_STRING 3 "4 February 2004" .SH NAME ares_free_string \- Free strings allocated by ares functions diff --git a/lib/c-ares-1.19.1/docs/ares_freeaddrinfo.3 b/lib/c-ares-1.23.0/docs/ares_freeaddrinfo.3 similarity index 96% rename from lib/c-ares-1.19.1/docs/ares_freeaddrinfo.3 rename to lib/c-ares-1.23.0/docs/ares_freeaddrinfo.3 index 8a8ad591872..8a3bb12a48a 100644 --- a/lib/c-ares-1.19.1/docs/ares_freeaddrinfo.3 +++ b/lib/c-ares-1.23.0/docs/ares_freeaddrinfo.3 @@ -13,6 +13,8 @@ .\" this software for any purpose. It is provided "as is" .\" without express or implied warranty. .\" +.\" SPDX-License-Identifier: MIT +.\" .TH ARES_FREEADDRINFO 3 "31 October 2018" .SH NAME ares_freeaddrinfo \- Free addrinfo structure allocated by ares functions diff --git a/lib/c-ares-1.19.1/docs/ares_get_servers.3 b/lib/c-ares-1.23.0/docs/ares_get_servers.3 similarity index 95% rename from lib/c-ares-1.19.1/docs/ares_get_servers.3 rename to lib/c-ares-1.23.0/docs/ares_get_servers.3 index eb5861b6015..a10b473bb66 100644 --- a/lib/c-ares-1.19.1/docs/ares_get_servers.3 +++ b/lib/c-ares-1.23.0/docs/ares_get_servers.3 @@ -14,6 +14,8 @@ .\" this software for any purpose. It is provided "as is" .\" without express or implied warranty. .\" +.\" SPDX-License-Identifier: MIT +.\" .TH ARES_GET_SERVERS 3 "5 March 2010" .SH NAME ares_get_servers, ares_get_servers_ports \- Retrieve name servers from an initialized ares_channel @@ -21,10 +23,10 @@ ares_get_servers, ares_get_servers_ports \- Retrieve name servers from an initia .nf #include -int ares_get_servers(ares_channel \fIchannel\fP, +int ares_get_servers(ares_channel_t *\fIchannel\fP, struct ares_addr_node **\fIservers\fP) -int ares_get_servers_ports(ares_channel \fIchannel\fP, +int ares_get_servers_ports(ares_channel_t *\fIchannel\fP, struct ares_addr_port_node **\fIservers\fP) .fi .SH DESCRIPTION diff --git a/lib/c-ares-1.23.0/docs/ares_get_servers_ports.3 b/lib/c-ares-1.23.0/docs/ares_get_servers_ports.3 new file mode 100644 index 00000000000..2fb648531bb --- /dev/null +++ b/lib/c-ares-1.23.0/docs/ares_get_servers_ports.3 @@ -0,0 +1,4 @@ +.\" +.\" Copyright (C) Daniel Stenberg +.\" SPDX-License-Identifier: MIT +.so man3/ares_get_servers.3 diff --git a/lib/c-ares-1.19.1/docs/ares_getaddrinfo.3 b/lib/c-ares-1.23.0/docs/ares_getaddrinfo.3 similarity index 86% rename from lib/c-ares-1.19.1/docs/ares_getaddrinfo.3 rename to lib/c-ares-1.23.0/docs/ares_getaddrinfo.3 index eb085e5d26e..27585aa3d54 100644 --- a/lib/c-ares-1.19.1/docs/ares_getaddrinfo.3 +++ b/lib/c-ares-1.23.0/docs/ares_getaddrinfo.3 @@ -13,6 +13,8 @@ .\" this software for any purpose. It is provided "as is" .\" without express or implied warranty. .\" +.\" SPDX-License-Identifier: MIT +.\" .TH ARES_GETADDRINFO 3 "4 November 2018" .SH NAME ares_getaddrinfo \- Initiate a host query by name and service @@ -24,16 +26,14 @@ typedef void (*ares_addrinfo_callback)(void *\fIarg\fP, int \fIstatus\fP, int \fItimeouts\fP, struct ares_addrinfo *\fIresult\fP) -void ares_getaddrinfo(ares_channel \fIchannel\fP, const char *\fIname\fP, +void ares_getaddrinfo(ares_channel_t *\fIchannel\fP, const char *\fIname\fP, const char* \fIservice\fP, const struct ares_addrinfo_hints *\fIhints\fP, ares_addrinfo_callback \fIcallback\fP, void *\fIarg\fP) .fi .SH DESCRIPTION -The -.B ares_getaddrinfo -function initiates a host query by name on the name service channel -identified by +The \fBares_getaddrinfo(3)\fP function initiates a host query by name on the +name service channel identified by .IR channel . The .I name @@ -91,11 +91,15 @@ Completion or failure of the query may happen immediately, or may happen during a later call to \fIares_process(3)\fP, \fIares_destroy(3)\fP or \fIares_cancel(3)\fP. .PP +If this is called from a thread other than which the main program event loop is +running, care needs to be taken to ensure any file descriptor lists are updated +immediately within the eventloop. When the associated callback is called, +it is called with a channel lock so care must be taken to ensure any processing +is minimal to prevent DNS channel stalls. +.PP The callback argument .I arg -is copied from the -.B ares_getaddrinfo -argument +is copied from the \fBares_getaddrinfo(3)\fP argument .IR arg . The callback argument .I status @@ -117,6 +121,9 @@ was not found. .B ARES_ENOMEM Memory was exhausted. .TP 19 +.B ARES_ESERVICE +The textual service name provided could not be dereferenced into a port. +.TP 19 .B ARES_ECANCELLED The query was cancelled. .TP 19 @@ -181,8 +188,7 @@ struct ares_addrinfo_cname { .EE .RE .PP -The reserved memory has to be deleted by -.B ares_freeaddrinfo. +The reserved memory has to be deleted by \fBares_freeaddrinfo(3)\fP. The result is sorted according to RFC6724 except: - Rule 3 (Avoid deprecated addresses) diff --git a/lib/c-ares-1.19.1/docs/ares_gethostbyaddr.3 b/lib/c-ares-1.23.0/docs/ares_gethostbyaddr.3 similarity index 86% rename from lib/c-ares-1.19.1/docs/ares_gethostbyaddr.3 rename to lib/c-ares-1.23.0/docs/ares_gethostbyaddr.3 index c58ca506150..4a250505281 100644 --- a/lib/c-ares-1.19.1/docs/ares_gethostbyaddr.3 +++ b/lib/c-ares-1.23.0/docs/ares_gethostbyaddr.3 @@ -13,6 +13,8 @@ .\" this software for any purpose. It is provided "as is" .\" without express or implied warranty. .\" +.\" SPDX-License-Identifier: MIT +.\" .TH ARES_GETHOSTBYADDR 3 "24 July 1998" .SH NAME ares_gethostbyaddr \- Initiate a host query by address @@ -24,7 +26,7 @@ typedef void (*ares_host_callback)(void *\fIarg\fP, int \fIstatus\fP, int \fItimeouts\fP, struct hostent *\fIhostent\fP) -void ares_gethostbyaddr(ares_channel \fIchannel\fP, const void *\fIaddr\fP, +void ares_gethostbyaddr(ares_channel_t *\fIchannel\fP, const void *\fIaddr\fP, int \fIaddrlen\fP, int \fIfamily\fP, ares_host_callback \fIcallback\fP, void *\fIarg\fP) .fi @@ -96,6 +98,12 @@ did not complete successfully, .I hostent will be .BR NULL . +.PP +If this is called from a thread other than which the main program event loop is +running, care needs to be taken to ensure any file descriptor lists are updated +immediately within the eventloop. When the associated callback is called, +it is called with a channel lock so care must be taken to ensure any processing +is minimal to prevent DNS channel stalls. .SH SEE ALSO .BR ares_process (3), .BR ares_gethostbyname (3) diff --git a/lib/c-ares-1.19.1/docs/ares_gethostbyname.3 b/lib/c-ares-1.23.0/docs/ares_gethostbyname.3 similarity index 87% rename from lib/c-ares-1.19.1/docs/ares_gethostbyname.3 rename to lib/c-ares-1.23.0/docs/ares_gethostbyname.3 index 5b4d9702b3f..e6d302d0c7f 100644 --- a/lib/c-ares-1.19.1/docs/ares_gethostbyname.3 +++ b/lib/c-ares-1.23.0/docs/ares_gethostbyname.3 @@ -13,6 +13,8 @@ .\" this software for any purpose. It is provided "as is" .\" without express or implied warranty. .\" +.\" SPDX-License-Identifier: MIT +.\" .TH ARES_GETHOSTBYNAME 3 "25 July 1998" .SH NAME ares_gethostbyname \- Initiate a host query by name @@ -24,7 +26,7 @@ typedef void (*ares_host_callback)(void *\fIarg\fP, int \fIstatus\fP, int \fItimeouts\fP, struct hostent *\fIhostent\fP) -void ares_gethostbyname(ares_channel \fIchannel\fP, const char *\fIname\fP, +void ares_gethostbyname(ares_channel_t *\fIchannel\fP, const char *\fIname\fP, int \fIfamily\fP, ares_host_callback \fIcallback\fP, void *\fIarg\fP) .fi @@ -104,6 +106,12 @@ did not complete successfully, .I hostent will be .BR NULL . +.PP +If this is called from a thread other than which the main program event loop is +running, care needs to be taken to ensure any file descriptor lists are updated +immediately within the eventloop. When the associated callback is called, +it is called with a channel lock so care must be taken to ensure any processing +is minimal to prevent DNS channel stalls. .SH SEE ALSO .BR ares_process (3), .BR ares_gethostbyaddr (3) diff --git a/lib/c-ares-1.19.1/docs/ares_gethostbyname_file.3 b/lib/c-ares-1.23.0/docs/ares_gethostbyname_file.3 similarity index 95% rename from lib/c-ares-1.19.1/docs/ares_gethostbyname_file.3 rename to lib/c-ares-1.23.0/docs/ares_gethostbyname_file.3 index ab127fce77a..06a21b50c1b 100644 --- a/lib/c-ares-1.19.1/docs/ares_gethostbyname_file.3 +++ b/lib/c-ares-1.23.0/docs/ares_gethostbyname_file.3 @@ -13,6 +13,8 @@ .\" this software for any purpose. It is provided "as is" .\" without express or implied warranty. .\" +.\" SPDX-License-Identifier: MIT +.\" .TH ARES_GETHOSTBYNAME 3 "25 July 1998" .SH NAME ares_gethostbyname_file \- Lookup a name in the system's hosts file @@ -20,7 +22,7 @@ ares_gethostbyname_file \- Lookup a name in the system's hosts file .nf #include -int ares_gethostbyname_file(ares_channel \fIchannel\fP, const char *\fIname\fP, +int ares_gethostbyname_file(ares_channel_t *\fIchannel\fP, const char *\fIname\fP, int \fIfamily\fP, struct hostent **host) .fi .SH DESCRIPTION diff --git a/lib/c-ares-1.19.1/docs/ares_getnameinfo.3 b/lib/c-ares-1.23.0/docs/ares_getnameinfo.3 similarity index 89% rename from lib/c-ares-1.19.1/docs/ares_getnameinfo.3 rename to lib/c-ares-1.23.0/docs/ares_getnameinfo.3 index d10d8410157..c941a68f655 100644 --- a/lib/c-ares-1.19.1/docs/ares_getnameinfo.3 +++ b/lib/c-ares-1.23.0/docs/ares_getnameinfo.3 @@ -13,6 +13,8 @@ .\" this software for any purpose. It is provided "as is" .\" without express or implied warranty. .\" +.\" SPDX-License-Identifier: MIT +.\" .TH ARES_GETNAMEINFO 3 "1 May 2009" .SH NAME ares_getnameinfo \- Address-to-nodename translation in protocol-independent manner @@ -24,7 +26,7 @@ typedef void (*ares_nameinfo_callback)(void *\fIarg\fP, int \fIstatus\fP, int \fItimeouts\fP, char *\fInode\fP, char *\fIservice\fP) -void ares_getnameinfo(ares_channel \fIchannel\fP, const struct sockaddr *\fIsa\fP, +void ares_getnameinfo(ares_channel_t *\fIchannel\fP, const struct sockaddr *\fIsa\fP, ares_socklen_t \fIsalen\fP, int \fIflags\fP, ares_nameinfo_callback \fIcallback\fP, void *\fIarg\fP) .fi @@ -84,6 +86,12 @@ failed, the ares library will invoke \fIcallback\fP. Completion or failure of the query may happen immediately, or may happen during a later call to \fIares_process(3)\fP, \fIares_destroy(3)\fP or \fIares_cancel(3)\fP. .PP +If this is called from a thread other than which the main program event loop is +running, care needs to be taken to ensure any file descriptor lists are updated +immediately within the eventloop. When the associated callback is called, +it is called with a channel lock so care must be taken to ensure any processing +is minimal to prevent DNS channel stalls. +.PP The callback argument .I arg is copied from the diff --git a/lib/c-ares-1.19.1/docs/ares_getsock.3 b/lib/c-ares-1.23.0/docs/ares_getsock.3 similarity index 94% rename from lib/c-ares-1.19.1/docs/ares_getsock.3 rename to lib/c-ares-1.23.0/docs/ares_getsock.3 index 7908daebc19..1079d85d7a9 100644 --- a/lib/c-ares-1.19.1/docs/ares_getsock.3 +++ b/lib/c-ares-1.23.0/docs/ares_getsock.3 @@ -13,6 +13,8 @@ .\" this software for any purpose. It is provided "as is" .\" without express or implied warranty. .\" +.\" SPDX-License-Identifier: MIT +.\" .TH ARES_GETSOCK 3 "11 March 2010" .SH NAME ares_getsock \- get socket descriptors to wait on @@ -20,7 +22,7 @@ ares_getsock \- get socket descriptors to wait on .nf #include -int ares_getsock(ares_channel \fIchannel\fP, ares_socket_t *\fIsocks\fP, +int ares_getsock(ares_channel_t *\fIchannel\fP, ares_socket_t *\fIsocks\fP, int \fInumsocks\fP); .fi .SH DESCRIPTION diff --git a/lib/c-ares-1.19.1/docs/ares_inet_ntop.3 b/lib/c-ares-1.23.0/docs/ares_inet_ntop.3 similarity index 96% rename from lib/c-ares-1.19.1/docs/ares_inet_ntop.3 rename to lib/c-ares-1.23.0/docs/ares_inet_ntop.3 index d0d0b5915ab..83306a1a12e 100644 --- a/lib/c-ares-1.19.1/docs/ares_inet_ntop.3 +++ b/lib/c-ares-1.23.0/docs/ares_inet_ntop.3 @@ -13,6 +13,8 @@ .\" this software for any purpose. It is provided "as is" .\" without express or implied warranty. .\" +.\" SPDX-License-Identifier: MIT +.\" .TH ARES_INET_NTOP 3 "17 Feb 2013" .SH NAME ares_inet_ntop \- convert a network format address to presentation format @@ -38,8 +40,8 @@ the size of this buffer, which shall be large enough to hold the text string (INET_ADDRSTRLEN (16) characters for IPv4, INET6_ADDRSTRLEN (46) characters for IPv6). .SH SEE ALSO -.BR ares_init(3), -.BR ares_inet_pton(3) +.BR ares_init (3), +.BR ares_inet_pton (3) .SH AVAILABILITY made properly publicly available in c-ares for real in version 1.10.0 .SH AUTHOR diff --git a/lib/c-ares-1.19.1/docs/ares_inet_pton.3 b/lib/c-ares-1.23.0/docs/ares_inet_pton.3 similarity index 95% rename from lib/c-ares-1.19.1/docs/ares_inet_pton.3 rename to lib/c-ares-1.23.0/docs/ares_inet_pton.3 index bf7140d3b54..d727533cff7 100644 --- a/lib/c-ares-1.19.1/docs/ares_inet_pton.3 +++ b/lib/c-ares-1.23.0/docs/ares_inet_pton.3 @@ -13,6 +13,8 @@ .\" this software for any purpose. It is provided "as is" .\" without express or implied warranty. .\" +.\" SPDX-License-Identifier: MIT +.\" .TH ARES_INET_PTON 3 "17 Feb 2013" .SH NAME ares_inet_pton \- convert an IPv4 or IPv6 address from text to binary form @@ -34,8 +36,8 @@ in. The \fBdst\fP argument points to a buffer into which the function stores the numeric address; this shall be large enough to hold the numeric address (32 bits for AF_INET, 128 bits for AF_INET6). .SH SEE ALSO -.BR ares_init(3), -.BR ares_inet_ntop(3) +.BR ares_init (3), +.BR ares_inet_ntop (3) .SH AVAILABILITY made properly publicly available in c-ares for real in version 1.10.0 .SH AUTHOR diff --git a/lib/c-ares-1.23.0/docs/ares_init.3 b/lib/c-ares-1.23.0/docs/ares_init.3 new file mode 100644 index 00000000000..6f81734ce3c --- /dev/null +++ b/lib/c-ares-1.23.0/docs/ares_init.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_init_options.3 diff --git a/lib/c-ares-1.19.1/docs/ares_init_options.3 b/lib/c-ares-1.23.0/docs/ares_init_options.3 similarity index 67% rename from lib/c-ares-1.19.1/docs/ares_init_options.3 rename to lib/c-ares-1.23.0/docs/ares_init_options.3 index b31f6637c75..942c1462783 100644 --- a/lib/c-ares-1.19.1/docs/ares_init_options.3 +++ b/lib/c-ares-1.23.0/docs/ares_init_options.3 @@ -2,21 +2,11 @@ .\" Copyright 1998 by the Massachusetts Institute of Technology. .\" Copyright (C) 2004-2010 by Daniel Stenberg .\" -.\" 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. +.\" SPDX-License-Identifier: MIT .\" -.TH ARES_INIT 3 "5 March 2010" +.TH ARES_INIT_OPTIONS 3 "5 March 2010" .SH NAME -ares_init_options \- Initialize a resolver channel +ares_init_options, ares_init \- Initialize a resolver channel .SH SYNOPSIS .nf #include @@ -42,13 +32,24 @@ struct ares_options { int ednspsz; char *resolvconf_path; char *hosts_path; + int udp_max_queries; + int maxtimeout; /* in milliseconds */ + unsigned int qcache_max_ttl; /* in seconds */ }; -int ares_init_options(ares_channel *\fIchannelptr\fP, - struct ares_options *\fIoptions\fP, - int \fIoptmask\fP) +int ares_init_options(ares_channel_t **\fIchannelptr\fP, + const struct ares_options *\fIoptions\fP, + int \fIoptmask\fP); + +int ares_init(ares_channel_t **\fIchannelptr\fP); + .fi .SH DESCRIPTION +The \fBares_init(3)\fP function is equivalent to calling +\fBares_init_options(NULL, 0)\fP. It is recommended to use +\fBares_init_options(3)\fP instead and to set or make configurable the +appropriate options for your application. + The \fBares_init_options(3)\fP function initializes a communications channel for name service lookups. If it returns successfully, \fBares_init_options(3)\fP will set the variable pointed to by @@ -56,14 +57,69 @@ for name service lookups. If it returns successfully, caller should invoke \fIares_destroy(3)\fP on the handle when the channel is no longer needed. +It is recommended for an application to have at most one ares channel and use +this for all DNS queries for the life of the application. When system +configuration changes, \fIares_reinit(3)\fP can be called to reload the +configuration if necessary. The recommended concurrent query limit is about +32k queries, but remembering that when specifying AF_UNSPEC for +\fBares_getaddrinfo(3)\fP or \fBares_gethostbyname(3)\fP, they may spawn +2 queries internally. The reason for the limit is c-ares does not allow +duplicate DNS query ids (which have a maximum of 64k) to be oustanding at a +given time, and it must randomly search for an available id thus 32k will limit +the number of searches. This limitation should not be a concern for most +implementations and c-ares may implement queuing in future releases to lift this +limitation. + The \fIoptmask\fP parameter generally specifies which fields in the structure pointed to by \fIoptions\fP are set, as follows: .TP 18 .B ARES_OPT_FLAGS .B int \fIflags\fP; .br -Flags controlling the behavior of the resolver. See below for a -description of possible flag values. +Flags controlling the behavior of the resolver: +.RS 4 +.TP 23 +.B ARES_FLAG_USEVC +Always use TCP queries (the "virtual circuit") instead of UDP +queries. Normally, TCP is only used if a UDP query yields a truncated +result. +.TP 23 +.B ARES_FLAG_PRIMARY +Only query the first server in the list of servers to query. +.TP 23 +.B ARES_FLAG_IGNTC +If a truncated response to a UDP query is received, do not fall back +to TCP; simply continue on with the truncated response. +.TP 23 +.B ARES_FLAG_NORECURSE +Do not set the "recursion desired" bit on outgoing queries, so that the name +server being contacted will not try to fetch the answer from other servers if +it doesn't know the answer locally. Be aware that ares will not do the +recursion for you. Recursion must be handled by the application calling ares +if \fIARES_FLAG_NORECURSE\fP is set. +.TP 23 +.B ARES_FLAG_STAYOPEN +Do not close communications sockets when the number of active queries +drops to zero. +.TP 23 +.B ARES_FLAG_NOSEARCH +Do not use the default search domains; only query hostnames as-is or +as aliases. +.TP 23 +.B ARES_FLAG_NOALIASES +Do not honor the HOSTALIASES environment variable, which normally +specifies a file of hostname translations. +.TP 23 +.B ARES_FLAG_NOCHECKRESP +Do not discard responses with the SERVFAIL, NOTIMP, or REFUSED +response code or responses whose questions don't match the questions +in the request. Primarily useful for writing clients which might be +used to test or debug name servers. +.TP 23 +.B ARES_FLAG_EDNS +Include an EDNS pseudo-resource record (RFC 2671) in generated requests. As of +v1.22, this is on by default if flags are otherwise not set. +.RE .TP 18 .B ARES_OPT_TIMEOUT .B int \fItimeout\fP; @@ -71,7 +127,7 @@ description of possible flag values. The number of seconds each name server is given to respond to a query on the first try. (After the first try, the timeout algorithm becomes more complicated, but scales linearly with the value of \fItimeout\fP.) The -default is five seconds. This option is being deprecated by +default is two seconds. This option is being deprecated by \fIARES_OPT_TIMEOUTMS\fP starting in c-ares 1.5.2. .TP 18 .B ARES_OPT_TIMEOUTMS @@ -80,7 +136,7 @@ default is five seconds. This option is being deprecated by The number of milliseconds each name server is given to respond to a query on the first try. (After the first try, the timeout algorithm becomes more complicated, but scales linearly with the value of \fItimeout\fP.) The -default is five seconds. Note that this option is specified with the same +default is two seconds. Note that this option is specified with the same struct field as the former \fIARES_OPT_TIMEOUT\fP, it is but the option bits that tell c-ares how to interpret the number. This option was added in c-ares 1.5.2. @@ -89,7 +145,7 @@ that tell c-ares how to interpret the number. This option was added in c-ares .B int \fItries\fP; .br The number of tries the resolver will try contacting each name server -before giving up. The default is four tries. +before giving up. The default is three tries. .TP 18 .B ARES_OPT_NDOTS .B int \fIndots\fP; @@ -99,6 +155,13 @@ queried for "as is" prior to querying for it with the default domain extensions appended. The default value is 1 unless set otherwise by resolv.conf or the RES_OPTIONS environment variable. .TP 18 +.B ARES_OPT_MAXTIMEOUTMS +.B int \fImaxtimeout\fP; +.br +The upper bound for timeout between sequential retry attempts. When retrying +queries, the timeout is increased from the requested timeout parameter, this +caps the value. +.TP 18 .B ARES_OPT_UDP_PORT .B unsigned short \fIudp_port\fP; .br @@ -117,10 +180,9 @@ The default value is 53, the standard name service port. .B int \fInservers\fP; .br The list of IPv4 servers to contact, instead of the servers specified in -resolv.conf or the local named. In order to allow specification of either -IPv4 or IPv6 name servers, the -.BR ares_set_servers(3) -function must be used instead. +resolv.conf or the local named. In order to allow specification of either IPv4 +or IPv6 name servers, the \Bares_set_servers(3)\fP function must be used +instead. .TP 18 .B ARES_OPT_DOMAINS .B char **\fIdomains\fP; @@ -181,9 +243,9 @@ The receive buffer size to set for the socket. .B ARES_OPT_EDNSPSZ .B int \fIednspsz\fP; .br -The message size to be advertized in EDNS; only takes effect if the +The message size to be advertised in EDNS; only takes effect if the .B ARES_FLAG_EDNS -flag is set. +flag is set. Defaults to 1280, the recommended size. .TP 18 .B ARES_OPT_RESOLVCONF .B char *\fIresolvconf_path\fP; @@ -204,6 +266,26 @@ should be set to a path string, and will be honoured on *nix like systems. The default is .B /etc/hosts .br +.TP 18 +.B ARES_OPT_UDP_MAX_QUERIES +.B int \fIudp_max_queries\fP; +.br +The maximum number of udp queries that can be sent on a single ephemeral port +to a given DNS server before a new ephemeral port is assigned. Any value of 0 +or less will be considered unlimited, and is the default. +.br +.TP 18 +.B ARES_OPT_QUERY_CACHE +.B unsigned int \fIqcache_max_ttl\fP; +.br +Enable the built-in query cache. Will cache queries based on the returned TTL +in the DNS message. Only fully successful and NXDOMAIN query results will be +cached. Fill in the \fIqcache_max_ttl\fP with the maximum number of seconds +a query result may be cached which will override a larger TTL in the response +message. This must be a non-zero value otherwise the cache will be disabled. +Choose a reasonable value for your application such as 300 (5 minutes) or +3600 (1 hour). +.br .PP The \fIoptmask\fP parameter also includes options without a corresponding field in the @@ -218,51 +300,10 @@ for each resolution. Do not perform round-robin nameserver selection; always use the list of nameservers in the same order. .PP -The -.I flags -field should be the bitwise or of some subset of the following values: -.TP 23 -.B ARES_FLAG_USEVC -Always use TCP queries (the "virtual circuit") instead of UDP -queries. Normally, TCP is only used if a UDP query yields a truncated -result. -.TP 23 -.B ARES_FLAG_PRIMARY -Only query the first server in the list of servers to query. -.TP 23 -.B ARES_FLAG_IGNTC -If a truncated response to a UDP query is received, do not fall back -to TCP; simply continue on with the truncated response. -.TP 23 -.B ARES_FLAG_NORECURSE -Do not set the "recursion desired" bit on outgoing queries, so that the name -server being contacted will not try to fetch the answer from other servers if -it doesn't know the answer locally. Be aware that ares will not do the -recursion for you. Recursion must be handled by the application calling ares -if \fIARES_FLAG_NORECURSE\fP is set. -.TP 23 -.B ARES_FLAG_STAYOPEN -Do not close communications sockets when the number of active queries -drops to zero. -.TP 23 -.B ARES_FLAG_NOSEARCH -Do not use the default search domains; only query hostnames as-is or -as aliases. -.TP 23 -.B ARES_FLAG_NOALIASES -Do not honor the HOSTALIASES environment variable, which normally -specifies a file of hostname translations. -.TP 23 -.B ARES_FLAG_NOCHECKRESP -Do not discard responses with the SERVFAIL, NOTIMP, or REFUSED -response code or responses whose questions don't match the questions -in the request. Primarily useful for writing clients which might be -used to test or debug name servers. -.TP 23 -.B ARES_FLAG_EDNS -Include an EDNS pseudo-resource record (RFC 2671) in generated requests. + .SH RETURN VALUES -\fBares_init_options(3)\fP can return any of the following values: +\fBares_init_options(3)\fP and \fBares_init(3)\fP can return any of the +following values: .TP 14 .B ARES_SUCCESS Initialization succeeded. @@ -281,21 +322,22 @@ When initializing from (or, alternatively when specified by the .I resolvconf_path path location) -\fBares_init_options(3)\fP reads the \fIdomain\fP and \fIsearch\fP directives -to allow lookups of short names relative to the domains specified. The -\fIdomain\fP and \fIsearch\fP directives override one another. If more than -one instance of either \fIdomain\fP or \fIsearch\fP directives is specified, -the last occurrence wins. For more information, please see the +\fBares_init_options(3)\fP and \fBares_init(3)\fP reads the \fIdomain\fP and +\fIsearch\fP directives to allow lookups of short names relative to the domains +specified. The \fIdomain\fP and \fIsearch\fP directives override one another. +If more than one instance of either \fIdomain\fP or \fIsearch\fP directives is +specified, the last occurrence wins. For more information, please see the .BR resolv.conf (5) manual page. .SH SEE ALSO -.BR ares_init(3), -.BR ares_destroy(3), -.BR ares_dup(3), -.BR ares_library_init(3), -.BR ares_save_options(3), -.BR ares_set_servers(3), -.BR ares_set_sortlist(3) +.BR ares_reinit (3), +.BR ares_destroy (3), +.BR ares_dup (3), +.BR ares_library_init (3), +.BR ares_save_options (3), +.BR ares_set_servers (3), +.BR ares_set_sortlist (3), +.BR ares_threadsafety (3) .SH AUTHOR Greg Hudson, MIT Information Systems .br diff --git a/lib/c-ares-1.19.1/docs/ares_library_cleanup.3 b/lib/c-ares-1.23.0/docs/ares_library_cleanup.3 similarity index 92% rename from lib/c-ares-1.19.1/docs/ares_library_cleanup.3 rename to lib/c-ares-1.23.0/docs/ares_library_cleanup.3 index a1ffa6a948a..d6d76959b9d 100644 --- a/lib/c-ares-1.19.1/docs/ares_library_cleanup.3 +++ b/lib/c-ares-1.23.0/docs/ares_library_cleanup.3 @@ -14,6 +14,8 @@ .\" this software for any purpose. It is provided "as is" .\" without express or implied warranty. .\" +.\" SPDX-License-Identifier: MIT +.\" .TH ARES_LIBRARY_CLEANUP 3 "19 May 2009" .SH NAME ares_library_cleanup \- c-ares library deinitialization @@ -61,11 +63,10 @@ the DllMain function. Doing so will produce deadlocks and other problems. This function was first introduced in c-ares version 1.7.0 along with the definition of preprocessor symbol \fICARES_HAVE_ARES_LIBRARY_CLEANUP\fP as an indication of the availability of this function. Reference counting in -\fIares_library_init()\fP and \fIares_library_cleanup()\fP, which requires +\fIares_library_init(3)\fP and \fIares_library_cleanup(3)\fP, which requires calls to the former function to match calls to the latter, is present since -c-ares version 1.10.0. -Earlier versions would deinitialize the library on the first call -to \fIares_library_cleanup()\fP. +c-ares version 1.10.0. Earlier versions would deinitialize the library on the +first call to \fIares_library_cleanup(3)\fP. .PP Since the introduction of this function, it is absolutely mandatory to call it for any Win32/64 program using c-ares. @@ -74,8 +75,8 @@ Non-Win32/64 systems can still use c-ares version 1.7.0 without calling \fIares_library_cleanup(3)\fP due to the fact that \fIcurrently\fP it is nearly a do-nothing function on non-Win32/64 platforms. .SH SEE ALSO -.BR ares_library_init(3), -.BR ares_cancel(3) +.BR ares_library_init (3), +.BR ares_cancel (3) .SH AUTHOR Yang Tse .PP diff --git a/lib/c-ares-1.19.1/docs/ares_library_init.3 b/lib/c-ares-1.23.0/docs/ares_library_init.3 similarity index 89% rename from lib/c-ares-1.19.1/docs/ares_library_init.3 rename to lib/c-ares-1.23.0/docs/ares_library_init.3 index 21fc3ecab54..2f61ce2fcf8 100644 --- a/lib/c-ares-1.19.1/docs/ares_library_init.3 +++ b/lib/c-ares-1.23.0/docs/ares_library_init.3 @@ -14,6 +14,8 @@ .\" this software for any purpose. It is provided "as is" .\" without express or implied warranty. .\" +.\" SPDX-License-Identifier: MIT +.\" .TH ARES_LIBRARY_INIT 3 "19 May 2009" .SH NAME ares_library_init \- c-ares library initialization @@ -85,18 +87,18 @@ as there are no currently dynamically loaded libraries. .B ARES_LIB_INIT_NONE Initialize nothing extra. This sets no bit. .SH RETURN VALUE -Upon successful completion, ares_library_init() will return 0. Otherwise, a -non-zero error number will be returned to indicate the error. Except for +Upon successful completion, \fIares_library_init(3)\fP returns 0. Otherwise, +a non-zero error number is returned to indicate the error. Except for \fIares_strerror(3)\fP, you shall not call any other c-ares function upon \fIares_library_init(3)\fP failure. .SH AVAILABILITY This function was first introduced in c-ares version 1.7.0 along with the definition of preprocessor symbol \fICARES_HAVE_ARES_LIBRARY_INIT\fP as an -indication of the availability of this function. Its recursive behavior, -which requires a matching number of calls to \fIares_library_cleanup()\fP -in order to deinitialize the library, is present since c-ares version -1.10.0. Earlier versions would deinitialize the library on the first call -to \fIares_library_cleanup()\fP. +indication of the availability of this function. Its recursive behavior, which +requires a matching number of calls to \fIares_library_cleanup(3)\fP in order +to deinitialize the library, is present since c-ares version 1.10.0. Earlier +versions would deinitialize the library on the first call to +\fIares_library_cleanup(3)\fP. .PP Since the introduction of this function it is absolutely mandatory to call it for any Win32/64 program using c-ares. @@ -105,8 +107,8 @@ Non-Win32/64 systems can still use c-ares version 1.7.0 without calling \fIares_library_init(3)\fP due to the fact that \fIcurrently\fP it is nearly a do-nothing function on non-Win32/64 platforms at this point. .SH SEE ALSO -.BR ares_library_cleanup(3), -.BR ares_strerror(3) +.BR ares_library_cleanup (3), +.BR ares_strerror (3) .SH AUTHOR Yang Tse .PP diff --git a/lib/c-ares-1.19.1/docs/ares_library_init_android.3 b/lib/c-ares-1.23.0/docs/ares_library_init_android.3 similarity index 96% rename from lib/c-ares-1.19.1/docs/ares_library_init_android.3 rename to lib/c-ares-1.23.0/docs/ares_library_init_android.3 index 9e1ac4cd5be..5c8bb7537f7 100644 --- a/lib/c-ares-1.19.1/docs/ares_library_init_android.3 +++ b/lib/c-ares-1.23.0/docs/ares_library_init_android.3 @@ -13,6 +13,8 @@ .\" this software for any purpose. It is provided "as is" .\" without express or implied warranty. .\" +.\" SPDX-License-Identifier: MIT +.\" .TH ARES_LIBRARY_INIT_ANDROID 3 "13 Sept 2017" .SH NAME ares_library_init_android \- c-ares library Android initialization @@ -51,7 +53,7 @@ Deinitialization will take place though \fIares_library_cleanup(3)\fP. The \fBares_library_init_jvm\fP function allows the caller to register the JVM with c-ares. It's meant to be called during JNI_OnLoad because you're guaranteed to have the JVM in that function. The JVM is required in order to -use the Connectivty Manager registered using +use the Connectivity Manager registered using \fIares_library_init_android(3)\fP. This must be call before \fIares_library_init_android(3)\fP. @@ -115,7 +117,7 @@ Calling the registered function from Java: } .fi Initializing the Connectivity Manager in JNI directly using an Android -Context. It is assumed the JVM has aleady been registered through +Context. It is assumed the JVM has already been registered through \fIJNI_OnLoad\fP. .nf void initialize(jobject android_context) @@ -133,8 +135,8 @@ Context. It is assumed the JVM has aleady been registered through .SH AVAILABILITY This function was first introduced in c-ares version 1.15.0. .SH SEE ALSO -.BR ares_library_init(3), -.BR ares_library_cleanup(3), +.BR ares_library_init (3), +.BR ares_library_cleanup (3), .SH AUTHOR John Schember .PP diff --git a/lib/c-ares-1.19.1/docs/ares_library_initialized.3 b/lib/c-ares-1.23.0/docs/ares_library_initialized.3 similarity index 92% rename from lib/c-ares-1.19.1/docs/ares_library_initialized.3 rename to lib/c-ares-1.23.0/docs/ares_library_initialized.3 index 3e2727f8574..8ddc14539a1 100644 --- a/lib/c-ares-1.19.1/docs/ares_library_initialized.3 +++ b/lib/c-ares-1.23.0/docs/ares_library_initialized.3 @@ -13,6 +13,8 @@ .\" this software for any purpose. It is provided "as is" .\" without express or implied warranty. .\" +.\" SPDX-License-Identifier: MIT +.\" .TH ARES_LIBRARY_INITIALIZED 3 "29 Sep 2016" .SH NAME ares_library_initialized \- get the initialization state @@ -30,5 +32,5 @@ initialization is needed. .SH AVAILABILITY This function was first introduced in c-ares version 1.11.0 .SH SEE ALSO -.BR ares_library_init(3), -.BR ares_library_cleanup(3) +.BR ares_library_init (3), +.BR ares_library_cleanup (3) diff --git a/lib/c-ares-1.19.1/docs/ares_mkquery.3 b/lib/c-ares-1.23.0/docs/ares_mkquery.3 similarity index 97% rename from lib/c-ares-1.19.1/docs/ares_mkquery.3 rename to lib/c-ares-1.23.0/docs/ares_mkquery.3 index e394fe2847a..9b9aa807176 100644 --- a/lib/c-ares-1.19.1/docs/ares_mkquery.3 +++ b/lib/c-ares-1.23.0/docs/ares_mkquery.3 @@ -13,6 +13,8 @@ .\" this software for any purpose. It is provided "as is" .\" without express or implied warranty. .\" +.\" SPDX-License-Identifier: MIT +.\" .TH ARES_MKQUERY 3 "20 Nov 2009" .SH NAME ares_mkquery \- Compose a single-question DNS query buffer @@ -82,6 +84,7 @@ characters. Memory was exhausted. .SH SEE ALSO .BR ares_expand_name (3), +.BR ares_dns_record (3), .BR ares_free_string (3) .SH AUTHOR Greg Hudson, MIT Information Systems diff --git a/lib/c-ares-1.23.0/docs/ares_opt_param_t.3 b/lib/c-ares-1.23.0/docs/ares_opt_param_t.3 new file mode 100644 index 00000000000..4587b9a586e --- /dev/null +++ b/lib/c-ares-1.23.0/docs/ares_opt_param_t.3 @@ -0,0 +1,4 @@ +.\" +.\" Copyright (C) Daniel Stenberg +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_mapping.3 diff --git a/lib/c-ares-1.19.1/docs/ares_parse_a_reply.3 b/lib/c-ares-1.23.0/docs/ares_parse_a_reply.3 similarity index 98% rename from lib/c-ares-1.19.1/docs/ares_parse_a_reply.3 rename to lib/c-ares-1.23.0/docs/ares_parse_a_reply.3 index 6038f68e599..8dd20c3dcd9 100644 --- a/lib/c-ares-1.19.1/docs/ares_parse_a_reply.3 +++ b/lib/c-ares-1.23.0/docs/ares_parse_a_reply.3 @@ -13,6 +13,8 @@ .\" this software for any purpose. It is provided "as is" .\" without express or implied warranty. .\" +.\" SPDX-License-Identifier: MIT +.\" .TH ARES_PARSE_A_REPLY 3 "25 July 1998" .SH NAME ares_parse_a_reply \- Parse a reply to a DNS query of type A diff --git a/lib/c-ares-1.19.1/docs/ares_parse_aaaa_reply.3 b/lib/c-ares-1.23.0/docs/ares_parse_aaaa_reply.3 similarity index 98% rename from lib/c-ares-1.19.1/docs/ares_parse_aaaa_reply.3 rename to lib/c-ares-1.23.0/docs/ares_parse_aaaa_reply.3 index bddd3c2f9fe..ebb490464cc 100644 --- a/lib/c-ares-1.19.1/docs/ares_parse_aaaa_reply.3 +++ b/lib/c-ares-1.23.0/docs/ares_parse_aaaa_reply.3 @@ -13,6 +13,8 @@ .\" this software for any purpose. It is provided "as is" .\" without express or implied warranty. .\" +.\" SPDX-License-Identifier: MIT +.\" .TH ARES_PARSE_AAAA_REPLY 3 "20 Nov 2009" .SH NAME ares_parse_aaaa_reply \- Parse a reply to a DNS query of type AAAA diff --git a/lib/c-ares-1.19.1/docs/ares_parse_caa_reply.3 b/lib/c-ares-1.23.0/docs/ares_parse_caa_reply.3 similarity index 97% rename from lib/c-ares-1.19.1/docs/ares_parse_caa_reply.3 rename to lib/c-ares-1.23.0/docs/ares_parse_caa_reply.3 index 71bd6be9601..ef95769fcc2 100644 --- a/lib/c-ares-1.19.1/docs/ares_parse_caa_reply.3 +++ b/lib/c-ares-1.23.0/docs/ares_parse_caa_reply.3 @@ -13,6 +13,8 @@ .\" this software for any purpose. It is provided "as is" .\" without express or implied warranty. .\" +.\" SPDX-License-Identifier: MIT +.\" .TH ARES_PARSE_CAA_REPLY 3 "16 September 2020" .SH NAME ares_parse_caa_reply \- Parse a reply to a DNS query of type CAA @@ -112,7 +114,7 @@ static void dns_callback(void *arg, ares_free_data (caa_out); } -static void main_loop(ares_channel *channel) +static void main_loop(ares_channel_t **channel) { int nfds, count; fd_set readers, writers; @@ -143,7 +145,7 @@ int main(int argc, char **argv) if (argc > 1) domain = argv[1]; - ares_channel channel; + ares_channel_t *channel; if ((err = ares_init (&channel)) != ARES_SUCCESS) { printf ("ares_init() failed (%i)\\n", err); diff --git a/lib/c-ares-1.19.1/docs/ares_parse_mx_reply.3 b/lib/c-ares-1.23.0/docs/ares_parse_mx_reply.3 similarity index 97% rename from lib/c-ares-1.19.1/docs/ares_parse_mx_reply.3 rename to lib/c-ares-1.23.0/docs/ares_parse_mx_reply.3 index 6c5c902d10c..851380ad7ef 100644 --- a/lib/c-ares-1.19.1/docs/ares_parse_mx_reply.3 +++ b/lib/c-ares-1.23.0/docs/ares_parse_mx_reply.3 @@ -13,6 +13,8 @@ .\" this software for any purpose. It is provided "as is" .\" without express or implied warranty. .\" +.\" SPDX-License-Identifier: MIT +.\" .TH ARES_PARSE_MX_REPLY 3 "4 August 2009" .SH NAME ares_parse_mx_reply \- Parse a reply to a DNS query of type MX @@ -38,7 +40,7 @@ memory and a pointer to it stored into the variable pointed to by It is the caller's responsibility to free the resulting .IR mx_out structure when it is no longer needed using the function -.B ares_free_data +\fBares_free_data(3)\fP. .PP The structure .I ares_mx_reply diff --git a/lib/c-ares-1.19.1/docs/ares_parse_naptr_reply.3 b/lib/c-ares-1.23.0/docs/ares_parse_naptr_reply.3 similarity index 97% rename from lib/c-ares-1.19.1/docs/ares_parse_naptr_reply.3 rename to lib/c-ares-1.23.0/docs/ares_parse_naptr_reply.3 index b98f8fd2409..b5ef19c508f 100644 --- a/lib/c-ares-1.19.1/docs/ares_parse_naptr_reply.3 +++ b/lib/c-ares-1.23.0/docs/ares_parse_naptr_reply.3 @@ -13,6 +13,8 @@ .\" this software for any purpose. It is provided "as is" .\" without express or implied warranty. .\" +.\" SPDX-License-Identifier: MIT +.\" .TH ARES_PARSE_NAPTR_REPLY 3 "23 February 2012" .SH NAME ares_parse_naptr_reply \- Parse a reply to a DNS query of type NAPTR @@ -39,7 +41,7 @@ memory and a pointer to it stored into the variable pointed to by It is the caller's responsibility to free the resulting .IR naptr_out structure when it is no longer needed using the function -.B ares_free_data +\fBares_free_data(3)\fP. .PP The structure .I ares_naptr_reply diff --git a/lib/c-ares-1.19.1/docs/ares_parse_ns_reply.3 b/lib/c-ares-1.23.0/docs/ares_parse_ns_reply.3 similarity index 98% rename from lib/c-ares-1.19.1/docs/ares_parse_ns_reply.3 rename to lib/c-ares-1.23.0/docs/ares_parse_ns_reply.3 index b767e04f683..2fed14c4743 100644 --- a/lib/c-ares-1.19.1/docs/ares_parse_ns_reply.3 +++ b/lib/c-ares-1.23.0/docs/ares_parse_ns_reply.3 @@ -13,6 +13,8 @@ .\" this software for any purpose. It is provided "as is" .\" without express or implied warranty. .\" +.\" SPDX-License-Identifier: MIT +.\" .TH ARES_PARSE_NS_REPLY 3 "10 February 2007" .SH NAME ares_parse_ns_reply \- Parse a reply to a DNS query of type NS into a hostent diff --git a/lib/c-ares-1.19.1/docs/ares_parse_ptr_reply.3 b/lib/c-ares-1.23.0/docs/ares_parse_ptr_reply.3 similarity index 98% rename from lib/c-ares-1.19.1/docs/ares_parse_ptr_reply.3 rename to lib/c-ares-1.23.0/docs/ares_parse_ptr_reply.3 index e3eb4d09b39..c554ecaa1f1 100644 --- a/lib/c-ares-1.19.1/docs/ares_parse_ptr_reply.3 +++ b/lib/c-ares-1.23.0/docs/ares_parse_ptr_reply.3 @@ -13,6 +13,8 @@ .\" this software for any purpose. It is provided "as is" .\" without express or implied warranty. .\" +.\" SPDX-License-Identifier: MIT +.\" .TH ARES_PARSE_PTR_REPLY 3 "25 July 1998" .SH NAME ares_parse_ptr_reply \- Parse a reply to a DNS query of type PTR into a hostent diff --git a/lib/c-ares-1.19.1/docs/ares_parse_soa_reply.3 b/lib/c-ares-1.23.0/docs/ares_parse_soa_reply.3 similarity index 97% rename from lib/c-ares-1.19.1/docs/ares_parse_soa_reply.3 rename to lib/c-ares-1.23.0/docs/ares_parse_soa_reply.3 index c43f9be0841..f816126ff55 100644 --- a/lib/c-ares-1.19.1/docs/ares_parse_soa_reply.3 +++ b/lib/c-ares-1.23.0/docs/ares_parse_soa_reply.3 @@ -13,6 +13,8 @@ .\" this software for any purpose. It is provided "as is" .\" without express or implied warranty. .\" +.\" SPDX-License-Identifier: MIT +.\" .TH ARES_PARSE_SOA_REPLY 3 "29 May 2012" .SH NAME ares_parse_soa_reply \- Parse a reply to a DNS query of type SOA @@ -38,7 +40,7 @@ memory and a pointer to it stored into the variable pointed to by It is the caller's responsibility to free the resulting .IR soa_out structure when it is no longer needed using the function -.B ares_free_data +\fBares_free_data(3)\fP. .PP The structure .I ares_soa_reply diff --git a/lib/c-ares-1.19.1/docs/ares_parse_srv_reply.3 b/lib/c-ares-1.23.0/docs/ares_parse_srv_reply.3 similarity index 97% rename from lib/c-ares-1.19.1/docs/ares_parse_srv_reply.3 rename to lib/c-ares-1.23.0/docs/ares_parse_srv_reply.3 index d3c26dbc287..d16f0d8a4ee 100644 --- a/lib/c-ares-1.19.1/docs/ares_parse_srv_reply.3 +++ b/lib/c-ares-1.23.0/docs/ares_parse_srv_reply.3 @@ -13,6 +13,8 @@ .\" this software for any purpose. It is provided "as is" .\" without express or implied warranty. .\" +.\" SPDX-License-Identifier: MIT +.\" .TH ARES_PARSE_SRV_REPLY 3 "4 August 2009" .SH NAME ares_parse_srv_reply \- Parse a reply to a DNS query of type SRV @@ -39,7 +41,7 @@ memory and a pointer to it stored into the variable pointed to by It is the caller's responsibility to free the resulting .IR srv_out structure when it is no longer needed using the function -.B ares_free_data +\fBares_free_data(3)\fP. .PP The structure .I ares_srv_reply diff --git a/lib/c-ares-1.19.1/docs/ares_parse_txt_reply.3 b/lib/c-ares-1.23.0/docs/ares_parse_txt_reply.3 similarity index 93% rename from lib/c-ares-1.19.1/docs/ares_parse_txt_reply.3 rename to lib/c-ares-1.23.0/docs/ares_parse_txt_reply.3 index 6eeb04c7419..22807facf5d 100644 --- a/lib/c-ares-1.19.1/docs/ares_parse_txt_reply.3 +++ b/lib/c-ares-1.23.0/docs/ares_parse_txt_reply.3 @@ -13,6 +13,8 @@ .\" this software for any purpose. It is provided "as is" .\" without express or implied warranty. .\" +.\" SPDX-License-Identifier: MIT +.\" .TH ARES_PARSE_TXT_REPLY 3 "27 October 2009" .SH NAME ares_parse_txt_reply \- Parse a reply to a DNS query of type TXT @@ -27,10 +29,9 @@ int ares_parse_txt_reply_ext(const unsigned char* \fIabuf\fP, int \fIalen\fP, struct ares_txt_ext **\fItxt_out\fP); .fi .SH DESCRIPTION -The -.BR "ares_parse_txt_reply" " (" "ares_parse_txt_reply_ext" ")" -function parses the response to a query of type TXT into a -linked list (one element per sub-string) of +The \fIares_parse_txt_reply(3)\fP and \fIares_parse_txt_reply_ext(3)\fP +functions parse the response to a query of type TXT into a linked list (one +element per sub-string) of .IR "struct ares_txt_reply" " (" "struct ares_txt_ext" ")" The parameters .I abuf @@ -42,13 +43,11 @@ memory and a pointer to it stored into the variable pointed to by It is the caller's responsibility to free the resulting .IR txt_out structure when it is no longer needed using the function -.B ares_free_data -.PP +\fBares_free_data(3)\fP. + The structure .I ares_txt_reply contains the following fields: -.sp -.in +4n .nf struct ares_txt_reply { struct ares_txt_reply *next; @@ -56,13 +55,10 @@ struct ares_txt_reply { unsigned char *txt; }; .fi -.in -.PP + The structure .I ares_txt_ext contains the following fields: -.sp -.in +4n .nf struct ares_txt_ext { struct ares_txt_ext *next; @@ -71,8 +67,6 @@ struct ares_txt_ext { unsigned char record_start; }; .fi -.in -.PP The .I record_start field in @@ -85,7 +79,7 @@ will have at least one item with equal to 1, and may have some items with .I record_start equal to 0 between them. -.PP + These sequences of .I struct ares_txt_ext (starting from the item with @@ -93,7 +87,6 @@ These sequences of equal to 1, and ending right before the record start item) may be treated as either components of a single TXT record or as a multi-parted TXT record, depending on particular use case. -.PP .SH RETURN VALUES .BR "ares_parse_txt_reply" " (" "ares_parse_txt_reply_ext" ")" can return any of the following values: diff --git a/lib/c-ares-1.19.1/docs/ares_parse_uri_reply.3 b/lib/c-ares-1.23.0/docs/ares_parse_uri_reply.3 similarity index 92% rename from lib/c-ares-1.19.1/docs/ares_parse_uri_reply.3 rename to lib/c-ares-1.23.0/docs/ares_parse_uri_reply.3 index 60bc22854c7..d2ec037bdae 100644 --- a/lib/c-ares-1.19.1/docs/ares_parse_uri_reply.3 +++ b/lib/c-ares-1.23.0/docs/ares_parse_uri_reply.3 @@ -13,6 +13,8 @@ .\" this software for any purpose. It is provided "as is" .\" without express or implied warranty. .\" +.\" SPDX-License-Identifier: MIT +.\" .TH ARES_PARSE_URI_REPLY 3 "14 August 2020" .SH NAME ares_parse_uri_reply \- Parse a reply to a DNS query of type URI @@ -24,10 +26,8 @@ int ares_parse_uri_reply(const unsigned char* \fIabuf\fP, int \fIalen\fP, struct ares_uri_reply** \fIuri_out\fP); .fi .SH DESCRIPTION -The -.B ares_parse_uri_reply -function parses the response to a query of type URI into a -linked list of +The \fIares_parse_uri_reply(3)\fP function parses the response to a query of +type URI into a linked list of .I struct ares_uri_reply The parameters .I abuf @@ -39,13 +39,11 @@ memory and a pointer to it stored into the variable pointed to by It is the caller's responsibility to free the resulting .IR uri_out structure when it is no longer needed using the function -.B ares_free_data -.PP +\fBares_free_data(3)\fP. + The structure .I ares_uri_reply contains the following fields: -.sp -.in +4n .nf struct ares_uri_reply { struct ares_uri_reply *next; @@ -55,8 +53,6 @@ struct ares_uri_reply { int ttl; }; .fi -.in -.PP .SH RETURN VALUES .B ares_parse_uri_reply can return any of the following values: diff --git a/lib/c-ares-1.19.1/docs/ares_process.3 b/lib/c-ares-1.23.0/docs/ares_process.3 similarity index 95% rename from lib/c-ares-1.19.1/docs/ares_process.3 rename to lib/c-ares-1.23.0/docs/ares_process.3 index 28666f2e152..c4d118c1f58 100644 --- a/lib/c-ares-1.19.1/docs/ares_process.3 +++ b/lib/c-ares-1.23.0/docs/ares_process.3 @@ -13,6 +13,8 @@ .\" this software for any purpose. It is provided "as is" .\" without express or implied warranty. .\" +.\" SPDX-License-Identifier: MIT +.\" .TH ARES_PROCESS 3 "25 July 1998" .SH NAME ares_process \- Process events for name resolution @@ -20,11 +22,11 @@ ares_process \- Process events for name resolution .nf #include -void ares_process(ares_channel \fIchannel\fP, +void ares_process(ares_channel_t *\fIchannel\fP, fd_set *\fIread_fds\fP, fd_set *\fIwrite_fds\fP) -void ares_process_fd(ares_channel \fIchannel\fP, +void ares_process_fd(ares_channel_t *\fIchannel\fP, ares_socket_t \fIread_fd\fP, ares_socket_t \fIwrite_fd\fP) .fi diff --git a/lib/c-ares-1.19.1/docs/ares_query.3 b/lib/c-ares-1.23.0/docs/ares_query.3 similarity index 90% rename from lib/c-ares-1.19.1/docs/ares_query.3 rename to lib/c-ares-1.23.0/docs/ares_query.3 index 1055baaed80..f87a5648222 100644 --- a/lib/c-ares-1.19.1/docs/ares_query.3 +++ b/lib/c-ares-1.23.0/docs/ares_query.3 @@ -13,6 +13,8 @@ .\" this software for any purpose. It is provided "as is" .\" without express or implied warranty. .\" +.\" SPDX-License-Identifier: MIT +.\" .TH ARES_QUERY 3 "24 July 1998" .SH NAME ares_query \- Initiate a single-question DNS query @@ -24,7 +26,7 @@ typedef void (*ares_callback)(void *\fIarg\fP, int \fIstatus\fP, int \fItimeouts\fP, unsigned char *\fIabuf\fP, int \fIalen\fP) -void ares_query(ares_channel \fIchannel\fP, const char *\fIname\fP, +void ares_query(ares_channel_t *\fIchannel\fP, const char *\fIname\fP, int \fIdnsclass\fP, int \fItype\fP, ares_callback \fIcallback\fP, void *\fIarg\fP) .fi @@ -52,6 +54,12 @@ happen during a later call to or .BR ares_destroy (3). .PP +If this is called from a thread other than which the main program event loop is +running, care needs to be taken to ensure any file descriptor lists are updated +immediately within the eventloop. When the associated callback is called, +it is called with a channel lock so care must be taken to ensure any processing +is minimal to prevent DNS channel stalls. +.PP The callback argument .I arg is copied from the diff --git a/lib/c-ares-1.23.0/docs/ares_reinit.3 b/lib/c-ares-1.23.0/docs/ares_reinit.3 new file mode 100644 index 00000000000..0b037127990 --- /dev/null +++ b/lib/c-ares-1.23.0/docs/ares_reinit.3 @@ -0,0 +1,51 @@ +.\" +.\" SPDX-License-Identifier: MIT +.\" +.TH ARES_REINIT 3 "12 November 2023" +.SH NAME +ares_reinit \- ReInitialize a resolver channel from system configuration. +.SH SYNOPSIS +.nf +#include + +int ares_reinit(ares_channel_t *\fIchannel\fP) +.fi +.SH DESCRIPTION +The \fBares_reinit(3)\fP function re-reads the system configuration and safely +applies the configuration to the existing channel. System configuration will +never override user-provided settings such as provided via +\fBares_init_options(3)\fP or \fBares_set_servers(3)\fP. + +Any existing queries will be automatically requeued if the server they are +currently assigned to is removed from the system configuration. + +This function may cause additional file descriptors to be created, and existing +ones to be destroyed if server configuration has changed. If this is called from +a thread other than which the main program event loop is running, care needs to +be taken to ensure any file descriptor lists are updated immediately within +the eventloop. + +.SH RETURN VALUES +\fIares_reinit(3)\fP can return any of the following values: +.TP 14 +.B ARES_SUCCESS +Initialization succeeded. +.TP 14 +.B ARES_EFILE +A configuration file could not be read. +.TP 14 +.B ARES_ENOMEM +The process's available memory was exhausted. + +.SH AVAILABILITY +This function was first introduced in c-ares version 1.22.0. +.SH SEE ALSO +.BR ares_init (3), +.BR ares_init_options (3), +.BR ares_destroy (3), +.BR ares_dup (3), +.BR ares_library_init (3), +.BR ares_set_servers (3), +.BR ares_threadsafety (3) +.SH AUTHOR +Copyright (C) 2023 The c-ares project and its members. diff --git a/lib/c-ares-1.19.1/docs/ares_save_options.3 b/lib/c-ares-1.23.0/docs/ares_save_options.3 similarity index 92% rename from lib/c-ares-1.19.1/docs/ares_save_options.3 rename to lib/c-ares-1.23.0/docs/ares_save_options.3 index b5fcf17776d..7beecd52770 100644 --- a/lib/c-ares-1.19.1/docs/ares_save_options.3 +++ b/lib/c-ares-1.23.0/docs/ares_save_options.3 @@ -13,6 +13,8 @@ .\" this software for any purpose. It is provided "as is" .\" without express or implied warranty. .\" +.\" SPDX-License-Identifier: MIT +.\" .TH ARES_SAVE_OPTIONS 3 "5 March 2010" .SH NAME ares_save_options \- Save configuration values obtained from initialized ares_channel @@ -20,7 +22,7 @@ ares_save_options \- Save configuration values obtained from initialized ares_ch .nf #include -int ares_save_options(ares_channel \fIchannel\fP, +int ares_save_options(ares_channel_t *\fIchannel\fP, struct ares_options *\fIoptions\fP, int *\fIoptmask\fP) .fi .SH DESCRIPTION @@ -58,9 +60,9 @@ this config struct, which may no longer be the complete set of config options. \fBares_dup(3)\fP will not have that restriction. The ares_options struct can not handle potential IPv6 name servers the -ares_channel might be configured to use. The \fBares_save_options(3)\fP function +ares channel might be configured to use. The \fBares_save_options(3)\fP function will only return IPv4 servers, if any. In order to retrieve all name servers -an ares_channel might be using, the \fBares_get_servers(3)\fP function must be +an ares channel might be using, the \fBares_get_servers(3)\fP function must be used instead. .SH SEE ALSO .BR ares_destroy_options (3), diff --git a/lib/c-ares-1.19.1/docs/ares_search.3 b/lib/c-ares-1.23.0/docs/ares_search.3 similarity index 90% rename from lib/c-ares-1.19.1/docs/ares_search.3 rename to lib/c-ares-1.23.0/docs/ares_search.3 index 6b301877d04..e4db64db8ce 100644 --- a/lib/c-ares-1.19.1/docs/ares_search.3 +++ b/lib/c-ares-1.23.0/docs/ares_search.3 @@ -13,6 +13,8 @@ .\" this software for any purpose. It is provided "as is" .\" without express or implied warranty. .\" +.\" SPDX-License-Identifier: MIT +.\" .TH ARES_SEARCH 3 "24 July 1998" .SH NAME ares_search \- Initiate a DNS query with domain search @@ -24,7 +26,7 @@ typedef void (*ares_callback)(void *\fIarg\fP, int \fIstatus\fP, int \fItimeouts\fP, unsigned char *\fIabuf\fP, int \fIalen\fP) -void ares_search(ares_channel \fIchannel\fP, const char *\fIname\fP, +void ares_search(ares_channel_t *\fIchannel\fP, const char *\fIname\fP, int \fIdnsclass\fP, int \fItype\fP, ares_callback \fIcallback\fP, void *\fIarg\fP) .fi @@ -55,6 +57,12 @@ may happen during a later call to or .BR ares_destroy (3). .PP +If this is called from a thread other than which the main program event loop is +running, care needs to be taken to ensure any file descriptor lists are updated +immediately within the eventloop. When the associated callback is called, +it is called with a channel lock so care must be taken to ensure any processing +is minimal to prevent DNS channel stalls. +.PP The callback argument .I arg is copied from the @@ -145,7 +153,8 @@ will usually be 0, but in some cases an unsuccessful query result may be placed in .IR abuf . .SH SEE ALSO -.BR ares_process (3) +.BR ares_process (3), +.BR ares_dns_record (3) .SH AUTHOR Greg Hudson, MIT Information Systems .br diff --git a/lib/c-ares-1.19.1/docs/ares_send.3 b/lib/c-ares-1.23.0/docs/ares_send.3 similarity index 86% rename from lib/c-ares-1.19.1/docs/ares_send.3 rename to lib/c-ares-1.23.0/docs/ares_send.3 index bcd55b3f4e6..83ddb7ee5fa 100644 --- a/lib/c-ares-1.19.1/docs/ares_send.3 +++ b/lib/c-ares-1.23.0/docs/ares_send.3 @@ -13,6 +13,8 @@ .\" this software for any purpose. It is provided "as is" .\" without express or implied warranty. .\" +.\" SPDX-License-Identifier: MIT +.\" .TH ARES_SEND 3 "25 July 1998" .SH NAME ares_send \- Initiate a DNS query @@ -24,7 +26,7 @@ typedef void (*ares_callback)(void *\fIarg\fP, int \fIstatus\fP, int \fItimeouts\fP, unsigned char *\fIabuf\fP, int \fIalen\fP) -void ares_send(ares_channel \fIchannel\fP, const unsigned char *\fIqbuf\fP, +void ares_send(ares_channel_t *\fIchannel\fP, const unsigned char *\fIqbuf\fP, int \fIqlen\fP, ares_callback \fIcallback\fP, void *\fIarg\fP) .fi .SH DESCRIPTION @@ -47,6 +49,12 @@ happen during a later call to or .BR ares_destroy (3). .PP +If this is called from a thread other than which the main program event loop is +running, care needs to be taken to ensure any file descriptor lists are updated +immediately within the eventloop. When the associated callback is called, +it is called with a channel lock so care must be taken to ensure any processing +is minimal to prevent DNS channel stalls. +.PP The callback argument .I arg is copied from the @@ -117,7 +125,8 @@ status, so a callback status of does not reflect as much about the response as for other query functions. .SH SEE ALSO -.BR ares_process (3) +.BR ares_process (3), +.BR ares_dns_record (3) .SH AUTHOR Greg Hudson, MIT Information Systems .br diff --git a/lib/c-ares-1.19.1/docs/ares_set_local_dev.3 b/lib/c-ares-1.23.0/docs/ares_set_local_dev.3 similarity index 92% rename from lib/c-ares-1.19.1/docs/ares_set_local_dev.3 rename to lib/c-ares-1.23.0/docs/ares_set_local_dev.3 index 059eae54753..54dfcc51eeb 100644 --- a/lib/c-ares-1.19.1/docs/ares_set_local_dev.3 +++ b/lib/c-ares-1.23.0/docs/ares_set_local_dev.3 @@ -13,6 +13,8 @@ .\" this software for any purpose. It is provided "as is" .\" without express or implied warranty. .\" +.\" SPDX-License-Identifier: MIT +.\" .TH ARES_SET_LOCAL_DEV 3 "30 June 2010" .SH NAME ares_set_local_dev \- Bind to a specific network device when creating sockets. @@ -20,7 +22,7 @@ ares_set_local_dev \- Bind to a specific network device when creating sockets. .nf #include -void ares_set_local_dev(ares_channel \fIchannel\fP, const char* \fIlocal_dev_name\fP) +void ares_set_local_dev(ares_channel_t *\fIchannel\fP, const char* \fIlocal_dev_name\fP) .fi .SH DESCRIPTION The \fBares_set_local_dev\fP function causes all future sockets diff --git a/lib/c-ares-1.19.1/docs/ares_set_local_ip4.3 b/lib/c-ares-1.23.0/docs/ares_set_local_ip4.3 similarity index 91% rename from lib/c-ares-1.19.1/docs/ares_set_local_ip4.3 rename to lib/c-ares-1.23.0/docs/ares_set_local_ip4.3 index 8425f5b67bf..51d7d02bad1 100644 --- a/lib/c-ares-1.19.1/docs/ares_set_local_ip4.3 +++ b/lib/c-ares-1.23.0/docs/ares_set_local_ip4.3 @@ -13,6 +13,8 @@ .\" this software for any purpose. It is provided "as is" .\" without express or implied warranty. .\" +.\" SPDX-License-Identifier: MIT +.\" .TH ARES_SET_LOCAL_IP4 3 "30 June 2010" .SH NAME ares_set_local_ip4 \- Set local IPv4 address outgoing requests. @@ -20,7 +22,7 @@ ares_set_local_ip4 \- Set local IPv4 address outgoing requests. .nf #include -void ares_set_local_ip4(ares_channel \fIchannel\fP, unsigned int \fIlocal_ip\fP) +void ares_set_local_ip4(ares_channel_t *\fIchannel\fP, unsigned int \fIlocal_ip\fP) .fi .SH DESCRIPTION The \fBares_set_local_ip4\fP function sets the IP address for outbound diff --git a/lib/c-ares-1.19.1/docs/ares_set_local_ip6.3 b/lib/c-ares-1.23.0/docs/ares_set_local_ip6.3 similarity index 90% rename from lib/c-ares-1.19.1/docs/ares_set_local_ip6.3 rename to lib/c-ares-1.23.0/docs/ares_set_local_ip6.3 index 6719ad35989..57d1f2315d4 100644 --- a/lib/c-ares-1.19.1/docs/ares_set_local_ip6.3 +++ b/lib/c-ares-1.23.0/docs/ares_set_local_ip6.3 @@ -13,6 +13,8 @@ .\" this software for any purpose. It is provided "as is" .\" without express or implied warranty. .\" +.\" SPDX-License-Identifier: MIT +.\" .TH ARES_SET_LOCAL_IP6 3 "30 June 2010" .SH NAME ares_set_local_ip6 \- Set local IPv6 address outgoing requests. @@ -20,7 +22,7 @@ ares_set_local_ip6 \- Set local IPv6 address outgoing requests. .nf #include -void ares_set_local_ip6(ares_channel \fIchannel\fP, const unsigned char* \fIlocal_ip6\fP) +void ares_set_local_ip6(ares_channel_t *\fIchannel\fP, const unsigned char* \fIlocal_ip6\fP) .fi .SH DESCRIPTION The \fBares_set_local_ip6\fP function sets the IPv6 address for outbound IPv6 diff --git a/lib/c-ares-1.19.1/docs/ares_set_servers.3 b/lib/c-ares-1.23.0/docs/ares_set_servers.3 similarity index 79% rename from lib/c-ares-1.19.1/docs/ares_set_servers.3 rename to lib/c-ares-1.23.0/docs/ares_set_servers.3 index aeed0a51566..e2817e7220d 100644 --- a/lib/c-ares-1.19.1/docs/ares_set_servers.3 +++ b/lib/c-ares-1.23.0/docs/ares_set_servers.3 @@ -13,18 +13,21 @@ .\" this software for any purpose. It is provided "as is" .\" without express or implied warranty. .\" +.\" SPDX-License-Identifier: MIT +.\" .TH ARES_SET_SERVERS 3 "5 March 2010" .SH NAME -ares_set_servers, ares_set_servers_ports \- Initialize an ares_channel name servers configuration +ares_set_servers, ares_set_servers_ports \- Initialize name server configuration +for an ares channel. .SH SYNOPSIS .nf #include -int ares_set_servers(ares_channel \fIchannel\fP, - struct ares_addr_node *\fIservers\fP) +int ares_set_servers(ares_channel_t *\fIchannel\fP, + const struct ares_addr_node *\fIservers\fP) -int ares_set_servers_ports(ares_channel \fIchannel\fP, - struct ares_addr_port_node *\fIservers\fP) +int ares_set_servers_ports(ares_channel_t *\fIchannel\fP, + const struct ares_addr_port_node *\fIservers\fP) .fi .SH DESCRIPTION The \fBares_set_servers(3)\fP function initializes name servers configuration @@ -39,7 +42,7 @@ The name server linked list pointer argument may be the result of a previous call to \fBares_get_servers(3)\fP or a linked list of \fBares_addr_node\fP structs set up by other means. .PP -The \fBares_set_servers(3)\fP function also allows the specification of UDP and +The \fBares_set_servers_ports(3)\fP function also allows the specification of UDP and TCP ports to be used for communication on a per-server basis. The provided linked list argument may be the result of a previous call to \fBares_get_servers_ports(3)\fP or a linked list of \fBares_addr_port_node\fP structs @@ -48,7 +51,9 @@ set up by other means. This function replaces any potentially previously configured name servers with the ones given in the linked list. So, in order to configure a channel with more than one name server all the desired ones must be specified in a -single list. +single list. Though not recommended, passing NULL will clear all configured +servers and make an inoperable channel, this may be advantageous for test +simulation but unlikely to be useful in production. .PP The function does not take ownership of the linked list argument. The caller is responsible for freeing the linked list when no longer needed. @@ -57,6 +62,10 @@ This function is capable of handling IPv4 and IPv6 name server addresses simultaneously, rendering \fBares_init_options(3)\fP with optmask \fBARES_OPT_SERVERS\fP functionally obsolete except for IPv4-only name server usage. +.PP +As of v1.22.0 this function can +be called on an active channel with running queries, previously it would return +ARES_ENOTIMP. .SH RETURN VALUES .B ares_set_servers(3) @@ -75,14 +84,11 @@ was invalid. .TP 15 .B ARES_ENOTINITIALIZED c-ares library initialization not yet performed. -.TP 15 -.B ARES_ENOTIMP -Changing name servers configuration while queries are outstanding is not implemented. .SH SEE ALSO .BR ares_set_servers_csv (3), .BR ares_get_servers (3), .BR ares_init_options (3), -.BR ares_dup(3) +.BR ares_dup (3) .SH AVAILABILITY \fBares_set_servers(3)\fP was added in c-ares 1.7.1; \fBares_set_servers_ports(3)\fP was added in c-ares 1.11.0. diff --git a/lib/c-ares-1.19.1/docs/ares_set_servers_csv.3 b/lib/c-ares-1.23.0/docs/ares_set_servers_csv.3 similarity index 75% rename from lib/c-ares-1.19.1/docs/ares_set_servers_csv.3 rename to lib/c-ares-1.23.0/docs/ares_set_servers_csv.3 index a729281b978..44ea72b7d21 100644 --- a/lib/c-ares-1.19.1/docs/ares_set_servers_csv.3 +++ b/lib/c-ares-1.23.0/docs/ares_set_servers_csv.3 @@ -13,6 +13,8 @@ .\" this software for any purpose. It is provided "as is" .\" without express or implied warranty. .\" +.\" SPDX-License-Identifier: MIT +.\" .TH ARES_SET_SERVERS_CSV 3 "30 June 2010" .SH NAME ares_set_servers_csv, ares_set_servers_ports_csv \- Set list of DNS servers to be used. @@ -20,13 +22,21 @@ ares_set_servers_csv, ares_set_servers_ports_csv \- Set list of DNS servers to b .nf #include -int ares_set_servers_csv(ares_channel \fIchannel\fP, const char* \fIservers\fP) +int ares_set_servers_csv(ares_channel_t *\fIchannel\fP, const char* \fIservers\fP) -int ares_set_servers_ports_csv(ares_channel \fIchannel\fP, const char* \fIservers\fP) +int ares_set_servers_ports_csv(ares_channel_t *\fIchannel\fP, const char* \fIservers\fP) .fi .SH DESCRIPTION The \fBares_set_servers_csv\fP and \fBares_set_servers_ports_csv\fPfunctions set -the list of DNS servers that ARES will query. The format of the servers option is: +the list of DNS servers that ARES will query. As of v1.22.0 this function can +be called on an active channel with running queries, previously it would return +ARES_ENOTIMP. + +Though not recommended, passing NULL for servers will clear all configured +servers and make an inoperable channel, this may be advantageous for test +simulation but unlikely to be useful in production. + +The format of the servers option is: host[:port][,host[:port]]... @@ -56,9 +66,6 @@ was invalid. .TP 15 .B ARES_ENOTINITIALIZED c-ares library initialization not yet performed. -.TP 15 -.B ARES_ENOTIMP -Changing name servers configuration while queries are outstanding is not implemented. .SH SEE ALSO .BR ares_set_servers (3) .SH AVAILABILITY diff --git a/lib/c-ares-1.23.0/docs/ares_set_servers_ports.3 b/lib/c-ares-1.23.0/docs/ares_set_servers_ports.3 new file mode 100644 index 00000000000..5b08f580913 --- /dev/null +++ b/lib/c-ares-1.23.0/docs/ares_set_servers_ports.3 @@ -0,0 +1,4 @@ +.\" +.\" Copyright (C) Daniel Stenberg +.\" SPDX-License-Identifier: MIT +.so man3/ares_set_servers.3 diff --git a/lib/c-ares-1.23.0/docs/ares_set_servers_ports_csv.3 b/lib/c-ares-1.23.0/docs/ares_set_servers_ports_csv.3 new file mode 100644 index 00000000000..77fd3bbae9f --- /dev/null +++ b/lib/c-ares-1.23.0/docs/ares_set_servers_ports_csv.3 @@ -0,0 +1,4 @@ +.\" +.\" Copyright (C) Daniel Stenberg +.\" SPDX-License-Identifier: MIT +.so man3/ares_set_servers_csv.3 diff --git a/lib/c-ares-1.19.1/docs/ares_set_socket_callback.3 b/lib/c-ares-1.23.0/docs/ares_set_socket_callback.3 similarity index 82% rename from lib/c-ares-1.19.1/docs/ares_set_socket_callback.3 rename to lib/c-ares-1.23.0/docs/ares_set_socket_callback.3 index 70d7cf7d598..4eb04084e9a 100644 --- a/lib/c-ares-1.19.1/docs/ares_set_socket_callback.3 +++ b/lib/c-ares-1.23.0/docs/ares_set_socket_callback.3 @@ -1,4 +1,7 @@ .\" +.\" Copyright (C) Daniel Stenberg +.\" SPDX-License-Identifier: MIT +.\" .TH ARES_SET_SOCKET_CALLBACK 3 "20 Nov 2009" .SH NAME ares_set_socket_callback \- Set a socket creation callback @@ -10,7 +13,7 @@ typedef int (*ares_sock_create_callback)(ares_socket_t \fIsocket_fd\fP, int \fItype\fP, void *\fIuserdata\fP) -void ares_set_socket_callback(ares_channel \fIchannel\fP, +void ares_set_socket_callback(ares_channel_t *\fIchannel\fP, ares_sock_create_callback \fIcallback\fP, void *\fIuserdata\fP) .PP @@ -24,7 +27,8 @@ connected to the remote server. The callback must return ARES_SUCCESS if things are fine, or return -1 to signal an error. A returned error will abort the ares operation. .SH SEE ALSO -.BR ares_init_options (3), ares_set_socket_configure_callback (3) +.BR ares_init_options (3), +.BR ares_set_socket_configure_callback (3) .SH AVAILABILITY ares_set_socket_callback(3) was added in c-ares 1.6.0 .SH AUTHOR diff --git a/lib/c-ares-1.19.1/docs/ares_set_socket_configure_callback.3 b/lib/c-ares-1.23.0/docs/ares_set_socket_configure_callback.3 similarity index 84% rename from lib/c-ares-1.19.1/docs/ares_set_socket_configure_callback.3 rename to lib/c-ares-1.23.0/docs/ares_set_socket_configure_callback.3 index 89188a6a9a0..1f44ae3c08b 100644 --- a/lib/c-ares-1.19.1/docs/ares_set_socket_configure_callback.3 +++ b/lib/c-ares-1.23.0/docs/ares_set_socket_configure_callback.3 @@ -1,4 +1,6 @@ .\" +.\" Copyright (C) Daniel Stenberg +.\" SPDX-License-Identifier: MIT .TH ARES_SET_SOCKET_CONFIGURE_CALLBACK 3 "6 Feb 2016" .SH NAME ares_set_socket_configure_callback \- Set a socket configuration callback @@ -10,7 +12,7 @@ typedef int (*ares_sock_config_callback)(ares_socket_t \fIsocket_fd\fP, int \fItype\fP, void *\fIuserdata\fP) -void ares_set_socket_configure_callback(ares_channel \fIchannel\fP, +void ares_set_socket_configure_callback(ares_channel_t *\fIchannel\fP, ares_sock_config_callback \fIcallback\fP, void *\fIuserdata\fP) .fi @@ -23,7 +25,8 @@ to configure various socket options. The callback must return ARES_SUCCESS if things are fine, or return -1 to signal an error. A returned error will abort the ares operation. .SH SEE ALSO -.BR ares_init_options (3), ares_set_socket_callback (3) +.BR ares_init_options (3), +.BR ares_set_socket_callback (3) .SH AVAILABILITY ares_set_socket_configure_callback(3) was added in c-ares 1.11.0 .SH AUTHOR diff --git a/lib/c-ares-1.19.1/docs/ares_set_socket_functions.3 b/lib/c-ares-1.23.0/docs/ares_set_socket_functions.3 similarity index 89% rename from lib/c-ares-1.19.1/docs/ares_set_socket_functions.3 rename to lib/c-ares-1.23.0/docs/ares_set_socket_functions.3 index 0c33a494118..a1d9f7741ff 100644 --- a/lib/c-ares-1.19.1/docs/ares_set_socket_functions.3 +++ b/lib/c-ares-1.23.0/docs/ares_set_socket_functions.3 @@ -1,4 +1,5 @@ -.\" +.\" Copyright (C) Daniel Stenberg +.\" SPDX-License-Identifier: MIT .TH ARES_SET_SOCKET_FUNCTIONS 3 "13 Dec 2016" .SH NAME ares_set_socket_functions \- Set socket io callbacks @@ -15,7 +16,7 @@ struct ares_socket_functions { ares_ssize_t (*\fIasendv\fP)(ares_socket_t, const struct iovec *, int, void *); }; -void ares_set_socket_functions(ares_channel \fIchannel\fP, +void ares_set_socket_functions(ares_channel_t *\fIchannel\fP, const struct ares_socket_functions * \fIfunctions\fP, void *\fIuser_data\fP); .fi @@ -24,7 +25,9 @@ void ares_set_socket_functions(ares_channel \fIchannel\fP, This function sets a set of callback \fIfunctions\fP in the given ares channel handle. These callback functions will be invoked to create/destroy socket objects and perform io, instead of the normal system calls. A client application can override normal network -operation fully through this functionality, and provide its own transport layer. +operation fully through this functionality, and provide its own transport layer. You +can choose to only implement some of the socket functions, and provide NULL to any +others and c-ares will use its built-in system functions in that case. .PP All callback functions are expected to operate like their system equivalents, and to set @@ -87,12 +90,12 @@ and must thus remain valid through out the channels and any created socket's lif Added in c-ares 1.13.0 .SH SEE ALSO .BR ares_init_options (3), -.BR socket(2), -.BR close(2), -.BR connect(2), -.BR recv(2), -.BR recvfrom(2), -.BR send(2), -.BR writev(2) +.BR socket (2), +.BR close (2), +.BR connect (2), +.BR recv (2), +.BR recvfrom (2), +.BR send (2), +.BR writev (2) .SH AUTHOR Carl Wilund diff --git a/lib/c-ares-1.19.1/docs/ares_set_sortlist.3 b/lib/c-ares-1.23.0/docs/ares_set_sortlist.3 similarity index 88% rename from lib/c-ares-1.19.1/docs/ares_set_sortlist.3 rename to lib/c-ares-1.23.0/docs/ares_set_sortlist.3 index 50e99e87df8..c93e5262b81 100644 --- a/lib/c-ares-1.19.1/docs/ares_set_sortlist.3 +++ b/lib/c-ares-1.23.0/docs/ares_set_sortlist.3 @@ -1,4 +1,5 @@ .\" +.\" Copyright (C) Daniel Stenberg .\" 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 @@ -11,14 +12,16 @@ .\" this software for any purpose. It is provided "as is" .\" without express or implied warranty. .\" +.\" SPDX-License-Identifier: MIT +.\" .TH ARES_SET_SORTLIST 3 "23 November 2015" .SH NAME -ares_set_sortlist \- Initialize an ares_channel sortlist configuration +ares_set_sortlist \- Initialize an ares_channel_t *sortlist configuration .SH SYNOPSIS .nf #include -int ares_set_sortlist(ares_channel \fIchannel\fP, const char *\fIsortstr\fP) +int ares_set_sortlist(ares_channel_t *\fIchannel\fP, const char *\fIsortstr\fP) .fi .SH DESCRIPTION The \fBares_set_sortlist(3)\fP function initializes an address sortlist configuration @@ -53,6 +56,6 @@ was invalid. c-ares library initialization not yet performed. .SH SEE ALSO .BR ares_init_options (3), -.BR ares_dup(3) +.BR ares_dup (3) .SH AVAILABILITY ares_set_sortlist(3) was added in c-ares 1.11.0 diff --git a/lib/c-ares-1.19.1/docs/ares_strerror.3 b/lib/c-ares-1.23.0/docs/ares_strerror.3 similarity index 97% rename from lib/c-ares-1.19.1/docs/ares_strerror.3 rename to lib/c-ares-1.23.0/docs/ares_strerror.3 index 6369fccd607..745a0d607be 100644 --- a/lib/c-ares-1.19.1/docs/ares_strerror.3 +++ b/lib/c-ares-1.23.0/docs/ares_strerror.3 @@ -13,6 +13,8 @@ .\" this software for any purpose. It is provided "as is" .\" without express or implied warranty. .\" +.\" SPDX-License-Identifier: MIT +.\" .TH ARES_STRERROR 3 "25 July 1998" .SH NAME ares_strerror \- Get the description of an ares library error code diff --git a/lib/c-ares-1.23.0/docs/ares_svcb_param_t.3 b/lib/c-ares-1.23.0/docs/ares_svcb_param_t.3 new file mode 100644 index 00000000000..4587b9a586e --- /dev/null +++ b/lib/c-ares-1.23.0/docs/ares_svcb_param_t.3 @@ -0,0 +1,4 @@ +.\" +.\" Copyright (C) Daniel Stenberg +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_mapping.3 diff --git a/lib/c-ares-1.23.0/docs/ares_threadsafety.3 b/lib/c-ares-1.23.0/docs/ares_threadsafety.3 new file mode 100644 index 00000000000..782893a5b4b --- /dev/null +++ b/lib/c-ares-1.23.0/docs/ares_threadsafety.3 @@ -0,0 +1,43 @@ +.\" +.\" SPDX-License-Identifier: MIT +.\" +.TH ARES_REINIT 3 "26 November 2023" +.SH NAME +ares_threadsafety \- Query if c-ares was built with thread-safety +.SH SYNOPSIS +.nf +#include + +ares_bool_t ares_threadsafety(void); +.fi +.SH DESCRIPTION +The \fBares_threadsafety(3)\fP function returns if the library was built with +thread safety enabled or not. + +As of c-ares 1.23.0, this simply means that every public function which +references an \fIares_channel_t\fP object will lock the channel on entry and +release the lock on exit of the function. This will prevent concurrent +thread access to the channel, thus ensuring no corruption can occur. Future +versions will likely implement more threading-specific features. + +.SH RETURN VALUES +\fIares_threadsafety(3)\fP can return any of the following values: +.TP 14 +.B ARES_TRUE +Built with thread safety. +.TP 14 +.B ARES_FALSE +Built without thread safety +.TP 14 + +.SH AVAILABILITY +This function was first introduced in c-ares version 1.23.0. +.SH SEE ALSO +.BR ares_init (3), +.BR ares_init_options (3), +.BR ares_destroy (3), +.BR ares_dup (3), +.BR ares_library_init (3), +.BR ares_set_servers (3) +.SH AUTHOR +Copyright (C) 2023 The c-ares project and its members. diff --git a/lib/c-ares-1.19.1/docs/ares_timeout.3 b/lib/c-ares-1.23.0/docs/ares_timeout.3 similarity index 95% rename from lib/c-ares-1.19.1/docs/ares_timeout.3 rename to lib/c-ares-1.23.0/docs/ares_timeout.3 index c57685dcf7c..fd33193fe80 100644 --- a/lib/c-ares-1.19.1/docs/ares_timeout.3 +++ b/lib/c-ares-1.23.0/docs/ares_timeout.3 @@ -13,6 +13,8 @@ .\" this software for any purpose. It is provided "as is" .\" without express or implied warranty. .\" +.\" SPDX-License-Identifier: MIT +.\" .TH ARES_TIMEOUT 3 "25 July 1998" .SH NAME ares_timeout \- return maximum time to wait @@ -20,7 +22,7 @@ ares_timeout \- return maximum time to wait .nf #include -struct timeval *ares_timeout(ares_channel \fIchannel\fP, +struct timeval *ares_timeout(ares_channel_t *\fIchannel\fP, struct timeval *\fImaxtv\fP, struct timeval *\fItv\fP) .fi diff --git a/lib/c-ares-1.23.0/docs/ares_tlsa_match_t.3 b/lib/c-ares-1.23.0/docs/ares_tlsa_match_t.3 new file mode 100644 index 00000000000..b93e4cd4e37 --- /dev/null +++ b/lib/c-ares-1.23.0/docs/ares_tlsa_match_t.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_rr.3 diff --git a/lib/c-ares-1.23.0/docs/ares_tlsa_selector_t.3 b/lib/c-ares-1.23.0/docs/ares_tlsa_selector_t.3 new file mode 100644 index 00000000000..b93e4cd4e37 --- /dev/null +++ b/lib/c-ares-1.23.0/docs/ares_tlsa_selector_t.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_rr.3 diff --git a/lib/c-ares-1.23.0/docs/ares_tlsa_usage_t.3 b/lib/c-ares-1.23.0/docs/ares_tlsa_usage_t.3 new file mode 100644 index 00000000000..b93e4cd4e37 --- /dev/null +++ b/lib/c-ares-1.23.0/docs/ares_tlsa_usage_t.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_rr.3 diff --git a/lib/c-ares-1.19.1/docs/ares_version.3 b/lib/c-ares-1.23.0/docs/ares_version.3 similarity index 97% rename from lib/c-ares-1.19.1/docs/ares_version.3 rename to lib/c-ares-1.23.0/docs/ares_version.3 index 9ba7831f54d..e6a338e3410 100644 --- a/lib/c-ares-1.19.1/docs/ares_version.3 +++ b/lib/c-ares-1.23.0/docs/ares_version.3 @@ -13,6 +13,8 @@ .\" this software for any purpose. It is provided "as is" .\" without express or implied warranty. .\" +.\" SPDX-License-Identifier: MIT +.\" .TH ARES_VERSION 3 "29 January 2004" .SH NAME ares_version \- Get the version number of the library diff --git a/lib/c-ares-1.19.1/get_ver.awk b/lib/c-ares-1.23.0/get_ver.awk similarity index 92% rename from lib/c-ares-1.19.1/get_ver.awk rename to lib/c-ares-1.23.0/get_ver.awk index 5e3db6db99a..263ca02ded0 100644 --- a/lib/c-ares-1.19.1/get_ver.awk +++ b/lib/c-ares-1.23.0/get_ver.awk @@ -1,6 +1,8 @@ # *************************************************************************** # * Project: c-ares # * +# * Copyright (C) The c-ares project and its contributors +# * SPDX-License-Identifier: MIT # *************************************************************************** # awk script which fetches c-ares version number and string from input # file and writes them to STDOUT. Here you can get an awk version for Win32: diff --git a/lib/c-ares-1.19.1/include/CMakeLists.txt b/lib/c-ares-1.23.0/include/CMakeLists.txt similarity index 68% rename from lib/c-ares-1.19.1/include/CMakeLists.txt rename to lib/c-ares-1.23.0/include/CMakeLists.txt index 3321956dd74..e95a94dda16 100644 --- a/lib/c-ares-1.19.1/include/CMakeLists.txt +++ b/lib/c-ares-1.23.0/include/CMakeLists.txt @@ -1,8 +1,10 @@ +# Copyright (C) The c-ares project and its contributors +# SPDX-License-Identifier: MIT # Write ares_build.h configuration file. This is an installed file. CONFIGURE_FILE (ares_build.h.cmake ${PROJECT_BINARY_DIR}/ares_build.h) # Headers installation target IF (CARES_INSTALL) - SET (CARES_HEADERS ares.h ares_version.h "${PROJECT_BINARY_DIR}/ares_build.h" ares_rules.h ares_dns.h ares_nameser.h) + SET (CARES_HEADERS ares.h ares_version.h "${PROJECT_BINARY_DIR}/ares_build.h" ares_rules.h ares_dns.h ares_dns_record.h ares_nameser.h) INSTALL (FILES ${CARES_HEADERS} COMPONENT Devel DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) ENDIF () diff --git a/lib/c-ares-1.19.1/include/Makefile.am b/lib/c-ares-1.23.0/include/Makefile.am similarity index 71% rename from lib/c-ares-1.19.1/include/Makefile.am rename to lib/c-ares-1.23.0/include/Makefile.am index d208bece64c..e17790da4f4 100644 --- a/lib/c-ares-1.19.1/include/Makefile.am +++ b/lib/c-ares-1.23.0/include/Makefile.am @@ -1,7 +1,9 @@ +# Copyright (C) Daniel Stenberg +# SPDX-License-Identifier: MIT AUTOMAKE_OPTIONS = foreign nostdinc 1.9.6 ACLOCAL_AMFLAGS = -I m4 --install # what headers to install on 'make install': -include_HEADERS = ares.h ares_version.h ares_build.h ares_rules.h ares_dns.h ares_nameser.h +include_HEADERS = ares.h ares_version.h ares_build.h ares_rules.h ares_dns.h ares_dns_record.h ares_nameser.h EXTRA_DIST = ares_build.h.cmake ares_build.h.in ares_build.h.dist CMakeLists.txt diff --git a/lib/c-ares-1.19.1/include/Makefile.in b/lib/c-ares-1.23.0/include/Makefile.in similarity index 97% rename from lib/c-ares-1.19.1/include/Makefile.in rename to lib/c-ares-1.23.0/include/Makefile.in index 8586bd52f11..378b64daeb2 100644 --- a/lib/c-ares-1.19.1/include/Makefile.in +++ b/lib/c-ares-1.23.0/include/Makefile.in @@ -94,11 +94,15 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_ac_append_to_file.m4 \ $(top_srcdir)/m4/ax_ac_print_to_file.m4 \ $(top_srcdir)/m4/ax_add_am_macro_static.m4 \ $(top_srcdir)/m4/ax_am_macros_static.m4 \ + $(top_srcdir)/m4/ax_append_compile_flags.m4 \ + $(top_srcdir)/m4/ax_append_flag.m4 \ + $(top_srcdir)/m4/ax_check_compile_flag.m4 \ $(top_srcdir)/m4/ax_check_gnu_make.m4 \ $(top_srcdir)/m4/ax_code_coverage.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx_11.m4 \ $(top_srcdir)/m4/ax_file_escapes.m4 \ + $(top_srcdir)/m4/ax_pthread.m4 \ $(top_srcdir)/m4/ax_require_defined.m4 \ $(top_srcdir)/m4/cares-compilers.m4 \ $(top_srcdir)/m4/cares-confopts.m4 \ @@ -273,6 +277,10 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_CXX = @PTHREAD_CXX@ +PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ @@ -292,6 +300,7 @@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ +ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ @@ -336,11 +345,14 @@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ + +# Copyright (C) Daniel Stenberg +# SPDX-License-Identifier: MIT AUTOMAKE_OPTIONS = foreign nostdinc 1.9.6 ACLOCAL_AMFLAGS = -I m4 --install # what headers to install on 'make install': -include_HEADERS = ares.h ares_version.h ares_build.h ares_rules.h ares_dns.h ares_nameser.h +include_HEADERS = ares.h ares_version.h ares_build.h ares_rules.h ares_dns.h ares_dns_record.h ares_nameser.h EXTRA_DIST = ares_build.h.cmake ares_build.h.in ares_build.h.dist CMakeLists.txt all: ares_build.h $(MAKE) $(AM_MAKEFLAGS) all-am diff --git a/lib/c-ares-1.23.0/include/ares.h b/lib/c-ares-1.23.0/include/ares.h new file mode 100644 index 00000000000..6564a69da6b --- /dev/null +++ b/lib/c-ares-1.23.0/include/ares.h @@ -0,0 +1,757 @@ +/* MIT License + * + * Copyright (c) Massachusetts Institute of Technology + * Copyright (c) Daniel Stenberg + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ + +#ifndef ARES__H +#define ARES__H + +#include "ares_version.h" /* c-ares version defines */ +#include "ares_build.h" /* c-ares build definitions */ +#include "ares_rules.h" /* c-ares rules enforcement */ + +/* + * Define WIN32 when build target is Win32 API + */ + +#if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32) && \ + !defined(__SYMBIAN32__) +# define WIN32 +#endif + +#include + +/* HP-UX systems version 9, 10 and 11 lack sys/select.h and so does oldish + libc5-based Linux systems. Only include it on system that are known to + require it! */ +#if defined(_AIX) || defined(__NOVELL_LIBC__) || defined(__NetBSD__) || \ + defined(__minix) || defined(__SYMBIAN32__) || defined(__INTEGRITY) || \ + defined(ANDROID) || defined(__ANDROID__) || defined(__OpenBSD__) || \ + defined(__QNXNTO__) || defined(__MVS__) || defined(__HAIKU__) +# include +#endif +#if (defined(NETWARE) && !defined(__NOVELL_LIBC__)) +# include +#endif + +#if defined(WATT32) +# include +# include +# include +#elif defined(_WIN32_WCE) +# ifndef WIN32_LEAN_AND_MEAN +# define WIN32_LEAN_AND_MEAN +# endif +# include +# include +#elif defined(WIN32) +# ifndef WIN32_LEAN_AND_MEAN +# define WIN32_LEAN_AND_MEAN +# endif +# include +# include +# include +/* To aid with linking against a static c-ares build, lets tell the microsoft + * compiler to pull in needed dependencies */ +# ifdef _MSC_VER +# pragma comment(lib, "ws2_32") +# pragma comment(lib, "advapi32") +# pragma comment(lib, "iphlpapi") +# endif +#else +# include +# include +#endif + +#if defined(ANDROID) || defined(__ANDROID__) +# include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* +** c-ares external API function linkage decorations. +*/ + +#ifdef CARES_STATICLIB +# define CARES_EXTERN +#elif defined(WIN32) || defined(_WIN32) || defined(__SYMBIAN32__) +# if defined(CARES_BUILDING_LIBRARY) +# define CARES_EXTERN __declspec(dllexport) +# else +# define CARES_EXTERN __declspec(dllimport) +# endif +#elif defined(CARES_BUILDING_LIBRARY) && defined(CARES_SYMBOL_HIDING) +# define CARES_EXTERN CARES_SYMBOL_SCOPE_EXTERN +#else +# define CARES_EXTERN +#endif + + +typedef enum { + ARES_SUCCESS = 0, + + /* Server error codes (ARES_ENODATA indicates no relevant answer) */ + ARES_ENODATA = 1, + ARES_EFORMERR = 2, + ARES_ESERVFAIL = 3, + ARES_ENOTFOUND = 4, + ARES_ENOTIMP = 5, + ARES_EREFUSED = 6, + + /* Locally generated error codes */ + ARES_EBADQUERY = 7, + ARES_EBADNAME = 8, + ARES_EBADFAMILY = 9, + ARES_EBADRESP = 10, + ARES_ECONNREFUSED = 11, + ARES_ETIMEOUT = 12, + ARES_EOF = 13, + ARES_EFILE = 14, + ARES_ENOMEM = 15, + ARES_EDESTRUCTION = 16, + ARES_EBADSTR = 17, + + /* ares_getnameinfo error codes */ + ARES_EBADFLAGS = 18, + + /* ares_getaddrinfo error codes */ + ARES_ENONAME = 19, + ARES_EBADHINTS = 20, + + /* Uninitialized library error code */ + ARES_ENOTINITIALIZED = 21, /* introduced in 1.7.0 */ + + /* ares_library_init error codes */ + ARES_ELOADIPHLPAPI = 22, /* introduced in 1.7.0 */ + ARES_EADDRGETNETWORKPARAMS = 23, /* introduced in 1.7.0 */ + + /* More error codes */ + ARES_ECANCELLED = 24, /* introduced in 1.7.0 */ + + /* More ares_getaddrinfo error codes */ + ARES_ESERVICE = 25 /* ares_getaddrinfo() was passed a text service name that + * is not recognized. introduced in 1.16.0 */ +} ares_status_t; + +typedef enum { + ARES_FALSE = 0, + ARES_TRUE = 1 +} ares_bool_t; + +/* Flag values */ +#define ARES_FLAG_USEVC (1 << 0) +#define ARES_FLAG_PRIMARY (1 << 1) +#define ARES_FLAG_IGNTC (1 << 2) +#define ARES_FLAG_NORECURSE (1 << 3) +#define ARES_FLAG_STAYOPEN (1 << 4) +#define ARES_FLAG_NOSEARCH (1 << 5) +#define ARES_FLAG_NOALIASES (1 << 6) +#define ARES_FLAG_NOCHECKRESP (1 << 7) +#define ARES_FLAG_EDNS (1 << 8) + +/* Option mask values */ +#define ARES_OPT_FLAGS (1 << 0) +#define ARES_OPT_TIMEOUT (1 << 1) +#define ARES_OPT_TRIES (1 << 2) +#define ARES_OPT_NDOTS (1 << 3) +#define ARES_OPT_UDP_PORT (1 << 4) +#define ARES_OPT_TCP_PORT (1 << 5) +#define ARES_OPT_SERVERS (1 << 6) +#define ARES_OPT_DOMAINS (1 << 7) +#define ARES_OPT_LOOKUPS (1 << 8) +#define ARES_OPT_SOCK_STATE_CB (1 << 9) +#define ARES_OPT_SORTLIST (1 << 10) +#define ARES_OPT_SOCK_SNDBUF (1 << 11) +#define ARES_OPT_SOCK_RCVBUF (1 << 12) +#define ARES_OPT_TIMEOUTMS (1 << 13) +#define ARES_OPT_ROTATE (1 << 14) +#define ARES_OPT_EDNSPSZ (1 << 15) +#define ARES_OPT_NOROTATE (1 << 16) +#define ARES_OPT_RESOLVCONF (1 << 17) +#define ARES_OPT_HOSTS_FILE (1 << 18) +#define ARES_OPT_UDP_MAX_QUERIES (1 << 19) +#define ARES_OPT_MAXTIMEOUTMS (1 << 20) +#define ARES_OPT_QUERY_CACHE (1 << 21) + +/* Nameinfo flag values */ +#define ARES_NI_NOFQDN (1 << 0) +#define ARES_NI_NUMERICHOST (1 << 1) +#define ARES_NI_NAMEREQD (1 << 2) +#define ARES_NI_NUMERICSERV (1 << 3) +#define ARES_NI_DGRAM (1 << 4) +#define ARES_NI_TCP 0 +#define ARES_NI_UDP ARES_NI_DGRAM +#define ARES_NI_SCTP (1 << 5) +#define ARES_NI_DCCP (1 << 6) +#define ARES_NI_NUMERICSCOPE (1 << 7) +#define ARES_NI_LOOKUPHOST (1 << 8) +#define ARES_NI_LOOKUPSERVICE (1 << 9) +/* Reserved for future use */ +#define ARES_NI_IDN (1 << 10) +#define ARES_NI_IDN_ALLOW_UNASSIGNED (1 << 11) +#define ARES_NI_IDN_USE_STD3_ASCII_RULES (1 << 12) + +/* Addrinfo flag values */ +#define ARES_AI_CANONNAME (1 << 0) +#define ARES_AI_NUMERICHOST (1 << 1) +#define ARES_AI_PASSIVE (1 << 2) +#define ARES_AI_NUMERICSERV (1 << 3) +#define ARES_AI_V4MAPPED (1 << 4) +#define ARES_AI_ALL (1 << 5) +#define ARES_AI_ADDRCONFIG (1 << 6) +#define ARES_AI_NOSORT (1 << 7) +#define ARES_AI_ENVHOSTS (1 << 8) +/* Reserved for future use */ +#define ARES_AI_IDN (1 << 10) +#define ARES_AI_IDN_ALLOW_UNASSIGNED (1 << 11) +#define ARES_AI_IDN_USE_STD3_ASCII_RULES (1 << 12) +#define ARES_AI_CANONIDN (1 << 13) + +#define ARES_AI_MASK \ + (ARES_AI_CANONNAME | ARES_AI_NUMERICHOST | ARES_AI_PASSIVE | \ + ARES_AI_NUMERICSERV | ARES_AI_V4MAPPED | ARES_AI_ALL | ARES_AI_ADDRCONFIG) +#define ARES_GETSOCK_MAXNUM \ + 16 /* ares_getsock() can return info about this \ + many sockets */ +#define ARES_GETSOCK_READABLE(bits, num) (bits & (1 << (num))) +#define ARES_GETSOCK_WRITABLE(bits, num) \ + (bits & (1 << ((num) + ARES_GETSOCK_MAXNUM))) + +/* c-ares library initialization flag values */ +#define ARES_LIB_INIT_NONE (0) +#define ARES_LIB_INIT_WIN32 (1 << 0) +#define ARES_LIB_INIT_ALL (ARES_LIB_INIT_WIN32) + + +/* + * Typedef our socket type + */ + +#ifndef ares_socket_typedef +# ifdef WIN32 +typedef SOCKET ares_socket_t; +# define ARES_SOCKET_BAD INVALID_SOCKET +# else +typedef int ares_socket_t; +# define ARES_SOCKET_BAD -1 +# endif +# define ares_socket_typedef +#endif /* ares_socket_typedef */ + +typedef void (*ares_sock_state_cb)(void *data, ares_socket_t socket_fd, + int readable, int writable); + +struct apattern; + +/* NOTE about the ares_options struct to users and developers. + + This struct will remain looking like this. It will not be extended nor + shrunk in future releases, but all new options will be set by ares_set_*() + options instead of with the ares_init_options() function. + + Eventually (in a galaxy far far away), all options will be settable by + ares_set_*() options and the ares_init_options() function will become + deprecated. + + When new options are added to c-ares, they are not added to this + struct. And they are not "saved" with the ares_save_options() function but + instead we encourage the use of the ares_dup() function. Needless to say, + if you add config options to c-ares you need to make sure ares_dup() + duplicates this new option. + + */ +struct ares_options { + int flags; + int timeout; /* in seconds or milliseconds, depending on options */ + int tries; + int ndots; + unsigned short udp_port; /* host byte order */ + unsigned short tcp_port; /* host byte order */ + int socket_send_buffer_size; + int socket_receive_buffer_size; + struct in_addr *servers; + int nservers; + char **domains; + int ndomains; + char *lookups; + ares_sock_state_cb sock_state_cb; + void *sock_state_cb_data; + struct apattern *sortlist; + int nsort; + int ednspsz; + char *resolvconf_path; + char *hosts_path; + int udp_max_queries; + int maxtimeout; /* in milliseconds */ + unsigned int qcache_max_ttl; /* Maximum TTL for query cache, 0=disabled */ +}; + +struct hostent; +struct timeval; +struct sockaddr; +struct ares_channeldata; +struct ares_addrinfo; +struct ares_addrinfo_hints; + +/* Legacy typedef, don't use, you can't specify "const" */ +typedef struct ares_channeldata *ares_channel; + +/* Current main channel typedef */ +typedef struct ares_channeldata ares_channel_t; + + +typedef void (*ares_callback)(void *arg, int status, int timeouts, + unsigned char *abuf, int alen); + +typedef void (*ares_host_callback)(void *arg, int status, int timeouts, + struct hostent *hostent); + +typedef void (*ares_nameinfo_callback)(void *arg, int status, int timeouts, + char *node, char *service); + +typedef int (*ares_sock_create_callback)(ares_socket_t socket_fd, int type, + void *data); + +typedef int (*ares_sock_config_callback)(ares_socket_t socket_fd, int type, + void *data); + +typedef void (*ares_addrinfo_callback)(void *arg, int status, int timeouts, + struct ares_addrinfo *res); + +CARES_EXTERN int ares_library_init(int flags); + +CARES_EXTERN int ares_library_init_mem(int flags, void *(*amalloc)(size_t size), + void (*afree)(void *ptr), + void *(*arealloc)(void *ptr, + size_t size)); + +#if defined(ANDROID) || defined(__ANDROID__) +CARES_EXTERN void ares_library_init_jvm(JavaVM *jvm); +CARES_EXTERN int ares_library_init_android(jobject connectivity_manager); +CARES_EXTERN int ares_library_android_initialized(void); +#endif + +CARES_EXTERN int ares_library_initialized(void); + +CARES_EXTERN void ares_library_cleanup(void); + +CARES_EXTERN const char *ares_version(int *version); + +CARES_EXTERN int ares_init(ares_channel_t **channelptr); + +CARES_EXTERN int ares_init_options(ares_channel_t **channelptr, + const struct ares_options *options, + int optmask); + +CARES_EXTERN int ares_save_options(ares_channel_t *channel, + struct ares_options *options, int *optmask); + +CARES_EXTERN void ares_destroy_options(struct ares_options *options); + +CARES_EXTERN int ares_dup(ares_channel_t **dest, ares_channel_t *src); + +CARES_EXTERN ares_status_t ares_reinit(ares_channel_t *channel); + +CARES_EXTERN void ares_destroy(ares_channel_t *channel); + +CARES_EXTERN void ares_cancel(ares_channel_t *channel); + +/* These next 3 configure local binding for the out-going socket + * connection. Use these to specify source IP and/or network device + * on multi-homed systems. + */ +CARES_EXTERN void ares_set_local_ip4(ares_channel_t *channel, + unsigned int local_ip); + +/* local_ip6 should be 16 bytes in length */ +CARES_EXTERN void ares_set_local_ip6(ares_channel_t *channel, + const unsigned char *local_ip6); + +/* local_dev_name should be null terminated. */ +CARES_EXTERN void ares_set_local_dev(ares_channel_t *channel, + const char *local_dev_name); + +CARES_EXTERN void ares_set_socket_callback(ares_channel_t *channel, + ares_sock_create_callback callback, + void *user_data); + +CARES_EXTERN void ares_set_socket_configure_callback( + ares_channel_t *channel, ares_sock_config_callback callback, void *user_data); + +CARES_EXTERN int ares_set_sortlist(ares_channel_t *channel, + const char *sortstr); + +CARES_EXTERN void ares_getaddrinfo(ares_channel_t *channel, const char *node, + const char *service, + const struct ares_addrinfo_hints *hints, + ares_addrinfo_callback callback, void *arg); + +CARES_EXTERN void ares_freeaddrinfo(struct ares_addrinfo *ai); + +/* + * Virtual function set to have user-managed socket IO. + * Note that all functions need to be defined, and when + * set, the library will not do any bind nor set any + * socket options, assuming the client handles these + * through either socket creation or the + * ares_sock_config_callback call. + */ +struct iovec; + +struct ares_socket_functions { + ares_socket_t (*asocket)(int, int, int, void *); + int (*aclose)(ares_socket_t, void *); + int (*aconnect)(ares_socket_t, const struct sockaddr *, ares_socklen_t, + void *); + ares_ssize_t (*arecvfrom)(ares_socket_t, void *, size_t, int, + struct sockaddr *, ares_socklen_t *, void *); + ares_ssize_t (*asendv)(ares_socket_t, const struct iovec *, int, void *); +}; + +CARES_EXTERN void + ares_set_socket_functions(ares_channel_t *channel, + const struct ares_socket_functions *funcs, + void *user_data); + +CARES_EXTERN void ares_send(ares_channel_t *channel, const unsigned char *qbuf, + int qlen, ares_callback callback, void *arg); + +CARES_EXTERN void ares_query(ares_channel_t *channel, const char *name, + int dnsclass, int type, ares_callback callback, + void *arg); + +CARES_EXTERN void ares_search(ares_channel_t *channel, const char *name, + int dnsclass, int type, ares_callback callback, + void *arg); + +CARES_EXTERN void ares_gethostbyname(ares_channel_t *channel, const char *name, + int family, ares_host_callback callback, + void *arg); + +CARES_EXTERN int ares_gethostbyname_file(ares_channel_t *channel, + const char *name, int family, + struct hostent **host); + +CARES_EXTERN void ares_gethostbyaddr(ares_channel_t *channel, const void *addr, + int addrlen, int family, + ares_host_callback callback, void *arg); + +CARES_EXTERN void ares_getnameinfo(ares_channel_t *channel, + const struct sockaddr *sa, + ares_socklen_t salen, int flags, + ares_nameinfo_callback callback, void *arg); + +CARES_EXTERN int ares_fds(ares_channel_t *channel, fd_set *read_fds, + fd_set *write_fds); + +CARES_EXTERN int ares_getsock(ares_channel_t *channel, ares_socket_t *socks, + int numsocks); + +CARES_EXTERN struct timeval *ares_timeout(ares_channel_t *channel, + struct timeval *maxtv, + struct timeval *tv); + +CARES_EXTERN void ares_process(ares_channel_t *channel, fd_set *read_fds, + fd_set *write_fds); + +CARES_EXTERN void ares_process_fd(ares_channel_t *channel, + ares_socket_t read_fd, + ares_socket_t write_fd); + +CARES_EXTERN int ares_create_query(const char *name, int dnsclass, int type, + unsigned short id, int rd, + unsigned char **buf, int *buflen, + int max_udp_size); + +CARES_EXTERN int ares_mkquery(const char *name, int dnsclass, int type, + unsigned short id, int rd, unsigned char **buf, + int *buflen); + +CARES_EXTERN int ares_expand_name(const unsigned char *encoded, + const unsigned char *abuf, int alen, char **s, + long *enclen); + +CARES_EXTERN int ares_expand_string(const unsigned char *encoded, + const unsigned char *abuf, int alen, + unsigned char **s, long *enclen); + +/* + * NOTE: before c-ares 1.7.0 we would most often use the system in6_addr + * struct below when ares itself was built, but many apps would use this + * private version since the header checked a HAVE_* define for it. Starting + * with 1.7.0 we always declare and use our own to stop relying on the + * system's one. + */ +struct ares_in6_addr { + union { + unsigned char _S6_u8[16]; + } _S6_un; +}; + +struct ares_addr { + int family; + + union { + struct in_addr addr4; + struct ares_in6_addr addr6; + } addr; +}; + +struct ares_addrttl { + struct in_addr ipaddr; + int ttl; +}; + +struct ares_addr6ttl { + struct ares_in6_addr ip6addr; + int ttl; +}; + +struct ares_caa_reply { + struct ares_caa_reply *next; + int critical; + unsigned char *property; + size_t plength; /* plength excludes null termination */ + unsigned char *value; + size_t length; /* length excludes null termination */ +}; + +struct ares_srv_reply { + struct ares_srv_reply *next; + char *host; + unsigned short priority; + unsigned short weight; + unsigned short port; +}; + +struct ares_mx_reply { + struct ares_mx_reply *next; + char *host; + unsigned short priority; +}; + +struct ares_txt_reply { + struct ares_txt_reply *next; + unsigned char *txt; + size_t length; /* length excludes null termination */ +}; + +/* NOTE: This structure is a superset of ares_txt_reply + */ +struct ares_txt_ext { + struct ares_txt_ext *next; + unsigned char *txt; + size_t length; + /* 1 - if start of new record + * 0 - if a chunk in the same record */ + unsigned char record_start; +}; + +struct ares_naptr_reply { + struct ares_naptr_reply *next; + unsigned char *flags; + unsigned char *service; + unsigned char *regexp; + char *replacement; + unsigned short order; + unsigned short preference; +}; + +struct ares_soa_reply { + char *nsname; + char *hostmaster; + unsigned int serial; + unsigned int refresh; + unsigned int retry; + unsigned int expire; + unsigned int minttl; +}; + +struct ares_uri_reply { + struct ares_uri_reply *next; + unsigned short priority; + unsigned short weight; + char *uri; + int ttl; +}; + +/* + * Similar to addrinfo, but with extra ttl and missing canonname. + */ +struct ares_addrinfo_node { + int ai_ttl; + int ai_flags; + int ai_family; + int ai_socktype; + int ai_protocol; + ares_socklen_t ai_addrlen; + struct sockaddr *ai_addr; + struct ares_addrinfo_node *ai_next; +}; + +/* + * alias - label of the resource record. + * name - value (canonical name) of the resource record. + * See RFC2181 10.1.1. CNAME terminology. + */ +struct ares_addrinfo_cname { + int ttl; + char *alias; + char *name; + struct ares_addrinfo_cname *next; +}; + +struct ares_addrinfo { + struct ares_addrinfo_cname *cnames; + struct ares_addrinfo_node *nodes; + char *name; +}; + +struct ares_addrinfo_hints { + int ai_flags; + int ai_family; + int ai_socktype; + int ai_protocol; +}; + +/* +** Parse the buffer, starting at *abuf and of length alen bytes, previously +** obtained from an ares_search call. Put the results in *host, if nonnull. +** Also, if addrttls is nonnull, put up to *naddrttls IPv4 addresses along with +** their TTLs in that array, and set *naddrttls to the number of addresses +** so written. +*/ + +CARES_EXTERN int ares_parse_a_reply(const unsigned char *abuf, int alen, + struct hostent **host, + struct ares_addrttl *addrttls, + int *naddrttls); + +CARES_EXTERN int ares_parse_aaaa_reply(const unsigned char *abuf, int alen, + struct hostent **host, + struct ares_addr6ttl *addrttls, + int *naddrttls); + +CARES_EXTERN int ares_parse_caa_reply(const unsigned char *abuf, int alen, + struct ares_caa_reply **caa_out); + +CARES_EXTERN int ares_parse_ptr_reply(const unsigned char *abuf, int alen, + const void *addr, int addrlen, int family, + struct hostent **host); + +CARES_EXTERN int ares_parse_ns_reply(const unsigned char *abuf, int alen, + struct hostent **host); + +CARES_EXTERN int ares_parse_srv_reply(const unsigned char *abuf, int alen, + struct ares_srv_reply **srv_out); + +CARES_EXTERN int ares_parse_mx_reply(const unsigned char *abuf, int alen, + struct ares_mx_reply **mx_out); + +CARES_EXTERN int ares_parse_txt_reply(const unsigned char *abuf, int alen, + struct ares_txt_reply **txt_out); + +CARES_EXTERN int ares_parse_txt_reply_ext(const unsigned char *abuf, int alen, + struct ares_txt_ext **txt_out); + +CARES_EXTERN int ares_parse_naptr_reply(const unsigned char *abuf, int alen, + struct ares_naptr_reply **naptr_out); + +CARES_EXTERN int ares_parse_soa_reply(const unsigned char *abuf, int alen, + struct ares_soa_reply **soa_out); + +CARES_EXTERN int ares_parse_uri_reply(const unsigned char *abuf, int alen, + struct ares_uri_reply **uri_out); + +CARES_EXTERN void ares_free_string(void *str); + +CARES_EXTERN void ares_free_hostent(struct hostent *host); + +CARES_EXTERN void ares_free_data(void *dataptr); + +CARES_EXTERN const char *ares_strerror(int code); + +struct ares_addr_node { + struct ares_addr_node *next; + int family; + + union { + struct in_addr addr4; + struct ares_in6_addr addr6; + } addr; +}; + +struct ares_addr_port_node { + struct ares_addr_port_node *next; + int family; + + union { + struct in_addr addr4; + struct ares_in6_addr addr6; + } addr; + + int udp_port; + int tcp_port; +}; + +CARES_EXTERN int ares_set_servers(ares_channel_t *channel, + const struct ares_addr_node *servers); +CARES_EXTERN int + ares_set_servers_ports(ares_channel_t *channel, + const struct ares_addr_port_node *servers); + +/* Incoming string format: host[:port][,host[:port]]... */ +CARES_EXTERN int ares_set_servers_csv(ares_channel_t *channel, + const char *servers); +CARES_EXTERN int ares_set_servers_ports_csv(ares_channel_t *channel, + const char *servers); + +CARES_EXTERN int ares_get_servers(ares_channel_t *channel, + struct ares_addr_node **servers); +CARES_EXTERN int ares_get_servers_ports(ares_channel_t *channel, + struct ares_addr_port_node **servers); + +CARES_EXTERN const char *ares_inet_ntop(int af, const void *src, char *dst, + ares_socklen_t size); + +CARES_EXTERN int ares_inet_pton(int af, const char *src, void *dst); + +/*! Whether or not the c-ares library was built with threadsafety + * + * \return ARES_TRUE if built with threadsafety, ARES_FALSE if not + */ +CARES_EXTERN ares_bool_t ares_threadsafety(void); + +#ifdef __cplusplus +} +#endif + +/* DNS record parser, writer, and helpers */ +#include "ares_dns_record.h" + +#endif /* ARES__H */ diff --git a/lib/c-ares-1.19.1/include/ares_build.h b/lib/c-ares-1.23.0/include/ares_build.h similarity index 83% rename from lib/c-ares-1.19.1/include/ares_build.h rename to lib/c-ares-1.23.0/include/ares_build.h index 7f7d2e02daa..0a2b7a711a3 100644 --- a/lib/c-ares-1.19.1/include/ares_build.h +++ b/lib/c-ares-1.23.0/include/ares_build.h @@ -1,20 +1,32 @@ +/* MIT License + * + * Copyright (c) 2009 Daniel Stenberg + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ #ifndef __CARES_BUILD_H #define __CARES_BUILD_H -/* Copyright (C) 2009 - 2021 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. - */ - /* ================================================================ */ /* NOTES FOR CONFIGURE CAPABLE SYSTEMS */ /* ================================================================ */ diff --git a/lib/c-ares-1.19.1/include/ares_build.h.cmake b/lib/c-ares-1.23.0/include/ares_build.h.cmake similarity index 84% rename from lib/c-ares-1.19.1/include/ares_build.h.cmake rename to lib/c-ares-1.23.0/include/ares_build.h.cmake index e847f17ea79..e2ab7173bf8 100644 --- a/lib/c-ares-1.19.1/include/ares_build.h.cmake +++ b/lib/c-ares-1.23.0/include/ares_build.h.cmake @@ -1,5 +1,9 @@ #ifndef __CARES_BUILD_H #define __CARES_BUILD_H +/* + * Copyright (C) The c-ares project and its contributors + * SPDX-License-Identifier: MIT + */ #define CARES_TYPEOF_ARES_SOCKLEN_T @CARES_TYPEOF_ARES_SOCKLEN_T@ #define CARES_TYPEOF_ARES_SSIZE_T @CARES_TYPEOF_ARES_SSIZE_T@ @@ -8,6 +12,7 @@ * files. We need to include some dependent headers that may be system specific * for C-Ares */ #cmakedefine CARES_HAVE_SYS_TYPES_H +#cmakedefine CARES_HAVE_SYS_RANDOM_H #cmakedefine CARES_HAVE_SYS_SOCKET_H #cmakedefine CARES_HAVE_WINDOWS_H #cmakedefine CARES_HAVE_WS2TCPIP_H @@ -20,6 +25,10 @@ # include #endif +#ifdef CARES_HAVE_SYS_RANDOM_H +# include +#endif + #ifdef CARES_HAVE_SYS_SOCKET_H # include #endif diff --git a/lib/c-ares-1.19.1/include/ares_build.h.in b/lib/c-ares-1.23.0/include/ares_build.h.in similarity index 72% rename from lib/c-ares-1.19.1/include/ares_build.h.in rename to lib/c-ares-1.23.0/include/ares_build.h.in index 8abc874c809..c8624da855d 100644 --- a/lib/c-ares-1.19.1/include/ares_build.h.in +++ b/lib/c-ares-1.23.0/include/ares_build.h.in @@ -1,19 +1,30 @@ -#ifndef __CARES_BUILD_H -#define __CARES_BUILD_H - - -/* Copyright (C) 2009 - 2021 by Daniel Stenberg et al +/* MIT License + * + * Copyright (c) 2009 Daniel Stenberg * - * 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. + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT */ +#ifndef __CARES_BUILD_H +#define __CARES_BUILD_H /* ================================================================ */ /* NOTES FOR CONFIGURE CAPABLE SYSTEMS */ diff --git a/lib/c-ares-1.23.0/include/ares_dns.h b/lib/c-ares-1.23.0/include/ares_dns.h new file mode 100644 index 00000000000..46edbbbc528 --- /dev/null +++ b/lib/c-ares-1.23.0/include/ares_dns.h @@ -0,0 +1,127 @@ +/* MIT License + * + * Copyright (c) Massachusetts Institute of Technology + * Copyright (c) The c-ares project and its contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ +#ifndef HEADER_CARES_DNS_H +#define HEADER_CARES_DNS_H + +/* + * NOTE TO INTEGRATORS: + * + * This header is made public due to legacy projects relying on it. + * Please do not use the macros within this header, or include this + * header in your project as it may be removed in the future. + */ + + +/* + * Macro DNS__16BIT reads a network short (16 bit) given in network + * byte order, and returns its value as an unsigned short. + */ +#define DNS__16BIT(p) \ + ((unsigned short)((unsigned int)0xffff & \ + (((unsigned int)((unsigned char)(p)[0]) << 8U) | \ + ((unsigned int)((unsigned char)(p)[1]))))) + +/* + * Macro DNS__32BIT reads a network long (32 bit) given in network + * byte order, and returns its value as an unsigned int. + */ +#define DNS__32BIT(p) \ + ((unsigned int)(((unsigned int)((unsigned char)(p)[0]) << 24U) | \ + ((unsigned int)((unsigned char)(p)[1]) << 16U) | \ + ((unsigned int)((unsigned char)(p)[2]) << 8U) | \ + ((unsigned int)((unsigned char)(p)[3])))) + +#define DNS__SET16BIT(p, v) \ + (((p)[0] = (unsigned char)(((v) >> 8) & 0xff)), \ + ((p)[1] = (unsigned char)((v) & 0xff))) +#define DNS__SET32BIT(p, v) \ + (((p)[0] = (unsigned char)(((v) >> 24) & 0xff)), \ + ((p)[1] = (unsigned char)(((v) >> 16) & 0xff)), \ + ((p)[2] = (unsigned char)(((v) >> 8) & 0xff)), \ + ((p)[3] = (unsigned char)((v) & 0xff))) + +#if 0 +/* we cannot use this approach on systems where we can't access 16/32 bit + data on un-aligned addresses */ +# define DNS__16BIT(p) ntohs(*(unsigned short *)(p)) +# define DNS__32BIT(p) ntohl(*(unsigned long *)(p)) +# define DNS__SET16BIT(p, v) *(unsigned short *)(p) = htons(v) +# define DNS__SET32BIT(p, v) *(unsigned long *)(p) = htonl(v) +#endif + +/* Macros for parsing a DNS header */ +#define DNS_HEADER_QID(h) DNS__16BIT(h) +#define DNS_HEADER_QR(h) (((h)[2] >> 7) & 0x1) +#define DNS_HEADER_OPCODE(h) (((h)[2] >> 3) & 0xf) +#define DNS_HEADER_AA(h) (((h)[2] >> 2) & 0x1) +#define DNS_HEADER_TC(h) (((h)[2] >> 1) & 0x1) +#define DNS_HEADER_RD(h) ((h)[2] & 0x1) +#define DNS_HEADER_RA(h) (((h)[3] >> 7) & 0x1) +#define DNS_HEADER_Z(h) (((h)[3] >> 4) & 0x7) +#define DNS_HEADER_RCODE(h) ((h)[3] & 0xf) +#define DNS_HEADER_QDCOUNT(h) DNS__16BIT((h) + 4) +#define DNS_HEADER_ANCOUNT(h) DNS__16BIT((h) + 6) +#define DNS_HEADER_NSCOUNT(h) DNS__16BIT((h) + 8) +#define DNS_HEADER_ARCOUNT(h) DNS__16BIT((h) + 10) + +/* Macros for constructing a DNS header */ +#define DNS_HEADER_SET_QID(h, v) DNS__SET16BIT(h, v) +#define DNS_HEADER_SET_QR(h, v) ((h)[2] |= (unsigned char)(((v) & 0x1) << 7)) +#define DNS_HEADER_SET_OPCODE(h, v) \ + ((h)[2] |= (unsigned char)(((v) & 0xf) << 3)) +#define DNS_HEADER_SET_AA(h, v) ((h)[2] |= (unsigned char)(((v) & 0x1) << 2)) +#define DNS_HEADER_SET_TC(h, v) ((h)[2] |= (unsigned char)(((v) & 0x1) << 1)) +#define DNS_HEADER_SET_RD(h, v) ((h)[2] |= (unsigned char)((v) & 0x1)) +#define DNS_HEADER_SET_RA(h, v) ((h)[3] |= (unsigned char)(((v) & 0x1) << 7)) +#define DNS_HEADER_SET_Z(h, v) ((h)[3] |= (unsigned char)(((v) & 0x7) << 4)) +#define DNS_HEADER_SET_RCODE(h, v) ((h)[3] |= (unsigned char)((v) & 0xf)) +#define DNS_HEADER_SET_QDCOUNT(h, v) DNS__SET16BIT((h) + 4, v) +#define DNS_HEADER_SET_ANCOUNT(h, v) DNS__SET16BIT((h) + 6, v) +#define DNS_HEADER_SET_NSCOUNT(h, v) DNS__SET16BIT((h) + 8, v) +#define DNS_HEADER_SET_ARCOUNT(h, v) DNS__SET16BIT((h) + 10, v) + +/* Macros for parsing the fixed part of a DNS question */ +#define DNS_QUESTION_TYPE(q) DNS__16BIT(q) +#define DNS_QUESTION_CLASS(q) DNS__16BIT((q) + 2) + +/* Macros for constructing the fixed part of a DNS question */ +#define DNS_QUESTION_SET_TYPE(q, v) DNS__SET16BIT(q, v) +#define DNS_QUESTION_SET_CLASS(q, v) DNS__SET16BIT((q) + 2, v) + +/* Macros for parsing the fixed part of a DNS resource record */ +#define DNS_RR_TYPE(r) DNS__16BIT(r) +#define DNS_RR_CLASS(r) DNS__16BIT((r) + 2) +#define DNS_RR_TTL(r) DNS__32BIT((r) + 4) +#define DNS_RR_LEN(r) DNS__16BIT((r) + 8) + +/* Macros for constructing the fixed part of a DNS resource record */ +#define DNS_RR_SET_TYPE(r, v) DNS__SET16BIT(r, v) +#define DNS_RR_SET_CLASS(r, v) DNS__SET16BIT((r) + 2, v) +#define DNS_RR_SET_TTL(r, v) DNS__SET32BIT((r) + 4, v) +#define DNS_RR_SET_LEN(r, v) DNS__SET16BIT((r) + 8, v) + +#endif /* HEADER_CARES_DNS_H */ diff --git a/lib/c-ares-1.23.0/include/ares_dns_record.h b/lib/c-ares-1.23.0/include/ares_dns_record.h new file mode 100644 index 00000000000..2cc16982ba4 --- /dev/null +++ b/lib/c-ares-1.23.0/include/ares_dns_record.h @@ -0,0 +1,954 @@ +/* MIT License + * + * Copyright (c) 2023 Brad House + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ +#ifndef __ARES_DNS_RECORD_H +#define __ARES_DNS_RECORD_H + +/* Include ares.h, not this file directly */ + +#ifdef __cplusplus +extern "C" { +#endif + +/*! \addtogroup ares_dns_record DNS Record Handling + * + * This is a set of functions to create and manipulate DNS records. + * + * @{ + */ + +/*! DNS Record types handled by c-ares. Some record types may only be valid + * on requests (e.g. ARES_REC_TYPE_ANY), and some may only be valid on + * responses */ +typedef enum { + ARES_REC_TYPE_A = 1, /*!< Host address. */ + ARES_REC_TYPE_NS = 2, /*!< Authoritative server. */ + ARES_REC_TYPE_CNAME = 5, /*!< Canonical name. */ + ARES_REC_TYPE_SOA = 6, /*!< Start of authority zone. */ + ARES_REC_TYPE_PTR = 12, /*!< Domain name pointer. */ + ARES_REC_TYPE_HINFO = 13, /*!< Host information. */ + ARES_REC_TYPE_MX = 15, /*!< Mail routing information. */ + ARES_REC_TYPE_TXT = 16, /*!< Text strings. */ + ARES_REC_TYPE_AAAA = 28, /*!< RFC 3596. Ip6 Address. */ + ARES_REC_TYPE_SRV = 33, /*!< RFC 2782. Server Selection. */ + ARES_REC_TYPE_NAPTR = 35, /*!< RFC 3403. Naming Authority Pointer */ + ARES_REC_TYPE_OPT = 41, /*!< RFC 6891. EDNS0 option (meta-RR) */ + + ARES_REC_TYPE_TLSA = 52, /*!< RFC 6698. DNS-Based Authentication of Named + * Entities (DANE) Transport Layer Security + * (TLS) Protocol: TLSA */ + ARES_REC_TYPE_SVCB = 64, /*!< RFC 9460. General Purpose Service Binding */ + ARES_REC_TYPE_HTTPS = 65, /*!< RFC 9460. Service Binding type for use with + * HTTPS */ + ARES_REC_TYPE_ANY = 255, /*!< Wildcard match. Not response RR. */ + ARES_REC_TYPE_URI = 256, /*!< RFC 7553. Uniform Resource Identifier */ + ARES_REC_TYPE_CAA = 257, /*!< RFC 6844. Certification Authority + * Authorization. */ + ARES_REC_TYPE_RAW_RR = 65536 /*!< Used as an indicator that the RR record + * is not parsed, but provided in wire + * format */ +} ares_dns_rec_type_t; + +/*! DNS Classes for requests and responses. */ +typedef enum { + ARES_CLASS_IN = 1, /*!< Internet */ + ARES_CLASS_CHAOS = 3, /*!< CHAOS */ + ARES_CLASS_HESOID = 4, /*!< Hesoid [Dyer 87] */ + ARES_CLASS_NONE = 254, /*!< RFC 2136 */ + ARES_CLASS_ANY = 255 /*!< Any class (requests only) */ +} ares_dns_class_t; + +/*! DNS RR Section type */ +typedef enum { + ARES_SECTION_ANSWER = 1, /*!< Answer section */ + ARES_SECTION_AUTHORITY = 2, /*!< Authority section */ + ARES_SECTION_ADDITIONAL = 3 /*!< Additional information section */ +} ares_dns_section_t; + +/*! DNS Header opcodes */ +typedef enum { + ARES_OPCODE_QUERY = 0, /*!< Standard query */ + ARES_OPCODE_IQUERY = 1, /*!< Inverse query. Obsolete. */ + ARES_OPCODE_STATUS = 2, /*!< Name server status query */ + ARES_OPCODE_NOTIFY = 4, /*!< Zone change notification (RFC 1996) */ + ARES_OPCODE_UPDATE = 5, /*!< Zone update message (RFC2136) */ +} ares_dns_opcode_t; + +/*! DNS Header flags */ +typedef enum { + ARES_FLAG_QR = 1 << 0, /*!< QR. If set, is a response */ + ARES_FLAG_AA = 1 << 1, /*!< Authoritative Answer. If set, is authoritative */ + ARES_FLAG_TC = 1 << 2, /*!< Truncation. If set, is truncated response */ + ARES_FLAG_RD = 1 << 3, /*!< Recursion Desired. If set, recursion is desired */ + ARES_FLAG_RA = 1 << 4, /*!< Recursion Available. If set, server supports + * recursion */ + ARES_FLAG_AD = 1 << 5, /*!< RFC 2065. Authentic Data bit indicates in a + * response that the data included has been verified by + * the server providing it */ + ARES_FLAG_CD = 1 << 6, /*!< RFC 2065. Checking Disabled bit indicates in a + * query that non-verified data is acceptable to the + * resolver sending the query. */ +} ares_dns_flags_t; + +/*! DNS Response Codes from server */ +typedef enum { + ARES_RCODE_NOERROR = 0, /*!< Success */ + ARES_RCODE_FORMERR = 1, /*!< Format error. The name server was unable + * to interpret the query. */ + ARES_RCODE_SERVFAIL = 2, /*!< Server Failure. The name server was + * unable to process this query due to a + * problem with the nameserver */ + ARES_RCODE_NXDOMAIN = 3, /*!< Name Error. Meaningful only for + * responses from an authoritative name + * server, this code signifies that the + * domain name referenced in the query does + * not exist. */ + ARES_RCODE_NOTIMP = 4, /*!< Not implemented. The name server does + * not support the requested kind of + * query */ + ARES_RCODE_REFUSED = 5, /*!< Refused. The name server refuses to + * perform the specified operation for + * policy reasons. */ + ARES_RCODE_YXDOMAIN = 6, /*!< RFC 2136. Some name that ought not to + * exist, does exist. */ + ARES_RCODE_YXRRSET = 7, /*!< RFC 2136. Some RRset that ought to not + * exist, does exist. */ + ARES_RCODE_NXRRSET = 8, /*!< RFC 2136. Some RRset that ought to exist, + * does not exist. */ + ARES_RCODE_NOTAUTH = 9, /*!< RFC 2136. The server is not authoritative + * for the zone named in the Zone section. + */ + ARES_RCODE_NOTZONE = 10, /*!< RFC 2136. A name used in the Prerequisite + * or Update Section is not within the zone + * denoted by the Zone Section. */ + ARES_RCODE_DSOTYPEI = 11, /*!< RFC 8409. DSO-TYPE Not implemented */ + ARES_RCODE_BADSIG = 16, /*!< RFC 8945. TSIG Signature Failure */ + ARES_RCODE_BADKEY = 17, /*!< RFC 8945. Key not recognized. */ + ARES_RCODE_BADTIME = 18, /*!< RFC 8945. Signature out of time window. */ + ARES_RCODE_BADMODE = 19, /*!< RFC 2930. Bad TKEY Mode */ + ARES_RCODE_BADNAME = 20, /*!< RFC 2930. Duplicate Key Name */ + ARES_RCODE_BADALG = 21, /*!< RFC 2930. Algorithm not supported */ + ARES_RCODE_BADTRUNC = 22, /*!< RFC 8945. Bad Truncation */ + ARES_RCODE_BADCOOKIE = 23, /*!< RVC 7973. Bad/missing Server Cookie */ +} ares_dns_rcode_t; + +/*! Data types used */ +typedef enum { + ARES_DATATYPE_INADDR = 1, /*!< struct in_addr * type */ + ARES_DATATYPE_INADDR6 = 2, /*!< struct ares_in6_addr * type */ + ARES_DATATYPE_U8 = 3, /*!< 8bit unsigned integer */ + ARES_DATATYPE_U16 = 4, /*!< 16bit unsigned integer */ + ARES_DATATYPE_U32 = 5, /*!< 32bit unsigned integer */ + ARES_DATATYPE_NAME = 6, /*!< Null-terminated string of a domain name */ + ARES_DATATYPE_STR = 7, /*!< Null-terminated string */ + ARES_DATATYPE_BIN = 8, /*!< Binary data */ + ARES_DATATYPE_BINP = 9, /*!< Officially defined as binary data, but likely + * printable. Guaranteed to have a NULL + * terminator for convenience (not included in + * length) */ + ARES_DATATYPE_OPT = 10, /*!< Array of options. 16bit identifier, BIN + * data. */ +} ares_dns_datatype_t; + +/*! Keys used for all RR Types. We take the record type and multiply by 100 + * to ensure we have a proper offset between keys so we can keep these sorted + */ +typedef enum { + /*! A Record. Address. Datatype: INADDR */ + ARES_RR_A_ADDR = (ARES_REC_TYPE_A * 100) + 1, + /*! NS Record. Name. Datatype: NAME */ + ARES_RR_NS_NSDNAME = (ARES_REC_TYPE_NS * 100) + 1, + /*! CNAME Record. CName. Datatype: NAME */ + ARES_RR_CNAME_CNAME = (ARES_REC_TYPE_CNAME * 100) + 1, + /*! SOA Record. MNAME, Primary Source of Data. Datatype: NAME */ + ARES_RR_SOA_MNAME = (ARES_REC_TYPE_SOA * 100) + 1, + /*! SOA Record. RNAME, Mailbox of person responsible. Datatype: NAME */ + ARES_RR_SOA_RNAME = (ARES_REC_TYPE_SOA * 100) + 2, + /*! SOA Record. Serial, version. Datatype: U32 */ + ARES_RR_SOA_SERIAL = (ARES_REC_TYPE_SOA * 100) + 3, + /*! SOA Record. Refresh, zone refersh interval. Datatype: U32 */ + ARES_RR_SOA_REFRESH = (ARES_REC_TYPE_SOA * 100) + 4, + /*! SOA Record. Retry, failed refresh retry interval. Datatype: U32 */ + ARES_RR_SOA_RETRY = (ARES_REC_TYPE_SOA * 100) + 5, + /*! SOA Record. Expire, upper limit on authority. Datatype: U32 */ + ARES_RR_SOA_EXPIRE = (ARES_REC_TYPE_SOA * 100) + 6, + /*! SOA Record. Minimum, RR TTL. Datatype: U32 */ + ARES_RR_SOA_MINIMUM = (ARES_REC_TYPE_SOA * 100) + 7, + /*! PTR Record. DNAME, pointer domain. Datatype: NAME */ + ARES_RR_PTR_DNAME = (ARES_REC_TYPE_PTR * 100) + 1, + /*! HINFO Record. CPU. Datatype: STR */ + ARES_RR_HINFO_CPU = (ARES_REC_TYPE_HINFO * 100) + 1, + /*! HINFO Record. OS. Datatype: STR */ + ARES_RR_HINFO_OS = (ARES_REC_TYPE_HINFO * 100) + 2, + /*! MX Record. Preference. Datatype: U16 */ + ARES_RR_MX_PREFERENCE = (ARES_REC_TYPE_MX * 100) + 1, + /*! MX Record. Exchange, domain. Datatype: NAME */ + ARES_RR_MX_EXCHANGE = (ARES_REC_TYPE_MX * 100) + 2, + /*! TXT Record. Data. Datatype: BINP */ + ARES_RR_TXT_DATA = (ARES_REC_TYPE_TXT * 100) + 1, + /*! AAAA Record. Address. Datatype: INADDR6 */ + ARES_RR_AAAA_ADDR = (ARES_REC_TYPE_AAAA * 100) + 1, + /*! SRV Record. Priority. Datatype: U16 */ + ARES_RR_SRV_PRIORITY = (ARES_REC_TYPE_SRV * 100) + 2, + /*! SRV Record. Weight. Datatype: U16 */ + ARES_RR_SRV_WEIGHT = (ARES_REC_TYPE_SRV * 100) + 3, + /*! SRV Record. Port. Datatype: U16 */ + ARES_RR_SRV_PORT = (ARES_REC_TYPE_SRV * 100) + 4, + /*! SRV Record. Target domain. Datatype: NAME */ + ARES_RR_SRV_TARGET = (ARES_REC_TYPE_SRV * 100) + 5, + /*! NAPTR Record. Order. Datatype: U16 */ + ARES_RR_NAPTR_ORDER = (ARES_REC_TYPE_NAPTR * 100) + 1, + /*! NAPTR Record. Preference. Datatype: U16 */ + ARES_RR_NAPTR_PREFERENCE = (ARES_REC_TYPE_NAPTR * 100) + 2, + /*! NAPTR Record. Flags. Datatype: STR */ + ARES_RR_NAPTR_FLAGS = (ARES_REC_TYPE_NAPTR * 100) + 3, + /*! NAPTR Record. Services. Datatype: STR */ + ARES_RR_NAPTR_SERVICES = (ARES_REC_TYPE_NAPTR * 100) + 4, + /*! NAPTR Record. Regexp. Datatype: STR */ + ARES_RR_NAPTR_REGEXP = (ARES_REC_TYPE_NAPTR * 100) + 5, + /*! NAPTR Record. Replacement. Datatype: NAME */ + ARES_RR_NAPTR_REPLACEMENT = (ARES_REC_TYPE_NAPTR * 100) + 6, + /*! OPT Record. UDP Size. Datatype: U16 */ + ARES_RR_OPT_UDP_SIZE = (ARES_REC_TYPE_OPT * 100) + 1, + /*! OPT Record. Version. Datatype: U8 */ + ARES_RR_OPT_VERSION = (ARES_REC_TYPE_OPT * 100) + 3, + /*! OPT Record. Flags. Datatype: U16 */ + ARES_RR_OPT_FLAGS = (ARES_REC_TYPE_OPT * 100) + 4, + /*! OPT Record. Options. Datatype: OPT */ + ARES_RR_OPT_OPTIONS = (ARES_REC_TYPE_OPT * 100) + 5, + /*! TLSA Record. Certificate Usage. Datatype: U8 */ + ARES_RR_TLSA_CERT_USAGE = (ARES_REC_TYPE_TLSA * 100) + 1, + /*! TLSA Record. Selector. Datatype: U8 */ + ARES_RR_TLSA_SELECTOR = (ARES_REC_TYPE_TLSA * 100) + 2, + /*! TLSA Record. Matching Type. Datatype: U8 */ + ARES_RR_TLSA_MATCH = (ARES_REC_TYPE_TLSA * 100) + 3, + /*! TLSA Record. Certificate Association Data. Datatype: BIN */ + ARES_RR_TLSA_DATA = (ARES_REC_TYPE_TLSA * 100) + 4, + /*! SVCB Record. SvcPriority. Datatype: U16 */ + ARES_RR_SVCB_PRIORITY = (ARES_REC_TYPE_SVCB * 100) + 1, + /*! SVCB Record. TargetName. Datatype: NAME */ + ARES_RR_SVCB_TARGET = (ARES_REC_TYPE_SVCB * 100) + 2, + /*! SVCB Record. SvcParams. Datatype: OPT */ + ARES_RR_SVCB_PARAMS = (ARES_REC_TYPE_SVCB * 100) + 3, + /*! HTTPS Record. SvcPriority. Datatype: U16 */ + ARES_RR_HTTPS_PRIORITY = (ARES_REC_TYPE_HTTPS * 100) + 1, + /*! HTTPS Record. TargetName. Datatype: NAME */ + ARES_RR_HTTPS_TARGET = (ARES_REC_TYPE_HTTPS * 100) + 2, + /*! HTTPS Record. SvcParams. Datatype: OPT */ + ARES_RR_HTTPS_PARAMS = (ARES_REC_TYPE_HTTPS * 100) + 3, + /*! URI Record. Priority. Datatype: U16 */ + ARES_RR_URI_PRIORITY = (ARES_REC_TYPE_URI * 100) + 1, + /*! URI Record. Weight. Datatype: U16 */ + ARES_RR_URI_WEIGHT = (ARES_REC_TYPE_URI * 100) + 2, + /*! URI Record. Target domain. Datatype: NAME */ + ARES_RR_URI_TARGET = (ARES_REC_TYPE_URI * 100) + 3, + /*! CAA Record. Critical flag. Datatype: U8 */ + ARES_RR_CAA_CRITICAL = (ARES_REC_TYPE_CAA * 100) + 1, + /*! CAA Record. Tag/Property. Datatype: STR */ + ARES_RR_CAA_TAG = (ARES_REC_TYPE_CAA * 100) + 2, + /*! CAA Record. Value. Datatype: BINP */ + ARES_RR_CAA_VALUE = (ARES_REC_TYPE_CAA * 100) + 3, + /*! RAW Record. RR Type. Datatype: U16 */ + ARES_RR_RAW_RR_TYPE = (ARES_REC_TYPE_RAW_RR * 100) + 1, + /*! RAW Record. RR Data. Datatype: BIN */ + ARES_RR_RAW_RR_DATA = (ARES_REC_TYPE_RAW_RR * 100) + 2, +} ares_dns_rr_key_t; + +/*! TLSA Record ARES_RR_TLSA_CERT_USAGE known values */ +typedef enum { + /*! Certificate Usage 0. CA Constraint. */ + ARES_TLSA_USAGE_CA = 0, + /*! Certificate Usage 1. Service Certificate Constraint. */ + ARES_TLSA_USAGE_SERVICE = 1, + /*! Certificate Usage 2. Trust Anchor Assertion. */ + ARES_TLSA_USAGE_TRUSTANCHOR = 2, + /*! Certificate Usage 3. Domain-issued certificate. */ + ARES_TLSA_USAGE_DOMAIN = 3 +} ares_tlsa_usage_t; + +/*! TLSA Record ARES_RR_TLSA_SELECTOR known values */ +typedef enum { + /*! Full Certificate */ + ARES_TLSA_SELECTOR_FULL = 0, + /*! DER-encoded SubjectPublicKeyInfo */ + ARES_TLSA_SELECTOR_SUBJPUBKEYINFO = 1 +} ares_tlsa_selector_t; + +/*! TLSA Record ARES_RR_TLSA_MATCH known values */ +typedef enum { + /*! Exact match */ + ARES_TLSA_MATCH_EXACT = 0, + /*! Sha256 match */ + ARES_TLSA_MATCH_SHA256 = 1, + /*! Sha512 match */ + ARES_TLSA_MATCH_SHA512 = 2 +} ares_tlsa_match_t; + +/*! SVCB (and HTTPS) RR known parameters */ +typedef enum { + /*! Mandatory keys in this RR (RFC 9460 Section 8) */ + ARES_SVCB_PARAM_MANDATORY = 0, + /*! Additional supported protocols (RFC 9460 Section 7.1) */ + ARES_SVCB_PARAM_ALPN = 1, + /*! No support for default protocol (RFC 9460 Section 7.1) */ + ARES_SVCB_PARAM_NO_DEFAULT_ALPN = 2, + /*! Port for alternative endpoint (RFC 9460 Section 7.2) */ + ARES_SVCB_PARAM_PORT = 3, + /*! IPv4 address hints (RFC 9460 Section 7.3) */ + ARES_SVCB_PARAM_IPV4HINT = 4, + /*! RESERVED (held for Encrypted ClientHello) */ + ARES_SVCB_PARAM_ECH = 5, + /*! IPv6 address hints (RFC 9460 Section 7.3) */ + ARES_SVCB_PARAM_IPV6HINT = 6 +} ares_svcb_param_t; + +/*! OPT RR known parameters */ +typedef enum { + /*! RFC 8764. Apple's DNS Long-Lived Queries Protocol */ + ARES_OPT_PARAM_LLQ = 1, + /*! http://files.dns-sd.org/draft-sekar-dns-ul.txt: Update Lease */ + ARES_OPT_PARAM_UL = 2, + /*! RFC 5001. Name Server Identification */ + ARES_OPT_PARAM_NSID = 3, + /*! RFC 6975. DNSSEC Algorithm Understood */ + ARES_OPT_PARAM_DAU = 5, + /*! RFC 6975. DS Hash Understood */ + ARES_OPT_PARAM_DHU = 6, + /*! RFC 6975. NSEC3 Hash Understood */ + ARES_OPT_PARAM_N3U = 7, + /*! RFC 7871. Client Subnet */ + ARES_OPT_PARAM_EDNS_CLIENT_SUBNET = 8, + /*! RFC 7314. Expire Timer */ + ARES_OPT_PARAM_EDNS_EXPIRE = 9, + /*! RFC 7873. Client and Server Cookies */ + ARES_OPT_PARAM_COOKIE = 10, + /*! RFC 7828. TCP Keepalive timeout */ + ARES_OPT_PARAM_EDNS_TCP_KEEPALIVE = 11, + /*! RFC 7830. Padding */ + ARES_OPT_PARAM_PADDING = 12, + /*! RFC 7901. Chain query requests */ + ARES_OPT_PARAM_CHAIN = 13, + /*! RFC 8145. Signaling Trust Anchor Knowledge in DNSSEC */ + ARES_OPT_PARAM_EDNS_KEY_TAG = 14, + /*! RFC 8914. Extended ERROR code and message */ + ARES_OPT_PARAM_EXTENDED_DNS_ERROR = 15, +} ares_opt_param_t; + +/*! Data type for option records for keys like ARES_RR_OPT_OPTIONS and + * ARES_RR_HTTPS_PARAMS returned by ares_dns_opt_get_datatype() */ +typedef enum { + /*! No value allowed for this option */ + ARES_OPT_DATATYPE_NONE = 1, + /*! List of strings, each prefixed with a single octet representing the length + */ + ARES_OPT_DATATYPE_STR_LIST = 2, + /*! List of 8bit integers, concatenated */ + ARES_OPT_DATATYPE_U8_LIST = 3, + /*! 16bit integer in network byte order */ + ARES_OPT_DATATYPE_U16 = 4, + /*! list of 16bit integer in network byte order, concatenated. */ + ARES_OPT_DATATYPE_U16_LIST = 5, + /*! 32bit integer in network byte order */ + ARES_OPT_DATATYPE_U32 = 6, + /*! list 32bit integer in network byte order, concatenated */ + ARES_OPT_DATATYPE_U32_LIST = 7, + /*! List of ipv4 addresses in network byte order, concatenated */ + ARES_OPT_DATATYPE_INADDR4_LIST = 8, + /*! List of ipv6 addresses in network byte order, concatenated */ + ARES_OPT_DATATYPE_INADDR6_LIST = 9, + /*! Binary Data */ + ARES_OPT_DATATYPE_BIN = 10, + /*! DNS Domain Name Format */ + ARES_OPT_DATATYPE_NAME = 11 +} ares_dns_opt_datatype_t; + +/*! String representation of DNS Record Type + * + * \param[in] type DNS Record Type + * \return string + */ +CARES_EXTERN const char *ares_dns_rec_type_tostr(ares_dns_rec_type_t type); + +/*! String representation of DNS Class + * + * \param[in] qclass DNS Class + * \return string + */ +CARES_EXTERN const char *ares_dns_class_tostr(ares_dns_class_t qclass); + +/*! String representation of DNS OpCode + * + * \param[in] opcode DNS OpCode + * \return string + */ +CARES_EXTERN const char *ares_dns_opcode_tostr(ares_dns_opcode_t opcode); + +/*! String representation of DNS Resource Record Parameter + * + * \param[in] key DNS Resource Record parameter + * \return string + */ +CARES_EXTERN const char *ares_dns_rr_key_tostr(ares_dns_rr_key_t key); + +/*! String representation of DNS Resource Record section + * + * \param[in] section Section + * \return string + */ +CARES_EXTERN const char *ares_dns_section_tostr(ares_dns_section_t section); + +/*! Convert DNS class name as string to ares_dns_class_t + * + * \param[out] qclass Pointer passed by reference to write class + * \param[in] str String to convert + * \return ARES_TRUE on success + */ +CARES_EXTERN ares_bool_t ares_dns_class_fromstr(ares_dns_class_t *qclass, + const char *str); + +/*! Convert DNS record type as string to ares_dns_rec_type_t + * + * \param[out] qclass Pointer passed by reference to write record type + * \param[in] str String to convert + * \return ARES_TRUE on success + */ +CARES_EXTERN ares_bool_t ares_dns_rec_type_fromstr(ares_dns_rec_type_t *qtype, + const char *str); + + +/*! Convert DNS response code as string to from ares_dns_rcode_t + * + * \param[in] rcode Response code to convert + * \return ARES_TRUE on success + */ +CARES_EXTERN const char *ares_dns_rcode_tostr(ares_dns_rcode_t rcode); + +/*! Convert any valid ip address (ipv4 or ipv6) into struct ares_addr and + * return the starting pointer of the network byte order address and the + * length of the address (4 or 16). + * + * \param[in] ipaddr ASCII string form of the ip address + * \param[in,out] addr Must set "family" member to one of AF_UNSPEC, + * AF_INET, AF_INET6 on input. + * \param[out] ptr_len Length of binary form address + * \return Pointer to start of binary address or NULL on error. + */ +CARES_EXTERN const void *ares_dns_pton(const char *ipaddr, + struct ares_addr *addr, size_t *out_len); + +/*! Convert an ip address into the PTR format for in-addr.arpa or in6.arpa + * + * \param[in] addr properly filled address structure + * \return String representing PTR, use ares_free_string() to free + */ +CARES_EXTERN char *ares_dns_addr_to_ptr(const struct ares_addr *addr); + + +/*! The options/parameters extensions to some RRs can be somewhat opaque, this + * is a helper to return the best match for a datatype for interpreting the + * option record. + * + * \param[in] key Key associated with options/parameters + * \param[in] opt Option Key/Parameter + * \return Datatype + */ +CARES_EXTERN ares_dns_opt_datatype_t + ares_dns_opt_get_datatype(ares_dns_rr_key_t key, unsigned short opt); + +/*! The options/parameters extensions to some RRs can be somewhat opaque, this + * is a helper to return the name if the option is known. + * + * \param[in] key Key associated with options/parameters + * \param[in] opt Option Key/Parameter + * \return name, or NULL if not known. + */ +CARES_EXTERN const char *ares_dns_opt_get_name(ares_dns_rr_key_t key, + unsigned short opt); + + +/*! Retrieve a list of Resource Record keys that can be set or retrieved for + * the Resource record type. + * + * \param[in] type Record Type + * \param[out] cnt Number of keys returned + * \return array of keys associated with Resource Record + */ +CARES_EXTERN const ares_dns_rr_key_t * + ares_dns_rr_get_keys(ares_dns_rec_type_t type, size_t *cnt); + +/*! Retrieve the datatype associated with a Resource Record key. + * + * \param[in] key Resource Record Key + * \return datatype + */ +CARES_EXTERN ares_dns_datatype_t + ares_dns_rr_key_datatype(ares_dns_rr_key_t key); + +/*! Retrieve the DNS Resource Record type associated with a Resource Record key. + * + * \param[in] key Resource Record Key + * \return DNS Resource Record Type + */ +CARES_EXTERN ares_dns_rec_type_t + ares_dns_rr_key_to_rec_type(ares_dns_rr_key_t key); + +/*! Opaque data type representing a DNS RR (Resource Record) */ +struct ares_dns_rr; + +/*! Typedef for opaque data type representing a DNS RR (Resource Record) */ +typedef struct ares_dns_rr ares_dns_rr_t; + +/*! Opaque data type representing a DNS Query Data QD Packet */ +struct ares_dns_qd; + +/*! Typedef for opaque data type representing a DNS Query Data QD Packet */ +typedef struct ares_dns_qd ares_dns_qd_t; + +/*! Opaque data type representing a DNS Packet */ +struct ares_dns_record; + +/*! Typedef for opaque data type representing a DNS Packet */ +typedef struct ares_dns_record ares_dns_record_t; + + +/*! Create a new DNS record object + * + * \param[out] dnsrec Pointer passed by reference for a newly allocated + * record object. Must be ares_dns_record_destroy()'d by + * caller. + * \param[in] id DNS Query ID. If structuring a new query to be sent + * with ares_send(), this value should be zero. + * \param[in] flags DNS Flags from \ares_dns_flags_t + * \param[in] opcode DNS OpCode (typically ARES_OPCODE_QUERY) + * \param[in] rcode DNS RCode + * \return ARES_SUCCESS on success + */ +CARES_EXTERN ares_status_t ares_dns_record_create(ares_dns_record_t **dnsrec, + unsigned short id, + unsigned short flags, + ares_dns_opcode_t opcode, + ares_dns_rcode_t rcode); + +/*! Destroy a DNS record object + * + * \param[in] dnsrec Initialized record object + */ +CARES_EXTERN void ares_dns_record_destroy(ares_dns_record_t *dnsrec); + +/*! Get the DNS Query ID + * + * \param[in] dnsrec Initialized record object + * \return DNS query id + */ +CARES_EXTERN unsigned short + ares_dns_record_get_id(const ares_dns_record_t *dnsrec); + +/*! Get the DNS Record Flags + * + * \param[in] dnsrec Initialized record object + * \return One or more \ares_dns_flags_t + */ +CARES_EXTERN unsigned short + ares_dns_record_get_flags(const ares_dns_record_t *dnsrec); + +/*! Get the DNS Record OpCode + * + * \param[in] dnsrec Initialized record object + * \return opcode + */ +CARES_EXTERN ares_dns_opcode_t + ares_dns_record_get_opcode(const ares_dns_record_t *dnsrec); + +/*! Get the DNS Record RCode + * + * \param[in] dnsrec Initialized record object + * \return rcode + */ +CARES_EXTERN ares_dns_rcode_t + ares_dns_record_get_rcode(const ares_dns_record_t *dnsrec); + +/*! Add a query to the DNS Record. Typically a record will have only 1 + * query. Most DNS servers will reject queries with more than 1 question. + * + * \param[in] dnsrec Initialized record object + * \param[in] name Name/Hostname of request + * \param[in] qtype Type of query + * \param[in] qclass Class of query (typically ARES_CLASS_IN) + * \return ARES_SUCCESS on success + */ +CARES_EXTERN ares_status_t ares_dns_record_query_add(ares_dns_record_t *dnsrec, + const char *name, + ares_dns_rec_type_t qtype, + ares_dns_class_t qclass); + +/*! Get the count of queries in the DNS Record + * + * \param[in] dnsrec Initialized record object + * \return count of queries + */ +CARES_EXTERN size_t ares_dns_record_query_cnt(const ares_dns_record_t *dnsrec); + +/*! Get the data about the query at the provided index. + * + * \param[in] dnsrec Initialized record object + * \param[in] idx Index of query + * \param[out] name Optional. Returns name, may pass NULL if not desired. + * \param[out] qtype Optional. Returns record type, may pass NULL. + * \param[out] qclass Optional. Returns class, may pass NULL. + * \return ARES_SUCCESS on success + */ +CARES_EXTERN ares_status_t ares_dns_record_query_get( + const ares_dns_record_t *dnsrec, size_t idx, const char **name, + ares_dns_rec_type_t *qtype, ares_dns_class_t *qclass); + +/*! Get the count of Resource Records in the provided section + * + * \param[in] dnsrec Initialized record object + * \param[in] sect Section. ARES_SECTION_ANSWER is most used. + * \return count of resource records. + */ +CARES_EXTERN size_t ares_dns_record_rr_cnt(const ares_dns_record_t *dnsrec, + ares_dns_section_t sect); + + +/*! Add a Resource Record to the DNS Record. + * + * \param[out] rr_out Pointer to created resource record. This pointer + * is owned by the DNS record itself, this is just made + * available to facilitate adding RR-specific fields. + * \param[in] dnsrec Initialized record object + * \param[in] sect Section to add resource record to + * \param[in] name Resource Record name/hostname + * \param[in] type Record Type + * \param[in] rclass Class + * \param[in] ttl TTL + * \return ARES_SUCCESS on success + */ +CARES_EXTERN ares_status_t ares_dns_record_rr_add( + ares_dns_rr_t **rr_out, ares_dns_record_t *dnsrec, ares_dns_section_t sect, + const char *name, ares_dns_rec_type_t type, ares_dns_class_t rclass, + unsigned int ttl); + +/*! Fetch a resource record based on the section and index. + * + * \param[in] dnsrec Initialized record object + * \param[in] sect Section for resource record + * \param[in] idx Index of resource record in section + * \return NULL on misuse, otherwise a pointer to the resource record + */ +CARES_EXTERN ares_dns_rr_t *ares_dns_record_rr_get(ares_dns_record_t *dnsrec, + ares_dns_section_t sect, + size_t idx); + + +/*! Remove the resource record based on the section and index + * + * \param[in] dnsrec Initialized record object + * \param[in] sect Section for resource record + * \param[in] idx Index of resource record in section + * \return ARES_SUCCESS on success, otherwise an error code. + */ +CARES_EXTERN ares_status_t ares_dns_record_rr_del(ares_dns_record_t *dnsrec, + ares_dns_section_t sect, + size_t idx); + + +/*! Retrieve the resource record Name/Hostname + * + * \param[in] rr Pointer to resource record + * \return Name + */ +CARES_EXTERN const char *ares_dns_rr_get_name(const ares_dns_rr_t *rr); + +/*! Retrieve the resource record type + * + * \param[in] rr Pointer to resource record + * \return type + */ +CARES_EXTERN ares_dns_rec_type_t ares_dns_rr_get_type(const ares_dns_rr_t *rr); + +/*! Retrieve the resource record class + * + * \param[in] rr Pointer to resource record + * \return class + */ +CARES_EXTERN ares_dns_class_t ares_dns_rr_get_class(const ares_dns_rr_t *rr); + +/*! Retrieve the resource record TTL + * + * \param[in] rr Pointer to resource record + * \return TTL + */ +CARES_EXTERN unsigned int ares_dns_rr_get_ttl(const ares_dns_rr_t *rr); + +/*! Set ipv4 address data type for specified resource record and key. Can + * only be used on keys with datatype ARES_DATATYPE_INADDR + * + * \param[in] dns_rr Pointer to resource record + * \param[in] key DNS Resource Record Key + * \param[in] addr Pointer to ipv4 address to use. + * \return ARES_SUCCESS on success + */ +CARES_EXTERN ares_status_t ares_dns_rr_set_addr(ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key, + const struct in_addr *addr); + +/*! Set ipv6 address data type for specified resource record and key. Can + * only be used on keys with datatype ARES_DATATYPE_INADDR6 + * + * \param[in] dns_rr Pointer to resource record + * \param[in] key DNS Resource Record Key + * \param[in] addr Pointer to ipv6 address to use. + * \return ARES_SUCCESS on success + */ +CARES_EXTERN ares_status_t + ares_dns_rr_set_addr6(ares_dns_rr_t *dns_rr, ares_dns_rr_key_t key, + const struct ares_in6_addr *addr); + +/*! Set string data for specified resource record and key. Can + * only be used on keys with datatype ARES_DATATYPE_STR or ARES_DATATYPE_NAME. + * + * \param[in] dns_rr Pointer to resource record + * \param[in] key DNS Resource Record Key + * \param[in] val Pointer to string to set. + * \return ARES_SUCCESS on success + */ +CARES_EXTERN ares_status_t ares_dns_rr_set_str(ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key, + const char *val); + +/*! Set 8bit unsigned integer for specified resource record and key. Can + * only be used on keys with datatype ARES_DATATYPE_U8 + * + * \param[in] dns_rr Pointer to resource record + * \param[in] key DNS Resource Record Key + * \param[in] val 8bit unsigned integer + * \return ARES_SUCCESS on success + */ +CARES_EXTERN ares_status_t ares_dns_rr_set_u8(ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key, + unsigned char val); + +/*! Set 16bit unsigned integer for specified resource record and key. Can + * only be used on keys with datatype ARES_DATATYPE_U16 + * + * \param[in] dns_rr Pointer to resource record + * \param[in] key DNS Resource Record Key + * \param[in] val 16bit unsigned integer + * \return ARES_SUCCESS on success + */ +CARES_EXTERN ares_status_t ares_dns_rr_set_u16(ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key, + unsigned short val); + +/*! Set 32bit unsigned integer for specified resource record and key. Can + * only be used on keys with datatype ARES_DATATYPE_U32 + * + * \param[in] dns_rr Pointer to resource record + * \param[in] key DNS Resource Record Key + * \param[in] val 32bit unsigned integer + * \return ARES_SUCCESS on success + */ +CARES_EXTERN ares_status_t ares_dns_rr_set_u32(ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key, + unsigned int val); + +/*! Set binary (BIN or BINP) data for specified resource record and key. Can + * only be used on keys with datatype ARES_DATATYPE_BIN or ARES_DATATYPE_BINP. + * + * \param[in] dns_rr Pointer to resource record + * \param[in] key DNS Resource Record Key + * \param[in] val Pointer to binary data. + * \param[in] len Length of binary data + * \return ARES_SUCCESS on success + */ +CARES_EXTERN ares_status_t ares_dns_rr_set_bin(ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key, + const unsigned char *val, + size_t len); + +/*! Set the option for the RR + * + * \param[in] dns_rr Pointer to resource record + * \param[in] key DNS Resource Record Key + * \param[in] opt Option record key id. + * \param[out] val Optional. Value to associate with option. + * \param[out] val_len Length of value passed. + * \return ARES_SUCCESS on success + */ +CARES_EXTERN ares_status_t ares_dns_rr_set_opt(ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key, + unsigned short opt, + const unsigned char *val, + size_t val_len); + +/*! Retrieve a pointer to the ipv4 address. Can only be used on keys with + * datatype ARES_DATATYPE_INADDR. + * + * \param[in] dns_rr Pointer to resource record + * \param[in] key DNS Resource Record Key + * \return pointer to ipv4 address or NULL on error + */ +CARES_EXTERN const struct in_addr * + ares_dns_rr_get_addr(const ares_dns_rr_t *dns_rr, ares_dns_rr_key_t key); + +/*! Retrieve a pointer to the ipv6 address. Can only be used on keys with + * datatype ARES_DATATYPE_INADDR6. + * + * \param[in] dns_rr Pointer to resource record + * \param[in] key DNS Resource Record Key + * \return pointer to ipv6 address or NULL on error + */ +CARES_EXTERN const struct ares_in6_addr * + ares_dns_rr_get_addr6(const ares_dns_rr_t *dns_rr, ares_dns_rr_key_t key); + +/*! Retrieve a pointer to the string. Can only be used on keys with + * datatype ARES_DATATYPE_STR and ARES_DATATYPE_NAME. + * + * \param[in] dns_rr Pointer to resource record + * \param[in] key DNS Resource Record Key + * \return pointer string or NULL on error + */ +CARES_EXTERN const char *ares_dns_rr_get_str(const ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key); + +/*! Retrieve an 8bit unsigned integer. Can only be used on keys with + * datatype ARES_DATATYPE_U8. + * + * \param[in] dns_rr Pointer to resource record + * \param[in] key DNS Resource Record Key + * \return 8bit unsigned integer + */ +CARES_EXTERN unsigned char ares_dns_rr_get_u8(const ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key); + +/*! Retrieve an 16bit unsigned integer. Can only be used on keys with + * datatype ARES_DATATYPE_U16. + * + * \param[in] dns_rr Pointer to resource record + * \param[in] key DNS Resource Record Key + * \return 16bit unsigned integer + */ +CARES_EXTERN unsigned short ares_dns_rr_get_u16(const ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key); + +/*! Retrieve an 32bit unsigned integer. Can only be used on keys with + * datatype ARES_DATATYPE_U32. + * + * \param[in] dns_rr Pointer to resource record + * \param[in] key DNS Resource Record Key + * \return 32bit unsigned integer + */ +CARES_EXTERN unsigned int ares_dns_rr_get_u32(const ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key); + +/*! Retrieve a pointer to the binary data. Can only be used on keys with + * datatype ARES_DATATYPE_BIN or ARES_DATATYPE_BINP. If BINP, the data is + * guaranteed to have a NULL terminator which is NOT included in the length. + * + * \param[in] dns_rr Pointer to resource record + * \param[in] key DNS Resource Record Key + * \param[out] len Length of binary data returned + * \return pointer binary data or NULL on error + */ +CARES_EXTERN const unsigned char * + ares_dns_rr_get_bin(const ares_dns_rr_t *dns_rr, ares_dns_rr_key_t key, + size_t *len); + +/*! Retrieve the number of options stored for the RR. + * + * \param[in] dns_rr Pointer to resource record + * \param[in] key DNS Resource Record Key + * \return count, or 0 if none. + */ +CARES_EXTERN size_t ares_dns_rr_get_opt_cnt(const ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key); + +/*! Retrieve the option for the RR by index. + * + * \param[in] dns_rr Pointer to resource record + * \param[in] key DNS Resource Record Key + * \param[in] idx Index of option record + * \param[out] val Optional. Pointer passed by reference to hold value. + * Options may not have values. Value if returned is + * guaranteed to be NULL terminated, however in most + * cases it is not printable. + * \param[out] val_len Optional. Pointer passed by reference to hold value + * length. + * \return option key/id on success, 65535 on misuse. + */ +CARES_EXTERN unsigned short + ares_dns_rr_get_opt(const ares_dns_rr_t *dns_rr, ares_dns_rr_key_t key, + size_t idx, const unsigned char **val, size_t *val_len); + +/*! Retrieve the option for the RR by the option key/id. + * + * \param[in] dns_rr Pointer to resource record + * \param[in] key DNS Resource Record Key + * \param[in] opt Option record key id (this is not the index). + * \param[out] val Optional. Pointer passed by reference to hold value. + * Options may not have values. Value if returned is + * guaranteed to be NULL terminated, however in most cases + * it is not printable. + * \param[out] val_len Optional. Pointer passed by reference to hold value + * length. + * \return ARES_TRUE on success, ARES_FALSE on misuse. + */ +CARES_EXTERN ares_bool_t ares_dns_rr_get_opt_byid(const ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key, + unsigned short opt, + const unsigned char **val, + size_t *val_len); + +/*! Parse a complete DNS message. + * + * \param[in] buf pointer to bytes to be parsed + * \param[in] buf_len Length of buf provided + * \param[in] flags Flags dictating how the message should be parsed. TBD. + * \param[out] dnsrec Pointer passed by reference for a new DNS record object + * that must be ares_dns_record_destroy()'d by caller. + * \return ARES_SUCCESS on success + */ +CARES_EXTERN ares_status_t ares_dns_parse(const unsigned char *buf, + size_t buf_len, unsigned int flags, + ares_dns_record_t **dnsrec); + +/*! Write a complete DNS message + * + * \param[in] dnsrec Pointer to initialized and filled DNS record object. + * \param[out] buf Pointer passed by reference to be filled in with with + * DNS message. Must be ares_free()'d by caller. + * \param[out] buf_len Length of returned buffer containing DNS message. + * \return ARES_SUCCESS on success + */ +CARES_EXTERN ares_status_t ares_dns_write(ares_dns_record_t *dnsrec, + unsigned char **buf, size_t *buf_len); +/*! @} */ + +#ifdef __cplusplus +} +#endif + +#endif /* __ARES_DNS_RECORD_H */ diff --git a/lib/c-ares-1.23.0/include/ares_nameser.h b/lib/c-ares-1.23.0/include/ares_nameser.h new file mode 100644 index 00000000000..cf0e3b2d8ab --- /dev/null +++ b/lib/c-ares-1.23.0/include/ares_nameser.h @@ -0,0 +1,510 @@ +/* MIT License + * + * Copyright (c) Massachusetts Institute of Technology + * Copyright (c) Daniel Stenberg + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ + +#ifndef ARES_NAMESER_H +#define ARES_NAMESER_H + +#include "ares_build.h" + +#ifdef CARES_HAVE_ARPA_NAMESER_H +# include +#endif +#ifdef CARES_HAVE_ARPA_NAMESER_COMPAT_H +# include +#endif + +/* ============================================================================ + * arpa/nameser.h may or may not provide ALL of the below defines, so check + * each one individually and set if not + * ============================================================================ + */ + +#ifndef NS_PACKETSZ +# define NS_PACKETSZ 512 /* maximum packet size */ +#endif + +#ifndef NS_MAXDNAME +# define NS_MAXDNAME 256 /* maximum domain name */ +#endif + +#ifndef NS_MAXCDNAME +# define NS_MAXCDNAME 255 /* maximum compressed domain name */ +#endif + +#ifndef NS_MAXLABEL +# define NS_MAXLABEL 63 +#endif + +#ifndef NS_HFIXEDSZ +# define NS_HFIXEDSZ 12 /* #/bytes of fixed data in header */ +#endif + +#ifndef NS_QFIXEDSZ +# define NS_QFIXEDSZ 4 /* #/bytes of fixed data in query */ +#endif + +#ifndef NS_RRFIXEDSZ +# define NS_RRFIXEDSZ 10 /* #/bytes of fixed data in r record */ +#endif + +#ifndef NS_INT16SZ +# define NS_INT16SZ 2 +#endif + +#ifndef NS_INADDRSZ +# define NS_INADDRSZ 4 +#endif + +#ifndef NS_IN6ADDRSZ +# define NS_IN6ADDRSZ 16 +#endif + +#ifndef NS_CMPRSFLGS +# define NS_CMPRSFLGS 0xc0 /* Flag bits indicating name compression. */ +#endif + +#ifndef NS_DEFAULTPORT +# define NS_DEFAULTPORT 53 /* For both TCP and UDP. */ +#endif + +/* ============================================================================ + * arpa/nameser.h should provide these enumerations always, so if not found, + * provide them + * ============================================================================ + */ +#ifndef CARES_HAVE_ARPA_NAMESER_H + +typedef enum __ns_class { + ns_c_invalid = 0, /* Cookie. */ + ns_c_in = 1, /* Internet. */ + ns_c_2 = 2, /* unallocated/unsupported. */ + ns_c_chaos = 3, /* MIT Chaos-net. */ + ns_c_hs = 4, /* MIT Hesiod. */ + /* Query class values which do not appear in resource records */ + ns_c_none = 254, /* for prereq. sections in update requests */ + ns_c_any = 255, /* Wildcard match. */ + ns_c_max = 65536 +} ns_class; + +typedef enum __ns_type { + ns_t_invalid = 0, /* Cookie. */ + ns_t_a = 1, /* Host address. */ + ns_t_ns = 2, /* Authoritative server. */ + ns_t_md = 3, /* Mail destination. */ + ns_t_mf = 4, /* Mail forwarder. */ + ns_t_cname = 5, /* Canonical name. */ + ns_t_soa = 6, /* Start of authority zone. */ + ns_t_mb = 7, /* Mailbox domain name. */ + ns_t_mg = 8, /* Mail group member. */ + ns_t_mr = 9, /* Mail rename name. */ + ns_t_null = 10, /* Null resource record. */ + ns_t_wks = 11, /* Well known service. */ + ns_t_ptr = 12, /* Domain name pointer. */ + ns_t_hinfo = 13, /* Host information. */ + ns_t_minfo = 14, /* Mailbox information. */ + ns_t_mx = 15, /* Mail routing information. */ + ns_t_txt = 16, /* Text strings. */ + ns_t_rp = 17, /* Responsible person. */ + ns_t_afsdb = 18, /* AFS cell database. */ + ns_t_x25 = 19, /* X_25 calling address. */ + ns_t_isdn = 20, /* ISDN calling address. */ + ns_t_rt = 21, /* Router. */ + ns_t_nsap = 22, /* NSAP address. */ + ns_t_nsap_ptr = 23, /* Reverse NSAP lookup (deprecated). */ + ns_t_sig = 24, /* Security signature. */ + ns_t_key = 25, /* Security key. */ + ns_t_px = 26, /* X.400 mail mapping. */ + ns_t_gpos = 27, /* Geographical position (withdrawn). */ + ns_t_aaaa = 28, /* Ip6 Address. */ + ns_t_loc = 29, /* Location Information. */ + ns_t_nxt = 30, /* Next domain (security). */ + ns_t_eid = 31, /* Endpoint identifier. */ + ns_t_nimloc = 32, /* Nimrod Locator. */ + ns_t_srv = 33, /* Server Selection. */ + ns_t_atma = 34, /* ATM Address */ + ns_t_naptr = 35, /* Naming Authority PoinTeR */ + ns_t_kx = 36, /* Key Exchange */ + ns_t_cert = 37, /* Certification record */ + ns_t_a6 = 38, /* IPv6 address (deprecates AAAA) */ + ns_t_dname = 39, /* Non-terminal DNAME (for IPv6) */ + ns_t_sink = 40, /* Kitchen sink (experimental) */ + ns_t_opt = 41, /* EDNS0 option (meta-RR) */ + ns_t_apl = 42, /* Address prefix list (RFC3123) */ + ns_t_ds = 43, /* Delegation Signer (RFC4034) */ + ns_t_sshfp = 44, /* SSH Key Fingerprint (RFC4255) */ + ns_t_rrsig = 46, /* Resource Record Signature (RFC4034) */ + ns_t_nsec = 47, /* Next Secure (RFC4034) */ + ns_t_dnskey = 48, /* DNS Public Key (RFC4034) */ + ns_t_tkey = 249, /* Transaction key */ + ns_t_tsig = 250, /* Transaction signature. */ + ns_t_ixfr = 251, /* Incremental zone transfer. */ + ns_t_axfr = 252, /* Transfer zone of authority. */ + ns_t_mailb = 253, /* Transfer mailbox records. */ + ns_t_maila = 254, /* Transfer mail agent records. */ + ns_t_any = 255, /* Wildcard match. */ + ns_t_uri = 256, /* Uniform Resource Identifier (RFC7553) */ + ns_t_caa = 257, /* Certification Authority Authorization. */ + ns_t_max = 65536 +} ns_type; + +typedef enum __ns_opcode { + ns_o_query = 0, /* Standard query. */ + ns_o_iquery = 1, /* Inverse query (deprecated/unsupported). */ + ns_o_status = 2, /* Name server status query (unsupported). */ + /* Opcode 3 is undefined/reserved. */ + ns_o_notify = 4, /* Zone change notification. */ + ns_o_update = 5, /* Zone update message. */ + ns_o_max = 6 +} ns_opcode; + +typedef enum __ns_rcode { + ns_r_noerror = 0, /* No error occurred. */ + ns_r_formerr = 1, /* Format error. */ + ns_r_servfail = 2, /* Server failure. */ + ns_r_nxdomain = 3, /* Name error. */ + ns_r_notimpl = 4, /* Unimplemented. */ + ns_r_refused = 5, /* Operation refused. */ + /* these are for BIND_UPDATE */ + ns_r_yxdomain = 6, /* Name exists */ + ns_r_yxrrset = 7, /* RRset exists */ + ns_r_nxrrset = 8, /* RRset does not exist */ + ns_r_notauth = 9, /* Not authoritative for zone */ + ns_r_notzone = 10, /* Zone of record different from zone section */ + ns_r_max = 11, + /* The following are TSIG extended errors */ + ns_r_badsig = 16, + ns_r_badkey = 17, + ns_r_badtime = 18 +} ns_rcode; + +#endif /* CARES_HAVE_ARPA_NAMESER_H */ + + +/* ============================================================================ + * arpa/nameser_compat.h typically sets these. However on some systems + * arpa/nameser.h does, but may not set all of them. Lets conditionally + * define each + * ============================================================================ + */ + +#ifndef PACKETSZ +# define PACKETSZ NS_PACKETSZ +#endif + +#ifndef MAXDNAME +# define MAXDNAME NS_MAXDNAME +#endif + +#ifndef MAXCDNAME +# define MAXCDNAME NS_MAXCDNAME +#endif + +#ifndef MAXLABEL +# define MAXLABEL NS_MAXLABEL +#endif + +#ifndef HFIXEDSZ +# define HFIXEDSZ NS_HFIXEDSZ +#endif + +#ifndef QFIXEDSZ +# define QFIXEDSZ NS_QFIXEDSZ +#endif + +#ifndef RRFIXEDSZ +# define RRFIXEDSZ NS_RRFIXEDSZ +#endif + +#ifndef INDIR_MASK +# define INDIR_MASK NS_CMPRSFLGS +#endif + +#ifndef NAMESERVER_PORT +# define NAMESERVER_PORT NS_DEFAULTPORT +#endif + + +/* opcodes */ +#ifndef O_QUERY +# define O_QUERY 0 /* ns_o_query */ +#endif +#ifndef O_IQUERY +# define O_IQUERY 1 /* ns_o_iquery */ +#endif +#ifndef O_STATUS +# define O_STATUS 2 /* ns_o_status */ +#endif +#ifndef O_NOTIFY +# define O_NOTIFY 4 /* ns_o_notify */ +#endif +#ifndef O_UPDATE +# define O_UPDATE 5 /* ns_o_update */ +#endif + + +/* response codes */ +#ifndef SERVFAIL +# define SERVFAIL ns_r_servfail +#endif +#ifndef NOTIMP +# define NOTIMP ns_r_notimpl +#endif +#ifndef REFUSED +# define REFUSED ns_r_refused +#endif +#if defined(_WIN32) && !defined(HAVE_ARPA_NAMESER_COMPAT_H) && defined(NOERROR) +# undef NOERROR /* it seems this is already defined in winerror.h */ +#endif +#ifndef NOERROR +# define NOERROR ns_r_noerror +#endif +#ifndef FORMERR +# define FORMERR ns_r_formerr +#endif +#ifndef NXDOMAIN +# define NXDOMAIN ns_r_nxdomain +#endif +/* Non-standard response codes, use numeric values */ +#ifndef YXDOMAIN +# define YXDOMAIN 6 /* ns_r_yxdomain */ +#endif +#ifndef YXRRSET +# define YXRRSET 7 /* ns_r_yxrrset */ +#endif +#ifndef NXRRSET +# define NXRRSET 8 /* ns_r_nxrrset */ +#endif +#ifndef NOTAUTH +# define NOTAUTH 9 /* ns_r_notauth */ +#endif +#ifndef NOTZONE +# define NOTZONE 10 /* ns_r_notzone */ +#endif +#ifndef TSIG_BADSIG +# define TSIG_BADSIG 16 /* ns_r_badsig */ +#endif +#ifndef TSIG_BADKEY +# define TSIG_BADKEY 17 /* ns_r_badkey */ +#endif +#ifndef TSIG_BADTIME +# define TSIG_BADTIME 18 /* ns_r_badtime */ +#endif + + +/* classes */ +#ifndef C_IN +# define C_IN 1 /* ns_c_in */ +#endif +#ifndef C_CHAOS +# define C_CHAOS 3 /* ns_c_chaos */ +#endif +#ifndef C_HS +# define C_HS 4 /* ns_c_hs */ +#endif +#ifndef C_NONE +# define C_NONE 254 /* ns_c_none */ +#endif +#ifndef C_ANY +# define C_ANY 255 /* ns_c_any */ +#endif + + +/* types */ +#ifndef T_A +# define T_A 1 /* ns_t_a */ +#endif +#ifndef T_NS +# define T_NS 2 /* ns_t_ns */ +#endif +#ifndef T_MD +# define T_MD 3 /* ns_t_md */ +#endif +#ifndef T_MF +# define T_MF 4 /* ns_t_mf */ +#endif +#ifndef T_CNAME +# define T_CNAME 5 /* ns_t_cname */ +#endif +#ifndef T_SOA +# define T_SOA 6 /* ns_t_soa */ +#endif +#ifndef T_MB +# define T_MB 7 /* ns_t_mb */ +#endif +#ifndef T_MG +# define T_MG 8 /* ns_t_mg */ +#endif +#ifndef T_MR +# define T_MR 9 /* ns_t_mr */ +#endif +#ifndef T_NULL +# define T_NULL 10 /* ns_t_null */ +#endif +#ifndef T_WKS +# define T_WKS 11 /* ns_t_wks */ +#endif +#ifndef T_PTR +# define T_PTR 12 /* ns_t_ptr */ +#endif +#ifndef T_HINFO +# define T_HINFO 13 /* ns_t_hinfo */ +#endif +#ifndef T_MINFO +# define T_MINFO 14 /* ns_t_minfo */ +#endif +#ifndef T_MX +# define T_MX 15 /* ns_t_mx */ +#endif +#ifndef T_TXT +# define T_TXT 16 /* ns_t_txt */ +#endif +#ifndef T_RP +# define T_RP 17 /* ns_t_rp */ +#endif +#ifndef T_AFSDB +# define T_AFSDB 18 /* ns_t_afsdb */ +#endif +#ifndef T_X25 +# define T_X25 19 /* ns_t_x25 */ +#endif +#ifndef T_ISDN +# define T_ISDN 20 /* ns_t_isdn */ +#endif +#ifndef T_RT +# define T_RT 21 /* ns_t_rt */ +#endif +#ifndef T_NSAP +# define T_NSAP 22 /* ns_t_nsap */ +#endif +#ifndef T_NSAP_PTR +# define T_NSAP_PTR 23 /* ns_t_nsap_ptr */ +#endif +#ifndef T_SIG +# define T_SIG 24 /* ns_t_sig */ +#endif +#ifndef T_KEY +# define T_KEY 25 /* ns_t_key */ +#endif +#ifndef T_PX +# define T_PX 26 /* ns_t_px */ +#endif +#ifndef T_GPOS +# define T_GPOS 27 /* ns_t_gpos */ +#endif +#ifndef T_AAAA +# define T_AAAA 28 /* ns_t_aaaa */ +#endif +#ifndef T_LOC +# define T_LOC 29 /* ns_t_loc */ +#endif +#ifndef T_NXT +# define T_NXT 30 /* ns_t_nxt */ +#endif +#ifndef T_EID +# define T_EID 31 /* ns_t_eid */ +#endif +#ifndef T_NIMLOC +# define T_NIMLOC 32 /* ns_t_nimloc */ +#endif +#ifndef T_SRV +# define T_SRV 33 /* ns_t_srv */ +#endif +#ifndef T_ATMA +# define T_ATMA 34 /* ns_t_atma */ +#endif +#ifndef T_NAPTR +# define T_NAPTR 35 /* ns_t_naptr */ +#endif +#ifndef T_KX +# define T_KX 36 /* ns_t_kx */ +#endif +#ifndef T_CERT +# define T_CERT 37 /* ns_t_cert */ +#endif +#ifndef T_A6 +# define T_A6 38 /* ns_t_a6 */ +#endif +#ifndef T_DNAME +# define T_DNAME 39 /* ns_t_dname */ +#endif +#ifndef T_SINK +# define T_SINK 40 /* ns_t_sink */ +#endif +#ifndef T_OPT +# define T_OPT 41 /* ns_t_opt */ +#endif +#ifndef T_APL +# define T_APL 42 /* ns_t_apl */ +#endif +#ifndef T_DS +# define T_DS 43 /* ns_t_ds */ +#endif +#ifndef T_SSHFP +# define T_SSHFP 44 /* ns_t_sshfp */ +#endif +#ifndef T_RRSIG +# define T_RRSIG 46 /* ns_t_rrsig */ +#endif +#ifndef T_NSEC +# define T_NSEC 47 /* ns_t_nsec */ +#endif +#ifndef T_DNSKEY +# define T_DNSKEY 48 /* ns_t_dnskey */ +#endif +#ifndef T_TKEY +# define T_TKEY 249 /* ns_t_tkey */ +#endif +#ifndef T_TSIG +# define T_TSIG 250 /* ns_t_tsig */ +#endif +#ifndef T_IXFR +# define T_IXFR 251 /* ns_t_ixfr */ +#endif +#ifndef T_AXFR +# define T_AXFR 252 /* ns_t_axfr */ +#endif +#ifndef T_MAILB +# define T_MAILB 253 /* ns_t_mailb */ +#endif +#ifndef T_MAILA +# define T_MAILA 254 /* ns_t_maila */ +#endif +#ifndef T_ANY +# define T_ANY 255 /* ns_t_any */ +#endif +#ifndef T_URI +# define T_URI 256 /* ns_t_uri */ +#endif +#ifndef T_CAA +# define T_CAA 257 /* ns_t_caa */ +#endif +#ifndef T_MAX +# define T_MAX 65536 /* ns_t_max */ +#endif + + +#endif /* ARES_NAMESER_H */ diff --git a/lib/c-ares-1.19.1/include/ares_rules.h b/lib/c-ares-1.23.0/include/ares_rules.h similarity index 66% rename from lib/c-ares-1.19.1/include/ares_rules.h rename to lib/c-ares-1.23.0/include/ares_rules.h index 1706ab7d004..450dc8ab2d5 100644 --- a/lib/c-ares-1.19.1/include/ares_rules.h +++ b/lib/c-ares-1.23.0/include/ares_rules.h @@ -1,19 +1,30 @@ -#ifndef __CARES_RULES_H -#define __CARES_RULES_H - - -/* Copyright (C) 2009 - 2021 by Daniel Stenberg et al +/* MIT License + * + * Copyright (c) 2009 Daniel Stenberg + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: * - * 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. + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT */ +#ifndef __CARES_RULES_H +#define __CARES_RULES_H /* ================================================================ */ /* COMPILE TIME SANITY CHECKS */ @@ -70,7 +81,7 @@ #ifndef CARES_TYPEOF_ARES_SOCKLEN_T # error "CARES_TYPEOF_ARES_SOCKLEN_T definition is missing!" - Error Compilation_aborted_CARES_TYPEOF_ARES_SOCKLEN_T_is_missing +Error Compilation_aborted_CARES_TYPEOF_ARES_SOCKLEN_T_is_missing #endif /* @@ -81,15 +92,14 @@ #define CareschkszGE(t1, t2) sizeof(t1) >= sizeof(t2) ? 1 : -1 -/* - * Verify that the size previously defined and expected for - * ares_socklen_t is actually the same as the one reported - * by sizeof() at compile time. - */ + /* + * Verify that the size previously defined and expected for + * ares_socklen_t is actually the same as the one reported + * by sizeof() at compile time. + */ -typedef char - __cares_rule_02__ - [CareschkszEQ(ares_socklen_t, sizeof(CARES_TYPEOF_ARES_SOCKLEN_T))]; + typedef char __cares_rule_02__[CareschkszEQ( + ares_socklen_t, sizeof(CARES_TYPEOF_ARES_SOCKLEN_T))]; /* * Verify at compile time that the size of ares_socklen_t as reported @@ -97,9 +107,7 @@ typedef char * the current compilation. */ -typedef char - __cares_rule_03__ - [CareschkszGE(ares_socklen_t, int)]; +typedef char __cares_rule_03__[CareschkszGE(ares_socklen_t, int)]; /* ================================================================ */ /* EXTERNALLY AND INTERNALLY VISIBLE DEFINITIONS */ diff --git a/lib/c-ares-1.23.0/include/ares_version.h b/lib/c-ares-1.23.0/include/ares_version.h new file mode 100644 index 00000000000..df5c8cf2a7d --- /dev/null +++ b/lib/c-ares-1.23.0/include/ares_version.h @@ -0,0 +1,49 @@ +/* MIT License + * + * Copyright (c) Daniel Stenberg + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ + +#ifndef ARES__VERSION_H +#define ARES__VERSION_H + +/* This is the global package copyright */ +#define ARES_COPYRIGHT "2004 - 2023 Daniel Stenberg, ." + +#define ARES_VERSION_MAJOR 1 +#define ARES_VERSION_MINOR 23 +#define ARES_VERSION_PATCH 0 +#define ARES_VERSION \ + ((ARES_VERSION_MAJOR << 16) | (ARES_VERSION_MINOR << 8) | \ + (ARES_VERSION_PATCH)) +#define ARES_VERSION_STR "1.23.0" + +#if (ARES_VERSION >= 0x010700) +# define CARES_HAVE_ARES_LIBRARY_INIT 1 +# define CARES_HAVE_ARES_LIBRARY_CLEANUP 1 +#else +# undef CARES_HAVE_ARES_LIBRARY_INIT +# undef CARES_HAVE_ARES_LIBRARY_CLEANUP +#endif + +#endif diff --git a/lib/c-ares-1.19.1/install-sh b/lib/c-ares-1.23.0/install-sh similarity index 100% rename from lib/c-ares-1.19.1/install-sh rename to lib/c-ares-1.23.0/install-sh diff --git a/lib/c-ares-1.19.1/libcares.pc.cmake b/lib/c-ares-1.23.0/libcares.pc.cmake similarity index 84% rename from lib/c-ares-1.19.1/libcares.pc.cmake rename to lib/c-ares-1.23.0/libcares.pc.cmake index f1213cf8b69..df49368633b 100644 --- a/lib/c-ares-1.19.1/libcares.pc.cmake +++ b/lib/c-ares-1.23.0/libcares.pc.cmake @@ -4,6 +4,9 @@ # | (_|_____| (_| | | | __/\__ \ # \___| \__,_|_| \___||___/ # +# Copyright (C) The c-ares project and its contributors +# SPDX-License-Identifier: MIT +prefix=@CMAKE_INSTALL_PREFIX@ exec_prefix=@CMAKE_INSTALL_FULL_BINDIR@ libdir=@CMAKE_INSTALL_FULL_LIBDIR@ includedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@ diff --git a/lib/c-ares-1.19.1/libcares.pc.in b/lib/c-ares-1.23.0/libcares.pc.in similarity index 87% rename from lib/c-ares-1.19.1/libcares.pc.in rename to lib/c-ares-1.23.0/libcares.pc.in index e7ef5d25072..aa4bfc91ddb 100644 --- a/lib/c-ares-1.19.1/libcares.pc.in +++ b/lib/c-ares-1.23.0/libcares.pc.in @@ -4,6 +4,8 @@ # | (_|_____| (_| | | | __/\__ \ # \___| \__,_|_| \___||___/ # +# Copyright (C) The c-ares project and its contributors +# SPDX-License-Identifier: MIT prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ diff --git a/lib/c-ares-1.19.1/ltmain.sh b/lib/c-ares-1.23.0/ltmain.sh similarity index 99% rename from lib/c-ares-1.19.1/ltmain.sh rename to lib/c-ares-1.23.0/ltmain.sh index 8fb8700eef3..1dea62ab78d 100755 --- a/lib/c-ares-1.19.1/ltmain.sh +++ b/lib/c-ares-1.23.0/ltmain.sh @@ -31,7 +31,7 @@ PROGRAM=libtool PACKAGE=libtool -VERSION="2.4.7 Debian-2.4.7-4" +VERSION="2.4.7 Debian-2.4.7-7" package_revision=2.4.7 @@ -572,27 +572,15 @@ func_require_term_colors () # --------------------- # Append VALUE onto the existing contents of VAR. - # We should try to minimise forks, especially on Windows where they are - # unreasonably slow, so skip the feature probes when bash or zsh are - # being used: - if test set = "${BASH_VERSION+set}${ZSH_VERSION+set}"; then - : ${_G_HAVE_ARITH_OP="yes"} - : ${_G_HAVE_XSI_OPS="yes"} - # The += operator was introduced in bash 3.1 - case $BASH_VERSION in - [12].* | 3.0 | 3.0*) ;; - *) - : ${_G_HAVE_PLUSEQ_OP="yes"} - ;; - esac - fi - # _G_HAVE_PLUSEQ_OP # Can be empty, in which case the shell is probed, "yes" if += is # useable or anything else if it does not work. - test -z "$_G_HAVE_PLUSEQ_OP" \ - && (eval 'x=a; x+=" b"; test "a b" = "$x"') 2>/dev/null \ - && _G_HAVE_PLUSEQ_OP=yes + if test -z "$_G_HAVE_PLUSEQ_OP" && \ + __PLUSEQ_TEST="a" && \ + __PLUSEQ_TEST+=" b" 2>/dev/null && \ + test "a b" = "$__PLUSEQ_TEST"; then + _G_HAVE_PLUSEQ_OP=yes + fi if test yes = "$_G_HAVE_PLUSEQ_OP" then @@ -2308,7 +2296,7 @@ include the following information: compiler: $LTCC compiler flags: $LTCFLAGS linker: $LD (gnu? $with_gnu_ld) - version: $progname $scriptversion Debian-2.4.7-4 + version: $progname $scriptversion Debian-2.4.7-7 automake: `($AUTOMAKE --version) 2>/dev/null |$SED 1q` autoconf: `($AUTOCONF --version) 2>/dev/null |$SED 1q` diff --git a/lib/c-ares-1.19.1/m4/ax_ac_append_to_file.m4 b/lib/c-ares-1.23.0/m4/ax_ac_append_to_file.m4 similarity index 100% rename from lib/c-ares-1.19.1/m4/ax_ac_append_to_file.m4 rename to lib/c-ares-1.23.0/m4/ax_ac_append_to_file.m4 diff --git a/lib/c-ares-1.19.1/m4/ax_ac_print_to_file.m4 b/lib/c-ares-1.23.0/m4/ax_ac_print_to_file.m4 similarity index 100% rename from lib/c-ares-1.19.1/m4/ax_ac_print_to_file.m4 rename to lib/c-ares-1.23.0/m4/ax_ac_print_to_file.m4 diff --git a/lib/c-ares-1.19.1/m4/ax_add_am_macro_static.m4 b/lib/c-ares-1.23.0/m4/ax_add_am_macro_static.m4 similarity index 100% rename from lib/c-ares-1.19.1/m4/ax_add_am_macro_static.m4 rename to lib/c-ares-1.23.0/m4/ax_add_am_macro_static.m4 diff --git a/lib/c-ares-1.19.1/m4/ax_am_macros_static.m4 b/lib/c-ares-1.23.0/m4/ax_am_macros_static.m4 similarity index 100% rename from lib/c-ares-1.19.1/m4/ax_am_macros_static.m4 rename to lib/c-ares-1.23.0/m4/ax_am_macros_static.m4 diff --git a/lib/c-ares-1.23.0/m4/ax_append_compile_flags.m4 b/lib/c-ares-1.23.0/m4/ax_append_compile_flags.m4 new file mode 100644 index 00000000000..1f8e70845c2 --- /dev/null +++ b/lib/c-ares-1.23.0/m4/ax_append_compile_flags.m4 @@ -0,0 +1,65 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_append_compile_flags.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_APPEND_COMPILE_FLAGS([FLAG1 FLAG2 ...], [FLAGS-VARIABLE], [EXTRA-FLAGS]) +# +# DESCRIPTION +# +# For every FLAG1, FLAG2 it is checked whether the compiler works with the +# flag. If it does, the flag is added FLAGS-VARIABLE +# +# If FLAGS-VARIABLE is not specified, the current language's flags (e.g. +# CFLAGS) is used. During the check the flag is always added to the +# current language's flags. +# +# If EXTRA-FLAGS is defined, it is added to the current language's default +# flags (e.g. CFLAGS) when the check is done. The check is thus made with +# the flags: "CFLAGS EXTRA-FLAGS FLAG". This can for example be used to +# force the compiler to issue an error when a bad flag is given. +# +# NOTE: This macro depends on the AX_APPEND_FLAG and +# AX_CHECK_COMPILE_FLAG. Please keep this macro in sync with +# AX_APPEND_LINK_FLAGS. +# +# LICENSE +# +# Copyright (c) 2011 Maarten Bosmans +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation, either version 3 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 3 + +AC_DEFUN([AX_APPEND_COMPILE_FLAGS], +[AC_REQUIRE([AX_CHECK_COMPILE_FLAG]) +AC_REQUIRE([AX_APPEND_FLAG]) +for flag in $1; do + AX_CHECK_COMPILE_FLAG([$flag], [AX_APPEND_FLAG([$flag], [$2])], [], [$3]) +done +])dnl AX_APPEND_COMPILE_FLAGS diff --git a/lib/c-ares-1.23.0/m4/ax_append_flag.m4 b/lib/c-ares-1.23.0/m4/ax_append_flag.m4 new file mode 100644 index 00000000000..1d38b76fb8e --- /dev/null +++ b/lib/c-ares-1.23.0/m4/ax_append_flag.m4 @@ -0,0 +1,69 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_append_flag.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_APPEND_FLAG(FLAG, [FLAGS-VARIABLE]) +# +# DESCRIPTION +# +# FLAG is appended to the FLAGS-VARIABLE shell variable, with a space +# added in between. +# +# If FLAGS-VARIABLE is not specified, the current language's flags (e.g. +# CFLAGS) is used. FLAGS-VARIABLE is not changed if it already contains +# FLAG. If FLAGS-VARIABLE is unset in the shell, it is set to exactly +# FLAG. +# +# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. +# +# LICENSE +# +# Copyright (c) 2008 Guido U. Draheim +# Copyright (c) 2011 Maarten Bosmans +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation, either version 3 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 2 + +AC_DEFUN([AX_APPEND_FLAG], +[AC_PREREQ(2.59)dnl for _AC_LANG_PREFIX +AS_VAR_PUSHDEF([FLAGS], [m4_default($2,_AC_LANG_PREFIX[FLAGS])])dnl +AS_VAR_SET_IF(FLAGS, + [case " AS_VAR_GET(FLAGS) " in + *" $1 "*) + AC_RUN_LOG([: FLAGS already contains $1]) + ;; + *) + AC_RUN_LOG([: FLAGS="$FLAGS $1"]) + AS_VAR_SET(FLAGS, ["AS_VAR_GET(FLAGS) $1"]) + ;; + esac], + [AS_VAR_SET(FLAGS,["$1"])]) +AS_VAR_POPDEF([FLAGS])dnl +])dnl AX_APPEND_FLAG diff --git a/lib/c-ares-1.23.0/m4/ax_check_compile_flag.m4 b/lib/c-ares-1.23.0/m4/ax_check_compile_flag.m4 new file mode 100644 index 00000000000..c3a8d695a1b --- /dev/null +++ b/lib/c-ares-1.23.0/m4/ax_check_compile_flag.m4 @@ -0,0 +1,72 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_check_compile_flag.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_CHECK_COMPILE_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS]) +# +# DESCRIPTION +# +# Check whether the given FLAG works with the current language's compiler +# or gives an error. (Warnings, however, are ignored) +# +# ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on +# success/failure. +# +# If EXTRA-FLAGS is defined, it is added to the current language's default +# flags (e.g. CFLAGS) when the check is done. The check is thus made with +# the flags: "CFLAGS EXTRA-FLAGS FLAG". This can for example be used to +# force the compiler to issue an error when a bad flag is given. +# +# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this +# macro in sync with AX_CHECK_{PREPROC,LINK}_FLAG. +# +# LICENSE +# +# Copyright (c) 2008 Guido U. Draheim +# Copyright (c) 2011 Maarten Bosmans +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation, either version 3 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 2 + +AC_DEFUN([AX_CHECK_COMPILE_FLAG], +[AC_PREREQ(2.59)dnl for _AC_LANG_PREFIX +AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_[]_AC_LANG_ABBREV[]flags_$4_$1])dnl +AC_CACHE_CHECK([whether _AC_LANG compiler accepts $1], CACHEVAR, [ + ax_check_save_flags=$[]_AC_LANG_PREFIX[]FLAGS + _AC_LANG_PREFIX[]FLAGS="$[]_AC_LANG_PREFIX[]FLAGS $4 $1" + AC_COMPILE_IFELSE([AC_LANG_PROGRAM()], + [AS_VAR_SET(CACHEVAR,[yes])], + [AS_VAR_SET(CACHEVAR,[no])]) + _AC_LANG_PREFIX[]FLAGS=$ax_check_save_flags]) +AS_IF([test x"AS_VAR_GET(CACHEVAR)" = xyes], + [m4_default([$2], :)], + [m4_default([$3], :)]) +AS_VAR_POPDEF([CACHEVAR])dnl +])dnl AX_CHECK_COMPILE_FLAGS diff --git a/lib/c-ares-1.19.1/m4/ax_check_gnu_make.m4 b/lib/c-ares-1.23.0/m4/ax_check_gnu_make.m4 similarity index 100% rename from lib/c-ares-1.19.1/m4/ax_check_gnu_make.m4 rename to lib/c-ares-1.23.0/m4/ax_check_gnu_make.m4 diff --git a/lib/c-ares-1.19.1/m4/ax_check_user_namespace.m4 b/lib/c-ares-1.23.0/m4/ax_check_user_namespace.m4 similarity index 87% rename from lib/c-ares-1.19.1/m4/ax_check_user_namespace.m4 rename to lib/c-ares-1.23.0/m4/ax_check_user_namespace.m4 index 27ba69821cb..aca721626f2 100644 --- a/lib/c-ares-1.19.1/m4/ax_check_user_namespace.m4 +++ b/lib/c-ares-1.23.0/m4/ax_check_user_namespace.m4 @@ -8,6 +8,9 @@ # # This macro checks whether the local system supports Linux user namespaces. # If so, it calls AC_DEFINE(HAVE_USER_NAMESPACE). +# +# Copyright (C) The c-ares team +# SPDX-License-Identifier: MIT AC_DEFUN([AX_CHECK_USER_NAMESPACE],[dnl AC_CACHE_CHECK([whether user namespaces are supported], @@ -34,9 +37,9 @@ int main() { pid_t child = clone(userfn, userst + 1024*1024, CLONE_NEWUSER|SIGCHLD, 0); if (child < 0) return 1; - sprintf(buffer, "/proc/%d/uid_map", child); + snprintf(buffer, sizeof(buffer), "/proc/%d/uid_map", child); fd = open(buffer, O_CREAT|O_WRONLY|O_TRUNC, 0755); - sprintf(buffer, "0 %d 1\n", getuid()); + snprintf(buffer, sizeof(buffer), "0 %d 1\n", getuid()); write(fd, buffer, strlen(buffer)); close(fd); diff --git a/lib/c-ares-1.19.1/m4/ax_check_uts_namespace.m4 b/lib/c-ares-1.23.0/m4/ax_check_uts_namespace.m4 similarity index 91% rename from lib/c-ares-1.19.1/m4/ax_check_uts_namespace.m4 rename to lib/c-ares-1.23.0/m4/ax_check_uts_namespace.m4 index cf7b145c30e..5708acf1b9f 100644 --- a/lib/c-ares-1.19.1/m4/ax_check_uts_namespace.m4 +++ b/lib/c-ares-1.23.0/m4/ax_check_uts_namespace.m4 @@ -10,6 +10,9 @@ # Also requires user namespaces to be available, so that non-root users # can enter the namespace. # If so, it calls AC_DEFINE(HAVE_UTS_NAMESPACE). +# +# Copyright (C) The c-ares team +# SPDX-License-Identifier: MIT AC_DEFUN([AX_CHECK_UTS_NAMESPACE],[dnl AC_CACHE_CHECK([whether UTS namespaces are supported], @@ -55,9 +58,9 @@ int main() { pid_t child = clone(fn, st + 1024*1024, CLONE_NEWUSER|SIGCHLD, 0); if (child < 0) return 1; - sprintf(buffer, "/proc/%d/uid_map", child); + snprintf(buffer, sizeof(buffer), "/proc/%d/uid_map", child); fd = open(buffer, O_CREAT|O_WRONLY|O_TRUNC, 0755); - sprintf(buffer, "0 %d 1\n", getuid()); + snprintf(buffer, sizeof(buffer), "0 %d 1\n", getuid()); write(fd, buffer, strlen(buffer)); close(fd); diff --git a/lib/c-ares-1.19.1/m4/ax_code_coverage.m4 b/lib/c-ares-1.23.0/m4/ax_code_coverage.m4 similarity index 100% rename from lib/c-ares-1.19.1/m4/ax_code_coverage.m4 rename to lib/c-ares-1.23.0/m4/ax_code_coverage.m4 diff --git a/lib/c-ares-1.19.1/m4/ax_cxx_compile_stdcxx.m4 b/lib/c-ares-1.23.0/m4/ax_cxx_compile_stdcxx.m4 similarity index 100% rename from lib/c-ares-1.19.1/m4/ax_cxx_compile_stdcxx.m4 rename to lib/c-ares-1.23.0/m4/ax_cxx_compile_stdcxx.m4 diff --git a/lib/c-ares-1.19.1/m4/ax_cxx_compile_stdcxx_11.m4 b/lib/c-ares-1.23.0/m4/ax_cxx_compile_stdcxx_11.m4 similarity index 100% rename from lib/c-ares-1.19.1/m4/ax_cxx_compile_stdcxx_11.m4 rename to lib/c-ares-1.23.0/m4/ax_cxx_compile_stdcxx_11.m4 diff --git a/lib/c-ares-1.19.1/m4/ax_file_escapes.m4 b/lib/c-ares-1.23.0/m4/ax_file_escapes.m4 similarity index 100% rename from lib/c-ares-1.19.1/m4/ax_file_escapes.m4 rename to lib/c-ares-1.23.0/m4/ax_file_escapes.m4 diff --git a/lib/c-ares-1.19.1/m4/ax_pthread.m4 b/lib/c-ares-1.23.0/m4/ax_pthread.m4 similarity index 100% rename from lib/c-ares-1.19.1/m4/ax_pthread.m4 rename to lib/c-ares-1.23.0/m4/ax_pthread.m4 diff --git a/lib/c-ares-1.19.1/m4/ax_require_defined.m4 b/lib/c-ares-1.23.0/m4/ax_require_defined.m4 similarity index 100% rename from lib/c-ares-1.19.1/m4/ax_require_defined.m4 rename to lib/c-ares-1.23.0/m4/ax_require_defined.m4 diff --git a/lib/c-ares-1.19.1/m4/cares-compilers.m4 b/lib/c-ares-1.23.0/m4/cares-compilers.m4 similarity index 94% rename from lib/c-ares-1.19.1/m4/cares-compilers.m4 rename to lib/c-ares-1.23.0/m4/cares-compilers.m4 index a5b1e2b182b..ffce9816503 100644 --- a/lib/c-ares-1.19.1/m4/cares-compilers.m4 +++ b/lib/c-ares-1.23.0/m4/cares-compilers.m4 @@ -1,6 +1,6 @@ #*************************************************************************** # -# Copyright (C) 2009 - 2021 by Daniel Stenberg et al +# Copyright (C) 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 @@ -12,6 +12,7 @@ # suitability of this software for any purpose. It is provided "as is" # without express or implied warranty. # +# SPDX-License-Identifier: MIT #*************************************************************************** # File version for 'aclocal' use. Keep it a single number. @@ -851,27 +852,13 @@ AC_DEFUN([CARES_SET_COMPILER_WARNING_OPTS], [ # if test "$want_warnings" = "yes"; then tmp_CFLAGS="$tmp_CFLAGS -pedantic" - tmp_CFLAGS="$tmp_CFLAGS -Wall -Wextra" - tmp_CFLAGS="$tmp_CFLAGS -Wpointer-arith -Wwrite-strings" - tmp_CFLAGS="$tmp_CFLAGS -Wshadow" - tmp_CFLAGS="$tmp_CFLAGS -Winline -Wnested-externs" - tmp_CFLAGS="$tmp_CFLAGS -Wmissing-declarations" - tmp_CFLAGS="$tmp_CFLAGS -Wmissing-prototypes" + tmp_CFLAGS="$tmp_CFLAGS -Winline" tmp_CFLAGS="$tmp_CFLAGS -Wno-long-long" - tmp_CFLAGS="$tmp_CFLAGS -Wfloat-equal" tmp_CFLAGS="$tmp_CFLAGS -Wno-multichar -Wsign-compare" - tmp_CFLAGS="$tmp_CFLAGS -Wundef" tmp_CFLAGS="$tmp_CFLAGS -Wno-format-nonliteral" - tmp_CFLAGS="$tmp_CFLAGS -Wendif-labels -Wstrict-prototypes" - tmp_CFLAGS="$tmp_CFLAGS -Wdeclaration-after-statement" - tmp_CFLAGS="$tmp_CFLAGS -Wcast-align" + tmp_CFLAGS="$tmp_CFLAGS -Wendif-labels" tmp_CFLAGS="$tmp_CFLAGS -Wno-system-headers" tmp_CFLAGS="$tmp_CFLAGS -Wshorten-64-to-32" - # - dnl Only clang 1.1 or later - if test "$compiler_num" -ge "101"; then - tmp_CFLAGS="$tmp_CFLAGS -Wunused" - fi fi ;; # @@ -895,25 +882,14 @@ AC_DEFUN([CARES_SET_COMPILER_WARNING_OPTS], [ fi # dnl Set of options we believe *ALL* gcc versions support: - tmp_CFLAGS="$tmp_CFLAGS -Wall -W" - # - dnl Only gcc 1.4 or later - if test "$compiler_num" -ge "104"; then - tmp_CFLAGS="$tmp_CFLAGS -Wpointer-arith -Wwrite-strings" - dnl If not cross-compiling with a gcc older than 3.0 - if test "x$cross_compiling" != "xyes" || - test "$compiler_num" -ge "300"; then - tmp_CFLAGS="$tmp_CFLAGS -Wunused -Wshadow" - fi - fi + tmp_CFLAGS="$tmp_CFLAGS -W" # dnl Only gcc 2.7 or later if test "$compiler_num" -ge "207"; then - tmp_CFLAGS="$tmp_CFLAGS -Winline -Wnested-externs" + tmp_CFLAGS="$tmp_CFLAGS -Winline" dnl If not cross-compiling with a gcc older than 3.0 if test "x$cross_compiling" != "xyes" || test "$compiler_num" -ge "300"; then - tmp_CFLAGS="$tmp_CFLAGS -Wmissing-declarations" tmp_CFLAGS="$tmp_CFLAGS -Wmissing-prototypes" fi fi @@ -925,12 +901,7 @@ AC_DEFUN([CARES_SET_COMPILER_WARNING_OPTS], [ # dnl Only gcc 2.96 or later if test "$compiler_num" -ge "296"; then - tmp_CFLAGS="$tmp_CFLAGS -Wfloat-equal" tmp_CFLAGS="$tmp_CFLAGS -Wno-multichar -Wsign-compare" - dnl -Wundef used only if gcc is 2.96 or later since we get - dnl lots of "`_POSIX_C_SOURCE' is not defined" in system - dnl headers with gcc 2.95.4 on FreeBSD 4.9 - tmp_CFLAGS="$tmp_CFLAGS -Wundef" fi # dnl Only gcc 2.97 or later @@ -949,12 +920,7 @@ AC_DEFUN([CARES_SET_COMPILER_WARNING_OPTS], [ # dnl Only gcc 3.3 or later if test "$compiler_num" -ge "303"; then - tmp_CFLAGS="$tmp_CFLAGS -Wendif-labels -Wstrict-prototypes" - fi - # - dnl Only gcc 3.4 or later - if test "$compiler_num" -ge "304"; then - tmp_CFLAGS="$tmp_CFLAGS -Wdeclaration-after-statement" + tmp_CFLAGS="$tmp_CFLAGS -Wendif-labels" fi # dnl Only gcc 4.0 or later @@ -962,17 +928,12 @@ AC_DEFUN([CARES_SET_COMPILER_WARNING_OPTS], [ tmp_CFLAGS="$tmp_CFLAGS -Wstrict-aliasing=3" fi # - dnl Only gcc 4.2 or later - if test "$compiler_num" -ge "402"; then - tmp_CFLAGS="$tmp_CFLAGS -Wcast-align" - fi - # dnl Only gcc 4.3 or later if test "$compiler_num" -ge "403"; then tmp_CFLAGS="$tmp_CFLAGS -Wtype-limits -Wold-style-declaration" tmp_CFLAGS="$tmp_CFLAGS -Wmissing-parameter-type -Wempty-body" tmp_CFLAGS="$tmp_CFLAGS -Wclobbered -Wignored-qualifiers" - tmp_CFLAGS="$tmp_CFLAGS -Wconversion -Wno-sign-conversion -Wvla" + tmp_CFLAGS="$tmp_CFLAGS -Wno-sign-conversion" fi # dnl Only gcc 4.5 or later @@ -1024,7 +985,7 @@ AC_DEFUN([CARES_SET_COMPILER_WARNING_OPTS], [ if test "$want_warnings" = "yes"; then if test "$compiler_num" -gt "600"; then dnl Show errors, warnings, and remarks - tmp_CPPFLAGS="$tmp_CPPFLAGS -Wall -w2" + tmp_CPPFLAGS="$tmp_CPPFLAGS -w2" dnl Perform extra compile-time code checking tmp_CPPFLAGS="$tmp_CPPFLAGS -Wcheck" dnl Warn on nested comments @@ -1035,12 +996,8 @@ AC_DEFUN([CARES_SET_COMPILER_WARNING_OPTS], [ tmp_CPPFLAGS="$tmp_CPPFLAGS -Wmissing-prototypes" dnl Enable warnings for 64-bit portability issues tmp_CPPFLAGS="$tmp_CPPFLAGS -Wp64" - dnl Enable warnings for questionable pointer arithmetic - tmp_CPPFLAGS="$tmp_CPPFLAGS -Wpointer-arith" dnl Check for function return typw issues tmp_CPPFLAGS="$tmp_CPPFLAGS -Wreturn-type" - dnl Warn on variable declarations hiding a previous one - tmp_CPPFLAGS="$tmp_CPPFLAGS -Wshadow" dnl Warn when a variable is used before initialized tmp_CPPFLAGS="$tmp_CPPFLAGS -Wuninitialized" dnl Warn if a declared function is not used @@ -1108,9 +1065,7 @@ AC_DEFUN([CARES_SET_COMPILER_WARNING_OPTS], [ # if test "$want_warnings" = "yes"; then dnl Activate all warnings - tmp_CFLAGS="$tmp_CFLAGS -Wall" - dnl Make string constants be of type const char * - tmp_CFLAGS="$tmp_CFLAGS -Wwrite-strings" + tmp_CFLAGS="$tmp_CFLAGS" dnl Warn use of unsupported GCC features ignored by TCC tmp_CFLAGS="$tmp_CFLAGS -Wunsupported" fi @@ -1120,7 +1075,7 @@ AC_DEFUN([CARES_SET_COMPILER_WARNING_OPTS], [ # if test "$want_warnings" = "yes"; then dnl Issue all warnings - tmp_CFLAGS="$tmp_CFLAGS -Wall -Wextra" + tmp_CFLAGS="$tmp_CFLAGS" fi ;; # diff --git a/lib/c-ares-1.19.1/m4/cares-confopts.m4 b/lib/c-ares-1.23.0/m4/cares-confopts.m4 similarity index 97% rename from lib/c-ares-1.19.1/m4/cares-confopts.m4 rename to lib/c-ares-1.23.0/m4/cares-confopts.m4 index 78af64bffe1..1a42eb3b72b 100644 --- a/lib/c-ares-1.19.1/m4/cares-confopts.m4 +++ b/lib/c-ares-1.23.0/m4/cares-confopts.m4 @@ -1,6 +1,6 @@ #*************************************************************************** # -# Copyright (C) 2008 - 2013 by Daniel Stenberg et al +# Copyright (C) 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 @@ -12,6 +12,7 @@ # suitability of this software for any purpose. It is provided "as is" # without express or implied warranty. # +# SPDX-License-Identifier: MIT #*************************************************************************** # File version for 'aclocal' use. Keep it a single number. @@ -228,21 +229,16 @@ AC_DEFUN([CARES_CHECK_OPTION_WARNINGS], [ AC_BEFORE([$0],[CARES_CHECK_OPTION_WERROR])dnl AC_BEFORE([$0],[XC_CHECK_PROG_CC])dnl AC_MSG_CHECKING([whether to enable strict compiler warnings]) - OPT_COMPILER_WARNINGS="default" + OPT_COMPILER_WARNINGS="yes" AC_ARG_ENABLE(warnings, AS_HELP_STRING([--enable-warnings],[Enable strict compiler warnings]) AS_HELP_STRING([--disable-warnings],[Disable strict compiler warnings]), - OPT_COMPILER_WARNINGS=$enableval) + OPT_COMPILER_WARNINGS=yes) case "$OPT_COMPILER_WARNINGS" in no) dnl --disable-warnings option used want_warnings="no" ;; - default) - dnl configure option not specified, so - dnl use same setting as --enable-debug - want_warnings="$want_debug" - ;; *) dnl --enable-warnings option used want_warnings="yes" diff --git a/lib/c-ares-1.19.1/m4/cares-functions.m4 b/lib/c-ares-1.23.0/m4/cares-functions.m4 similarity index 95% rename from lib/c-ares-1.19.1/m4/cares-functions.m4 rename to lib/c-ares-1.23.0/m4/cares-functions.m4 index d4f4f994c6f..84bca23fab6 100644 --- a/lib/c-ares-1.19.1/m4/cares-functions.m4 +++ b/lib/c-ares-1.23.0/m4/cares-functions.m4 @@ -1,6 +1,6 @@ #*************************************************************************** # -# Copyright (C) 2008 - 2012 by Daniel Stenberg et al +# Copyright (C) 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 @@ -12,6 +12,7 @@ # suitability of this software for any purpose. It is provided "as is" # without express or implied warranty. # +# SPDX-License-Identifier: MIT #*************************************************************************** # File version for 'aclocal' use. Keep it a single number. @@ -186,6 +187,24 @@ cares_includes_stropts="\ ]) +dnl CARES_INCLUDES_SYS_RANDOM +dnl ------------------------------------------------- +dnl Set up variable with list of headers that must be +dnl included when sys/random.h is to be included. + +AC_DEFUN([CARES_INCLUDES_SYS_RANDOM], [ +cares_includes_sys_random="\ +/* includes start */ +#ifdef HAVE_SYS_RANDOM_H +# include +#endif +/* includes end */" + AC_CHECK_HEADERS( + sys/random.h, + [], [], [$cares_includes_sys_random]) +]) + + dnl CARES_INCLUDES_SYS_SOCKET dnl ------------------------------------------------- dnl Set up variable with list of headers that must be @@ -246,6 +265,26 @@ cares_includes_sys_uio="\ ]) +dnl CARES_INCLUDES_SYS_STAT +dnl ------------------------------------------------- +dnl Set up variable with list of headers that must be +dnl included when sys/stat.h is to be included. + +AC_DEFUN([CARES_INCLUDES_SYS_STAT], [ +cares_includes_sys_stat="\ +/* includes start */ +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +/* includes end */" + AC_CHECK_HEADERS( + sys/types.h sys/stat.h, + [], [], [$cares_includes_sys_stat]) +]) + dnl CARES_INCLUDES_UNISTD dnl ------------------------------------------------- dnl Set up variable with list of headers that must be @@ -1520,6 +1559,90 @@ AC_DEFUN([CARES_CHECK_FUNC_GETHOSTNAME], [ fi ]) +dnl CARES_CHECK_FUNC_GETRANDOM +dnl ------------------------------------------------- +dnl Verify if getrandom 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_getrandom, then +dnl HAVE_GETRANDOM will be defined. + +AC_DEFUN([CARES_CHECK_FUNC_GETRANDOM], [ + AC_REQUIRE([CARES_INCLUDES_SYS_RANDOM])dnl + # + tst_links_getrandom="unknown" + tst_proto_getrandom="unknown" + tst_compi_getrandom="unknown" + tst_allow_getrandom="unknown" + # + AC_MSG_CHECKING([if getrandom can be linked]) + AC_LINK_IFELSE([ + AC_LANG_FUNC_LINK_TRY([getrandom]) + ],[ + AC_MSG_RESULT([yes]) + tst_links_getrandom="yes" + ],[ + AC_MSG_RESULT([no]) + tst_links_getrandom="no" + ]) + # + if test "$tst_links_getrandom" = "yes"; then + AC_MSG_CHECKING([if getrandom is prototyped]) + AC_EGREP_CPP([getrandom],[ + $cares_includes_sys_random + ],[ + AC_MSG_RESULT([yes]) + tst_proto_getrandom="yes" + ],[ + AC_MSG_RESULT([no]) + tst_proto_getrandom="no" + ]) + fi + # + if test "$tst_proto_getrandom" = "yes"; then + AC_MSG_CHECKING([if getrandom is compilable]) + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ + $cares_includes_sys_random + ]],[[ + if(0 != getrandom(0, 0, 0)) + return 1; + ]]) + ],[ + AC_MSG_RESULT([yes]) + tst_compi_getrandom="yes" + ],[ + AC_MSG_RESULT([no]) + tst_compi_getrandom="no" + ]) + fi + # + if test "$tst_compi_getrandom" = "yes"; then + AC_MSG_CHECKING([if getrandom usage allowed]) + if test "x$cares_disallow_getrandom" != "xyes"; then + AC_MSG_RESULT([yes]) + tst_allow_getrandom="yes" + else + AC_MSG_RESULT([no]) + tst_allow_getrandom="no" + fi + fi + # + AC_MSG_CHECKING([if getrandom might be used]) + if test "$tst_links_getrandom" = "yes" && + test "$tst_proto_getrandom" = "yes" && + test "$tst_compi_getrandom" = "yes" && + test "$tst_allow_getrandom" = "yes"; then + AC_MSG_RESULT([yes]) + AC_DEFINE_UNQUOTED(HAVE_GETRANDOM, 1, + [Define to 1 if you have the getrandom function.]) + ac_cv_func_getrandom="yes" + else + AC_MSG_RESULT([no]) + ac_cv_func_getrandom="no" + fi +]) + dnl CARES_CHECK_FUNC_GETSERVBYPORT_R dnl ------------------------------------------------- @@ -3754,6 +3877,91 @@ AC_DEFUN([CARES_CHECK_FUNC_WRITEV], [ fi ]) +dnl CARES_CHECK_FUNC_STAT +dnl ------------------------------------------------- +dnl Verify if stat 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_stat, then +dnl HAVE_STAT will be defined. + +AC_DEFUN([CARES_CHECK_FUNC_STAT], [ + AC_REQUIRE([CARES_INCLUDES_SYS_STAT])dnl + # + tst_links_stat="unknown" + tst_proto_stat="unknown" + tst_compi_stat="unknown" + tst_allow_stat="unknown" + # + AC_MSG_CHECKING([if stat can be linked]) + AC_LINK_IFELSE([ + AC_LANG_FUNC_LINK_TRY([stat]) + ],[ + AC_MSG_RESULT([yes]) + tst_links_stat="yes" + ],[ + AC_MSG_RESULT([no]) + tst_links_stat="no" + ]) + # + if test "$tst_links_stat" = "yes"; then + AC_MSG_CHECKING([if stat is prototyped]) + AC_EGREP_CPP([stat],[ + $cares_includes_sys_stat + ],[ + AC_MSG_RESULT([yes]) + tst_proto_stat="yes" + ],[ + AC_MSG_RESULT([no]) + tst_proto_stat="no" + ]) + fi + # + if test "$tst_proto_stat" = "yes"; then + AC_MSG_CHECKING([if stat is compilable]) + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ + $cares_includes_sys_types + $cares_includes_sys_stat + ]],[[ + if(0 != stat(0, 0)) + return 1; + ]]) + ],[ + AC_MSG_RESULT([yes]) + tst_compi_stat="yes" + ],[ + AC_MSG_RESULT([no]) + tst_compi_stat="no" + ]) + fi + # + if test "$tst_compi_stat" = "yes"; then + AC_MSG_CHECKING([if stat usage allowed]) + if test "x$cares_disallow_stat" != "xyes"; then + AC_MSG_RESULT([yes]) + tst_allow_stat="yes" + else + AC_MSG_RESULT([no]) + tst_allow_stat="no" + fi + fi + # + AC_MSG_CHECKING([if stat might be used]) + if test "$tst_links_stat" = "yes" && + test "$tst_proto_stat" = "yes" && + test "$tst_compi_stat" = "yes" && + test "$tst_allow_stat" = "yes"; then + AC_MSG_RESULT([yes]) + AC_DEFINE_UNQUOTED(HAVE_STAT, 1, + [Define to 1 if you have the stat function.]) + ac_cv_func_stat="yes" + else + AC_MSG_RESULT([no]) + ac_cv_func_stat="no" + fi +]) + dnl CARES_CHECK_FUNC_ARC4RANDOM_BUF dnl ------------------------------------------------- dnl Verify if arc4random_buf is available, prototyped, and diff --git a/lib/c-ares-1.19.1/m4/cares-reentrant.m4 b/lib/c-ares-1.23.0/m4/cares-reentrant.m4 similarity index 99% rename from lib/c-ares-1.19.1/m4/cares-reentrant.m4 rename to lib/c-ares-1.23.0/m4/cares-reentrant.m4 index 052326b3c0e..2a16fb22117 100644 --- a/lib/c-ares-1.19.1/m4/cares-reentrant.m4 +++ b/lib/c-ares-1.23.0/m4/cares-reentrant.m4 @@ -1,7 +1,5 @@ #*************************************************************************** -# $Id$ -# -# Copyright (C) 2008 - 2009 by Daniel Stenberg et al +# Copyright (C) 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 @@ -13,6 +11,7 @@ # suitability of this software for any purpose. It is provided "as is" # without express or implied warranty. # +# SPDX-License-Identifier: MIT #*************************************************************************** # File version for 'aclocal' use. Keep it a single number. diff --git a/lib/c-ares-1.19.1/m4/libtool.m4 b/lib/c-ares-1.23.0/m4/libtool.m4 similarity index 100% rename from lib/c-ares-1.19.1/m4/libtool.m4 rename to lib/c-ares-1.23.0/m4/libtool.m4 diff --git a/lib/c-ares-1.19.1/m4/ltoptions.m4 b/lib/c-ares-1.23.0/m4/ltoptions.m4 similarity index 100% rename from lib/c-ares-1.19.1/m4/ltoptions.m4 rename to lib/c-ares-1.23.0/m4/ltoptions.m4 diff --git a/lib/c-ares-1.19.1/m4/ltsugar.m4 b/lib/c-ares-1.23.0/m4/ltsugar.m4 similarity index 100% rename from lib/c-ares-1.19.1/m4/ltsugar.m4 rename to lib/c-ares-1.23.0/m4/ltsugar.m4 diff --git a/lib/c-ares-1.19.1/m4/ltversion.m4 b/lib/c-ares-1.23.0/m4/ltversion.m4 similarity index 100% rename from lib/c-ares-1.19.1/m4/ltversion.m4 rename to lib/c-ares-1.23.0/m4/ltversion.m4 diff --git a/lib/c-ares-1.19.1/m4/lt~obsolete.m4 b/lib/c-ares-1.23.0/m4/lt~obsolete.m4 similarity index 100% rename from lib/c-ares-1.19.1/m4/lt~obsolete.m4 rename to lib/c-ares-1.23.0/m4/lt~obsolete.m4 diff --git a/lib/c-ares-1.19.1/m4/xc-am-iface.m4 b/lib/c-ares-1.23.0/m4/xc-am-iface.m4 similarity index 98% rename from lib/c-ares-1.19.1/m4/xc-am-iface.m4 rename to lib/c-ares-1.23.0/m4/xc-am-iface.m4 index 1571c211fb4..80c53b61822 100644 --- a/lib/c-ares-1.19.1/m4/xc-am-iface.m4 +++ b/lib/c-ares-1.23.0/m4/xc-am-iface.m4 @@ -2,7 +2,7 @@ # # xc-am-iface.m4 # -# Copyright (c) 2013 Daniel Stenberg +# Copyright (c) Daniel Stenberg # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above @@ -16,6 +16,7 @@ # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # +# SPDX-License-Identifier: MIT #--------------------------------------------------------------------------- # serial 1 diff --git a/lib/c-ares-1.19.1/m4/xc-cc-check.m4 b/lib/c-ares-1.23.0/m4/xc-cc-check.m4 similarity index 97% rename from lib/c-ares-1.19.1/m4/xc-cc-check.m4 rename to lib/c-ares-1.23.0/m4/xc-cc-check.m4 index 777decf2983..cfa201ac9dc 100644 --- a/lib/c-ares-1.19.1/m4/xc-cc-check.m4 +++ b/lib/c-ares-1.23.0/m4/xc-cc-check.m4 @@ -2,7 +2,7 @@ # # xc-cc-check.m4 # -# Copyright (c) 2013 Daniel Stenberg +# Copyright (c) Daniel Stenberg # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above @@ -16,6 +16,7 @@ # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # +# SPDX-License-Identifier: MIT #--------------------------------------------------------------------------- # serial 1 diff --git a/lib/c-ares-1.19.1/m4/xc-lt-iface.m4 b/lib/c-ares-1.23.0/m4/xc-lt-iface.m4 similarity index 99% rename from lib/c-ares-1.19.1/m4/xc-lt-iface.m4 rename to lib/c-ares-1.23.0/m4/xc-lt-iface.m4 index 0b90d5f25f0..f8a6c125ff8 100644 --- a/lib/c-ares-1.19.1/m4/xc-lt-iface.m4 +++ b/lib/c-ares-1.23.0/m4/xc-lt-iface.m4 @@ -2,7 +2,7 @@ # # xc-lt-iface.m4 # -# Copyright (c) 2013 Daniel Stenberg +# Copyright (c) Daniel Stenberg # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above @@ -16,6 +16,8 @@ # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # +# +# SPDX-License-Identifier: MIT #--------------------------------------------------------------------------- # serial 1 diff --git a/lib/c-ares-1.19.1/m4/xc-translit.m4 b/lib/c-ares-1.23.0/m4/xc-translit.m4 similarity index 98% rename from lib/c-ares-1.19.1/m4/xc-translit.m4 rename to lib/c-ares-1.23.0/m4/xc-translit.m4 index 1918f168408..db8ca82137a 100644 --- a/lib/c-ares-1.19.1/m4/xc-translit.m4 +++ b/lib/c-ares-1.23.0/m4/xc-translit.m4 @@ -2,7 +2,7 @@ # # xc-translit.m4 # -# Copyright (c) 2011 Daniel Stenberg +# Copyright (c) Daniel Stenberg # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above @@ -16,6 +16,8 @@ # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # +# +# SPDX-License-Identifier: MIT #--------------------------------------------------------------------------- # File version for 'aclocal' use. Keep it a single number. diff --git a/lib/c-ares-1.19.1/m4/xc-val-flgs.m4 b/lib/c-ares-1.23.0/m4/xc-val-flgs.m4 similarity index 98% rename from lib/c-ares-1.19.1/m4/xc-val-flgs.m4 rename to lib/c-ares-1.23.0/m4/xc-val-flgs.m4 index 81d1eac9e3b..c9e472e6ae9 100644 --- a/lib/c-ares-1.19.1/m4/xc-val-flgs.m4 +++ b/lib/c-ares-1.23.0/m4/xc-val-flgs.m4 @@ -2,7 +2,7 @@ # # xc-val-flgs.m4 # -# Copyright (c) 2013 Daniel Stenberg +# Copyright (c) Daniel Stenberg # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above @@ -16,6 +16,8 @@ # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # +# +# SPDX-License-Identifier: MIT #--------------------------------------------------------------------------- # serial 1 diff --git a/lib/c-ares-1.19.1/m4/zz40-xc-ovr.m4 b/lib/c-ares-1.23.0/m4/zz40-xc-ovr.m4 similarity index 99% rename from lib/c-ares-1.19.1/m4/zz40-xc-ovr.m4 rename to lib/c-ares-1.23.0/m4/zz40-xc-ovr.m4 index 0e3b1cba61e..4183347924e 100644 --- a/lib/c-ares-1.19.1/m4/zz40-xc-ovr.m4 +++ b/lib/c-ares-1.23.0/m4/zz40-xc-ovr.m4 @@ -2,7 +2,7 @@ # # zz40-xc-ovr.m4 # -# Copyright (c) 2013 Daniel Stenberg +# Copyright (c) Daniel Stenberg # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above @@ -16,6 +16,7 @@ # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # +# SPDX-License-Identifier: MIT #--------------------------------------------------------------------------- # serial 1 diff --git a/lib/c-ares-1.19.1/maketgz b/lib/c-ares-1.23.0/maketgz similarity index 95% rename from lib/c-ares-1.19.1/maketgz rename to lib/c-ares-1.23.0/maketgz index ec1ecea540a..e97230b2da1 100755 --- a/lib/c-ares-1.19.1/maketgz +++ b/lib/c-ares-1.23.0/maketgz @@ -1,4 +1,6 @@ #!/usr/bin/env perl +# Copyright (C) Daniel Stenberg +# SPDX-License-Identifier: MIT $version = $ARGV[0]; @@ -58,7 +60,7 @@ print "produce CHANGES\n"; print "running make dist\n"; `make dist VERSION=$version`; -# remove temporay sourced man pages +# remove temporary sourced man pages `make -s clean-sourced-manpages`; print "removing temporary configure.ac file\n"; diff --git a/lib/c-ares-1.19.1/missing b/lib/c-ares-1.23.0/missing similarity index 100% rename from lib/c-ares-1.19.1/missing rename to lib/c-ares-1.23.0/missing diff --git a/lib/c-ares-1.19.1/msvc_ver.inc b/lib/c-ares-1.23.0/msvc_ver.inc similarity index 88% rename from lib/c-ares-1.19.1/msvc_ver.inc rename to lib/c-ares-1.23.0/msvc_ver.inc index 595cbdf1dea..61bdb59ae2c 100644 --- a/lib/c-ares-1.19.1/msvc_ver.inc +++ b/lib/c-ares-1.23.0/msvc_ver.inc @@ -1,3 +1,5 @@ +# Copyright (C) The c-ares project and its contributors +# SPDX-License-Identifier: MIT # ----------------------------------------------- # Detect NMAKE version deducing old MSVC versions # ----------------------------------------------- diff --git a/lib/c-ares-1.23.0/src/CMakeLists.txt b/lib/c-ares-1.23.0/src/CMakeLists.txt new file mode 100644 index 00000000000..b8ea0a17740 --- /dev/null +++ b/lib/c-ares-1.23.0/src/CMakeLists.txt @@ -0,0 +1,4 @@ +# Copyright (C) The c-ares project and its contributors +# SPDX-License-Identifier: MIT +ADD_SUBDIRECTORY (lib) +ADD_SUBDIRECTORY (tools) diff --git a/lib/c-ares-1.23.0/src/Makefile.am b/lib/c-ares-1.23.0/src/Makefile.am new file mode 100644 index 00000000000..896dd62e408 --- /dev/null +++ b/lib/c-ares-1.23.0/src/Makefile.am @@ -0,0 +1,4 @@ +# Copyright (C) The c-ares project and its contributors +# SPDX-License-Identifier: MIT +EXTRA_DIST=CMakeLists.txt +SUBDIRS=lib tools diff --git a/lib/c-ares-1.19.1/src/Makefile.in b/lib/c-ares-1.23.0/src/Makefile.in similarity index 97% rename from lib/c-ares-1.19.1/src/Makefile.in rename to lib/c-ares-1.23.0/src/Makefile.in index 6aa63b002ad..466d58bbe33 100644 --- a/lib/c-ares-1.19.1/src/Makefile.in +++ b/lib/c-ares-1.23.0/src/Makefile.in @@ -93,11 +93,15 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_ac_append_to_file.m4 \ $(top_srcdir)/m4/ax_ac_print_to_file.m4 \ $(top_srcdir)/m4/ax_add_am_macro_static.m4 \ $(top_srcdir)/m4/ax_am_macros_static.m4 \ + $(top_srcdir)/m4/ax_append_compile_flags.m4 \ + $(top_srcdir)/m4/ax_append_flag.m4 \ + $(top_srcdir)/m4/ax_check_compile_flag.m4 \ $(top_srcdir)/m4/ax_check_gnu_make.m4 \ $(top_srcdir)/m4/ax_code_coverage.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx_11.m4 \ $(top_srcdir)/m4/ax_file_escapes.m4 \ + $(top_srcdir)/m4/ax_pthread.m4 \ $(top_srcdir)/m4/ax_require_defined.m4 \ $(top_srcdir)/m4/cares-compilers.m4 \ $(top_srcdir)/m4/cares-confopts.m4 \ @@ -284,6 +288,10 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_CXX = @PTHREAD_CXX@ +PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ @@ -303,6 +311,7 @@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ +ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ @@ -347,6 +356,9 @@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ + +# Copyright (C) The c-ares project and its contributors +# SPDX-License-Identifier: MIT EXTRA_DIST = CMakeLists.txt SUBDIRS = lib tools all: all-recursive @@ -361,9 +373,9 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__confi exit 1;; \ esac; \ done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Makefile'; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \ $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --foreign src/Makefile + $(AUTOMAKE) --gnu src/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ diff --git a/lib/c-ares-1.19.1/src/lib/CMakeLists.txt b/lib/c-ares-1.23.0/src/lib/CMakeLists.txt similarity index 90% rename from lib/c-ares-1.19.1/src/lib/CMakeLists.txt rename to lib/c-ares-1.23.0/src/lib/CMakeLists.txt index 5cea0762827..373e1fbdaf5 100644 --- a/lib/c-ares-1.19.1/src/lib/CMakeLists.txt +++ b/lib/c-ares-1.23.0/src/lib/CMakeLists.txt @@ -1,3 +1,5 @@ +# Copyright (C) The c-ares project and its contributors +# SPDX-License-Identifier: MIT # Transform Makefile.inc transform_makefile_inc("Makefile.inc" "${PROJECT_BINARY_DIR}/src/lib/Makefile.inc.cmake") @@ -32,8 +34,16 @@ IF (CARES_SHARED) COMPILE_PDB_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} SOVERSION ${CARES_LIB_VERSION_MAJOR} VERSION "${CARES_LIB_VERSION_MAJOR}.${CARES_LIB_VERSION_MINOR}.${CARES_LIB_VERSION_RELEASE}" + C_STANDARD 90 ) + IF (CARES_SYMBOL_HIDING) + SET_TARGET_PROPERTIES (${PROJECT_NAME} PROPERTIES + C_VISIBILITY_PRESET hidden + VISIBILITY_INLINES_HIDDEN YES + ) + ENDIF () + TARGET_INCLUDE_DIRECTORIES (${PROJECT_NAME} PUBLIC "$" "$" @@ -44,7 +54,10 @@ IF (CARES_SHARED) TARGET_COMPILE_DEFINITIONS (${PROJECT_NAME} PRIVATE HAVE_CONFIG_H=1 CARES_BUILDING_LIBRARY) - TARGET_LINK_LIBRARIES (${PROJECT_NAME} PUBLIC ${CARES_DEPENDENT_LIBS}) + TARGET_LINK_LIBRARIES (${PROJECT_NAME} + PUBLIC ${CARES_DEPENDENT_LIBS} + PRIVATE ${CMAKE_THREAD_LIBS_INIT} + ) IF (CARES_INSTALL) INSTALL (TARGETS ${PROJECT_NAME} @@ -76,6 +89,7 @@ IF (CARES_STATIC) OUTPUT_NAME cares${STATIC_SUFFIX} COMPILE_PDB_NAME cares${STATIC_SUFFIX} COMPILE_PDB_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} + C_STANDARD 90 ) IF (CARES_STATIC_PIC) diff --git a/lib/c-ares-1.19.1/src/lib/Makefile.am b/lib/c-ares-1.23.0/src/lib/Makefile.am similarity index 95% rename from lib/c-ares-1.19.1/src/lib/Makefile.am rename to lib/c-ares-1.23.0/src/lib/Makefile.am index 4813621ce23..998996b1eef 100644 --- a/lib/c-ares-1.19.1/src/lib/Makefile.am +++ b/lib/c-ares-1.23.0/src/lib/Makefile.am @@ -1,3 +1,5 @@ +# Copyright (C) The c-ares project and its contributors +# SPDX-License-Identifier: MIT AUTOMAKE_OPTIONS = foreign subdir-objects nostdinc 1.9.6 ACLOCAL_AMFLAGS = -I m4 --install diff --git a/lib/c-ares-1.19.1/src/lib/Makefile.in b/lib/c-ares-1.23.0/src/lib/Makefile.in similarity index 81% rename from lib/c-ares-1.19.1/src/lib/Makefile.in rename to lib/c-ares-1.23.0/src/lib/Makefile.in index f1ed8a0b0c5..c785a142801 100644 --- a/lib/c-ares-1.19.1/src/lib/Makefile.in +++ b/lib/c-ares-1.23.0/src/lib/Makefile.in @@ -15,7 +15,10 @@ @SET_MAKE@ # aminclude_static.am generated automatically by Autoconf -# from AX_AM_MACROS_STATIC on Mon May 22 13:34:17 CEST 2023 +# from AX_AM_MACROS_STATIC on Thu Nov 30 13:39:00 CET 2023 + +# Copyright (C) The c-ares project and its contributors +# SPDX-License-Identifier: MIT VPATH = @srcdir@ am__is_gnu_make = { \ @@ -104,11 +107,15 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_ac_append_to_file.m4 \ $(top_srcdir)/m4/ax_ac_print_to_file.m4 \ $(top_srcdir)/m4/ax_add_am_macro_static.m4 \ $(top_srcdir)/m4/ax_am_macros_static.m4 \ + $(top_srcdir)/m4/ax_append_compile_flags.m4 \ + $(top_srcdir)/m4/ax_append_flag.m4 \ + $(top_srcdir)/m4/ax_check_compile_flag.m4 \ $(top_srcdir)/m4/ax_check_gnu_make.m4 \ $(top_srcdir)/m4/ax_code_coverage.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx_11.m4 \ $(top_srcdir)/m4/ax_file_escapes.m4 \ + $(top_srcdir)/m4/ax_pthread.m4 \ $(top_srcdir)/m4/ax_require_defined.m4 \ $(top_srcdir)/m4/cares-compilers.m4 \ $(top_srcdir)/m4/cares-confopts.m4 \ @@ -163,15 +170,20 @@ LTLIBRARIES = $(lib_LTLIBRARIES) libcares_la_LIBADD = am__objects_1 = libcares_la-ares__addrinfo2hostent.lo \ libcares_la-ares__addrinfo_localhost.lo \ - libcares_la-ares__close_sockets.lo \ - libcares_la-ares__get_hostent.lo \ + libcares_la-ares__buf.lo libcares_la-ares__close_sockets.lo \ + libcares_la-ares__hosts_file.lo libcares_la-ares__htable.lo \ + libcares_la-ares__htable_asvp.lo \ + libcares_la-ares__htable_strvp.lo \ + libcares_la-ares__htable_szvp.lo libcares_la-ares__llist.lo \ libcares_la-ares__parse_into_addrinfo.lo \ - libcares_la-ares__readaddrinfo.lo \ - libcares_la-ares__sortaddrinfo.lo \ - libcares_la-ares__read_line.lo libcares_la-ares__timeval.lo \ + libcares_la-ares__read_line.lo libcares_la-ares__slist.lo \ + libcares_la-ares__socket.lo libcares_la-ares__sortaddrinfo.lo \ + libcares_la-ares__threads.lo libcares_la-ares__timeval.lo \ libcares_la-ares_android.lo libcares_la-ares_cancel.lo \ libcares_la-ares_data.lo libcares_la-ares_destroy.lo \ - libcares_la-ares_expand_name.lo \ + libcares_la-ares_dns_mapping.lo libcares_la-ares_dns_name.lo \ + libcares_la-ares_dns_parse.lo libcares_la-ares_dns_record.lo \ + libcares_la-ares_dns_write.lo libcares_la-ares_expand_name.lo \ libcares_la-ares_expand_string.lo libcares_la-ares_fds.lo \ libcares_la-ares_free_hostent.lo \ libcares_la-ares_free_string.lo \ @@ -181,9 +193,9 @@ am__objects_1 = libcares_la-ares__addrinfo2hostent.lo \ libcares_la-ares_gethostbyname.lo \ libcares_la-ares_getnameinfo.lo libcares_la-ares_getsock.lo \ libcares_la-ares_init.lo libcares_la-ares_library_init.lo \ - libcares_la-ares_llist.lo libcares_la-ares_mkquery.lo \ - libcares_la-ares_create_query.lo libcares_la-ares_nowarn.lo \ - libcares_la-ares_options.lo libcares_la-ares_parse_a_reply.lo \ + libcares_la-ares_math.lo libcares_la-ares_mkquery.lo \ + libcares_la-ares_create_query.lo libcares_la-ares_options.lo \ + libcares_la-ares_parse_a_reply.lo \ libcares_la-ares_parse_aaaa_reply.lo \ libcares_la-ares_parse_caa_reply.lo \ libcares_la-ares_parse_mx_reply.lo \ @@ -195,12 +207,14 @@ am__objects_1 = libcares_la-ares__addrinfo2hostent.lo \ libcares_la-ares_parse_txt_reply.lo \ libcares_la-ares_parse_uri_reply.lo \ libcares_la-ares_platform.lo libcares_la-ares_process.lo \ - libcares_la-ares_query.lo libcares_la-ares_rand.lo \ - libcares_la-ares_search.lo libcares_la-ares_send.lo \ - libcares_la-ares_strcasecmp.lo libcares_la-ares_strdup.lo \ - libcares_la-ares_strerror.lo libcares_la-ares_strsplit.lo \ - libcares_la-ares_timeout.lo libcares_la-ares_version.lo \ - libcares_la-ares_writev.lo libcares_la-bitncmp.lo \ + libcares_la-ares_qcache.lo libcares_la-ares_query.lo \ + libcares_la-ares_rand.lo libcares_la-ares_search.lo \ + libcares_la-ares_send.lo libcares_la-ares_strcasecmp.lo \ + libcares_la-ares_str.lo libcares_la-ares_strerror.lo \ + libcares_la-ares_strsplit.lo libcares_la-ares_sysconfig.lo \ + libcares_la-ares_sysconfig_files.lo \ + libcares_la-ares_timeout.lo libcares_la-ares_update_servers.lo \ + libcares_la-ares_version.lo libcares_la-bitncmp.lo \ libcares_la-inet_net_pton.lo libcares_la-inet_ntop.lo \ libcares_la-windows_port.lo am__objects_2 = @@ -231,18 +245,31 @@ am__maybe_remake_depfiles = depfiles am__depfiles_remade = \ ./$(DEPDIR)/libcares_la-ares__addrinfo2hostent.Plo \ ./$(DEPDIR)/libcares_la-ares__addrinfo_localhost.Plo \ + ./$(DEPDIR)/libcares_la-ares__buf.Plo \ ./$(DEPDIR)/libcares_la-ares__close_sockets.Plo \ - ./$(DEPDIR)/libcares_la-ares__get_hostent.Plo \ + ./$(DEPDIR)/libcares_la-ares__hosts_file.Plo \ + ./$(DEPDIR)/libcares_la-ares__htable.Plo \ + ./$(DEPDIR)/libcares_la-ares__htable_asvp.Plo \ + ./$(DEPDIR)/libcares_la-ares__htable_strvp.Plo \ + ./$(DEPDIR)/libcares_la-ares__htable_szvp.Plo \ + ./$(DEPDIR)/libcares_la-ares__llist.Plo \ ./$(DEPDIR)/libcares_la-ares__parse_into_addrinfo.Plo \ ./$(DEPDIR)/libcares_la-ares__read_line.Plo \ - ./$(DEPDIR)/libcares_la-ares__readaddrinfo.Plo \ + ./$(DEPDIR)/libcares_la-ares__slist.Plo \ + ./$(DEPDIR)/libcares_la-ares__socket.Plo \ ./$(DEPDIR)/libcares_la-ares__sortaddrinfo.Plo \ + ./$(DEPDIR)/libcares_la-ares__threads.Plo \ ./$(DEPDIR)/libcares_la-ares__timeval.Plo \ ./$(DEPDIR)/libcares_la-ares_android.Plo \ ./$(DEPDIR)/libcares_la-ares_cancel.Plo \ ./$(DEPDIR)/libcares_la-ares_create_query.Plo \ ./$(DEPDIR)/libcares_la-ares_data.Plo \ ./$(DEPDIR)/libcares_la-ares_destroy.Plo \ + ./$(DEPDIR)/libcares_la-ares_dns_mapping.Plo \ + ./$(DEPDIR)/libcares_la-ares_dns_name.Plo \ + ./$(DEPDIR)/libcares_la-ares_dns_parse.Plo \ + ./$(DEPDIR)/libcares_la-ares_dns_record.Plo \ + ./$(DEPDIR)/libcares_la-ares_dns_write.Plo \ ./$(DEPDIR)/libcares_la-ares_expand_name.Plo \ ./$(DEPDIR)/libcares_la-ares_expand_string.Plo \ ./$(DEPDIR)/libcares_la-ares_fds.Plo \ @@ -257,9 +284,8 @@ am__depfiles_remade = \ ./$(DEPDIR)/libcares_la-ares_getsock.Plo \ ./$(DEPDIR)/libcares_la-ares_init.Plo \ ./$(DEPDIR)/libcares_la-ares_library_init.Plo \ - ./$(DEPDIR)/libcares_la-ares_llist.Plo \ + ./$(DEPDIR)/libcares_la-ares_math.Plo \ ./$(DEPDIR)/libcares_la-ares_mkquery.Plo \ - ./$(DEPDIR)/libcares_la-ares_nowarn.Plo \ ./$(DEPDIR)/libcares_la-ares_options.Plo \ ./$(DEPDIR)/libcares_la-ares_parse_a_reply.Plo \ ./$(DEPDIR)/libcares_la-ares_parse_aaaa_reply.Plo \ @@ -274,17 +300,20 @@ am__depfiles_remade = \ ./$(DEPDIR)/libcares_la-ares_parse_uri_reply.Plo \ ./$(DEPDIR)/libcares_la-ares_platform.Plo \ ./$(DEPDIR)/libcares_la-ares_process.Plo \ + ./$(DEPDIR)/libcares_la-ares_qcache.Plo \ ./$(DEPDIR)/libcares_la-ares_query.Plo \ ./$(DEPDIR)/libcares_la-ares_rand.Plo \ ./$(DEPDIR)/libcares_la-ares_search.Plo \ ./$(DEPDIR)/libcares_la-ares_send.Plo \ + ./$(DEPDIR)/libcares_la-ares_str.Plo \ ./$(DEPDIR)/libcares_la-ares_strcasecmp.Plo \ - ./$(DEPDIR)/libcares_la-ares_strdup.Plo \ ./$(DEPDIR)/libcares_la-ares_strerror.Plo \ ./$(DEPDIR)/libcares_la-ares_strsplit.Plo \ + ./$(DEPDIR)/libcares_la-ares_sysconfig.Plo \ + ./$(DEPDIR)/libcares_la-ares_sysconfig_files.Plo \ ./$(DEPDIR)/libcares_la-ares_timeout.Plo \ + ./$(DEPDIR)/libcares_la-ares_update_servers.Plo \ ./$(DEPDIR)/libcares_la-ares_version.Plo \ - ./$(DEPDIR)/libcares_la-ares_writev.Plo \ ./$(DEPDIR)/libcares_la-bitncmp.Plo \ ./$(DEPDIR)/libcares_la-inet_net_pton.Plo \ ./$(DEPDIR)/libcares_la-inet_ntop.Plo \ @@ -463,6 +492,10 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_CXX = @PTHREAD_CXX@ +PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ @@ -482,6 +515,7 @@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ +ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ @@ -526,6 +560,9 @@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ + +# Copyright (C) The c-ares project and its contributors +# SPDX-License-Identifier: MIT AUTOMAKE_OPTIONS = foreign subdir-objects nostdinc 1.9.6 ACLOCAL_AMFLAGS = -I m4 --install @@ -575,18 +612,31 @@ libcares_la_LIBS = $(CODE_COVERAGE_LIBS) libcares_la_CFLAGS = $(AM_CFLAGS) $(libcares_la_CFLAGS_EXTRA) libcares_la_CPPFLAGS = $(AM_CPPFLAGS) $(libcares_la_CPPFLAGS_EXTRA) CSOURCES = ares__addrinfo2hostent.c \ - ares__addrinfo_localhost.c \ - ares__close_sockets.c \ - ares__get_hostent.c \ + ares__addrinfo_localhost.c \ + ares__buf.c \ + ares__close_sockets.c \ + ares__hosts_file.c \ + ares__htable.c \ + ares__htable_asvp.c \ + ares__htable_strvp.c \ + ares__htable_szvp.c \ + ares__llist.c \ ares__parse_into_addrinfo.c \ - ares__readaddrinfo.c \ - ares__sortaddrinfo.c \ ares__read_line.c \ + ares__slist.c \ + ares__socket.c \ + ares__sortaddrinfo.c \ + ares__threads.c \ ares__timeval.c \ ares_android.c \ ares_cancel.c \ ares_data.c \ ares_destroy.c \ + ares_dns_mapping.c \ + ares_dns_name.c \ + ares_dns_parse.c \ + ares_dns_record.c \ + ares_dns_write.c \ ares_expand_name.c \ ares_expand_string.c \ ares_fds.c \ @@ -601,10 +651,9 @@ CSOURCES = ares__addrinfo2hostent.c \ ares_getsock.c \ ares_init.c \ ares_library_init.c \ - ares_llist.c \ + ares_math.c \ ares_mkquery.c \ ares_create_query.c \ - ares_nowarn.c \ ares_options.c \ ares_parse_a_reply.c \ ares_parse_aaaa_reply.c \ @@ -619,36 +668,44 @@ CSOURCES = ares__addrinfo2hostent.c \ ares_parse_uri_reply.c \ ares_platform.c \ ares_process.c \ + ares_qcache.c \ ares_query.c \ - ares_rand.c \ + ares_rand.c \ ares_search.c \ ares_send.c \ ares_strcasecmp.c \ - ares_strdup.c \ + ares_str.c \ ares_strerror.c \ ares_strsplit.c \ + ares_sysconfig.c \ + ares_sysconfig_files.c \ ares_timeout.c \ + ares_update_servers.c \ ares_version.c \ - ares_writev.c \ bitncmp.c \ inet_net_pton.c \ inet_ntop.c \ windows_port.c -HHEADERS = ares_android.h \ +HHEADERS = ares__buf.h \ + ares__htable.h \ + ares__htable_asvp.h \ + ares__htable_strvp.h \ + ares__htable_szvp.h \ + ares__llist.h \ + ares__slist.h \ + ares_android.h \ ares_data.h \ + ares_dns_private.h \ ares_getenv.h \ ares_inet_net_pton.h \ ares_iphlpapi.h \ ares_ipv6.h \ - ares_llist.h \ - ares_nowarn.h \ ares_platform.h \ ares_private.h \ ares_strcasecmp.h \ - ares_strdup.h \ + ares_str.h \ ares_strsplit.h \ - ares_writev.h \ bitncmp.h \ ares_setup.h \ setup_once.h @@ -753,18 +810,31 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares__addrinfo2hostent.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares__addrinfo_localhost.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares__buf.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares__close_sockets.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares__get_hostent.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares__hosts_file.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares__htable.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares__htable_asvp.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares__htable_strvp.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares__htable_szvp.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares__llist.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares__parse_into_addrinfo.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares__read_line.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares__readaddrinfo.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares__slist.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares__socket.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares__sortaddrinfo.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares__threads.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares__timeval.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_android.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_cancel.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_create_query.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_data.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_destroy.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_dns_mapping.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_dns_name.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_dns_parse.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_dns_record.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_dns_write.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_expand_name.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_expand_string.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_fds.Plo@am__quote@ # am--include-marker @@ -779,9 +849,8 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_getsock.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_init.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_library_init.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_llist.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_math.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_mkquery.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_nowarn.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_options.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_parse_a_reply.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_parse_aaaa_reply.Plo@am__quote@ # am--include-marker @@ -796,17 +865,20 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_parse_uri_reply.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_platform.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_process.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_qcache.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_query.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_rand.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_search.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_send.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_str.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_strcasecmp.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_strdup.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_strerror.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_strsplit.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_sysconfig.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_sysconfig_files.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_timeout.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_update_servers.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_version.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_writev.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-bitncmp.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-inet_net_pton.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-inet_ntop.Plo@am__quote@ # am--include-marker @@ -856,6 +928,13 @@ libcares_la-ares__addrinfo_localhost.lo: ares__addrinfo_localhost.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares__addrinfo_localhost.lo `test -f 'ares__addrinfo_localhost.c' || echo '$(srcdir)/'`ares__addrinfo_localhost.c +libcares_la-ares__buf.lo: ares__buf.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares__buf.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares__buf.Tpo -c -o libcares_la-ares__buf.lo `test -f 'ares__buf.c' || echo '$(srcdir)/'`ares__buf.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares__buf.Tpo $(DEPDIR)/libcares_la-ares__buf.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares__buf.c' object='libcares_la-ares__buf.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares__buf.lo `test -f 'ares__buf.c' || echo '$(srcdir)/'`ares__buf.c + libcares_la-ares__close_sockets.lo: ares__close_sockets.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares__close_sockets.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares__close_sockets.Tpo -c -o libcares_la-ares__close_sockets.lo `test -f 'ares__close_sockets.c' || echo '$(srcdir)/'`ares__close_sockets.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares__close_sockets.Tpo $(DEPDIR)/libcares_la-ares__close_sockets.Plo @@ -863,12 +942,47 @@ libcares_la-ares__close_sockets.lo: ares__close_sockets.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares__close_sockets.lo `test -f 'ares__close_sockets.c' || echo '$(srcdir)/'`ares__close_sockets.c -libcares_la-ares__get_hostent.lo: ares__get_hostent.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares__get_hostent.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares__get_hostent.Tpo -c -o libcares_la-ares__get_hostent.lo `test -f 'ares__get_hostent.c' || echo '$(srcdir)/'`ares__get_hostent.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares__get_hostent.Tpo $(DEPDIR)/libcares_la-ares__get_hostent.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares__get_hostent.c' object='libcares_la-ares__get_hostent.lo' libtool=yes @AMDEPBACKSLASH@ +libcares_la-ares__hosts_file.lo: ares__hosts_file.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares__hosts_file.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares__hosts_file.Tpo -c -o libcares_la-ares__hosts_file.lo `test -f 'ares__hosts_file.c' || echo '$(srcdir)/'`ares__hosts_file.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares__hosts_file.Tpo $(DEPDIR)/libcares_la-ares__hosts_file.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares__hosts_file.c' object='libcares_la-ares__hosts_file.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares__hosts_file.lo `test -f 'ares__hosts_file.c' || echo '$(srcdir)/'`ares__hosts_file.c + +libcares_la-ares__htable.lo: ares__htable.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares__htable.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares__htable.Tpo -c -o libcares_la-ares__htable.lo `test -f 'ares__htable.c' || echo '$(srcdir)/'`ares__htable.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares__htable.Tpo $(DEPDIR)/libcares_la-ares__htable.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares__htable.c' object='libcares_la-ares__htable.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares__htable.lo `test -f 'ares__htable.c' || echo '$(srcdir)/'`ares__htable.c + +libcares_la-ares__htable_asvp.lo: ares__htable_asvp.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares__htable_asvp.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares__htable_asvp.Tpo -c -o libcares_la-ares__htable_asvp.lo `test -f 'ares__htable_asvp.c' || echo '$(srcdir)/'`ares__htable_asvp.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares__htable_asvp.Tpo $(DEPDIR)/libcares_la-ares__htable_asvp.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares__htable_asvp.c' object='libcares_la-ares__htable_asvp.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares__htable_asvp.lo `test -f 'ares__htable_asvp.c' || echo '$(srcdir)/'`ares__htable_asvp.c + +libcares_la-ares__htable_strvp.lo: ares__htable_strvp.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares__htable_strvp.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares__htable_strvp.Tpo -c -o libcares_la-ares__htable_strvp.lo `test -f 'ares__htable_strvp.c' || echo '$(srcdir)/'`ares__htable_strvp.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares__htable_strvp.Tpo $(DEPDIR)/libcares_la-ares__htable_strvp.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares__htable_strvp.c' object='libcares_la-ares__htable_strvp.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares__htable_strvp.lo `test -f 'ares__htable_strvp.c' || echo '$(srcdir)/'`ares__htable_strvp.c + +libcares_la-ares__htable_szvp.lo: ares__htable_szvp.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares__htable_szvp.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares__htable_szvp.Tpo -c -o libcares_la-ares__htable_szvp.lo `test -f 'ares__htable_szvp.c' || echo '$(srcdir)/'`ares__htable_szvp.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares__htable_szvp.Tpo $(DEPDIR)/libcares_la-ares__htable_szvp.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares__htable_szvp.c' object='libcares_la-ares__htable_szvp.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares__htable_szvp.lo `test -f 'ares__htable_szvp.c' || echo '$(srcdir)/'`ares__htable_szvp.c + +libcares_la-ares__llist.lo: ares__llist.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares__llist.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares__llist.Tpo -c -o libcares_la-ares__llist.lo `test -f 'ares__llist.c' || echo '$(srcdir)/'`ares__llist.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares__llist.Tpo $(DEPDIR)/libcares_la-ares__llist.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares__llist.c' object='libcares_la-ares__llist.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares__get_hostent.lo `test -f 'ares__get_hostent.c' || echo '$(srcdir)/'`ares__get_hostent.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares__llist.lo `test -f 'ares__llist.c' || echo '$(srcdir)/'`ares__llist.c libcares_la-ares__parse_into_addrinfo.lo: ares__parse_into_addrinfo.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares__parse_into_addrinfo.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares__parse_into_addrinfo.Tpo -c -o libcares_la-ares__parse_into_addrinfo.lo `test -f 'ares__parse_into_addrinfo.c' || echo '$(srcdir)/'`ares__parse_into_addrinfo.c @@ -877,12 +991,26 @@ libcares_la-ares__parse_into_addrinfo.lo: ares__parse_into_addrinfo.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares__parse_into_addrinfo.lo `test -f 'ares__parse_into_addrinfo.c' || echo '$(srcdir)/'`ares__parse_into_addrinfo.c -libcares_la-ares__readaddrinfo.lo: ares__readaddrinfo.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares__readaddrinfo.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares__readaddrinfo.Tpo -c -o libcares_la-ares__readaddrinfo.lo `test -f 'ares__readaddrinfo.c' || echo '$(srcdir)/'`ares__readaddrinfo.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares__readaddrinfo.Tpo $(DEPDIR)/libcares_la-ares__readaddrinfo.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares__readaddrinfo.c' object='libcares_la-ares__readaddrinfo.lo' libtool=yes @AMDEPBACKSLASH@ +libcares_la-ares__read_line.lo: ares__read_line.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares__read_line.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares__read_line.Tpo -c -o libcares_la-ares__read_line.lo `test -f 'ares__read_line.c' || echo '$(srcdir)/'`ares__read_line.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares__read_line.Tpo $(DEPDIR)/libcares_la-ares__read_line.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares__read_line.c' object='libcares_la-ares__read_line.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares__readaddrinfo.lo `test -f 'ares__readaddrinfo.c' || echo '$(srcdir)/'`ares__readaddrinfo.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares__read_line.lo `test -f 'ares__read_line.c' || echo '$(srcdir)/'`ares__read_line.c + +libcares_la-ares__slist.lo: ares__slist.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares__slist.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares__slist.Tpo -c -o libcares_la-ares__slist.lo `test -f 'ares__slist.c' || echo '$(srcdir)/'`ares__slist.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares__slist.Tpo $(DEPDIR)/libcares_la-ares__slist.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares__slist.c' object='libcares_la-ares__slist.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares__slist.lo `test -f 'ares__slist.c' || echo '$(srcdir)/'`ares__slist.c + +libcares_la-ares__socket.lo: ares__socket.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares__socket.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares__socket.Tpo -c -o libcares_la-ares__socket.lo `test -f 'ares__socket.c' || echo '$(srcdir)/'`ares__socket.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares__socket.Tpo $(DEPDIR)/libcares_la-ares__socket.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares__socket.c' object='libcares_la-ares__socket.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares__socket.lo `test -f 'ares__socket.c' || echo '$(srcdir)/'`ares__socket.c libcares_la-ares__sortaddrinfo.lo: ares__sortaddrinfo.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares__sortaddrinfo.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares__sortaddrinfo.Tpo -c -o libcares_la-ares__sortaddrinfo.lo `test -f 'ares__sortaddrinfo.c' || echo '$(srcdir)/'`ares__sortaddrinfo.c @@ -891,12 +1019,12 @@ libcares_la-ares__sortaddrinfo.lo: ares__sortaddrinfo.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares__sortaddrinfo.lo `test -f 'ares__sortaddrinfo.c' || echo '$(srcdir)/'`ares__sortaddrinfo.c -libcares_la-ares__read_line.lo: ares__read_line.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares__read_line.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares__read_line.Tpo -c -o libcares_la-ares__read_line.lo `test -f 'ares__read_line.c' || echo '$(srcdir)/'`ares__read_line.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares__read_line.Tpo $(DEPDIR)/libcares_la-ares__read_line.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares__read_line.c' object='libcares_la-ares__read_line.lo' libtool=yes @AMDEPBACKSLASH@ +libcares_la-ares__threads.lo: ares__threads.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares__threads.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares__threads.Tpo -c -o libcares_la-ares__threads.lo `test -f 'ares__threads.c' || echo '$(srcdir)/'`ares__threads.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares__threads.Tpo $(DEPDIR)/libcares_la-ares__threads.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares__threads.c' object='libcares_la-ares__threads.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares__read_line.lo `test -f 'ares__read_line.c' || echo '$(srcdir)/'`ares__read_line.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares__threads.lo `test -f 'ares__threads.c' || echo '$(srcdir)/'`ares__threads.c libcares_la-ares__timeval.lo: ares__timeval.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares__timeval.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares__timeval.Tpo -c -o libcares_la-ares__timeval.lo `test -f 'ares__timeval.c' || echo '$(srcdir)/'`ares__timeval.c @@ -933,6 +1061,41 @@ libcares_la-ares_destroy.lo: ares_destroy.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_destroy.lo `test -f 'ares_destroy.c' || echo '$(srcdir)/'`ares_destroy.c +libcares_la-ares_dns_mapping.lo: ares_dns_mapping.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_dns_mapping.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_dns_mapping.Tpo -c -o libcares_la-ares_dns_mapping.lo `test -f 'ares_dns_mapping.c' || echo '$(srcdir)/'`ares_dns_mapping.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_dns_mapping.Tpo $(DEPDIR)/libcares_la-ares_dns_mapping.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_dns_mapping.c' object='libcares_la-ares_dns_mapping.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_dns_mapping.lo `test -f 'ares_dns_mapping.c' || echo '$(srcdir)/'`ares_dns_mapping.c + +libcares_la-ares_dns_name.lo: ares_dns_name.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_dns_name.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_dns_name.Tpo -c -o libcares_la-ares_dns_name.lo `test -f 'ares_dns_name.c' || echo '$(srcdir)/'`ares_dns_name.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_dns_name.Tpo $(DEPDIR)/libcares_la-ares_dns_name.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_dns_name.c' object='libcares_la-ares_dns_name.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_dns_name.lo `test -f 'ares_dns_name.c' || echo '$(srcdir)/'`ares_dns_name.c + +libcares_la-ares_dns_parse.lo: ares_dns_parse.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_dns_parse.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_dns_parse.Tpo -c -o libcares_la-ares_dns_parse.lo `test -f 'ares_dns_parse.c' || echo '$(srcdir)/'`ares_dns_parse.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_dns_parse.Tpo $(DEPDIR)/libcares_la-ares_dns_parse.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_dns_parse.c' object='libcares_la-ares_dns_parse.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_dns_parse.lo `test -f 'ares_dns_parse.c' || echo '$(srcdir)/'`ares_dns_parse.c + +libcares_la-ares_dns_record.lo: ares_dns_record.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_dns_record.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_dns_record.Tpo -c -o libcares_la-ares_dns_record.lo `test -f 'ares_dns_record.c' || echo '$(srcdir)/'`ares_dns_record.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_dns_record.Tpo $(DEPDIR)/libcares_la-ares_dns_record.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_dns_record.c' object='libcares_la-ares_dns_record.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_dns_record.lo `test -f 'ares_dns_record.c' || echo '$(srcdir)/'`ares_dns_record.c + +libcares_la-ares_dns_write.lo: ares_dns_write.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_dns_write.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_dns_write.Tpo -c -o libcares_la-ares_dns_write.lo `test -f 'ares_dns_write.c' || echo '$(srcdir)/'`ares_dns_write.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_dns_write.Tpo $(DEPDIR)/libcares_la-ares_dns_write.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_dns_write.c' object='libcares_la-ares_dns_write.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_dns_write.lo `test -f 'ares_dns_write.c' || echo '$(srcdir)/'`ares_dns_write.c + libcares_la-ares_expand_name.lo: ares_expand_name.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_expand_name.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_expand_name.Tpo -c -o libcares_la-ares_expand_name.lo `test -f 'ares_expand_name.c' || echo '$(srcdir)/'`ares_expand_name.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_expand_name.Tpo $(DEPDIR)/libcares_la-ares_expand_name.Plo @@ -1031,12 +1194,12 @@ libcares_la-ares_library_init.lo: ares_library_init.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_library_init.lo `test -f 'ares_library_init.c' || echo '$(srcdir)/'`ares_library_init.c -libcares_la-ares_llist.lo: ares_llist.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_llist.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_llist.Tpo -c -o libcares_la-ares_llist.lo `test -f 'ares_llist.c' || echo '$(srcdir)/'`ares_llist.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_llist.Tpo $(DEPDIR)/libcares_la-ares_llist.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_llist.c' object='libcares_la-ares_llist.lo' libtool=yes @AMDEPBACKSLASH@ +libcares_la-ares_math.lo: ares_math.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_math.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_math.Tpo -c -o libcares_la-ares_math.lo `test -f 'ares_math.c' || echo '$(srcdir)/'`ares_math.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_math.Tpo $(DEPDIR)/libcares_la-ares_math.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_math.c' object='libcares_la-ares_math.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_llist.lo `test -f 'ares_llist.c' || echo '$(srcdir)/'`ares_llist.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_math.lo `test -f 'ares_math.c' || echo '$(srcdir)/'`ares_math.c libcares_la-ares_mkquery.lo: ares_mkquery.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_mkquery.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_mkquery.Tpo -c -o libcares_la-ares_mkquery.lo `test -f 'ares_mkquery.c' || echo '$(srcdir)/'`ares_mkquery.c @@ -1052,13 +1215,6 @@ libcares_la-ares_create_query.lo: ares_create_query.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_create_query.lo `test -f 'ares_create_query.c' || echo '$(srcdir)/'`ares_create_query.c -libcares_la-ares_nowarn.lo: ares_nowarn.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_nowarn.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_nowarn.Tpo -c -o libcares_la-ares_nowarn.lo `test -f 'ares_nowarn.c' || echo '$(srcdir)/'`ares_nowarn.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_nowarn.Tpo $(DEPDIR)/libcares_la-ares_nowarn.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_nowarn.c' object='libcares_la-ares_nowarn.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_nowarn.lo `test -f 'ares_nowarn.c' || echo '$(srcdir)/'`ares_nowarn.c - libcares_la-ares_options.lo: ares_options.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_options.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_options.Tpo -c -o libcares_la-ares_options.lo `test -f 'ares_options.c' || echo '$(srcdir)/'`ares_options.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_options.Tpo $(DEPDIR)/libcares_la-ares_options.Plo @@ -1157,6 +1313,13 @@ libcares_la-ares_process.lo: ares_process.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_process.lo `test -f 'ares_process.c' || echo '$(srcdir)/'`ares_process.c +libcares_la-ares_qcache.lo: ares_qcache.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_qcache.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_qcache.Tpo -c -o libcares_la-ares_qcache.lo `test -f 'ares_qcache.c' || echo '$(srcdir)/'`ares_qcache.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_qcache.Tpo $(DEPDIR)/libcares_la-ares_qcache.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_qcache.c' object='libcares_la-ares_qcache.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_qcache.lo `test -f 'ares_qcache.c' || echo '$(srcdir)/'`ares_qcache.c + libcares_la-ares_query.lo: ares_query.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_query.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_query.Tpo -c -o libcares_la-ares_query.lo `test -f 'ares_query.c' || echo '$(srcdir)/'`ares_query.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_query.Tpo $(DEPDIR)/libcares_la-ares_query.Plo @@ -1192,12 +1355,12 @@ libcares_la-ares_strcasecmp.lo: ares_strcasecmp.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_strcasecmp.lo `test -f 'ares_strcasecmp.c' || echo '$(srcdir)/'`ares_strcasecmp.c -libcares_la-ares_strdup.lo: ares_strdup.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_strdup.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_strdup.Tpo -c -o libcares_la-ares_strdup.lo `test -f 'ares_strdup.c' || echo '$(srcdir)/'`ares_strdup.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_strdup.Tpo $(DEPDIR)/libcares_la-ares_strdup.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_strdup.c' object='libcares_la-ares_strdup.lo' libtool=yes @AMDEPBACKSLASH@ +libcares_la-ares_str.lo: ares_str.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_str.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_str.Tpo -c -o libcares_la-ares_str.lo `test -f 'ares_str.c' || echo '$(srcdir)/'`ares_str.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_str.Tpo $(DEPDIR)/libcares_la-ares_str.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_str.c' object='libcares_la-ares_str.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_strdup.lo `test -f 'ares_strdup.c' || echo '$(srcdir)/'`ares_strdup.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_str.lo `test -f 'ares_str.c' || echo '$(srcdir)/'`ares_str.c libcares_la-ares_strerror.lo: ares_strerror.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_strerror.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_strerror.Tpo -c -o libcares_la-ares_strerror.lo `test -f 'ares_strerror.c' || echo '$(srcdir)/'`ares_strerror.c @@ -1213,6 +1376,20 @@ libcares_la-ares_strsplit.lo: ares_strsplit.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_strsplit.lo `test -f 'ares_strsplit.c' || echo '$(srcdir)/'`ares_strsplit.c +libcares_la-ares_sysconfig.lo: ares_sysconfig.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_sysconfig.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_sysconfig.Tpo -c -o libcares_la-ares_sysconfig.lo `test -f 'ares_sysconfig.c' || echo '$(srcdir)/'`ares_sysconfig.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_sysconfig.Tpo $(DEPDIR)/libcares_la-ares_sysconfig.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_sysconfig.c' object='libcares_la-ares_sysconfig.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_sysconfig.lo `test -f 'ares_sysconfig.c' || echo '$(srcdir)/'`ares_sysconfig.c + +libcares_la-ares_sysconfig_files.lo: ares_sysconfig_files.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_sysconfig_files.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_sysconfig_files.Tpo -c -o libcares_la-ares_sysconfig_files.lo `test -f 'ares_sysconfig_files.c' || echo '$(srcdir)/'`ares_sysconfig_files.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_sysconfig_files.Tpo $(DEPDIR)/libcares_la-ares_sysconfig_files.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_sysconfig_files.c' object='libcares_la-ares_sysconfig_files.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_sysconfig_files.lo `test -f 'ares_sysconfig_files.c' || echo '$(srcdir)/'`ares_sysconfig_files.c + libcares_la-ares_timeout.lo: ares_timeout.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_timeout.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_timeout.Tpo -c -o libcares_la-ares_timeout.lo `test -f 'ares_timeout.c' || echo '$(srcdir)/'`ares_timeout.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_timeout.Tpo $(DEPDIR)/libcares_la-ares_timeout.Plo @@ -1220,6 +1397,13 @@ libcares_la-ares_timeout.lo: ares_timeout.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_timeout.lo `test -f 'ares_timeout.c' || echo '$(srcdir)/'`ares_timeout.c +libcares_la-ares_update_servers.lo: ares_update_servers.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_update_servers.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_update_servers.Tpo -c -o libcares_la-ares_update_servers.lo `test -f 'ares_update_servers.c' || echo '$(srcdir)/'`ares_update_servers.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_update_servers.Tpo $(DEPDIR)/libcares_la-ares_update_servers.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_update_servers.c' object='libcares_la-ares_update_servers.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_update_servers.lo `test -f 'ares_update_servers.c' || echo '$(srcdir)/'`ares_update_servers.c + libcares_la-ares_version.lo: ares_version.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_version.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_version.Tpo -c -o libcares_la-ares_version.lo `test -f 'ares_version.c' || echo '$(srcdir)/'`ares_version.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_version.Tpo $(DEPDIR)/libcares_la-ares_version.Plo @@ -1227,13 +1411,6 @@ libcares_la-ares_version.lo: ares_version.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_version.lo `test -f 'ares_version.c' || echo '$(srcdir)/'`ares_version.c -libcares_la-ares_writev.lo: ares_writev.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_writev.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_writev.Tpo -c -o libcares_la-ares_writev.lo `test -f 'ares_writev.c' || echo '$(srcdir)/'`ares_writev.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_writev.Tpo $(DEPDIR)/libcares_la-ares_writev.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_writev.c' object='libcares_la-ares_writev.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_writev.lo `test -f 'ares_writev.c' || echo '$(srcdir)/'`ares_writev.c - libcares_la-bitncmp.lo: bitncmp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-bitncmp.lo -MD -MP -MF $(DEPDIR)/libcares_la-bitncmp.Tpo -c -o libcares_la-bitncmp.lo `test -f 'bitncmp.c' || echo '$(srcdir)/'`bitncmp.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-bitncmp.Tpo $(DEPDIR)/libcares_la-bitncmp.Plo @@ -1471,18 +1648,31 @@ clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ distclean: distclean-recursive -rm -f ./$(DEPDIR)/libcares_la-ares__addrinfo2hostent.Plo -rm -f ./$(DEPDIR)/libcares_la-ares__addrinfo_localhost.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares__buf.Plo -rm -f ./$(DEPDIR)/libcares_la-ares__close_sockets.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares__get_hostent.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares__hosts_file.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares__htable.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares__htable_asvp.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares__htable_strvp.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares__htable_szvp.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares__llist.Plo -rm -f ./$(DEPDIR)/libcares_la-ares__parse_into_addrinfo.Plo -rm -f ./$(DEPDIR)/libcares_la-ares__read_line.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares__readaddrinfo.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares__slist.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares__socket.Plo -rm -f ./$(DEPDIR)/libcares_la-ares__sortaddrinfo.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares__threads.Plo -rm -f ./$(DEPDIR)/libcares_la-ares__timeval.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_android.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_cancel.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_create_query.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_data.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_destroy.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares_dns_mapping.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares_dns_name.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares_dns_parse.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares_dns_record.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares_dns_write.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_expand_name.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_expand_string.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_fds.Plo @@ -1497,9 +1687,8 @@ distclean: distclean-recursive -rm -f ./$(DEPDIR)/libcares_la-ares_getsock.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_init.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_library_init.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_llist.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares_math.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_mkquery.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_nowarn.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_options.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_parse_a_reply.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_parse_aaaa_reply.Plo @@ -1514,17 +1703,20 @@ distclean: distclean-recursive -rm -f ./$(DEPDIR)/libcares_la-ares_parse_uri_reply.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_platform.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_process.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares_qcache.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_query.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_rand.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_search.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_send.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares_str.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_strcasecmp.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_strdup.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_strerror.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_strsplit.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares_sysconfig.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares_sysconfig_files.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_timeout.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares_update_servers.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_version.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_writev.Plo -rm -f ./$(DEPDIR)/libcares_la-bitncmp.Plo -rm -f ./$(DEPDIR)/libcares_la-inet_net_pton.Plo -rm -f ./$(DEPDIR)/libcares_la-inet_ntop.Plo @@ -1576,18 +1768,31 @@ installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f ./$(DEPDIR)/libcares_la-ares__addrinfo2hostent.Plo -rm -f ./$(DEPDIR)/libcares_la-ares__addrinfo_localhost.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares__buf.Plo -rm -f ./$(DEPDIR)/libcares_la-ares__close_sockets.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares__get_hostent.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares__hosts_file.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares__htable.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares__htable_asvp.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares__htable_strvp.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares__htable_szvp.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares__llist.Plo -rm -f ./$(DEPDIR)/libcares_la-ares__parse_into_addrinfo.Plo -rm -f ./$(DEPDIR)/libcares_la-ares__read_line.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares__readaddrinfo.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares__slist.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares__socket.Plo -rm -f ./$(DEPDIR)/libcares_la-ares__sortaddrinfo.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares__threads.Plo -rm -f ./$(DEPDIR)/libcares_la-ares__timeval.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_android.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_cancel.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_create_query.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_data.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_destroy.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares_dns_mapping.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares_dns_name.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares_dns_parse.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares_dns_record.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares_dns_write.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_expand_name.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_expand_string.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_fds.Plo @@ -1602,9 +1807,8 @@ maintainer-clean: maintainer-clean-recursive -rm -f ./$(DEPDIR)/libcares_la-ares_getsock.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_init.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_library_init.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_llist.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares_math.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_mkquery.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_nowarn.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_options.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_parse_a_reply.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_parse_aaaa_reply.Plo @@ -1619,17 +1823,20 @@ maintainer-clean: maintainer-clean-recursive -rm -f ./$(DEPDIR)/libcares_la-ares_parse_uri_reply.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_platform.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_process.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares_qcache.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_query.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_rand.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_search.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_send.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares_str.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_strcasecmp.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_strdup.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_strerror.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_strsplit.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares_sysconfig.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares_sysconfig_files.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_timeout.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares_update_servers.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_version.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_writev.Plo -rm -f ./$(DEPDIR)/libcares_la-bitncmp.Plo -rm -f ./$(DEPDIR)/libcares_la-inet_net_pton.Plo -rm -f ./$(DEPDIR)/libcares_la-inet_ntop.Plo diff --git a/lib/c-ares-1.19.1/src/lib/Makefile.inc b/lib/c-ares-1.23.0/src/lib/Makefile.inc similarity index 63% rename from lib/c-ares-1.19.1/src/lib/Makefile.inc rename to lib/c-ares-1.23.0/src/lib/Makefile.inc index 02d8d58a6d5..8324a3553cb 100644 --- a/lib/c-ares-1.19.1/src/lib/Makefile.inc +++ b/lib/c-ares-1.23.0/src/lib/Makefile.inc @@ -1,17 +1,32 @@ +# Copyright (C) The c-ares project and its contributors +# SPDX-License-Identifier: MIT CSOURCES = ares__addrinfo2hostent.c \ - ares__addrinfo_localhost.c \ - ares__close_sockets.c \ - ares__get_hostent.c \ + ares__addrinfo_localhost.c \ + ares__buf.c \ + ares__close_sockets.c \ + ares__hosts_file.c \ + ares__htable.c \ + ares__htable_asvp.c \ + ares__htable_strvp.c \ + ares__htable_szvp.c \ + ares__llist.c \ ares__parse_into_addrinfo.c \ - ares__readaddrinfo.c \ - ares__sortaddrinfo.c \ ares__read_line.c \ + ares__slist.c \ + ares__socket.c \ + ares__sortaddrinfo.c \ + ares__threads.c \ ares__timeval.c \ ares_android.c \ ares_cancel.c \ ares_data.c \ ares_destroy.c \ + ares_dns_mapping.c \ + ares_dns_name.c \ + ares_dns_parse.c \ + ares_dns_record.c \ + ares_dns_write.c \ ares_expand_name.c \ ares_expand_string.c \ ares_fds.c \ @@ -26,10 +41,9 @@ CSOURCES = ares__addrinfo2hostent.c \ ares_getsock.c \ ares_init.c \ ares_library_init.c \ - ares_llist.c \ + ares_math.c \ ares_mkquery.c \ ares_create_query.c \ - ares_nowarn.c \ ares_options.c \ ares_parse_a_reply.c \ ares_parse_aaaa_reply.c \ @@ -44,38 +58,45 @@ CSOURCES = ares__addrinfo2hostent.c \ ares_parse_uri_reply.c \ ares_platform.c \ ares_process.c \ + ares_qcache.c \ ares_query.c \ ares_rand.c \ ares_search.c \ ares_send.c \ ares_strcasecmp.c \ - ares_strdup.c \ + ares_str.c \ ares_strerror.c \ ares_strsplit.c \ + ares_sysconfig.c \ + ares_sysconfig_files.c \ ares_timeout.c \ + ares_update_servers.c \ ares_version.c \ - ares_writev.c \ bitncmp.c \ inet_net_pton.c \ inet_ntop.c \ windows_port.c -HHEADERS = ares_android.h \ +HHEADERS = ares__buf.h \ + ares__htable.h \ + ares__htable_asvp.h \ + ares__htable_strvp.h \ + ares__htable_szvp.h \ + ares__llist.h \ + ares__slist.h \ + ares_android.h \ ares_data.h \ + ares_dns_private.h \ ares_getenv.h \ ares_inet_net_pton.h \ ares_iphlpapi.h \ ares_ipv6.h \ - ares_llist.h \ - ares_nowarn.h \ ares_platform.h \ ares_private.h \ ares_strcasecmp.h \ - ares_strdup.h \ + ares_str.h \ ares_strsplit.h \ - ares_writev.h \ bitncmp.h \ ares_setup.h \ setup_once.h - diff --git a/lib/c-ares-1.23.0/src/lib/ares__addrinfo2hostent.c b/lib/c-ares-1.23.0/src/lib/ares__addrinfo2hostent.c new file mode 100644 index 00000000000..ec112177897 --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares__addrinfo2hostent.c @@ -0,0 +1,278 @@ +/* MIT License + * + * Copyright (c) 1998 Massachusetts Institute of Technology + * Copyright (c) 2005 Dominick Meglio + * Copyright (c) 2019 Andrew Selivanov + * Copyright (c) 2021 Brad House + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ + +#include "ares_setup.h" + +#ifdef HAVE_NETINET_IN_H +# include +#endif +#ifdef HAVE_NETDB_H +# include +#endif +#ifdef HAVE_ARPA_INET_H +# include +#endif + +#include "ares_nameser.h" + +#ifdef HAVE_STRINGS_H +# include +#endif + +#ifdef HAVE_LIMITS_H +# include +#endif + +#include "ares.h" +#include "ares_dns.h" +#include "ares_inet_net_pton.h" +#include "ares_private.h" + +ares_status_t ares__addrinfo2hostent(const struct ares_addrinfo *ai, int family, + struct hostent **host) +{ + struct ares_addrinfo_node *next; + struct ares_addrinfo_cname *next_cname; + char **aliases = NULL; + char *addrs = NULL; + size_t naliases = 0; + size_t naddrs = 0; + size_t alias = 0; + size_t i; + + if (ai == NULL || host == NULL) { + return ARES_EBADQUERY; + } + + /* Use the first node of the response as the family, since hostent can only + * represent one family. We assume getaddrinfo() returned a sorted list if + * the user requested AF_UNSPEC. */ + if (family == AF_UNSPEC && ai->nodes) { + family = ai->nodes->ai_family; + } + + if (family != AF_INET && family != AF_INET6) { + return ARES_EBADQUERY; + } + + *host = ares_malloc(sizeof(**host)); + if (!(*host)) { + goto enomem; + } + memset(*host, 0, sizeof(**host)); + + next = ai->nodes; + while (next) { + if (next->ai_family == family) { + ++naddrs; + } + next = next->ai_next; + } + + next_cname = ai->cnames; + while (next_cname) { + if (next_cname->alias) { + ++naliases; + } + next_cname = next_cname->next; + } + + aliases = ares_malloc((naliases + 1) * sizeof(char *)); + if (!aliases) { + goto enomem; + } + (*host)->h_aliases = aliases; + memset(aliases, 0, (naliases + 1) * sizeof(char *)); + + if (naliases) { + for (next_cname = ai->cnames; next_cname != NULL; + next_cname = next_cname->next) { + if (next_cname->alias == NULL) { + continue; + } + aliases[alias] = ares_strdup(next_cname->alias); + if (!aliases[alias]) { + goto enomem; + } + alias++; + } + } + + + (*host)->h_addr_list = ares_malloc((naddrs + 1) * sizeof(char *)); + if (!(*host)->h_addr_list) { + goto enomem; + } + + memset((*host)->h_addr_list, 0, (naddrs + 1) * sizeof(char *)); + + if (ai->cnames) { + (*host)->h_name = ares_strdup(ai->cnames->name); + if ((*host)->h_name == NULL && ai->cnames->name) { + goto enomem; + } + } else { + (*host)->h_name = ares_strdup(ai->name); + if ((*host)->h_name == NULL && ai->name) { + goto enomem; + } + } + + (*host)->h_addrtype = family; + + if (family == AF_INET) { + (*host)->h_length = sizeof(struct in_addr); + } + + if (family == AF_INET6) { + (*host)->h_length = sizeof(struct ares_in6_addr); + } + + if (naddrs) { + addrs = ares_malloc(naddrs * (size_t)(*host)->h_length); + if (!addrs) { + goto enomem; + } + + i = 0; + for (next = ai->nodes; next != NULL; next = next->ai_next) { + if (next->ai_family != family) { + continue; + } + (*host)->h_addr_list[i] = addrs + (i * (size_t)(*host)->h_length); + if (family == AF_INET6) { + memcpy( + (*host)->h_addr_list[i], + &(CARES_INADDR_CAST(struct sockaddr_in6 *, next->ai_addr)->sin6_addr), + (size_t)(*host)->h_length); + } + if (family == AF_INET) { + memcpy( + (*host)->h_addr_list[i], + &(CARES_INADDR_CAST(struct sockaddr_in *, next->ai_addr)->sin_addr), + (size_t)(*host)->h_length); + } + ++i; + } + + if (i == 0) { + ares_free(addrs); + } + } + + if (naddrs == 0 && naliases == 0) { + ares_free_hostent(*host); + *host = NULL; + return ARES_ENODATA; + } + + return ARES_SUCCESS; + +enomem: + ares_free_hostent(*host); + *host = NULL; + return ARES_ENOMEM; +} + +ares_status_t ares__addrinfo2addrttl(const struct ares_addrinfo *ai, int family, + size_t req_naddrttls, + struct ares_addrttl *addrttls, + struct ares_addr6ttl *addr6ttls, + size_t *naddrttls) +{ + struct ares_addrinfo_node *next; + struct ares_addrinfo_cname *next_cname; + int cname_ttl = INT_MAX; + + if (family != AF_INET && family != AF_INET6) { + return ARES_EBADQUERY; + } + + if (ai == NULL || naddrttls == NULL) { + return ARES_EBADQUERY; + } + + if (family == AF_INET && addrttls == NULL) { + return ARES_EBADQUERY; + } + + if (family == AF_INET6 && addr6ttls == NULL) { + return ARES_EBADQUERY; + } + + if (req_naddrttls == 0) { + return ARES_EBADQUERY; + } + + *naddrttls = 0; + + next_cname = ai->cnames; + while (next_cname) { + if (next_cname->ttl < cname_ttl) { + cname_ttl = next_cname->ttl; + } + next_cname = next_cname->next; + } + + for (next = ai->nodes; next != NULL; next = next->ai_next) { + if (next->ai_family != family) { + continue; + } + + if (*naddrttls >= req_naddrttls) { + break; + } + + if (family == AF_INET6) { + if (next->ai_ttl > cname_ttl) { + addr6ttls[*naddrttls].ttl = cname_ttl; + } else { + addr6ttls[*naddrttls].ttl = next->ai_ttl; + } + + memcpy( + &addr6ttls[*naddrttls].ip6addr, + &(CARES_INADDR_CAST(struct sockaddr_in6 *, next->ai_addr)->sin6_addr), + sizeof(struct ares_in6_addr)); + } else { + if (next->ai_ttl > cname_ttl) { + addrttls[*naddrttls].ttl = cname_ttl; + } else { + addrttls[*naddrttls].ttl = next->ai_ttl; + } + memcpy( + &addrttls[*naddrttls].ipaddr, + &(CARES_INADDR_CAST(struct sockaddr_in *, next->ai_addr)->sin_addr), + sizeof(struct in_addr)); + } + (*naddrttls)++; + } + + return ARES_SUCCESS; +} diff --git a/lib/c-ares-1.23.0/src/lib/ares__addrinfo_localhost.c b/lib/c-ares-1.23.0/src/lib/ares__addrinfo_localhost.c new file mode 100644 index 00000000000..baa9b37212b --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares__addrinfo_localhost.c @@ -0,0 +1,236 @@ +/* MIT License + * + * Copyright (c) Massachusetts Institute of Technology + * Copyright (c) Daniel Stenberg + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ + +#include "ares_setup.h" + +#ifdef HAVE_NETINET_IN_H +# include +#endif +#ifdef HAVE_NETDB_H +# include +#endif +#ifdef HAVE_ARPA_INET_H +# include +#endif + +#if defined(_WIN32) && defined(_WIN32_WINNT) && _WIN32_WINNT >= 0x0600 +# include +#endif + +#if defined(USE_WINSOCK) +# if defined(HAVE_IPHLPAPI_H) +# include +# endif +# if defined(HAVE_NETIOAPI_H) +# include +# endif +#endif + +#include "ares.h" +#include "ares_inet_net_pton.h" +#include "ares_private.h" + +ares_status_t ares_append_ai_node(int aftype, unsigned short port, + unsigned int ttl, const void *adata, + struct ares_addrinfo_node **nodes) +{ + struct ares_addrinfo_node *node; + + node = ares__append_addrinfo_node(nodes); + if (!node) { + return ARES_ENOMEM; + } + + memset(node, 0, sizeof(*node)); + + if (aftype == AF_INET) { + struct sockaddr_in *sin = ares_malloc(sizeof(*sin)); + if (!sin) { + return ARES_ENOMEM; + } + + memset(sin, 0, sizeof(*sin)); + memcpy(&sin->sin_addr.s_addr, adata, sizeof(sin->sin_addr.s_addr)); + sin->sin_family = AF_INET; + sin->sin_port = htons(port); + + node->ai_addr = (struct sockaddr *)sin; + node->ai_family = AF_INET; + node->ai_addrlen = sizeof(*sin); + node->ai_addr = (struct sockaddr *)sin; + node->ai_ttl = (int)ttl; + } + + if (aftype == AF_INET6) { + struct sockaddr_in6 *sin6 = ares_malloc(sizeof(*sin6)); + if (!sin6) { + return ARES_ENOMEM; + } + + memset(sin6, 0, sizeof(*sin6)); + memcpy(&sin6->sin6_addr.s6_addr, adata, sizeof(sin6->sin6_addr.s6_addr)); + sin6->sin6_family = AF_INET6; + sin6->sin6_port = htons(port); + + node->ai_addr = (struct sockaddr *)sin6; + node->ai_family = AF_INET6; + node->ai_addrlen = sizeof(*sin6); + node->ai_addr = (struct sockaddr *)sin6; + node->ai_ttl = (int)ttl; + } + + return ARES_SUCCESS; +} + +static ares_status_t + ares__default_loopback_addrs(int aftype, unsigned short port, + struct ares_addrinfo_node **nodes) +{ + ares_status_t status = ARES_SUCCESS; + + if (aftype == AF_UNSPEC || aftype == AF_INET6) { + struct ares_in6_addr addr6; + ares_inet_pton(AF_INET6, "::1", &addr6); + status = ares_append_ai_node(AF_INET6, port, 0, &addr6, nodes); + if (status != ARES_SUCCESS) { + return status; + } + } + + if (aftype == AF_UNSPEC || aftype == AF_INET) { + struct in_addr addr4; + ares_inet_pton(AF_INET, "127.0.0.1", &addr4); + status = ares_append_ai_node(AF_INET, port, 0, &addr4, nodes); + if (status != ARES_SUCCESS) { + return status; + } + } + + return status; +} + +static ares_status_t + ares__system_loopback_addrs(int aftype, unsigned short port, + struct ares_addrinfo_node **nodes) +{ +#if defined(_WIN32) && defined(_WIN32_WINNT) && _WIN32_WINNT >= 0x0600 && \ + !defined(__WATCOMC__) + PMIB_UNICASTIPADDRESS_TABLE table; + unsigned int i; + ares_status_t status; + + *nodes = NULL; + + if (GetUnicastIpAddressTable((ADDRESS_FAMILY)aftype, &table) != NO_ERROR) { + return ARES_ENOTFOUND; + } + + for (i = 0; i < table->NumEntries; i++) { + if (table->Table[i].InterfaceLuid.Info.IfType != + IF_TYPE_SOFTWARE_LOOPBACK) { + continue; + } + + if (table->Table[i].Address.si_family == AF_INET) { + status = + ares_append_ai_node(table->Table[i].Address.si_family, port, 0, + &table->Table[i].Address.Ipv4.sin_addr, nodes); + } else if (table->Table[i].Address.si_family == AF_INET6) { + status = + ares_append_ai_node(table->Table[i].Address.si_family, port, 0, + &table->Table[i].Address.Ipv6.sin6_addr, nodes); + } else { + /* Ignore any others */ + continue; + } + + if (status != ARES_SUCCESS) { + goto fail; + } + } + + if (*nodes == NULL) { + status = ARES_ENOTFOUND; + } + +fail: + FreeMibTable(table); + + if (status != ARES_SUCCESS) { + ares__freeaddrinfo_nodes(*nodes); + *nodes = NULL; + } + + return status; + +#else + (void)aftype; + (void)port; + (void)nodes; + /* Not supported on any other OS at this time */ + return ARES_ENOTFOUND; +#endif +} + +ares_status_t ares__addrinfo_localhost(const char *name, unsigned short port, + const struct ares_addrinfo_hints *hints, + struct ares_addrinfo *ai) +{ + struct ares_addrinfo_node *nodes = NULL; + ares_status_t status; + + /* Validate family */ + switch (hints->ai_family) { + case AF_INET: + case AF_INET6: + case AF_UNSPEC: + break; + default: + return ARES_EBADFAMILY; + } + + ai->name = ares_strdup(name); + if (!ai->name) { + goto enomem; + } + + status = ares__system_loopback_addrs(hints->ai_family, port, &nodes); + + if (status == ARES_ENOTFOUND) { + status = ares__default_loopback_addrs(hints->ai_family, port, &nodes); + } + + ares__addrinfo_cat_nodes(&ai->nodes, nodes); + + return status; + +enomem: + ares__freeaddrinfo_nodes(nodes); + ares_free(ai->name); + ai->name = NULL; + return ARES_ENOMEM; +} diff --git a/lib/c-ares-1.23.0/src/lib/ares__buf.c b/lib/c-ares-1.23.0/src/lib/ares__buf.c new file mode 100644 index 00000000000..a885db3b04b --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares__buf.c @@ -0,0 +1,974 @@ +/* MIT License + * + * Copyright (c) 2023 Brad House + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ +#include "ares_setup.h" +#include "ares.h" +#include "ares_private.h" +#include "ares__buf.h" +#include +#ifdef HAVE_STDINT_H +# include +#endif + +struct ares__buf { + const unsigned char *data; /*!< pointer to start of data buffer */ + size_t data_len; /*!< total size of data in buffer */ + + unsigned char *alloc_buf; /*!< Pointer to allocated data buffer, + * not used for const buffers */ + size_t alloc_buf_len; /*!< Size of allocated data buffer */ + + size_t offset; /*!< Current working offset in buffer */ + size_t tag_offset; /*!< Tagged offset in buffer. Uses + * SIZE_MAX if not set. */ +}; + +ares_bool_t ares__isprint(int ch) +{ + if (ch >= 0x20 && ch <= 0x7E) { + return ARES_TRUE; + } + return ARES_FALSE; +} + +/* Character set allowed by hostnames. This is to include the normal + * domain name character set plus: + * - underscores which are used in SRV records. + * - Forward slashes such as are used for classless in-addr.arpa + * delegation (CNAMEs) + * - Asterisks may be used for wildcard domains in CNAMEs as seen in the + * real world. + * While RFC 2181 section 11 does state not to do validation, + * that applies to servers, not clients. Vulnerabilities have been + * reported when this validation is not performed. Security is more + * important than edge-case compatibility (which is probably invalid + * anyhow). */ +ares_bool_t ares__is_hostnamech(int ch) +{ + /* [A-Za-z0-9-*._/] + * Don't use isalnum() as it is locale-specific + */ + if (ch >= 'A' && ch <= 'Z') { + return ARES_TRUE; + } + if (ch >= 'a' && ch <= 'z') { + return ARES_TRUE; + } + if (ch >= '0' && ch <= '9') { + return ARES_TRUE; + } + if (ch == '-' || ch == '.' || ch == '_' || ch == '/' || ch == '*') { + return ARES_TRUE; + } + + return ARES_FALSE; +} + +ares__buf_t *ares__buf_create(void) +{ + ares__buf_t *buf = ares_malloc_zero(sizeof(*buf)); + if (buf == NULL) { + return NULL; + } + + buf->tag_offset = SIZE_MAX; + return buf; +} + +ares__buf_t *ares__buf_create_const(const unsigned char *data, size_t data_len) +{ + ares__buf_t *buf; + + if (data == NULL || data_len == 0) { + return NULL; + } + + buf = ares__buf_create(); + if (buf == NULL) { + return NULL; + } + + buf->data = data; + buf->data_len = data_len; + + return buf; +} + +void ares__buf_destroy(ares__buf_t *buf) +{ + if (buf == NULL) { + return; + } + ares_free(buf->alloc_buf); + ares_free(buf); +} + +static ares_bool_t ares__buf_is_const(const ares__buf_t *buf) +{ + if (buf == NULL) { + return ARES_FALSE; + } + + if (buf->data != NULL && buf->alloc_buf == NULL) { + return ARES_TRUE; + } + + return ARES_FALSE; +} + +void ares__buf_reclaim(ares__buf_t *buf) +{ + size_t prefix_size; + size_t data_size; + + if (buf == NULL) { + return; + } + + if (ares__buf_is_const(buf)) { + return; + } + + /* Silence coverity. All lengths are zero so would bail out later but + * coverity doesn't know this */ + if (buf->alloc_buf == NULL) { + return; + } + + if (buf->tag_offset != SIZE_MAX && buf->tag_offset < buf->offset) { + prefix_size = buf->tag_offset; + } else { + prefix_size = buf->offset; + } + + if (prefix_size == 0) { + return; + } + + data_size = buf->data_len - prefix_size; + + memmove(buf->alloc_buf, buf->alloc_buf + prefix_size, data_size); + buf->data = buf->alloc_buf; + buf->data_len = data_size; + buf->offset -= prefix_size; + if (buf->tag_offset != SIZE_MAX) { + buf->tag_offset -= prefix_size; + } + + return; +} + +static ares_status_t ares__buf_ensure_space(ares__buf_t *buf, + size_t needed_size) +{ + size_t remaining_size; + size_t alloc_size; + unsigned char *ptr; + + if (buf == NULL) { + return ARES_EFORMERR; + } + + if (ares__buf_is_const(buf)) { + return ARES_EFORMERR; + } + + /* When calling ares__buf_finish_str() we end up adding a null terminator, + * so we want to ensure the size is always sufficient for this as we don't + * want an ARES_ENOMEM at that point */ + needed_size++; + + /* No need to do an expensive move operation, we have enough to just append */ + remaining_size = buf->alloc_buf_len - buf->data_len; + if (remaining_size >= needed_size) { + return ARES_SUCCESS; + } + + /* See if just moving consumed data frees up enough space */ + ares__buf_reclaim(buf); + + remaining_size = buf->alloc_buf_len - buf->data_len; + if (remaining_size >= needed_size) { + return ARES_SUCCESS; + } + + alloc_size = buf->alloc_buf_len; + + /* Not yet started */ + if (alloc_size == 0) { + alloc_size = 16; /* Always shifts 1, so ends up being 32 minimum */ + } + + /* Increase allocation by powers of 2 */ + do { + alloc_size <<= 1; + remaining_size = alloc_size - buf->data_len; + } while (remaining_size < needed_size); + + ptr = ares_realloc(buf->alloc_buf, alloc_size); + if (ptr == NULL) { + return ARES_ENOMEM; + } + + buf->alloc_buf = ptr; + buf->alloc_buf_len = alloc_size; + buf->data = ptr; + + return ARES_SUCCESS; +} + +ares_status_t ares__buf_set_length(ares__buf_t *buf, size_t len) +{ + if (buf == NULL || ares__buf_is_const(buf)) { + return ARES_EFORMERR; + } + + if (len >= buf->alloc_buf_len - buf->offset) { + return ARES_EFORMERR; + } + + buf->data_len = len; + return ARES_SUCCESS; +} + +ares_status_t ares__buf_append(ares__buf_t *buf, const unsigned char *data, + size_t data_len) +{ + ares_status_t status; + + if (data == NULL || data_len == 0) { + return ARES_EFORMERR; + } + + status = ares__buf_ensure_space(buf, data_len); + if (status != ARES_SUCCESS) { + return status; + } + + memcpy(buf->alloc_buf + buf->data_len, data, data_len); + buf->data_len += data_len; + return ARES_SUCCESS; +} + +ares_status_t ares__buf_append_byte(ares__buf_t *buf, unsigned char byte) +{ + return ares__buf_append(buf, &byte, 1); +} + +ares_status_t ares__buf_append_be16(ares__buf_t *buf, unsigned short u16) +{ + ares_status_t status; + + status = ares__buf_append_byte(buf, (unsigned char)((u16 >> 8) & 0xff)); + if (status != ARES_SUCCESS) { + return status; + } + + status = ares__buf_append_byte(buf, (unsigned char)(u16 & 0xff)); + if (status != ARES_SUCCESS) { + return status; + } + + return ARES_SUCCESS; +} + +ares_status_t ares__buf_append_be32(ares__buf_t *buf, unsigned int u32) +{ + ares_status_t status; + + status = ares__buf_append_byte(buf, ((unsigned char)(u32 >> 24) & 0xff)); + if (status != ARES_SUCCESS) { + return status; + } + + status = ares__buf_append_byte(buf, ((unsigned char)(u32 >> 16) & 0xff)); + if (status != ARES_SUCCESS) { + return status; + } + + status = ares__buf_append_byte(buf, ((unsigned char)(u32 >> 8) & 0xff)); + if (status != ARES_SUCCESS) { + return status; + } + + status = ares__buf_append_byte(buf, ((unsigned char)u32 & 0xff)); + if (status != ARES_SUCCESS) { + return status; + } + + return ARES_SUCCESS; +} + +unsigned char *ares__buf_append_start(ares__buf_t *buf, size_t *len) +{ + ares_status_t status; + + if (len == NULL || *len == 0) { + return NULL; + } + + status = ares__buf_ensure_space(buf, *len); + if (status != ARES_SUCCESS) { + return NULL; + } + + /* -1 for possible null terminator for ares__buf_finish_str() */ + *len = buf->alloc_buf_len - buf->data_len - 1; + return buf->alloc_buf + buf->data_len; +} + +void ares__buf_append_finish(ares__buf_t *buf, size_t len) +{ + if (buf == NULL) { + return; + } + + buf->data_len += len; +} + +unsigned char *ares__buf_finish_bin(ares__buf_t *buf, size_t *len) +{ + unsigned char *ptr = NULL; + if (buf == NULL || len == NULL || ares__buf_is_const(buf)) { + return NULL; + } + + ares__buf_reclaim(buf); + + /* We don't want to return NULL except on failure, may be zero-length */ + if (buf->alloc_buf == NULL && + ares__buf_ensure_space(buf, 1) != ARES_SUCCESS) { + return NULL; + } + ptr = buf->alloc_buf; + *len = buf->data_len; + ares_free(buf); + return ptr; +} + +char *ares__buf_finish_str(ares__buf_t *buf, size_t *len) +{ + char *ptr; + size_t mylen; + + ptr = (char *)ares__buf_finish_bin(buf, &mylen); + if (ptr == NULL) { + return NULL; + } + + if (len != NULL) { + *len = mylen; + } + + /* NOTE: ensured via ares__buf_ensure_space() that there is always at least + * 1 extra byte available for this specific use-case */ + ptr[mylen] = 0; + + return ptr; +} + +void ares__buf_tag(ares__buf_t *buf) +{ + if (buf == NULL) { + return; + } + + buf->tag_offset = buf->offset; +} + +ares_status_t ares__buf_tag_rollback(ares__buf_t *buf) +{ + if (buf == NULL || buf->tag_offset == SIZE_MAX) { + return ARES_EFORMERR; + } + + buf->offset = buf->tag_offset; + buf->tag_offset = SIZE_MAX; + return ARES_SUCCESS; +} + +ares_status_t ares__buf_tag_clear(ares__buf_t *buf) +{ + if (buf == NULL || buf->tag_offset == SIZE_MAX) { + return ARES_EFORMERR; + } + + buf->tag_offset = SIZE_MAX; + return ARES_SUCCESS; +} + +const unsigned char *ares__buf_tag_fetch(const ares__buf_t *buf, size_t *len) +{ + if (buf == NULL || buf->tag_offset == SIZE_MAX || len == NULL) { + return NULL; + } + + *len = buf->offset - buf->tag_offset; + return buf->data + buf->tag_offset; +} + +size_t ares__buf_tag_length(const ares__buf_t *buf) +{ + if (buf == NULL || buf->tag_offset == SIZE_MAX) { + return 0; + } + return buf->offset - buf->tag_offset; +} + +ares_status_t ares__buf_tag_fetch_bytes(const ares__buf_t *buf, + unsigned char *bytes, size_t *len) +{ + size_t ptr_len = 0; + const unsigned char *ptr = ares__buf_tag_fetch(buf, &ptr_len); + + if (ptr == NULL || bytes == NULL || len == NULL) { + return ARES_EFORMERR; + } + + if (*len < ptr_len) { + return ARES_EFORMERR; + } + + *len = ptr_len; + + if (ptr_len > 0) { + memcpy(bytes, ptr, ptr_len); + } + return ARES_SUCCESS; +} + +ares_status_t ares__buf_tag_fetch_string(const ares__buf_t *buf, char *str, + size_t len) +{ + size_t out_len; + ares_status_t status; + size_t i; + + if (str == NULL || len == 0) { + return ARES_EFORMERR; + } + + /* Space for NULL terminator */ + out_len = len - 1; + + status = ares__buf_tag_fetch_bytes(buf, (unsigned char *)str, &out_len); + if (status != ARES_SUCCESS) { + return status; + } + + /* NULL terminate */ + str[out_len] = 0; + + /* Validate string is printable */ + for (i = 0; i < out_len; i++) { + if (!ares__isprint(str[i])) { + return ARES_EBADSTR; + } + } + + return ARES_SUCCESS; +} + +static const unsigned char *ares__buf_fetch(const ares__buf_t *buf, size_t *len) +{ + if (len != NULL) { + *len = 0; + } + + if (buf == NULL || len == NULL || buf->data == NULL) { + return NULL; + } + + *len = buf->data_len - buf->offset; + return buf->data + buf->offset; +} + +ares_status_t ares__buf_consume(ares__buf_t *buf, size_t len) +{ + size_t remaining_len; + + ares__buf_fetch(buf, &remaining_len); + + if (remaining_len < len) { + return ARES_EBADRESP; + } + + buf->offset += len; + return ARES_SUCCESS; +} + +ares_status_t ares__buf_fetch_be16(ares__buf_t *buf, unsigned short *u16) +{ + size_t remaining_len; + const unsigned char *ptr = ares__buf_fetch(buf, &remaining_len); + unsigned int u32; + + if (buf == NULL || u16 == NULL || remaining_len < sizeof(*u16)) { + return ARES_EBADRESP; + } + + /* Do math in an unsigned int in order to prevent warnings due to automatic + * conversion by the compiler from short to int during shifts */ + u32 = ((unsigned int)(ptr[0]) << 8 | (unsigned int)ptr[1]); + *u16 = (unsigned short)(u32 & 0xFFFF); + + return ares__buf_consume(buf, sizeof(*u16)); +} + +ares_status_t ares__buf_fetch_be32(ares__buf_t *buf, unsigned int *u32) +{ + size_t remaining_len; + const unsigned char *ptr = ares__buf_fetch(buf, &remaining_len); + + if (buf == NULL || u32 == NULL || remaining_len < sizeof(*u32)) { + return ARES_EBADRESP; + } + + *u32 = ((unsigned int)(ptr[0]) << 24 | (unsigned int)(ptr[1]) << 16 | + (unsigned int)(ptr[2]) << 8 | (unsigned int)(ptr[3])); + + return ares__buf_consume(buf, sizeof(*u32)); +} + +ares_status_t ares__buf_fetch_bytes(ares__buf_t *buf, unsigned char *bytes, + size_t len) +{ + size_t remaining_len; + const unsigned char *ptr = ares__buf_fetch(buf, &remaining_len); + + if (buf == NULL || bytes == NULL || len == 0 || remaining_len < len) { + return ARES_EBADRESP; + } + + memcpy(bytes, ptr, len); + return ares__buf_consume(buf, len); +} + +ares_status_t ares__buf_fetch_bytes_dup(ares__buf_t *buf, size_t len, + ares_bool_t null_term, + unsigned char **bytes) +{ + size_t remaining_len; + const unsigned char *ptr = ares__buf_fetch(buf, &remaining_len); + + if (buf == NULL || bytes == NULL || len == 0 || remaining_len < len) { + return ARES_EBADRESP; + } + + *bytes = ares_malloc(null_term ? len + 1 : len); + if (*bytes == NULL) { + return ARES_ENOMEM; + } + + memcpy(*bytes, ptr, len); + if (null_term) { + (*bytes)[len] = 0; + } + return ares__buf_consume(buf, len); +} + +ares_status_t ares__buf_fetch_str_dup(ares__buf_t *buf, size_t len, char **str) +{ + size_t remaining_len; + const unsigned char *ptr = ares__buf_fetch(buf, &remaining_len); + + if (buf == NULL || str == NULL || len == 0 || remaining_len < len) { + return ARES_EBADRESP; + } + + *str = ares_malloc(len + 1); + if (*str == NULL) { + return ARES_ENOMEM; + } + + memcpy(*str, ptr, len); + (*str)[len] = 0; + + return ares__buf_consume(buf, len); +} + +ares_status_t ares__buf_fetch_bytes_into_buf(ares__buf_t *buf, + ares__buf_t *dest, size_t len) +{ + size_t remaining_len; + const unsigned char *ptr = ares__buf_fetch(buf, &remaining_len); + ares_status_t status; + + if (buf == NULL || dest == NULL || len == 0 || remaining_len < len) { + return ARES_EBADRESP; + } + + status = ares__buf_append(dest, ptr, len); + if (status != ARES_SUCCESS) { + return status; + } + + return ares__buf_consume(buf, len); +} + +size_t ares__buf_consume_whitespace(ares__buf_t *buf, + ares_bool_t include_linefeed) +{ + size_t remaining_len = 0; + const unsigned char *ptr = ares__buf_fetch(buf, &remaining_len); + size_t i; + + if (ptr == NULL) { + return 0; + } + + for (i = 0; i < remaining_len; i++) { + switch (ptr[i]) { + case '\r': + case '\t': + case ' ': + case '\v': + case '\f': + break; + case '\n': + if (!include_linefeed) { + goto done; + } + break; + default: + goto done; + } + } + +done: + if (i > 0) { + ares__buf_consume(buf, i); + } + return i; +} + +size_t ares__buf_consume_nonwhitespace(ares__buf_t *buf) +{ + size_t remaining_len = 0; + const unsigned char *ptr = ares__buf_fetch(buf, &remaining_len); + size_t i; + + if (ptr == NULL) { + return 0; + } + + for (i = 0; i < remaining_len; i++) { + switch (ptr[i]) { + case '\r': + case '\t': + case ' ': + case '\v': + case '\f': + case '\n': + goto done; + default: + break; + } + } + +done: + if (i > 0) { + ares__buf_consume(buf, i); + } + return i; +} + +size_t ares__buf_consume_line(ares__buf_t *buf, ares_bool_t include_linefeed) +{ + size_t remaining_len = 0; + const unsigned char *ptr = ares__buf_fetch(buf, &remaining_len); + size_t i; + + if (ptr == NULL) { + return 0; + } + + for (i = 0; i < remaining_len; i++) { + if (ptr[i] == '\n') { + goto done; + } + } + +done: + if (include_linefeed && i < remaining_len && ptr[i] == '\n') { + i++; + } + + if (i > 0) { + ares__buf_consume(buf, i); + } + return i; +} + +ares_status_t ares__buf_begins_with(const ares__buf_t *buf, + const unsigned char *data, size_t data_len) +{ + size_t remaining_len = 0; + const unsigned char *ptr = ares__buf_fetch(buf, &remaining_len); + + if (ptr == NULL || data == NULL || data_len == 0) { + return ARES_EFORMERR; + } + + if (data_len > remaining_len) { + return ARES_EBADRESP; + } + + if (memcmp(ptr, data, data_len) == 0) { + return ARES_EBADRESP; + } + + return ARES_SUCCESS; +} + +size_t ares__buf_len(const ares__buf_t *buf) +{ + size_t len = 0; + ares__buf_fetch(buf, &len); + return len; +} + +const unsigned char *ares__buf_peek(const ares__buf_t *buf, size_t *len) +{ + return ares__buf_fetch(buf, len); +} + +size_t ares__buf_get_position(const ares__buf_t *buf) +{ + if (buf == NULL) { + return 0; + } + return buf->offset; +} + +ares_status_t ares__buf_set_position(ares__buf_t *buf, size_t idx) +{ + if (buf == NULL) { + return ARES_EFORMERR; + } + + if (idx > buf->data_len) { + return ARES_EFORMERR; + } + + buf->offset = idx; + return ARES_SUCCESS; +} + +ares_status_t ares__buf_parse_dns_binstr(ares__buf_t *buf, size_t remaining_len, + unsigned char **bin, size_t *bin_len, + ares_bool_t allow_multiple) +{ + unsigned char len; + ares_status_t status; + ares__buf_t *binbuf = NULL; + size_t orig_len = ares__buf_len(buf); + + if (buf == NULL) { + return ARES_EFORMERR; + } + + if (remaining_len == 0) { + return ARES_EBADRESP; + } + + binbuf = ares__buf_create(); + if (binbuf == NULL) { + return ARES_ENOMEM; + } + + while (orig_len - ares__buf_len(buf) < remaining_len) { + status = ares__buf_fetch_bytes(buf, &len, 1); + if (status != ARES_SUCCESS) { + break; + } + + if (len) { + /* XXX: Maybe we should scan to make sure it is printable? */ + if (bin != NULL) { + status = ares__buf_fetch_bytes_into_buf(buf, binbuf, len); + } else { + status = ares__buf_consume(buf, len); + } + if (status != ARES_SUCCESS) { + break; + } + } + + if (!allow_multiple) { + break; + } + } + + + if (status != ARES_SUCCESS) { + ares__buf_destroy(binbuf); + } else { + if (bin != NULL) { + size_t mylen = 0; + /* NOTE: we use ares__buf_finish_str() here as we guarantee NULL + * Termination even though we are technically returning binary data. + */ + *bin = (unsigned char *)ares__buf_finish_str(binbuf, &mylen); + *bin_len = mylen; + } + } + + return status; +} + +ares_status_t ares__buf_parse_dns_str(ares__buf_t *buf, size_t remaining_len, + char **str, ares_bool_t allow_multiple) +{ + size_t len; + return ares__buf_parse_dns_binstr(buf, remaining_len, (unsigned char **)str, + &len, allow_multiple); +} + +ares_status_t ares__buf_append_num_dec(ares__buf_t *buf, size_t num, size_t len) +{ + size_t i; + size_t mod; + + if (len == 0) { + len = ares__count_digits(num); + } + + mod = ares__pow(10, len); + + for (i = len; i > 0; i--) { + size_t digit = (num % mod); + ares_status_t status; + + mod /= 10; + + /* Silence coverity. Shouldn't be possible since we calculate it above */ + if (mod == 0) { + return ARES_EFORMERR; + } + + digit /= mod; + status = ares__buf_append_byte(buf, '0' + (unsigned char)(digit & 0xFF)); + if (status != ARES_SUCCESS) { + return status; + } + } + return ARES_SUCCESS; +} + +ares_status_t ares__buf_append_num_hex(ares__buf_t *buf, size_t num, size_t len) +{ + size_t i; + static const unsigned char hexbytes[] = "0123456789ABCDEF"; + + if (len == 0) { + len = ares__count_hexdigits(num); + } + + for (i = len; i > 0; i--) { + ares_status_t status; + status = ares__buf_append_byte(buf, hexbytes[(num >> ((i - 1) * 4)) & 0xF]); + if (status != ARES_SUCCESS) { + return status; + } + } + return ARES_SUCCESS; +} + +ares_status_t ares__buf_append_str(ares__buf_t *buf, const char *str) +{ + return ares__buf_append(buf, (const unsigned char *)str, ares_strlen(str)); +} + +static ares_status_t ares__buf_hexdump_line(ares__buf_t *buf, size_t idx, + const unsigned char *data, + size_t len) +{ + size_t i; + ares_status_t status; + + /* Address */ + status = ares__buf_append_num_hex(buf, idx, 6); + if (status != ARES_SUCCESS) { + return status; + } + + /* | */ + status = ares__buf_append_str(buf, " | "); + if (status != ARES_SUCCESS) { + return status; + } + + for (i = 0; i < 16; i++) { + if (i >= len) { + status = ares__buf_append_str(buf, " "); + } else { + status = ares__buf_append_num_hex(buf, data[i], 2); + } + if (status != ARES_SUCCESS) { + return status; + } + + status = ares__buf_append_byte(buf, ' '); + if (status != ARES_SUCCESS) { + return status; + } + } + + /* | */ + status = ares__buf_append_str(buf, " | "); + if (status != ARES_SUCCESS) { + return status; + } + + for (i = 0; i < 16; i++) { + if (i >= len) { + break; + } + status = ares__buf_append_byte(buf, ares__isprint(data[i]) ? data[i] : '.'); + if (status != ARES_SUCCESS) { + return status; + } + } + + return ares__buf_append_byte(buf, '\n'); +} + +ares_status_t ares__buf_hexdump(ares__buf_t *buf, const unsigned char *data, + size_t len) +{ + size_t i; + + /* Each line is 16 bytes */ + for (i = 0; i < len; i += 16) { + ares_status_t status; + status = ares__buf_hexdump_line(buf, i, data + i, len - i); + if (status != ARES_SUCCESS) { + return status; + } + } + + return ARES_SUCCESS; +} diff --git a/lib/c-ares-1.23.0/src/lib/ares__buf.h b/lib/c-ares-1.23.0/src/lib/ares__buf.h new file mode 100644 index 00000000000..baa28e06a39 --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares__buf.h @@ -0,0 +1,508 @@ +/* MIT License + * + * Copyright (c) 2023 Brad House + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ +#ifndef __ARES__BUF_H +#define __ARES__BUF_H + +/*! \addtogroup ares__buf Safe Data Builder and buffer + * + * This is a buffer building and parsing framework with a focus on security over + * performance. All data to be read from the buffer will perform explicit length + * validation and return a success/fail result. There are also various helpers + * for writing data to the buffer which dynamically grows. + * + * All operations that fetch or consume data from the buffer will move forward + * the internal pointer, thus marking the data as processed which may no longer + * be accessible after certain operations (such as append). + * + * The helpers for this object are meant to be added as needed. If you can't + * find it, write it! + * + * @{ + */ +struct ares__buf; + +/*! Opaque data type for generic hash table implementation */ +typedef struct ares__buf ares__buf_t; + +/*! Create a new buffer object that dynamically allocates buffers for data. + * + * \return initialized buffer object or NULL if out of memory. + */ +ares__buf_t *ares__buf_create(void); + +/*! Create a new buffer object that uses a user-provided data pointer. The + * data provided will not be manipulated, and cannot be appended to. This + * is strictly used for parsing. + * + * \param[in] data Data to provide to buffer, must not be NULL. + * \param[in] data_len Size of buffer provided, must be > 0 + * + * \return initialized buffer object or NULL if out of memory or misuse. + */ +ares__buf_t *ares__buf_create_const(const unsigned char *data, size_t data_len); + + +/*! Destroy an initialized buffer object. + * + * \param[in] buf Initialized buf object + */ +void ares__buf_destroy(ares__buf_t *buf); + + +/*! Append multiple bytes to a dynamic buffer object + * + * \param[in] buf Initialized buffer object + * \param[in] data Data to copy to buffer object + * \param[in] data_len Length of data to copy to buffer object. + * \return ARES_SUCCESS or one of the c-ares error codes + */ +ares_status_t ares__buf_append(ares__buf_t *buf, const unsigned char *data, + size_t data_len); + +/*! Append a single byte to the dynamic buffer object + * + * \param[in] buf Initialized buffer object + * \param[in] byte Single byte to append to buffer object. + * \return ARES_SUCCESS or one of the c-ares error codes + */ +ares_status_t ares__buf_append_byte(ares__buf_t *buf, unsigned char byte); + +/*! Append a null-terminated string to the dynamic buffer object + * + * \param[in] buf Initialized buffer object + * \param[in] str String to append to buffer object. + * \return ARES_SUCCESS or one of the c-ares error codes + */ +ares_status_t ares__buf_append_str(ares__buf_t *buf, const char *str); + +/*! Append a 16bit Big Endian number to the buffer. + * + * \param[in] buf Initialized buffer object + * \param[out] u16 16bit integer + * \return ARES_SUCCESS or one of the c-ares error codes + */ +ares_status_t ares__buf_append_be16(ares__buf_t *buf, unsigned short u16); + +/*! Append a 32bit Big Endian number to the buffer. + * + * \param[in] buf Initialized buffer object + * \param[out] u32 32bit integer + * \return ARES_SUCCESS or one of the c-ares error codes + */ +ares_status_t ares__buf_append_be32(ares__buf_t *buf, unsigned int u32); + +/*! Append a number in ASCII decimal form. + * + * \param[in] buf Initialized buffer object + * \param[in] num Number to print + * \param[in] len Length to output, use 0 for no padding + * \return ARES_SUCCESS on success + */ +ares_status_t ares__buf_append_num_dec(ares__buf_t *buf, size_t num, + size_t len); + +/*! Append a number in ASCII hexadecimal form. + * + * \param[in] buf Initialized buffer object + * \param[in] num Number to print + * \param[in] len Length to output, use 0 for no padding + * \return ARES_SUCCESS on success + */ +ares_status_t ares__buf_append_num_hex(ares__buf_t *buf, size_t num, + size_t len); + +/*! Sets the current buffer length. This *may* be used if there is a need to + * override a prior position in the buffer, such as if there is a length + * prefix that isn't easily predictable, and you must go back and overwrite + * that position. + * + * Only valid on non-const buffers. Length provided must not exceed current + * allocated buffer size, but otherwise there are very few protections on + * this function. Use cautiously. + * + * \param[in] buf Initialized buffer object + * \param[in] len Length to set + * \return ARES_SUCCESS or one of the c-ares error codes + */ +ares_status_t ares__buf_set_length(ares__buf_t *buf, size_t len); + + +/*! Start a dynamic append operation that returns a buffer suitable for + * writing. A desired minimum length is passed in, and the actual allocated + * buffer size is returned which may be greater than the requested size. + * No operation other than ares__buf_append_finish() is allowed on the + * buffer after this request. + * + * \param[in] buf Initialized buffer object + * \param[in,out] len Desired non-zero length passed in, actual buffer size + * returned. + * \return Pointer to writable buffer or NULL on failure (usage, out of mem) + */ +unsigned char *ares__buf_append_start(ares__buf_t *buf, size_t *len); + +/*! Finish a dynamic append operation. Called after + * ares__buf_append_start() once desired data is written. + * + * \param[in] buf Initialized buffer object. + * \param[in] len Length of data written. May be zero to terminate + * operation. Must not be greater than returned from + * ares__buf_append_start(). + */ +void ares__buf_append_finish(ares__buf_t *buf, size_t len); + +/*! Write the data provided to the buffer in a hexdump format. + * + * \param[in] buf Initialized buffer object. + * \param[in] data Data to hex dump + * \param[in] data_len Length of data to hexdump + * \return ARES_SUCCESS on success. + */ +ares_status_t ares__buf_hexdump(ares__buf_t *buf, const unsigned char *data, + size_t len); + +/*! Clean up ares__buf_t and return allocated pointer to unprocessed data. It + * is the responsibility of the caller to ares_free() the returned buffer. + * The passed in buf parameter is invalidated by this call. + * + * \param[in] buf Initialized buffer object. Can not be a "const" buffer. + * \param[out] len Length of data returned + * \return pointer to unprocessed data (may be zero length) or NULL on error. + */ +unsigned char *ares__buf_finish_bin(ares__buf_t *buf, size_t *len); + +/*! Clean up ares__buf_t and return allocated pointer to unprocessed data and + * return it as a string (null terminated). It is the responsibility of the + * caller to ares_free() the returned buffer. The passed in buf parameter is + * invalidated by this call. + * + * This function in no way validates the data in this buffer is actually + * a string, that characters are printable, or that there aren't multiple + * NULL terminators. It is assumed that the caller will either validate that + * themselves or has built this buffer with only a valid character set. + * + * \param[in] buf Initialized buffer object. Can not be a "const" buffer. + * \param[out] len Optional. Length of data returned, or NULL if not needed. + * \return pointer to unprocessed data or NULL on error. + */ +char *ares__buf_finish_str(ares__buf_t *buf, size_t *len); + +/*! Tag a position to save in the buffer in case parsing needs to rollback, + * such as if insufficient data is available, but more data may be added in + * the future. Only a single tag can be set per buffer object. Setting a + * tag will override any pre-existing tag. + * + * \param[in] buf Initialized buffer object + */ +void ares__buf_tag(ares__buf_t *buf); + +/*! Rollback to a tagged position. Will automatically clear the tag. + * + * \param[in] buf Initialized buffer object + * \return ARES_SUCCESS or one of the c-ares error codes + */ +ares_status_t ares__buf_tag_rollback(ares__buf_t *buf); + +/*! Clear the tagged position without rolling back. You should do this any + * time a tag is no longer needed as future append operations can reclaim + * buffer space. + * + * \param[in] buf Initialized buffer object + * \return ARES_SUCCESS or one of the c-ares error codes + */ +ares_status_t ares__buf_tag_clear(ares__buf_t *buf); + +/*! Fetch the buffer and length of data starting from the tagged position up + * to the _current_ position. It will not unset the tagged position. The + * data may be invalidated by any future ares__buf_*() calls. + * + * \param[in] buf Initialized buffer object + * \param[out] len Length between tag and current offset in buffer + * \return NULL on failure (such as no tag), otherwise pointer to start of + * buffer + */ +const unsigned char *ares__buf_tag_fetch(const ares__buf_t *buf, size_t *len); + +/*! Get the length of the current tag offset to the current position. + * + * \param[in] buf Initialized buffer object + * \return length + */ +size_t ares__buf_tag_length(const ares__buf_t *buf); + +/*! Fetch the bytes starting from the tagged position up to the _current_ + * position using the provided buffer. It will not unset the tagged position. + * + * \param[in] buf Initialized buffer object + * \param[in,out] bytes Buffer to hold data + * \param[in,out] len On input, buffer size, on output, bytes place in + * buffer. + * \return ARES_SUCCESS if fetched, ARES_EFORMERR if insufficient buffer size + */ +ares_status_t ares__buf_tag_fetch_bytes(const ares__buf_t *buf, + unsigned char *bytes, size_t *len); + +/*! Fetch the bytes starting from the tagged position up to the _current_ + * position as a NULL-terminated string using the provided buffer. The data + * is validated to be ASCII-printable data. It will not unset the tagged + * poition. + * + * \param[in] buf Initialized buffer object + * \param[in,out] str Buffer to hold data + * \param[in] len On input, buffer size, on output, bytes place in + * buffer. + * \return ARES_SUCCESS if fetched, ARES_EFORMERR if insufficient buffer size, + * ARES_EBADSTR if not printable ASCII + */ +ares_status_t ares__buf_tag_fetch_string(const ares__buf_t *buf, char *str, + size_t len); + +/*! Consume the given number of bytes without reading them. + * + * \param[in] buf Initialized buffer object + * \param[in] len Length to consume + * \return ARES_SUCCESS or one of the c-ares error codes + */ +ares_status_t ares__buf_consume(ares__buf_t *buf, size_t len); + +/*! Fetch a 16bit Big Endian number from the buffer. + * + * \param[in] buf Initialized buffer object + * \param[out] u16 Buffer to hold 16bit integer + * \return ARES_SUCCESS or one of the c-ares error codes + */ +ares_status_t ares__buf_fetch_be16(ares__buf_t *buf, unsigned short *u16); + +/*! Fetch a 32bit Big Endian number from the buffer. + * + * \param[in] buf Initialized buffer object + * \param[out] u32 Buffer to hold 32bit integer + * \return ARES_SUCCESS or one of the c-ares error codes + */ +ares_status_t ares__buf_fetch_be32(ares__buf_t *buf, unsigned int *u32); + + +/*! Fetch the requested number of bytes into the provided buffer + * + * \param[in] buf Initialized buffer object + * \param[out] bytes Buffer to hold data + * \param[in] len Requested number of bytes (must be > 0) + * \return ARES_SUCCESS or one of the c-ares error codes + */ +ares_status_t ares__buf_fetch_bytes(ares__buf_t *buf, unsigned char *bytes, + size_t len); + + +/*! Fetch the requested number of bytes and return a new buffer that must be + * ares_free()'d by the caller. + * + * \param[in] buf Initialized buffer object + * \param[in] len Requested number of bytes (must be > 0) + * \param[in] null_term Even though this is considered binary data, the user + * knows it may be a vald string, so add a null + * terminator. + * \param[out] bytes Pointer passed by reference. Will be allocated. + * \return ARES_SUCCESS or one of the c-ares error codes + */ +ares_status_t ares__buf_fetch_bytes_dup(ares__buf_t *buf, size_t len, + ares_bool_t null_term, + unsigned char **bytes); + +/*! Fetch the requested number of bytes and place them into the provided + * dest buffer object. + * + * \param[in] buf Initialized buffer object + * \param[out] dest Buffer object to append bytes. + * \param[in] len Requested number of bytes (must be > 0) + * \return ARES_SUCCESS or one of the c-ares error codes + */ +ares_status_t ares__buf_fetch_bytes_into_buf(ares__buf_t *buf, + ares__buf_t *dest, size_t len); + +/*! Fetch the requested number of bytes and return a new buffer that must be + * ares_free()'d by the caller. The returned buffer is a null terminated + * string. + * + * \param[in] buf Initialized buffer object + * \param[in] len Requested number of bytes (must be > 0) + * \param[out] str Pointer passed by reference. Will be allocated. + * \return ARES_SUCCESS or one of the c-ares error codes + */ +ares_status_t ares__buf_fetch_str_dup(ares__buf_t *buf, size_t len, char **str); + +/*! Consume whitespace characters (0x09, 0x0B, 0x0C, 0x0D, 0x20, and optionally + * 0x0A). + * + * \param[in] buf Initialized buffer object + * \param[in] include_linefeed ARES_TRUE to include consuming 0x0A, + * ARES_FALSE otherwise. + * \return number of whitespace characters consumed + */ +size_t ares__buf_consume_whitespace(ares__buf_t *buf, + ares_bool_t include_linefeed); + + +/*! Consume any non-whitespace character (anything other than 0x09, 0x0B, 0x0C, + * 0x0D, 0x20, and 0x0A). + * + * \param[in] buf Initialized buffer object + * \return number of characters consumed + */ +size_t ares__buf_consume_nonwhitespace(ares__buf_t *buf); + +/*! Consume from the current position until the end of the line, and optionally + * the end of line character (0x0A) itself. + * + * \param[in] buf Initialized buffer object + * \param[in] include_linefeed ARES_TRUE to include consuming 0x0A, + * ARES_FALSE otherwise. + * \return number of characters consumed + */ +size_t ares__buf_consume_line(ares__buf_t *buf, ares_bool_t include_linefeed); + + +/*! Check the unprocessed buffer to see if it begins with the sequence of + * characters provided. + * + * \param[in] buf Initialized buffer object + * \param[in] data Bytes of data to compare. + * \param[in] data_len Length of data to compare. + * \return ARES_SUCCESS or one of the c-ares error codes + */ +ares_status_t ares__buf_begins_with(const ares__buf_t *buf, + const unsigned char *data, size_t data_len); + + +/*! Size of unprocessed remaining data length + * + * \param[in] buf Initialized buffer object + * \return length remaining + */ +size_t ares__buf_len(const ares__buf_t *buf); + +/*! Retrieve a pointer to the currently unprocessed data. Generally this isn't + * recommended to be used in practice. The returned pointer may be invalidated + * by any future ares__buf_*() calls. + * + * \param[in] buf Initialized buffer object + * \param[out] len Length of available data + * \return Pointer to buffer of unprocessed data + */ +const unsigned char *ares__buf_peek(const ares__buf_t *buf, size_t *len); + + +/*! Wipe any processed data from the beginning of the buffer. This will + * move any remaining data to the front of the internally allocated buffer. + * + * Can not be used on const buffer objects. + * + * Typically not needed to call, as any new append operation will automatically + * call this function if there is insufficient space to append the data in + * order to try to avoid another memory allocation. + * + * It may be useful to call in order to ensure the current message being + * processed is in the beginning of the buffer if there is an intent to use + * ares__buf_set_position() and ares__buf_get_position() as may be necessary + * when processing DNS compressed names. + * + * If there is an active tag, it will NOT clear the tag, it will use the tag + * as the start of the unprocessed data rather than the current offset. If + * a prior tag is no longer needed, may be wise to call ares__buf_tag_clear(). + * + * \param[in] buf Initialized buffer object + */ +void ares__buf_reclaim(ares__buf_t *buf); + +/*! Set the current offset within the internal buffer. + * + * Typically this should not be used, if possible, use the ares__buf_tag*() + * operations instead. + * + * One exception is DNS name compression which may backwards reference to + * an index in the message. It may be necessary in such a case to call + * ares__buf_reclaim() if using a dynamic (non-const) buffer before processing + * such a message. + * + * \param[in] buf Initialized buffer object + * \param[in] idx Index to set position + * \return ARES_SUCCESS if valid index + */ +ares_status_t ares__buf_set_position(ares__buf_t *buf, size_t idx); + +/*! Get the current offset within the internal buffer. + * + * Typically this should not be used, if possible, use the ares__buf_tag*() + * operations instead. + * + * This can be used to get the current position, useful for saving if a + * jump via ares__buf_set_position() is performed and need to restore the + * current position for future operations. + * + * \param[in] buf Initialized buffer object + * \return index of current position + */ +size_t ares__buf_get_position(const ares__buf_t *buf); + +/*! Parse a character-string as defined in RFC1035, as a null-terminated + * string. + * + * \param[in] buf initialized buffer object + * \param[in] remaining_len maximum length that should be used for parsing + * the string, this is often less than the remaining + * buffer and is based on the RR record length. + * \param[out] str Pointer passed by reference to be filled in with + * allocated string of the parsed that must be + * ares_free()'d by the caller. + * \param[in] allow_multiple ARES_TRUE if it should attempt to parse multiple + * strings back to back, and will concatenate in + * the returned str. + * \return ARES_SUCCESS on success + */ +ares_status_t ares__buf_parse_dns_str(ares__buf_t *buf, size_t remaining_len, + char **name, ares_bool_t allow_multiple); + +/*! Parse a character-string as defined in RFC1035, as binary, however for + * convenience this does guarantee a NULL terminator (that is not included + * in the returned length). + * + * \param[in] buf initialized buffer object + * \param[in] remaining_len maximum length that should be used for parsing + * the string, this is often less than the remaining + * buffer and is based on the RR record length. + * \param[out] bin Pointer passed by reference to be filled in with + * allocated string of the parsed that must be + * ares_free()'d by the caller. + * \param[out] bin_len Length of returned string. + * \param[in] allow_multiple ARES_TRUE if it should attempt to parse multiple + * strings back to back, and will concatenate in + * the returned str. + * \return ARES_SUCCESS on success + */ +ares_status_t ares__buf_parse_dns_binstr(ares__buf_t *buf, size_t remaining_len, + unsigned char **bin, size_t *bin_len, + ares_bool_t allow_multiple); +/*! @} */ + +#endif /* __ARES__BUF_H */ diff --git a/lib/c-ares-1.23.0/src/lib/ares__close_sockets.c b/lib/c-ares-1.23.0/src/lib/ares__close_sockets.c new file mode 100644 index 00000000000..3aba9f649ee --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares__close_sockets.c @@ -0,0 +1,111 @@ +/* MIT License + * + * Copyright (c) 1998 Massachusetts Institute of Technology + * Copyright (c) The c-ares project and its contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ + +#include "ares_setup.h" + +#include "ares.h" +#include "ares_private.h" +#include + +static void ares__requeue_queries(struct server_connection *conn) +{ + struct query *query; + struct timeval now = ares__tvnow(); + + while ((query = ares__llist_first_val(conn->queries_to_conn)) != NULL) { + ares__requeue_query(query, &now); + } +} + +void ares__close_connection(struct server_connection *conn) +{ + struct server_state *server = conn->server; + ares_channel_t *channel = server->channel; + + /* Unlink */ + ares__llist_node_claim( + ares__htable_asvp_get_direct(channel->connnode_by_socket, conn->fd)); + ares__htable_asvp_remove(channel->connnode_by_socket, conn->fd); + + if (conn->is_tcp) { + /* Reset any existing input and output buffer. */ + ares__buf_consume(server->tcp_parser, ares__buf_len(server->tcp_parser)); + ares__buf_consume(server->tcp_send, ares__buf_len(server->tcp_send)); + server->tcp_conn = NULL; + } + + /* Requeue queries to other connections */ + ares__requeue_queries(conn); + + ares__llist_destroy(conn->queries_to_conn); + + SOCK_STATE_CALLBACK(channel, conn->fd, 0, 0); + ares__close_socket(channel, conn->fd); + + ares_free(conn); +} + +void ares__close_sockets(struct server_state *server) +{ + ares__llist_node_t *node; + + while ((node = ares__llist_node_first(server->connections)) != NULL) { + struct server_connection *conn = ares__llist_node_val(node); + ares__close_connection(conn); + } +} + +void ares__check_cleanup_conn(const ares_channel_t *channel, + struct server_connection *conn) +{ + ares_bool_t do_cleanup = ARES_FALSE; + + if (channel == NULL || conn == NULL) { + return; + } + + if (ares__llist_len(conn->queries_to_conn)) { + return; + } + + /* If we are configured not to stay open, close it out */ + if (!(channel->flags & ARES_FLAG_STAYOPEN)) { + do_cleanup = ARES_TRUE; + } + + /* If the udp connection hit its max queries, always close it */ + if (!conn->is_tcp && channel->udp_max_queries > 0 && + conn->total_queries >= channel->udp_max_queries) { + do_cleanup = ARES_TRUE; + } + + if (!do_cleanup) { + return; + } + + ares__close_connection(conn); +} diff --git a/lib/c-ares-1.23.0/src/lib/ares__hosts_file.c b/lib/c-ares-1.23.0/src/lib/ares__hosts_file.c new file mode 100644 index 00000000000..09f3f72b0fa --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares__hosts_file.c @@ -0,0 +1,1119 @@ +/* MIT License + * + * Copyright (c) 2023 Brad House + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ +#include "ares_setup.h" +#include "ares.h" +#include "ares_private.h" +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef HAVE_NETINET_IN_H +# include +#endif +#ifdef HAVE_NETDB_H +# include +#endif +#ifdef HAVE_ARPA_INET_H +# include +#endif +#include +#include "ares_platform.h" + +/* HOSTS FILE PROCESSING OVERVIEW + * ============================== + * The hosts file on the system contains static entries to be processed locally + * rather than querying the nameserver. Each row is an IP address followed by + * a list of space delimited hostnames that match the ip address. This is used + * for both forward and reverse lookups. + * + * We are caching the entire parsed hosts file for performance reasons. Some + * files may be quite sizable and as per Issue #458 can approach 1/2MB in size, + * and the parse overhead on a rapid succession of queries can be quite large. + * The entries are stored in forwards and backwards hashtables so we can get + * O(1) performance on lookup. The file is cached until the file modification + * timestamp changes. + * + * The hosts file processing is quite unique. It has to merge all related hosts + * and ips into a single entry due to file formatting requirements. For + * instance take the below: + * + * 127.0.0.1 localhost.localdomain localhost + * ::1 localhost.localdomain localhost + * 192.168.1.1 host.example.com host + * 192.168.1.5 host.example.com host + * 2620:1234::1 host.example.com host6.example.com host6 host + * + * This will yield 2 entries. + * 1) ips: 127.0.0.1,::1 + * hosts: localhost.localdomain,localhost + * 2) ips: 192.168.1.1,192.168.1.5,2620:1234::1 + * hosts: host.example.com,host,host6.example.com,host6 + * + * It could be argued that if searching for 192.168.1.1 that the 'host6' + * hostnames should not be returned, but this implementation will return them + * since they are related. It is unlikely this will matter in the real world. + */ + +struct ares_hosts_file { + time_t ts; + /*! cache the filename so we know if the filename changes it automatically + * invalidates the cache */ + char *filename; + /*! iphash is the owner of the 'entry' object as there is only ever a single + * match to the object. */ + ares__htable_strvp_t *iphash; + /*! hosthash does not own the entry so won't free on destruction */ + ares__htable_strvp_t *hosthash; +}; + +struct ares_hosts_entry { + size_t refcnt; /*! If the entry is stored multiple times in the + * ip address hash, we have to reference count it */ + ares__llist_t *ips; + ares__llist_t *hosts; +}; + +static ares_status_t ares__read_file_into_buf(const char *filename, + ares__buf_t *buf) +{ + FILE *fp = NULL; + unsigned char *ptr = NULL; + size_t len = 0; + size_t ptr_len = 0; + long ftell_len = 0; + ares_status_t status; + + if (filename == NULL || buf == NULL) { + return ARES_EFORMERR; + } + + fp = fopen(filename, "rb"); + if (fp == NULL) { + int error = ERRNO; + switch (error) { + case ENOENT: + case ESRCH: + status = ARES_ENOTFOUND; + goto done; + default: + DEBUGF(fprintf(stderr, "fopen() failed with error: %d %s\n", error, + strerror(error))); + DEBUGF(fprintf(stderr, "Error opening file: %s\n", filename)); + status = ARES_EFILE; + goto done; + } + } + + /* Get length portably, fstat() is POSIX, not C */ + if (fseek(fp, 0, SEEK_END) != 0) { + status = ARES_EFILE; + goto done; + } + + ftell_len = ftell(fp); + if (ftell_len < 0) { + status = ARES_EFILE; + goto done; + } + len = (size_t)ftell_len; + + if (fseek(fp, 0, SEEK_SET) != 0) { + status = ARES_EFILE; + goto done; + } + + if (len == 0) { + status = ARES_SUCCESS; + goto done; + } + + /* Read entire data into buffer */ + ptr_len = len; + ptr = ares__buf_append_start(buf, &ptr_len); + if (ptr == NULL) { + status = ARES_ENOMEM; + goto done; + } + + ptr_len = fread(ptr, 1, len, fp); + if (ptr_len != len) { + status = ARES_EFILE; + goto done; + } + + ares__buf_append_finish(buf, len); + status = ARES_SUCCESS; + +done: + if (fp != NULL) { + fclose(fp); + } + return status; +} + +static ares_bool_t ares__is_hostname(const char *str) +{ + size_t i; + for (i = 0; str[i] != 0; i++) { + if (!ares__is_hostnamech(str[i])) { + return ARES_FALSE; + } + } + return ARES_TRUE; +} + +const void *ares_dns_pton(const char *ipaddr, struct ares_addr *addr, + size_t *out_len) +{ + const void *ptr = NULL; + size_t ptr_len = 0; + + if (ipaddr == NULL || addr == NULL || out_len == NULL) { + return NULL; + } + + *out_len = 0; + + if (addr->family == AF_INET && + ares_inet_pton(AF_INET, ipaddr, &addr->addr.addr4) > 0) { + ptr = &addr->addr.addr4; + ptr_len = sizeof(addr->addr.addr4); + } else if (addr->family == AF_INET6 && + ares_inet_pton(AF_INET6, ipaddr, &addr->addr.addr6) > 0) { + ptr = &addr->addr.addr6; + ptr_len = sizeof(addr->addr.addr6); + } else if (addr->family == AF_UNSPEC) { + if (ares_inet_pton(AF_INET, ipaddr, &addr->addr.addr4) > 0) { + addr->family = AF_INET; + ptr = &addr->addr.addr4; + ptr_len = sizeof(addr->addr.addr4); + } else if (ares_inet_pton(AF_INET6, ipaddr, &addr->addr.addr6) > 0) { + addr->family = AF_INET6; + ptr = &addr->addr.addr6; + ptr_len = sizeof(addr->addr.addr6); + } + } + + *out_len = ptr_len; + return ptr; +} + +static ares_bool_t ares__normalize_ipaddr(const char *ipaddr, char *out, + size_t out_len) +{ + struct ares_addr data; + const void *addr; + size_t addr_len = 0; + + memset(&data, 0, sizeof(data)); + data.family = AF_UNSPEC; + + addr = ares_dns_pton(ipaddr, &data, &addr_len); + if (addr == NULL) { + return ARES_FALSE; + } + + if (!ares_inet_ntop(data.family, addr, out, (ares_socklen_t)out_len)) { + return ARES_FALSE; + } + + return ARES_TRUE; +} + +static void ares__hosts_entry_destroy(ares_hosts_entry_t *entry) +{ + if (entry == NULL) { + return; + } + + /* Honor reference counting */ + if (entry->refcnt != 0) { + entry->refcnt--; + } + + if (entry->refcnt > 0) { + return; + } + + ares__llist_destroy(entry->hosts); + ares__llist_destroy(entry->ips); + ares_free(entry); +} + +static void ares__hosts_entry_destroy_cb(void *entry) +{ + ares__hosts_entry_destroy(entry); +} + +void ares__hosts_file_destroy(ares_hosts_file_t *hf) +{ + if (hf == NULL) { + return; + } + + ares_free(hf->filename); + ares__htable_strvp_destroy(hf->hosthash); + ares__htable_strvp_destroy(hf->iphash); + ares_free(hf); +} + +static ares_hosts_file_t *ares__hosts_file_create(const char *filename) +{ + ares_hosts_file_t *hf = ares_malloc_zero(sizeof(*hf)); + if (hf == NULL) { + goto fail; + } + + hf->ts = time(NULL); + + hf->filename = ares_strdup(filename); + if (hf->filename == NULL) { + goto fail; + } + + hf->iphash = ares__htable_strvp_create(ares__hosts_entry_destroy_cb); + if (hf->iphash == NULL) { + goto fail; + } + + hf->hosthash = ares__htable_strvp_create(NULL); + if (hf->hosthash == NULL) { + goto fail; + } + + return hf; + +fail: + ares__hosts_file_destroy(hf); + return NULL; +} + +typedef enum { + ARES_MATCH_NONE = 0, + ARES_MATCH_IPADDR = 1, + ARES_MATCH_HOST = 2 +} ares_hosts_file_match_t; + +static ares_status_t ares__hosts_file_merge_entry( + const ares_hosts_file_t *hf, ares_hosts_entry_t *existing, + ares_hosts_entry_t *entry, ares_hosts_file_match_t matchtype) +{ + ares__llist_node_t *node; + + /* If we matched on IP address, we know there can only be 1, so there's no + * reason to do anything */ + if (matchtype != ARES_MATCH_IPADDR) { + while ((node = ares__llist_node_first(entry->ips)) != NULL) { + const char *ipaddr = ares__llist_node_val(node); + + if (ares__htable_strvp_get_direct(hf->iphash, ipaddr) != NULL) { + ares__llist_node_destroy(node); + continue; + } + + ares__llist_node_move_parent_last(node, existing->ips); + } + } + + + while ((node = ares__llist_node_first(entry->hosts)) != NULL) { + const char *hostname = ares__llist_node_val(node); + + if (ares__htable_strvp_get_direct(hf->hosthash, hostname) != NULL) { + ares__llist_node_destroy(node); + continue; + } + + ares__llist_node_move_parent_last(node, existing->hosts); + } + + ares__hosts_entry_destroy(entry); + return ARES_SUCCESS; +} + +static ares_hosts_file_match_t + ares__hosts_file_match(const ares_hosts_file_t *hf, ares_hosts_entry_t *entry, + ares_hosts_entry_t **match) +{ + ares__llist_node_t *node; + *match = NULL; + + for (node = ares__llist_node_first(entry->ips); node != NULL; + node = ares__llist_node_next(node)) { + const char *ipaddr = ares__llist_node_val(node); + *match = ares__htable_strvp_get_direct(hf->iphash, ipaddr); + if (*match != NULL) { + return ARES_MATCH_IPADDR; + } + } + + for (node = ares__llist_node_first(entry->hosts); node != NULL; + node = ares__llist_node_next(node)) { + const char *host = ares__llist_node_val(node); + *match = ares__htable_strvp_get_direct(hf->hosthash, host); + if (*match != NULL) { + return ARES_MATCH_HOST; + } + } + + return ARES_MATCH_NONE; +} + +/*! entry is invalidated upon calling this function, always, even on error */ +static ares_status_t ares__hosts_file_add(ares_hosts_file_t *hosts, + ares_hosts_entry_t *entry) +{ + ares_hosts_entry_t *match = NULL; + ares_status_t status = ARES_SUCCESS; + ares__llist_node_t *node; + ares_hosts_file_match_t matchtype; + size_t num_hostnames; + + /* Record the number of hostnames in this entry file. If we merge into an + * existing record, these will be *appended* to the entry, so we'll count + * backwards when adding to the hosts hashtable */ + num_hostnames = ares__llist_len(entry->hosts); + + matchtype = ares__hosts_file_match(hosts, entry, &match); + + if (matchtype != ARES_MATCH_NONE) { + status = ares__hosts_file_merge_entry(hosts, match, entry, matchtype); + if (status != ARES_SUCCESS) { + ares__hosts_entry_destroy(entry); + return status; + } + /* entry was invalidated above by merging */ + entry = match; + } + + if (matchtype != ARES_MATCH_IPADDR) { + const char *ipaddr = ares__llist_last_val(entry->ips); + + if (!ares__htable_strvp_get(hosts->iphash, ipaddr, NULL)) { + if (!ares__htable_strvp_insert(hosts->iphash, ipaddr, entry)) { + ares__hosts_entry_destroy(entry); + return ARES_ENOMEM; + } + entry->refcnt++; + } + } + + /* Go backwards, on a merge, hostnames are appended. Breakout once we've + * consumed all the hosts that we appended */ + for (node = ares__llist_node_last(entry->hosts); node != NULL; + node = ares__llist_node_prev(node)) { + const char *val = ares__llist_node_val(node); + + if (num_hostnames == 0) { + break; + } + + num_hostnames--; + + /* first hostname match wins. If we detect a duplicate hostname for another + * ip it will automatically be added to the same entry */ + if (ares__htable_strvp_get(hosts->hosthash, val, NULL)) { + continue; + } + + if (!ares__htable_strvp_insert(hosts->hosthash, val, entry)) { + return ARES_ENOMEM; + } + } + + return ARES_SUCCESS; +} + +static ares_bool_t ares__hosts_entry_isdup(ares_hosts_entry_t *entry, + const char *host) +{ + ares__llist_node_t *node; + + for (node = ares__llist_node_first(entry->ips); node != NULL; + node = ares__llist_node_next(node)) { + const char *myhost = ares__llist_node_val(node); + if (strcasecmp(myhost, host) == 0) { + return ARES_TRUE; + } + } + + return ARES_FALSE; +} + +static ares_status_t ares__parse_hosts_hostnames(ares__buf_t *buf, + ares_hosts_entry_t *entry) +{ + entry->hosts = ares__llist_create(ares_free); + if (entry->hosts == NULL) { + return ARES_ENOMEM; + } + + /* Parse hostnames and aliases */ + while (ares__buf_len(buf)) { + char hostname[256]; + char *temp; + ares_status_t status; + unsigned char comment = '#'; + + ares__buf_consume_whitespace(buf, ARES_FALSE); + + if (ares__buf_len(buf) == 0) { + break; + } + + /* See if it is a comment, if so stop processing */ + if (ares__buf_begins_with(buf, &comment, 1)) { + break; + } + + ares__buf_tag(buf); + + /* Must be at end of line */ + if (ares__buf_consume_nonwhitespace(buf) == 0) { + break; + } + + status = ares__buf_tag_fetch_string(buf, hostname, sizeof(hostname)); + if (status != ARES_SUCCESS) { + /* Bad entry, just ignore as long as its not the first. If its the first, + * it must be valid */ + if (ares__llist_len(entry->hosts) == 0) { + return ARES_EBADSTR; + } + + continue; + } + + /* Validate it is a valid hostname characterset */ + if (!ares__is_hostname(hostname)) { + continue; + } + + /* Don't add a duplicate to the same entry */ + if (ares__hosts_entry_isdup(entry, hostname)) { + continue; + } + + /* Add to list */ + temp = ares_strdup(hostname); + if (temp == NULL) { + return ARES_ENOMEM; + } + + if (ares__llist_insert_last(entry->hosts, temp) == NULL) { + ares_free(temp); + return ARES_ENOMEM; + } + } + + /* Must have at least 1 entry */ + if (ares__llist_len(entry->hosts) == 0) { + return ARES_EBADSTR; + } + + return ARES_SUCCESS; +} + +static ares_status_t ares__parse_hosts_ipaddr(ares__buf_t *buf, + ares_hosts_entry_t **entry_out) +{ + char addr[INET6_ADDRSTRLEN]; + char *temp; + ares_hosts_entry_t *entry = NULL; + ares_status_t status; + + *entry_out = NULL; + + ares__buf_tag(buf); + ares__buf_consume_nonwhitespace(buf); + status = ares__buf_tag_fetch_string(buf, addr, sizeof(addr)); + if (status != ARES_SUCCESS) { + return status; + } + + /* Validate and normalize the ip address format */ + if (!ares__normalize_ipaddr(addr, addr, sizeof(addr))) { + return ARES_EBADSTR; + } + + entry = ares_malloc_zero(sizeof(*entry)); + if (entry == NULL) { + return ARES_ENOMEM; + } + + entry->ips = ares__llist_create(ares_free); + if (entry->ips == NULL) { + ares__hosts_entry_destroy(entry); + return ARES_ENOMEM; + } + + temp = ares_strdup(addr); + if (temp == NULL) { + ares__hosts_entry_destroy(entry); + return ARES_ENOMEM; + } + + if (ares__llist_insert_first(entry->ips, temp) == NULL) { + ares_free(temp); + ares__hosts_entry_destroy(entry); + return ARES_ENOMEM; + } + + *entry_out = entry; + + return ARES_SUCCESS; +} + +static ares_status_t ares__parse_hosts(const char *filename, + ares_hosts_file_t **out) +{ + ares__buf_t *buf = NULL; + ares_status_t status = ARES_EBADRESP; + ares_hosts_file_t *hf = NULL; + ares_hosts_entry_t *entry = NULL; + + *out = NULL; + + buf = ares__buf_create(); + if (buf == NULL) { + status = ARES_ENOMEM; + goto done; + } + + status = ares__read_file_into_buf(filename, buf); + if (status != ARES_SUCCESS) { + goto done; + } + + hf = ares__hosts_file_create(filename); + if (hf == NULL) { + status = ARES_ENOMEM; + goto done; + } + + while (ares__buf_len(buf)) { + unsigned char comment = '#'; + + /* -- Start of new line here -- */ + + /* Consume any leading whitespace */ + ares__buf_consume_whitespace(buf, ARES_FALSE); + + if (ares__buf_len(buf) == 0) { + break; + } + + /* See if it is a comment, if so, consume remaining line */ + if (ares__buf_begins_with(buf, &comment, 1)) { + ares__buf_consume_line(buf, ARES_TRUE); + continue; + } + + /* Pull off ip address */ + status = ares__parse_hosts_ipaddr(buf, &entry); + if (status == ARES_ENOMEM) { + goto done; + } + if (status != ARES_SUCCESS) { + /* Bad line, consume and go onto next */ + ares__buf_consume_line(buf, ARES_TRUE); + continue; + } + + /* Parse of the hostnames */ + status = ares__parse_hosts_hostnames(buf, entry); + if (status == ARES_ENOMEM) { + goto done; + } else if (status != ARES_SUCCESS) { + /* Bad line, consume and go onto next */ + ares__hosts_entry_destroy(entry); + entry = NULL; + ares__buf_consume_line(buf, ARES_TRUE); + continue; + } + + /* Append the successful entry to the hosts file */ + status = ares__hosts_file_add(hf, entry); + entry = NULL; /* is always invalidated by this function, even on error */ + if (status != ARES_SUCCESS) { + goto done; + } + + /* Go to next line */ + ares__buf_consume_line(buf, ARES_TRUE); + } + + status = ARES_SUCCESS; + +done: + ares__hosts_entry_destroy(entry); + ares__buf_destroy(buf); + if (status != ARES_SUCCESS) { + ares__hosts_file_destroy(hf); + } else { + *out = hf; + } + return status; +} + +static ares_bool_t ares__hosts_expired(const char *filename, + const ares_hosts_file_t *hf) +{ + time_t mod_ts = 0; + +#ifdef HAVE_STAT + struct stat st; + if (stat(filename, &st) == 0) { + mod_ts = st.st_mtime; + } +#elif defined(_WIN32) + struct _stat st; + if (_stat(filename, &st) == 0) { + mod_ts = st.st_mtime; + } +#else + (void)filename; +#endif + + if (hf == NULL) { + return ARES_TRUE; + } + + /* Expire every 60s if we can't get a time */ + if (mod_ts == 0) { + mod_ts = time(NULL) - 60; + } + + /* If filenames are different, its expired */ + if (strcasecmp(hf->filename, filename) != 0) { + return ARES_TRUE; + } + + if (hf->ts <= mod_ts) { + return ARES_TRUE; + } + + return ARES_FALSE; +} + +static ares_status_t ares__hosts_path(const ares_channel_t *channel, + ares_bool_t use_env, char **path) +{ + char *path_hosts = NULL; + + *path = NULL; + + if (channel->hosts_path) { + path_hosts = ares_strdup(channel->hosts_path); + if (!path_hosts) { + return ARES_ENOMEM; + } + } + + if (use_env) { + if (path_hosts) { + ares_free(path_hosts); + } + + path_hosts = ares_strdup(getenv("CARES_HOSTS")); + if (!path_hosts) { + return ARES_ENOMEM; + } + } + + if (!path_hosts) { +#ifdef WIN32 + char PATH_HOSTS[MAX_PATH] = ""; + char tmp[MAX_PATH]; + HKEY hkeyHosts; + DWORD dwLength = sizeof(tmp); + if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, WIN_NS_NT_KEY, 0, KEY_READ, + &hkeyHosts) != ERROR_SUCCESS) { + return ARES_ENOTFOUND; + } + RegQueryValueExA(hkeyHosts, DATABASEPATH, NULL, NULL, (LPBYTE)tmp, + &dwLength); + ExpandEnvironmentStringsA(tmp, PATH_HOSTS, MAX_PATH); + RegCloseKey(hkeyHosts); + strcat(PATH_HOSTS, WIN_PATH_HOSTS); +#elif defined(WATT32) + const char *PATH_HOSTS = _w32_GetHostsFile(); + + if (!PATH_HOSTS) { + return ARES_ENOTFOUND; + } +#endif + path_hosts = ares_strdup(PATH_HOSTS); + if (!path_hosts) { + return ARES_ENOMEM; + } + } + + *path = path_hosts; + return ARES_SUCCESS; +} + +static ares_status_t ares__hosts_update(ares_channel_t *channel, + ares_bool_t use_env) +{ + ares_status_t status; + char *filename = NULL; + + status = ares__hosts_path(channel, use_env, &filename); + if (status != ARES_SUCCESS) { + return status; + } + + if (!ares__hosts_expired(filename, channel->hf)) { + ares_free(filename); + return ARES_SUCCESS; + } + + ares__hosts_file_destroy(channel->hf); + channel->hf = NULL; + + status = ares__parse_hosts(filename, &channel->hf); + ares_free(filename); + return status; +} + +ares_status_t ares__hosts_search_ipaddr(ares_channel_t *channel, + ares_bool_t use_env, const char *ipaddr, + const ares_hosts_entry_t **entry) +{ + ares_status_t status; + char addr[INET6_ADDRSTRLEN]; + + *entry = NULL; + + status = ares__hosts_update(channel, use_env); + if (status != ARES_SUCCESS) { + return status; + } + + if (channel->hf == NULL) { + return ARES_ENOTFOUND; + } + + if (!ares__normalize_ipaddr(ipaddr, addr, sizeof(addr))) { + return ARES_EBADNAME; + } + + *entry = ares__htable_strvp_get_direct(channel->hf->iphash, addr); + if (*entry == NULL) { + return ARES_ENOTFOUND; + } + + return ARES_SUCCESS; +} + +ares_status_t ares__hosts_search_host(ares_channel_t *channel, + ares_bool_t use_env, const char *host, + const ares_hosts_entry_t **entry) +{ + ares_status_t status; + + *entry = NULL; + + status = ares__hosts_update(channel, use_env); + if (status != ARES_SUCCESS) { + return status; + } + + if (channel->hf == NULL) { + return ARES_ENOTFOUND; + } + + *entry = ares__htable_strvp_get_direct(channel->hf->hosthash, host); + if (*entry == NULL) { + return ARES_ENOTFOUND; + } + + return ARES_SUCCESS; +} + +ares_status_t ares__hosts_entry_to_hostent(const ares_hosts_entry_t *entry, + int family, struct hostent **hostent) +{ + ares_status_t status; + size_t naliases; + ares__llist_node_t *node; + size_t idx; + + *hostent = ares_malloc_zero(sizeof(**hostent)); + if (*hostent == NULL) { + status = ARES_ENOMEM; + goto fail; + } + + (*hostent)->h_addrtype = family; + + /* Copy IP addresses that match the address family */ + idx = 0; + for (node = ares__llist_node_first(entry->ips); node != NULL; + node = ares__llist_node_next(node)) { + struct ares_addr addr; + const void *ptr = NULL; + size_t ptr_len = 0; + const char *ipaddr = ares__llist_node_val(node); + char **temp = NULL; + + memset(&addr, 0, sizeof(addr)); + + addr.family = family; + ptr = ares_dns_pton(ipaddr, &addr, &ptr_len); + if (ptr == NULL) { + continue; + } + + /* If family == AF_UNSPEC, then we want to inherit this for future + * conversions as we can only support a single address class */ + if (family == AF_UNSPEC) { + family = addr.family; + (*hostent)->h_addrtype = addr.family; + } + + temp = ares_realloc_zero((*hostent)->h_addr_list, + (idx + 1) * sizeof(*(*hostent)->h_addr_list), + (idx + 2) * sizeof(*(*hostent)->h_addr_list)); + if (temp == NULL) { + status = ARES_ENOMEM; + goto fail; + } + + (*hostent)->h_addr_list = temp; + + (*hostent)->h_addr_list[idx] = ares_malloc(ptr_len); + if ((*hostent)->h_addr_list[idx] == NULL) { + status = ARES_ENOMEM; + goto fail; + } + + memcpy((*hostent)->h_addr_list[idx], ptr, ptr_len); + idx++; + (*hostent)->h_length = (int)ptr_len; + } + + /* entry didn't match address class */ + if (idx == 0) { + status = ARES_ENOTFOUND; + goto fail; + } + + /* Copy main hostname */ + (*hostent)->h_name = ares_strdup(ares__llist_first_val(entry->hosts)); + if ((*hostent)->h_name == NULL) { + status = ARES_ENOMEM; + goto fail; + } + + /* Copy aliases */ + naliases = ares__llist_len(entry->hosts) - 1; + + /* Cap at 100, some people use https://github.com/StevenBlack/hosts and we + * don't need 200k+ aliases */ + if (naliases > 100) { + naliases = 100; + } + + (*hostent)->h_aliases = + ares_malloc_zero((naliases + 1) * sizeof(*(*hostent)->h_aliases)); + if ((*hostent)->h_aliases == NULL) { + status = ARES_ENOMEM; + goto fail; + } + + /* Copy all entries to the alias except the first */ + idx = 0; + node = ares__llist_node_first(entry->hosts); + node = ares__llist_node_next(node); + while (node != NULL) { + (*hostent)->h_aliases[idx] = ares_strdup(ares__llist_node_val(node)); + if ((*hostent)->h_aliases[idx] == NULL) { + status = ARES_ENOMEM; + goto fail; + } + idx++; + + /* Break out if artificially capped */ + if (idx == naliases) { + break; + } + node = ares__llist_node_next(node); + } + + return ARES_SUCCESS; + +fail: + ares_free_hostent(*hostent); + *hostent = NULL; + return status; +} + +static ares_status_t + ares__hosts_ai_append_cnames(const ares_hosts_entry_t *entry, + struct ares_addrinfo_cname **cnames_out) +{ + struct ares_addrinfo_cname *cname = NULL; + struct ares_addrinfo_cname *cnames = NULL; + const char *primaryhost; + ares__llist_node_t *node; + ares_status_t status; + size_t cnt = 0; + + node = ares__llist_node_first(entry->hosts); + primaryhost = ares__llist_node_val(node); + /* Skip to next node to start with aliases */ + node = ares__llist_node_next(node); + + while (node != NULL) { + const char *host = ares__llist_node_val(node); + + /* Cap at 100 entries. , some people use + * https://github.com/StevenBlack/hosts and we don't need 200k+ aliases */ + cnt++; + if (cnt > 100) { + break; + } + + cname = ares__append_addrinfo_cname(&cnames); + if (cname == NULL) { + status = ARES_ENOMEM; + goto done; + } + + cname->alias = ares_strdup(host); + if (cname->alias == NULL) { + status = ARES_ENOMEM; + goto done; + } + + cname->name = ares_strdup(primaryhost); + if (cname->name == NULL) { + status = ARES_ENOMEM; + goto done; + } + + node = ares__llist_node_next(node); + } + + /* No entries, add only primary */ + if (cnames == NULL) { + cname = ares__append_addrinfo_cname(&cnames); + if (cname == NULL) { + status = ARES_ENOMEM; + goto done; + } + + cname->name = ares_strdup(primaryhost); + if (cname->name == NULL) { + status = ARES_ENOMEM; + goto done; + } + } + status = ARES_SUCCESS; + +done: + if (status != ARES_SUCCESS) { + ares__freeaddrinfo_cnames(cnames); + return status; + } + + *cnames_out = cnames; + return ARES_SUCCESS; +} + +ares_status_t ares__hosts_entry_to_addrinfo(const ares_hosts_entry_t *entry, + const char *name, int family, + unsigned short port, + ares_bool_t want_cnames, + struct ares_addrinfo *ai) +{ + ares_status_t status; + struct ares_addrinfo_cname *cnames = NULL; + struct ares_addrinfo_node *ainodes = NULL; + ares__llist_node_t *node; + + switch (family) { + case AF_INET: + case AF_INET6: + case AF_UNSPEC: + break; + default: + return ARES_EBADFAMILY; + } + + ai->name = ares_strdup(name); + if (ai->name == NULL) { + status = ARES_ENOMEM; + goto done; + } + + for (node = ares__llist_node_first(entry->ips); node != NULL; + node = ares__llist_node_next(node)) { + struct ares_addr addr; + const void *ptr = NULL; + size_t ptr_len = 0; + const char *ipaddr = ares__llist_node_val(node); + + memset(&addr, 0, sizeof(addr)); + addr.family = family; + ptr = ares_dns_pton(ipaddr, &addr, &ptr_len); + + if (ptr == NULL) { + continue; + } + + status = ares_append_ai_node(addr.family, port, 0, ptr, &ainodes); + if (status != ARES_SUCCESS) { + goto done; + } + } + + if (want_cnames) { + status = ares__hosts_ai_append_cnames(entry, &cnames); + if (status != ARES_SUCCESS) { + goto done; + } + } + + status = ARES_SUCCESS; + +done: + if (status != ARES_SUCCESS) { + ares__freeaddrinfo_cnames(cnames); + ares__freeaddrinfo_nodes(ainodes); + ares_free(ai->name); + ai->name = NULL; + return status; + } + ares__addrinfo_cat_cnames(&ai->cnames, cnames); + ares__addrinfo_cat_nodes(&ai->nodes, ainodes); + + return status; +} diff --git a/lib/c-ares-1.23.0/src/lib/ares__htable.c b/lib/c-ares-1.23.0/src/lib/ares__htable.c new file mode 100644 index 00000000000..20ce9ca729e --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares__htable.c @@ -0,0 +1,442 @@ +/* MIT License + * + * Copyright (c) 2023 Brad House + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ +#include "ares_setup.h" +#include "ares.h" +#include "ares_private.h" +#include "ares__llist.h" +#include "ares__htable.h" + +#define ARES__HTABLE_MAX_BUCKETS (1U << 24) +#define ARES__HTABLE_MIN_BUCKETS (1U << 4) +#define ARES__HTABLE_EXPAND_PERCENT 75 + +struct ares__htable { + ares__htable_hashfunc_t hash; + ares__htable_bucket_key_t bucket_key; + ares__htable_bucket_free_t bucket_free; + ares__htable_key_eq_t key_eq; + unsigned int seed; + unsigned int size; + size_t num_keys; + size_t num_collisions; + /* NOTE: if we converted buckets into ares__slist_t we could guarantee on + * hash collisions we would have O(log n) worst case insert and search + * performance. (We'd also need to make key_eq into a key_cmp to + * support sort). That said, risk with a random hash seed is near zero, + * and ares__slist_t is heavier weight so I think using ares__llist_t is + * is an overall win. */ + ares__llist_t **buckets; +}; + +static unsigned int ares__htable_generate_seed(ares__htable_t *htable) +{ + unsigned int seed = 0; + time_t t = time(NULL); + + /* Mix stack address, heap address, and time to generate a random seed, it + * doesn't have to be super secure, just quick. Likelihood of a hash + * collision attack is very low with a small amount of effort */ + seed |= (unsigned int)((size_t)htable & 0xFFFFFFFF); + seed |= (unsigned int)((size_t)&seed & 0xFFFFFFFF); + seed |= (unsigned int)(t & 0xFFFFFFFF); + return seed; +} + +static void ares__htable_buckets_destroy(ares__llist_t **buckets, + unsigned int size, + ares_bool_t destroy_vals) +{ + unsigned int i; + + if (buckets == NULL) { + return; + } + + for (i = 0; i < size; i++) { + if (buckets[i] == NULL) { + continue; + } + + if (!destroy_vals) { + ares__llist_replace_destructor(buckets[i], NULL); + } + + ares__llist_destroy(buckets[i]); + } + + ares_free(buckets); +} + +void ares__htable_destroy(ares__htable_t *htable) +{ + if (htable == NULL) { + return; + } + ares__htable_buckets_destroy(htable->buckets, htable->size, ARES_TRUE); + ares_free(htable); +} + +ares__htable_t *ares__htable_create(ares__htable_hashfunc_t hash_func, + ares__htable_bucket_key_t bucket_key, + ares__htable_bucket_free_t bucket_free, + ares__htable_key_eq_t key_eq) +{ + ares__htable_t *htable = NULL; + + if (hash_func == NULL || bucket_key == NULL || bucket_free == NULL || + key_eq == NULL) { + goto fail; + } + + htable = ares_malloc_zero(sizeof(*htable)); + if (htable == NULL) { + goto fail; + } + + htable->hash = hash_func; + htable->bucket_key = bucket_key; + htable->bucket_free = bucket_free; + htable->key_eq = key_eq; + htable->seed = ares__htable_generate_seed(htable); + htable->size = ARES__HTABLE_MIN_BUCKETS; + htable->buckets = ares_malloc_zero(sizeof(*htable->buckets) * htable->size); + + if (htable->buckets == NULL) { + goto fail; + } + + return htable; + +fail: + ares__htable_destroy(htable); + return NULL; +} + +/*! Grabs the Hashtable index from the key and length. The h index is + * the hash of the function reduced to the size of the bucket list. + * We are doing "hash & (size - 1)" since we are guaranteeing a power of + * 2 for size. This is equivalent to "hash % size", but should be more + * efficient */ +#define HASH_IDX(h, key) h->hash(key, h->seed) & (h->size - 1) + +static ares__llist_node_t *ares__htable_find(const ares__htable_t *htable, + unsigned int idx, const void *key) +{ + ares__llist_node_t *node = NULL; + + for (node = ares__llist_node_first(htable->buckets[idx]); node != NULL; + node = ares__llist_node_next(node)) { + if (htable->key_eq(key, htable->bucket_key(ares__llist_node_val(node)))) { + break; + } + } + + return node; +} + +static ares_bool_t ares__htable_expand(ares__htable_t *htable) +{ + ares__llist_t **buckets = NULL; + unsigned int old_size = htable->size; + size_t i; + ares__llist_t **prealloc_llist = NULL; + size_t prealloc_llist_len = 0; + ares_bool_t rv = ARES_FALSE; + + /* Not a failure, just won't expand */ + if (old_size == ARES__HTABLE_MAX_BUCKETS) { + return ARES_TRUE; + } + + htable->size <<= 1; + + /* We must pre-allocate all memory we'll need before moving entries to the + * new hash array. Otherwise if there's a memory allocation failure in the + * middle, we wouldn't be able to recover. */ + buckets = ares_malloc_zero(sizeof(*buckets) * htable->size); + if (buckets == NULL) { + goto done; + } + + /* The maximum number of new llists we'll need is the number of collisions + * that were recorded */ + prealloc_llist_len = htable->num_collisions; + if (prealloc_llist_len) { + prealloc_llist = + ares_malloc_zero(sizeof(*prealloc_llist) * prealloc_llist_len); + if (prealloc_llist == NULL) { + goto done; + } + } + for (i = 0; i < prealloc_llist_len; i++) { + prealloc_llist[i] = ares__llist_create(htable->bucket_free); + if (prealloc_llist[i] == NULL) { + goto done; + } + } + + /* Iterate across all buckets and move the entries to the new buckets */ + htable->num_collisions = 0; + for (i = 0; i < old_size; i++) { + ares__llist_node_t *node; + + /* Nothing in this bucket */ + if (htable->buckets[i] == NULL) { + continue; + } + + /* Fast path optimization (most likely case), there is likely only a single + * entry in both the source and destination, check for this to confirm and + * if so, just move the bucket over */ + if (ares__llist_len(htable->buckets[i]) == 1) { + const void *val = ares__llist_first_val(htable->buckets[i]); + size_t idx = HASH_IDX(htable, htable->bucket_key(val)); + + if (buckets[idx] == NULL) { + /* Swap! */ + buckets[idx] = htable->buckets[i]; + htable->buckets[i] = NULL; + continue; + } + } + + /* Slow path, collisions */ + while ((node = ares__llist_node_first(htable->buckets[i])) != NULL) { + const void *val = ares__llist_node_val(node); + size_t idx = HASH_IDX(htable, htable->bucket_key(val)); + + /* Try fast path again as maybe we popped one collision off and the + * next we can reuse the llist parent */ + if (buckets[idx] == NULL && ares__llist_len(htable->buckets[i]) == 1) { + /* Swap! */ + buckets[idx] = htable->buckets[i]; + htable->buckets[i] = NULL; + break; + } + + /* Grab one off our preallocated list */ + if (buckets[idx] == NULL) { + /* Silence static analysis, this isn't possible but it doesn't know */ + if (prealloc_llist == NULL || prealloc_llist_len == 0) { + goto done; + } + buckets[idx] = prealloc_llist[prealloc_llist_len - 1]; + prealloc_llist_len--; + } else { + /* Collision occurred since the bucket wasn't empty */ + htable->num_collisions++; + } + + ares__llist_node_move_parent_first(node, buckets[idx]); + } + + /* Abandoned bucket, destroy */ + if (htable->buckets[i] != NULL) { + ares__llist_destroy(htable->buckets[i]); + htable->buckets[i] = NULL; + } + } + + /* We have guaranteed all the buckets have either been moved or destroyed, + * so we just call ares_free() on the array and swap out the pointer */ + ares_free(htable->buckets); + htable->buckets = buckets; + buckets = NULL; + rv = ARES_TRUE; + +done: + ares_free(buckets); + /* destroy any unused preallocated buckets */ + ares__htable_buckets_destroy(prealloc_llist, (unsigned int)prealloc_llist_len, + ARES_FALSE); + + /* On failure, we need to restore the htable size */ + if (rv != ARES_TRUE) { + htable->size = old_size; + } + + return rv; +} + +ares_bool_t ares__htable_insert(ares__htable_t *htable, void *bucket) +{ + unsigned int idx = 0; + ares__llist_node_t *node = NULL; + const void *key = NULL; + + if (htable == NULL || bucket == NULL) { + return ARES_FALSE; + } + + + key = htable->bucket_key(bucket); + idx = HASH_IDX(htable, key); + + /* See if we have a matching bucket already, if so, replace it */ + node = ares__htable_find(htable, idx, key); + if (node != NULL) { + ares__llist_node_replace(node, bucket); + return ARES_TRUE; + } + + /* Check to see if we should rehash because likelihood of collisions has + * increased beyond our threshold */ + if (htable->num_keys + 1 > + (htable->size * ARES__HTABLE_EXPAND_PERCENT) / 100) { + if (!ares__htable_expand(htable)) { + return ARES_FALSE; + } + /* If we expanded, need to calculate a new index */ + idx = HASH_IDX(htable, key); + } + + /* We lazily allocate the linked list */ + if (htable->buckets[idx] == NULL) { + htable->buckets[idx] = ares__llist_create(htable->bucket_free); + if (htable->buckets[idx] == NULL) { + return ARES_FALSE; + } + } + + node = ares__llist_insert_first(htable->buckets[idx], bucket); + if (node == NULL) { + return ARES_FALSE; + } + + /* Track collisions for rehash stability */ + if (ares__llist_len(htable->buckets[idx]) > 1) { + htable->num_collisions++; + } + + htable->num_keys++; + + return ARES_TRUE; +} + +void *ares__htable_get(const ares__htable_t *htable, const void *key) +{ + unsigned int idx; + + if (htable == NULL || key == NULL) { + return NULL; + } + + idx = HASH_IDX(htable, key); + + return ares__llist_node_val(ares__htable_find(htable, idx, key)); +} + +ares_bool_t ares__htable_remove(ares__htable_t *htable, const void *key) +{ + ares__llist_node_t *node; + unsigned int idx; + + if (htable == NULL || key == NULL) { + return ARES_FALSE; + } + + idx = HASH_IDX(htable, key); + node = ares__htable_find(htable, idx, key); + if (node == NULL) { + return ARES_FALSE; + } + + htable->num_keys--; + + /* Reduce collisions */ + if (ares__llist_len(ares__llist_node_parent(node)) > 1) { + htable->num_collisions--; + } + + ares__llist_node_destroy(node); + return ARES_TRUE; +} + +size_t ares__htable_num_keys(const ares__htable_t *htable) +{ + if (htable == NULL) { + return 0; + } + return htable->num_keys; +} + +unsigned int ares__htable_hash_FNV1a(const unsigned char *key, size_t key_len, + unsigned int seed) +{ + /* recommended seed is 2166136261U, but we don't want collisions */ + unsigned int hv = seed; + size_t i; + + for (i = 0; i < key_len; i++) { + hv ^= (unsigned int)key[i]; + /* hv *= 0x01000193 */ + hv += (hv << 1) + (hv << 4) + (hv << 7) + (hv << 8) + (hv << 24); + } + + return hv; +} + +/* tolower() is locale-specific. Use a lookup table fast conversion that only + * operates on ASCII */ +static const unsigned char ares__tolower_lookup[] = { + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, + 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, + 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, + 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33, + 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 0x40, + 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, + 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, + 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, + 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, + 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, 0x80, 0x81, + 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, + 0x8F, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, + 0x9C, 0x9D, 0x9E, 0x9F, 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, + 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, + 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, 0xC0, 0xC1, 0xC2, + 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, + 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, + 0xDD, 0xDE, 0xDF, 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, + 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, + 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF +}; + +/* Case insensitive version, meant for ASCII strings */ +unsigned int ares__htable_hash_FNV1a_casecmp(const unsigned char *key, + size_t key_len, unsigned int seed) +{ + /* recommended seed is 2166136261U, but we don't want collisions */ + unsigned int hv = seed; + size_t i; + + for (i = 0; i < key_len; i++) { + hv ^= (unsigned int)ares__tolower_lookup[key[i]]; + /* hv *= 0x01000193 */ + hv += (hv << 1) + (hv << 4) + (hv << 7) + (hv << 8) + (hv << 24); + } + + return hv; +} diff --git a/lib/c-ares-1.23.0/src/lib/ares__htable.h b/lib/c-ares-1.23.0/src/lib/ares__htable.h new file mode 100644 index 00000000000..89103bdd5d8 --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares__htable.h @@ -0,0 +1,163 @@ +/* MIT License + * + * Copyright (c) 2023 Brad House + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ +#ifndef __ARES__HTABLE_H +#define __ARES__HTABLE_H + + +/*! \addtogroup ares__htable Base HashTable Data Structure + * + * This is a basic hashtable data structure that is meant to be wrapped + * by a higher level implementation. This data structure is designed to + * be callback-based in order to facilitate wrapping without needing to + * worry about any underlying complexities of the hashtable implementation. + * + * This implementation supports automatic growing by powers of 2 when reaching + * 75% capacity. A rehash will be performed on the expanded bucket list. + * + * Average time complexity: + * - Insert: O(1) + * - Search: O(1) + * - Delete: O(1) + * + * @{ + */ + +struct ares__htable; + +/*! Opaque data type for generic hash table implementation */ +typedef struct ares__htable ares__htable_t; + +/*! Callback for generating a hash of the key. + * + * \param[in] key pointer to key to be hashed + * \param[in] seed randomly generated seed used by hash function. + * value is specific to the hashtable instance + * but otherwise will not change between calls. + * \return hash + */ +typedef unsigned int (*ares__htable_hashfunc_t)(const void *key, + unsigned int seed); + +/*! Callback to free the bucket + * + * \param[in] bucket user provided bucket + */ +typedef void (*ares__htable_bucket_free_t)(void *bucket); + +/*! Callback to extract the key from the user-provided bucket + * + * \param[in] bucket user provided bucket + * \return pointer to key held in bucket + */ +typedef const void *(*ares__htable_bucket_key_t)(const void *bucket); + +/*! Callback to compare two keys for equality + * + * \param[in] key1 first key + * \param[in] key2 second key + * \return ARES_TRUE if equal, ARES_FALSE if not + */ +typedef ares_bool_t (*ares__htable_key_eq_t)(const void *key1, + const void *key2); + + +/*! Destroy the initialized hashtable + * + * \param[in] initialized hashtable + */ +void ares__htable_destroy(ares__htable_t *htable); + +/*! Create a new hashtable + * + * \param[in] hash_func Required. Callback for Hash function. + * \param[in] bucket_key Required. Callback to extract key from bucket. + * \param[in] bucket_free Required. Callback to free bucket. + * \param[in] key_eq Required. Callback to check for key equality. + * \return initialized hashtable. NULL if out of memory or misuse. + */ +ares__htable_t *ares__htable_create(ares__htable_hashfunc_t hash_func, + ares__htable_bucket_key_t bucket_key, + ares__htable_bucket_free_t bucket_free, + ares__htable_key_eq_t key_eq); + +/*! Count of keys from initialized hashtable + * + * \param[in] htable Initialized hashtable. + * \return count of keys + */ +size_t ares__htable_num_keys(const ares__htable_t *htable); + +/*! Insert bucket into hashtable + * + * \param[in] htable Initialized hashtable. + * \param[in] bucket User-provided bucket to insert. Takes "ownership". Not + * allowed to be NULL. + * \return ARES_TRUE on success, ARES_FALSE if out of memory + */ +ares_bool_t ares__htable_insert(ares__htable_t *htable, void *bucket); + +/*! Retrieve bucket from hashtable based on key. + * + * \param[in] htable Initialized hashtable + * \param[in] key Pointer to key to use for comparison. + * \return matching bucket, or NULL if not found. + */ +void *ares__htable_get(const ares__htable_t *htable, const void *key); + +/*! Remove bucket from hashtable by key + * + * \param[in] htable Initialized hashtable + * \param[in] key Pointer to key to use for comparison + * \return ARES_TRUE if found, ARES_FALSE if not found + */ +ares_bool_t ares__htable_remove(ares__htable_t *htable, const void *key); + +/*! FNV1a hash algorithm. Can be used as underlying primitive for building + * a wrapper hashtable. + * + * \param[in] key pointer to key + * \param[in] key_len Length of key + * \param[in] seed Seed for generating hash + * \return hash value + */ +unsigned int ares__htable_hash_FNV1a(const unsigned char *key, size_t key_len, + unsigned int seed); + +/*! FNV1a hash algorithm, but converts all characters to lowercase before + * hashing to make the hash case-insensitive. Can be used as underlying + * primitive for building a wrapper hashtable. Used on string-based keys. + * + * \param[in] key pointer to key + * \param[in] key_len Length of key + * \param[in] seed Seed for generating hash + * \return hash value + */ +unsigned int ares__htable_hash_FNV1a_casecmp(const unsigned char *key, + size_t key_len, unsigned int seed); + +/*! @} */ + +#endif /* __ARES__HTABLE_H */ diff --git a/lib/c-ares-1.23.0/src/lib/ares__htable_asvp.c b/lib/c-ares-1.23.0/src/lib/ares__htable_asvp.c new file mode 100644 index 00000000000..f6991c3b1b8 --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares__htable_asvp.c @@ -0,0 +1,194 @@ +/* MIT License + * + * Copyright (c) 2023 Brad House + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ +#include "ares_setup.h" +#include "ares.h" +#include "ares_private.h" +#include "ares__htable.h" +#include "ares__htable_asvp.h" + +struct ares__htable_asvp { + ares__htable_asvp_val_free_t free_val; + ares__htable_t *hash; +}; + +typedef struct { + ares_socket_t key; + void *val; + ares__htable_asvp_t *parent; +} ares__htable_asvp_bucket_t; + +void ares__htable_asvp_destroy(ares__htable_asvp_t *htable) +{ + if (htable == NULL) { + return; + } + + ares__htable_destroy(htable->hash); + ares_free(htable); +} + +static unsigned int hash_func(const void *key, unsigned int seed) +{ + const ares_socket_t *arg = key; + return ares__htable_hash_FNV1a((const unsigned char *)arg, sizeof(*arg), + seed); +} + +static const void *bucket_key(const void *bucket) +{ + const ares__htable_asvp_bucket_t *arg = bucket; + return &arg->key; +} + +static void bucket_free(void *bucket) +{ + ares__htable_asvp_bucket_t *arg = bucket; + + if (arg->parent->free_val) { + arg->parent->free_val(arg->val); + } + + ares_free(arg); +} + +static ares_bool_t key_eq(const void *key1, const void *key2) +{ + const ares_socket_t *k1 = key1; + const ares_socket_t *k2 = key2; + + if (*k1 == *k2) { + return ARES_TRUE; + } + + return ARES_FALSE; +} + +ares__htable_asvp_t * + ares__htable_asvp_create(ares__htable_asvp_val_free_t val_free) +{ + ares__htable_asvp_t *htable = ares_malloc(sizeof(*htable)); + if (htable == NULL) { + goto fail; + } + + htable->hash = + ares__htable_create(hash_func, bucket_key, bucket_free, key_eq); + if (htable->hash == NULL) { + goto fail; + } + + htable->free_val = val_free; + + return htable; + +fail: + if (htable) { + ares__htable_destroy(htable->hash); + ares_free(htable); + } + return NULL; +} + +ares_bool_t ares__htable_asvp_insert(ares__htable_asvp_t *htable, + ares_socket_t key, void *val) +{ + ares__htable_asvp_bucket_t *bucket = NULL; + + if (htable == NULL) { + goto fail; + } + + bucket = ares_malloc(sizeof(*bucket)); + if (bucket == NULL) { + goto fail; + } + + bucket->parent = htable; + bucket->key = key; + bucket->val = val; + + if (!ares__htable_insert(htable->hash, bucket)) { + goto fail; + } + + return ARES_TRUE; + +fail: + if (bucket) { + ares_free(bucket); + } + return ARES_FALSE; +} + +ares_bool_t ares__htable_asvp_get(const ares__htable_asvp_t *htable, + ares_socket_t key, void **val) +{ + ares__htable_asvp_bucket_t *bucket = NULL; + + if (val) { + *val = NULL; + } + + if (htable == NULL) { + return ARES_FALSE; + } + + bucket = ares__htable_get(htable->hash, &key); + if (bucket == NULL) { + return ARES_FALSE; + } + + if (val) { + *val = bucket->val; + } + return ARES_TRUE; +} + +void *ares__htable_asvp_get_direct(const ares__htable_asvp_t *htable, + ares_socket_t key) +{ + void *val = NULL; + ares__htable_asvp_get(htable, key, &val); + return val; +} + +ares_bool_t ares__htable_asvp_remove(ares__htable_asvp_t *htable, + ares_socket_t key) +{ + if (htable == NULL) { + return ARES_FALSE; + } + + return ares__htable_remove(htable->hash, &key); +} + +size_t ares__htable_asvp_num_keys(const ares__htable_asvp_t *htable) +{ + if (htable == NULL) { + return 0; + } + return ares__htable_num_keys(htable->hash); +} diff --git a/lib/c-ares-1.23.0/src/lib/ares__htable_asvp.h b/lib/c-ares-1.23.0/src/lib/ares__htable_asvp.h new file mode 100644 index 00000000000..1ee505a2f0b --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares__htable_asvp.h @@ -0,0 +1,120 @@ +/* MIT License + * + * Copyright (c) 2023 Brad House + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ +#ifndef __ARES__HTABLE_ASVP_H +#define __ARES__HTABLE_ASVP_H + +/*! \addtogroup ares__htable_asvp HashTable with ares_socket_t Key and + * void pointer Value + * + * This data structure wraps the base ares__htable data structure in order to + * split the key and value data types as ares_socket_t and void pointer, + * respectively. + * + * Average time complexity: + * - Insert: O(1) + * - Search: O(1) + * - Delete: O(1) + * + * @{ + */ + +struct ares__htable_asvp; + +/*! Opaque data type for ares_socket_t key, void pointer hash table + * implementation */ +typedef struct ares__htable_asvp ares__htable_asvp_t; + +/*! Callback to free value stored in hashtable + * + * \param[in] val user-supplied value + */ +typedef void (*ares__htable_asvp_val_free_t)(void *val); + +/*! Destroy hashtable + * + * \param[in] htable Initialized hashtable + */ +void ares__htable_asvp_destroy(ares__htable_asvp_t *htable); + +/*! Create size_t key, void pointer value hash table + * + * \param[in] val_free Optional. Call back to free user-supplied value. If + * NULL it is expected the caller will clean up any user + * supplied values. + */ +ares__htable_asvp_t * + ares__htable_asvp_create(ares__htable_asvp_val_free_t val_free); + +/*! Insert key/value into hash table + * + * \param[in] htable Initialized hash table + * \param[in] key key to associate with value + * \param[in] val value to store (takes ownership). May be NULL. + * \return ARES_TRUE on success, ARES_FALSE on out of memory or misuse + */ +ares_bool_t ares__htable_asvp_insert(ares__htable_asvp_t *htable, + ares_socket_t key, void *val); + +/*! Retrieve value from hashtable based on key + * + * \param[in] htable Initialized hash table + * \param[in] key key to use to search + * \param[out] val Optional. Pointer to store value. + * \return ARES_TRUE on success, ARES_FALSE on failure + */ +ares_bool_t ares__htable_asvp_get(const ares__htable_asvp_t *htable, + ares_socket_t key, void **val); + +/*! Retrieve value from hashtable directly as return value. Caveat to this + * function over ares__htable_asvp_get() is that if a NULL value is stored + * you cannot determine if the key is not found or the value is NULL. + * + * \param[in] htable Initialized hash table + * \param[in] key key to use to search + * \return value associated with key in hashtable or NULL + */ +void *ares__htable_asvp_get_direct(const ares__htable_asvp_t *htable, + ares_socket_t key); + +/*! Remove a value from the hashtable by key + * + * \param[in] htable Initialized hash table + * \param[in] key key to use to search + * \return ARES_TRUE if found, ARES_FALSE if not found + */ +ares_bool_t ares__htable_asvp_remove(ares__htable_asvp_t *htable, + ares_socket_t key); + +/*! Retrieve the number of keys stored in the hash table + * + * \param[in] htable Initialized hash table + * \return count + */ +size_t ares__htable_asvp_num_keys(const ares__htable_asvp_t *htable); + +/*! @} */ + +#endif /* __ARES__HTABLE_ASVP_H */ diff --git a/lib/c-ares-1.23.0/src/lib/ares__htable_strvp.c b/lib/c-ares-1.23.0/src/lib/ares__htable_strvp.c new file mode 100644 index 00000000000..bfae4c36228 --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares__htable_strvp.c @@ -0,0 +1,198 @@ +/* MIT License + * + * Copyright (c) 2023 Brad House + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ +#include "ares_setup.h" +#include "ares.h" +#include "ares_private.h" +#include "ares__htable.h" +#include "ares__htable_strvp.h" + +struct ares__htable_strvp { + ares__htable_strvp_val_free_t free_val; + ares__htable_t *hash; +}; + +typedef struct { + char *key; + void *val; + ares__htable_strvp_t *parent; +} ares__htable_strvp_bucket_t; + +void ares__htable_strvp_destroy(ares__htable_strvp_t *htable) +{ + if (htable == NULL) { + return; + } + + ares__htable_destroy(htable->hash); + ares_free(htable); +} + +static unsigned int hash_func(const void *key, unsigned int seed) +{ + const char *arg = key; + return ares__htable_hash_FNV1a_casecmp((const unsigned char *)arg, + ares_strlen(arg), seed); +} + +static const void *bucket_key(const void *bucket) +{ + const ares__htable_strvp_bucket_t *arg = bucket; + return arg->key; +} + +static void bucket_free(void *bucket) +{ + ares__htable_strvp_bucket_t *arg = bucket; + + if (arg->parent->free_val) { + arg->parent->free_val(arg->val); + } + ares_free(arg->key); + ares_free(arg); +} + +static ares_bool_t key_eq(const void *key1, const void *key2) +{ + const char *k1 = key1; + const char *k2 = key2; + + if (strcasecmp(k1, k2) == 0) { + return ARES_TRUE; + } + + return ARES_FALSE; +} + +ares__htable_strvp_t * + ares__htable_strvp_create(ares__htable_strvp_val_free_t val_free) +{ + ares__htable_strvp_t *htable = ares_malloc(sizeof(*htable)); + if (htable == NULL) { + goto fail; + } + + htable->hash = + ares__htable_create(hash_func, bucket_key, bucket_free, key_eq); + if (htable->hash == NULL) { + goto fail; + } + + htable->free_val = val_free; + + return htable; + +fail: + if (htable) { + ares__htable_destroy(htable->hash); + ares_free(htable); + } + return NULL; +} + +ares_bool_t ares__htable_strvp_insert(ares__htable_strvp_t *htable, + const char *key, void *val) +{ + ares__htable_strvp_bucket_t *bucket = NULL; + + if (htable == NULL || key == NULL) { + goto fail; + } + + bucket = ares_malloc(sizeof(*bucket)); + if (bucket == NULL) { + goto fail; + } + + bucket->parent = htable; + bucket->key = ares_strdup(key); + if (bucket->key == NULL) { + goto fail; + } + bucket->val = val; + + if (!ares__htable_insert(htable->hash, bucket)) { + goto fail; + } + + return ARES_TRUE; + +fail: + if (bucket) { + ares_free(bucket->key); + ares_free(bucket); + } + return ARES_FALSE; +} + +ares_bool_t ares__htable_strvp_get(const ares__htable_strvp_t *htable, + const char *key, void **val) +{ + ares__htable_strvp_bucket_t *bucket = NULL; + + if (val) { + *val = NULL; + } + + if (htable == NULL || key == NULL) { + return ARES_FALSE; + } + + bucket = ares__htable_get(htable->hash, key); + if (bucket == NULL) { + return ARES_FALSE; + } + + if (val) { + *val = bucket->val; + } + return ARES_TRUE; +} + +void *ares__htable_strvp_get_direct(const ares__htable_strvp_t *htable, + const char *key) +{ + void *val = NULL; + ares__htable_strvp_get(htable, key, &val); + return val; +} + +ares_bool_t ares__htable_strvp_remove(ares__htable_strvp_t *htable, + const char *key) +{ + if (htable == NULL) { + return ARES_FALSE; + } + + return ares__htable_remove(htable->hash, key); +} + +size_t ares__htable_strvp_num_keys(const ares__htable_strvp_t *htable) +{ + if (htable == NULL) { + return 0; + } + return ares__htable_num_keys(htable->hash); +} diff --git a/lib/c-ares-1.23.0/src/lib/ares__htable_strvp.h b/lib/c-ares-1.23.0/src/lib/ares__htable_strvp.h new file mode 100644 index 00000000000..80d375c0680 --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares__htable_strvp.h @@ -0,0 +1,118 @@ +/* MIT License + * + * Copyright (c) 2023 Brad House + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ +#ifndef __ARES__HTABLE_STRVP_H +#define __ARES__HTABLE_STRVP_H + +/*! \addtogroup ares__htable_strvp HashTable with string Key and void pointer + * Value + * + * This data structure wraps the base ares__htable data structure in order to + * split the key and value data types as string and void pointer, respectively. + * + * Average time complexity: + * - Insert: O(1) + * - Search: O(1) + * - Delete: O(1) + * + * @{ + */ + +struct ares__htable_strvp; + +/*! Opaque data type for size_t key, void pointer hash table implementation */ +typedef struct ares__htable_strvp ares__htable_strvp_t; + +/*! Callback to free value stored in hashtable + * + * \param[in] val user-supplied value + */ +typedef void (*ares__htable_strvp_val_free_t)(void *val); + +/*! Destroy hashtable + * + * \param[in] htable Initialized hashtable + */ +void ares__htable_strvp_destroy(ares__htable_strvp_t *htable); + +/*! Create string, void pointer value hash table + * + * \param[in] val_free Optional. Call back to free user-supplied value. If + * NULL it is expected the caller will clean up any user + * supplied values. + */ +ares__htable_strvp_t * + ares__htable_strvp_create(ares__htable_strvp_val_free_t val_free); + +/*! Insert key/value into hash table + * + * \param[in] htable Initialized hash table + * \param[in] key key to associate with value + * \param[in] val value to store (takes ownership). May be NULL. + * \return ARES_TRUE on success, ARES_FALSE on failure or out of memory + */ +ares_bool_t ares__htable_strvp_insert(ares__htable_strvp_t *htable, + const char *key, void *val); + +/*! Retrieve value from hashtable based on key + * + * \param[in] htable Initialized hash table + * \param[in] key key to use to search + * \param[out] val Optional. Pointer to store value. + * \return ARES_TRUE on success, ARES_FALSE on failure + */ +ares_bool_t ares__htable_strvp_get(const ares__htable_strvp_t *htable, + const char *key, void **val); + +/*! Retrieve value from hashtable directly as return value. Caveat to this + * function over ares__htable_strvp_get() is that if a NULL value is stored + * you cannot determine if the key is not found or the value is NULL. + * + * \param[in] htable Initialized hash table + * \param[in] key key to use to search + * \return value associated with key in hashtable or NULL + */ +void *ares__htable_strvp_get_direct(const ares__htable_strvp_t *htable, + const char *key); + +/*! Remove a value from the hashtable by key + * + * \param[in] htable Initialized hash table + * \param[in] key key to use to search + * \return ARES_TRUE if found, ARES_FALSE if not + */ +ares_bool_t ares__htable_strvp_remove(ares__htable_strvp_t *htable, + const char *key); + +/*! Retrieve the number of keys stored in the hash table + * + * \param[in] htable Initialized hash table + * \return count + */ +size_t ares__htable_strvp_num_keys(const ares__htable_strvp_t *htable); + +/*! @} */ + +#endif /* __ARES__HTABLE_STVP_H */ diff --git a/lib/c-ares-1.23.0/src/lib/ares__htable_szvp.c b/lib/c-ares-1.23.0/src/lib/ares__htable_szvp.c new file mode 100644 index 00000000000..2ff64784bcd --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares__htable_szvp.c @@ -0,0 +1,193 @@ +/* MIT License + * + * Copyright (c) 2023 Brad House + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ +#include "ares_setup.h" +#include "ares.h" +#include "ares_private.h" +#include "ares__htable.h" +#include "ares__htable_szvp.h" + +struct ares__htable_szvp { + ares__htable_szvp_val_free_t free_val; + ares__htable_t *hash; +}; + +typedef struct { + size_t key; + void *val; + ares__htable_szvp_t *parent; +} ares__htable_szvp_bucket_t; + +void ares__htable_szvp_destroy(ares__htable_szvp_t *htable) +{ + if (htable == NULL) { + return; + } + + ares__htable_destroy(htable->hash); + ares_free(htable); +} + +static unsigned int hash_func(const void *key, unsigned int seed) +{ + const size_t *arg = key; + return ares__htable_hash_FNV1a((const unsigned char *)arg, sizeof(*arg), + seed); +} + +static const void *bucket_key(const void *bucket) +{ + const ares__htable_szvp_bucket_t *arg = bucket; + return &arg->key; +} + +static void bucket_free(void *bucket) +{ + ares__htable_szvp_bucket_t *arg = bucket; + + if (arg->parent->free_val) { + arg->parent->free_val(arg->val); + } + + ares_free(arg); +} + +static ares_bool_t key_eq(const void *key1, const void *key2) +{ + const size_t *k1 = key1; + const size_t *k2 = key2; + + if (*k1 == *k2) { + return ARES_TRUE; + } + + return ARES_FALSE; +} + +ares__htable_szvp_t * + ares__htable_szvp_create(ares__htable_szvp_val_free_t val_free) +{ + ares__htable_szvp_t *htable = ares_malloc(sizeof(*htable)); + if (htable == NULL) { + goto fail; + } + + htable->hash = + ares__htable_create(hash_func, bucket_key, bucket_free, key_eq); + if (htable->hash == NULL) { + goto fail; + } + + htable->free_val = val_free; + + return htable; + +fail: + if (htable) { + ares__htable_destroy(htable->hash); + ares_free(htable); + } + return NULL; +} + +ares_bool_t ares__htable_szvp_insert(ares__htable_szvp_t *htable, size_t key, + void *val) +{ + ares__htable_szvp_bucket_t *bucket = NULL; + + if (htable == NULL) { + goto fail; + } + + bucket = ares_malloc(sizeof(*bucket)); + if (bucket == NULL) { + goto fail; + } + + bucket->parent = htable; + bucket->key = key; + bucket->val = val; + + if (!ares__htable_insert(htable->hash, bucket)) { + goto fail; + } + + return ARES_TRUE; + +fail: + if (bucket) { + ares_free(bucket); + } + return ARES_FALSE; +} + +ares_bool_t ares__htable_szvp_get(const ares__htable_szvp_t *htable, size_t key, + void **val) +{ + ares__htable_szvp_bucket_t *bucket = NULL; + + if (val) { + *val = NULL; + } + + if (htable == NULL) { + return ARES_FALSE; + } + + bucket = ares__htable_get(htable->hash, &key); + if (bucket == NULL) { + return ARES_FALSE; + } + + if (val) { + *val = bucket->val; + } + return ARES_TRUE; +} + +void *ares__htable_szvp_get_direct(const ares__htable_szvp_t *htable, + size_t key) +{ + void *val = NULL; + ares__htable_szvp_get(htable, key, &val); + return val; +} + +ares_bool_t ares__htable_szvp_remove(ares__htable_szvp_t *htable, size_t key) +{ + if (htable == NULL) { + return ARES_FALSE; + } + + return ares__htable_remove(htable->hash, &key); +} + +size_t ares__htable_szvp_num_keys(const ares__htable_szvp_t *htable) +{ + if (htable == NULL) { + return 0; + } + return ares__htable_num_keys(htable->hash); +} diff --git a/lib/c-ares-1.23.0/src/lib/ares__htable_szvp.h b/lib/c-ares-1.23.0/src/lib/ares__htable_szvp.h new file mode 100644 index 00000000000..9857afe7960 --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares__htable_szvp.h @@ -0,0 +1,117 @@ +/* MIT License + * + * Copyright (c) 2023 Brad House + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ +#ifndef __ARES__HTABLE_STVP_H +#define __ARES__HTABLE_STVP_H + +/*! \addtogroup ares__htable_szvp HashTable with size_t Key and void pointer + * Value + * + * This data structure wraps the base ares__htable data structure in order to + * split the key and value data types as size_t and void pointer, respectively. + * + * Average time complexity: + * - Insert: O(1) + * - Search: O(1) + * - Delete: O(1) + * + * @{ + */ + +struct ares__htable_szvp; + +/*! Opaque data type for size_t key, void pointer hash table implementation */ +typedef struct ares__htable_szvp ares__htable_szvp_t; + +/*! Callback to free value stored in hashtable + * + * \param[in] val user-supplied value + */ +typedef void (*ares__htable_szvp_val_free_t)(void *val); + +/*! Destroy hashtable + * + * \param[in] htable Initialized hashtable + */ +void ares__htable_szvp_destroy(ares__htable_szvp_t *htable); + +/*! Create size_t key, void pointer value hash table + * + * \param[in] val_free Optional. Call back to free user-supplied value. If + * NULL it is expected the caller will clean up any user + * supplied values. + */ +ares__htable_szvp_t * + ares__htable_szvp_create(ares__htable_szvp_val_free_t val_free); + +/*! Insert key/value into hash table + * + * \param[in] htable Initialized hash table + * \param[in] key key to associate with value + * \param[in] val value to store (takes ownership). May be NULL. + * \return ARES_TRUE on success, ARES_FALSE on failure or out of memory + */ +ares_bool_t ares__htable_szvp_insert(ares__htable_szvp_t *htable, size_t key, + void *val); + +/*! Retrieve value from hashtable based on key + * + * \param[in] htable Initialized hash table + * \param[in] key key to use to search + * \param[out] val Optional. Pointer to store value. + * \return ARES_TRUE on success, ARES_FALSE on failure + */ +ares_bool_t ares__htable_szvp_get(const ares__htable_szvp_t *htable, size_t key, + void **val); + +/*! Retrieve value from hashtable directly as return value. Caveat to this + * function over ares__htable_szvp_get() is that if a NULL value is stored + * you cannot determine if the key is not found or the value is NULL. + * + * \param[in] htable Initialized hash table + * \param[in] key key to use to search + * \return value associated with key in hashtable or NULL + */ +void *ares__htable_szvp_get_direct(const ares__htable_szvp_t *htable, + size_t key); + +/*! Remove a value from the hashtable by key + * + * \param[in] htable Initialized hash table + * \param[in] key key to use to search + * \return ARES_TRUE if found, ARES_FALSE if not + */ +ares_bool_t ares__htable_szvp_remove(ares__htable_szvp_t *htable, size_t key); + +/*! Retrieve the number of keys stored in the hash table + * + * \param[in] htable Initialized hash table + * \return count + */ +size_t ares__htable_szvp_num_keys(const ares__htable_szvp_t *htable); + +/*! @} */ + +#endif /* __ARES__HTABLE_STVP_H */ diff --git a/lib/c-ares-1.23.0/src/lib/ares__llist.c b/lib/c-ares-1.23.0/src/lib/ares__llist.c new file mode 100644 index 00000000000..d175da2bd3b --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares__llist.c @@ -0,0 +1,360 @@ +/* MIT License + * + * Copyright (c) 2023 Brad House + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ +#include "ares_setup.h" +#include "ares.h" +#include "ares_private.h" +#include "ares__llist.h" + +struct ares__llist { + ares__llist_node_t *head; + ares__llist_node_t *tail; + ares__llist_destructor_t destruct; + size_t cnt; +}; + +struct ares__llist_node { + void *data; + ares__llist_node_t *prev; + ares__llist_node_t *next; + ares__llist_t *parent; +}; + +ares__llist_t *ares__llist_create(ares__llist_destructor_t destruct) +{ + ares__llist_t *list = ares_malloc_zero(sizeof(*list)); + + if (list == NULL) { + return NULL; + } + + list->destruct = destruct; + + return list; +} + +void ares__llist_replace_destructor(ares__llist_t *list, + ares__llist_destructor_t destruct) +{ + if (list == NULL) { + return; + } + + list->destruct = destruct; +} + +typedef enum { + ARES__LLIST_INSERT_HEAD, + ARES__LLIST_INSERT_TAIL, + ARES__LLIST_INSERT_BEFORE +} ares__llist_insert_type_t; + +static void ares__llist_attach_at(ares__llist_t *list, + ares__llist_insert_type_t type, + ares__llist_node_t *at, + ares__llist_node_t *node) +{ + if (list == NULL || node == NULL) { + return; + } + + node->parent = list; + + if (type == ARES__LLIST_INSERT_BEFORE && (at == list->head || at == NULL)) { + type = ARES__LLIST_INSERT_HEAD; + } + + switch (type) { + case ARES__LLIST_INSERT_HEAD: + node->next = list->head; + node->prev = NULL; + if (list->head) { + list->head->prev = node; + } + list->head = node; + break; + case ARES__LLIST_INSERT_TAIL: + node->next = NULL; + node->prev = list->tail; + if (list->tail) { + list->tail->next = node; + } + list->tail = node; + break; + case ARES__LLIST_INSERT_BEFORE: + node->next = at; + node->prev = at->prev; + at->prev = node; + break; + } + if (list->tail == NULL) { + list->tail = node; + } + if (list->head == NULL) { + list->head = node; + } + + list->cnt++; +} + +static ares__llist_node_t *ares__llist_insert_at(ares__llist_t *list, + ares__llist_insert_type_t type, + ares__llist_node_t *at, + void *val) +{ + ares__llist_node_t *node = NULL; + + if (list == NULL || val == NULL) { + return NULL; + } + + node = ares_malloc_zero(sizeof(*node)); + + if (node == NULL) { + return NULL; + } + + node->data = val; + ares__llist_attach_at(list, type, at, node); + + return node; +} + +ares__llist_node_t *ares__llist_insert_first(ares__llist_t *list, void *val) +{ + return ares__llist_insert_at(list, ARES__LLIST_INSERT_HEAD, NULL, val); +} + +ares__llist_node_t *ares__llist_insert_last(ares__llist_t *list, void *val) +{ + return ares__llist_insert_at(list, ARES__LLIST_INSERT_TAIL, NULL, val); +} + +ares__llist_node_t *ares__llist_insert_before(ares__llist_node_t *node, + void *val) +{ + if (node == NULL) { + return NULL; + } + + return ares__llist_insert_at(node->parent, ARES__LLIST_INSERT_BEFORE, node, + val); +} + +ares__llist_node_t *ares__llist_insert_after(ares__llist_node_t *node, + void *val) +{ + if (node == NULL) { + return NULL; + } + + if (node->next == NULL) { + return ares__llist_insert_last(node->parent, val); + } + + return ares__llist_insert_at(node->parent, ARES__LLIST_INSERT_BEFORE, + node->next, val); +} + +ares__llist_node_t *ares__llist_node_first(ares__llist_t *list) +{ + if (list == NULL) { + return NULL; + } + return list->head; +} + +ares__llist_node_t *ares__llist_node_last(ares__llist_t *list) +{ + if (list == NULL) { + return NULL; + } + return list->tail; +} + +ares__llist_node_t *ares__llist_node_next(ares__llist_node_t *node) +{ + if (node == NULL) { + return NULL; + } + return node->next; +} + +ares__llist_node_t *ares__llist_node_prev(ares__llist_node_t *node) +{ + if (node == NULL) { + return NULL; + } + return node->prev; +} + +void *ares__llist_node_val(ares__llist_node_t *node) +{ + if (node == NULL) { + return NULL; + } + + return node->data; +} + +size_t ares__llist_len(const ares__llist_t *list) +{ + if (list == NULL) { + return 0; + } + return list->cnt; +} + +ares__llist_t *ares__llist_node_parent(ares__llist_node_t *node) +{ + if (node == NULL) { + return NULL; + } + return node->parent; +} + +void *ares__llist_first_val(ares__llist_t *list) +{ + return ares__llist_node_val(ares__llist_node_first(list)); +} + +void *ares__llist_last_val(ares__llist_t *list) +{ + return ares__llist_node_val(ares__llist_node_last(list)); +} + +static void ares__llist_node_detach(ares__llist_node_t *node) +{ + ares__llist_t *list; + + if (node == NULL) { + return; + } + + list = node->parent; + + if (node->prev) { + node->prev->next = node->next; + } + + if (node->next) { + node->next->prev = node->prev; + } + + if (node == list->head) { + list->head = node->next; + } + + if (node == list->tail) { + list->tail = node->prev; + } + + node->parent = NULL; + list->cnt--; +} + +void *ares__llist_node_claim(ares__llist_node_t *node) +{ + void *val; + + if (node == NULL) { + return NULL; + } + + val = node->data; + ares__llist_node_detach(node); + ares_free(node); + + return val; +} + +void ares__llist_node_destroy(ares__llist_node_t *node) +{ + ares__llist_destructor_t destruct; + void *val; + + if (node == NULL) { + return; + } + + destruct = node->parent->destruct; + + val = ares__llist_node_claim(node); + if (val != NULL && destruct != NULL) { + destruct(val); + } +} + +void ares__llist_node_replace(ares__llist_node_t *node, void *val) +{ + ares__llist_destructor_t destruct; + + if (node == NULL) { + return; + } + + destruct = node->parent->destruct; + if (destruct != NULL) { + destruct(node->data); + } + + node->data = val; +} + +void ares__llist_destroy(ares__llist_t *list) +{ + ares__llist_node_t *node; + + if (list == NULL) { + return; + } + + while ((node = ares__llist_node_first(list)) != NULL) { + ares__llist_node_destroy(node); + } + ares_free(list); +} + +void ares__llist_node_move_parent_last(ares__llist_node_t *node, + ares__llist_t *new_parent) +{ + if (node == NULL || new_parent == NULL) { + return; + } + + ares__llist_node_detach(node); + ares__llist_attach_at(new_parent, ARES__LLIST_INSERT_TAIL, NULL, node); +} + +void ares__llist_node_move_parent_first(ares__llist_node_t *node, + ares__llist_t *new_parent) +{ + if (node == NULL || new_parent == NULL) { + return; + } + + ares__llist_node_detach(node); + ares__llist_attach_at(new_parent, ARES__LLIST_INSERT_HEAD, NULL, node); +} diff --git a/lib/c-ares-1.23.0/src/lib/ares__llist.h b/lib/c-ares-1.23.0/src/lib/ares__llist.h new file mode 100644 index 00000000000..bd18bb9ec1d --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares__llist.h @@ -0,0 +1,220 @@ +/* MIT License + * + * Copyright (c) 2023 Brad House + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ +#ifndef __ARES__LLIST_H +#define __ARES__LLIST_H + +/*! \addtogroup ares__llist LinkedList Data Structure + * + * This is a doubly-linked list data structure. + * + * Average time complexity: + * - Insert: O(1) -- head or tail + * - Search: O(n) + * - Delete: O(1) -- delete assumes you hold a node pointer + * + * @{ + */ + +struct ares__llist; + +/*! Opaque data structure for linked list */ +typedef struct ares__llist ares__llist_t; + +struct ares__llist_node; + +/*! Opaque data structure for a node in a linked list */ +typedef struct ares__llist_node ares__llist_node_t; + +/*! Callback to free user-defined node data + * + * \param[in] data user supplied data + */ +typedef void (*ares__llist_destructor_t)(void *data); + +/*! Create a linked list object + * + * \param[in] destruct Optional. Destructor to call on all removed nodes + * \return linked list object or NULL on out of memory + */ +ares__llist_t *ares__llist_create(ares__llist_destructor_t destruct); + +/*! Replace destructor for linked list nodes. Typically this is used + * when wanting to disable the destructor by using NULL. + * + * \param[in] list Initialized linked list object + * \param[in] destruct replacement destructor, NULL is allowed + */ +void ares__llist_replace_destructor(ares__llist_t *list, + ares__llist_destructor_t destruct); + +/*! Insert value as the first node in the linked list + * + * \param[in] list Initialized linked list object + * \param[in] val user-supplied value. + * \return node object referencing place in list, or null if out of memory or + * misuse + */ +ares__llist_node_t *ares__llist_insert_first(ares__llist_t *list, void *val); + +/*! Insert value as the last node in the linked list + * + * \param[in] list Initialized linked list object + * \param[in] val user-supplied value. + * \return node object referencing place in list, or null if out of memory or + * misuse + */ +ares__llist_node_t *ares__llist_insert_last(ares__llist_t *list, void *val); + +/*! Insert value before specified node in the linked list + * + * \param[in] node node referenced to insert before + * \param[in] val user-supplied value. + * \return node object referencing place in list, or null if out of memory or + * misuse + */ +ares__llist_node_t *ares__llist_insert_before(ares__llist_node_t *node, + void *val); + +/*! Insert value after specified node in the linked list + * + * \param[in] node node referenced to insert after + * \param[in] val user-supplied value. + * \return node object referencing place in list, or null if out of memory or + * misuse + */ +ares__llist_node_t *ares__llist_insert_after(ares__llist_node_t *node, + void *val); + +/*! Obtain first node in list + * + * \param[in] list Initialized list object + * \return first node in list or NULL if none + */ +ares__llist_node_t *ares__llist_node_first(ares__llist_t *list); + +/*! Obtain last node in list + * + * \param[in] list Initialized list object + * \return last node in list or NULL if none + */ +ares__llist_node_t *ares__llist_node_last(ares__llist_t *list); + +/*! Obtain next node in respect to specified node + * + * \param[in] node Node referenced + * \return node or NULL if none + */ +ares__llist_node_t *ares__llist_node_next(ares__llist_node_t *node); + +/*! Obtain previous node in respect to specified node + * + * \param[in] node Node referenced + * \return node or NULL if none + */ +ares__llist_node_t *ares__llist_node_prev(ares__llist_node_t *node); + +/*! Obtain value from node + * + * \param[in] node Node referenced + * \return user provided value from node + */ +void *ares__llist_node_val(ares__llist_node_t *node); + +/*! Obtain the number of entries in the list + * + * \param[in] list Initialized list object + * \return count + */ +size_t ares__llist_len(const ares__llist_t *list); + +/*! Obtain list object from referenced node + * + * \param[in] node Node referenced + * \return list object node belongs to + */ +ares__llist_t *ares__llist_node_parent(ares__llist_node_t *node); + +/*! Obtain the first user-supplied value in the list + * + * \param[in] list Initialized list object + * \return first user supplied value or NULL if none + */ +void *ares__llist_first_val(ares__llist_t *list); + +/*! Obtain the last user-supplied value in the list + * + * \param[in] list Initialized list object + * \return last user supplied value or NULL if none + */ +void *ares__llist_last_val(ares__llist_t *list); + +/*! Take ownership of user-supplied value in list without calling destructor. + * Will unchain entry from list. + * + * \param[in] node Node referenced + * \return user supplied value + */ +void *ares__llist_node_claim(ares__llist_node_t *node); + +/*! Replace user-supplied value for node + * + * \param[in] node Node referenced + * \param[in] val new user-supplied value + */ +void ares__llist_node_replace(ares__llist_node_t *node, void *val); + +/*! Destroy the node, removing it from the list and calling destructor. + * + * \param[in] node Node referenced + */ +void ares__llist_node_destroy(ares__llist_node_t *node); + +/*! Destroy the list object and all nodes in the list. + * + * \param[in] list Initialized list object + */ +void ares__llist_destroy(ares__llist_t *list); + +/*! Detach node from the current list and re-attach it to the new list as the + * last entry. + * + * \param[in] node node to move + * \param[in] parent new list + */ +void ares__llist_node_move_parent_last(ares__llist_node_t *node, + ares__llist_t *new_parent); + +/*! Detach node from the current list and re-attach it to the new list as the + * first entry. + * + * \param[in] node node to move + * \param[in] parent new list + */ +void ares__llist_node_move_parent_first(ares__llist_node_t *node, + ares__llist_t *new_parent); +/*! @} */ + +#endif /* __ARES__LLIST_H */ diff --git a/lib/c-ares-1.23.0/src/lib/ares__parse_into_addrinfo.c b/lib/c-ares-1.23.0/src/lib/ares__parse_into_addrinfo.c new file mode 100644 index 00000000000..308cc21458b --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares__parse_into_addrinfo.c @@ -0,0 +1,184 @@ +/* MIT License + * + * Copyright (c) 2019 Andrew Selivanov + * Copyright (c) 2023 Brad House + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ +#include "ares_setup.h" + +#ifdef HAVE_NETINET_IN_H +# include +#endif +#ifdef HAVE_NETDB_H +# include +#endif +#ifdef HAVE_ARPA_INET_H +# include +#endif + +#ifdef HAVE_STRINGS_H +# include +#endif + +#ifdef HAVE_LIMITS_H +# include +#endif + +#include "ares.h" +#include "ares_private.h" + +ares_status_t ares__parse_into_addrinfo(const unsigned char *abuf, size_t alen, + ares_bool_t cname_only_is_enodata, + unsigned short port, + struct ares_addrinfo *ai) +{ + ares_status_t status; + ares_dns_record_t *dnsrec = NULL; + size_t i; + size_t ancount; + const char *hostname = NULL; + ares_bool_t got_a = ARES_FALSE; + ares_bool_t got_aaaa = ARES_FALSE; + ares_bool_t got_cname = ARES_FALSE; + struct ares_addrinfo_cname *cnames = NULL; + struct ares_addrinfo_node *nodes = NULL; + + status = ares_dns_parse(abuf, alen, 0, &dnsrec); + if (status != ARES_SUCCESS) { + goto done; + } + + /* Save question hostname */ + status = ares_dns_record_query_get(dnsrec, 0, &hostname, NULL, NULL); + if (status != ARES_SUCCESS) { + goto done; + } + + ancount = ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_ANSWER); + if (ancount == 0) { + status = ARES_ENODATA; + goto done; + } + + for (i = 0; i < ancount; i++) { + const char *rname = NULL; + ares_dns_rec_type_t rtype; + const ares_dns_rr_t *rr = + ares_dns_record_rr_get(dnsrec, ARES_SECTION_ANSWER, i); + + if (ares_dns_rr_get_class(rr) != ARES_CLASS_IN) { + continue; + } + + rtype = ares_dns_rr_get_type(rr); + rname = ares_dns_rr_get_name(rr); + + /* Old code did this hostname sanity check */ + if ((rtype == ARES_REC_TYPE_A || rtype == ARES_REC_TYPE_AAAA) && + strcasecmp(rname, hostname) != 0) { + continue; + } + + if (rtype == ARES_REC_TYPE_CNAME) { + struct ares_addrinfo_cname *cname; + + got_cname = ARES_TRUE; + /* replace hostname with data from cname + * SA: Seems wrong as it introduces order dependency. */ + hostname = ares_dns_rr_get_str(rr, ARES_RR_CNAME_CNAME); + + cname = ares__append_addrinfo_cname(&cnames); + if (cname == NULL) { + status = ARES_ENOMEM; + goto done; + } + cname->ttl = (int)ares_dns_rr_get_ttl(rr); + cname->alias = ares_strdup(ares_dns_rr_get_name(rr)); + if (cname->alias == NULL) { + status = ARES_ENOMEM; + goto done; + } + cname->name = ares_strdup(hostname); + if (cname->name == NULL) { + status = ARES_ENOMEM; + goto done; + } + } else if (rtype == ARES_REC_TYPE_A) { + got_a = ARES_TRUE; + status = + ares_append_ai_node(AF_INET, port, ares_dns_rr_get_ttl(rr), + ares_dns_rr_get_addr(rr, ARES_RR_A_ADDR), &nodes); + if (status != ARES_SUCCESS) { + goto done; + } + } else if (rtype == ARES_REC_TYPE_AAAA) { + got_aaaa = ARES_TRUE; + status = ares_append_ai_node(AF_INET6, port, ares_dns_rr_get_ttl(rr), + ares_dns_rr_get_addr6(rr, ARES_RR_AAAA_ADDR), + &nodes); + if (status != ARES_SUCCESS) { + goto done; + } + } else { + continue; + } + } + + if (!got_a && !got_aaaa && + (!got_cname || (got_cname && cname_only_is_enodata))) { + status = ARES_ENODATA; + goto done; + } + + /* save the hostname as ai->name */ + if (ai->name == NULL || strcasecmp(ai->name, hostname) != 0) { + ares_free(ai->name); + ai->name = ares_strdup(hostname); + if (ai->name == NULL) { + status = ARES_ENOMEM; + goto done; + } + } + + if (got_a || got_aaaa) { + ares__addrinfo_cat_nodes(&ai->nodes, nodes); + nodes = NULL; + } + + if (got_cname) { + ares__addrinfo_cat_cnames(&ai->cnames, cnames); + cnames = NULL; + } + +done: + ares__freeaddrinfo_cnames(cnames); + ares__freeaddrinfo_nodes(nodes); + ares_dns_record_destroy(dnsrec); + + /* compatibility */ + if (status == ARES_EBADNAME) { + status = ARES_EBADRESP; + } + + return status; +} diff --git a/lib/c-ares-1.23.0/src/lib/ares__read_line.c b/lib/c-ares-1.23.0/src/lib/ares__read_line.c new file mode 100644 index 00000000000..d65ac1fcf85 --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares__read_line.c @@ -0,0 +1,82 @@ +/* MIT License + * + * Copyright (c) 1998 Massachusetts Institute of Technology + * Copyright (c) The c-ares project and its contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ + +#include "ares_setup.h" + +#include "ares.h" +#include "ares_private.h" + +/* This is an internal function. Its contract is to read a line from + * a file into a dynamically allocated buffer, zeroing the trailing + * newline if there is one. The calling routine may call + * ares__read_line multiple times with the same buf and bufsize + * pointers; *buf will be reallocated and *bufsize adjusted as + * appropriate. The initial value of *buf should be NULL. After the + * calling routine is done reading lines, it should free *buf. + */ +ares_status_t ares__read_line(FILE *fp, char **buf, size_t *bufsize) +{ + char *newbuf; + size_t offset = 0; + size_t len; + + if (*buf == NULL) { + *buf = ares_malloc(128); + if (!*buf) { + return ARES_ENOMEM; + } + *bufsize = 128; + } + + for (;;) { + int bytestoread = (int)(*bufsize - offset); + + if (!fgets(*buf + offset, bytestoread, fp)) { + return (offset != 0) ? 0 : (ferror(fp)) ? ARES_EFILE : ARES_EOF; + } + len = offset + ares_strlen(*buf + offset); + if ((*buf)[len - 1] == '\n') { + (*buf)[len - 1] = 0; + break; + } + offset = len; + if (len < *bufsize - 1) { + continue; + } + + /* Allocate more space. */ + newbuf = ares_realloc(*buf, *bufsize * 2); + if (!newbuf) { + ares_free(*buf); + *buf = NULL; + return ARES_ENOMEM; + } + *buf = newbuf; + *bufsize *= 2; + } + return ARES_SUCCESS; +} diff --git a/lib/c-ares-1.23.0/src/lib/ares__slist.c b/lib/c-ares-1.23.0/src/lib/ares__slist.c new file mode 100644 index 00000000000..5b809843551 --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares__slist.c @@ -0,0 +1,479 @@ +/* MIT License + * + * Copyright (c) 2023 Brad House + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ +#include "ares_setup.h" +#include "ares.h" +#include "ares_private.h" +#include "ares__slist.h" + +/* SkipList implementation */ + +#define ARES__SLIST_START_LEVELS 4 + +struct ares__slist { + ares_rand_state *rand_state; + unsigned char rand_data[8]; + size_t rand_bits; + + ares__slist_node_t **head; + size_t levels; + ares__slist_node_t *tail; + + ares__slist_cmp_t cmp; + ares__slist_destructor_t destruct; + size_t cnt; +}; + +struct ares__slist_node { + void *data; + ares__slist_node_t **prev; + ares__slist_node_t **next; + size_t levels; + ares__slist_t *parent; +}; + +ares__slist_t *ares__slist_create(ares_rand_state *rand_state, + ares__slist_cmp_t cmp, + ares__slist_destructor_t destruct) +{ + ares__slist_t *list; + + if (rand_state == NULL || cmp == NULL) { + return NULL; + } + + list = ares_malloc_zero(sizeof(*list)); + + if (list == NULL) { + return NULL; + } + + list->rand_state = rand_state; + list->cmp = cmp; + list->destruct = destruct; + + list->levels = ARES__SLIST_START_LEVELS; + list->head = ares_malloc_zero(sizeof(*list->head) * list->levels); + if (list->head == NULL) { + ares_free(list); + return NULL; + } + + return list; +} + +static ares_bool_t ares__slist_coin_flip(ares__slist_t *list) +{ + size_t total_bits = sizeof(list->rand_data) * 8; + size_t bit; + + /* Refill random data used for coin flips. We pull this in 8 byte chunks. + * ares__rand_bytes() has some built-in caching of its own so we don't need + * to be excessive in caching ourselves. Prefer to require less memory per + * skiplist */ + if (list->rand_bits == 0) { + ares__rand_bytes(list->rand_state, list->rand_data, + sizeof(list->rand_data)); + list->rand_bits = total_bits; + } + + bit = total_bits - list->rand_bits; + list->rand_bits--; + + return (list->rand_data[bit / 8] & (1 << (bit % 8))) ? ARES_TRUE : ARES_FALSE; +} + +void ares__slist_replace_destructor(ares__slist_t *list, + ares__slist_destructor_t destruct) +{ + if (list == NULL) { + return; + } + + list->destruct = destruct; +} + +static size_t ares__slist_max_level(const ares__slist_t *list) +{ + size_t max_level = 0; + + if (list->cnt + 1 <= (1 << ARES__SLIST_START_LEVELS)) { + max_level = ARES__SLIST_START_LEVELS; + } else { + max_level = ares__log2(ares__round_up_pow2(list->cnt + 1)); + } + + if (list->levels > max_level) { + max_level = list->levels; + } + + return max_level; +} + +static size_t ares__slist_calc_level(ares__slist_t *list) +{ + size_t max_level = ares__slist_max_level(list); + size_t level; + + for (level = 1; ares__slist_coin_flip(list) && level < max_level; level++) + ; + + return level; +} + +static void ares__slist_node_push(ares__slist_t *list, ares__slist_node_t *node) +{ + size_t i; + ares__slist_node_t *left = NULL; + + /* Scan from highest level in the slist, even if we're not using that number + * of levels for this entry as this is what makes it O(log n) */ + for (i = list->levels; i-- > 0;) { + /* set left if left is NULL and the current node value is greater than the + * head at this level */ + if (left == NULL && list->head[i] != NULL && + list->cmp(node->data, list->head[i]->data) > 0) { + left = list->head[i]; + } + + if (left != NULL) { + /* scan forward to find our insertion point */ + while (left->next[i] != NULL && + list->cmp(node->data, left->next[i]->data) > 0) { + left = left->next[i]; + } + } + + /* search only as we didn't randomly select this number of levels */ + if (i >= node->levels) { + continue; + } + + if (left == NULL) { + /* head insertion */ + node->next[i] = list->head[i]; + node->prev[i] = NULL; + list->head[i] = node; + } else { + /* Chain */ + node->next[i] = left->next[i]; + node->prev[i] = left; + left->next[i] = node; + } + + if (node->next[i] != NULL) { + /* chain prev */ + node->next[i]->prev[i] = node; + } else { + if (i == 0) { + /* update tail */ + list->tail = node; + } + } + } +} + +ares__slist_node_t *ares__slist_insert(ares__slist_t *list, void *val) +{ + ares__slist_node_t *node = NULL; + + if (list == NULL || val == NULL) { + return NULL; + } + + node = ares_malloc_zero(sizeof(*node)); + + if (node == NULL) { + goto fail; + } + + node->data = val; + node->parent = list; + + /* Randomly determine the number of levels we want to use */ + node->levels = ares__slist_calc_level(list); + + /* Allocate array of next and prev nodes for linking each level */ + node->next = ares_malloc_zero(sizeof(*node->next) * node->levels); + if (node->next == NULL) { + goto fail; + } + + node->prev = ares_malloc_zero(sizeof(*node->prev) * node->levels); + if (node->prev == NULL) { + goto fail; + } + + /* If the number of levels is greater than we currently support in the slist, + * increase the count */ + if (list->levels < node->levels) { + void *ptr = + ares_realloc_zero(list->head, sizeof(*list->head) * list->levels, + sizeof(*list->head) * node->levels); + if (ptr == NULL) { + goto fail; + } + + list->head = ptr; + list->levels = node->levels; + } + + ares__slist_node_push(list, node); + + list->cnt++; + + return node; + +fail: + if (node) { + ares_free(node->prev); + ares_free(node->next); + ares_free(node); + } + return NULL; +} + +static void ares__slist_node_pop(ares__slist_node_t *node) +{ + ares__slist_t *list = node->parent; + size_t i; + + /* relink each node at each level */ + for (i = node->levels; i-- > 0;) { + if (node->next[i] == NULL) { + if (i == 0) { + list->tail = node->prev[0]; + } + } else { + node->next[i]->prev[i] = node->prev[i]; + } + + if (node->prev[i] == NULL) { + list->head[i] = node->next[i]; + } else { + node->prev[i]->next[i] = node->next[i]; + } + } + + memset(node->next, 0, sizeof(*node->next) * node->levels); + memset(node->prev, 0, sizeof(*node->prev) * node->levels); +} + +void *ares__slist_node_claim(ares__slist_node_t *node) +{ + ares__slist_t *list; + void *val; + + if (node == NULL) { + return NULL; + } + + list = node->parent; + val = node->data; + + ares__slist_node_pop(node); + + ares_free(node->next); + ares_free(node->prev); + ares_free(node); + + list->cnt--; + + return val; +} + +void ares__slist_node_reinsert(ares__slist_node_t *node) +{ + ares__slist_t *list; + + if (node == NULL) { + return; + } + + list = node->parent; + + ares__slist_node_pop(node); + ares__slist_node_push(list, node); +} + +ares__slist_node_t *ares__slist_node_find(ares__slist_t *list, const void *val) +{ + size_t i; + ares__slist_node_t *node = NULL; + int rv = -1; + + if (list == NULL || val == NULL) { + return NULL; + } + + /* Scan nodes starting at the highest level. For each level scan forward + * until the value is between the prior and next node, or if equal quit + * as we found a match */ + for (i = list->levels; i-- > 0;) { + if (node == NULL) { + node = list->head[i]; + } + + if (node == NULL) { + continue; + } + + do { + rv = list->cmp(val, node->data); + + if (rv < 0) { + /* back off, our value is greater than current node reference */ + node = node->prev[i]; + } else if (rv > 0) { + /* move forward and try again. if it goes past, it will loop again and + * go to previous entry */ + node = node->next[i]; + } + + /* rv == 0 will terminate loop */ + + } while (node != NULL && rv > 0); + + /* Found a match, no need to continue */ + if (rv == 0) { + break; + } + } + + /* no match */ + if (rv != 0) { + return NULL; + } + + /* The list may have multiple entries that match. They're guaranteed to be + * in order, but we're not guaranteed to have selected the _first_ matching + * node. Lets scan backwards to find the first match */ + while (node->prev[0] != NULL && list->cmp(node->prev[0]->data, val) == 0) { + node = node->prev[0]; + } + + return node; +} + +ares__slist_node_t *ares__slist_node_first(ares__slist_t *list) +{ + if (list == NULL) { + return NULL; + } + + return list->head[0]; +} + +ares__slist_node_t *ares__slist_node_last(ares__slist_t *list) +{ + if (list == NULL) { + return NULL; + } + return list->tail; +} + +ares__slist_node_t *ares__slist_node_next(ares__slist_node_t *node) +{ + if (node == NULL) { + return NULL; + } + return node->next[0]; +} + +ares__slist_node_t *ares__slist_node_prev(ares__slist_node_t *node) +{ + if (node == NULL) { + return NULL; + } + return node->prev[0]; +} + +void *ares__slist_node_val(ares__slist_node_t *node) +{ + if (node == NULL) { + return NULL; + } + + return node->data; +} + +size_t ares__slist_len(const ares__slist_t *list) +{ + if (list == NULL) { + return 0; + } + return list->cnt; +} + +ares__slist_t *ares__slist_node_parent(ares__slist_node_t *node) +{ + if (node == NULL) { + return NULL; + } + return node->parent; +} + +void *ares__slist_first_val(ares__slist_t *list) +{ + return ares__slist_node_val(ares__slist_node_first(list)); +} + +void *ares__slist_last_val(ares__slist_t *list) +{ + return ares__slist_node_val(ares__slist_node_last(list)); +} + +void ares__slist_node_destroy(ares__slist_node_t *node) +{ + ares__slist_destructor_t destruct; + void *val; + + if (node == NULL) { + return; + } + + destruct = node->parent->destruct; + val = ares__slist_node_claim(node); + + if (val != NULL && destruct != NULL) { + destruct(val); + } +} + +void ares__slist_destroy(ares__slist_t *list) +{ + ares__slist_node_t *node; + + if (list == NULL) { + return; + } + + while ((node = ares__slist_node_first(list)) != NULL) { + ares__slist_node_destroy(node); + } + + ares_free(list->head); + ares_free(list); +} diff --git a/lib/c-ares-1.23.0/src/lib/ares__slist.h b/lib/c-ares-1.23.0/src/lib/ares__slist.h new file mode 100644 index 00000000000..04cd50806eb --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares__slist.h @@ -0,0 +1,206 @@ +/* MIT License + * + * Copyright (c) 2023 Brad House + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ +#ifndef __ARES__SLIST_H +#define __ARES__SLIST_H + + +/*! \addtogroup ares__slist SkipList Data Structure + * + * This data structure is known as a Skip List, which in essence is a sorted + * linked list with multiple levels of linkage to gain some algorithmic + * advantages. The usage symantecs are almost identical to what you'd expect + * with a linked list. + * + * Average time complexity: + * - Insert: O(log n) + * - Search: O(log n) + * - Delete: O(1) -- delete assumes you hold a node pointer + * + * It should be noted, however, that "effort" involved with an insert or + * remove operation is higher than a normal linked list. For very small + * lists this may be less efficient, but for any list with a moderate number + * of entries this will prove much more efficient. + * + * This data structure is often compared with a Binary Search Tree in + * functionality and usage. + * + * @{ + */ +struct ares__slist; + +/*! SkipList Object, opaque */ +typedef struct ares__slist ares__slist_t; + +struct ares__slist_node; + +/*! SkipList Node Object, opaque */ +typedef struct ares__slist_node ares__slist_node_t; + +/*! SkipList Node Value destructor callback + * + * \param[in] data User-defined data to destroy + */ +typedef void (*ares__slist_destructor_t)(void *data); + +/*! SkipList comparison function + * + * \param[in] data1 First user-defined data object + * \param[in] data2 Second user-defined data object + * \return < 0 if data1 < data1, > 0 if data1 > data2, 0 if data1 == data2 + */ +typedef int (*ares__slist_cmp_t)(const void *data1, const void *data2); + +/*! Create SkipList + * + * \param[in] rand_state Initialized ares random state. + * \param[in] cmp SkipList comparison function + * \param[in] destruct SkipList Node Value Destructor. Optional, use NULL. + * \return Initialized SkipList Object or NULL on misuse or ENOMEM + */ +ares__slist_t *ares__slist_create(ares_rand_state *rand_state, + ares__slist_cmp_t cmp, + ares__slist_destructor_t destruct); + +/*! Replace SkipList Node Value Destructor + * + * \param[in] list Initialized SkipList Object + * \param[in] destruct Replacement destructor. May be NULL. + */ +void ares__slist_replace_destructor(ares__slist_t *list, + ares__slist_destructor_t destruct); + +/*! Insert Value into SkipList + * + * \param[in] list Initialized SkipList Object + * \param[in] val Node Value. Must not be NULL. Function takes ownership + * and will have destructor called. + * \return SkipList Node Object or NULL on misuse or ENOMEM + */ +ares__slist_node_t *ares__slist_insert(ares__slist_t *list, void *val); + +/*! Fetch first node in SkipList + * + * \param[in] list Initialized SkipList Object + * \return SkipList Node Object or NULL if none + */ +ares__slist_node_t *ares__slist_node_first(ares__slist_t *list); + +/*! Fetch last node in SkipList + * + * \param[in] list Initialized SkipList Object + * \return SkipList Node Object or NULL if none + */ +ares__slist_node_t *ares__slist_node_last(ares__slist_t *list); + +/*! Fetch next node in SkipList + * + * \param[in] node SkipList Node Object + * \return SkipList Node Object or NULL if none + */ +ares__slist_node_t *ares__slist_node_next(ares__slist_node_t *node); + +/*! Fetch previous node in SkipList + * + * \param[in] node SkipList Node Object + * \return SkipList Node Object or NULL if none + */ +ares__slist_node_t *ares__slist_node_prev(ares__slist_node_t *node); + +/*! Fetch SkipList Node Object by Value + * + * \param[in] list Initialized SkipList Object + * \param[in] val Object to use for comparison + * \return SkipList Node Object or NULL if not found + */ +ares__slist_node_t *ares__slist_node_find(ares__slist_t *list, const void *val); + + +/*! Fetch Node Value + * + * \param[in] node SkipList Node Object + * \return user defined node value + */ +void *ares__slist_node_val(ares__slist_node_t *node); + +/*! Fetch number of entries in SkipList Object + * + * \param[in] list Initialized SkipList Object + * \return number of entries + */ +size_t ares__slist_len(const ares__slist_t *list); + +/*! Fetch SkipList Object from SkipList Node + * + * \param[in] node SkipList Node Object + * \return SkipList Object + */ +ares__slist_t *ares__slist_node_parent(ares__slist_node_t *node); + +/*! Fetch first Node Value in SkipList + * + * \param[in] list Initialized SkipList Object + * \return user defined node value or NULL if none + */ +void *ares__slist_first_val(ares__slist_t *list); + +/*! Fetch last Node Value in SkipList + * + * \param[in] list Initialized SkipList Object + * \return user defined node value or NULL if none + */ +void *ares__slist_last_val(ares__slist_t *list); + +/*! Take back ownership of Node Value in SkipList, remove from SkipList. + * + * \param[in] node SkipList Node Object + * \return user defined node value + */ +void *ares__slist_node_claim(ares__slist_node_t *node); + +/*! The internals of the node have changed, thus its position in the sorted + * list is no longer valid. This function will remove it and re-add it to + * the proper position without needing to perform any memory allocations + * and thus cannot fail. + * + * \param[in] node SkipList Node Object + */ +void ares__slist_node_reinsert(ares__slist_node_t *node); + +/*! Remove Node from SkipList, calling destructor for Node Value. + * + * \param[in] node SkipList Node Object + */ +void ares__slist_node_destroy(ares__slist_node_t *node); + +/*! Destroy SkipList Object. If there are any nodes, they will be destroyed. + * + * \param[in] list Initialized SkipList Object + */ +void ares__slist_destroy(ares__slist_t *list); + +/*! @} */ + +#endif /* __ARES__SLIST_H */ diff --git a/lib/c-ares-1.23.0/src/lib/ares__socket.c b/lib/c-ares-1.23.0/src/lib/ares__socket.c new file mode 100644 index 00000000000..67cd9376588 --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares__socket.c @@ -0,0 +1,457 @@ +/* MIT License + * + * Copyright (c) Massachusetts Institute of Technology + * Copyright (c) The c-ares project and its contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ +#include "ares_setup.h" + +#ifdef HAVE_SYS_UIO_H +# include +#endif +#ifdef HAVE_NETINET_IN_H +# include +#endif +#ifdef HAVE_NETINET_TCP_H +# include +#endif +#ifdef HAVE_NETDB_H +# include +#endif +#ifdef HAVE_ARPA_INET_H +# include +#endif + +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_SYS_IOCTL_H +# include +#endif +#ifdef NETWARE +# include +#endif + +#include +#include +#include + +#include "ares.h" +#include "ares_private.h" + +ares_ssize_t ares__socket_recvfrom(ares_channel_t *channel, ares_socket_t s, + void *data, size_t data_len, int flags, + struct sockaddr *from, + ares_socklen_t *from_len) +{ + if (channel->sock_funcs && channel->sock_funcs->arecvfrom) { + return channel->sock_funcs->arecvfrom(s, data, data_len, flags, from, + from_len, channel->sock_func_cb_data); + } + +#ifdef HAVE_RECVFROM + return recvfrom(s, data, data_len, flags, from, from_len); +#else + return sread(s, data, data_len); +#endif +} + +ares_ssize_t ares__socket_recv(ares_channel_t *channel, ares_socket_t s, + void *data, size_t data_len) +{ + if (channel->sock_funcs && channel->sock_funcs->arecvfrom) { + return channel->sock_funcs->arecvfrom(s, data, data_len, 0, 0, 0, + channel->sock_func_cb_data); + } + + return sread(s, data, data_len); +} + +/* + * setsocknonblock sets the given socket to either blocking or non-blocking + * mode based on the 'nonblock' boolean argument. This function is highly + * portable. + */ +static int setsocknonblock(ares_socket_t sockfd, /* operate on this */ + int nonblock /* TRUE or FALSE */) +{ +#if defined(USE_BLOCKING_SOCKETS) + + return 0; /* returns success */ + +#elif defined(HAVE_FCNTL_O_NONBLOCK) + + /* most recent unix versions */ + int flags; + flags = fcntl(sockfd, F_GETFL, 0); + if (FALSE != nonblock) { + return fcntl(sockfd, F_SETFL, flags | O_NONBLOCK); + } else { + return fcntl(sockfd, F_SETFL, flags & (~O_NONBLOCK)); /* LCOV_EXCL_LINE */ + } + +#elif defined(HAVE_IOCTL_FIONBIO) + + /* older unix versions */ + int flags = nonblock ? 1 : 0; + return ioctl(sockfd, FIONBIO, &flags); + +#elif defined(HAVE_IOCTLSOCKET_FIONBIO) + +# ifdef WATT32 + char flags = nonblock ? 1 : 0; +# else + /* Windows */ + unsigned long flags = nonblock ? 1UL : 0UL; +# endif + return ioctlsocket(sockfd, FIONBIO, &flags); + +#elif defined(HAVE_IOCTLSOCKET_CAMEL_FIONBIO) + + /* Amiga */ + long flags = nonblock ? 1L : 0L; + return IoctlSocket(sockfd, FIONBIO, flags); + +#elif defined(HAVE_SETSOCKOPT_SO_NONBLOCK) + + /* BeOS */ + long b = nonblock ? 1L : 0L; + return setsockopt(sockfd, SOL_SOCKET, SO_NONBLOCK, &b, sizeof(b)); + +#else +# error "no non-blocking method was found/used/set" +#endif +} + +#if defined(IPV6_V6ONLY) && defined(WIN32) +/* It makes support for IPv4-mapped IPv6 addresses. + * Linux kernel, NetBSD, FreeBSD and Darwin: default is off; + * Windows Vista and later: default is on; + * DragonFly BSD: acts like off, and dummy setting; + * OpenBSD and earlier Windows: unsupported. + * Linux: controlled by /proc/sys/net/ipv6/bindv6only. + */ +static void set_ipv6_v6only(ares_socket_t sockfd, int on) +{ + (void)setsockopt(sockfd, IPPROTO_IPV6, IPV6_V6ONLY, (void *)&on, sizeof(on)); +} +#else +# define set_ipv6_v6only(s, v) +#endif + +static int configure_socket(ares_socket_t s, int family, + ares_channel_t *channel) +{ + union { + struct sockaddr sa; + struct sockaddr_in sa4; + struct sockaddr_in6 sa6; + } local; + + /* do not set options for user-managed sockets */ + if (channel->sock_funcs && channel->sock_funcs->asocket) { + return 0; + } + + (void)setsocknonblock(s, TRUE); + +#if defined(FD_CLOEXEC) && !defined(MSDOS) + /* Configure the socket fd as close-on-exec. */ + if (fcntl(s, F_SETFD, FD_CLOEXEC) == -1) { + return -1; /* LCOV_EXCL_LINE */ + } +#endif + + /* Set the socket's send and receive buffer sizes. */ + if ((channel->socket_send_buffer_size > 0) && + setsockopt(s, SOL_SOCKET, SO_SNDBUF, + (void *)&channel->socket_send_buffer_size, + sizeof(channel->socket_send_buffer_size)) == -1) { + return -1; + } + + if ((channel->socket_receive_buffer_size > 0) && + setsockopt(s, SOL_SOCKET, SO_RCVBUF, + (void *)&channel->socket_receive_buffer_size, + sizeof(channel->socket_receive_buffer_size)) == -1) { + return -1; + } + +#ifdef SO_BINDTODEVICE + if (channel->local_dev_name[0] && + setsockopt(s, SOL_SOCKET, SO_BINDTODEVICE, channel->local_dev_name, + sizeof(channel->local_dev_name))) { + /* Only root can do this, and usually not fatal if it doesn't work, so */ + /* just continue on. */ + } +#endif + + if (family == AF_INET) { + if (channel->local_ip4) { + memset(&local.sa4, 0, sizeof(local.sa4)); + local.sa4.sin_family = AF_INET; + local.sa4.sin_addr.s_addr = htonl(channel->local_ip4); + if (bind(s, &local.sa, sizeof(local.sa4)) < 0) { + return -1; + } + } + } else if (family == AF_INET6) { + if (memcmp(channel->local_ip6, ares_in6addr_any._S6_un._S6_u8, + sizeof(channel->local_ip6)) != 0) { + memset(&local.sa6, 0, sizeof(local.sa6)); + local.sa6.sin6_family = AF_INET6; + memcpy(&local.sa6.sin6_addr, channel->local_ip6, + sizeof(channel->local_ip6)); + if (bind(s, &local.sa, sizeof(local.sa6)) < 0) { + return -1; + } + } + set_ipv6_v6only(s, 0); + } + + return 0; +} + +ares_status_t ares__open_connection(ares_channel_t *channel, + struct server_state *server, + ares_bool_t is_tcp) +{ + ares_socket_t s; + int opt; + ares_socklen_t salen; + + union { + struct sockaddr_in sa4; + struct sockaddr_in6 sa6; + } saddr; + struct sockaddr *sa; + struct server_connection *conn; + ares__llist_node_t *node; + int type = is_tcp ? SOCK_STREAM : SOCK_DGRAM; + + switch (server->addr.family) { + case AF_INET: + sa = (void *)&saddr.sa4; + salen = sizeof(saddr.sa4); + memset(sa, 0, (size_t)salen); + saddr.sa4.sin_family = AF_INET; + saddr.sa4.sin_port = htons(is_tcp ? server->tcp_port : server->udp_port); + memcpy(&saddr.sa4.sin_addr, &server->addr.addr.addr4, + sizeof(saddr.sa4.sin_addr)); + break; + case AF_INET6: + sa = (void *)&saddr.sa6; + salen = sizeof(saddr.sa6); + memset(sa, 0, (size_t)salen); + saddr.sa6.sin6_family = AF_INET6; + saddr.sa6.sin6_port = htons(is_tcp ? server->tcp_port : server->udp_port); + memcpy(&saddr.sa6.sin6_addr, &server->addr.addr.addr6, + sizeof(saddr.sa6.sin6_addr)); + break; + default: + return ARES_EBADFAMILY; /* LCOV_EXCL_LINE */ + } + + /* Acquire a socket. */ + s = ares__open_socket(channel, server->addr.family, type, 0); + if (s == ARES_SOCKET_BAD) { + return ARES_ECONNREFUSED; + } + + /* Configure it. */ + if (configure_socket(s, server->addr.family, channel) < 0) { + ares__close_socket(channel, s); + return ARES_ECONNREFUSED; + } + +#ifdef TCP_NODELAY + if (is_tcp) { + /* + * Disable the Nagle algorithm (only relevant for TCP sockets, and thus not + * in configure_socket). In general, in DNS lookups we're pretty much + * interested in firing off a single request and then waiting for a reply, + * so batching isn't very interesting. + */ + opt = 1; + if ((!channel->sock_funcs || !channel->sock_funcs->asocket) && + setsockopt(s, IPPROTO_TCP, TCP_NODELAY, (void *)&opt, sizeof(opt)) == + -1) { + ares__close_socket(channel, s); + return ARES_ECONNREFUSED; + } + } +#endif + + if (channel->sock_config_cb) { + int err = channel->sock_config_cb(s, type, channel->sock_config_cb_data); + if (err < 0) { + ares__close_socket(channel, s); + return ARES_ECONNREFUSED; + } + } + + /* Connect to the server. */ + if (ares__connect_socket(channel, s, sa, salen) == -1) { + int err = SOCKERRNO; + + if (err != EINPROGRESS && err != EWOULDBLOCK) { + ares__close_socket(channel, s); + return ARES_ECONNREFUSED; + } + } + + if (channel->sock_create_cb) { + int err = channel->sock_create_cb(s, type, channel->sock_create_cb_data); + if (err < 0) { + ares__close_socket(channel, s); + return ARES_ECONNREFUSED; + } + } + + conn = ares_malloc(sizeof(*conn)); + if (conn == NULL) { + ares__close_socket(channel, s); + return ARES_ENOMEM; + } + memset(conn, 0, sizeof(*conn)); + conn->fd = s; + conn->server = server; + conn->queries_to_conn = ares__llist_create(NULL); + conn->is_tcp = is_tcp; + if (conn->queries_to_conn == NULL) { + ares__close_socket(channel, s); + ares_free(conn); + return ARES_ENOMEM; + } + + /* TCP connections are thrown to the end as we don't spawn multiple TCP + * connections. UDP connections are put on front where the newest connection + * can be quickly pulled */ + if (is_tcp) { + node = ares__llist_insert_last(server->connections, conn); + } else { + node = ares__llist_insert_first(server->connections, conn); + } + if (node == NULL) { + ares__close_socket(channel, s); + ares__llist_destroy(conn->queries_to_conn); + ares_free(conn); + return ARES_ENOMEM; + } + + /* Register globally to quickly map event on file descriptor to connection + * node object */ + if (!ares__htable_asvp_insert(channel->connnode_by_socket, s, node)) { + ares__close_socket(channel, s); + ares__llist_destroy(conn->queries_to_conn); + ares__llist_node_claim(node); + ares_free(conn); + return ARES_ENOMEM; + } + + SOCK_STATE_CALLBACK(channel, s, 1, 0); + + if (is_tcp) { + server->tcp_conn = conn; + } + + return ARES_SUCCESS; +} + +ares_socket_t ares__open_socket(ares_channel_t *channel, int af, int type, + int protocol) +{ + if (channel->sock_funcs && channel->sock_funcs->asocket) { + return channel->sock_funcs->asocket(af, type, protocol, + channel->sock_func_cb_data); + } + + return socket(af, type, protocol); +} + +int ares__connect_socket(ares_channel_t *channel, ares_socket_t sockfd, + const struct sockaddr *addr, ares_socklen_t addrlen) +{ + if (channel->sock_funcs && channel->sock_funcs->aconnect) { + return channel->sock_funcs->aconnect(sockfd, addr, addrlen, + channel->sock_func_cb_data); + } + + return connect(sockfd, addr, addrlen); +} + +void ares__close_socket(ares_channel_t *channel, ares_socket_t s) +{ + if (s == ARES_SOCKET_BAD) { + return; + } + + if (channel->sock_funcs && channel->sock_funcs->aclose) { + channel->sock_funcs->aclose(s, channel->sock_func_cb_data); + } else { + sclose(s); + } +} + +#ifndef HAVE_WRITEV +/* Structure for scatter/gather I/O. */ +struct iovec { + void *iov_base; /* Pointer to data. */ + size_t iov_len; /* Length of data. */ +}; +#endif + +ares_ssize_t ares__socket_write(ares_channel_t *channel, ares_socket_t s, + const void *data, size_t len) +{ + if (channel->sock_funcs && channel->sock_funcs->asendv) { + struct iovec vec; + vec.iov_base = (void *)((size_t)data); /* Cast off const */ + vec.iov_len = len; + return channel->sock_funcs->asendv(s, &vec, 1, channel->sock_func_cb_data); + } + return swrite(s, data, len); +} + +void ares_set_socket_callback(ares_channel_t *channel, + ares_sock_create_callback cb, void *data) +{ + channel->sock_create_cb = cb; + channel->sock_create_cb_data = data; +} + +void ares_set_socket_configure_callback(ares_channel_t *channel, + ares_sock_config_callback cb, + void *data) +{ + channel->sock_config_cb = cb; + channel->sock_config_cb_data = data; +} + +void ares_set_socket_functions(ares_channel_t *channel, + const struct ares_socket_functions *funcs, + void *data) +{ + channel->sock_funcs = funcs; + channel->sock_func_cb_data = data; +} diff --git a/lib/c-ares-1.23.0/src/lib/ares__sortaddrinfo.c b/lib/c-ares-1.23.0/src/lib/ares__sortaddrinfo.c new file mode 100644 index 00000000000..155cc8caf44 --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares__sortaddrinfo.c @@ -0,0 +1,452 @@ +/* + * Original file name getaddrinfo.c + * Lifted from the 'Android Bionic' project with the BSD license. + */ + +/* + * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. + * Copyright (C) 2018 The Android Open Source Project + * Copyright (C) 2019 Andrew Selivanov + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the project nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "ares_setup.h" + +#ifdef HAVE_NETINET_IN_H +# include +#endif +#ifdef HAVE_NETDB_H +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif + +#include +#include + +#include "ares.h" +#include "ares_private.h" + +struct addrinfo_sort_elem { + struct ares_addrinfo_node *ai; + ares_bool_t has_src_addr; + ares_sockaddr src_addr; + size_t original_order; +}; + +#define ARES_IPV6_ADDR_MC_SCOPE(a) ((a)->s6_addr[1] & 0x0f) + +#define ARES_IPV6_ADDR_SCOPE_NODELOCAL 0x01 +#define ARES_IPV6_ADDR_SCOPE_INTFACELOCAL 0x01 +#define ARES_IPV6_ADDR_SCOPE_LINKLOCAL 0x02 +#define ARES_IPV6_ADDR_SCOPE_SITELOCAL 0x05 +#define ARES_IPV6_ADDR_SCOPE_ORGLOCAL 0x08 +#define ARES_IPV6_ADDR_SCOPE_GLOBAL 0x0e + +#define ARES_IN_LOOPBACK(a) \ + ((((long unsigned int)(a)) & 0xff000000) == 0x7f000000) + +/* RFC 4193. */ +#define ARES_IN6_IS_ADDR_ULA(a) (((a)->s6_addr[0] & 0xfe) == 0xfc) + +/* These macros are modelled after the ones in . */ +/* RFC 4380, section 2.6 */ +#define ARES_IN6_IS_ADDR_TEREDO(a) \ + ((*(const unsigned int *)(const void *)(&(a)->s6_addr[0]) == \ + ntohl(0x20010000))) +/* RFC 3056, section 2. */ +#define ARES_IN6_IS_ADDR_6TO4(a) \ + (((a)->s6_addr[0] == 0x20) && ((a)->s6_addr[1] == 0x02)) +/* 6bone testing address area (3ffe::/16), deprecated in RFC 3701. */ +#define ARES_IN6_IS_ADDR_6BONE(a) \ + (((a)->s6_addr[0] == 0x3f) && ((a)->s6_addr[1] == 0xfe)) + +static int get_scope(const struct sockaddr *addr) +{ + if (addr->sa_family == AF_INET6) { + const struct sockaddr_in6 *addr6 = + CARES_INADDR_CAST(const struct sockaddr_in6 *, addr); + if (IN6_IS_ADDR_MULTICAST(&addr6->sin6_addr)) { + return ARES_IPV6_ADDR_MC_SCOPE(&addr6->sin6_addr); + } else if (IN6_IS_ADDR_LOOPBACK(&addr6->sin6_addr) || + IN6_IS_ADDR_LINKLOCAL(&addr6->sin6_addr)) { + /* + * RFC 4291 section 2.5.3 says loopback is to be treated as having + * link-local scope. + */ + return ARES_IPV6_ADDR_SCOPE_LINKLOCAL; + } else if (IN6_IS_ADDR_SITELOCAL(&addr6->sin6_addr)) { + return ARES_IPV6_ADDR_SCOPE_SITELOCAL; + } else { + return ARES_IPV6_ADDR_SCOPE_GLOBAL; + } + } else if (addr->sa_family == AF_INET) { + const struct sockaddr_in *addr4 = + CARES_INADDR_CAST(const struct sockaddr_in *, addr); + unsigned long int na = ntohl(addr4->sin_addr.s_addr); + if (ARES_IN_LOOPBACK(na) || /* 127.0.0.0/8 */ + (na & 0xffff0000) == 0xa9fe0000) /* 169.254.0.0/16 */ + { + return ARES_IPV6_ADDR_SCOPE_LINKLOCAL; + } else { + /* + * RFC 6724 section 3.2. Other IPv4 addresses, including private + * addresses and shared addresses (100.64.0.0/10), are assigned global + * scope. + */ + return ARES_IPV6_ADDR_SCOPE_GLOBAL; + } + } else { + /* + * This should never happen. + * Return a scope with low priority as a last resort. + */ + return ARES_IPV6_ADDR_SCOPE_NODELOCAL; + } +} + +static int get_label(const struct sockaddr *addr) +{ + if (addr->sa_family == AF_INET) { + return 4; + } else if (addr->sa_family == AF_INET6) { + const struct sockaddr_in6 *addr6 = + CARES_INADDR_CAST(const struct sockaddr_in6 *, addr); + if (IN6_IS_ADDR_LOOPBACK(&addr6->sin6_addr)) { + return 0; + } else if (IN6_IS_ADDR_V4MAPPED(&addr6->sin6_addr)) { + return 4; + } else if (ARES_IN6_IS_ADDR_6TO4(&addr6->sin6_addr)) { + return 2; + } else if (ARES_IN6_IS_ADDR_TEREDO(&addr6->sin6_addr)) { + return 5; + } else if (ARES_IN6_IS_ADDR_ULA(&addr6->sin6_addr)) { + return 13; + } else if (IN6_IS_ADDR_V4COMPAT(&addr6->sin6_addr)) { + return 3; + } else if (IN6_IS_ADDR_SITELOCAL(&addr6->sin6_addr)) { + return 11; + } else if (ARES_IN6_IS_ADDR_6BONE(&addr6->sin6_addr)) { + return 12; + } else { + /* All other IPv6 addresses, including global unicast addresses. */ + return 1; + } + } else { + /* + * This should never happen. + * Return a semi-random label as a last resort. + */ + return 1; + } +} + +/* + * Get the precedence for a given IPv4/IPv6 address. + * RFC 6724, section 2.1. + */ +static int get_precedence(const struct sockaddr *addr) +{ + if (addr->sa_family == AF_INET) { + return 35; + } else if (addr->sa_family == AF_INET6) { + const struct sockaddr_in6 *addr6 = + CARES_INADDR_CAST(const struct sockaddr_in6 *, addr); + if (IN6_IS_ADDR_LOOPBACK(&addr6->sin6_addr)) { + return 50; + } else if (IN6_IS_ADDR_V4MAPPED(&addr6->sin6_addr)) { + return 35; + } else if (ARES_IN6_IS_ADDR_6TO4(&addr6->sin6_addr)) { + return 30; + } else if (ARES_IN6_IS_ADDR_TEREDO(&addr6->sin6_addr)) { + return 5; + } else if (ARES_IN6_IS_ADDR_ULA(&addr6->sin6_addr)) { + return 3; + } else if (IN6_IS_ADDR_V4COMPAT(&addr6->sin6_addr) || + IN6_IS_ADDR_SITELOCAL(&addr6->sin6_addr) || + ARES_IN6_IS_ADDR_6BONE(&addr6->sin6_addr)) { + return 1; + } else { + /* All other IPv6 addresses, including global unicast addresses. */ + return 40; + } + } else { + return 1; + } +} + +/* + * Find number of matching initial bits between the two addresses a1 and a2. + */ +static size_t common_prefix_len(const struct in6_addr *a1, + const struct in6_addr *a2) +{ + const unsigned char *p1 = (const unsigned char *)a1; + const unsigned char *p2 = (const unsigned char *)a2; + size_t i; + for (i = 0; i < sizeof(*a1); ++i) { + unsigned char x; + size_t j; + if (p1[i] == p2[i]) { + continue; + } + x = p1[i] ^ p2[i]; + for (j = 0; j < CHAR_BIT; ++j) { + if (x & (1 << (CHAR_BIT - 1))) { + return i * CHAR_BIT + j; + } + x <<= 1; + } + } + return sizeof(*a1) * CHAR_BIT; +} + +/* + * Compare two source/destination address pairs. + * RFC 6724, section 6. + */ +static int rfc6724_compare(const void *ptr1, const void *ptr2) +{ + const struct addrinfo_sort_elem *a1 = (const struct addrinfo_sort_elem *)ptr1; + const struct addrinfo_sort_elem *a2 = (const struct addrinfo_sort_elem *)ptr2; + int scope_src1; + int scope_dst1; + int scope_match1; + int scope_src2; + int scope_dst2; + int scope_match2; + int label_src1; + int label_dst1; + int label_match1; + int label_src2; + int label_dst2; + int label_match2; + int precedence1; + int precedence2; + size_t prefixlen1; + size_t prefixlen2; + + /* Rule 1: Avoid unusable destinations. */ + if (a1->has_src_addr != a2->has_src_addr) { + return ((int)a2->has_src_addr) - ((int)a1->has_src_addr); + } + + /* Rule 2: Prefer matching scope. */ + scope_src1 = ARES_IPV6_ADDR_SCOPE_NODELOCAL; + if (a1->has_src_addr) { + scope_src1 = get_scope(&a1->src_addr.sa); + } + scope_dst1 = get_scope(a1->ai->ai_addr); + scope_match1 = (scope_src1 == scope_dst1); + + scope_src2 = ARES_IPV6_ADDR_SCOPE_NODELOCAL; + if (a2->has_src_addr) { + scope_src2 = get_scope(&a2->src_addr.sa); + } + scope_dst2 = get_scope(a2->ai->ai_addr); + scope_match2 = (scope_src2 == scope_dst2); + + if (scope_match1 != scope_match2) { + return scope_match2 - scope_match1; + } + + /* Rule 3: Avoid deprecated addresses. */ + + /* Rule 4: Prefer home addresses. */ + + /* Rule 5: Prefer matching label. */ + label_src1 = 1; + if (a1->has_src_addr) { + label_src1 = get_label(&a1->src_addr.sa); + } + label_dst1 = get_label(a1->ai->ai_addr); + label_match1 = (label_src1 == label_dst1); + + label_src2 = 1; + if (a2->has_src_addr) { + label_src2 = get_label(&a2->src_addr.sa); + } + label_dst2 = get_label(a2->ai->ai_addr); + label_match2 = (label_src2 == label_dst2); + + if (label_match1 != label_match2) { + return label_match2 - label_match1; + } + + /* Rule 6: Prefer higher precedence. */ + precedence1 = get_precedence(a1->ai->ai_addr); + precedence2 = get_precedence(a2->ai->ai_addr); + if (precedence1 != precedence2) { + return precedence2 - precedence1; + } + + /* Rule 7: Prefer native transport. */ + + /* Rule 8: Prefer smaller scope. */ + if (scope_dst1 != scope_dst2) { + return scope_dst1 - scope_dst2; + } + + /* Rule 9: Use longest matching prefix. */ + if (a1->has_src_addr && a1->ai->ai_addr->sa_family == AF_INET6 && + a2->has_src_addr && a2->ai->ai_addr->sa_family == AF_INET6) { + const struct sockaddr_in6 *a1_src = &a1->src_addr.sa6; + const struct sockaddr_in6 *a1_dst = + CARES_INADDR_CAST(const struct sockaddr_in6 *, a1->ai->ai_addr); + const struct sockaddr_in6 *a2_src = &a2->src_addr.sa6; + const struct sockaddr_in6 *a2_dst = + CARES_INADDR_CAST(const struct sockaddr_in6 *, a2->ai->ai_addr); + prefixlen1 = common_prefix_len(&a1_src->sin6_addr, &a1_dst->sin6_addr); + prefixlen2 = common_prefix_len(&a2_src->sin6_addr, &a2_dst->sin6_addr); + if (prefixlen1 != prefixlen2) { + return (int)prefixlen2 - (int)prefixlen1; + } + } + + /* + * Rule 10: Leave the order unchanged. + * We need this since qsort() is not necessarily stable. + */ + return ((int)a1->original_order) - ((int)a2->original_order); +} + +/* + * Find the source address that will be used if trying to connect to the given + * address. + * + * Returns 1 if a source address was found, 0 if the address is unreachable + * and -1 if a fatal error occurred. If 0 or 1, the contents of src_addr are + * undefined. + */ +static int find_src_addr(ares_channel_t *channel, const struct sockaddr *addr, + struct sockaddr *src_addr) +{ + ares_socket_t sock; + int ret; + ares_socklen_t len; + + switch (addr->sa_family) { + case AF_INET: + len = sizeof(struct sockaddr_in); + break; + case AF_INET6: + len = sizeof(struct sockaddr_in6); + break; + default: + /* No known usable source address for non-INET families. */ + return 0; + } + + sock = ares__open_socket(channel, addr->sa_family, SOCK_DGRAM, IPPROTO_UDP); + if (sock == ARES_SOCKET_BAD) { + if (errno == EAFNOSUPPORT) { + return 0; + } else { + return -1; + } + } + + do { + ret = ares__connect_socket(channel, sock, addr, len); + } while (ret == -1 && errno == EINTR); + + if (ret == -1) { + ares__close_socket(channel, sock); + return 0; + } + + if (getsockname(sock, src_addr, &len) != 0) { + ares__close_socket(channel, sock); + return -1; + } + ares__close_socket(channel, sock); + return 1; +} + +/* + * Sort the linked list starting at sentinel->ai_next in RFC6724 order. + * Will leave the list unchanged if an error occurs. + */ +ares_status_t ares__sortaddrinfo(ares_channel_t *channel, + struct ares_addrinfo_node *list_sentinel) +{ + struct ares_addrinfo_node *cur; + size_t nelem = 0; + size_t i; + int has_src_addr; + struct addrinfo_sort_elem *elems; + + cur = list_sentinel->ai_next; + while (cur) { + ++nelem; + cur = cur->ai_next; + } + + if (!nelem) { + return ARES_ENODATA; + } + + elems = (struct addrinfo_sort_elem *)ares_malloc( + nelem * sizeof(struct addrinfo_sort_elem)); + if (!elems) { + return ARES_ENOMEM; + } + + /* + * Convert the linked list to an array that also contains the candidate + * source address for each destination address. + */ + for (i = 0, cur = list_sentinel->ai_next; i < nelem; + ++i, cur = cur->ai_next) { + assert(cur != NULL); + elems[i].ai = cur; + elems[i].original_order = i; + has_src_addr = find_src_addr(channel, cur->ai_addr, &elems[i].src_addr.sa); + if (has_src_addr == -1) { + ares_free(elems); + return ARES_ENOTFOUND; + } + elems[i].has_src_addr = (has_src_addr == 1) ? ARES_TRUE : ARES_FALSE; + } + + /* Sort the addresses, and rearrange the linked list so it matches the sorted + * order. */ + qsort((void *)elems, nelem, sizeof(struct addrinfo_sort_elem), + rfc6724_compare); + + list_sentinel->ai_next = elems[0].ai; + for (i = 0; i < nelem - 1; ++i) { + elems[i].ai->ai_next = elems[i + 1].ai; + } + elems[nelem - 1].ai->ai_next = NULL; + + ares_free(elems); + return ARES_SUCCESS; +} diff --git a/lib/c-ares-1.23.0/src/lib/ares__threads.c b/lib/c-ares-1.23.0/src/lib/ares__threads.c new file mode 100644 index 00000000000..fe924785787 --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares__threads.c @@ -0,0 +1,193 @@ +/* MIT License + * + * Copyright (c) 2023 Brad House + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ +#include "ares_setup.h" +#include "ares.h" +#include "ares_private.h" + +#ifdef CARES_THREADS +# ifdef _WIN32 + +struct ares__thread_mutex { + CRITICAL_SECTION mutex; +}; + +static ares__thread_mutex_t *ares__thread_mutex_create(void) +{ + ares__thread_mutex_t *mut = ares_malloc_zero(sizeof(*mut)); + if (mut == NULL) { + return NULL; + } + + InitializeCriticalSection(&mut->mutex); + return mut; +} + +static void ares__thread_mutex_destroy(ares__thread_mutex_t *mut) +{ + if (mut == NULL) { + return; + } + DeleteCriticalSection(&mut->mutex); + ares_free(mut); +} + +static void ares__thread_mutex_lock(ares__thread_mutex_t *mut) +{ + if (mut == NULL) { + return; + } + EnterCriticalSection(&mut->mutex); +} + +static void ares__thread_mutex_unlock(ares__thread_mutex_t *mut) +{ + if (mut == NULL) { + return; + } + LeaveCriticalSection(&mut->mutex); +} + +# else +# include + +struct ares__thread_mutex { + pthread_mutex_t mutex; +}; + +static ares__thread_mutex_t *ares__thread_mutex_create(void) +{ + pthread_mutexattr_t attr; + ares__thread_mutex_t *mut = ares_malloc_zero(sizeof(*mut)); + if (mut == NULL) { + return NULL; + } + + if (pthread_mutexattr_init(&attr) != 0) { + ares_free(mut); + return NULL; + } + + if (pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE) != 0) { + goto fail; + } + + if (pthread_mutex_init(&mut->mutex, &attr) != 0) { + goto fail; + } + + pthread_mutexattr_destroy(&attr); + return mut; + +fail: + pthread_mutexattr_destroy(&attr); + ares_free(mut); + return NULL; +} + +static void ares__thread_mutex_destroy(ares__thread_mutex_t *mut) +{ + if (mut == NULL) { + return; + } + pthread_mutex_destroy(&mut->mutex); + ares_free(mut); +} + +static void ares__thread_mutex_lock(ares__thread_mutex_t *mut) +{ + if (mut == NULL) { + return; + } + pthread_mutex_lock(&mut->mutex); +} + +static void ares__thread_mutex_unlock(ares__thread_mutex_t *mut) +{ + if (mut == NULL) { + return; + } + pthread_mutex_unlock(&mut->mutex); +} +# endif + +ares_status_t ares__channel_threading_init(ares_channel_t *channel) +{ + channel->lock = ares__thread_mutex_create(); + if (channel->lock == NULL) { + return ARES_ENOMEM; + } + return ARES_SUCCESS; +} + +void ares__channel_threading_destroy(ares_channel_t *channel) +{ + ares__thread_mutex_destroy(channel->lock); + channel->lock = NULL; +} + +void ares__channel_lock(ares_channel_t *channel) +{ + ares__thread_mutex_lock(channel->lock); +} + +void ares__channel_unlock(ares_channel_t *channel) +{ + ares__thread_mutex_unlock(channel->lock); +} + +ares_bool_t ares_threadsafety(void) +{ + return ARES_TRUE; +} + +#else +/* NoOp */ +ares_status_t ares__channel_threading_init(ares_channel_t *channel) +{ + (void)channel; + return ARES_SUCCESS; +} + +void ares__channel_threading_destroy(ares_channel_t *channel) +{ + (void)channel; +} + +void ares__channel_lock(ares_channel_t *channel) +{ + (void)channel; +} + +void ares__channel_unlock(ares_channel_t *channel) +{ + (void)channel; +} + +ares_bool_t ares_threadsafety(void) +{ + return ARES_FALSE; +} +#endif diff --git a/lib/c-ares-1.23.0/src/lib/ares__timeval.c b/lib/c-ares-1.23.0/src/lib/ares__timeval.c new file mode 100644 index 00000000000..11996f9f11e --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares__timeval.c @@ -0,0 +1,108 @@ +/* MIT License + * + * Copyright (c) 2008 Daniel Stenberg + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ + +#include "ares_setup.h" +#include "ares.h" +#include "ares_private.h" + +#if defined(WIN32) && !defined(MSDOS) + +struct timeval ares__tvnow(void) +{ + /* + ** GetTickCount() is available on _all_ Windows versions from W95 up + ** to nowadays. Returns milliseconds elapsed since last system boot, + ** increases monotonically and wraps once 49.7 days have elapsed. + */ + struct timeval now; + DWORD milliseconds = GetTickCount(); + now.tv_sec = (long)milliseconds / 1000; + now.tv_usec = (long)(milliseconds % 1000) * 1000; + return now; +} + +#elif defined(HAVE_CLOCK_GETTIME_MONOTONIC) + +struct timeval ares__tvnow(void) +{ + /* + ** clock_gettime() is granted to be increased monotonically when the + ** monotonic clock is queried. Time starting point is unspecified, it + ** could be the system start-up time, the Epoch, or something else, + ** in any case the time starting point does not change once that the + ** system has started up. + */ + struct timeval now; + struct timespec tsnow; + if (0 == clock_gettime(CLOCK_MONOTONIC, &tsnow)) { + now.tv_sec = tsnow.tv_sec; + now.tv_usec = (int)(tsnow.tv_nsec / 1000); + } + /* + ** Even when the configure process has truly detected monotonic clock + ** availability, it might happen that it is not actually available at + ** run-time. When this occurs simply fallback to other time source. + */ +# ifdef HAVE_GETTIMEOFDAY + else + (void)gettimeofday(&now, NULL); /* LCOV_EXCL_LINE */ +# else + else { + now.tv_sec = (long)time(NULL); + now.tv_usec = 0; + } +# endif + return now; +} + +#elif defined(HAVE_GETTIMEOFDAY) + +struct timeval ares__tvnow(void) +{ + /* + ** gettimeofday() is not granted to be increased monotonically, due to + ** clock drifting and external source time synchronization it can jump + ** forward or backward in time. + */ + struct timeval now; + (void)gettimeofday(&now, NULL); + return now; +} + +#else + +struct timeval ares__tvnow(void) +{ + /* + ** time() returns the value of time in seconds since the Epoch. + */ + struct timeval now; + now.tv_sec = (long)time(NULL); + now.tv_usec = 0; + return now; +} + +#endif diff --git a/lib/c-ares-1.19.1/src/lib/ares_android.c b/lib/c-ares-1.23.0/src/lib/ares_android.c similarity index 52% rename from lib/c-ares-1.19.1/src/lib/ares_android.c rename to lib/c-ares-1.23.0/src/lib/ares_android.c index 5b00b8065c5..778d4d10607 100644 --- a/lib/c-ares-1.19.1/src/lib/ares_android.c +++ b/lib/c-ares-1.23.0/src/lib/ares_android.c @@ -1,28 +1,39 @@ -/* Copyright (C) 2017 by John Schember +/* MIT License * - * 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. + * Copyright (c) John Schember + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT */ #if defined(ANDROID) || defined(__ANDROID__) -#include +# include -#include "ares_setup.h" -#include "ares.h" -#include "ares_android.h" -#include "ares_private.h" +# include "ares_setup.h" +# include "ares.h" +# include "ares_android.h" +# include "ares_private.h" -static JavaVM *android_jvm = NULL; -static jobject android_connectivity_manager = NULL; +static JavaVM *android_jvm = NULL; +static jobject android_connectivity_manager = NULL; /* ConnectivityManager.getActiveNetwork */ static jmethodID android_cm_active_net_mid = NULL; @@ -39,12 +50,13 @@ static jmethodID android_list_get_mid = NULL; /* InetAddress.getHostAddress */ static jmethodID android_ia_host_addr_mid = NULL; -static jclass jni_get_class(JNIEnv *env, const char *path) +static jclass jni_get_class(JNIEnv *env, const char *path) { jclass cls = NULL; - if (env == NULL || path == NULL || *path == '\0') + if (env == NULL || path == NULL || *path == '\0') { return NULL; + } cls = (*env)->FindClass(env, path); if ((*env)->ExceptionOccurred(env)) { @@ -60,14 +72,12 @@ static jmethodID jni_get_method_id(JNIEnv *env, jclass cls, jmethodID mid = NULL; if (env == NULL || cls == NULL || func_name == NULL || *func_name == '\0' || - signature == NULL || *signature == '\0') - { + signature == NULL || *signature == '\0') { return NULL; } mid = (*env)->GetMethodID(env, cls, func_name, signature); - if ((*env)->ExceptionOccurred(env)) - { + if ((*env)->ExceptionOccurred(env)) { (*env)->ExceptionClear(env); return NULL; } @@ -82,29 +92,31 @@ void ares_library_init_jvm(JavaVM *jvm) int ares_library_init_android(jobject connectivity_manager) { - JNIEnv *env = NULL; - int need_detatch = 0; - int res; - int ret = ARES_ENOTINITIALIZED; - jclass obj_cls = NULL; + JNIEnv *env = NULL; + int need_detatch = 0; + int res; + ares_status_t ret = ARES_ENOTINITIALIZED; + jclass obj_cls = NULL; - if (android_jvm == NULL) + if (android_jvm == NULL) { goto cleanup; + } res = (*android_jvm)->GetEnv(android_jvm, (void **)&env, JNI_VERSION_1_6); - if (res == JNI_EDETACHED) - { - env = NULL; - res = (*android_jvm)->AttachCurrentThread(android_jvm, &env, NULL); + if (res == JNI_EDETACHED) { + env = NULL; + res = (*android_jvm)->AttachCurrentThread(android_jvm, &env, NULL); need_detatch = 1; } - if (res != JNI_OK || env == NULL) + if (res != JNI_OK || env == NULL) { goto cleanup; + } android_connectivity_manager = - (*env)->NewGlobalRef(env, connectivity_manager); - if (android_connectivity_manager == NULL) + (*env)->NewGlobalRef(env, connectivity_manager); + if (android_connectivity_manager == NULL) { goto cleanup; + } /* Initialization has succeeded. Now attempt to cache the methods that will be * called by ares_get_android_server_list. */ @@ -112,166 +124,178 @@ int ares_library_init_android(jobject connectivity_manager) /* ConnectivityManager in API 1. */ obj_cls = jni_get_class(env, "android/net/ConnectivityManager"); - if (obj_cls == NULL) + if (obj_cls == NULL) { goto cleanup; + } /* ConnectivityManager.getActiveNetwork in API 23. */ - android_cm_active_net_mid = - jni_get_method_id(env, obj_cls, "getActiveNetwork", - "()Landroid/net/Network;"); - if (android_cm_active_net_mid == NULL) + android_cm_active_net_mid = jni_get_method_id( + env, obj_cls, "getActiveNetwork", "()Landroid/net/Network;"); + if (android_cm_active_net_mid == NULL) { goto cleanup; + } /* ConnectivityManager.getLinkProperties in API 21. */ android_cm_link_props_mid = - jni_get_method_id(env, obj_cls, "getLinkProperties", - "(Landroid/net/Network;)Landroid/net/LinkProperties;"); - if (android_cm_link_props_mid == NULL) + jni_get_method_id(env, obj_cls, "getLinkProperties", + "(Landroid/net/Network;)Landroid/net/LinkProperties;"); + if (android_cm_link_props_mid == NULL) { goto cleanup; + } /* LinkProperties in API 21. */ (*env)->DeleteLocalRef(env, obj_cls); obj_cls = jni_get_class(env, "android/net/LinkProperties"); - if (obj_cls == NULL) + if (obj_cls == NULL) { goto cleanup; + } /* getDnsServers in API 21. */ - android_lp_dns_servers_mid = jni_get_method_id(env, obj_cls, "getDnsServers", - "()Ljava/util/List;"); - if (android_lp_dns_servers_mid == NULL) + android_lp_dns_servers_mid = + jni_get_method_id(env, obj_cls, "getDnsServers", "()Ljava/util/List;"); + if (android_lp_dns_servers_mid == NULL) { goto cleanup; + } /* getDomains in API 21. */ - android_lp_domains_mid = jni_get_method_id(env, obj_cls, "getDomains", - "()Ljava/lang/String;"); - if (android_lp_domains_mid == NULL) + android_lp_domains_mid = + jni_get_method_id(env, obj_cls, "getDomains", "()Ljava/lang/String;"); + if (android_lp_domains_mid == NULL) { goto cleanup; + } (*env)->DeleteLocalRef(env, obj_cls); obj_cls = jni_get_class(env, "java/util/List"); - if (obj_cls == NULL) + if (obj_cls == NULL) { goto cleanup; + } android_list_size_mid = jni_get_method_id(env, obj_cls, "size", "()I"); - if (android_list_size_mid == NULL) + if (android_list_size_mid == NULL) { goto cleanup; + } - android_list_get_mid = jni_get_method_id(env, obj_cls, "get", - "(I)Ljava/lang/Object;"); - if (android_list_get_mid == NULL) + android_list_get_mid = + jni_get_method_id(env, obj_cls, "get", "(I)Ljava/lang/Object;"); + if (android_list_get_mid == NULL) { goto cleanup; + } (*env)->DeleteLocalRef(env, obj_cls); obj_cls = jni_get_class(env, "java/net/InetAddress"); - if (obj_cls == NULL) + if (obj_cls == NULL) { goto cleanup; + } - android_ia_host_addr_mid = jni_get_method_id(env, obj_cls, "getHostAddress", - "()Ljava/lang/String;"); - if (android_ia_host_addr_mid == NULL) + android_ia_host_addr_mid = + jni_get_method_id(env, obj_cls, "getHostAddress", "()Ljava/lang/String;"); + if (android_ia_host_addr_mid == NULL) { goto cleanup; + } (*env)->DeleteLocalRef(env, obj_cls); goto done; cleanup: - if (obj_cls != NULL) + if (obj_cls != NULL) { (*env)->DeleteLocalRef(env, obj_cls); + } - android_cm_active_net_mid = NULL; - android_cm_link_props_mid = NULL; + android_cm_active_net_mid = NULL; + android_cm_link_props_mid = NULL; android_lp_dns_servers_mid = NULL; - android_lp_domains_mid = NULL; - android_list_size_mid = NULL; - android_list_get_mid = NULL; - android_ia_host_addr_mid = NULL; + android_lp_domains_mid = NULL; + android_list_size_mid = NULL; + android_list_get_mid = NULL; + android_ia_host_addr_mid = NULL; done: - if (need_detatch) + if (need_detatch) { (*android_jvm)->DetachCurrentThread(android_jvm); + } return ret; } int ares_library_android_initialized(void) { - if (android_jvm == NULL || android_connectivity_manager == NULL) + if (android_jvm == NULL || android_connectivity_manager == NULL) { return ARES_ENOTINITIALIZED; + } return ARES_SUCCESS; } void ares_library_cleanup_android(void) { - JNIEnv *env = NULL; - int need_detatch = 0; - int res; + JNIEnv *env = NULL; + int need_detatch = 0; + int res; - if (android_jvm == NULL || android_connectivity_manager == NULL) + if (android_jvm == NULL || android_connectivity_manager == NULL) { return; + } res = (*android_jvm)->GetEnv(android_jvm, (void **)&env, JNI_VERSION_1_6); - if (res == JNI_EDETACHED) - { - env = NULL; - res = (*android_jvm)->AttachCurrentThread(android_jvm, &env, NULL); + if (res == JNI_EDETACHED) { + env = NULL; + res = (*android_jvm)->AttachCurrentThread(android_jvm, &env, NULL); need_detatch = 1; } - if (res != JNI_OK || env == NULL) + if (res != JNI_OK || env == NULL) { return; + } - android_cm_active_net_mid = NULL; - android_cm_link_props_mid = NULL; + android_cm_active_net_mid = NULL; + android_cm_link_props_mid = NULL; android_lp_dns_servers_mid = NULL; - android_lp_domains_mid = NULL; - android_list_size_mid = NULL; - android_list_get_mid = NULL; - android_ia_host_addr_mid = NULL; + android_lp_domains_mid = NULL; + android_list_size_mid = NULL; + android_list_get_mid = NULL; + android_ia_host_addr_mid = NULL; (*env)->DeleteGlobalRef(env, android_connectivity_manager); android_connectivity_manager = NULL; - if (need_detatch) + if (need_detatch) { (*android_jvm)->DetachCurrentThread(android_jvm); + } } -char **ares_get_android_server_list(size_t max_servers, - size_t *num_servers) +char **ares_get_android_server_list(size_t max_servers, size_t *num_servers) { - JNIEnv *env = NULL; - jobject active_network = NULL; - jobject link_properties = NULL; - jobject server_list = NULL; - jobject server = NULL; - jstring str = NULL; - jint nserv; + JNIEnv *env = NULL; + jobject active_network = NULL; + jobject link_properties = NULL; + jobject server_list = NULL; + jobject server = NULL; + jstring str = NULL; + jint nserv; const char *ch_server_address; - int res; - size_t i; - char **dns_list = NULL; - int need_detatch = 0; + int res; + size_t i; + char **dns_list = NULL; + int need_detatch = 0; if (android_jvm == NULL || android_connectivity_manager == NULL || - max_servers == 0 || num_servers == NULL) - { + max_servers == 0 || num_servers == NULL) { return NULL; } if (android_cm_active_net_mid == NULL || android_cm_link_props_mid == NULL || android_lp_dns_servers_mid == NULL || android_list_size_mid == NULL || - android_list_get_mid == NULL || android_ia_host_addr_mid == NULL) - { + android_list_get_mid == NULL || android_ia_host_addr_mid == NULL) { return NULL; } res = (*android_jvm)->GetEnv(android_jvm, (void **)&env, JNI_VERSION_1_6); - if (res == JNI_EDETACHED) - { - env = NULL; - res = (*android_jvm)->AttachCurrentThread(android_jvm, &env, NULL); + if (res == JNI_EDETACHED) { + env = NULL; + res = (*android_jvm)->AttachCurrentThread(android_jvm, &env, NULL); need_detatch = 1; } - if (res != JNI_OK || env == NULL) + if (res != JNI_OK || env == NULL) { goto done; + } /* JNI below is equivalent to this Java code. import android.content.Context; @@ -296,93 +320,100 @@ char **ares_get_android_server_list(size_t max_servers, active_network = (*env)->CallObjectMethod(env, android_connectivity_manager, android_cm_active_net_mid); - if (active_network == NULL) + if (active_network == NULL) { goto done; + } link_properties = - (*env)->CallObjectMethod(env, android_connectivity_manager, - android_cm_link_props_mid, active_network); - if (link_properties == NULL) + (*env)->CallObjectMethod(env, android_connectivity_manager, + android_cm_link_props_mid, active_network); + if (link_properties == NULL) { goto done; + } - server_list = (*env)->CallObjectMethod(env, link_properties, - android_lp_dns_servers_mid); - if (server_list == NULL) + server_list = + (*env)->CallObjectMethod(env, link_properties, android_lp_dns_servers_mid); + if (server_list == NULL) { goto done; + } nserv = (*env)->CallIntMethod(env, server_list, android_list_size_mid); - if (nserv > (jint)max_servers) + if (nserv > (jint)max_servers) { nserv = (jint)max_servers; - if (nserv <= 0) + } + if (nserv <= 0) { goto done; + } *num_servers = (size_t)nserv; - dns_list = ares_malloc(sizeof(*dns_list)*(*num_servers)); - for (i=0; i<*num_servers; i++) - { - server = (*env)->CallObjectMethod(env, server_list, android_list_get_mid, - (jint)i); - dns_list[i] = ares_malloc(64); + dns_list = ares_malloc(sizeof(*dns_list) * (*num_servers)); + for (i = 0; i < *num_servers; i++) { + size_t len = 64; + server = + (*env)->CallObjectMethod(env, server_list, android_list_get_mid, (jint)i); + dns_list[i] = ares_malloc(len); dns_list[i][0] = 0; - if (server == NULL) - { + if (server == NULL) { continue; } str = (*env)->CallObjectMethod(env, server, android_ia_host_addr_mid); ch_server_address = (*env)->GetStringUTFChars(env, str, 0); - strncpy(dns_list[i], ch_server_address, 64); + ares_strcpy(dns_list[i], ch_server_address, len); (*env)->ReleaseStringUTFChars(env, str, ch_server_address); (*env)->DeleteLocalRef(env, str); (*env)->DeleteLocalRef(env, server); } done: - if ((*env)->ExceptionOccurred(env)) + if ((*env)->ExceptionOccurred(env)) { (*env)->ExceptionClear(env); + } - if (server_list != NULL) + if (server_list != NULL) { (*env)->DeleteLocalRef(env, server_list); - if (link_properties != NULL) + } + if (link_properties != NULL) { (*env)->DeleteLocalRef(env, link_properties); - if (active_network != NULL) + } + if (active_network != NULL) { (*env)->DeleteLocalRef(env, active_network); + } - if (need_detatch) + if (need_detatch) { (*android_jvm)->DetachCurrentThread(android_jvm); + } return dns_list; } char *ares_get_android_search_domains_list(void) { - JNIEnv *env = NULL; - jobject active_network = NULL; - jobject link_properties = NULL; - jstring domains = NULL; + JNIEnv *env = NULL; + jobject active_network = NULL; + jobject link_properties = NULL; + jstring domains = NULL; const char *domain; - int res; - char *domain_list = NULL; - int need_detatch = 0; + int res; + char *domain_list = NULL; + int need_detatch = 0; - if (android_jvm == NULL || android_connectivity_manager == NULL) - { + if (android_jvm == NULL || android_connectivity_manager == NULL) { return NULL; } if (android_cm_active_net_mid == NULL || android_cm_link_props_mid == NULL || - android_lp_domains_mid == NULL) - { + android_lp_domains_mid == NULL) { return NULL; } res = (*android_jvm)->GetEnv(android_jvm, (void **)&env, JNI_VERSION_1_6); - if (res == JNI_EDETACHED) - { - env = NULL; - res = (*android_jvm)->AttachCurrentThread(android_jvm, &env, NULL); + if (res == JNI_EDETACHED) { + env = NULL; + res = (*android_jvm)->AttachCurrentThread(android_jvm, &env, NULL); need_detatch = 1; } - if (res != JNI_OK || env == NULL) + if (res != JNI_OK || env == NULL) { goto done; + } /* JNI below is equivalent to this Java code. import android.content.Context; @@ -393,7 +424,7 @@ char *ares_get_android_search_domains_list(void) .getSystemService(Context.CONNECTIVITY_SERVICE); Network an = cm.getActiveNetwork(); LinkProperties lp = cm.getLinkProperties(an); - String domains = lp.getDomains(); + String domains = lp.getDomains(); for (String domain: domains.split(",")) { String d = domain; } @@ -404,38 +435,45 @@ char *ares_get_android_search_domains_list(void) active_network = (*env)->CallObjectMethod(env, android_connectivity_manager, android_cm_active_net_mid); - if (active_network == NULL) + if (active_network == NULL) { goto done; + } link_properties = - (*env)->CallObjectMethod(env, android_connectivity_manager, - android_cm_link_props_mid, active_network); - if (link_properties == NULL) + (*env)->CallObjectMethod(env, android_connectivity_manager, + android_cm_link_props_mid, active_network); + if (link_properties == NULL) { goto done; + } /* Get the domains. It is a common separated list of domains to search. */ - domains = (*env)->CallObjectMethod(env, link_properties, - android_lp_domains_mid); - if (domains == NULL) + domains = + (*env)->CallObjectMethod(env, link_properties, android_lp_domains_mid); + if (domains == NULL) { goto done; + } /* Split on , */ - domain = (*env)->GetStringUTFChars(env, domains, 0); + domain = (*env)->GetStringUTFChars(env, domains, 0); domain_list = ares_strdup(domain); (*env)->ReleaseStringUTFChars(env, domains, domain); (*env)->DeleteLocalRef(env, domains); done: - if ((*env)->ExceptionOccurred(env)) + if ((*env)->ExceptionOccurred(env)) { (*env)->ExceptionClear(env); + } - if (link_properties != NULL) + if (link_properties != NULL) { (*env)->DeleteLocalRef(env, link_properties); - if (active_network != NULL) + } + if (active_network != NULL) { (*env)->DeleteLocalRef(env, active_network); + } - if (need_detatch) + if (need_detatch) { (*android_jvm)->DetachCurrentThread(android_jvm); + } return domain_list; } #else diff --git a/lib/c-ares-1.23.0/src/lib/ares_android.h b/lib/c-ares-1.23.0/src/lib/ares_android.h new file mode 100644 index 00000000000..5caadb4fe4b --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares_android.h @@ -0,0 +1,38 @@ +/* MIT License + * + * Copyright (c) John Schember + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ + +#ifndef __ARES_ANDROID_H__ +#define __ARES_ANDROID_H__ + +#if defined(ANDROID) || defined(__ANDROID__) + +char **ares_get_android_server_list(size_t max_servers, size_t *num_servers); +char *ares_get_android_search_domains_list(void); +void ares_library_cleanup_android(void); + +#endif + +#endif /* __ARES_ANDROID_H__ */ diff --git a/lib/c-ares-1.23.0/src/lib/ares_cancel.c b/lib/c-ares-1.23.0/src/lib/ares_cancel.c new file mode 100644 index 00000000000..9841f9bf64f --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares_cancel.c @@ -0,0 +1,90 @@ +/* MIT License + * + * Copyright (c) 2004 Daniel Stenberg + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ + +#include "ares_setup.h" +#include + +#include "ares.h" +#include "ares_private.h" + +/* + * ares_cancel() cancels all ongoing requests/resolves that might be going on + * on the given channel. It does NOT kill the channel, use ares_destroy() for + * that. + */ +void ares_cancel(ares_channel_t *channel) +{ + if (channel == NULL) { + return; + } + + ares__channel_lock(channel); + + if (ares__llist_len(channel->all_queries) > 0) { + ares__llist_node_t *node = NULL; + ares__llist_node_t *next = NULL; + + /* Swap list heads, so that only those queries which were present on entry + * into this function are cancelled. New queries added by callbacks of + * queries being cancelled will not be cancelled themselves. + */ + ares__llist_t *list_copy = channel->all_queries; + channel->all_queries = ares__llist_create(NULL); + + /* Out of memory, this function doesn't return a result code though so we + * can't report to caller */ + if (channel->all_queries == NULL) { + channel->all_queries = list_copy; + goto done; + } + + node = ares__llist_node_first(list_copy); + while (node != NULL) { + struct query *query; + struct server_connection *conn; + + /* Cache next since this node is being deleted */ + next = ares__llist_node_next(node); + + query = ares__llist_node_claim(node); + conn = query->conn; + query->node_all_queries = NULL; + + /* NOTE: its possible this may enqueue new queries */ + query->callback(query->arg, ARES_ECANCELLED, 0, NULL, 0); + ares__free_query(query); + + /* See if the connection should be cleaned up */ + ares__check_cleanup_conn(channel, conn); + + node = next; + } + + ares__llist_destroy(list_copy); + } +done: + ares__channel_unlock(channel); +} diff --git a/lib/c-ares-1.19.1/src/lib/ares_config.h.cmake b/lib/c-ares-1.23.0/src/lib/ares_config.h.cmake similarity index 94% rename from lib/c-ares-1.19.1/src/lib/ares_config.h.cmake rename to lib/c-ares-1.23.0/src/lib/ares_config.h.cmake index 798820a3a68..84880695c48 100644 --- a/lib/c-ares-1.19.1/src/lib/ares_config.h.cmake +++ b/lib/c-ares-1.23.0/src/lib/ares_config.h.cmake @@ -1,3 +1,7 @@ +/* Copyright (C) The c-ares project and its contributors + * SPDX-License-Identifier: MIT + */ + /* Generated from ares_config.h.cmake */ /* Define if building universal (internal helper macro) */ @@ -13,10 +17,10 @@ #undef CARES_EXPOSE_STATICS /* Defined for build with symbol hiding. */ -#undef CARES_SYMBOL_HIDING +#cmakedefine CARES_SYMBOL_HIDING /* Definition to make a library symbol externally visible. */ -#undef CARES_SYMBOL_SCOPE_EXTERN +#define CARES_SYMBOL_SCOPE_EXTERN @CARES_SYMBOL_SCOPE_EXTERN@ /* Use resolver library to configure cares */ #cmakedefine CARES_USE_LIBRESOLV @@ -123,6 +127,9 @@ /* Define to 1 if you have the getnameinfo function. */ #cmakedefine HAVE_GETNAMEINFO +/* Define to 1 if you have the getrandom function. */ +#cmakedefine HAVE_GETRANDOM + /* Define to 1 if you have the getservbyport_r function. */ #cmakedefine HAVE_GETSERVBYPORT_R @@ -172,6 +179,12 @@ /* Define to 1 if you have the `resolve' library (-lresolve). */ #cmakedefine HAVE_LIBRESOLV +/* Define to 1 if you have iphlpapi.h */ +#cmakedefine HAVE_IPHLPAPI_H + +/* Define to 1 if you have netioapi.h */ +#cmakedefine HAVE_NETIOAPI_H + /* Define to 1 if you have the header file. */ #cmakedefine HAVE_LIMITS_H @@ -349,6 +362,9 @@ /* Define if have arc4random_buf() */ #cmakedefine HAVE_ARC4RANDOM_BUF +/* Define if have stat() */ +#cmakedefine HAVE_STAT + /* a suitable file/device to read random data from */ #cmakedefine CARES_RANDOM_FILE "@CARES_RANDOM_FILE@" @@ -433,3 +449,15 @@ /* Type to use in place of in_addr_t when system does not provide it. */ #undef in_addr_t +/* Define to 1 if you have the pthread.h header file. */ +#cmakedefine HAVE_PTHREAD_H + +/* Define to 1 if you have the pthread_np.h header file. */ +#cmakedefine HAVE_PTHREAD_NP_H + +/* Define to 1 if threads are enabled */ +#cmakedefine CARES_THREADS + +/* Define to 1 if pthread_init() exists */ +#cmakedefine HAVE_PTHREAD_INIT + diff --git a/lib/c-ares-1.19.1/src/lib/ares_config.h.in b/lib/c-ares-1.23.0/src/lib/ares_config.h.in similarity index 94% rename from lib/c-ares-1.19.1/src/lib/ares_config.h.in rename to lib/c-ares-1.23.0/src/lib/ares_config.h.in index 3f6954a74db..e43e6a53490 100644 --- a/lib/c-ares-1.19.1/src/lib/ares_config.h.in +++ b/lib/c-ares-1.23.0/src/lib/ares_config.h.in @@ -18,6 +18,9 @@ /* Definition to make a library symbol externally visible. */ #undef CARES_SYMBOL_SCOPE_EXTERN +/* Threading enabled */ +#undef CARES_THREADS + /* the signed version of size_t */ #undef CARES_TYPEOF_ARES_SSIZE_T @@ -129,6 +132,9 @@ /* Define to 1 if you have the getnameinfo function. */ #undef HAVE_GETNAMEINFO +/* Define to 1 if you have the getrandom function. */ +#undef HAVE_GETRANDOM + /* Define to 1 if you have the getservbyport_r function. */ #undef HAVE_GETSERVBYPORT_R @@ -172,6 +178,9 @@ /* Define to 1 if you have a working ioctl SIOCGIFADDR function. */ #undef HAVE_IOCTL_SIOCGIFADDR +/* Define to 1 if you have the header file. */ +#undef HAVE_IPHLPAPI_H + /* Define to 1 if you have the `resolve' library (-lresolve). */ #undef HAVE_LIBRESOLVE @@ -202,12 +211,24 @@ /* Define to 1 if you have the header file. */ #undef HAVE_NETINET_TCP_H +/* Define to 1 if you have the header file. */ +#undef HAVE_NETIOAPI_H + /* Define to 1 if you have the header file. */ #undef HAVE_NET_IF_H /* Define to 1 if you have PF_INET6. */ #undef HAVE_PF_INET6 +/* Define to 1 if you have the header file. */ +#undef HAVE_PTHREAD_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_PTHREAD_NP_H + +/* Have PTHREAD_PRIO_INHERIT. */ +#undef HAVE_PTHREAD_PRIO_INHERIT + /* Define to 1 if you have the recv function. */ #undef HAVE_RECV @@ -241,6 +262,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_SOCKET_H +/* Define to 1 if you have the stat function. */ +#undef HAVE_STAT + /* Define to 1 if you have the header file. */ #undef HAVE_STDBOOL_H @@ -304,6 +328,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_SYS_PARAM_H +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_RANDOM_H + /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SELECT_H @@ -385,6 +412,10 @@ /* Define to the version of this package. */ #undef PACKAGE_VERSION +/* Define to necessary symbol if this constant uses a non-standard name on + your system. */ +#undef PTHREAD_CREATE_JOINABLE + /* Define to the type qualifier pointed by arg 5 for recvfrom. */ #undef RECVFROM_QUAL_ARG5 diff --git a/lib/c-ares-1.23.0/src/lib/ares_create_query.c b/lib/c-ares-1.23.0/src/lib/ares_create_query.c new file mode 100644 index 00000000000..f66b0ff6e06 --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares_create_query.c @@ -0,0 +1,107 @@ +/* MIT License + * + * Copyright (c) 2023 Brad House + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ + +#include "ares_setup.h" +#include "ares.h" +#include "ares_private.h" + +int ares_create_query(const char *name, int dnsclass, int type, + unsigned short id, int rd, unsigned char **bufp, + int *buflenp, int max_udp_size) +{ + ares_status_t status; + ares_dns_record_t *dnsrec = NULL; + size_t len; + + if (name == NULL || bufp == NULL || buflenp == NULL) { + status = ARES_EFORMERR; + goto done; + } + + *bufp = NULL; + *buflenp = 0; + + /* Per RFC 7686, reject queries for ".onion" domain names with NXDOMAIN. */ + if (ares__is_onion_domain(name)) { + status = ARES_ENOTFOUND; + goto done; + } + + status = ares_dns_record_create(&dnsrec, id, rd ? ARES_FLAG_RD : 0, + ARES_OPCODE_QUERY, ARES_RCODE_NOERROR); + if (status != ARES_SUCCESS) { + goto done; + } + + status = ares_dns_record_query_add(dnsrec, name, (ares_dns_rec_type_t)type, + (ares_dns_class_t)dnsclass); + if (status != ARES_SUCCESS) { + goto done; + } + + /* max_udp_size > 0 indicates EDNS, so send OPT RR as an additional record */ + if (max_udp_size > 0) { + ares_dns_rr_t *rr = NULL; + + status = ares_dns_record_rr_add(&rr, dnsrec, ARES_SECTION_ADDITIONAL, "", + ARES_REC_TYPE_OPT, ARES_CLASS_IN, 0); + if (status != ARES_SUCCESS) { + goto done; + } + + if (max_udp_size > 65535) { + status = ARES_EFORMERR; + goto done; + } + + status = ares_dns_rr_set_u16(rr, ARES_RR_OPT_UDP_SIZE, + (unsigned short)max_udp_size); + if (status != ARES_SUCCESS) { + goto done; + } + + status = ares_dns_rr_set_u8(rr, ARES_RR_OPT_VERSION, 0); + if (status != ARES_SUCCESS) { + goto done; + } + + status = ares_dns_rr_set_u16(rr, ARES_RR_OPT_FLAGS, 0); + if (status != ARES_SUCCESS) { + goto done; + } + } + + status = ares_dns_write(dnsrec, bufp, &len); + if (status != ARES_SUCCESS) { + goto done; + } + + *buflenp = (int)len; + +done: + ares_dns_record_destroy(dnsrec); + return (int)status; +} diff --git a/lib/c-ares-1.23.0/src/lib/ares_data.c b/lib/c-ares-1.23.0/src/lib/ares_data.c new file mode 100644 index 00000000000..e37088283ba --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares_data.c @@ -0,0 +1,172 @@ +/* MIT License + * + * Copyright (c) 2009 Daniel Stenberg + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ + + +#include "ares_setup.h" + +#include + +#include "ares.h" +#include "ares_data.h" +#include "ares_private.h" + +/* +** ares_free_data() - c-ares external API function. +** +** This function must be used by the application to free data memory that +** has been internally allocated by some c-ares function and for which a +** pointer has already been returned to the calling application. The list +** of c-ares functions returning pointers that must be free'ed using this +** function is: +** +** ares_get_servers() +** ares_parse_srv_reply() +** ares_parse_txt_reply() +*/ + +void ares_free_data(void *dataptr) +{ + while (dataptr != NULL) { + struct ares_data *ptr; + void *next_data = NULL; + +#ifdef __INTEL_COMPILER +# pragma warning(push) +# pragma warning(disable : 1684) + /* 1684: conversion from pointer to same-sized integral type */ +#endif + + ptr = (void *)((char *)dataptr - offsetof(struct ares_data, data)); + +#ifdef __INTEL_COMPILER +# pragma warning(pop) +#endif + + if (ptr->mark != ARES_DATATYPE_MARK) { + return; + } + + switch (ptr->type) { + case ARES_DATATYPE_MX_REPLY: + next_data = ptr->data.mx_reply.next; + ares_free(ptr->data.mx_reply.host); + break; + + case ARES_DATATYPE_SRV_REPLY: + next_data = ptr->data.srv_reply.next; + ares_free(ptr->data.srv_reply.host); + break; + + case ARES_DATATYPE_URI_REPLY: + next_data = ptr->data.uri_reply.next; + ares_free(ptr->data.uri_reply.uri); + break; + + case ARES_DATATYPE_TXT_REPLY: + case ARES_DATATYPE_TXT_EXT: + next_data = ptr->data.txt_reply.next; + ares_free(ptr->data.txt_reply.txt); + break; + + case ARES_DATATYPE_ADDR_NODE: + next_data = ptr->data.addr_node.next; + break; + + case ARES_DATATYPE_ADDR_PORT_NODE: + next_data = ptr->data.addr_port_node.next; + break; + + case ARES_DATATYPE_NAPTR_REPLY: + next_data = ptr->data.naptr_reply.next; + ares_free(ptr->data.naptr_reply.flags); + ares_free(ptr->data.naptr_reply.service); + ares_free(ptr->data.naptr_reply.regexp); + ares_free(ptr->data.naptr_reply.replacement); + break; + + case ARES_DATATYPE_SOA_REPLY: + ares_free(ptr->data.soa_reply.nsname); + ares_free(ptr->data.soa_reply.hostmaster); + break; + + case ARES_DATATYPE_CAA_REPLY: + next_data = ptr->data.caa_reply.next; + ares_free(ptr->data.caa_reply.property); + ares_free(ptr->data.caa_reply.value); + break; + + default: + return; + } + + ares_free(ptr); + dataptr = next_data; + } +} + +/* +** ares_malloc_data() - c-ares internal helper function. +** +** This function allocates memory for a c-ares private ares_data struct +** for the specified ares_datatype, initializes c-ares private fields +** and zero initializes those which later might be used from the public +** API. It returns an interior pointer which can be passed by c-ares +** functions to the calling application, and that must be free'ed using +** c-ares external API function ares_free_data(). +*/ + +void *ares_malloc_data(ares_datatype type) +{ + struct ares_data *ptr; + + ptr = ares_malloc_zero(sizeof(*ptr)); + if (!ptr) { + return NULL; + } + + switch (type) { + case ARES_DATATYPE_MX_REPLY: + case ARES_DATATYPE_SRV_REPLY: + case ARES_DATATYPE_URI_REPLY: + case ARES_DATATYPE_TXT_EXT: + case ARES_DATATYPE_TXT_REPLY: + case ARES_DATATYPE_CAA_REPLY: + case ARES_DATATYPE_ADDR_NODE: + case ARES_DATATYPE_ADDR_PORT_NODE: + case ARES_DATATYPE_NAPTR_REPLY: + case ARES_DATATYPE_SOA_REPLY: + break; + + default: + ares_free(ptr); + return NULL; + } + + ptr->mark = ARES_DATATYPE_MARK; + ptr->type = type; + + return &ptr->data; +} diff --git a/lib/c-ares-1.23.0/src/lib/ares_data.h b/lib/c-ares-1.23.0/src/lib/ares_data.h new file mode 100644 index 00000000000..b2c4d22b869 --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares_data.h @@ -0,0 +1,92 @@ +/* MIT License + * + * Copyright (c) 2009 Daniel Stenberg + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ +#ifndef __ARES_DATA_H +#define __ARES_DATA_H + +typedef enum { + ARES_DATATYPE_UNKNOWN = 1, /* unknown data type - introduced in 1.7.0 */ + ARES_DATATYPE_SRV_REPLY, /* struct ares_srv_reply - introduced in 1.7.0 */ + ARES_DATATYPE_TXT_REPLY, /* struct ares_txt_reply - introduced in 1.7.0 */ + ARES_DATATYPE_TXT_EXT, /* struct ares_txt_ext - introduced in 1.11.0 */ + ARES_DATATYPE_ADDR_NODE, /* struct ares_addr_node - introduced in 1.7.1 */ + ARES_DATATYPE_MX_REPLY, /* struct ares_mx_reply - introduced in 1.7.2 */ + ARES_DATATYPE_NAPTR_REPLY, /* struct ares_naptr_reply - introduced in 1.7.6 */ + ARES_DATATYPE_SOA_REPLY, /* struct ares_soa_reply - introduced in 1.9.0 */ + ARES_DATATYPE_URI_REPLY, /* struct ares_uri_reply */ +#if 0 + ARES_DATATYPE_ADDR6TTL, /* struct ares_addrttl */ + ARES_DATATYPE_ADDRTTL, /* struct ares_addr6ttl */ + ARES_DATATYPE_HOSTENT, /* struct hostent */ + ARES_DATATYPE_OPTIONS, /* struct ares_options */ +#endif + ARES_DATATYPE_ADDR_PORT_NODE, /* struct ares_addr_port_node - introduced + in 1.11.0 */ + ARES_DATATYPE_CAA_REPLY, /* struct ares_caa_reply - introduced in 1.17 */ + ARES_DATATYPE_LAST /* not used - introduced in 1.7.0 */ +} ares_datatype; + +#define ARES_DATATYPE_MARK 0xbead + +/* + * ares_data struct definition is internal to c-ares and shall not + * be exposed by the public API in order to allow future changes + * and extensions to it without breaking ABI. This will be used + * internally by c-ares as the container of multiple types of data + * dynamically allocated for which a reference will be returned + * to the calling application. + * + * c-ares API functions returning a pointer to c-ares internally + * allocated data will actually be returning an interior pointer + * into this ares_data struct. + * + * All this is 'invisible' to the calling application, the only + * requirement is that this kind of data must be free'ed by the + * calling application using ares_free_data() with the pointer + * it has received from a previous c-ares function call. + */ + +struct ares_data { + ares_datatype type; /* Actual data type identifier. */ + unsigned int mark; /* Private ares_data signature. */ + + union { + struct ares_txt_reply txt_reply; + struct ares_txt_ext txt_ext; + struct ares_srv_reply srv_reply; + struct ares_addr_node addr_node; + struct ares_addr_port_node addr_port_node; + struct ares_mx_reply mx_reply; + struct ares_naptr_reply naptr_reply; + struct ares_soa_reply soa_reply; + struct ares_caa_reply caa_reply; + struct ares_uri_reply uri_reply; + } data; +}; + +void *ares_malloc_data(ares_datatype type); + + +#endif /* __ARES_DATA_H */ diff --git a/lib/c-ares-1.23.0/src/lib/ares_destroy.c b/lib/c-ares-1.23.0/src/lib/ares_destroy.c new file mode 100644 index 00000000000..d7cfb3bb08f --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares_destroy.c @@ -0,0 +1,129 @@ +/* MIT License + * + * Copyright (c) 1998 Massachusetts Institute of Technology + * Copyright (c) 2004 Daniel Stenberg + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ + +#include "ares_setup.h" + +#include + +#include "ares.h" +#include "ares_private.h" + +void ares_destroy(ares_channel_t *channel) +{ + size_t i; + ares__llist_node_t *node = NULL; + + if (channel == NULL) { + return; + } + + /* Lock because callbacks will be triggered */ + ares__channel_lock(channel); + + /* Destroy all queries */ + node = ares__llist_node_first(channel->all_queries); + while (node != NULL) { + ares__llist_node_t *next = ares__llist_node_next(node); + struct query *query = ares__llist_node_claim(node); + + query->node_all_queries = NULL; + query->callback(query->arg, ARES_EDESTRUCTION, 0, NULL, 0); + ares__free_query(query); + + node = next; + } + +#ifndef NDEBUG + /* Freeing the query should remove it from all the lists in which it sits, + * so all query lists should be empty now. + */ + assert(ares__llist_len(channel->all_queries) == 0); + assert(ares__htable_szvp_num_keys(channel->queries_by_qid) == 0); + assert(ares__slist_len(channel->queries_by_timeout) == 0); +#endif + + ares__destroy_servers_state(channel); + +#ifndef NDEBUG + assert(ares__htable_asvp_num_keys(channel->connnode_by_socket) == 0); +#endif + + /* No more callbacks will be triggered after this point, unlock */ + ares__channel_unlock(channel); + + if (channel->domains) { + for (i = 0; i < channel->ndomains; i++) { + ares_free(channel->domains[i]); + } + ares_free(channel->domains); + } + + ares__llist_destroy(channel->all_queries); + ares__slist_destroy(channel->queries_by_timeout); + ares__htable_szvp_destroy(channel->queries_by_qid); + ares__htable_asvp_destroy(channel->connnode_by_socket); + + ares_free(channel->sortlist); + ares_free(channel->lookups); + ares_free(channel->resolvconf_path); + ares_free(channel->hosts_path); + ares__destroy_rand_state(channel->rand_state); + + ares__hosts_file_destroy(channel->hf); + + ares__qcache_destroy(channel->qcache); + + ares__channel_threading_destroy(channel); + + ares_free(channel); +} + +void ares__destroy_server(struct server_state *server) +{ + if (server == NULL) { + return; + } + + ares__close_sockets(server); + ares__llist_destroy(server->connections); + ares__buf_destroy(server->tcp_parser); + ares__buf_destroy(server->tcp_send); + ares_free(server); +} + +void ares__destroy_servers_state(ares_channel_t *channel) +{ + ares__slist_node_t *node; + + while ((node = ares__slist_node_first(channel->servers)) != NULL) { + struct server_state *server = ares__slist_node_claim(node); + ares__destroy_server(server); + } + + ares__slist_destroy(channel->servers); + channel->servers = NULL; +} diff --git a/lib/c-ares-1.23.0/src/lib/ares_dns_mapping.c b/lib/c-ares-1.23.0/src/lib/ares_dns_mapping.c new file mode 100644 index 00000000000..55f1af7939c --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares_dns_mapping.c @@ -0,0 +1,885 @@ +/* MIT License + * + * Copyright (c) 2023 Brad House + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ +#include "ares_setup.h" +#include "ares.h" +#include "ares_private.h" + +ares_bool_t ares_dns_opcode_isvalid(ares_dns_opcode_t opcode) +{ + switch (opcode) { + case ARES_OPCODE_QUERY: + case ARES_OPCODE_IQUERY: + case ARES_OPCODE_STATUS: + case ARES_OPCODE_NOTIFY: + case ARES_OPCODE_UPDATE: + return ARES_TRUE; + } + return ARES_FALSE; +} + +ares_bool_t ares_dns_rcode_isvalid(ares_dns_rcode_t rcode) +{ + switch (rcode) { + case ARES_RCODE_NOERROR: + case ARES_RCODE_FORMERR: + case ARES_RCODE_SERVFAIL: + case ARES_RCODE_NXDOMAIN: + case ARES_RCODE_NOTIMP: + case ARES_RCODE_REFUSED: + case ARES_RCODE_YXDOMAIN: + case ARES_RCODE_YXRRSET: + case ARES_RCODE_NXRRSET: + case ARES_RCODE_NOTAUTH: + case ARES_RCODE_NOTZONE: + case ARES_RCODE_DSOTYPEI: + case ARES_RCODE_BADSIG: + case ARES_RCODE_BADKEY: + case ARES_RCODE_BADTIME: + case ARES_RCODE_BADMODE: + case ARES_RCODE_BADNAME: + case ARES_RCODE_BADALG: + case ARES_RCODE_BADTRUNC: + case ARES_RCODE_BADCOOKIE: + return ARES_TRUE; + } + return ARES_FALSE; +} + +ares_bool_t ares_dns_flags_arevalid(unsigned short flags) +{ + unsigned short allflags = ARES_FLAG_QR | ARES_FLAG_AA | ARES_FLAG_TC | + ARES_FLAG_RD | ARES_FLAG_RA | ARES_FLAG_AD | + ARES_FLAG_CD; + + if (flags & ~allflags) { + return ARES_FALSE; + } + + return ARES_TRUE; +} + +ares_bool_t ares_dns_rec_type_isvalid(ares_dns_rec_type_t type, + ares_bool_t is_query) +{ + switch (type) { + case ARES_REC_TYPE_A: + case ARES_REC_TYPE_NS: + case ARES_REC_TYPE_CNAME: + case ARES_REC_TYPE_SOA: + case ARES_REC_TYPE_PTR: + case ARES_REC_TYPE_HINFO: + case ARES_REC_TYPE_MX: + case ARES_REC_TYPE_TXT: + case ARES_REC_TYPE_AAAA: + case ARES_REC_TYPE_SRV: + case ARES_REC_TYPE_NAPTR: + case ARES_REC_TYPE_OPT: + case ARES_REC_TYPE_TLSA: + case ARES_REC_TYPE_SVCB: + case ARES_REC_TYPE_HTTPS: + case ARES_REC_TYPE_ANY: + case ARES_REC_TYPE_URI: + case ARES_REC_TYPE_CAA: + return ARES_TRUE; + case ARES_REC_TYPE_RAW_RR: + return is_query ? ARES_FALSE : ARES_TRUE; + default: + break; + } + return is_query ? ARES_TRUE : ARES_FALSE; +} + +ares_bool_t ares_dns_rec_type_allow_name_compression(ares_dns_rec_type_t type) +{ + /* Only record types defined in RFC1035 allow name compression within the + * RDATA. Otherwise nameservers that don't understand an RR may not be + * able to pass along the RR in a proper manner */ + switch (type) { + case ARES_REC_TYPE_A: + case ARES_REC_TYPE_NS: + case ARES_REC_TYPE_CNAME: + case ARES_REC_TYPE_SOA: + case ARES_REC_TYPE_PTR: + case ARES_REC_TYPE_HINFO: + case ARES_REC_TYPE_MX: + case ARES_REC_TYPE_TXT: + return ARES_TRUE; + default: + break; + } + return ARES_FALSE; +} + +ares_bool_t ares_dns_class_isvalid(ares_dns_class_t qclass, + ares_bool_t is_query) +{ + switch (qclass) { + case ARES_CLASS_IN: + case ARES_CLASS_CHAOS: + case ARES_CLASS_HESOID: + case ARES_CLASS_NONE: + return ARES_TRUE; + case ARES_CLASS_ANY: + return is_query ? ARES_TRUE : ARES_FALSE; + } + return ARES_FALSE; +} + +ares_bool_t ares_dns_section_isvalid(ares_dns_section_t sect) +{ + switch (sect) { + case ARES_SECTION_ANSWER: + case ARES_SECTION_AUTHORITY: + case ARES_SECTION_ADDITIONAL: + return ARES_TRUE; + } + return ARES_FALSE; +} + +ares_dns_rec_type_t ares_dns_rr_key_to_rec_type(ares_dns_rr_key_t key) +{ + /* NOTE: due to the way we've numerated the keys, we can simply divide by + * 100 to get the type rather than having to do a huge switch + * statement. That said, we do then validate the type returned is + * valid in case something completely bogus is passed in */ + ares_dns_rec_type_t type = key / 100; + if (!ares_dns_rec_type_isvalid(type, ARES_FALSE)) { + return 0; + } + return type; +} + +const char *ares_dns_rec_type_tostr(ares_dns_rec_type_t type) +{ + switch (type) { + case ARES_REC_TYPE_A: + return "A"; + case ARES_REC_TYPE_NS: + return "NS"; + case ARES_REC_TYPE_CNAME: + return "CNAME"; + case ARES_REC_TYPE_SOA: + return "SOA"; + case ARES_REC_TYPE_PTR: + return "PTR"; + case ARES_REC_TYPE_HINFO: + return "HINFO"; + case ARES_REC_TYPE_MX: + return "MX"; + case ARES_REC_TYPE_TXT: + return "TXT"; + case ARES_REC_TYPE_AAAA: + return "AAAA"; + case ARES_REC_TYPE_SRV: + return "SRV"; + case ARES_REC_TYPE_NAPTR: + return "NAPTR"; + case ARES_REC_TYPE_OPT: + return "OPT"; + case ARES_REC_TYPE_TLSA: + return "TLSA"; + case ARES_REC_TYPE_SVCB: + return "SVCB"; + case ARES_REC_TYPE_HTTPS: + return "HTTPS"; + case ARES_REC_TYPE_ANY: + return "ANY"; + case ARES_REC_TYPE_URI: + return "URI"; + case ARES_REC_TYPE_CAA: + return "CAA"; + case ARES_REC_TYPE_RAW_RR: + return "RAWRR"; + } + return "UNKNOWN"; +} + +const char *ares_dns_class_tostr(ares_dns_class_t qclass) +{ + switch (qclass) { + case ARES_CLASS_IN: + return "IN"; + case ARES_CLASS_CHAOS: + return "CH"; + case ARES_CLASS_HESOID: + return "HS"; + case ARES_CLASS_ANY: + return "ANY"; + case ARES_CLASS_NONE: + return "NONE"; + } + return "UNKNOWN"; +} + +const char *ares_dns_opcode_tostr(ares_dns_opcode_t opcode) +{ + switch (opcode) { + case ARES_OPCODE_QUERY: + return "QUERY"; + case ARES_OPCODE_IQUERY: + return "IQUERY"; + case ARES_OPCODE_STATUS: + return "STATUS"; + case ARES_OPCODE_NOTIFY: + return "NOTIFY"; + case ARES_OPCODE_UPDATE: + return "UPDATE"; + } + return "UNKNOWN"; +} + +const char *ares_dns_rr_key_tostr(ares_dns_rr_key_t key) +{ + switch (key) { + case ARES_RR_A_ADDR: + return "ADDR"; + + case ARES_RR_NS_NSDNAME: + return "NSDNAME"; + + case ARES_RR_CNAME_CNAME: + return "CNAME"; + + case ARES_RR_SOA_MNAME: + return "MNAME"; + + case ARES_RR_SOA_RNAME: + return "RNAME"; + + case ARES_RR_SOA_SERIAL: + return "SERIAL"; + + case ARES_RR_SOA_REFRESH: + return "REFRESH"; + + case ARES_RR_SOA_RETRY: + return "RETRY"; + + case ARES_RR_SOA_EXPIRE: + return "EXPIRE"; + + case ARES_RR_SOA_MINIMUM: + return "MINIMUM"; + + case ARES_RR_PTR_DNAME: + return "DNAME"; + + case ARES_RR_AAAA_ADDR: + return "ADDR"; + + case ARES_RR_HINFO_CPU: + return "CPU"; + + case ARES_RR_HINFO_OS: + return "OS"; + + case ARES_RR_MX_PREFERENCE: + return "PREFERENCE"; + + case ARES_RR_MX_EXCHANGE: + return "EXCHANGE"; + + case ARES_RR_TXT_DATA: + return "DATA"; + + case ARES_RR_SRV_PRIORITY: + return "PRIORITY"; + + case ARES_RR_SRV_WEIGHT: + return "WEIGHT"; + + case ARES_RR_SRV_PORT: + return "PORT"; + + case ARES_RR_SRV_TARGET: + return "TARGET"; + + case ARES_RR_NAPTR_ORDER: + return "ORDER"; + + case ARES_RR_NAPTR_PREFERENCE: + return "PREFERENCE"; + + case ARES_RR_NAPTR_FLAGS: + return "FLAGS"; + + case ARES_RR_NAPTR_SERVICES: + return "SERVICES"; + + case ARES_RR_NAPTR_REGEXP: + return "REGEXP"; + + case ARES_RR_NAPTR_REPLACEMENT: + return "REPLACEMENT"; + + case ARES_RR_OPT_UDP_SIZE: + return "UDP_SIZE"; + + case ARES_RR_OPT_VERSION: + return "VERSION"; + + case ARES_RR_OPT_FLAGS: + return "FLAGS"; + + case ARES_RR_OPT_OPTIONS: + return "OPTIONS"; + + case ARES_RR_TLSA_CERT_USAGE: + return "CERT_USAGE"; + + case ARES_RR_TLSA_SELECTOR: + return "SELECTOR"; + + case ARES_RR_TLSA_MATCH: + return "MATCH"; + + case ARES_RR_TLSA_DATA: + return "DATA"; + + case ARES_RR_SVCB_PRIORITY: + return "PRIORITY"; + + case ARES_RR_SVCB_TARGET: + return "TARGET"; + + case ARES_RR_SVCB_PARAMS: + return "PARAMS"; + + case ARES_RR_HTTPS_PRIORITY: + return "PRIORITY"; + + case ARES_RR_HTTPS_TARGET: + return "TARGET"; + + case ARES_RR_HTTPS_PARAMS: + return "PARAMS"; + + case ARES_RR_URI_PRIORITY: + return "PRIORITY"; + + case ARES_RR_URI_WEIGHT: + return "WEIGHT"; + + case ARES_RR_URI_TARGET: + return "TARGET"; + + case ARES_RR_CAA_CRITICAL: + return "CRITICAL"; + + case ARES_RR_CAA_TAG: + return "TAG"; + + case ARES_RR_CAA_VALUE: + return "VALUE"; + + case ARES_RR_RAW_RR_TYPE: + return "TYPE"; + + case ARES_RR_RAW_RR_DATA: + return "DATA"; + } + + return "UNKNOWN"; +} + +ares_dns_datatype_t ares_dns_rr_key_datatype(ares_dns_rr_key_t key) +{ + switch (key) { + case ARES_RR_A_ADDR: + return ARES_DATATYPE_INADDR; + + case ARES_RR_AAAA_ADDR: + return ARES_DATATYPE_INADDR6; + + case ARES_RR_NS_NSDNAME: + case ARES_RR_CNAME_CNAME: + case ARES_RR_SOA_MNAME: + case ARES_RR_SOA_RNAME: + case ARES_RR_PTR_DNAME: + case ARES_RR_MX_EXCHANGE: + case ARES_RR_SRV_TARGET: + case ARES_RR_SVCB_TARGET: + case ARES_RR_HTTPS_TARGET: + case ARES_RR_NAPTR_REPLACEMENT: + case ARES_RR_URI_TARGET: + return ARES_DATATYPE_NAME; + + case ARES_RR_HINFO_CPU: + case ARES_RR_HINFO_OS: + case ARES_RR_NAPTR_FLAGS: + case ARES_RR_NAPTR_SERVICES: + case ARES_RR_NAPTR_REGEXP: + case ARES_RR_CAA_TAG: + return ARES_DATATYPE_STR; + + case ARES_RR_SOA_SERIAL: + case ARES_RR_SOA_REFRESH: + case ARES_RR_SOA_RETRY: + case ARES_RR_SOA_EXPIRE: + case ARES_RR_SOA_MINIMUM: + return ARES_DATATYPE_U32; + + case ARES_RR_MX_PREFERENCE: + case ARES_RR_SRV_PRIORITY: + case ARES_RR_SRV_WEIGHT: + case ARES_RR_SRV_PORT: + case ARES_RR_NAPTR_ORDER: + case ARES_RR_NAPTR_PREFERENCE: + case ARES_RR_OPT_UDP_SIZE: + case ARES_RR_OPT_FLAGS: + case ARES_RR_SVCB_PRIORITY: + case ARES_RR_HTTPS_PRIORITY: + case ARES_RR_URI_PRIORITY: + case ARES_RR_URI_WEIGHT: + case ARES_RR_RAW_RR_TYPE: + return ARES_DATATYPE_U16; + + case ARES_RR_OPT_VERSION: + case ARES_RR_TLSA_CERT_USAGE: + case ARES_RR_TLSA_SELECTOR: + case ARES_RR_TLSA_MATCH: + case ARES_RR_CAA_CRITICAL: + return ARES_DATATYPE_U8; + + case ARES_RR_CAA_VALUE: + case ARES_RR_TXT_DATA: + return ARES_DATATYPE_BINP; + + case ARES_RR_TLSA_DATA: + case ARES_RR_RAW_RR_DATA: + return ARES_DATATYPE_BIN; + + case ARES_RR_OPT_OPTIONS: + case ARES_RR_SVCB_PARAMS: + case ARES_RR_HTTPS_PARAMS: + return ARES_DATATYPE_OPT; + } + + return 0; +} + +static const ares_dns_rr_key_t rr_a_keys[] = { ARES_RR_A_ADDR }; +static const ares_dns_rr_key_t rr_ns_keys[] = { ARES_RR_NS_NSDNAME }; +static const ares_dns_rr_key_t rr_cname_keys[] = { ARES_RR_CNAME_CNAME }; +static const ares_dns_rr_key_t rr_soa_keys[] = { + ARES_RR_SOA_MNAME, ARES_RR_SOA_RNAME, ARES_RR_SOA_SERIAL, + ARES_RR_SOA_REFRESH, ARES_RR_SOA_RETRY, ARES_RR_SOA_EXPIRE, + ARES_RR_SOA_MINIMUM +}; +static const ares_dns_rr_key_t rr_ptr_keys[] = { ARES_RR_PTR_DNAME }; +static const ares_dns_rr_key_t rr_hinfo_keys[] = { ARES_RR_HINFO_CPU, + ARES_RR_HINFO_OS }; +static const ares_dns_rr_key_t rr_mx_keys[] = { ARES_RR_MX_PREFERENCE, + ARES_RR_MX_EXCHANGE }; +static const ares_dns_rr_key_t rr_txt_keys[] = { ARES_RR_TXT_DATA }; +static const ares_dns_rr_key_t rr_aaaa_keys[] = { ARES_RR_AAAA_ADDR }; +static const ares_dns_rr_key_t rr_srv_keys[] = { + ARES_RR_SRV_PRIORITY, ARES_RR_SRV_WEIGHT, ARES_RR_SRV_PORT, ARES_RR_SRV_TARGET +}; +static const ares_dns_rr_key_t rr_naptr_keys[] = { + ARES_RR_NAPTR_ORDER, ARES_RR_NAPTR_PREFERENCE, ARES_RR_NAPTR_FLAGS, + ARES_RR_NAPTR_SERVICES, ARES_RR_NAPTR_REGEXP, ARES_RR_NAPTR_REPLACEMENT +}; +static const ares_dns_rr_key_t rr_opt_keys[] = { ARES_RR_OPT_UDP_SIZE, + ARES_RR_OPT_VERSION, + ARES_RR_OPT_FLAGS, + ARES_RR_OPT_OPTIONS }; +static const ares_dns_rr_key_t rr_tlsa_keys[] = { ARES_RR_TLSA_CERT_USAGE, + ARES_RR_TLSA_SELECTOR, + ARES_RR_TLSA_MATCH, + ARES_RR_TLSA_DATA }; +static const ares_dns_rr_key_t rr_svcb_keys[] = { ARES_RR_SVCB_PRIORITY, + ARES_RR_SVCB_TARGET, + ARES_RR_SVCB_PARAMS }; +static const ares_dns_rr_key_t rr_https_keys[] = { ARES_RR_HTTPS_PRIORITY, + ARES_RR_HTTPS_TARGET, + ARES_RR_HTTPS_PARAMS }; +static const ares_dns_rr_key_t rr_uri_keys[] = { ARES_RR_URI_PRIORITY, + ARES_RR_URI_WEIGHT, + ARES_RR_URI_TARGET }; +static const ares_dns_rr_key_t rr_caa_keys[] = { ARES_RR_CAA_CRITICAL, + ARES_RR_CAA_TAG, + ARES_RR_CAA_VALUE }; +static const ares_dns_rr_key_t rr_raw_rr_keys[] = { ARES_RR_RAW_RR_TYPE, + ARES_RR_RAW_RR_DATA }; + +const ares_dns_rr_key_t *ares_dns_rr_get_keys(ares_dns_rec_type_t type, + size_t *cnt) +{ + if (cnt == NULL) { + return NULL; + } + + *cnt = 0; + + switch (type) { + case ARES_REC_TYPE_A: + *cnt = sizeof(rr_a_keys) / sizeof(*rr_a_keys); + return rr_a_keys; + case ARES_REC_TYPE_NS: + *cnt = sizeof(rr_ns_keys) / sizeof(*rr_ns_keys); + return rr_ns_keys; + case ARES_REC_TYPE_CNAME: + *cnt = sizeof(rr_cname_keys) / sizeof(*rr_cname_keys); + return rr_cname_keys; + case ARES_REC_TYPE_SOA: + *cnt = sizeof(rr_soa_keys) / sizeof(*rr_soa_keys); + return rr_soa_keys; + case ARES_REC_TYPE_PTR: + *cnt = sizeof(rr_ptr_keys) / sizeof(*rr_ptr_keys); + return rr_ptr_keys; + case ARES_REC_TYPE_HINFO: + *cnt = sizeof(rr_hinfo_keys) / sizeof(*rr_hinfo_keys); + return rr_hinfo_keys; + case ARES_REC_TYPE_MX: + *cnt = sizeof(rr_mx_keys) / sizeof(*rr_mx_keys); + return rr_mx_keys; + case ARES_REC_TYPE_TXT: + *cnt = sizeof(rr_txt_keys) / sizeof(*rr_txt_keys); + return rr_txt_keys; + case ARES_REC_TYPE_AAAA: + *cnt = sizeof(rr_aaaa_keys) / sizeof(*rr_aaaa_keys); + return rr_aaaa_keys; + case ARES_REC_TYPE_SRV: + *cnt = sizeof(rr_srv_keys) / sizeof(*rr_srv_keys); + return rr_srv_keys; + case ARES_REC_TYPE_NAPTR: + *cnt = sizeof(rr_naptr_keys) / sizeof(*rr_naptr_keys); + return rr_naptr_keys; + case ARES_REC_TYPE_OPT: + *cnt = sizeof(rr_opt_keys) / sizeof(*rr_opt_keys); + return rr_opt_keys; + case ARES_REC_TYPE_TLSA: + *cnt = sizeof(rr_tlsa_keys) / sizeof(*rr_tlsa_keys); + return rr_tlsa_keys; + case ARES_REC_TYPE_SVCB: + *cnt = sizeof(rr_svcb_keys) / sizeof(*rr_svcb_keys); + return rr_svcb_keys; + case ARES_REC_TYPE_HTTPS: + *cnt = sizeof(rr_https_keys) / sizeof(*rr_https_keys); + return rr_https_keys; + case ARES_REC_TYPE_ANY: + /* Not real */ + break; + case ARES_REC_TYPE_URI: + *cnt = sizeof(rr_uri_keys) / sizeof(*rr_uri_keys); + return rr_uri_keys; + case ARES_REC_TYPE_CAA: + *cnt = sizeof(rr_caa_keys) / sizeof(*rr_caa_keys); + return rr_caa_keys; + case ARES_REC_TYPE_RAW_RR: + *cnt = sizeof(rr_raw_rr_keys) / sizeof(*rr_raw_rr_keys); + return rr_raw_rr_keys; + } + + return NULL; +} + +ares_bool_t ares_dns_class_fromstr(ares_dns_class_t *qclass, const char *str) +{ + size_t i; + + static const struct { + const char *name; + ares_dns_class_t qclass; + } list[] = { + {"IN", ARES_CLASS_IN }, + { "CH", ARES_CLASS_CHAOS }, + { "HS", ARES_CLASS_HESOID}, + { "NONE", ARES_CLASS_NONE }, + { "ANY", ARES_CLASS_ANY }, + { NULL, 0 } + }; + + if (qclass == NULL || str == NULL) { + return ARES_FALSE; + } + + for (i = 0; list[i].name != NULL; i++) { + if (strcasecmp(list[i].name, str) == 0) { + *qclass = list[i].qclass; + return ARES_TRUE; + } + } + return ARES_FALSE; +} + +ares_bool_t ares_dns_rec_type_fromstr(ares_dns_rec_type_t *qtype, + const char *str) +{ + size_t i; + + static const struct { + const char *name; + ares_dns_rec_type_t type; + } list[] = { + {"A", ARES_REC_TYPE_A }, + { "NS", ARES_REC_TYPE_NS }, + { "CNAME", ARES_REC_TYPE_CNAME }, + { "SOA", ARES_REC_TYPE_SOA }, + { "PTR", ARES_REC_TYPE_PTR }, + { "HINFO", ARES_REC_TYPE_HINFO }, + { "MX", ARES_REC_TYPE_MX }, + { "TXT", ARES_REC_TYPE_TXT }, + { "AAAA", ARES_REC_TYPE_AAAA }, + { "SRV", ARES_REC_TYPE_SRV }, + { "NAPTR", ARES_REC_TYPE_NAPTR }, + { "OPT", ARES_REC_TYPE_OPT }, + { "TLSA", ARES_REC_TYPE_TLSA }, + { "SVCB", ARES_REC_TYPE_SVCB }, + { "HTTPS", ARES_REC_TYPE_HTTPS }, + { "ANY", ARES_REC_TYPE_ANY }, + { "URI", ARES_REC_TYPE_URI }, + { "CAA", ARES_REC_TYPE_CAA }, + { "RAW_RR", ARES_REC_TYPE_RAW_RR}, + { NULL, 0 } + }; + + if (qtype == NULL || str == NULL) { + return ARES_FALSE; + } + + for (i = 0; list[i].name != NULL; i++) { + if (strcasecmp(list[i].name, str) == 0) { + *qtype = list[i].type; + return ARES_TRUE; + } + } + return ARES_FALSE; +} + +const char *ares_dns_section_tostr(ares_dns_section_t section) +{ + switch (section) { + case ARES_SECTION_ANSWER: + return "ANSWER"; + case ARES_SECTION_AUTHORITY: + return "AUTHORITY"; + case ARES_SECTION_ADDITIONAL: + return "ADDITIONAL"; + } + return "UNKNOWN"; +} + +static ares_dns_opt_datatype_t ares_dns_opt_get_type_opt(unsigned short opt) +{ + ares_opt_param_t param = (ares_opt_param_t)opt; + switch (param) { + case ARES_OPT_PARAM_LLQ: + /* Really it is u16 version, u16 opcode, u16 error, u64 id, u32 lease */ + return ARES_OPT_DATATYPE_BIN; + case ARES_OPT_PARAM_UL: + return ARES_OPT_DATATYPE_U32; + case ARES_OPT_PARAM_NSID: + return ARES_OPT_DATATYPE_BIN; + case ARES_OPT_PARAM_DAU: + return ARES_OPT_DATATYPE_U8_LIST; + case ARES_OPT_PARAM_DHU: + return ARES_OPT_DATATYPE_U8_LIST; + case ARES_OPT_PARAM_N3U: + return ARES_OPT_DATATYPE_U8_LIST; + case ARES_OPT_PARAM_EDNS_CLIENT_SUBNET: + /* Really it is a u16 address family, u8 source prefix length, + * u8 scope prefix length, address */ + return ARES_OPT_DATATYPE_BIN; + case ARES_OPT_PARAM_EDNS_EXPIRE: + return ARES_OPT_DATATYPE_U32; + case ARES_OPT_PARAM_COOKIE: + /* 8 bytes for client, 16-40 bytes for server */ + return ARES_OPT_DATATYPE_BIN; + case ARES_OPT_PARAM_EDNS_TCP_KEEPALIVE: + /* Timeout in 100ms intervals */ + return ARES_OPT_DATATYPE_U16; + case ARES_OPT_PARAM_PADDING: + /* Arbitrary padding */ + return ARES_OPT_DATATYPE_BIN; + case ARES_OPT_PARAM_CHAIN: + return ARES_OPT_DATATYPE_NAME; + case ARES_OPT_PARAM_EDNS_KEY_TAG: + return ARES_OPT_DATATYPE_U16_LIST; + case ARES_OPT_PARAM_EXTENDED_DNS_ERROR: + /* Really 16bit code followed by textual message */ + return ARES_OPT_DATATYPE_BIN; + } + return ARES_OPT_DATATYPE_BIN; +} + +static ares_dns_opt_datatype_t ares_dns_opt_get_type_svcb(unsigned short opt) +{ + ares_svcb_param_t param = (ares_svcb_param_t)opt; + switch (param) { + case ARES_SVCB_PARAM_NO_DEFAULT_ALPN: + return ARES_OPT_DATATYPE_NONE; + case ARES_SVCB_PARAM_ECH: + return ARES_OPT_DATATYPE_BIN; + case ARES_SVCB_PARAM_MANDATORY: + return ARES_OPT_DATATYPE_U16_LIST; + case ARES_SVCB_PARAM_ALPN: + return ARES_OPT_DATATYPE_STR_LIST; + case ARES_SVCB_PARAM_PORT: + return ARES_OPT_DATATYPE_U16; + case ARES_SVCB_PARAM_IPV4HINT: + return ARES_OPT_DATATYPE_INADDR4_LIST; + case ARES_SVCB_PARAM_IPV6HINT: + return ARES_OPT_DATATYPE_INADDR6_LIST; + } + return ARES_OPT_DATATYPE_BIN; +} + +ares_dns_opt_datatype_t ares_dns_opt_get_datatype(ares_dns_rr_key_t key, + unsigned short opt) +{ + switch (key) { + case ARES_RR_OPT_OPTIONS: + return ares_dns_opt_get_type_opt(opt); + case ARES_RR_SVCB_PARAMS: + case ARES_RR_HTTPS_PARAMS: + return ares_dns_opt_get_type_svcb(opt); + default: + break; + } + return ARES_OPT_DATATYPE_BIN; +} + +static const char *ares_dns_opt_get_name_opt(unsigned short opt) +{ + ares_opt_param_t param = (ares_opt_param_t)opt; + switch (param) { + case ARES_OPT_PARAM_LLQ: + return "LLQ"; + case ARES_OPT_PARAM_UL: + return "UL"; + case ARES_OPT_PARAM_NSID: + return "NSID"; + case ARES_OPT_PARAM_DAU: + return "DAU"; + case ARES_OPT_PARAM_DHU: + return "DHU"; + case ARES_OPT_PARAM_N3U: + return "N3U"; + case ARES_OPT_PARAM_EDNS_CLIENT_SUBNET: + return "edns-client-subnet"; + case ARES_OPT_PARAM_EDNS_EXPIRE: + return "edns-expire"; + case ARES_OPT_PARAM_COOKIE: + return "COOKIE"; + case ARES_OPT_PARAM_EDNS_TCP_KEEPALIVE: + return "edns-tcp-keepalive"; + case ARES_OPT_PARAM_PADDING: + return "Padding"; + case ARES_OPT_PARAM_CHAIN: + return "CHAIN"; + case ARES_OPT_PARAM_EDNS_KEY_TAG: + return "edns-key-tag"; + case ARES_OPT_PARAM_EXTENDED_DNS_ERROR: + return "extended-dns-error"; + } + return NULL; +} + +static const char *ares_dns_opt_get_name_svcb(unsigned short opt) +{ + ares_svcb_param_t param = (ares_svcb_param_t)opt; + switch (param) { + case ARES_SVCB_PARAM_NO_DEFAULT_ALPN: + return "no-default-alpn"; + case ARES_SVCB_PARAM_ECH: + return "ech"; + case ARES_SVCB_PARAM_MANDATORY: + return "mandatory"; + case ARES_SVCB_PARAM_ALPN: + return "alpn"; + case ARES_SVCB_PARAM_PORT: + return "port"; + case ARES_SVCB_PARAM_IPV4HINT: + return "ipv4hint"; + case ARES_SVCB_PARAM_IPV6HINT: + return "ipv6hint"; + } + return NULL; +} + +const char *ares_dns_opt_get_name(ares_dns_rr_key_t key, unsigned short opt) +{ + switch (key) { + case ARES_RR_OPT_OPTIONS: + return ares_dns_opt_get_name_opt(opt); + case ARES_RR_SVCB_PARAMS: + case ARES_RR_HTTPS_PARAMS: + return ares_dns_opt_get_name_svcb(opt); + default: + break; + } + return NULL; +} + +const char *ares_dns_rcode_tostr(ares_dns_rcode_t rcode) +{ + switch (rcode) { + case ARES_RCODE_NOERROR: + return "NOERROR"; + case ARES_RCODE_FORMERR: + return "FORMERR"; + case ARES_RCODE_SERVFAIL: + return "SERVFAIL"; + case ARES_RCODE_NXDOMAIN: + return "NXDOMAIN"; + case ARES_RCODE_NOTIMP: + return "NOTIMP"; + case ARES_RCODE_REFUSED: + return "REFUSED"; + case ARES_RCODE_YXDOMAIN: + return "YXDOMAIN"; + case ARES_RCODE_YXRRSET: + return "YXRRSET"; + case ARES_RCODE_NXRRSET: + return "NXRRSET"; + case ARES_RCODE_NOTAUTH: + return "NOTAUTH"; + case ARES_RCODE_NOTZONE: + return "NOTZONE"; + case ARES_RCODE_DSOTYPEI: + return "DSOTYPEI"; + case ARES_RCODE_BADSIG: + return "BADSIG"; + case ARES_RCODE_BADKEY: + return "BADKEY"; + case ARES_RCODE_BADTIME: + return "BADTIME"; + case ARES_RCODE_BADMODE: + return "BADMODE"; + case ARES_RCODE_BADNAME: + return "BADNAME"; + case ARES_RCODE_BADALG: + return "BADALG"; + case ARES_RCODE_BADTRUNC: + return "BADTRUNC"; + case ARES_RCODE_BADCOOKIE: + return "BADCOOKIE"; + } + + return "UNKNOWN"; +} diff --git a/lib/c-ares-1.23.0/src/lib/ares_dns_name.c b/lib/c-ares-1.23.0/src/lib/ares_dns_name.c new file mode 100644 index 00000000000..f4085ab2cb9 --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares_dns_name.c @@ -0,0 +1,676 @@ +/* MIT License + * + * Copyright (c) 2023 Brad House + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ +#include "ares_setup.h" +#include "ares.h" +#include "ares_private.h" + +typedef struct { + char *name; + size_t name_len; + size_t idx; +} ares_nameoffset_t; + +static void ares__nameoffset_free(void *arg) +{ + ares_nameoffset_t *off = arg; + if (off == NULL) { + return; + } + ares_free(off->name); + ares_free(off); +} + +static ares_status_t ares__nameoffset_create(ares__llist_t **list, + const char *name, size_t idx) +{ + ares_status_t status; + ares_nameoffset_t *off = NULL; + + if (list == NULL || name == NULL || ares_strlen(name) == 0 || + ares_strlen(name) > 255) { + return ARES_EFORMERR; + } + + if (*list == NULL) { + *list = ares__llist_create(ares__nameoffset_free); + } + if (*list == NULL) { + status = ARES_ENOMEM; + goto fail; + } + + off = ares_malloc_zero(sizeof(*off)); + if (off == NULL) { + return ARES_ENOMEM; + } + + off->name = ares_strdup(name); + off->name_len = ares_strlen(off->name); + off->idx = idx; + + if (ares__llist_insert_last(*list, off) == NULL) { + status = ARES_ENOMEM; + goto fail; + } + + return ARES_SUCCESS; + +fail: + ares__nameoffset_free(off); + return status; +} + +static const ares_nameoffset_t *ares__nameoffset_find(ares__llist_t *list, + const char *name) +{ + size_t name_len = ares_strlen(name); + ares__llist_node_t *node; + const ares_nameoffset_t *longest_match = NULL; + + if (list == NULL || name == NULL || name_len == 0) { + return NULL; + } + + for (node = ares__llist_node_first(list); node != NULL; + node = ares__llist_node_next(node)) { + const ares_nameoffset_t *val = ares__llist_node_val(node); + size_t prefix_len; + + /* Can't be a match if the stored name is longer */ + if (val->name_len > name_len) { + continue; + } + + /* Can't be the longest match if our existing longest match is longer */ + if (longest_match != NULL && longest_match->name_len > val->name_len) { + continue; + } + + prefix_len = name_len - val->name_len; + + if (strcasecmp(val->name, name + prefix_len) != 0) { + continue; + } + + /* We need to make sure if `val->name` is "example.com" that name is + * is separated by a label, e.g. "myexample.com" is not ok, however + * "my.example.com" is, so we look for the preceding "." */ + if (prefix_len != 0 && name[prefix_len - 1] != '.') { + continue; + } + + longest_match = val; + } + + return longest_match; +} + +typedef struct { + ares__buf_t **label; + size_t num; +} ares_dns_labels_t; + +static void ares_dns_labels_free(ares_dns_labels_t *labels) +{ + size_t i; + + if (labels == NULL) { + return; + } + + for (i = 0; i < labels->num; i++) { + ares__buf_destroy(labels->label[i]); + labels->label[i] = NULL; + } + ares_free(labels->label); + labels->label = NULL; + labels->num = 0; +} + +static ares__buf_t *ares_dns_labels_add(ares_dns_labels_t *labels) +{ + void *temp; + + if (labels == NULL) { + return NULL; + } + + temp = ares_realloc_zero(labels->label, sizeof(*labels->label) * labels->num, + sizeof(*labels->label) * (labels->num + 1)); + if (temp == NULL) { + return NULL; + } + + labels->label = temp; + + labels->label[labels->num] = ares__buf_create(); + if (labels->label[labels->num] == NULL) { + return NULL; + } + + labels->num++; + return labels->label[labels->num - 1]; +} + +static const ares__buf_t * + ares_dns_labels_get_last(const ares_dns_labels_t *labels) +{ + if (labels == NULL || labels->num == 0) { + return NULL; + } + + return labels->label[labels->num - 1]; +} + +static void ares_dns_name_labels_del_last(ares_dns_labels_t *labels) +{ + if (labels == NULL || labels->num == 0) { + return; + } + + ares__buf_destroy(labels->label[labels->num - 1]); + labels->label[labels->num - 1] = NULL; + labels->num--; +} + +static ares_status_t ares_parse_dns_name_escape(ares__buf_t *namebuf, + ares__buf_t *label, + ares_bool_t validate_hostname) +{ + ares_status_t status; + unsigned char c; + + status = ares__buf_fetch_bytes(namebuf, &c, 1); + if (status != ARES_SUCCESS) { + return ARES_EBADNAME; + } + + /* If next character is a digit, read 2 more digits */ + if (isdigit(c)) { + size_t i; + unsigned int val = 0; + + val = c - '0'; + + for (i = 0; i < 2; i++) { + status = ares__buf_fetch_bytes(namebuf, &c, 1); + if (status != ARES_SUCCESS) { + return ARES_EBADNAME; + } + + if (!isdigit(c)) { + return ARES_EBADNAME; + } + val *= 10; + val += c - '0'; + } + + /* Out of range */ + if (val > 255) { + return ARES_EBADNAME; + } + + if (validate_hostname && !ares__is_hostnamech((unsigned char)val)) { + return ARES_EBADNAME; + } + + return ares__buf_append_byte(label, (unsigned char)val); + } + + /* We can just output the character */ + if (validate_hostname && !ares__is_hostnamech(c)) { + return ARES_EBADNAME; + } + + return ares__buf_append_byte(label, c); +} + +static ares_status_t ares_split_dns_name(ares_dns_labels_t *labels, + ares_bool_t validate_hostname, + const char *name) +{ + ares_status_t status; + ares__buf_t *label = NULL; + ares__buf_t *namebuf = NULL; + size_t i; + size_t total_len = 0; + unsigned char c; + + if (name == NULL || labels == NULL) { + return ARES_EFORMERR; + } + + /* Put name into a buffer for parsing */ + namebuf = ares__buf_create(); + if (namebuf == NULL) { + status = ARES_ENOMEM; + goto done; + } + + if (*name != '\0') { + status = + ares__buf_append(namebuf, (const unsigned char *)name, ares_strlen(name)); + if (status != ARES_SUCCESS) { + goto done; + } + } + + /* Start with 1 label */ + label = ares_dns_labels_add(labels); + if (label == NULL) { + status = ARES_ENOMEM; + goto done; + } + + while (ares__buf_fetch_bytes(namebuf, &c, 1) == ARES_SUCCESS) { + /* New label */ + if (c == '.') { + label = ares_dns_labels_add(labels); + if (label == NULL) { + status = ARES_ENOMEM; + goto done; + } + continue; + } + + /* Escape */ + if (c == '\\') { + status = ares_parse_dns_name_escape(namebuf, label, validate_hostname); + if (status != ARES_SUCCESS) { + goto done; + } + continue; + } + + /* Output direct character */ + if (validate_hostname && !ares__is_hostnamech(c)) { + status = ARES_EBADNAME; + goto done; + } + + status = ares__buf_append_byte(label, c); + if (status != ARES_SUCCESS) { + goto done; + } + } + + /* Remove trailing blank label */ + if (ares__buf_len(ares_dns_labels_get_last(labels)) == 0) { + ares_dns_name_labels_del_last(labels); + } + + /* If someone passed in "." there could have been 2 blank labels, check for + * that */ + if (labels->num == 1 && + ares__buf_len(ares_dns_labels_get_last(labels)) == 0) { + ares_dns_name_labels_del_last(labels); + } + + /* Scan to make sure label lengths are valid */ + for (i = 0; i < labels->num; i++) { + size_t len = ares__buf_len(labels->label[i]); + /* No 0-length labels, and no labels over 63 bytes */ + if (len == 0 || len > 63) { + status = ARES_EBADNAME; + goto done; + } + total_len += len; + } + + /* Can't exceed maximum (unescaped) length */ + if (labels->num && total_len + labels->num - 1 > 255) { + status = ARES_EBADNAME; + goto done; + } + + status = ARES_SUCCESS; + +done: + ares__buf_destroy(namebuf); + if (status != ARES_SUCCESS) { + ares_dns_labels_free(labels); + } + return status; +} + +ares_status_t ares__dns_name_write(ares__buf_t *buf, ares__llist_t **list, + ares_bool_t validate_hostname, + const char *name) +{ + const ares_nameoffset_t *off = NULL; + size_t name_len; + size_t pos = ares__buf_len(buf); + ares_dns_labels_t labels; + char name_copy[512]; + ares_status_t status; + + if (buf == NULL || name == NULL) { + return ARES_EFORMERR; + } + + memset(&labels, 0, sizeof(labels)); + + /* NOTE: due to possible escaping, name_copy buffer is > 256 to allow for + * this */ + name_len = ares_strcpy(name_copy, name, sizeof(name_copy)); + + /* Find longest match */ + if (list != NULL) { + off = ares__nameoffset_find(*list, name_copy); + if (off != NULL && off->name_len != name_len) { + /* truncate */ + name_len -= (off->name_len + 1); + name_copy[name_len] = 0; + } + } + + /* Output labels */ + if (off == NULL || off->name_len != name_len) { + size_t i; + + status = ares_split_dns_name(&labels, validate_hostname, name_copy); + if (status != ARES_SUCCESS) { + goto done; + } + + for (i = 0; i < labels.num; i++) { + size_t len = 0; + const unsigned char *ptr = ares__buf_peek(labels.label[i], &len); + + status = ares__buf_append_byte(buf, (unsigned char)(len & 0xFF)); + if (status != ARES_SUCCESS) { + goto done; + } + + status = ares__buf_append(buf, ptr, len); + if (status != ARES_SUCCESS) { + goto done; + } + } + + /* If we are NOT jumping to another label, output terminator */ + if (off == NULL) { + status = ares__buf_append_byte(buf, 0); + if (status != ARES_SUCCESS) { + goto done; + } + } + } + + /* Output name compression offset jump */ + if (off != NULL) { + unsigned short u16 = + (unsigned short)0xC000 | (unsigned short)(off->idx & 0x3FFF); + status = ares__buf_append_be16(buf, u16); + if (status != ARES_SUCCESS) { + goto done; + } + } + + /* Store pointer for future jumps as long as its not an exact match for + * a prior entry */ + if (list != NULL && (off == NULL || off->name_len != name_len) && + name_len > 0) { + status = ares__nameoffset_create(list, name /* not truncated copy! */, pos); + if (status != ARES_SUCCESS) { + goto done; + } + } + + status = ARES_SUCCESS; + +done: + ares_dns_labels_free(&labels); + return status; +} + +/* Reserved characters for names that need to be escaped */ +static ares_bool_t is_reservedch(int ch) +{ + switch (ch) { + case '"': + case '.': + case ';': + case '\\': + case '(': + case ')': + case '@': + case '$': + return ARES_TRUE; + default: + break; + } + + return ARES_FALSE; +} + +static ares_status_t ares__fetch_dnsname_into_buf(ares__buf_t *buf, + ares__buf_t *dest, size_t len, + ares_bool_t is_hostname) +{ + size_t remaining_len; + const unsigned char *ptr = ares__buf_peek(buf, &remaining_len); + ares_status_t status; + size_t i; + + if (buf == NULL || len == 0 || remaining_len < len) { + return ARES_EBADRESP; + } + + for (i = 0; i < len; i++) { + unsigned char c = ptr[i]; + + /* Hostnames have a very specific allowed character set. Anything outside + * of that (non-printable and reserved included) are disallowed */ + if (is_hostname && !ares__is_hostnamech(c)) { + status = ARES_EBADRESP; + goto fail; + } + + /* NOTE: dest may be NULL if the user is trying to skip the name. validation + * still occurs above. */ + if (dest == NULL) { + continue; + } + + /* Non-printable characters need to be output as \DDD */ + if (!ares__isprint(c)) { + unsigned char escape[4]; + + escape[0] = '\\'; + escape[1] = '0' + (c / 100); + escape[2] = '0' + ((c % 100) / 10); + escape[3] = '0' + (c % 10); + + status = ares__buf_append(dest, escape, sizeof(escape)); + if (status != ARES_SUCCESS) { + goto fail; + } + + continue; + } + + /* Reserved characters need to be escaped, otherwise normal */ + if (is_reservedch(c)) { + status = ares__buf_append_byte(dest, '\\'); + if (status != ARES_SUCCESS) { + goto fail; + } + } + + status = ares__buf_append_byte(dest, c); + if (status != ARES_SUCCESS) { + return status; + } + } + + return ares__buf_consume(buf, len); + +fail: + return status; +} + +ares_status_t ares__dns_name_parse(ares__buf_t *buf, char **name, + ares_bool_t is_hostname) +{ + size_t save_offset = 0; + unsigned char c; + ares_status_t status; + ares__buf_t *namebuf = NULL; + size_t label_start = ares__buf_get_position(buf); + + if (buf == NULL) { + return ARES_EFORMERR; + } + + if (name != NULL) { + namebuf = ares__buf_create(); + if (namebuf == NULL) { + status = ARES_ENOMEM; + goto fail; + } + } + + /* The compression scheme allows a domain name in a message to be + * represented as either: + * + * - a sequence of labels ending in a zero octet + * - a pointer + * - a sequence of labels ending with a pointer + */ + while (1) { + /* Keep track of the minimum label starting position to prevent forward + * jumping */ + if (label_start > ares__buf_get_position(buf)) { + label_start = ares__buf_get_position(buf); + } + + status = ares__buf_fetch_bytes(buf, &c, 1); + if (status != ARES_SUCCESS) { + goto fail; + } + + /* Pointer/Redirect */ + if ((c & 0xc0) == 0xc0) { + /* The pointer takes the form of a two octet sequence: + * + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * | 1 1| OFFSET | + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * + * The first two bits are ones. This allows a pointer to be distinguished + * from a label, since the label must begin with two zero bits because + * labels are restricted to 63 octets or less. (The 10 and 01 + * combinations are reserved for future use.) The OFFSET field specifies + * an offset from the start of the message (i.e., the first octet of the + * ID field in the domain header). A zero offset specifies the first byte + * of the ID field, etc. + */ + size_t offset = (size_t)((c & 0x3F) << 8); + + /* Fetch second byte of the redirect length */ + status = ares__buf_fetch_bytes(buf, &c, 1); + if (status != ARES_SUCCESS) { + goto fail; + } + + offset |= ((size_t)c); + + /* According to RFC 1035 4.1.4: + * In this scheme, an entire domain name or a list of labels at + * the end of a domain name is replaced with a pointer to a prior + * occurrence of the same name. + * Note the word "prior", meaning it must go backwards. This was + * confirmed via the ISC BIND code that it also prevents forward + * pointers. + */ + if (offset >= label_start) { + status = ARES_EBADNAME; + goto fail; + } + + /* First time we make a jump, save the current position */ + if (save_offset == 0) { + save_offset = ares__buf_get_position(buf); + } + + status = ares__buf_set_position(buf, offset); + if (status != ARES_SUCCESS) { + status = ARES_EBADNAME; + goto fail; + } + + continue; + } else if ((c & 0xc0) != 0) { + /* 10 and 01 are reserved */ + status = ARES_EBADNAME; + goto fail; + } else if (c == 0) { + /* termination via zero octet*/ + break; + } + + /* New label */ + + /* Labels are separated by periods */ + if (ares__buf_len(namebuf) != 0 && name != NULL) { + status = ares__buf_append_byte(namebuf, '.'); + if (status != ARES_SUCCESS) { + goto fail; + } + } + + status = ares__fetch_dnsname_into_buf(buf, namebuf, c, is_hostname); + if (status != ARES_SUCCESS) { + goto fail; + } + } + + /* Restore offset read after first redirect/pointer as this is where the DNS + * message continues */ + if (save_offset) { + ares__buf_set_position(buf, save_offset); + } + + if (name != NULL) { + *name = ares__buf_finish_str(namebuf, NULL); + if (*name == NULL) { + status = ARES_ENOMEM; + goto fail; + } + } + + return ARES_SUCCESS; + +fail: + /* We want badname response if we couldn't parse */ + if (status == ARES_EBADRESP) { + status = ARES_EBADNAME; + } + + ares__buf_destroy(namebuf); + return status; +} diff --git a/lib/c-ares-1.23.0/src/lib/ares_dns_parse.c b/lib/c-ares-1.23.0/src/lib/ares_dns_parse.c new file mode 100644 index 00000000000..da26ffdc059 --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares_dns_parse.c @@ -0,0 +1,1234 @@ +/* MIT License + * + * Copyright (c) 2023 Brad House + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ +#include "ares_setup.h" +#include "ares.h" +#include "ares_private.h" +#include +#ifdef HAVE_STDINT_H +# include +#endif + +static size_t ares_dns_rr_remaining_len(const ares__buf_t *buf, size_t orig_len, + size_t rdlength) +{ + size_t used_len = orig_len - ares__buf_len(buf); + if (used_len >= rdlength) { + return 0; + } + return rdlength - used_len; +} + +static ares_status_t ares_dns_parse_and_set_dns_name(ares__buf_t *buf, + ares_bool_t is_hostname, + ares_dns_rr_t *rr, + ares_dns_rr_key_t key) +{ + ares_status_t status; + char *name = NULL; + + status = ares__dns_name_parse(buf, &name, is_hostname); + if (status != ARES_SUCCESS) { + return status; + } + + status = ares_dns_rr_set_str_own(rr, key, name); + if (status != ARES_SUCCESS) { + ares_free(name); + return status; + } + return ARES_SUCCESS; +} + +static ares_status_t ares_dns_parse_and_set_dns_str( + ares__buf_t *buf, size_t max_len, ares_bool_t allow_multiple, + ares_dns_rr_t *rr, ares_dns_rr_key_t key, ares_bool_t blank_allowed) +{ + ares_status_t status; + char *str = NULL; + + status = ares__buf_parse_dns_str(buf, max_len, &str, allow_multiple); + if (status != ARES_SUCCESS) { + return status; + } + + if (!blank_allowed && ares_strlen(str) == 0) { + ares_free(str); + return ARES_EBADRESP; + } + + status = ares_dns_rr_set_str_own(rr, key, str); + if (status != ARES_SUCCESS) { + ares_free(str); + return status; + } + return ARES_SUCCESS; +} + +static ares_status_t + ares_dns_parse_and_set_dns_binstr(ares__buf_t *buf, size_t max_len, + ares_bool_t allow_multiple, + ares_dns_rr_t *rr, ares_dns_rr_key_t key) +{ + ares_status_t status; + unsigned char *bin = NULL; + size_t bin_len = 0; + + status = + ares__buf_parse_dns_binstr(buf, max_len, &bin, &bin_len, allow_multiple); + if (status != ARES_SUCCESS) { + return status; + } + + status = ares_dns_rr_set_bin_own(rr, key, bin, bin_len); + if (status != ARES_SUCCESS) { + ares_free(bin); + return status; + } + return ARES_SUCCESS; +} + +static ares_status_t ares_dns_parse_and_set_be32(ares__buf_t *buf, + ares_dns_rr_t *rr, + ares_dns_rr_key_t key) +{ + ares_status_t status; + unsigned int u32; + + status = ares__buf_fetch_be32(buf, &u32); + if (status != ARES_SUCCESS) { + return status; + } + + return ares_dns_rr_set_u32(rr, key, u32); +} + +static ares_status_t ares_dns_parse_and_set_be16(ares__buf_t *buf, + ares_dns_rr_t *rr, + ares_dns_rr_key_t key) +{ + ares_status_t status; + unsigned short u16; + + status = ares__buf_fetch_be16(buf, &u16); + if (status != ARES_SUCCESS) { + return status; + } + + return ares_dns_rr_set_u16(rr, key, u16); +} + +static ares_status_t ares_dns_parse_and_set_u8(ares__buf_t *buf, + ares_dns_rr_t *rr, + ares_dns_rr_key_t key) +{ + ares_status_t status; + unsigned char u8; + + status = ares__buf_fetch_bytes(buf, &u8, 1); + if (status != ARES_SUCCESS) { + return status; + } + + return ares_dns_rr_set_u8(rr, key, u8); +} + +static ares_status_t ares_dns_parse_rr_a(ares__buf_t *buf, ares_dns_rr_t *rr, + size_t rdlength) +{ + struct in_addr addr; + ares_status_t status; + + (void)rdlength; /* Not needed */ + + status = ares__buf_fetch_bytes(buf, (unsigned char *)&addr, sizeof(addr)); + if (status != ARES_SUCCESS) { + return status; + } + + return ares_dns_rr_set_addr(rr, ARES_RR_A_ADDR, &addr); +} + +static ares_status_t ares_dns_parse_rr_ns(ares__buf_t *buf, ares_dns_rr_t *rr, + size_t rdlength) +{ + (void)rdlength; /* Not needed */ + + return ares_dns_parse_and_set_dns_name(buf, ARES_FALSE, rr, + ARES_RR_NS_NSDNAME); +} + +static ares_status_t ares_dns_parse_rr_cname(ares__buf_t *buf, + ares_dns_rr_t *rr, size_t rdlength) +{ + (void)rdlength; /* Not needed */ + + return ares_dns_parse_and_set_dns_name(buf, ARES_FALSE, rr, + ARES_RR_CNAME_CNAME); +} + +static ares_status_t ares_dns_parse_rr_soa(ares__buf_t *buf, ares_dns_rr_t *rr, + size_t rdlength) +{ + ares_status_t status; + + (void)rdlength; /* Not needed */ + + /* MNAME */ + status = + ares_dns_parse_and_set_dns_name(buf, ARES_FALSE, rr, ARES_RR_SOA_MNAME); + if (status != ARES_SUCCESS) { + return status; + } + + /* RNAME */ + status = + ares_dns_parse_and_set_dns_name(buf, ARES_FALSE, rr, ARES_RR_SOA_RNAME); + if (status != ARES_SUCCESS) { + return status; + } + + /* SERIAL */ + status = ares_dns_parse_and_set_be32(buf, rr, ARES_RR_SOA_SERIAL); + if (status != ARES_SUCCESS) { + return status; + } + + /* REFRESH */ + status = ares_dns_parse_and_set_be32(buf, rr, ARES_RR_SOA_REFRESH); + if (status != ARES_SUCCESS) { + return status; + } + + /* RETRY */ + status = ares_dns_parse_and_set_be32(buf, rr, ARES_RR_SOA_RETRY); + if (status != ARES_SUCCESS) { + return status; + } + + /* EXPIRE */ + status = ares_dns_parse_and_set_be32(buf, rr, ARES_RR_SOA_EXPIRE); + if (status != ARES_SUCCESS) { + return status; + } + + /* MINIMUM */ + return ares_dns_parse_and_set_be32(buf, rr, ARES_RR_SOA_MINIMUM); +} + +static ares_status_t ares_dns_parse_rr_ptr(ares__buf_t *buf, ares_dns_rr_t *rr, + size_t rdlength) +{ + (void)rdlength; /* Not needed */ + + return ares_dns_parse_and_set_dns_name(buf, ARES_FALSE, rr, + ARES_RR_PTR_DNAME); +} + +static ares_status_t ares_dns_parse_rr_hinfo(ares__buf_t *buf, + ares_dns_rr_t *rr, size_t rdlength) +{ + ares_status_t status; + size_t orig_len = ares__buf_len(buf); + + (void)rdlength; /* Not needed */ + + /* CPU */ + status = ares_dns_parse_and_set_dns_str( + buf, ares_dns_rr_remaining_len(buf, orig_len, rdlength), ARES_FALSE, rr, + ARES_RR_HINFO_CPU, ARES_TRUE); + if (status != ARES_SUCCESS) { + return status; + } + + /* OS */ + status = ares_dns_parse_and_set_dns_str( + buf, ares_dns_rr_remaining_len(buf, orig_len, rdlength), ARES_FALSE, rr, + ARES_RR_HINFO_OS, ARES_TRUE); + + return status; +} + +static ares_status_t ares_dns_parse_rr_mx(ares__buf_t *buf, ares_dns_rr_t *rr, + size_t rdlength) +{ + ares_status_t status; + + (void)rdlength; /* Not needed */ + + /* PREFERENCE */ + status = ares_dns_parse_and_set_be16(buf, rr, ARES_RR_MX_PREFERENCE); + if (status != ARES_SUCCESS) { + return status; + } + + /* EXCHANGE */ + return ares_dns_parse_and_set_dns_name(buf, ARES_FALSE, rr, + ARES_RR_MX_EXCHANGE); +} + +static ares_status_t ares_dns_parse_rr_txt(ares__buf_t *buf, ares_dns_rr_t *rr, + size_t rdlength) +{ + return ares_dns_parse_and_set_dns_binstr(buf, rdlength, ARES_TRUE, rr, + ARES_RR_TXT_DATA); +} + +static ares_status_t ares_dns_parse_rr_aaaa(ares__buf_t *buf, ares_dns_rr_t *rr, + size_t rdlength) +{ + struct ares_in6_addr addr; + ares_status_t status; + + (void)rdlength; /* Not needed */ + + status = ares__buf_fetch_bytes(buf, (unsigned char *)&addr, sizeof(addr)); + if (status != ARES_SUCCESS) { + return status; + } + + return ares_dns_rr_set_addr6(rr, ARES_RR_AAAA_ADDR, &addr); +} + +static ares_status_t ares_dns_parse_rr_srv(ares__buf_t *buf, ares_dns_rr_t *rr, + size_t rdlength) +{ + ares_status_t status; + + (void)rdlength; /* Not needed */ + + /* PRIORITY */ + status = ares_dns_parse_and_set_be16(buf, rr, ARES_RR_SRV_PRIORITY); + if (status != ARES_SUCCESS) { + return status; + } + + /* WEIGHT */ + status = ares_dns_parse_and_set_be16(buf, rr, ARES_RR_SRV_WEIGHT); + if (status != ARES_SUCCESS) { + return status; + } + + /* PORT */ + status = ares_dns_parse_and_set_be16(buf, rr, ARES_RR_SRV_PORT); + if (status != ARES_SUCCESS) { + return status; + } + + /* TARGET */ + return ares_dns_parse_and_set_dns_name(buf, ARES_FALSE, rr, + ARES_RR_SRV_TARGET); +} + +static ares_status_t ares_dns_parse_rr_naptr(ares__buf_t *buf, + ares_dns_rr_t *rr, size_t rdlength) +{ + ares_status_t status; + size_t orig_len = ares__buf_len(buf); + + /* ORDER */ + status = ares_dns_parse_and_set_be16(buf, rr, ARES_RR_NAPTR_ORDER); + if (status != ARES_SUCCESS) { + return status; + } + + /* PREFERENCE */ + status = ares_dns_parse_and_set_be16(buf, rr, ARES_RR_NAPTR_PREFERENCE); + if (status != ARES_SUCCESS) { + return status; + } + + /* FLAGS */ + status = ares_dns_parse_and_set_dns_str( + buf, ares_dns_rr_remaining_len(buf, orig_len, rdlength), ARES_FALSE, rr, + ARES_RR_NAPTR_FLAGS, ARES_TRUE); + if (status != ARES_SUCCESS) { + return status; + } + + /* SERVICES */ + status = ares_dns_parse_and_set_dns_str( + buf, ares_dns_rr_remaining_len(buf, orig_len, rdlength), ARES_FALSE, rr, + ARES_RR_NAPTR_SERVICES, ARES_TRUE); + if (status != ARES_SUCCESS) { + return status; + } + + /* REGEXP */ + status = ares_dns_parse_and_set_dns_str( + buf, ares_dns_rr_remaining_len(buf, orig_len, rdlength), ARES_FALSE, rr, + ARES_RR_NAPTR_REGEXP, ARES_TRUE); + if (status != ARES_SUCCESS) { + return status; + } + + /* REPLACEMENT */ + return ares_dns_parse_and_set_dns_name(buf, ARES_FALSE, rr, + ARES_RR_NAPTR_REPLACEMENT); +} + +static ares_status_t ares_dns_parse_rr_opt(ares__buf_t *buf, ares_dns_rr_t *rr, + size_t rdlength, + unsigned short raw_class, + unsigned int raw_ttl) +{ + ares_status_t status; + size_t orig_len = ares__buf_len(buf); + unsigned short rcode_high; + + status = ares_dns_rr_set_u16(rr, ARES_RR_OPT_UDP_SIZE, raw_class); + if (status != ARES_SUCCESS) { + return status; + } + + /* First 8 bits of TTL are an extended RCODE, and they go in the higher order + * after the original 4-bit rcode */ + rcode_high = (unsigned short)((raw_ttl >> 20) & 0x0FF0); + rr->parent->raw_rcode |= rcode_high; + + status = ares_dns_rr_set_u8(rr, ARES_RR_OPT_VERSION, + (unsigned char)(raw_ttl >> 16) & 0xFF); + if (status != ARES_SUCCESS) { + return status; + } + + status = ares_dns_rr_set_u16(rr, ARES_RR_OPT_FLAGS, + (unsigned short)(raw_ttl & 0xFFFF)); + if (status != ARES_SUCCESS) { + return status; + } + + /* Parse options */ + while (ares_dns_rr_remaining_len(buf, orig_len, rdlength)) { + unsigned short opt = 0; + unsigned short len = 0; + unsigned char *val = NULL; + + /* Fetch be16 option */ + status = ares__buf_fetch_be16(buf, &opt); + if (status != ARES_SUCCESS) { + return status; + } + + /* Fetch be16 length */ + status = ares__buf_fetch_be16(buf, &len); + if (status != ARES_SUCCESS) { + return status; + } + + if (len) { + status = ares__buf_fetch_bytes_dup(buf, len, ARES_TRUE, &val); + if (status != ARES_SUCCESS) { + return status; + } + } + + status = ares_dns_rr_set_opt_own(rr, ARES_RR_OPT_OPTIONS, opt, val, len); + if (status != ARES_SUCCESS) { + return status; + } + } + + return ARES_SUCCESS; +} + +static ares_status_t ares_dns_parse_rr_tlsa(ares__buf_t *buf, ares_dns_rr_t *rr, + size_t rdlength) +{ + ares_status_t status; + size_t orig_len = ares__buf_len(buf); + size_t len; + unsigned char *data; + + status = ares_dns_parse_and_set_u8(buf, rr, ARES_RR_TLSA_CERT_USAGE); + if (status != ARES_SUCCESS) { + return status; + } + + status = ares_dns_parse_and_set_u8(buf, rr, ARES_RR_TLSA_SELECTOR); + if (status != ARES_SUCCESS) { + return status; + } + + status = ares_dns_parse_and_set_u8(buf, rr, ARES_RR_TLSA_MATCH); + if (status != ARES_SUCCESS) { + return status; + } + + len = ares_dns_rr_remaining_len(buf, orig_len, rdlength); + if (len == 0) { + return ARES_EBADRESP; + } + + status = ares__buf_fetch_bytes_dup(buf, len, ARES_FALSE, &data); + if (status != ARES_SUCCESS) { + return status; + } + + status = ares_dns_rr_set_bin_own(rr, ARES_RR_TLSA_DATA, data, len); + if (status != ARES_SUCCESS) { + ares_free(data); + return status; + } + + return ARES_SUCCESS; +} + +static ares_status_t ares_dns_parse_rr_svcb(ares__buf_t *buf, ares_dns_rr_t *rr, + size_t rdlength) +{ + ares_status_t status; + size_t orig_len = ares__buf_len(buf); + + status = ares_dns_parse_and_set_be16(buf, rr, ARES_RR_SVCB_PRIORITY); + if (status != ARES_SUCCESS) { + return status; + } + + status = + ares_dns_parse_and_set_dns_name(buf, ARES_FALSE, rr, ARES_RR_SVCB_TARGET); + if (status != ARES_SUCCESS) { + return status; + } + + /* Parse params */ + while (ares_dns_rr_remaining_len(buf, orig_len, rdlength)) { + unsigned short opt = 0; + unsigned short len = 0; + unsigned char *val = NULL; + + /* Fetch be16 option */ + status = ares__buf_fetch_be16(buf, &opt); + if (status != ARES_SUCCESS) { + return status; + } + + /* Fetch be16 length */ + status = ares__buf_fetch_be16(buf, &len); + if (status != ARES_SUCCESS) { + return status; + } + + if (len) { + status = ares__buf_fetch_bytes_dup(buf, len, ARES_TRUE, &val); + if (status != ARES_SUCCESS) { + return status; + } + } + + status = ares_dns_rr_set_opt_own(rr, ARES_RR_SVCB_PARAMS, opt, val, len); + if (status != ARES_SUCCESS) { + return status; + } + } + + return ARES_SUCCESS; +} + +static ares_status_t ares_dns_parse_rr_https(ares__buf_t *buf, + ares_dns_rr_t *rr, size_t rdlength) +{ + ares_status_t status; + size_t orig_len = ares__buf_len(buf); + + status = ares_dns_parse_and_set_be16(buf, rr, ARES_RR_HTTPS_PRIORITY); + if (status != ARES_SUCCESS) { + return status; + } + + status = + ares_dns_parse_and_set_dns_name(buf, ARES_FALSE, rr, ARES_RR_HTTPS_TARGET); + if (status != ARES_SUCCESS) { + return status; + } + + /* Parse params */ + while (ares_dns_rr_remaining_len(buf, orig_len, rdlength)) { + unsigned short opt = 0; + unsigned short len = 0; + unsigned char *val = NULL; + + /* Fetch be16 option */ + status = ares__buf_fetch_be16(buf, &opt); + if (status != ARES_SUCCESS) { + return status; + } + + /* Fetch be16 length */ + status = ares__buf_fetch_be16(buf, &len); + if (status != ARES_SUCCESS) { + return status; + } + + if (len) { + status = ares__buf_fetch_bytes_dup(buf, len, ARES_TRUE, &val); + if (status != ARES_SUCCESS) { + return status; + } + } + + status = ares_dns_rr_set_opt_own(rr, ARES_RR_HTTPS_PARAMS, opt, val, len); + if (status != ARES_SUCCESS) { + return status; + } + } + + return ARES_SUCCESS; +} + +static ares_status_t ares_dns_parse_rr_uri(ares__buf_t *buf, ares_dns_rr_t *rr, + size_t rdlength) +{ + char *name = NULL; + ares_status_t status; + size_t orig_len = ares__buf_len(buf); + size_t remaining_len; + + /* PRIORITY */ + status = ares_dns_parse_and_set_be16(buf, rr, ARES_RR_URI_PRIORITY); + if (status != ARES_SUCCESS) { + return status; + } + + /* WEIGHT */ + status = ares_dns_parse_and_set_be16(buf, rr, ARES_RR_URI_WEIGHT); + if (status != ARES_SUCCESS) { + return status; + } + + /* TARGET -- not in string format, rest of buffer, required to be + * non-zero length */ + remaining_len = ares_dns_rr_remaining_len(buf, orig_len, rdlength); + if (remaining_len == 0) { + status = ARES_EBADRESP; + return status; + } + + /* NOTE: Not in DNS string format */ + status = ares__buf_fetch_str_dup(buf, remaining_len, &name); + if (status != ARES_SUCCESS) { + return status; + } + + status = ares_dns_rr_set_str_own(rr, ARES_RR_URI_TARGET, name); + if (status != ARES_SUCCESS) { + ares_free(name); + return status; + } + name = NULL; + + return ARES_SUCCESS; +} + +static ares_status_t ares_dns_parse_rr_caa(ares__buf_t *buf, ares_dns_rr_t *rr, + size_t rdlength) +{ + unsigned char *data = NULL; + size_t data_len = 0; + ares_status_t status; + size_t orig_len = ares__buf_len(buf); + + /* CRITICAL */ + status = ares_dns_parse_and_set_u8(buf, rr, ARES_RR_CAA_CRITICAL); + if (status != ARES_SUCCESS) { + return status; + } + + /* Tag */ + status = ares_dns_parse_and_set_dns_str( + buf, ares_dns_rr_remaining_len(buf, orig_len, rdlength), ARES_FALSE, rr, + ARES_RR_CAA_TAG, ARES_FALSE); + if (status != ARES_SUCCESS) { + return status; + } + + /* Value - binary! (remaining buffer */ + data_len = ares_dns_rr_remaining_len(buf, orig_len, rdlength); + if (data_len == 0) { + status = ARES_EBADRESP; + return status; + } + status = ares__buf_fetch_bytes_dup(buf, data_len, ARES_TRUE, &data); + if (status != ARES_SUCCESS) { + return status; + } + + status = ares_dns_rr_set_bin_own(rr, ARES_RR_CAA_VALUE, data, data_len); + if (status != ARES_SUCCESS) { + ares_free(data); + return status; + } + data = NULL; + + return ARES_SUCCESS; +} + +static ares_status_t ares_dns_parse_rr_raw_rr(ares__buf_t *buf, + ares_dns_rr_t *rr, + size_t rdlength, + unsigned short raw_type) +{ + ares_status_t status; + unsigned char *bytes = NULL; + + if (rdlength == 0) { + return ARES_SUCCESS; + } + + status = ares__buf_fetch_bytes_dup(buf, rdlength, ARES_FALSE, &bytes); + if (status != ARES_SUCCESS) { + return status; + } + + /* Can't fail */ + status = ares_dns_rr_set_u16(rr, ARES_RR_RAW_RR_TYPE, raw_type); + if (status != ARES_SUCCESS) { + ares_free(bytes); + return status; + } + + status = ares_dns_rr_set_bin_own(rr, ARES_RR_RAW_RR_DATA, bytes, rdlength); + if (status != ARES_SUCCESS) { + ares_free(bytes); + return status; + } + + return ARES_SUCCESS; +} + +static ares_status_t ares_dns_parse_header(ares__buf_t *buf, unsigned int flags, + ares_dns_record_t **dnsrec, + unsigned short *qdcount, + unsigned short *ancount, + unsigned short *nscount, + unsigned short *arcount) +{ + ares_status_t status = ARES_EBADRESP; + unsigned short u16; + unsigned short id; + unsigned short dns_flags = 0; + ares_dns_opcode_t opcode; + unsigned short rcode; + + (void)flags; /* currently unused */ + + if (buf == NULL || dnsrec == NULL || qdcount == NULL || ancount == NULL || + nscount == NULL || arcount == NULL) { + return ARES_EFORMERR; + } + + *dnsrec = NULL; + + /* + * RFC 1035 4.1.1. Header section format. + * and Updated by RFC 2065 to add AD and CD bits. + * 1 1 1 1 1 1 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * | ID | + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * |QR| Opcode |AA|TC|RD|RA| Z|AD|CD| RCODE | + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * | QDCOUNT | + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * | ANCOUNT | + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * | NSCOUNT | + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * | ARCOUNT | + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + */ + + /* ID */ + status = ares__buf_fetch_be16(buf, &id); + if (status != ARES_SUCCESS) { + goto fail; + } + + /* Flags */ + status = ares__buf_fetch_be16(buf, &u16); + if (status != ARES_SUCCESS) { + goto fail; + } + + /* QR */ + if (u16 & 0x8000) { + dns_flags |= ARES_FLAG_QR; + } + + /* OPCODE */ + opcode = (u16 >> 11) & 0xf; + + /* AA */ + if (u16 & 0x400) { + dns_flags |= ARES_FLAG_AA; + } + + /* TC */ + if (u16 & 0x200) { + dns_flags |= ARES_FLAG_TC; + } + + /* RD */ + if (u16 & 0x100) { + dns_flags |= ARES_FLAG_RD; + } + + /* RA */ + if (u16 & 0x80) { + dns_flags |= ARES_FLAG_RA; + } + + /* Z -- unused */ + + /* AD */ + if (u16 & 0x20) { + dns_flags |= ARES_FLAG_AD; + } + + /* CD */ + if (u16 & 0x10) { + dns_flags |= ARES_FLAG_CD; + } + + /* RCODE */ + rcode = u16 & 0xf; + + /* QDCOUNT */ + status = ares__buf_fetch_be16(buf, qdcount); + if (status != ARES_SUCCESS) { + goto fail; + } + + /* ANCOUNT */ + status = ares__buf_fetch_be16(buf, ancount); + if (status != ARES_SUCCESS) { + goto fail; + } + + /* NSCOUNT */ + status = ares__buf_fetch_be16(buf, nscount); + if (status != ARES_SUCCESS) { + goto fail; + } + + /* ARCOUNT */ + status = ares__buf_fetch_be16(buf, arcount); + if (status != ARES_SUCCESS) { + goto fail; + } + + status = ares_dns_record_create(dnsrec, id, dns_flags, opcode, + ARES_RCODE_NOERROR /* Temporary */); + if (status != ARES_SUCCESS) { + goto fail; + } + + (*dnsrec)->raw_rcode = rcode; + + if (*ancount > 0) { + status = + ares_dns_record_rr_prealloc(*dnsrec, ARES_SECTION_ANSWER, *ancount); + if (status != ARES_SUCCESS) { + goto fail; + } + } + + if (*nscount > 0) { + status = + ares_dns_record_rr_prealloc(*dnsrec, ARES_SECTION_AUTHORITY, *nscount); + if (status != ARES_SUCCESS) { + goto fail; + } + } + + if (*arcount > 0) { + status = + ares_dns_record_rr_prealloc(*dnsrec, ARES_SECTION_ADDITIONAL, *arcount); + if (status != ARES_SUCCESS) { + goto fail; + } + } + + return ARES_SUCCESS; + +fail: + ares_dns_record_destroy(*dnsrec); + *dnsrec = NULL; + *qdcount = 0; + *ancount = 0; + *nscount = 0; + *arcount = 0; + + return status; +} + +static ares_status_t + ares_dns_parse_rr_data(ares__buf_t *buf, size_t rdlength, ares_dns_rr_t *rr, + ares_dns_rec_type_t type, unsigned short raw_type, + unsigned short raw_class, unsigned int raw_ttl) +{ + switch (type) { + case ARES_REC_TYPE_A: + return ares_dns_parse_rr_a(buf, rr, rdlength); + case ARES_REC_TYPE_NS: + return ares_dns_parse_rr_ns(buf, rr, rdlength); + case ARES_REC_TYPE_CNAME: + return ares_dns_parse_rr_cname(buf, rr, rdlength); + case ARES_REC_TYPE_SOA: + return ares_dns_parse_rr_soa(buf, rr, rdlength); + case ARES_REC_TYPE_PTR: + return ares_dns_parse_rr_ptr(buf, rr, rdlength); + case ARES_REC_TYPE_HINFO: + return ares_dns_parse_rr_hinfo(buf, rr, rdlength); + case ARES_REC_TYPE_MX: + return ares_dns_parse_rr_mx(buf, rr, rdlength); + case ARES_REC_TYPE_TXT: + return ares_dns_parse_rr_txt(buf, rr, rdlength); + case ARES_REC_TYPE_AAAA: + return ares_dns_parse_rr_aaaa(buf, rr, rdlength); + case ARES_REC_TYPE_SRV: + return ares_dns_parse_rr_srv(buf, rr, rdlength); + case ARES_REC_TYPE_NAPTR: + return ares_dns_parse_rr_naptr(buf, rr, rdlength); + case ARES_REC_TYPE_ANY: + return ARES_EBADRESP; + case ARES_REC_TYPE_OPT: + return ares_dns_parse_rr_opt(buf, rr, rdlength, raw_class, raw_ttl); + case ARES_REC_TYPE_TLSA: + return ares_dns_parse_rr_tlsa(buf, rr, rdlength); + case ARES_REC_TYPE_SVCB: + return ares_dns_parse_rr_svcb(buf, rr, rdlength); + case ARES_REC_TYPE_HTTPS: + return ares_dns_parse_rr_https(buf, rr, rdlength); + case ARES_REC_TYPE_URI: + return ares_dns_parse_rr_uri(buf, rr, rdlength); + case ARES_REC_TYPE_CAA: + return ares_dns_parse_rr_caa(buf, rr, rdlength); + case ARES_REC_TYPE_RAW_RR: + return ares_dns_parse_rr_raw_rr(buf, rr, rdlength, raw_type); + } + return ARES_EFORMERR; +} + +static ares_status_t ares_dns_parse_qd(ares__buf_t *buf, + ares_dns_record_t *dnsrec) +{ + char *name = NULL; + unsigned short u16; + ares_status_t status; + ares_dns_rec_type_t type; + ares_dns_class_t qclass; + /* The question section is used to carry the "question" in most queries, + * i.e., the parameters that define what is being asked. The section + * contains QDCOUNT (usually 1) entries, each of the following format: + * 1 1 1 1 1 1 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * | | + * / QNAME / + * / / + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * | QTYPE | + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * | QCLASS | + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + */ + + /* Name */ + status = ares__dns_name_parse(buf, &name, ARES_FALSE); + if (status != ARES_SUCCESS) { + goto done; + } + + /* Type */ + status = ares__buf_fetch_be16(buf, &u16); + if (status != ARES_SUCCESS) { + goto done; + } + type = u16; + + /* Class */ + status = ares__buf_fetch_be16(buf, &u16); + if (status != ARES_SUCCESS) { + goto done; + } + qclass = u16; + + /* Add question */ + status = ares_dns_record_query_add(dnsrec, name, type, qclass); + if (status != ARES_SUCCESS) { + goto done; + } + +done: + ares_free(name); + return status; +} + +static ares_status_t ares_dns_parse_rr(ares__buf_t *buf, unsigned int flags, + ares_dns_section_t sect, + ares_dns_record_t *dnsrec) +{ + char *name = NULL; + unsigned short u16; + unsigned short raw_type; + ares_status_t status; + ares_dns_rec_type_t type; + ares_dns_class_t qclass; + unsigned int ttl; + size_t rdlength; + ares_dns_rr_t *rr = NULL; + size_t remaining_len = 0; + size_t processed_len = 0; + + (void)flags; /* currently unused */ + + /* All RRs have the same top level format shown below: + * 1 1 1 1 1 1 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * | | + * / / + * / NAME / + * | | + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * | TYPE | + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * | CLASS | + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * | TTL | + * | | + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * | RDLENGTH | + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--| + * / RDATA / + * / / + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + */ + + /* Name */ + status = ares__dns_name_parse(buf, &name, ARES_FALSE); + if (status != ARES_SUCCESS) { + goto done; + } + + /* Type */ + status = ares__buf_fetch_be16(buf, &u16); + if (status != ARES_SUCCESS) { + goto done; + } + type = u16; + raw_type = u16; /* Only used for raw rr data */ + + /* Class */ + status = ares__buf_fetch_be16(buf, &u16); + if (status != ARES_SUCCESS) { + goto done; + } + qclass = u16; + + /* TTL */ + status = ares__buf_fetch_be32(buf, &ttl); + if (status != ARES_SUCCESS) { + goto done; + } + + /* Length */ + status = ares__buf_fetch_be16(buf, &u16); + if (status != ARES_SUCCESS) { + goto done; + } + rdlength = u16; + + if (!ares_dns_rec_type_isvalid(type, ARES_FALSE)) { + type = ARES_REC_TYPE_RAW_RR; + } + + /* Pull into another buffer for safety */ + if (rdlength > ares__buf_len(buf)) { + status = ARES_EBADRESP; + goto done; + } + + /* Add the base rr */ + status = + ares_dns_record_rr_add(&rr, dnsrec, sect, name, type, + type == ARES_REC_TYPE_OPT ? ARES_CLASS_IN : qclass, + type == ARES_REC_TYPE_OPT ? 0 : ttl); + if (status != ARES_SUCCESS) { + goto done; + } + + /* Record the current remaining length in the buffer so we can tell how + * much was processed */ + remaining_len = ares__buf_len(buf); + + /* Fill in the data for the rr */ + status = ares_dns_parse_rr_data(buf, rdlength, rr, type, raw_type, + (unsigned short)qclass, ttl); + if (status != ARES_SUCCESS) { + goto done; + } + + /* Determine how many bytes were processed */ + processed_len = remaining_len - ares__buf_len(buf); + + /* If too many bytes were processed, error! */ + if (processed_len > rdlength) { + status = ARES_EBADRESP; + goto done; + } + + /* If too few bytes were processed, consume the unprocessed data for this + * record as the parser may not have wanted/needed to use it */ + if (processed_len < rdlength) { + ares__buf_consume(buf, rdlength - processed_len); + } + + +done: + ares_free(name); + return status; +} + +static ares_status_t ares_dns_parse_buf(ares__buf_t *buf, unsigned int flags, + ares_dns_record_t **dnsrec) +{ + ares_status_t status; + unsigned short qdcount; + unsigned short ancount; + unsigned short nscount; + unsigned short arcount; + unsigned short i; + + if (buf == NULL || dnsrec == NULL) { + return ARES_EFORMERR; + } + + /* All communications inside of the domain protocol are carried in a single + * format called a message. The top level format of message is divided + * into 5 sections (some of which are empty in certain cases) shown below: + * + * +---------------------+ + * | Header | + * +---------------------+ + * | Question | the question for the name server + * +---------------------+ + * | Answer | RRs answering the question + * +---------------------+ + * | Authority | RRs pointing toward an authority + * +---------------------+ + * | Additional | RRs holding additional information + * +---------------------+ + */ + + /* Parse header */ + status = ares_dns_parse_header(buf, flags, dnsrec, &qdcount, &ancount, + &nscount, &arcount); + if (status != ARES_SUCCESS) { + goto fail; + } + + /* Must have questions */ + if (qdcount == 0) { + status = ARES_EBADRESP; + goto fail; + } + + /* XXX: this should be controlled by a flag in case we want to allow + * multiple questions. I think mDNS allows this */ + if (qdcount > 1) { + status = ARES_EBADRESP; + goto fail; + } + + /* Parse questions */ + for (i = 0; i < qdcount; i++) { + status = ares_dns_parse_qd(buf, *dnsrec); + if (status != ARES_SUCCESS) { + goto fail; + } + } + + /* Parse Answers */ + for (i = 0; i < ancount; i++) { + status = ares_dns_parse_rr(buf, flags, ARES_SECTION_ANSWER, *dnsrec); + if (status != ARES_SUCCESS) { + goto fail; + } + } + + /* Parse Authority */ + for (i = 0; i < nscount; i++) { + status = ares_dns_parse_rr(buf, flags, ARES_SECTION_AUTHORITY, *dnsrec); + if (status != ARES_SUCCESS) { + goto fail; + } + } + + /* Parse Additional */ + for (i = 0; i < arcount; i++) { + status = ares_dns_parse_rr(buf, flags, ARES_SECTION_ADDITIONAL, *dnsrec); + if (status != ARES_SUCCESS) { + goto fail; + } + } + + /* Finalize rcode now that if we have OPT it is processed */ + if (!ares_dns_rcode_isvalid((*dnsrec)->raw_rcode)) { + (*dnsrec)->rcode = ARES_RCODE_SERVFAIL; + } else { + (*dnsrec)->rcode = (ares_dns_rcode_t)(*dnsrec)->raw_rcode; + } + + return ARES_SUCCESS; + +fail: + ares_dns_record_destroy(*dnsrec); + *dnsrec = NULL; + return status; +} + +ares_status_t ares_dns_parse(const unsigned char *buf, size_t buf_len, + unsigned int flags, ares_dns_record_t **dnsrec) +{ + ares__buf_t *parser = NULL; + ares_status_t status; + + if (buf == NULL || buf_len == 0 || dnsrec == NULL) { + return ARES_EFORMERR; + } + + parser = ares__buf_create_const(buf, buf_len); + if (parser == NULL) { + return ARES_ENOMEM; + } + + status = ares_dns_parse_buf(parser, flags, dnsrec); + ares__buf_destroy(parser); + + return status; +} diff --git a/lib/c-ares-1.23.0/src/lib/ares_dns_private.h b/lib/c-ares-1.23.0/src/lib/ares_dns_private.h new file mode 100644 index 00000000000..91635e74cd8 --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares_dns_private.h @@ -0,0 +1,236 @@ +/* MIT License + * + * Copyright (c) 2023 Brad House + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ +#ifndef __ARES_DNS_PRIVATE_H +#define __ARES_DNS_PRIVATE_H + +ares_bool_t ares_dns_rec_type_allow_name_compression(ares_dns_rec_type_t type); +ares_bool_t ares_dns_opcode_isvalid(ares_dns_opcode_t opcode); +ares_bool_t ares_dns_rcode_isvalid(ares_dns_rcode_t rcode); +ares_bool_t ares_dns_flags_arevalid(unsigned short flags); +ares_bool_t ares_dns_rec_type_isvalid(ares_dns_rec_type_t type, + ares_bool_t is_query); +ares_bool_t ares_dns_class_isvalid(ares_dns_class_t qclass, + ares_bool_t is_query); +ares_bool_t ares_dns_section_isvalid(ares_dns_section_t sect); +ares_status_t ares_dns_rr_set_str_own(ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key, char *val); +ares_status_t ares_dns_rr_set_bin_own(ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key, unsigned char *val, + size_t len); +ares_status_t ares_dns_rr_set_opt_own(ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key, unsigned short opt, + unsigned char *val, size_t val_len); +ares_status_t ares_dns_record_rr_prealloc(ares_dns_record_t *dnsrec, + ares_dns_section_t sect, size_t cnt); +ares_bool_t ares_dns_has_opt_rr(const ares_dns_record_t *rec); +void ares_dns_record_write_ttl_decrement(ares_dns_record_t *dnsrec, + unsigned int ttl_decrement); + +struct ares_dns_qd { + char *name; + ares_dns_rec_type_t qtype; + ares_dns_class_t qclass; +}; + +typedef struct { + struct in_addr addr; +} ares__dns_a_t; + +typedef struct { + char *nsdname; +} ares__dns_ns_t; + +typedef struct { + char *cname; +} ares__dns_cname_t; + +typedef struct { + char *mname; + char *rname; + unsigned int serial; + unsigned int refresh; + unsigned int retry; + unsigned int expire; + unsigned int minimum; +} ares__dns_soa_t; + +typedef struct { + char *dname; +} ares__dns_ptr_t; + +typedef struct { + char *cpu; + char *os; +} ares__dns_hinfo_t; + +typedef struct { + unsigned short preference; + char *exchange; +} ares__dns_mx_t; + +typedef struct { + char *data; + size_t data_len; +} ares__dns_txt_t; + +typedef struct { + struct ares_in6_addr addr; +} ares__dns_aaaa_t; + +typedef struct { + unsigned short priority; + unsigned short weight; + unsigned short port; + char *target; +} ares__dns_srv_t; + +typedef struct { + unsigned short order; + unsigned short preference; + char *flags; + char *services; + char *regexp; + char *replacement; +} ares__dns_naptr_t; + +typedef struct { + unsigned short opt; + unsigned char *val; + size_t val_len; +} ares__dns_optval_t; + +typedef struct { + ares__dns_optval_t *optval; /*!< Attribute/value pairs */ + size_t cnt; /*!< Count of Attribute/Value pairs */ + size_t alloc; /*!< Allocated count of attribute/value + * pairs */ +} ares__dns_options_t; + +typedef struct { + unsigned short udp_size; /*!< taken from class */ + unsigned char version; /*!< taken from bits 8-16 of ttl */ + unsigned short flags; /*!< Flags, remaining 16 bits, though only + * 1 currently defined */ + ares__dns_options_t *options; /*!< Attribute/Value pairs */ +} ares__dns_opt_t; + +typedef struct { + unsigned char cert_usage; + unsigned char selector; + unsigned char match; + unsigned char *data; + size_t data_len; +} ares__dns_tlsa_t; + +typedef struct { + unsigned short priority; + char *target; + ares__dns_options_t *params; +} ares__dns_svcb_t; + +typedef struct { + unsigned short priority; + unsigned short weight; + char *target; +} ares__dns_uri_t; + +typedef struct { + unsigned char critical; + char *tag; + unsigned char *value; + size_t value_len; +} ares__dns_caa_t; + +/*! Raw, unparsed RR data */ +typedef struct { + unsigned short type; /*!< Not ares_rec_type_t because it likely isn't one + * of those values since it wasn't parsed */ + unsigned char *data; /*!< Raw RR data */ + size_t length; /*!< Length of raw RR data */ +} ares__dns_raw_rr_t; + +/*! DNS RR data structure */ +struct ares_dns_rr { + ares_dns_record_t *parent; + char *name; + ares_dns_rec_type_t type; + ares_dns_class_t rclass; + unsigned int ttl; + + union { + ares__dns_a_t a; + ares__dns_ns_t ns; + ares__dns_cname_t cname; + ares__dns_soa_t soa; + ares__dns_ptr_t ptr; + ares__dns_hinfo_t hinfo; + ares__dns_mx_t mx; + ares__dns_txt_t txt; + ares__dns_aaaa_t aaaa; + ares__dns_srv_t srv; + ares__dns_naptr_t naptr; + ares__dns_opt_t opt; + ares__dns_tlsa_t tlsa; + ares__dns_svcb_t svcb; + ares__dns_svcb_t https; /*!< https is a type of svcb, so this is right */ + ares__dns_uri_t uri; + ares__dns_caa_t caa; + ares__dns_raw_rr_t raw_rr; + } r; +}; + +/*! DNS data structure */ +struct ares_dns_record { + unsigned short id; /*!< DNS query id */ + unsigned short flags; /*!< One or more ares_dns_flags_t */ + ares_dns_opcode_t opcode; /*!< DNS Opcode */ + ares_dns_rcode_t rcode; /*!< DNS RCODE */ + unsigned short raw_rcode; /*!< Raw rcode, used to ultimately form real + * rcode after reading OPT record if it + * exists */ + unsigned int ttl_decrement; /*!< Special case to apply to writing out + * this record, where it will decrement + * the ttl of any resource records by + * this amount. Used for cache */ + + ares_dns_qd_t *qd; + size_t qdcount; + size_t qdalloc; + + ares_dns_rr_t *an; + size_t ancount; + size_t analloc; + + ares_dns_rr_t *ns; + size_t nscount; + size_t nsalloc; + + ares_dns_rr_t *ar; + size_t arcount; + size_t aralloc; +}; + +#endif diff --git a/lib/c-ares-1.23.0/src/lib/ares_dns_record.c b/lib/c-ares-1.23.0/src/lib/ares_dns_record.c new file mode 100644 index 00000000000..30219003e24 --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares_dns_record.c @@ -0,0 +1,1316 @@ +/* MIT License + * + * Copyright (c) 2023 Brad House + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ +#include "ares_setup.h" +#include "ares.h" +#include "ares_private.h" +#include +#ifdef HAVE_STDINT_H +# include +#endif + + +ares_status_t ares_dns_record_create(ares_dns_record_t **dnsrec, + unsigned short id, unsigned short flags, + ares_dns_opcode_t opcode, + ares_dns_rcode_t rcode) +{ + if (dnsrec == NULL) { + return ARES_EFORMERR; + } + + *dnsrec = NULL; + + if (!ares_dns_opcode_isvalid(opcode) || !ares_dns_rcode_isvalid(rcode) || + !ares_dns_flags_arevalid(flags)) { + return ARES_EFORMERR; + } + + *dnsrec = ares_malloc_zero(sizeof(**dnsrec)); + if (*dnsrec == NULL) { + return ARES_ENOMEM; + } + + (*dnsrec)->id = id; + (*dnsrec)->flags = flags; + (*dnsrec)->opcode = opcode; + (*dnsrec)->rcode = rcode; + return ARES_SUCCESS; +} + +unsigned short ares_dns_record_get_id(const ares_dns_record_t *dnsrec) +{ + if (dnsrec == NULL) { + return 0; + } + return dnsrec->id; +} + +unsigned short ares_dns_record_get_flags(const ares_dns_record_t *dnsrec) +{ + if (dnsrec == NULL) { + return 0; + } + return dnsrec->flags; +} + +ares_dns_opcode_t ares_dns_record_get_opcode(const ares_dns_record_t *dnsrec) +{ + if (dnsrec == NULL) { + return 0; + } + return dnsrec->opcode; +} + +ares_dns_rcode_t ares_dns_record_get_rcode(const ares_dns_record_t *dnsrec) +{ + if (dnsrec == NULL) { + return 0; + } + return dnsrec->rcode; +} + +static void ares__dns_options_free(ares__dns_options_t *options) +{ + size_t i; + + if (options == NULL) { + return; + } + + for (i = 0; i < options->cnt; i++) { + ares_free(options->optval[i].val); + } + ares_free(options->optval); + ares_free(options); +} + +static void ares__dns_rr_free(ares_dns_rr_t *rr) +{ + ares_free(rr->name); + + switch (rr->type) { + case ARES_REC_TYPE_A: + case ARES_REC_TYPE_AAAA: + case ARES_REC_TYPE_ANY: + /* Nothing to free */ + break; + + case ARES_REC_TYPE_NS: + ares_free(rr->r.ns.nsdname); + break; + + case ARES_REC_TYPE_CNAME: + ares_free(rr->r.cname.cname); + break; + + case ARES_REC_TYPE_SOA: + ares_free(rr->r.soa.mname); + ares_free(rr->r.soa.rname); + break; + + case ARES_REC_TYPE_PTR: + ares_free(rr->r.ptr.dname); + break; + + case ARES_REC_TYPE_HINFO: + ares_free(rr->r.hinfo.cpu); + ares_free(rr->r.hinfo.os); + break; + + case ARES_REC_TYPE_MX: + ares_free(rr->r.mx.exchange); + break; + + case ARES_REC_TYPE_TXT: + ares_free(rr->r.txt.data); + break; + + case ARES_REC_TYPE_SRV: + ares_free(rr->r.srv.target); + break; + + case ARES_REC_TYPE_NAPTR: + ares_free(rr->r.naptr.flags); + ares_free(rr->r.naptr.services); + ares_free(rr->r.naptr.regexp); + ares_free(rr->r.naptr.replacement); + break; + + case ARES_REC_TYPE_OPT: + ares__dns_options_free(rr->r.opt.options); + break; + + case ARES_REC_TYPE_TLSA: + ares_free(rr->r.tlsa.data); + break; + + case ARES_REC_TYPE_SVCB: + ares_free(rr->r.svcb.target); + ares__dns_options_free(rr->r.svcb.params); + break; + + case ARES_REC_TYPE_HTTPS: + ares_free(rr->r.https.target); + ares__dns_options_free(rr->r.https.params); + break; + + case ARES_REC_TYPE_URI: + ares_free(rr->r.uri.target); + break; + + case ARES_REC_TYPE_CAA: + ares_free(rr->r.caa.tag); + ares_free(rr->r.caa.value); + break; + + case ARES_REC_TYPE_RAW_RR: + ares_free(rr->r.raw_rr.data); + break; + } +} + +void ares_dns_record_destroy(ares_dns_record_t *dnsrec) +{ + size_t i; + + if (dnsrec == NULL) { + return; + } + + /* Free questions */ + for (i = 0; i < dnsrec->qdcount; i++) { + ares_free(dnsrec->qd[i].name); + } + ares_free(dnsrec->qd); + + /* Free answers */ + for (i = 0; i < dnsrec->ancount; i++) { + ares__dns_rr_free(&dnsrec->an[i]); + } + ares_free(dnsrec->an); + + /* Free authority */ + for (i = 0; i < dnsrec->nscount; i++) { + ares__dns_rr_free(&dnsrec->ns[i]); + } + ares_free(dnsrec->ns); + + /* Free additional */ + for (i = 0; i < dnsrec->arcount; i++) { + ares__dns_rr_free(&dnsrec->ar[i]); + } + ares_free(dnsrec->ar); + + ares_free(dnsrec); +} + +size_t ares_dns_record_query_cnt(const ares_dns_record_t *dnsrec) +{ + if (dnsrec == NULL) { + return 0; + } + return dnsrec->qdcount; +} + +ares_status_t ares_dns_record_query_add(ares_dns_record_t *dnsrec, + const char *name, + ares_dns_rec_type_t qtype, + ares_dns_class_t qclass) +{ + ares_dns_qd_t *temp = NULL; + size_t idx; + + if (dnsrec == NULL || name == NULL || + !ares_dns_rec_type_isvalid(qtype, ARES_TRUE) || + !ares_dns_class_isvalid(qclass, ARES_TRUE)) { + return ARES_EFORMERR; + } + + if (dnsrec->qdcount >= dnsrec->qdalloc) { + size_t alloc_cnt = ares__round_up_pow2(dnsrec->qdcount + 1); + + temp = ares_realloc_zero(dnsrec->qd, sizeof(*temp) * (dnsrec->qdalloc), + sizeof(*temp) * alloc_cnt); + if (temp == NULL) { + return ARES_ENOMEM; + } + + dnsrec->qdalloc = alloc_cnt; + dnsrec->qd = temp; + } + + idx = dnsrec->qdcount; + + dnsrec->qd[idx].name = ares_strdup(name); + if (dnsrec->qd[idx].name == NULL) { + /* No need to clean up anything */ + return ARES_ENOMEM; + } + + dnsrec->qd[idx].qtype = qtype; + dnsrec->qd[idx].qclass = qclass; + dnsrec->qdcount++; + return ARES_SUCCESS; +} + +ares_status_t ares_dns_record_query_get(const ares_dns_record_t *dnsrec, + size_t idx, const char **name, + ares_dns_rec_type_t *qtype, + ares_dns_class_t *qclass) +{ + if (dnsrec == NULL || idx >= dnsrec->qdcount) { + return ARES_EFORMERR; + } + + if (name != NULL) { + *name = dnsrec->qd[idx].name; + } + + if (qtype != NULL) { + *qtype = dnsrec->qd[idx].qtype; + } + + if (qclass != NULL) { + *qclass = dnsrec->qd[idx].qclass; + } + + return ARES_SUCCESS; +} + +size_t ares_dns_record_rr_cnt(const ares_dns_record_t *dnsrec, + ares_dns_section_t sect) +{ + if (dnsrec == NULL || !ares_dns_section_isvalid(sect)) { + return 0; + } + + switch (sect) { + case ARES_SECTION_ANSWER: + return dnsrec->ancount; + case ARES_SECTION_AUTHORITY: + return dnsrec->nscount; + case ARES_SECTION_ADDITIONAL: + return dnsrec->arcount; + } + + return 0; +} + +ares_status_t ares_dns_record_rr_prealloc(ares_dns_record_t *dnsrec, + ares_dns_section_t sect, size_t cnt) +{ + ares_dns_rr_t **rr_ptr = NULL; + size_t *rr_alloc = NULL; + ares_dns_rr_t *temp = NULL; + + if (dnsrec == NULL || cnt == 0 || !ares_dns_section_isvalid(sect)) { + return ARES_EFORMERR; + } + + switch (sect) { + case ARES_SECTION_ANSWER: + rr_ptr = &dnsrec->an; + rr_alloc = &dnsrec->analloc; + break; + case ARES_SECTION_AUTHORITY: + rr_ptr = &dnsrec->ns; + rr_alloc = &dnsrec->nsalloc; + break; + case ARES_SECTION_ADDITIONAL: + rr_ptr = &dnsrec->ar; + rr_alloc = &dnsrec->aralloc; + break; + } + + /* Round up cnt to a power of 2 */ + cnt = ares__round_up_pow2(cnt); + + /* Already have that */ + if (cnt <= *rr_alloc) { + return ARES_SUCCESS; + } + + temp = ares_realloc_zero(*rr_ptr, sizeof(*temp) * (*rr_alloc), + sizeof(*temp) * cnt); + if (temp == NULL) { + return ARES_ENOMEM; + } + + *rr_alloc = cnt; + *rr_ptr = temp; + return ARES_SUCCESS; +} + +ares_status_t ares_dns_record_rr_add(ares_dns_rr_t **rr_out, + ares_dns_record_t *dnsrec, + ares_dns_section_t sect, const char *name, + ares_dns_rec_type_t type, + ares_dns_class_t rclass, unsigned int ttl) +{ + ares_dns_rr_t **rr_ptr = NULL; + ares_dns_rr_t *rr = NULL; + size_t *rr_len = NULL; + ares_status_t status; + size_t idx; + + if (dnsrec == NULL || name == NULL || rr_out == NULL || + !ares_dns_section_isvalid(sect) || + !ares_dns_rec_type_isvalid(type, ARES_FALSE) || + !ares_dns_class_isvalid(rclass, ARES_FALSE)) { + return ARES_EFORMERR; + } + + *rr_out = NULL; + + switch (sect) { + case ARES_SECTION_ANSWER: + rr_ptr = &dnsrec->an; + rr_len = &dnsrec->ancount; + break; + case ARES_SECTION_AUTHORITY: + rr_ptr = &dnsrec->ns; + rr_len = &dnsrec->nscount; + break; + case ARES_SECTION_ADDITIONAL: + rr_ptr = &dnsrec->ar; + rr_len = &dnsrec->arcount; + break; + } + + status = ares_dns_record_rr_prealloc(dnsrec, sect, *rr_len + 1); + if (status != ARES_SUCCESS) { + return status; + } + + idx = *rr_len; + rr = &(*rr_ptr)[idx]; + + rr->name = ares_strdup(name); + if (rr->name == NULL) { + /* No need to clean up anything */ + return ARES_ENOMEM; + } + + rr->parent = dnsrec; + rr->type = type; + rr->rclass = rclass; + rr->ttl = ttl; + (*rr_len)++; + + *rr_out = rr; + + return ARES_SUCCESS; +} + +ares_status_t ares_dns_record_rr_del(ares_dns_record_t *dnsrec, + ares_dns_section_t sect, size_t idx) +{ + ares_dns_rr_t *rr_ptr = NULL; + size_t *rr_len = NULL; + size_t cnt_after; + + if (dnsrec == NULL || !ares_dns_section_isvalid(sect)) { + return ARES_EFORMERR; + } + + switch (sect) { + case ARES_SECTION_ANSWER: + rr_ptr = dnsrec->an; + rr_len = &dnsrec->ancount; + break; + case ARES_SECTION_AUTHORITY: + rr_ptr = dnsrec->ns; + rr_len = &dnsrec->nscount; + break; + case ARES_SECTION_ADDITIONAL: + rr_ptr = dnsrec->ar; + rr_len = &dnsrec->arcount; + break; + } + + if (idx >= *rr_len) { + return ARES_EFORMERR; + } + + ares__dns_rr_free(&rr_ptr[idx]); + + cnt_after = *rr_len - idx - 1; + + if (cnt_after) { + memmove(&rr_ptr[idx], &rr_ptr[idx + 1], sizeof(*rr_ptr) * cnt_after); + } + + (*rr_len)--; + return ARES_SUCCESS; +} + +ares_dns_rr_t *ares_dns_record_rr_get(ares_dns_record_t *dnsrec, + ares_dns_section_t sect, size_t idx) +{ + ares_dns_rr_t *rr_ptr = NULL; + size_t rr_len = 0; + + if (dnsrec == NULL || !ares_dns_section_isvalid(sect)) { + return NULL; + } + + switch (sect) { + case ARES_SECTION_ANSWER: + rr_ptr = dnsrec->an; + rr_len = dnsrec->ancount; + break; + case ARES_SECTION_AUTHORITY: + rr_ptr = dnsrec->ns; + rr_len = dnsrec->nscount; + break; + case ARES_SECTION_ADDITIONAL: + rr_ptr = dnsrec->ar; + rr_len = dnsrec->arcount; + break; + } + + if (idx >= rr_len) { + return NULL; + } + + return &rr_ptr[idx]; +} + +static const ares_dns_rr_t * + ares_dns_record_rr_get_const(const ares_dns_record_t *dnsrec, + ares_dns_section_t sect, size_t idx) +{ + return ares_dns_record_rr_get((void *)((size_t)dnsrec), sect, idx); +} + +const char *ares_dns_rr_get_name(const ares_dns_rr_t *rr) +{ + if (rr == NULL) { + return NULL; + } + return rr->name; +} + +ares_dns_rec_type_t ares_dns_rr_get_type(const ares_dns_rr_t *rr) +{ + if (rr == NULL) { + return 0; + } + return rr->type; +} + +ares_dns_class_t ares_dns_rr_get_class(const ares_dns_rr_t *rr) +{ + if (rr == NULL) { + return 0; + } + return rr->rclass; +} + +unsigned int ares_dns_rr_get_ttl(const ares_dns_rr_t *rr) +{ + if (rr == NULL) { + return 0; + } + return rr->ttl; +} + +static void *ares_dns_rr_data_ptr(ares_dns_rr_t *dns_rr, ares_dns_rr_key_t key, + size_t **lenptr) +{ + if (dns_rr == NULL || dns_rr->type != ares_dns_rr_key_to_rec_type(key)) { + return NULL; + } + + switch (key) { + case ARES_RR_A_ADDR: + return &dns_rr->r.a.addr; + + case ARES_RR_NS_NSDNAME: + return &dns_rr->r.ns.nsdname; + + case ARES_RR_CNAME_CNAME: + return &dns_rr->r.cname.cname; + + case ARES_RR_SOA_MNAME: + return &dns_rr->r.soa.mname; + + case ARES_RR_SOA_RNAME: + return &dns_rr->r.soa.rname; + + case ARES_RR_SOA_SERIAL: + return &dns_rr->r.soa.serial; + + case ARES_RR_SOA_REFRESH: + return &dns_rr->r.soa.refresh; + + case ARES_RR_SOA_RETRY: + return &dns_rr->r.soa.retry; + + case ARES_RR_SOA_EXPIRE: + return &dns_rr->r.soa.expire; + + case ARES_RR_SOA_MINIMUM: + return &dns_rr->r.soa.minimum; + + case ARES_RR_PTR_DNAME: + return &dns_rr->r.ptr.dname; + + case ARES_RR_AAAA_ADDR: + return &dns_rr->r.aaaa.addr; + + case ARES_RR_HINFO_CPU: + return &dns_rr->r.hinfo.cpu; + + case ARES_RR_HINFO_OS: + return &dns_rr->r.hinfo.os; + + case ARES_RR_MX_PREFERENCE: + return &dns_rr->r.mx.preference; + + case ARES_RR_MX_EXCHANGE: + return &dns_rr->r.mx.exchange; + + case ARES_RR_TXT_DATA: + if (lenptr == NULL) { + return NULL; + } + *lenptr = &dns_rr->r.txt.data_len; + return &dns_rr->r.txt.data; + + case ARES_RR_SRV_PRIORITY: + return &dns_rr->r.srv.priority; + + case ARES_RR_SRV_WEIGHT: + return &dns_rr->r.srv.weight; + + case ARES_RR_SRV_PORT: + return &dns_rr->r.srv.port; + + case ARES_RR_SRV_TARGET: + return &dns_rr->r.srv.target; + + case ARES_RR_NAPTR_ORDER: + return &dns_rr->r.naptr.order; + + case ARES_RR_NAPTR_PREFERENCE: + return &dns_rr->r.naptr.preference; + + case ARES_RR_NAPTR_FLAGS: + return &dns_rr->r.naptr.flags; + + case ARES_RR_NAPTR_SERVICES: + return &dns_rr->r.naptr.services; + + case ARES_RR_NAPTR_REGEXP: + return &dns_rr->r.naptr.regexp; + + case ARES_RR_NAPTR_REPLACEMENT: + return &dns_rr->r.naptr.replacement; + + case ARES_RR_OPT_UDP_SIZE: + return &dns_rr->r.opt.udp_size; + + case ARES_RR_OPT_VERSION: + return &dns_rr->r.opt.version; + + case ARES_RR_OPT_FLAGS: + return &dns_rr->r.opt.flags; + + case ARES_RR_OPT_OPTIONS: + return &dns_rr->r.opt.options; + + case ARES_RR_TLSA_CERT_USAGE: + return &dns_rr->r.tlsa.cert_usage; + + case ARES_RR_TLSA_SELECTOR: + return &dns_rr->r.tlsa.selector; + + case ARES_RR_TLSA_MATCH: + return &dns_rr->r.tlsa.match; + + case ARES_RR_TLSA_DATA: + if (lenptr == NULL) { + return NULL; + } + *lenptr = &dns_rr->r.tlsa.data_len; + return &dns_rr->r.tlsa.data; + + case ARES_RR_SVCB_PRIORITY: + return &dns_rr->r.svcb.priority; + + case ARES_RR_SVCB_TARGET: + return &dns_rr->r.svcb.target; + + case ARES_RR_SVCB_PARAMS: + return &dns_rr->r.svcb.params; + + case ARES_RR_HTTPS_PRIORITY: + return &dns_rr->r.https.priority; + + case ARES_RR_HTTPS_TARGET: + return &dns_rr->r.https.target; + + case ARES_RR_HTTPS_PARAMS: + return &dns_rr->r.https.params; + + case ARES_RR_URI_PRIORITY: + return &dns_rr->r.uri.priority; + + case ARES_RR_URI_WEIGHT: + return &dns_rr->r.uri.weight; + + case ARES_RR_URI_TARGET: + return &dns_rr->r.uri.target; + + case ARES_RR_CAA_CRITICAL: + return &dns_rr->r.caa.critical; + + case ARES_RR_CAA_TAG: + return &dns_rr->r.caa.tag; + + case ARES_RR_CAA_VALUE: + if (lenptr == NULL) { + return NULL; + } + *lenptr = &dns_rr->r.caa.value_len; + return &dns_rr->r.caa.value; + + case ARES_RR_RAW_RR_TYPE: + return &dns_rr->r.raw_rr.type; + + case ARES_RR_RAW_RR_DATA: + if (lenptr == NULL) { + return NULL; + } + *lenptr = &dns_rr->r.raw_rr.length; + return &dns_rr->r.raw_rr.data; + } + + return NULL; +} + +static const void *ares_dns_rr_data_ptr_const(const ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key, + const size_t **lenptr) +{ + /* We're going to cast off the const */ + return ares_dns_rr_data_ptr((void *)((size_t)dns_rr), key, + (void *)((size_t)lenptr)); +} + +const struct in_addr *ares_dns_rr_get_addr(const ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key) +{ + const struct in_addr *addr; + + if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_INADDR) { + return NULL; + } + + addr = ares_dns_rr_data_ptr_const(dns_rr, key, NULL); + if (addr == NULL) { + return NULL; + } + + return addr; +} + +const struct ares_in6_addr *ares_dns_rr_get_addr6(const ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key) +{ + const struct ares_in6_addr *addr; + + if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_INADDR6) { + return NULL; + } + + addr = ares_dns_rr_data_ptr_const(dns_rr, key, NULL); + if (addr == NULL) { + return NULL; + } + + return addr; +} + +unsigned char ares_dns_rr_get_u8(const ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key) +{ + const unsigned char *u8; + + if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_U8) { + return 0; + } + + u8 = ares_dns_rr_data_ptr_const(dns_rr, key, NULL); + if (u8 == NULL) { + return 0; + } + + return *u8; +} + +unsigned short ares_dns_rr_get_u16(const ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key) +{ + const unsigned short *u16; + + if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_U16) { + return 0; + } + + u16 = ares_dns_rr_data_ptr_const(dns_rr, key, NULL); + if (u16 == NULL) { + return 0; + } + + return *u16; +} + +unsigned int ares_dns_rr_get_u32(const ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key) +{ + const unsigned int *u32; + + if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_U32) { + return 0; + } + + u32 = ares_dns_rr_data_ptr_const(dns_rr, key, NULL); + if (u32 == NULL) { + return 0; + } + + return *u32; +} + +const unsigned char *ares_dns_rr_get_bin(const ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key, size_t *len) +{ + unsigned char * const *bin = NULL; + size_t const *bin_len = NULL; + + if ((ares_dns_rr_key_datatype(key) != ARES_DATATYPE_BIN && + ares_dns_rr_key_datatype(key) != ARES_DATATYPE_BINP) || + len == NULL) { + return NULL; + } + + bin = ares_dns_rr_data_ptr_const(dns_rr, key, &bin_len); + if (bin == NULL) { + return 0; + } + + /* Shouldn't be possible */ + if (bin_len == NULL) { + return NULL; + } + + *len = *bin_len; + + return *bin; +} + +const char *ares_dns_rr_get_str(const ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key) +{ + char * const *str; + + if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_STR && + ares_dns_rr_key_datatype(key) != ARES_DATATYPE_NAME) { + return NULL; + } + + str = ares_dns_rr_data_ptr_const(dns_rr, key, NULL); + if (str == NULL) { + return NULL; + } + + return *str; +} + +size_t ares_dns_rr_get_opt_cnt(const ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key) +{ + ares__dns_options_t * const *opts; + + if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_OPT) { + return 0; + } + + opts = ares_dns_rr_data_ptr_const(dns_rr, key, NULL); + if (opts == NULL || *opts == NULL) { + return 0; + } + + return (*opts)->cnt; +} + +unsigned short ares_dns_rr_get_opt(const ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key, size_t idx, + const unsigned char **val, size_t *val_len) +{ + ares__dns_options_t * const *opts; + + if (val) { + *val = NULL; + } + if (val_len) { + *val_len = 0; + } + + if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_OPT) { + return 65535; + } + + opts = ares_dns_rr_data_ptr_const(dns_rr, key, NULL); + if (opts == NULL || *opts == NULL) { + return 65535; + } + + if (idx >= (*opts)->cnt) { + return 65535; + } + + if (val) { + *val = (*opts)->optval[idx].val; + } + if (val_len) { + *val_len = (*opts)->optval[idx].val_len; + } + + return (*opts)->optval[idx].opt; +} + +ares_bool_t ares_dns_rr_get_opt_byid(const ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key, unsigned short opt, + const unsigned char **val, size_t *val_len) +{ + ares__dns_options_t * const *opts; + size_t i; + + if (val) { + *val = NULL; + } + if (val_len) { + *val_len = 0; + } + + if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_OPT) { + return ARES_FALSE; + } + + opts = ares_dns_rr_data_ptr_const(dns_rr, key, NULL); + if (opts == NULL || *opts == NULL) { + return ARES_FALSE; + } + + for (i = 0; i < (*opts)->cnt; i++) { + if ((*opts)->optval[i].opt == opt) { + break; + } + } + + if (i >= (*opts)->cnt) { + return ARES_FALSE; + } + + if (val) { + *val = (*opts)->optval[i].val; + } + if (val_len) { + *val_len = (*opts)->optval[i].val_len; + } + return ARES_TRUE; +} + +ares_status_t ares_dns_rr_set_addr(ares_dns_rr_t *dns_rr, ares_dns_rr_key_t key, + const struct in_addr *addr) +{ + struct in_addr *a; + + if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_INADDR || addr == NULL) { + return ARES_EFORMERR; + } + + a = ares_dns_rr_data_ptr(dns_rr, key, NULL); + if (a == NULL) { + return ARES_EFORMERR; + } + + memcpy(a, addr, sizeof(*a)); + return ARES_SUCCESS; +} + +ares_status_t ares_dns_rr_set_addr6(ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key, + const struct ares_in6_addr *addr) +{ + struct ares_in6_addr *a; + + if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_INADDR6 || addr == NULL) { + return ARES_EFORMERR; + } + + a = ares_dns_rr_data_ptr(dns_rr, key, NULL); + if (a == NULL) { + return ARES_EFORMERR; + } + + memcpy(a, addr, sizeof(*a)); + return ARES_SUCCESS; +} + +ares_status_t ares_dns_rr_set_u8(ares_dns_rr_t *dns_rr, ares_dns_rr_key_t key, + unsigned char val) +{ + unsigned char *u8; + + if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_U8) { + return ARES_EFORMERR; + } + + u8 = ares_dns_rr_data_ptr(dns_rr, key, NULL); + if (u8 == NULL) { + return ARES_EFORMERR; + } + + *u8 = val; + return ARES_SUCCESS; +} + +ares_status_t ares_dns_rr_set_u16(ares_dns_rr_t *dns_rr, ares_dns_rr_key_t key, + unsigned short val) +{ + unsigned short *u16; + + if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_U16) { + return ARES_EFORMERR; + } + + u16 = ares_dns_rr_data_ptr(dns_rr, key, NULL); + if (u16 == NULL) { + return ARES_EFORMERR; + } + + *u16 = val; + return ARES_SUCCESS; +} + +ares_status_t ares_dns_rr_set_u32(ares_dns_rr_t *dns_rr, ares_dns_rr_key_t key, + unsigned int val) +{ + unsigned int *u32; + + if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_U32) { + return ARES_EFORMERR; + } + + u32 = ares_dns_rr_data_ptr(dns_rr, key, NULL); + if (u32 == NULL) { + return ARES_EFORMERR; + } + + *u32 = val; + return ARES_SUCCESS; +} + +ares_status_t ares_dns_rr_set_bin_own(ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key, unsigned char *val, + size_t len) +{ + unsigned char **bin; + size_t *bin_len = NULL; + + if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_BIN && + ares_dns_rr_key_datatype(key) != ARES_DATATYPE_BINP) { + return ARES_EFORMERR; + } + + bin = ares_dns_rr_data_ptr(dns_rr, key, &bin_len); + if (bin == NULL || bin_len == NULL) { + return ARES_EFORMERR; + } + + if (*bin) { + ares_free(*bin); + } + *bin = val; + *bin_len = len; + + return ARES_SUCCESS; +} + +ares_status_t ares_dns_rr_set_bin(ares_dns_rr_t *dns_rr, ares_dns_rr_key_t key, + const unsigned char *val, size_t len) +{ + ares_status_t status; + ares_dns_datatype_t datatype = ares_dns_rr_key_datatype(key); + size_t alloclen = (datatype == ARES_DATATYPE_BINP) ? len + 1 : len; + unsigned char *temp = ares_malloc(alloclen); + + if (temp == NULL) { + return ARES_ENOMEM; + } + + memcpy(temp, val, len); + + /* NULL-term BINP */ + if (datatype == ARES_DATATYPE_BINP) { + temp[len] = 0; + } + + status = ares_dns_rr_set_bin_own(dns_rr, key, temp, len); + if (status != ARES_SUCCESS) { + ares_free(temp); + } + + return status; +} + +ares_status_t ares_dns_rr_set_str_own(ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key, char *val) +{ + char **str; + + if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_STR && + ares_dns_rr_key_datatype(key) != ARES_DATATYPE_NAME) { + return ARES_EFORMERR; + } + + str = ares_dns_rr_data_ptr(dns_rr, key, NULL); + if (str == NULL) { + return ARES_EFORMERR; + } + + if (*str) { + ares_free(*str); + } + *str = val; + + return ARES_SUCCESS; +} + +ares_status_t ares_dns_rr_set_str(ares_dns_rr_t *dns_rr, ares_dns_rr_key_t key, + const char *val) +{ + ares_status_t status; + char *temp = NULL; + + if (val != NULL) { + temp = ares_strdup(val); + if (temp == NULL) { + return ARES_ENOMEM; + } + } + + status = ares_dns_rr_set_str_own(dns_rr, key, temp); + if (status != ARES_SUCCESS) { + ares_free(temp); + } + + return status; +} + +ares_status_t ares_dns_rr_set_opt_own(ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key, unsigned short opt, + unsigned char *val, size_t val_len) +{ + ares__dns_options_t **options; + size_t idx; + + if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_OPT) { + return ARES_EFORMERR; + } + + options = ares_dns_rr_data_ptr(dns_rr, key, NULL); + if (options == NULL) { + return ARES_EFORMERR; + } + + if (*options == NULL) { + *options = ares_malloc_zero(sizeof(**options)); + } + if (*options == NULL) { + return ARES_ENOMEM; + } + + for (idx = 0; idx < (*options)->cnt; idx++) { + if ((*options)->optval[idx].opt == opt) { + break; + } + } + + /* Duplicate entry, replace */ + if (idx != (*options)->cnt) { + goto done; + } + + idx = (*options)->cnt; + + /* Expand by powers of 2 */ + if (idx >= (*options)->alloc) { + size_t alloc_size = (*options)->alloc; + void *temp; + + if (alloc_size == 0) { + alloc_size = 1; + } else { + alloc_size <<= 1; + } + + temp = ares_realloc_zero((*options)->optval, + (*options)->alloc * sizeof(*(*options)->optval), + alloc_size * sizeof(*(*options)->optval)); + if (temp == NULL) { + return ARES_ENOMEM; + } + + (*options)->optval = temp; + (*options)->alloc = alloc_size; + } + + (*options)->cnt++; + +done: + ares_free((*options)->optval[idx].val); + (*options)->optval[idx].opt = opt; + (*options)->optval[idx].val = val; + (*options)->optval[idx].val_len = val_len; + + return ARES_SUCCESS; +} + +ares_status_t ares_dns_rr_set_opt(ares_dns_rr_t *dns_rr, ares_dns_rr_key_t key, + unsigned short opt, const unsigned char *val, + size_t val_len) +{ + unsigned char *temp = NULL; + ares_status_t status; + + if (val != NULL) { + temp = ares_malloc(val_len + 1); + if (temp == NULL) { + return ARES_ENOMEM; + } + memcpy(temp, val, val_len); + temp[val_len] = 0; + } + + status = ares_dns_rr_set_opt_own(dns_rr, key, opt, temp, val_len); + if (status != ARES_SUCCESS) { + ares_free(temp); + } + + return status; +} + +char *ares_dns_addr_to_ptr(const struct ares_addr *addr) +{ + ares__buf_t *buf = NULL; + const unsigned char *ptr = NULL; + size_t ptr_len = 0; + size_t i; + ares_status_t status; + static const unsigned char hexbytes[] = "0123456789abcdef"; + + if (addr->family != AF_INET && addr->family != AF_INET6) { + goto fail; + } + + buf = ares__buf_create(); + if (buf == NULL) { + goto fail; + } + + if (addr->family == AF_INET) { + ptr = (const unsigned char *)&addr->addr.addr4; + ptr_len = 4; + } else { + ptr = (const unsigned char *)&addr->addr.addr6; + ptr_len = 16; + } + + for (i = ptr_len; i > 0; i--) { + if (addr->family == AF_INET) { + status = ares__buf_append_num_dec(buf, (size_t)ptr[i - 1], 0); + } else { + unsigned char c; + + c = ptr[i - 1] & 0xF; + status = ares__buf_append_byte(buf, hexbytes[c]); + if (status != ARES_SUCCESS) { + goto fail; + } + + status = ares__buf_append_byte(buf, '.'); + if (status != ARES_SUCCESS) { + goto fail; + } + + c = (ptr[i - 1] >> 4) & 0xF; + status = ares__buf_append_byte(buf, hexbytes[c]); + } + if (status != ARES_SUCCESS) { + goto fail; + } + + status = ares__buf_append_byte(buf, '.'); + if (status != ARES_SUCCESS) { + goto fail; + } + } + + if (addr->family == AF_INET) { + status = ares__buf_append(buf, (const unsigned char *)"in-addr.arpa", 12); + } else { + status = ares__buf_append(buf, (const unsigned char *)"ip6.arpa", 8); + } + if (status != ARES_SUCCESS) { + goto fail; + } + + return ares__buf_finish_str(buf, NULL); + +fail: + ares__buf_destroy(buf); + return NULL; +} + +/* search for an OPT RR in the response */ +ares_bool_t ares_dns_has_opt_rr(const ares_dns_record_t *rec) +{ + size_t i; + for (i = 0; i < ares_dns_record_rr_cnt(rec, ARES_SECTION_ADDITIONAL); i++) { + const ares_dns_rr_t *rr = + ares_dns_record_rr_get_const(rec, ARES_SECTION_ADDITIONAL, i); + + if (ares_dns_rr_get_type(rr) == ARES_REC_TYPE_OPT) { + return ARES_TRUE; + } + } + return ARES_FALSE; +} diff --git a/lib/c-ares-1.23.0/src/lib/ares_dns_write.c b/lib/c-ares-1.23.0/src/lib/ares_dns_write.c new file mode 100644 index 00000000000..2e99c5ba88a --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares_dns_write.c @@ -0,0 +1,1054 @@ +/* MIT License + * + * Copyright (c) 2023 Brad House + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ +#include "ares_setup.h" +#include "ares.h" +#include "ares_private.h" +#include +#ifdef HAVE_STDINT_H +# include +#endif + + +static ares_status_t ares_dns_write_header(const ares_dns_record_t *dnsrec, + ares__buf_t *buf) +{ + unsigned short u16; + unsigned short opcode; + unsigned short rcode; + + ares_status_t status; + + /* ID */ + status = ares__buf_append_be16(buf, dnsrec->id); + if (status != ARES_SUCCESS) { + return status; + } + + /* Flags */ + u16 = 0; + + /* QR */ + if (dnsrec->flags & ARES_FLAG_QR) { + u16 |= 0x8000; + } + + /* OPCODE */ + opcode = (unsigned short)(dnsrec->opcode & 0xF); + opcode <<= 11; + u16 |= opcode; + + /* AA */ + if (dnsrec->flags & ARES_FLAG_AA) { + u16 |= 0x400; + } + + /* TC */ + if (dnsrec->flags & ARES_FLAG_TC) { + u16 |= 0x200; + } + + /* RD */ + if (dnsrec->flags & ARES_FLAG_RD) { + u16 |= 0x100; + } + + /* RA */ + if (dnsrec->flags & ARES_FLAG_RA) { + u16 |= 0x80; + } + + /* Z -- unused */ + + /* AD */ + if (dnsrec->flags & ARES_FLAG_AD) { + u16 |= 0x20; + } + + /* CD */ + if (dnsrec->flags & ARES_FLAG_CD) { + u16 |= 0x10; + } + + /* RCODE */ + if (dnsrec->rcode > 15 && !ares_dns_has_opt_rr(dnsrec)) { + /* Must have OPT RR in order to write extended error codes */ + rcode = ARES_RCODE_SERVFAIL; + } else { + rcode = (unsigned short)(dnsrec->rcode & 0xF); + } + u16 |= rcode; + + status = ares__buf_append_be16(buf, u16); + if (status != ARES_SUCCESS) { + return status; + } + + /* QDCOUNT */ + status = ares__buf_append_be16(buf, (unsigned short)dnsrec->qdcount); + if (status != ARES_SUCCESS) { + return status; + } + + /* ANCOUNT */ + status = ares__buf_append_be16(buf, (unsigned short)dnsrec->ancount); + if (status != ARES_SUCCESS) { + return status; + } + + /* NSCOUNT */ + status = ares__buf_append_be16(buf, (unsigned short)dnsrec->nscount); + if (status != ARES_SUCCESS) { + return status; + } + + /* ARCOUNT */ + status = ares__buf_append_be16(buf, (unsigned short)dnsrec->arcount); + if (status != ARES_SUCCESS) { + return status; + } + + return ARES_SUCCESS; +} + +static ares_status_t ares_dns_write_questions(const ares_dns_record_t *dnsrec, + ares__llist_t **namelist, + ares__buf_t *buf) +{ + size_t i; + + for (i = 0; i < ares_dns_record_query_cnt(dnsrec); i++) { + ares_status_t status; + const char *name = NULL; + ares_dns_rec_type_t qtype; + ares_dns_class_t qclass; + + status = ares_dns_record_query_get(dnsrec, i, &name, &qtype, &qclass); + if (status != ARES_SUCCESS) { + return status; + } + + /* Name */ + status = ares__dns_name_write(buf, namelist, ARES_TRUE, name); + if (status != ARES_SUCCESS) { + return status; + } + + /* Type */ + status = ares__buf_append_be16(buf, (unsigned short)qtype); + if (status != ARES_SUCCESS) { + return status; + } + + /* Class */ + status = ares__buf_append_be16(buf, (unsigned short)qclass); + if (status != ARES_SUCCESS) { + return status; + } + } + + return ARES_SUCCESS; +} + +static ares_status_t ares_dns_write_rr_name(ares__buf_t *buf, + const ares_dns_rr_t *rr, + ares__llist_t **namelist, + ares_bool_t validate_hostname, + ares_dns_rr_key_t key) +{ + const char *name; + + name = ares_dns_rr_get_str(rr, key); + if (name == NULL) { + return ARES_EFORMERR; + } + + return ares__dns_name_write(buf, namelist, validate_hostname, name); +} + +static ares_status_t ares_dns_write_rr_str(ares__buf_t *buf, + const ares_dns_rr_t *rr, + ares_dns_rr_key_t key) +{ + const char *str; + size_t len; + ares_status_t status; + + str = ares_dns_rr_get_str(rr, key); + if (str == NULL) { + return ARES_EFORMERR; + } + + len = ares_strlen(str); + if (len > 255) { + return ARES_EFORMERR; + } + + /* Write 1 byte length */ + status = ares__buf_append_byte(buf, (unsigned char)(len & 0xFF)); + if (status != ARES_SUCCESS) { + return status; + } + + if (len == 0) { + return ARES_SUCCESS; + } + + /* Write string */ + return ares__buf_append(buf, (const unsigned char *)str, len); +} + +static ares_status_t ares_dns_write_rr_binstrs(ares__buf_t *buf, + const ares_dns_rr_t *rr, + ares_dns_rr_key_t key) +{ + const unsigned char *bin; + const unsigned char *ptr; + size_t bin_len; + size_t ptr_len; + ares_status_t status; + + bin = ares_dns_rr_get_bin(rr, key, &bin_len); + if (bin == NULL) { + return ARES_EFORMERR; + } + /* split into possible multiple 255-byte or less length strings */ + ptr = bin; + ptr_len = bin_len; + do { + size_t len = ptr_len; + if (len > 255) { + len = 255; + } + + /* Length */ + status = ares__buf_append_byte(buf, (unsigned char)(len & 0xFF)); + if (status != ARES_SUCCESS) { + return status; + } + + /* String */ + if (len) { + status = ares__buf_append(buf, ptr, len); + if (status != ARES_SUCCESS) { + return status; + } + } + + ptr += len; + ptr_len -= len; + } while (ptr_len > 0); + + return ARES_SUCCESS; +} + +static ares_status_t ares_dns_write_rr_be32(ares__buf_t *buf, + const ares_dns_rr_t *rr, + ares_dns_rr_key_t key) +{ + if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_U32) { + return ARES_EFORMERR; + } + return ares__buf_append_be32(buf, ares_dns_rr_get_u32(rr, key)); +} + +static ares_status_t ares_dns_write_rr_be16(ares__buf_t *buf, + const ares_dns_rr_t *rr, + ares_dns_rr_key_t key) +{ + if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_U16) { + return ARES_EFORMERR; + } + return ares__buf_append_be16(buf, ares_dns_rr_get_u16(rr, key)); +} + +static ares_status_t ares_dns_write_rr_u8(ares__buf_t *buf, + const ares_dns_rr_t *rr, + ares_dns_rr_key_t key) +{ + if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_U8) { + return ARES_EFORMERR; + } + return ares__buf_append_byte(buf, ares_dns_rr_get_u8(rr, key)); +} + +static ares_status_t ares_dns_write_rr_a(ares__buf_t *buf, + const ares_dns_rr_t *rr, + ares__llist_t **namelist) +{ + const struct in_addr *addr; + (void)namelist; + + addr = ares_dns_rr_get_addr(rr, ARES_RR_A_ADDR); + if (addr == NULL) { + return ARES_EFORMERR; + } + + return ares__buf_append(buf, (const unsigned char *)addr, sizeof(*addr)); +} + +static ares_status_t ares_dns_write_rr_ns(ares__buf_t *buf, + const ares_dns_rr_t *rr, + ares__llist_t **namelist) +{ + return ares_dns_write_rr_name(buf, rr, namelist, ARES_FALSE, + ARES_RR_NS_NSDNAME); +} + +static ares_status_t ares_dns_write_rr_cname(ares__buf_t *buf, + const ares_dns_rr_t *rr, + ares__llist_t **namelist) +{ + return ares_dns_write_rr_name(buf, rr, namelist, ARES_FALSE, + ARES_RR_CNAME_CNAME); +} + +static ares_status_t ares_dns_write_rr_soa(ares__buf_t *buf, + const ares_dns_rr_t *rr, + ares__llist_t **namelist) +{ + ares_status_t status; + + /* MNAME */ + status = + ares_dns_write_rr_name(buf, rr, namelist, ARES_FALSE, ARES_RR_SOA_MNAME); + if (status != ARES_SUCCESS) { + return status; + } + + /* RNAME */ + status = + ares_dns_write_rr_name(buf, rr, namelist, ARES_FALSE, ARES_RR_SOA_RNAME); + if (status != ARES_SUCCESS) { + return status; + } + + /* SERIAL */ + status = ares_dns_write_rr_be32(buf, rr, ARES_RR_SOA_SERIAL); + if (status != ARES_SUCCESS) { + return status; + } + + /* REFRESH */ + status = ares_dns_write_rr_be32(buf, rr, ARES_RR_SOA_REFRESH); + if (status != ARES_SUCCESS) { + return status; + } + + /* RETRY */ + status = ares_dns_write_rr_be32(buf, rr, ARES_RR_SOA_RETRY); + if (status != ARES_SUCCESS) { + return status; + } + + /* EXPIRE */ + status = ares_dns_write_rr_be32(buf, rr, ARES_RR_SOA_EXPIRE); + if (status != ARES_SUCCESS) { + return status; + } + + /* MINIMUM */ + return ares_dns_write_rr_be32(buf, rr, ARES_RR_SOA_MINIMUM); +} + +static ares_status_t ares_dns_write_rr_ptr(ares__buf_t *buf, + const ares_dns_rr_t *rr, + ares__llist_t **namelist) +{ + return ares_dns_write_rr_name(buf, rr, namelist, ARES_FALSE, + ARES_RR_PTR_DNAME); +} + +static ares_status_t ares_dns_write_rr_hinfo(ares__buf_t *buf, + const ares_dns_rr_t *rr, + ares__llist_t **namelist) +{ + ares_status_t status; + + (void)namelist; + + /* CPU */ + status = ares_dns_write_rr_str(buf, rr, ARES_RR_HINFO_CPU); + if (status != ARES_SUCCESS) { + return status; + } + + /* OS */ + return ares_dns_write_rr_str(buf, rr, ARES_RR_HINFO_OS); +} + +static ares_status_t ares_dns_write_rr_mx(ares__buf_t *buf, + const ares_dns_rr_t *rr, + ares__llist_t **namelist) +{ + ares_status_t status; + + /* PREFERENCE */ + status = ares_dns_write_rr_be16(buf, rr, ARES_RR_MX_PREFERENCE); + if (status != ARES_SUCCESS) { + return status; + } + + /* EXCHANGE */ + return ares_dns_write_rr_name(buf, rr, namelist, ARES_FALSE, + ARES_RR_MX_EXCHANGE); +} + +static ares_status_t ares_dns_write_rr_txt(ares__buf_t *buf, + const ares_dns_rr_t *rr, + ares__llist_t **namelist) +{ + (void)namelist; + return ares_dns_write_rr_binstrs(buf, rr, ARES_RR_TXT_DATA); +} + +static ares_status_t ares_dns_write_rr_aaaa(ares__buf_t *buf, + const ares_dns_rr_t *rr, + ares__llist_t **namelist) +{ + const struct ares_in6_addr *addr; + (void)namelist; + + addr = ares_dns_rr_get_addr6(rr, ARES_RR_AAAA_ADDR); + if (addr == NULL) { + return ARES_EFORMERR; + } + + return ares__buf_append(buf, (const unsigned char *)addr, sizeof(*addr)); +} + +static ares_status_t ares_dns_write_rr_srv(ares__buf_t *buf, + const ares_dns_rr_t *rr, + ares__llist_t **namelist) +{ + ares_status_t status; + + /* PRIORITY */ + status = ares_dns_write_rr_be16(buf, rr, ARES_RR_SRV_PRIORITY); + if (status != ARES_SUCCESS) { + return status; + } + + /* WEIGHT */ + status = ares_dns_write_rr_be16(buf, rr, ARES_RR_SRV_WEIGHT); + if (status != ARES_SUCCESS) { + return status; + } + + /* PORT */ + status = ares_dns_write_rr_be16(buf, rr, ARES_RR_SRV_PORT); + if (status != ARES_SUCCESS) { + return status; + } + + /* TARGET */ + return ares_dns_write_rr_name(buf, rr, namelist, ARES_FALSE, + ARES_RR_SRV_TARGET); +} + +static ares_status_t ares_dns_write_rr_naptr(ares__buf_t *buf, + const ares_dns_rr_t *rr, + ares__llist_t **namelist) +{ + ares_status_t status; + + /* ORDER */ + status = ares_dns_write_rr_be16(buf, rr, ARES_RR_NAPTR_ORDER); + if (status != ARES_SUCCESS) { + return status; + } + + /* PREFERENCE */ + status = ares_dns_write_rr_be16(buf, rr, ARES_RR_NAPTR_PREFERENCE); + if (status != ARES_SUCCESS) { + return status; + } + + /* FLAGS */ + status = ares_dns_write_rr_str(buf, rr, ARES_RR_NAPTR_FLAGS); + if (status != ARES_SUCCESS) { + return status; + } + + /* SERVICES */ + status = ares_dns_write_rr_str(buf, rr, ARES_RR_NAPTR_SERVICES); + if (status != ARES_SUCCESS) { + return status; + } + + /* REGEXP */ + status = ares_dns_write_rr_str(buf, rr, ARES_RR_NAPTR_REGEXP); + if (status != ARES_SUCCESS) { + return status; + } + + /* REPLACEMENT */ + return ares_dns_write_rr_name(buf, rr, namelist, ARES_FALSE, + ARES_RR_NAPTR_REPLACEMENT); +} + +static ares_status_t ares_dns_write_rr_opt(ares__buf_t *buf, + const ares_dns_rr_t *rr, + ares__llist_t **namelist) +{ + size_t len = ares__buf_len(buf); + ares_status_t status; + unsigned int ttl = 0; + size_t i; + unsigned short rcode = (unsigned short)((rr->parent->rcode >> 4) & 0xFF); + + (void)namelist; + + /* We need to go back and overwrite the class and ttl that were emitted as + * the OPT record overloads them for its own use (yes, very strange!) */ + status = ares__buf_set_length(buf, len - 2 /* RDLENGTH */ + - 4 /* TTL */ + - 2 /* CLASS */); + if (status != ARES_SUCCESS) { + return status; + } + + /* Class -> UDP Size */ + status = ares_dns_write_rr_be16(buf, rr, ARES_RR_OPT_UDP_SIZE); + if (status != ARES_SUCCESS) { + return status; + } + + /* TTL -> rcode (u8) << 24 | version (u8) << 16 | flags (u16) */ + ttl |= (unsigned int)rcode << 24; + ttl |= (unsigned int)ares_dns_rr_get_u8(rr, ARES_RR_OPT_VERSION) << 16; + ttl |= (unsigned int)ares_dns_rr_get_u16(rr, ARES_RR_OPT_FLAGS); + + status = ares__buf_append_be32(buf, ttl); + if (status != ARES_SUCCESS) { + return status; + } + + /* Now go back to real end */ + status = ares__buf_set_length(buf, len); + if (status != ARES_SUCCESS) { + return status; + } + + /* Append Options */ + for (i = 0; i < ares_dns_rr_get_opt_cnt(rr, ARES_RR_OPT_OPTIONS); i++) { + unsigned short opt; + size_t val_len; + const unsigned char *val; + + opt = ares_dns_rr_get_opt(rr, ARES_RR_OPT_OPTIONS, i, &val, &val_len); + + /* BE16 option */ + status = ares__buf_append_be16(buf, opt); + if (status != ARES_SUCCESS) { + return status; + } + + /* BE16 length */ + status = ares__buf_append_be16(buf, (unsigned short)(val_len & 0xFFFF)); + if (status != ARES_SUCCESS) { + return status; + } + + /* Value */ + if (val && val_len) { + status = ares__buf_append(buf, val, val_len); + if (status != ARES_SUCCESS) { + return status; + } + } + } + + return ARES_SUCCESS; +} + +static ares_status_t ares_dns_write_rr_tlsa(ares__buf_t *buf, + const ares_dns_rr_t *rr, + ares__llist_t **namelist) +{ + ares_status_t status; + const unsigned char *data; + size_t len = 0; + + (void)namelist; + + /* CERT_USAGE */ + status = ares_dns_write_rr_u8(buf, rr, ARES_RR_TLSA_CERT_USAGE); + if (status != ARES_SUCCESS) { + return status; + } + + /* SELECTOR */ + status = ares_dns_write_rr_u8(buf, rr, ARES_RR_TLSA_SELECTOR); + if (status != ARES_SUCCESS) { + return status; + } + + /* MATCH */ + status = ares_dns_write_rr_u8(buf, rr, ARES_RR_TLSA_MATCH); + if (status != ARES_SUCCESS) { + return status; + } + + /* DATA -- binary, rest of buffer, required to be non-zero length */ + data = ares_dns_rr_get_bin(rr, ARES_RR_TLSA_DATA, &len); + if (data == NULL || len == 0) { + return ARES_EFORMERR; + } + + return ares__buf_append(buf, data, len); +} + +static ares_status_t ares_dns_write_rr_svcb(ares__buf_t *buf, + const ares_dns_rr_t *rr, + ares__llist_t **namelist) +{ + ares_status_t status; + size_t i; + + /* PRIORITY */ + status = ares_dns_write_rr_be16(buf, rr, ARES_RR_SVCB_PRIORITY); + if (status != ARES_SUCCESS) { + return status; + } + + /* TARGET */ + status = + ares_dns_write_rr_name(buf, rr, namelist, ARES_FALSE, ARES_RR_SVCB_TARGET); + if (status != ARES_SUCCESS) { + return status; + } + + /* Append Params */ + for (i = 0; i < ares_dns_rr_get_opt_cnt(rr, ARES_RR_SVCB_PARAMS); i++) { + unsigned short opt; + size_t val_len; + const unsigned char *val; + + opt = ares_dns_rr_get_opt(rr, ARES_RR_SVCB_PARAMS, i, &val, &val_len); + + /* BE16 option */ + status = ares__buf_append_be16(buf, opt); + if (status != ARES_SUCCESS) { + return status; + } + + /* BE16 length */ + status = ares__buf_append_be16(buf, (unsigned short)(val_len & 0xFFFF)); + if (status != ARES_SUCCESS) { + return status; + } + + /* Value */ + if (val && val_len) { + status = ares__buf_append(buf, val, val_len); + if (status != ARES_SUCCESS) { + return status; + } + } + } + return ARES_SUCCESS; +} + +static ares_status_t ares_dns_write_rr_https(ares__buf_t *buf, + const ares_dns_rr_t *rr, + ares__llist_t **namelist) +{ + ares_status_t status; + size_t i; + + /* PRIORITY */ + status = ares_dns_write_rr_be16(buf, rr, ARES_RR_HTTPS_PRIORITY); + if (status != ARES_SUCCESS) { + return status; + } + + /* TARGET */ + status = + ares_dns_write_rr_name(buf, rr, namelist, ARES_FALSE, ARES_RR_HTTPS_TARGET); + if (status != ARES_SUCCESS) { + return status; + } + + /* Append Params */ + for (i = 0; i < ares_dns_rr_get_opt_cnt(rr, ARES_RR_HTTPS_PARAMS); i++) { + unsigned short opt; + size_t val_len; + const unsigned char *val; + + opt = ares_dns_rr_get_opt(rr, ARES_RR_HTTPS_PARAMS, i, &val, &val_len); + + /* BE16 option */ + status = ares__buf_append_be16(buf, opt); + if (status != ARES_SUCCESS) { + return status; + } + + /* BE16 length */ + status = ares__buf_append_be16(buf, (unsigned short)(val_len & 0xFFFF)); + if (status != ARES_SUCCESS) { + return status; + } + + /* Value */ + if (val && val_len) { + status = ares__buf_append(buf, val, val_len); + if (status != ARES_SUCCESS) { + return status; + } + } + } + return ARES_SUCCESS; +} + +static ares_status_t ares_dns_write_rr_uri(ares__buf_t *buf, + const ares_dns_rr_t *rr, + ares__llist_t **namelist) +{ + ares_status_t status; + const char *target; + + (void)namelist; + + /* PRIORITY */ + status = ares_dns_write_rr_be16(buf, rr, ARES_RR_URI_PRIORITY); + if (status != ARES_SUCCESS) { + return status; + } + + /* WEIGHT */ + status = ares_dns_write_rr_be16(buf, rr, ARES_RR_URI_WEIGHT); + if (status != ARES_SUCCESS) { + return status; + } + + /* TARGET -- not in DNS string format, rest of buffer, required to be + * non-zero length */ + target = ares_dns_rr_get_str(rr, ARES_RR_URI_TARGET); + if (target == NULL || ares_strlen(target) == 0) { + return ARES_EFORMERR; + } + + return ares__buf_append(buf, (const unsigned char *)target, + ares_strlen(target)); +} + +static ares_status_t ares_dns_write_rr_caa(ares__buf_t *buf, + const ares_dns_rr_t *rr, + ares__llist_t **namelist) +{ + const unsigned char *data = NULL; + size_t data_len = 0; + ares_status_t status; + + (void)namelist; + + /* CRITICAL */ + status = ares_dns_write_rr_u8(buf, rr, ARES_RR_CAA_CRITICAL); + if (status != ARES_SUCCESS) { + return status; + } + + /* Tag */ + status = ares_dns_write_rr_str(buf, rr, ARES_RR_CAA_TAG); + if (status != ARES_SUCCESS) { + return status; + } + + /* Value - binary! (remaining buffer */ + data = ares_dns_rr_get_bin(rr, ARES_RR_CAA_VALUE, &data_len); + if (data == NULL || data_len == 0) { + return ARES_EFORMERR; + } + + return ares__buf_append(buf, data, data_len); +} + +static ares_status_t ares_dns_write_rr_raw_rr(ares__buf_t *buf, + const ares_dns_rr_t *rr, + ares__llist_t **namelist) +{ + size_t len = ares__buf_len(buf); + ares_status_t status; + const unsigned char *data = NULL; + size_t data_len = 0; + + (void)namelist; + + /* We need to go back and overwrite the type that was emitted by the parent + * function */ + status = ares__buf_set_length(buf, len - 2 /* RDLENGTH */ + - 4 /* TTL */ + - 2 /* CLASS */ + - 2 /* TYPE */); + if (status != ARES_SUCCESS) { + return status; + } + + status = ares_dns_write_rr_be16(buf, rr, ARES_RR_RAW_RR_TYPE); + if (status != ARES_SUCCESS) { + return status; + } + + /* Now go back to real end */ + status = ares__buf_set_length(buf, len); + if (status != ARES_SUCCESS) { + return status; + } + + /* Output raw data */ + data = ares_dns_rr_get_bin(rr, ARES_RR_RAW_RR_DATA, &data_len); + if (data == NULL) { + return ARES_EFORMERR; + } + + if (data_len == 0) { + return ARES_SUCCESS; + } + + return ares__buf_append(buf, data, data_len); +} + +static ares_status_t ares_dns_write_rr(ares_dns_record_t *dnsrec, + ares__llist_t **namelist, + ares_dns_section_t section, + ares__buf_t *buf) +{ + size_t i; + + for (i = 0; i < ares_dns_record_rr_cnt(dnsrec, section); i++) { + const ares_dns_rr_t *rr; + ares_dns_rec_type_t type; + ares_bool_t allow_compress; + ares__llist_t **namelistptr = NULL; + size_t pos_len; + ares_status_t status; + size_t rdlength; + size_t end_length; + unsigned int ttl; + + rr = ares_dns_record_rr_get(dnsrec, section, i); + if (rr == NULL) { + return ARES_EFORMERR; + } + + type = ares_dns_rr_get_type(rr); + allow_compress = ares_dns_rec_type_allow_name_compression(type); + if (allow_compress) { + namelistptr = namelist; + } + + /* Name */ + status = + ares__dns_name_write(buf, namelist, ARES_TRUE, ares_dns_rr_get_name(rr)); + if (status != ARES_SUCCESS) { + return status; + } + + /* Type */ + status = ares__buf_append_be16(buf, (unsigned short)type); + if (status != ARES_SUCCESS) { + return status; + } + + /* Class */ + status = + ares__buf_append_be16(buf, (unsigned short)ares_dns_rr_get_class(rr)); + if (status != ARES_SUCCESS) { + return status; + } + + /* TTL */ + ttl = ares_dns_rr_get_ttl(rr); + if (rr->parent->ttl_decrement > ttl) { + ttl = 0; + } else { + ttl -= rr->parent->ttl_decrement; + } + status = ares__buf_append_be32(buf, ttl); + if (status != ARES_SUCCESS) { + return status; + } + + /* Length */ + pos_len = ares__buf_len(buf); /* Save to write real length later */ + status = ares__buf_append_be16(buf, 0); + if (status != ARES_SUCCESS) { + return status; + } + + /* Data */ + switch (type) { + case ARES_REC_TYPE_A: + status = ares_dns_write_rr_a(buf, rr, namelistptr); + break; + case ARES_REC_TYPE_NS: + status = ares_dns_write_rr_ns(buf, rr, namelistptr); + break; + case ARES_REC_TYPE_CNAME: + status = ares_dns_write_rr_cname(buf, rr, namelistptr); + break; + case ARES_REC_TYPE_SOA: + status = ares_dns_write_rr_soa(buf, rr, namelistptr); + break; + case ARES_REC_TYPE_PTR: + status = ares_dns_write_rr_ptr(buf, rr, namelistptr); + break; + case ARES_REC_TYPE_HINFO: + status = ares_dns_write_rr_hinfo(buf, rr, namelistptr); + break; + case ARES_REC_TYPE_MX: + status = ares_dns_write_rr_mx(buf, rr, namelistptr); + break; + case ARES_REC_TYPE_TXT: + status = ares_dns_write_rr_txt(buf, rr, namelistptr); + break; + case ARES_REC_TYPE_AAAA: + status = ares_dns_write_rr_aaaa(buf, rr, namelistptr); + break; + case ARES_REC_TYPE_SRV: + status = ares_dns_write_rr_srv(buf, rr, namelistptr); + break; + case ARES_REC_TYPE_NAPTR: + status = ares_dns_write_rr_naptr(buf, rr, namelistptr); + break; + case ARES_REC_TYPE_ANY: + status = ARES_EFORMERR; + break; + case ARES_REC_TYPE_OPT: + status = ares_dns_write_rr_opt(buf, rr, namelistptr); + break; + case ARES_REC_TYPE_TLSA: + status = ares_dns_write_rr_tlsa(buf, rr, namelistptr); + break; + case ARES_REC_TYPE_SVCB: + status = ares_dns_write_rr_svcb(buf, rr, namelistptr); + break; + case ARES_REC_TYPE_HTTPS: + status = ares_dns_write_rr_https(buf, rr, namelistptr); + break; + case ARES_REC_TYPE_URI: + status = ares_dns_write_rr_uri(buf, rr, namelistptr); + break; + case ARES_REC_TYPE_CAA: + status = ares_dns_write_rr_caa(buf, rr, namelistptr); + break; + case ARES_REC_TYPE_RAW_RR: + status = ares_dns_write_rr_raw_rr(buf, rr, namelistptr); + break; + } + + if (status != ARES_SUCCESS) { + return status; + } + + /* Back off write pointer, write real length, then go back to proper + * position */ + end_length = ares__buf_len(buf); + rdlength = end_length - pos_len - 2; + + status = ares__buf_set_length(buf, pos_len); + if (status != ARES_SUCCESS) { + return status; + } + + status = ares__buf_append_be16(buf, (unsigned short)(rdlength & 0xFFFF)); + if (status != ARES_SUCCESS) { + return status; + } + + status = ares__buf_set_length(buf, end_length); + if (status != ARES_SUCCESS) { + return status; + } + } + + return ARES_SUCCESS; +} + +ares_status_t ares_dns_write(ares_dns_record_t *dnsrec, unsigned char **buf, + size_t *buf_len) +{ + ares__buf_t *b = NULL; + ares_status_t status; + ares__llist_t *namelist = NULL; + + if (buf == NULL || buf_len == NULL || dnsrec == NULL) { + return ARES_EFORMERR; + } + + *buf = NULL; + *buf_len = 0; + + b = ares__buf_create(); + if (b == NULL) { + return ARES_ENOMEM; + } + + status = ares_dns_write_header(dnsrec, b); + if (status != ARES_SUCCESS) { + goto done; + } + + status = ares_dns_write_questions(dnsrec, &namelist, b); + if (status != ARES_SUCCESS) { + goto done; + } + + status = ares_dns_write_rr(dnsrec, &namelist, ARES_SECTION_ANSWER, b); + if (status != ARES_SUCCESS) { + goto done; + } + + status = ares_dns_write_rr(dnsrec, &namelist, ARES_SECTION_AUTHORITY, b); + if (status != ARES_SUCCESS) { + goto done; + } + + status = ares_dns_write_rr(dnsrec, &namelist, ARES_SECTION_ADDITIONAL, b); + if (status != ARES_SUCCESS) { + goto done; + } + +done: + ares__llist_destroy(namelist); + + if (status != ARES_SUCCESS) { + ares__buf_destroy(b); + return status; + } + + *buf = ares__buf_finish_bin(b, buf_len); + return status; +} + +void ares_dns_record_write_ttl_decrement(ares_dns_record_t *dnsrec, + unsigned int ttl_decrement) +{ + if (dnsrec == NULL) { + return; + } + dnsrec->ttl_decrement = ttl_decrement; +} diff --git a/lib/c-ares-1.23.0/src/lib/ares_expand_name.c b/lib/c-ares-1.23.0/src/lib/ares_expand_name.c new file mode 100644 index 00000000000..280490b86a3 --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares_expand_name.c @@ -0,0 +1,118 @@ +/* MIT License + * + * Copyright (c) 1998, 2011 Massachusetts Institute of Technology + * Copyright (c) The c-ares project and its contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ + +#include "ares_setup.h" + +#ifdef HAVE_NETINET_IN_H +# include +#endif + +#include "ares_nameser.h" + +#include "ares.h" +#include "ares_private.h" /* for the memdebug */ + +ares_status_t ares__expand_name_validated(const unsigned char *encoded, + const unsigned char *abuf, + size_t alen, char **s, size_t *enclen, + ares_bool_t is_hostname) +{ + ares_status_t status; + ares__buf_t *buf = NULL; + size_t start_len; + + if (encoded == NULL || abuf == NULL || alen == 0 || enclen == NULL) { + return ARES_EBADNAME; /* EFORMERR would be better */ + } + + if (encoded < abuf || encoded >= abuf + alen) { + return ARES_EBADNAME; /* EFORMERR would be better */ + } + + *enclen = 0; + + /* NOTE: we allow 's' to be NULL to skip it */ + if (s) { + *s = NULL; + } + + buf = ares__buf_create_const(abuf, alen); + + if (buf == NULL) { + return ARES_ENOMEM; + } + + status = ares__buf_set_position(buf, (size_t)(encoded - abuf)); + if (status != ARES_SUCCESS) { + goto done; + } + + start_len = ares__buf_len(buf); + status = ares__dns_name_parse(buf, s, is_hostname); + if (status != ARES_SUCCESS) { + goto done; + } + + *enclen = start_len - ares__buf_len(buf); + +done: + ares__buf_destroy(buf); + return status; +} + +int ares_expand_name(const unsigned char *encoded, const unsigned char *abuf, + int alen, char **s, long *enclen) +{ + /* Keep public API compatible */ + size_t enclen_temp = 0; + ares_status_t status; + + if (alen < 0) { + return ARES_EBADRESP; + } + + status = ares__expand_name_validated(encoded, abuf, (size_t)alen, s, + &enclen_temp, ARES_FALSE); + *enclen = (long)enclen_temp; + return (int)status; +} + +/* Like ares_expand_name_validated but returns EBADRESP in case of invalid + * input. */ +ares_status_t ares__expand_name_for_response(const unsigned char *encoded, + const unsigned char *abuf, + size_t alen, char **s, + size_t *enclen, + ares_bool_t is_hostname) +{ + ares_status_t status = + ares__expand_name_validated(encoded, abuf, alen, s, enclen, is_hostname); + if (status == ARES_EBADNAME) { + status = ARES_EBADRESP; + } + return status; +} diff --git a/lib/c-ares-1.23.0/src/lib/ares_expand_string.c b/lib/c-ares-1.23.0/src/lib/ares_expand_string.c new file mode 100644 index 00000000000..be7034e2719 --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares_expand_string.c @@ -0,0 +1,111 @@ +/* MIT License + * + * Copyright (c) 1998 Massachusetts Institute of Technology + * Copyright (c) The c-ares project and its contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ + +#include "ares_setup.h" + +#ifdef HAVE_NETINET_IN_H +# include +#endif + +#include "ares_nameser.h" + +#include "ares.h" +#include "ares_private.h" /* for the memdebug */ + +/* Simply decodes a length-encoded character string. The first byte of the + * input is the length of the string to be returned and the bytes thereafter + * are the characters of the string. The returned result will be NULL + * terminated. + */ +ares_status_t ares_expand_string_ex(const unsigned char *encoded, + const unsigned char *abuf, size_t alen, + unsigned char **s, size_t *enclen) +{ + ares_status_t status; + ares__buf_t *buf = NULL; + size_t start_len; + size_t len = 0; + + if (encoded == NULL || abuf == NULL || alen == 0 || enclen == NULL) { + return ARES_EBADSTR; /* EFORMERR would be better */ + } + + if (encoded < abuf || encoded >= abuf + alen) { + return ARES_EBADSTR; /* EFORMERR would be better */ + } + + *enclen = 0; + + /* NOTE: we allow 's' to be NULL to skip it */ + if (s) { + *s = NULL; + } + + buf = ares__buf_create_const(abuf, alen); + + if (buf == NULL) { + return ARES_ENOMEM; + } + + status = ares__buf_set_position(buf, (size_t)(encoded - abuf)); + if (status != ARES_SUCCESS) { + goto done; + } + + start_len = ares__buf_len(buf); + status = + ares__buf_parse_dns_binstr(buf, ares__buf_len(buf), s, &len, ARES_FALSE); + /* hrm, no way to pass back 'len' with the prototype */ + if (status != ARES_SUCCESS) { + goto done; + } + + *enclen = start_len - ares__buf_len(buf); + +done: + ares__buf_destroy(buf); + if (status == ARES_EBADNAME || status == ARES_EBADRESP) { + status = ARES_EBADSTR; + } + return status; +} + +int ares_expand_string(const unsigned char *encoded, const unsigned char *abuf, + int alen, unsigned char **s, long *enclen) +{ + ares_status_t status; + size_t temp_enclen = 0; + + if (alen < 0) { + return ARES_EBADRESP; + } + + status = ares_expand_string_ex(encoded, abuf, (size_t)alen, s, &temp_enclen); + + *enclen = (long)temp_enclen; + return (int)status; +} diff --git a/lib/c-ares-1.23.0/src/lib/ares_fds.c b/lib/c-ares-1.23.0/src/lib/ares_fds.c new file mode 100644 index 00000000000..e726d4f0128 --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares_fds.c @@ -0,0 +1,83 @@ +/* MIT License + * + * Copyright (c) 1998 Massachusetts Institute of Technology + * Copyright (c) The c-ares project and its contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ + +#include "ares_setup.h" + +#include "ares.h" +#include "ares_private.h" + +int ares_fds(ares_channel_t *channel, fd_set *read_fds, fd_set *write_fds) +{ + ares_socket_t nfds; + ares__slist_node_t *snode; + /* Are there any active queries? */ + size_t active_queries; + + if (channel == NULL || read_fds == NULL || write_fds == NULL) { + return 0; + } + + ares__channel_lock(channel); + + active_queries = ares__llist_len(channel->all_queries); + + nfds = 0; + for (snode = ares__slist_node_first(channel->servers); snode != NULL; + snode = ares__slist_node_next(snode)) { + struct server_state *server = ares__slist_node_val(snode); + ares__llist_node_t *node; + + for (node = ares__llist_node_first(server->connections); node != NULL; + node = ares__llist_node_next(node)) { + const struct server_connection *conn = ares__llist_node_val(node); + + if (!active_queries && !conn->is_tcp) { + continue; + } + + /* Silence coverity, shouldn't be possible */ + if (conn->fd == ARES_SOCKET_BAD) { + continue; + } + + /* Always wait on read */ + FD_SET(conn->fd, read_fds); + + if (conn->fd >= nfds) { + nfds = conn->fd + 1; + } + + /* TCP only wait on write if we have buffered data */ + if (conn->is_tcp && ares__buf_len(server->tcp_send)) { + FD_SET(conn->fd, write_fds); + } + } + } + + ares__channel_unlock(channel); + return (int)nfds; +} diff --git a/lib/c-ares-1.23.0/src/lib/ares_free_hostent.c b/lib/c-ares-1.23.0/src/lib/ares_free_hostent.c new file mode 100644 index 00000000000..a088c1b15cd --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares_free_hostent.c @@ -0,0 +1,57 @@ +/* MIT License + * + * Copyright (c) 1998 Massachusetts Institute of Technology + * Copyright (c) The c-ares project and its contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ + +#include "ares_setup.h" + +#ifdef HAVE_NETDB_H +# include +#endif + +#include "ares.h" +#include "ares_private.h" /* for memdebug */ + +void ares_free_hostent(struct hostent *host) +{ + char **p; + + if (!host) { + return; + } + + ares_free(host->h_name); + for (p = host->h_aliases; p && *p; p++) { + ares_free(*p); + } + ares_free(host->h_aliases); + if (host->h_addr_list) { + ares_free( + host->h_addr_list[0]); /* no matter if there is one or many entries, + there is only one malloc for all of them */ + ares_free(host->h_addr_list); + } + ares_free(host); +} diff --git a/lib/c-ares-1.23.0/src/lib/ares_free_string.c b/lib/c-ares-1.23.0/src/lib/ares_free_string.c new file mode 100644 index 00000000000..39773067bd2 --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares_free_string.c @@ -0,0 +1,36 @@ +/* MIT License + * + * Copyright (c) 2000 Massachusetts Institute of Technology + * Copyright (c) The c-ares project and its contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ + +#include "ares_setup.h" + +#include "ares.h" +#include "ares_private.h" + +void ares_free_string(void *str) +{ + ares_free(str); +} diff --git a/lib/c-ares-1.23.0/src/lib/ares_freeaddrinfo.c b/lib/c-ares-1.23.0/src/lib/ares_freeaddrinfo.c new file mode 100644 index 00000000000..45d931a3f86 --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares_freeaddrinfo.c @@ -0,0 +1,70 @@ +/* MIT License + * + * Copyright (c) 1998 Massachusetts Institute of Technology + * Copyright (c) 2019 Andrew Selivanov + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ + +#include "ares_setup.h" + +#ifdef HAVE_NETDB_H +# include +#endif + +#include "ares.h" +#include "ares_private.h" + +void ares__freeaddrinfo_cnames(struct ares_addrinfo_cname *head) +{ + struct ares_addrinfo_cname *current; + while (head) { + current = head; + head = head->next; + ares_free(current->alias); + ares_free(current->name); + ares_free(current); + } +} + +void ares__freeaddrinfo_nodes(struct ares_addrinfo_node *head) +{ + struct ares_addrinfo_node *current; + while (head) { + current = head; + head = head->ai_next; + ares_free(current->ai_addr); + ares_free(current); + } +} + +void ares_freeaddrinfo(struct ares_addrinfo *ai) +{ + if (ai == NULL) { + return; + } + ares__freeaddrinfo_cnames(ai->cnames); + ares__freeaddrinfo_nodes(ai->nodes); + + ares_free(ai->name); + ares_free(ai); +} diff --git a/lib/c-ares-1.23.0/src/lib/ares_getaddrinfo.c b/lib/c-ares-1.23.0/src/lib/ares_getaddrinfo.c new file mode 100644 index 00000000000..d5c440b2e44 --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares_getaddrinfo.c @@ -0,0 +1,775 @@ +/* MIT License + * + * Copyright (c) 1998, 2011, 2013 Massachusetts Institute of Technology + * Copyright (c) 2017 Christian Ammer + * Copyright (c) 2019 Andrew Selivanov + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ + +#include "ares_setup.h" + +#ifdef HAVE_GETSERVBYNAME_R +# if !defined(GETSERVBYNAME_R_ARGS) || (GETSERVBYNAME_R_ARGS < 4) || \ + (GETSERVBYNAME_R_ARGS > 6) +# error "you MUST specify a valid number of arguments for getservbyname_r" +# endif +#endif + +#ifdef HAVE_NETINET_IN_H +# include +#endif +#ifdef HAVE_NETDB_H +# include +#endif +#ifdef HAVE_ARPA_INET_H +# include +#endif + +#include "ares_nameser.h" + +#ifdef HAVE_STRINGS_H +# include +#endif +#include + +#ifdef HAVE_LIMITS_H +# include +#endif + +#include "ares.h" +#include "bitncmp.h" +#include "ares_private.h" +#include "ares_dns.h" + +#ifdef WATT32 +# undef WIN32 +#endif +#ifdef WIN32 +# include "ares_platform.h" +#endif + +struct host_query { + ares_channel_t *channel; + char *name; + unsigned short port; /* in host order */ + ares_addrinfo_callback callback; + void *arg; + struct ares_addrinfo_hints hints; + int sent_family; /* this family is what was is being used */ + size_t timeouts; /* number of timeouts we saw for this request */ + char *lookups; /* Duplicate memory from channel because of ares_reinit() */ + const char *remaining_lookups; /* types of lookup we need to perform ("fb" by + default, file and dns respectively) */ + char **domains; /* duplicate from channel for ares_reinit() safety */ + size_t ndomains; + struct ares_addrinfo *ai; /* store results between lookups */ + unsigned short qid_a; /* qid for A request */ + unsigned short qid_aaaa; /* qid for AAAA request */ + size_t remaining; /* number of DNS answers waiting for */ + ares_ssize_t next_domain; /* next search domain to try */ + size_t + nodata_cnt; /* Track nodata responses to possibly override final result */ +}; + +static const struct ares_addrinfo_hints default_hints = { + 0, /* ai_flags */ + AF_UNSPEC, /* ai_family */ + 0, /* ai_socktype */ + 0, /* ai_protocol */ +}; + +/* forward declarations */ +static void host_callback(void *arg, int status, int timeouts, + unsigned char *abuf, int alen); +static ares_bool_t as_is_first(const struct host_query *hquery); +static ares_bool_t as_is_only(const struct host_query *hquery); +static ares_bool_t next_dns_lookup(struct host_query *hquery); + +struct ares_addrinfo_cname * + ares__append_addrinfo_cname(struct ares_addrinfo_cname **head) +{ + struct ares_addrinfo_cname *tail = ares_malloc_zero(sizeof(*tail)); + struct ares_addrinfo_cname *last = *head; + + if (tail == NULL) { + return NULL; + } + + if (!last) { + *head = tail; + return tail; + } + + while (last->next) { + last = last->next; + } + + last->next = tail; + return tail; +} + +void ares__addrinfo_cat_cnames(struct ares_addrinfo_cname **head, + struct ares_addrinfo_cname *tail) +{ + struct ares_addrinfo_cname *last = *head; + if (!last) { + *head = tail; + return; + } + + while (last->next) { + last = last->next; + } + + last->next = tail; +} + +/* Allocate new addrinfo and append to the tail. */ +struct ares_addrinfo_node * + ares__append_addrinfo_node(struct ares_addrinfo_node **head) +{ + struct ares_addrinfo_node *tail = ares_malloc_zero(sizeof(*tail)); + struct ares_addrinfo_node *last = *head; + + if (tail == NULL) { + return NULL; + } + + if (!last) { + *head = tail; + return tail; + } + + while (last->ai_next) { + last = last->ai_next; + } + + last->ai_next = tail; + return tail; +} + +void ares__addrinfo_cat_nodes(struct ares_addrinfo_node **head, + struct ares_addrinfo_node *tail) +{ + struct ares_addrinfo_node *last = *head; + if (!last) { + *head = tail; + return; + } + + while (last->ai_next) { + last = last->ai_next; + } + + last->ai_next = tail; +} + +/* Resolve service name into port number given in host byte order. + * If not resolved, return 0. + */ +static unsigned short lookup_service(const char *service, int flags) +{ + const char *proto; + struct servent *sep; +#ifdef HAVE_GETSERVBYNAME_R + struct servent se; + char tmpbuf[4096]; +#endif + + if (service) { + if (flags & ARES_NI_UDP) { + proto = "udp"; + } else if (flags & ARES_NI_SCTP) { + proto = "sctp"; + } else if (flags & ARES_NI_DCCP) { + proto = "dccp"; + } else { + proto = "tcp"; + } +#ifdef HAVE_GETSERVBYNAME_R + memset(&se, 0, sizeof(se)); + sep = &se; + memset(tmpbuf, 0, sizeof(tmpbuf)); +# if GETSERVBYNAME_R_ARGS == 6 + if (getservbyname_r(service, proto, &se, (void *)tmpbuf, sizeof(tmpbuf), + &sep) != 0) { + sep = NULL; /* LCOV_EXCL_LINE: buffer large so this never fails */ + } +# elif GETSERVBYNAME_R_ARGS == 5 + sep = getservbyname_r(service, proto, &se, (void *)tmpbuf, sizeof(tmpbuf)); +# elif GETSERVBYNAME_R_ARGS == 4 + if (getservbyname_r(service, proto, &se, (void *)tmpbuf) != 0) { + sep = NULL; + } +# else + /* Lets just hope the OS uses TLS! */ + sep = getservbyname(service, proto); +# endif +#else + /* Lets just hope the OS uses TLS! */ +# if (defined(NETWARE) && !defined(__NOVELL_LIBC__)) + sep = getservbyname(service, (char *)proto); +# else + sep = getservbyname(service, proto); +# endif +#endif + return (sep ? ntohs((unsigned short)sep->s_port) : 0); + } + return 0; +} + +/* If the name looks like an IP address or an error occurred, + * fake up a host entry, end the query immediately, and return true. + * Otherwise return false. + */ +static ares_bool_t fake_addrinfo(const char *name, unsigned short port, + const struct ares_addrinfo_hints *hints, + struct ares_addrinfo *ai, + ares_addrinfo_callback callback, void *arg) +{ + struct ares_addrinfo_cname *cname; + ares_status_t status = ARES_SUCCESS; + ares_bool_t result = ARES_FALSE; + int family = hints->ai_family; + if (family == AF_INET || family == AF_INET6 || family == AF_UNSPEC) { + /* It only looks like an IP address if it's all numbers and dots. */ + size_t numdots = 0; + ares_bool_t valid = ARES_TRUE; + const char *p; + for (p = name; *p; p++) { + if (!ISDIGIT(*p) && *p != '.') { + valid = ARES_FALSE; + break; + } else if (*p == '.') { + numdots++; + } + } + + /* if we don't have 3 dots, it is illegal + * (although inet_pton doesn't think so). + */ + if (numdots != 3 || !valid) { + result = ARES_FALSE; + } else { + struct in_addr addr4; + result = + ares_inet_pton(AF_INET, name, &addr4) < 1 ? ARES_FALSE : ARES_TRUE; + if (result) { + status = ares_append_ai_node(AF_INET, port, 0, &addr4, &ai->nodes); + if (status != ARES_SUCCESS) { + callback(arg, (int)status, 0, NULL); + return ARES_TRUE; + } + } + } + } + + if (!result && (family == AF_INET6 || family == AF_UNSPEC)) { + struct ares_in6_addr addr6; + result = + ares_inet_pton(AF_INET6, name, &addr6) < 1 ? ARES_FALSE : ARES_TRUE; + if (result) { + status = ares_append_ai_node(AF_INET6, port, 0, &addr6, &ai->nodes); + if (status != ARES_SUCCESS) { + callback(arg, (int)status, 0, NULL); + return ARES_TRUE; + } + } + } + + if (!result) { + return ARES_FALSE; + } + + if (hints->ai_flags & ARES_AI_CANONNAME) { + cname = ares__append_addrinfo_cname(&ai->cnames); + if (!cname) { + ares_freeaddrinfo(ai); + callback(arg, ARES_ENOMEM, 0, NULL); + return ARES_TRUE; + } + + /* Duplicate the name, to avoid a constness violation. */ + cname->name = ares_strdup(name); + if (!cname->name) { + ares_freeaddrinfo(ai); + callback(arg, ARES_ENOMEM, 0, NULL); + return ARES_TRUE; + } + } + + ai->nodes->ai_socktype = hints->ai_socktype; + ai->nodes->ai_protocol = hints->ai_protocol; + + callback(arg, ARES_SUCCESS, 0, ai); + return ARES_TRUE; +} + +static void end_hquery(struct host_query *hquery, ares_status_t status) +{ + struct ares_addrinfo_node sentinel; + struct ares_addrinfo_node *next; + + if (status == ARES_SUCCESS) { + if (!(hquery->hints.ai_flags & ARES_AI_NOSORT) && hquery->ai->nodes) { + sentinel.ai_next = hquery->ai->nodes; + ares__sortaddrinfo(hquery->channel, &sentinel); + hquery->ai->nodes = sentinel.ai_next; + } + next = hquery->ai->nodes; + + while (next) { + next->ai_socktype = hquery->hints.ai_socktype; + next->ai_protocol = hquery->hints.ai_protocol; + next = next->ai_next; + } + } else { + /* Clean up what we have collected by so far. */ + ares_freeaddrinfo(hquery->ai); + hquery->ai = NULL; + } + + hquery->callback(hquery->arg, (int)status, (int)hquery->timeouts, hquery->ai); + ares__strsplit_free(hquery->domains, hquery->ndomains); + ares_free(hquery->lookups); + ares_free(hquery->name); + ares_free(hquery); +} + +ares_bool_t ares__is_localhost(const char *name) +{ + /* RFC6761 6.3 says : The domain "localhost." and any names falling within + * ".localhost." */ + size_t len; + + if (name == NULL) { + return ARES_FALSE; + } + + if (strcmp(name, "localhost") == 0) { + return ARES_TRUE; + } + + len = ares_strlen(name); + if (len < 10 /* strlen(".localhost") */) { + return ARES_FALSE; + } + + if (strcmp(name + (len - 10 /* strlen(".localhost") */), ".localhost") == 0) { + return ARES_TRUE; + } + + return ARES_FALSE; +} + +static ares_status_t file_lookup(struct host_query *hquery) +{ + const ares_hosts_entry_t *entry; + ares_status_t status; + + /* Per RFC 7686, reject queries for ".onion" domain names with NXDOMAIN. */ + if (ares__is_onion_domain(hquery->name)) { + return ARES_ENOTFOUND; + } + + status = ares__hosts_search_host( + hquery->channel, + (hquery->hints.ai_flags & ARES_AI_ENVHOSTS) ? ARES_TRUE : ARES_FALSE, + hquery->name, &entry); + + if (status != ARES_SUCCESS) { + goto done; + } + + status = ares__hosts_entry_to_addrinfo( + entry, hquery->name, hquery->hints.ai_family, hquery->port, + (hquery->hints.ai_flags & ARES_AI_CANONNAME) ? ARES_TRUE : ARES_FALSE, + hquery->ai); + + if (status != ARES_SUCCESS) { + goto done; + } + + +done: + /* RFC6761 section 6.3 #3 states that "Name resolution APIs and libraries + * SHOULD recognize localhost names as special and SHOULD always return the + * IP loopback address for address queries". + * We will also ignore ALL errors when trying to resolve localhost, such + * as permissions errors reading /etc/hosts or a malformed /etc/hosts */ + if (status != ARES_SUCCESS && status != ARES_ENOMEM && + ares__is_localhost(hquery->name)) { + return ares__addrinfo_localhost(hquery->name, hquery->port, &hquery->hints, + hquery->ai); + } + + return status; +} + +static void next_lookup(struct host_query *hquery, ares_status_t status) +{ + switch (*hquery->remaining_lookups) { + case 'b': + /* RFC6761 section 6.3 #3 says "Name resolution APIs SHOULD NOT send + * queries for localhost names to their configured caching DNS + * server(s)." + * Otherwise, DNS lookup. */ + if (!ares__is_localhost(hquery->name) && next_dns_lookup(hquery)) { + break; + } + + hquery->remaining_lookups++; + next_lookup(hquery, status); + break; + + case 'f': + /* Host file lookup */ + if (file_lookup(hquery) == ARES_SUCCESS) { + end_hquery(hquery, ARES_SUCCESS); + break; + } + hquery->remaining_lookups++; + next_lookup(hquery, status); + break; + default: + /* No lookup left */ + end_hquery(hquery, status); + break; + } +} + +static void terminate_retries(const struct host_query *hquery, + unsigned short qid) +{ + unsigned short term_qid = + (qid == hquery->qid_a) ? hquery->qid_aaaa : hquery->qid_a; + const ares_channel_t *channel = hquery->channel; + struct query *query = NULL; + + /* No other outstanding queries, nothing to do */ + if (!hquery->remaining) { + return; + } + + query = ares__htable_szvp_get_direct(channel->queries_by_qid, term_qid); + if (query == NULL) { + return; + } + + query->no_retries = ARES_TRUE; +} + +static void host_callback(void *arg, int status, int timeouts, + unsigned char *abuf, int alen) +{ + struct host_query *hquery = (struct host_query *)arg; + ares_status_t addinfostatus = ARES_SUCCESS; + unsigned short qid = 0; + hquery->timeouts += (size_t)timeouts; + hquery->remaining--; + + if (status == ARES_SUCCESS) { + if (alen < 0) { + addinfostatus = ARES_EBADRESP; + } else { + addinfostatus = ares__parse_into_addrinfo(abuf, (size_t)alen, ARES_TRUE, + hquery->port, hquery->ai); + } + if (addinfostatus == ARES_SUCCESS && alen >= HFIXEDSZ) { + qid = DNS_HEADER_QID(abuf); /* Converts to host byte order */ + terminate_retries(hquery, qid); + } + } + + if (!hquery->remaining) { + if (addinfostatus != ARES_SUCCESS && addinfostatus != ARES_ENODATA) { + /* error in parsing result e.g. no memory */ + if (addinfostatus == ARES_EBADRESP && hquery->ai->nodes) { + /* We got a bad response from server, but at least one query + * ended with ARES_SUCCESS */ + end_hquery(hquery, ARES_SUCCESS); + } else { + end_hquery(hquery, addinfostatus); + } + } else if (hquery->ai->nodes) { + /* at least one query ended with ARES_SUCCESS */ + end_hquery(hquery, ARES_SUCCESS); + } else if (status == ARES_EDESTRUCTION || status == ARES_ECANCELLED) { + /* must make sure we don't do next_lookup() on destroy or cancel */ + end_hquery(hquery, (ares_status_t)status); + } else if (status == ARES_ENOTFOUND || status == ARES_ENODATA || + addinfostatus == ARES_ENODATA) { + if (status == ARES_ENODATA || addinfostatus == ARES_ENODATA) { + hquery->nodata_cnt++; + } + next_lookup(hquery, + hquery->nodata_cnt ? ARES_ENODATA : (ares_status_t)status); + } else { + end_hquery(hquery, (ares_status_t)status); + } + } + + /* at this point we keep on waiting for the next query to finish */ +} + +static void ares_getaddrinfo_int(ares_channel_t *channel, const char *name, + const char *service, + const struct ares_addrinfo_hints *hints, + ares_addrinfo_callback callback, void *arg) +{ + struct host_query *hquery; + unsigned short port = 0; + int family; + struct ares_addrinfo *ai; + char *alias_name = NULL; + ares_status_t status; + + if (!hints) { + hints = &default_hints; + } + + family = hints->ai_family; + + /* Right now we only know how to look up Internet addresses + and unspec means try both basically. */ + if (family != AF_INET && family != AF_INET6 && family != AF_UNSPEC) { + callback(arg, ARES_ENOTIMP, 0, NULL); + return; + } + + if (ares__is_onion_domain(name)) { + callback(arg, ARES_ENOTFOUND, 0, NULL); + return; + } + + /* perform HOSTALIAS resolution (technically this function does some other + * things we are going to ignore) */ + status = ares__single_domain(channel, name, &alias_name); + if (status != ARES_SUCCESS) { + callback(arg, (int)status, 0, NULL); + return; + } + + if (alias_name) { + name = alias_name; + } + + if (service) { + if (hints->ai_flags & ARES_AI_NUMERICSERV) { + unsigned long val; + errno = 0; + val = strtoul(service, NULL, 0); + if ((val == 0 && errno != 0) || val > 65535) { + ares_free(alias_name); + callback(arg, ARES_ESERVICE, 0, NULL); + return; + } + port = (unsigned short)val; + } else { + port = lookup_service(service, 0); + if (!port) { + unsigned long val; + errno = 0; + val = strtoul(service, NULL, 0); + if ((val == 0 && errno != 0) || val > 65535) { + ares_free(alias_name); + callback(arg, ARES_ESERVICE, 0, NULL); + return; + } + port = (unsigned short)val; + } + } + } + + ai = ares_malloc_zero(sizeof(*ai)); + if (!ai) { + ares_free(alias_name); + callback(arg, ARES_ENOMEM, 0, NULL); + return; + } + + if (fake_addrinfo(name, port, hints, ai, callback, arg)) { + ares_free(alias_name); + return; + } + + /* Allocate and fill in the host query structure. */ + hquery = ares_malloc_zero(sizeof(*hquery)); + if (!hquery) { + ares_free(alias_name); + ares_freeaddrinfo(ai); + callback(arg, ARES_ENOMEM, 0, NULL); + return; + } + memset(hquery, 0, sizeof(*hquery)); + hquery->name = ares_strdup(name); + ares_free(alias_name); + if (!hquery->name) { + ares_free(hquery); + ares_freeaddrinfo(ai); + callback(arg, ARES_ENOMEM, 0, NULL); + return; + } + hquery->lookups = ares_strdup(channel->lookups); + if (!hquery->lookups) { + ares_free(hquery->name); + ares_free(hquery); + ares_freeaddrinfo(ai); + callback(arg, ARES_ENOMEM, 0, NULL); + return; + } + + if (channel->ndomains) { + /* Duplicate for ares_reinit() safety */ + hquery->domains = + ares__strsplit_duplicate(channel->domains, channel->ndomains); + if (hquery->domains == NULL) { + ares_free(hquery->lookups); + ares_free(hquery->name); + ares_free(hquery); + ares_freeaddrinfo(ai); + callback(arg, ARES_ENOMEM, 0, NULL); + return; + } + hquery->ndomains = channel->ndomains; + } + + hquery->port = port; + hquery->channel = channel; + hquery->hints = *hints; + hquery->sent_family = -1; /* nothing is sent yet */ + hquery->callback = callback; + hquery->arg = arg; + hquery->remaining_lookups = hquery->lookups; + hquery->ai = ai; + hquery->next_domain = -1; + + /* Start performing lookups according to channel->lookups. */ + next_lookup(hquery, ARES_ECONNREFUSED /* initial error code */); +} + +void ares_getaddrinfo(ares_channel_t *channel, const char *name, + const char *service, + const struct ares_addrinfo_hints *hints, + ares_addrinfo_callback callback, void *arg) +{ + if (channel == NULL) { + return; + } + ares__channel_lock(channel); + ares_getaddrinfo_int(channel, name, service, hints, callback, arg); + ares__channel_unlock(channel); +} + +static ares_bool_t next_dns_lookup(struct host_query *hquery) +{ + char *s = NULL; + ares_bool_t is_s_allocated = ARES_FALSE; + ares_status_t status; + + /* if next_domain == -1 and as_is_first is true, try hquery->name */ + if (hquery->next_domain == -1) { + if (as_is_first(hquery)) { + s = hquery->name; + } + hquery->next_domain = 0; + } + + /* if as_is_first is false, try hquery->name at last */ + if (!s && (size_t)hquery->next_domain == hquery->ndomains) { + if (!as_is_first(hquery)) { + s = hquery->name; + } + hquery->next_domain++; + } + + if (!s && (size_t)hquery->next_domain < hquery->ndomains && + !as_is_only(hquery)) { + status = ares__cat_domain(hquery->name, + hquery->domains[hquery->next_domain++], &s); + if (status == ARES_SUCCESS) { + is_s_allocated = ARES_TRUE; + } + } + + if (s) { + /* NOTE: hquery may be invalidated during the call to ares_query_qid(), + * so should not be referenced after this point */ + switch (hquery->hints.ai_family) { + case AF_INET: + hquery->remaining += 1; + ares_query_qid(hquery->channel, s, C_IN, T_A, host_callback, hquery, + &hquery->qid_a); + break; + case AF_INET6: + hquery->remaining += 1; + ares_query_qid(hquery->channel, s, C_IN, T_AAAA, host_callback, hquery, + &hquery->qid_aaaa); + break; + case AF_UNSPEC: + hquery->remaining += 2; + ares_query_qid(hquery->channel, s, C_IN, T_A, host_callback, hquery, + &hquery->qid_a); + ares_query_qid(hquery->channel, s, C_IN, T_AAAA, host_callback, hquery, + &hquery->qid_aaaa); + break; + default: + break; + } + if (is_s_allocated) { + ares_free(s); + } + return ARES_TRUE; + } else { + assert(!hquery->ai->nodes); + return ARES_FALSE; + } +} + +static ares_bool_t as_is_first(const struct host_query *hquery) +{ + const char *p; + size_t ndots = 0; + for (p = hquery->name; p && *p; p++) { + if (*p == '.') { + ndots++; + } + } + if (as_is_only(hquery)) { + /* prevent ARES_EBADNAME for valid FQDN, where ndots < channel->ndots */ + return ARES_TRUE; + } + return ndots >= hquery->channel->ndots ? ARES_TRUE : ARES_FALSE; +} + +static ares_bool_t as_is_only(const struct host_query *hquery) +{ + size_t nname = ares_strlen(hquery->name); + if (hquery->channel->flags & ARES_FLAG_NOSEARCH) { + return ARES_TRUE; + } + if (hquery->name != NULL && nname && hquery->name[nname - 1] == '.') { + return ARES_TRUE; + } + return ARES_FALSE; +} diff --git a/lib/c-ares-1.23.0/src/lib/ares_getenv.c b/lib/c-ares-1.23.0/src/lib/ares_getenv.c new file mode 100644 index 00000000000..08601a61e54 --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares_getenv.c @@ -0,0 +1,38 @@ +/* MIT License + * + * Copyright (c) 1998 Massachusetts Institute of Technology + * Copyright (c) The c-ares project and its contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ + +#include "ares_setup.h" +#include "ares_getenv.h" + +#ifndef HAVE_GETENV + +char *ares_getenv(const char *name) +{ + return NULL; +} + +#endif diff --git a/lib/c-ares-1.23.0/src/lib/ares_getenv.h b/lib/c-ares-1.23.0/src/lib/ares_getenv.h new file mode 100644 index 00000000000..d8bd3a2195b --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares_getenv.h @@ -0,0 +1,36 @@ +/* MIT License + * + * Copyright (c) 1998 Massachusetts Institute of Technology + * Copyright (c) The c-ares project and its contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ +#ifndef HEADER_CARES_GETENV_H +#define HEADER_CARES_GETENV_H + +#include "ares_setup.h" + +#ifndef HAVE_GETENV +extern char *ares_getenv(const char *name); +#endif + +#endif /* HEADER_CARES_GETENV_H */ diff --git a/lib/c-ares-1.23.0/src/lib/ares_gethostbyaddr.c b/lib/c-ares-1.23.0/src/lib/ares_gethostbyaddr.c new file mode 100644 index 00000000000..ab54706ba96 --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares_gethostbyaddr.c @@ -0,0 +1,233 @@ +/* MIT License + * + * Copyright (c) 1998 Massachusetts Institute of Technology + * Copyright (c) The c-ares project and its contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ + +#include "ares_setup.h" + +#ifdef HAVE_NETINET_IN_H +# include +#endif +#ifdef HAVE_NETDB_H +# include +#endif +#ifdef HAVE_ARPA_INET_H +# include +#endif + +#include "ares_nameser.h" + +#include "ares.h" +#include "ares_inet_net_pton.h" +#include "ares_platform.h" +#include "ares_private.h" + +#ifdef WATT32 +# undef WIN32 +#endif + +struct addr_query { + /* Arguments passed to ares_gethostbyaddr() */ + ares_channel_t *channel; + struct ares_addr addr; + ares_host_callback callback; + void *arg; + char *lookups; /* duplicate memory from channel for ares_reinit() */ + const char *remaining_lookups; + size_t timeouts; +}; + +static void next_lookup(struct addr_query *aquery); +static void addr_callback(void *arg, int status, int timeouts, + unsigned char *abuf, int alen); +static void end_aquery(struct addr_query *aquery, ares_status_t status, + struct hostent *host); +static ares_status_t file_lookup(ares_channel_t *channel, + const struct ares_addr *addr, + struct hostent **host); + +static void ares_gethostbyaddr_int(ares_channel_t *channel, const void *addr, + int addrlen, int family, + ares_host_callback callback, void *arg) +{ + struct addr_query *aquery; + + if (family != AF_INET && family != AF_INET6) { + callback(arg, ARES_ENOTIMP, 0, NULL); + return; + } + + if ((family == AF_INET && addrlen != sizeof(aquery->addr.addr.addr4)) || + (family == AF_INET6 && addrlen != sizeof(aquery->addr.addr.addr6))) { + callback(arg, ARES_ENOTIMP, 0, NULL); + return; + } + + aquery = ares_malloc(sizeof(struct addr_query)); + if (!aquery) { + callback(arg, ARES_ENOMEM, 0, NULL); + return; + } + aquery->lookups = ares_strdup(channel->lookups); + if (aquery->lookups == NULL) { + ares_free(aquery); + callback(arg, ARES_ENOMEM, 0, NULL); + return; + } + aquery->channel = channel; + if (family == AF_INET) { + memcpy(&aquery->addr.addr.addr4, addr, sizeof(aquery->addr.addr.addr4)); + } else { + memcpy(&aquery->addr.addr.addr6, addr, sizeof(aquery->addr.addr.addr6)); + } + aquery->addr.family = family; + aquery->callback = callback; + aquery->arg = arg; + aquery->remaining_lookups = aquery->lookups; + aquery->timeouts = 0; + + next_lookup(aquery); +} + +void ares_gethostbyaddr(ares_channel_t *channel, const void *addr, int addrlen, + int family, ares_host_callback callback, void *arg) +{ + if (channel == NULL) { + return; + } + ares__channel_lock(channel); + ares_gethostbyaddr_int(channel, addr, addrlen, family, callback, arg); + ares__channel_unlock(channel); +} + +static void next_lookup(struct addr_query *aquery) +{ + const char *p; + ares_status_t status; + struct hostent *host; + char *name; + + for (p = aquery->remaining_lookups; *p; p++) { + switch (*p) { + case 'b': + name = ares_dns_addr_to_ptr(&aquery->addr); + if (name == NULL) { + end_aquery(aquery, ARES_ENOMEM, NULL); + return; + } + aquery->remaining_lookups = p + 1; + ares_query(aquery->channel, name, C_IN, T_PTR, addr_callback, aquery); + ares_free(name); + return; + case 'f': + status = file_lookup(aquery->channel, &aquery->addr, &host); + + /* this status check below previously checked for !ARES_ENOTFOUND, + but we should not assume that this single error code is the one + that can occur, as that is in fact no longer the case */ + if (status == ARES_SUCCESS) { + end_aquery(aquery, status, host); + return; + } + break; + default: + break; + } + } + end_aquery(aquery, ARES_ENOTFOUND, NULL); +} + +static void addr_callback(void *arg, int status, int timeouts, + unsigned char *abuf, int alen) +{ + struct addr_query *aquery = (struct addr_query *)arg; + struct hostent *host; + size_t addrlen; + + aquery->timeouts += (size_t)timeouts; + if (status == ARES_SUCCESS) { + if (aquery->addr.family == AF_INET) { + addrlen = sizeof(aquery->addr.addr.addr4); + status = ares_parse_ptr_reply(abuf, alen, &aquery->addr.addr.addr4, + (int)addrlen, AF_INET, &host); + } else { + addrlen = sizeof(aquery->addr.addr.addr6); + status = ares_parse_ptr_reply(abuf, alen, &aquery->addr.addr.addr6, + (int)addrlen, AF_INET6, &host); + } + end_aquery(aquery, (ares_status_t)status, host); + } else if (status == ARES_EDESTRUCTION || status == ARES_ECANCELLED) { + end_aquery(aquery, (ares_status_t)status, NULL); + } else { + next_lookup(aquery); + } +} + +static void end_aquery(struct addr_query *aquery, ares_status_t status, + struct hostent *host) +{ + aquery->callback(aquery->arg, (int)status, (int)aquery->timeouts, host); + if (host) { + ares_free_hostent(host); + } + ares_free(aquery->lookups); + ares_free(aquery); +} + +static ares_status_t file_lookup(ares_channel_t *channel, + const struct ares_addr *addr, + struct hostent **host) +{ + char ipaddr[INET6_ADDRSTRLEN]; + const void *ptr = NULL; + const ares_hosts_entry_t *entry; + ares_status_t status; + + if (addr->family == AF_INET) { + ptr = &addr->addr.addr4; + } else if (addr->family == AF_INET6) { + ptr = &addr->addr.addr6; + } + + if (ptr == NULL) { + return ARES_ENOTFOUND; + } + + if (!ares_inet_ntop(addr->family, ptr, ipaddr, sizeof(ipaddr))) { + return ARES_ENOTFOUND; + } + + status = ares__hosts_search_ipaddr(channel, ARES_FALSE, ipaddr, &entry); + if (status != ARES_SUCCESS) { + return status; + } + + status = ares__hosts_entry_to_hostent(entry, addr->family, host); + if (status != ARES_SUCCESS) { + return status; + } + + return ARES_SUCCESS; +} diff --git a/lib/c-ares-1.23.0/src/lib/ares_gethostbyname.c b/lib/c-ares-1.23.0/src/lib/ares_gethostbyname.c new file mode 100644 index 00000000000..24deeb692c5 --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares_gethostbyname.c @@ -0,0 +1,326 @@ +/* MIT License + * + * Copyright (c) 1998, 2011, 2013 Massachusetts Institute of Technology + * Copyright (c) The c-ares project and its contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ + +#include "ares_setup.h" + +#ifdef HAVE_NETINET_IN_H +# include +#endif +#ifdef HAVE_NETDB_H +# include +#endif +#ifdef HAVE_ARPA_INET_H +# include +#endif + +#include "ares_nameser.h" + +#ifdef HAVE_STRINGS_H +# include +#endif + +#include "ares.h" +#include "ares_inet_net_pton.h" +#include "bitncmp.h" +#include "ares_platform.h" +#include "ares_private.h" + +static void sort_addresses(const struct hostent *host, + const struct apattern *sortlist, size_t nsort); +static void sort6_addresses(const struct hostent *host, + const struct apattern *sortlist, size_t nsort); +static size_t get_address_index(const struct in_addr *addr, + const struct apattern *sortlist, size_t nsort); +static size_t get6_address_index(const struct ares_in6_addr *addr, + const struct apattern *sortlist, size_t nsort); + +struct host_query { + ares_host_callback callback; + void *arg; + ares_channel_t *channel; +}; + +static void ares_gethostbyname_callback(void *arg, int status, int timeouts, + struct ares_addrinfo *result) +{ + struct hostent *hostent = NULL; + struct host_query *ghbn_arg = arg; + + if (status == ARES_SUCCESS) { + status = (int)ares__addrinfo2hostent(result, AF_UNSPEC, &hostent); + } + + /* addrinfo2hostent will only return ENODATA if there are no addresses _and_ + * no cname/aliases. However, gethostbyname will return ENODATA even if there + * is cname/alias data */ + if (status == ARES_SUCCESS && hostent && + (!hostent->h_addr_list || !hostent->h_addr_list[0])) { + status = ARES_ENODATA; + } + + if (status == ARES_SUCCESS && ghbn_arg->channel->nsort && hostent) { + if (hostent->h_addrtype == AF_INET6) { + sort6_addresses(hostent, ghbn_arg->channel->sortlist, + ghbn_arg->channel->nsort); + } + if (hostent->h_addrtype == AF_INET) { + sort_addresses(hostent, ghbn_arg->channel->sortlist, + ghbn_arg->channel->nsort); + } + } + + ghbn_arg->callback(ghbn_arg->arg, status, timeouts, hostent); + + ares_freeaddrinfo(result); + ares_free(ghbn_arg); + ares_free_hostent(hostent); +} + +void ares_gethostbyname(ares_channel_t *channel, const char *name, int family, + ares_host_callback callback, void *arg) +{ + const struct ares_addrinfo_hints hints = { ARES_AI_CANONNAME, family, 0, 0 }; + struct host_query *ghbn_arg; + + if (!callback) { + return; + } + + ghbn_arg = ares_malloc(sizeof(*ghbn_arg)); + if (!ghbn_arg) { + callback(arg, ARES_ENOMEM, 0, NULL); + return; + } + + ghbn_arg->callback = callback; + ghbn_arg->arg = arg; + ghbn_arg->channel = channel; + + /* NOTE: ares_getaddrinfo() locks the channel, we don't use the channel + * outside so no need to lock */ + ares_getaddrinfo(channel, name, NULL, &hints, ares_gethostbyname_callback, + ghbn_arg); +} + +static void sort_addresses(const struct hostent *host, + const struct apattern *sortlist, size_t nsort) +{ + struct in_addr a1; + struct in_addr a2; + int i1; + int i2; + size_t ind1; + size_t ind2; + + /* This is a simple insertion sort, not optimized at all. i1 walks + * through the address list, with the loop invariant that everything + * to the left of i1 is sorted. In the loop body, the value at i1 is moved + * back through the list (via i2) until it is in sorted order. + */ + for (i1 = 0; host->h_addr_list[i1]; i1++) { + memcpy(&a1, host->h_addr_list[i1], sizeof(struct in_addr)); + ind1 = get_address_index(&a1, sortlist, nsort); + for (i2 = i1 - 1; i2 >= 0; i2--) { + memcpy(&a2, host->h_addr_list[i2], sizeof(struct in_addr)); + ind2 = get_address_index(&a2, sortlist, nsort); + if (ind2 <= ind1) { + break; + } + memcpy(host->h_addr_list[i2 + 1], &a2, sizeof(struct in_addr)); + } + memcpy(host->h_addr_list[i2 + 1], &a1, sizeof(struct in_addr)); + } +} + +/* Find the first entry in sortlist which matches addr. Return nsort + * if none of them match. + */ +static size_t get_address_index(const struct in_addr *addr, + const struct apattern *sortlist, size_t nsort) +{ + size_t i; + + for (i = 0; i < nsort; i++) { + if (sortlist[i].family != AF_INET) { + continue; + } + if (sortlist[i].type == PATTERN_MASK) { + if ((addr->s_addr & sortlist[i].mask.addr4.s_addr) == + sortlist[i].addr.addr4.s_addr) { + break; + } + } else { + if (!ares__bitncmp(&addr->s_addr, &sortlist[i].addr.addr4.s_addr, + sortlist[i].mask.bits)) { + break; + } + } + } + return i; +} + +static void sort6_addresses(const struct hostent *host, + const struct apattern *sortlist, size_t nsort) +{ + struct ares_in6_addr a1; + struct ares_in6_addr a2; + int i1; + int i2; + size_t ind1; + size_t ind2; + + /* This is a simple insertion sort, not optimized at all. i1 walks + * through the address list, with the loop invariant that everything + * to the left of i1 is sorted. In the loop body, the value at i1 is moved + * back through the list (via i2) until it is in sorted order. + */ + for (i1 = 0; host->h_addr_list[i1]; i1++) { + memcpy(&a1, host->h_addr_list[i1], sizeof(struct ares_in6_addr)); + ind1 = get6_address_index(&a1, sortlist, nsort); + for (i2 = i1 - 1; i2 >= 0; i2--) { + memcpy(&a2, host->h_addr_list[i2], sizeof(struct ares_in6_addr)); + ind2 = get6_address_index(&a2, sortlist, nsort); + if (ind2 <= ind1) { + break; + } + memcpy(host->h_addr_list[i2 + 1], &a2, sizeof(struct ares_in6_addr)); + } + memcpy(host->h_addr_list[i2 + 1], &a1, sizeof(struct ares_in6_addr)); + } +} + +/* Find the first entry in sortlist which matches addr. Return nsort + * if none of them match. + */ +static size_t get6_address_index(const struct ares_in6_addr *addr, + const struct apattern *sortlist, size_t nsort) +{ + size_t i; + + for (i = 0; i < nsort; i++) { + if (sortlist[i].family != AF_INET6) { + continue; + } + if (!ares__bitncmp(addr, &sortlist[i].addr.addr6, sortlist[i].mask.bits)) { + break; + } + } + return i; +} + +static ares_status_t ares__hostent_localhost(const char *name, int family, + struct hostent **host_out) +{ + ares_status_t status; + struct ares_addrinfo *ai = NULL; + struct ares_addrinfo_hints hints; + + memset(&hints, 0, sizeof(hints)); + hints.ai_family = family; + + ai = ares_malloc_zero(sizeof(*ai)); + if (ai == NULL) { + status = ARES_ENOMEM; + goto done; + } + + status = ares__addrinfo_localhost(name, 0, &hints, ai); + if (status != ARES_SUCCESS) { + goto done; + } + + status = ares__addrinfo2hostent(ai, family, host_out); + if (status != ARES_SUCCESS) { + goto done; + } + +done: + ares_freeaddrinfo(ai); + return status; +} + +/* I really have no idea why this is exposed as a public function, but since + * it is, we can't kill this legacy function. */ +static ares_status_t ares_gethostbyname_file_int(ares_channel_t *channel, + const char *name, int family, + struct hostent **host) +{ + const ares_hosts_entry_t *entry; + ares_status_t status; + + /* We only take the channel to ensure that ares_init() been called. */ + if (channel == NULL || name == NULL || host == NULL) { + /* Anything will do, really. This seems fine, and is consistent with + other error cases. */ + if (host != NULL) { + *host = NULL; + } + return ARES_ENOTFOUND; + } + + /* Per RFC 7686, reject queries for ".onion" domain names with NXDOMAIN. */ + if (ares__is_onion_domain(name)) { + return ARES_ENOTFOUND; + } + + status = ares__hosts_search_host(channel, ARES_FALSE, name, &entry); + if (status != ARES_SUCCESS) { + goto done; + } + + status = ares__hosts_entry_to_hostent(entry, family, host); + if (status != ARES_SUCCESS) { + goto done; + } + +done: + /* RFC6761 section 6.3 #3 states that "Name resolution APIs and libraries + * SHOULD recognize localhost names as special and SHOULD always return the + * IP loopback address for address queries". + * We will also ignore ALL errors when trying to resolve localhost, such + * as permissions errors reading /etc/hosts or a malformed /etc/hosts */ + if (status != ARES_SUCCESS && status != ARES_ENOMEM && + ares__is_localhost(name)) { + return ares__hostent_localhost(name, family, host); + } + + return status; +} + +int ares_gethostbyname_file(ares_channel_t *channel, const char *name, + int family, struct hostent **host) +{ + ares_status_t status; + if (channel == NULL) { + return ARES_ENOTFOUND; + } + + ares__channel_lock(channel); + status = ares_gethostbyname_file_int(channel, name, family, host); + ares__channel_unlock(channel); + return (int)status; +} diff --git a/lib/c-ares-1.23.0/src/lib/ares_getnameinfo.c b/lib/c-ares-1.23.0/src/lib/ares_getnameinfo.c new file mode 100644 index 00000000000..2afcfade688 --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares_getnameinfo.c @@ -0,0 +1,438 @@ +/* MIT License + * + * Copyright (c) 2005, 2013 Dominick Meglio + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ +#include "ares_setup.h" + +#ifdef HAVE_GETSERVBYPORT_R +# if !defined(GETSERVBYPORT_R_ARGS) || (GETSERVBYPORT_R_ARGS < 4) || \ + (GETSERVBYPORT_R_ARGS > 6) +# error "you MUST specify a valid number of arguments for getservbyport_r" +# endif +#endif + +#ifdef HAVE_NETINET_IN_H +# include +#endif +#ifdef HAVE_NETDB_H +# include +#endif +#ifdef HAVE_ARPA_INET_H +# include +#endif + +#include "ares_nameser.h" + +#ifdef HAVE_NET_IF_H +# include +#endif +#if defined(USE_WINSOCK) && defined(HAVE_IPHLPAPI_H) +# include +#endif + +#include "ares.h" +#include "ares_ipv6.h" +#include "ares_private.h" + +struct nameinfo_query { + ares_nameinfo_callback callback; + void *arg; + + union { + struct sockaddr_in addr4; + struct sockaddr_in6 addr6; + } addr; + + int family; + unsigned int flags; + size_t timeouts; +}; + +#ifdef HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID +# define IPBUFSIZ \ + (sizeof("ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255") + IF_NAMESIZE) +#else +# define IPBUFSIZ (sizeof("ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255")) +#endif + +static void nameinfo_callback(void *arg, int status, int timeouts, + struct hostent *host); +static char *lookup_service(unsigned short port, unsigned int flags, char *buf, + size_t buflen); +#ifdef HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID +static void append_scopeid(const struct sockaddr_in6 *addr6, + unsigned int scopeid, char *buf, size_t buflen); +#endif +STATIC_TESTABLE char *ares_striendstr(const char *s1, const char *s2); + +static void ares_getnameinfo_int(ares_channel_t *channel, + const struct sockaddr *sa, + ares_socklen_t salen, int flags_int, + ares_nameinfo_callback callback, void *arg) +{ + const struct sockaddr_in *addr = NULL; + const struct sockaddr_in6 *addr6 = NULL; + struct nameinfo_query *niquery; + unsigned short port = 0; + unsigned int flags = (unsigned int)flags_int; + + /* Validate socket address family and length */ + if ((sa->sa_family == AF_INET) && (salen == sizeof(struct sockaddr_in))) { + addr = CARES_INADDR_CAST(struct sockaddr_in *, sa); + port = addr->sin_port; + } else if ((sa->sa_family == AF_INET6) && + (salen == sizeof(struct sockaddr_in6))) { + addr6 = CARES_INADDR_CAST(struct sockaddr_in6 *, sa); + port = addr6->sin6_port; + } else { + callback(arg, ARES_ENOTIMP, 0, NULL, NULL); + return; + } + + /* If neither, assume they want a host */ + if (!(flags & ARES_NI_LOOKUPSERVICE) && !(flags & ARES_NI_LOOKUPHOST)) { + flags |= ARES_NI_LOOKUPHOST; + } + + /* All they want is a service, no need for DNS */ + if ((flags & ARES_NI_LOOKUPSERVICE) && !(flags & ARES_NI_LOOKUPHOST)) { + char buf[33]; + char *service; + + service = + lookup_service((unsigned short)(port & 0xffff), flags, buf, sizeof(buf)); + callback(arg, ARES_SUCCESS, 0, NULL, service); + return; + } + + /* They want a host lookup */ + if (flags & ARES_NI_LOOKUPHOST) { + /* A numeric host can be handled without DNS */ + if (flags & ARES_NI_NUMERICHOST) { + char ipbuf[IPBUFSIZ]; + char srvbuf[33]; + char *service = NULL; + ipbuf[0] = 0; + + /* Specifying not to lookup a host, but then saying a host + * is required has to be illegal. + */ + if (flags & ARES_NI_NAMEREQD) { + callback(arg, ARES_EBADFLAGS, 0, NULL, NULL); + return; + } + if (salen == sizeof(struct sockaddr_in6)) { + ares_inet_ntop(AF_INET6, &addr6->sin6_addr, ipbuf, IPBUFSIZ); + /* If the system supports scope IDs, use it */ +#ifdef HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID + append_scopeid(addr6, flags, ipbuf, sizeof(ipbuf)); +#endif + } else { + ares_inet_ntop(AF_INET, &addr->sin_addr, ipbuf, IPBUFSIZ); + } + /* They also want a service */ + if (flags & ARES_NI_LOOKUPSERVICE) { + service = lookup_service((unsigned short)(port & 0xffff), flags, srvbuf, + sizeof(srvbuf)); + } + callback(arg, ARES_SUCCESS, 0, ipbuf, service); + return; + } + /* This is where a DNS lookup becomes necessary */ + else { + niquery = ares_malloc(sizeof(struct nameinfo_query)); + if (!niquery) { + callback(arg, ARES_ENOMEM, 0, NULL, NULL); + return; + } + niquery->callback = callback; + niquery->arg = arg; + niquery->flags = flags; + niquery->timeouts = 0; + if (sa->sa_family == AF_INET) { + niquery->family = AF_INET; + memcpy(&niquery->addr.addr4, addr, sizeof(niquery->addr.addr4)); + ares_gethostbyaddr(channel, &addr->sin_addr, sizeof(struct in_addr), + AF_INET, nameinfo_callback, niquery); + } else { + niquery->family = AF_INET6; + memcpy(&niquery->addr.addr6, addr6, sizeof(niquery->addr.addr6)); + ares_gethostbyaddr(channel, &addr6->sin6_addr, + sizeof(struct ares_in6_addr), AF_INET6, + nameinfo_callback, niquery); + } + } + } +} + +void ares_getnameinfo(ares_channel_t *channel, const struct sockaddr *sa, + ares_socklen_t salen, int flags_int, + ares_nameinfo_callback callback, void *arg) +{ + if (channel == NULL) { + return; + } + + ares__channel_lock(channel); + ares_getnameinfo_int(channel, sa, salen, flags_int, callback, arg); + ares__channel_unlock(channel); +} + +static void nameinfo_callback(void *arg, int status, int timeouts, + struct hostent *host) +{ + struct nameinfo_query *niquery = (struct nameinfo_query *)arg; + char srvbuf[33]; + char *service = NULL; + + niquery->timeouts += (size_t)timeouts; + if (status == ARES_SUCCESS) { + /* They want a service too */ + if (niquery->flags & ARES_NI_LOOKUPSERVICE) { + if (niquery->family == AF_INET) { + service = lookup_service(niquery->addr.addr4.sin_port, niquery->flags, + srvbuf, sizeof(srvbuf)); + } else { + service = lookup_service(niquery->addr.addr6.sin6_port, niquery->flags, + srvbuf, sizeof(srvbuf)); + } + } + /* NOFQDN means we have to strip off the domain name portion. We do + this by determining our own domain name, then searching the string + for this domain name and removing it. + */ +#ifdef HAVE_GETHOSTNAME + if (niquery->flags & ARES_NI_NOFQDN) { + char buf[255]; + const char *domain; + gethostname(buf, 255); + if ((domain = strchr(buf, '.')) != NULL) { + char *end = ares_striendstr(host->h_name, domain); + if (end) { + *end = 0; + } + } + } +#endif + niquery->callback(niquery->arg, ARES_SUCCESS, (int)niquery->timeouts, + host->h_name, service); + ares_free(niquery); + return; + } + /* We couldn't find the host, but it's OK, we can use the IP */ + else if (status == ARES_ENOTFOUND && !(niquery->flags & ARES_NI_NAMEREQD)) { + char ipbuf[IPBUFSIZ]; + if (niquery->family == AF_INET) { + ares_inet_ntop(AF_INET, &niquery->addr.addr4.sin_addr, ipbuf, IPBUFSIZ); + } else { + ares_inet_ntop(AF_INET6, &niquery->addr.addr6.sin6_addr, ipbuf, IPBUFSIZ); +#ifdef HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID + append_scopeid(&niquery->addr.addr6, niquery->flags, ipbuf, + sizeof(ipbuf)); +#endif + } + /* They want a service too */ + if (niquery->flags & ARES_NI_LOOKUPSERVICE) { + if (niquery->family == AF_INET) { + service = lookup_service(niquery->addr.addr4.sin_port, niquery->flags, + srvbuf, sizeof(srvbuf)); + } else { + service = lookup_service(niquery->addr.addr6.sin6_port, niquery->flags, + srvbuf, sizeof(srvbuf)); + } + } + niquery->callback(niquery->arg, ARES_SUCCESS, (int)niquery->timeouts, ipbuf, + service); + ares_free(niquery); + return; + } + niquery->callback(niquery->arg, status, (int)niquery->timeouts, NULL, NULL); + ares_free(niquery); +} + +static char *lookup_service(unsigned short port, unsigned int flags, char *buf, + size_t buflen) +{ + const char *proto; + struct servent *sep; +#ifdef HAVE_GETSERVBYPORT_R + struct servent se; +#endif + char tmpbuf[4096]; + const char *name; + size_t name_len; + + if (port) { + if (flags & ARES_NI_NUMERICSERV) { + sep = NULL; + } else { + if (flags & ARES_NI_UDP) { + proto = "udp"; + } else if (flags & ARES_NI_SCTP) { + proto = "sctp"; + } else if (flags & ARES_NI_DCCP) { + proto = "dccp"; + } else { + proto = "tcp"; + } +#ifdef HAVE_GETSERVBYPORT_R + memset(&se, 0, sizeof(se)); + sep = &se; + memset(tmpbuf, 0, sizeof(tmpbuf)); +# if GETSERVBYPORT_R_ARGS == 6 + if (getservbyport_r(port, proto, &se, (void *)tmpbuf, sizeof(tmpbuf), + &sep) != 0) { + sep = NULL; /* LCOV_EXCL_LINE: buffer large so this never fails */ + } +# elif GETSERVBYPORT_R_ARGS == 5 + sep = getservbyport_r(port, proto, &se, (void *)tmpbuf, sizeof(tmpbuf)); +# elif GETSERVBYPORT_R_ARGS == 4 + if (getservbyport_r(port, proto, &se, (void *)tmpbuf) != 0) { + sep = NULL; + } +# else + /* Lets just hope the OS uses TLS! */ + sep = getservbyport(port, proto); +# endif +#else + /* Lets just hope the OS uses TLS! */ +# if (defined(NETWARE) && !defined(__NOVELL_LIBC__)) + sep = getservbyport(port, (char *)proto); +# else + sep = getservbyport(port, proto); +# endif +#endif + } + if (sep && sep->s_name) { + /* get service name */ + name = sep->s_name; + } else { + /* get port as a string */ + snprintf(tmpbuf, sizeof(tmpbuf), "%u", (unsigned int)ntohs(port)); + name = tmpbuf; + } + name_len = ares_strlen(name); + if (name_len < buflen) { + /* return it if buffer big enough */ + memcpy(buf, name, name_len + 1); + } else { + /* avoid reusing previous one */ + buf[0] = '\0'; /* LCOV_EXCL_LINE: no real service names are too big */ + } + return buf; + } + buf[0] = '\0'; + return NULL; +} + +#ifdef HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID +static void append_scopeid(const struct sockaddr_in6 *addr6, unsigned int flags, + char *buf, size_t buflen) +{ +# ifdef HAVE_IF_INDEXTONAME + int is_ll; + int is_mcll; +# endif + char tmpbuf[IF_NAMESIZE + 2]; + size_t bufl; + + tmpbuf[0] = '%'; + +# ifdef HAVE_IF_INDEXTONAME + is_ll = IN6_IS_ADDR_LINKLOCAL(&addr6->sin6_addr); + is_mcll = IN6_IS_ADDR_MC_LINKLOCAL(&addr6->sin6_addr); + if ((flags & ARES_NI_NUMERICSCOPE) || (!is_ll && !is_mcll)) { + snprintf(&tmpbuf[1], sizeof(tmpbuf) - 1, "%lu", + (unsigned long)addr6->sin6_scope_id); + } else { + if (if_indextoname(addr6->sin6_scope_id, &tmpbuf[1]) == NULL) { + snprintf(&tmpbuf[1], sizeof(tmpbuf) - 1, "%lu", + (unsigned long)addr6->sin6_scope_id); + } + } +# else + snprintf(&tmpbuf[1], sizeof(tmpbuf) - 1, "%lu", + (unsigned long)addr6->sin6_scope_id); + (void)flags; +# endif + tmpbuf[IF_NAMESIZE + 1] = '\0'; + bufl = ares_strlen(buf); + + if (bufl + ares_strlen(tmpbuf) < buflen) { + /* only append the scopeid string if it fits in the target buffer */ + ares_strcpy(&buf[bufl], tmpbuf, buflen - bufl); + } +} +#endif + +/* Determines if s1 ends with the string in s2 (case-insensitive) */ +STATIC_TESTABLE char *ares_striendstr(const char *s1, const char *s2) +{ + const char *c1; + const char *c2; + const char *c1_begin; + int lo1; + int lo2; + size_t s1_len = ares_strlen(s1); + size_t s2_len = ares_strlen(s2); + + if (s1 == NULL || s2 == NULL) { + return NULL; + } + + /* If the substr is longer than the full str, it can't match */ + if (s2_len > s1_len) { + return NULL; + } + + /* Jump to the end of s1 minus the length of s2 */ + c1_begin = s1 + s1_len - s2_len; + c1 = c1_begin; + c2 = s2; + while (c2 < s2 + s2_len) { + lo1 = TOLOWER(*c1); + lo2 = TOLOWER(*c2); + if (lo1 != lo2) { + return NULL; + } else { + c1++; + c2++; + } + } + /* Cast off const */ + return (char *)((size_t)c1_begin); +} + +ares_bool_t ares__is_onion_domain(const char *name) +{ + if (ares_striendstr(name, ".onion")) { + return ARES_TRUE; + } + + if (ares_striendstr(name, ".onion.")) { + return ARES_TRUE; + } + + return ARES_FALSE; +} diff --git a/lib/c-ares-1.23.0/src/lib/ares_getsock.c b/lib/c-ares-1.23.0/src/lib/ares_getsock.c new file mode 100644 index 00000000000..0353bad6391 --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares_getsock.c @@ -0,0 +1,88 @@ +/* MIT License + * + * Copyright (c) 2005 Daniel Stenberg + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ + +#include "ares_setup.h" + +#include "ares.h" +#include "ares_private.h" + +int ares_getsock(ares_channel_t *channel, ares_socket_t *socks, + int numsocks) /* size of the 'socks' array */ +{ + ares__slist_node_t *snode; + size_t sockindex = 0; + unsigned int bitmap = 0; + unsigned int setbits = 0xffffffff; + + /* Are there any active queries? */ + size_t active_queries; + + if (channel == NULL || numsocks <= 0) { + return 0; + } + + ares__channel_lock(channel); + + active_queries = ares__llist_len(channel->all_queries); + + for (snode = ares__slist_node_first(channel->servers); snode != NULL; + snode = ares__slist_node_next(snode)) { + struct server_state *server = ares__slist_node_val(snode); + ares__llist_node_t *node; + + for (node = ares__llist_node_first(server->connections); node != NULL; + node = ares__llist_node_next(node)) { + const struct server_connection *conn = ares__llist_node_val(node); + + if (sockindex >= (size_t)numsocks || sockindex >= ARES_GETSOCK_MAXNUM) { + break; + } + + /* We only need to register interest in UDP sockets if we have + * outstanding queries. + */ + if (!active_queries && !conn->is_tcp) { + continue; + } + + socks[sockindex] = conn->fd; + + if (active_queries || conn->is_tcp) { + bitmap |= ARES_GETSOCK_READABLE(setbits, sockindex); + } + + if (conn->is_tcp && ares__buf_len(server->tcp_send)) { + /* then the tcp socket is also writable! */ + bitmap |= ARES_GETSOCK_WRITABLE(setbits, sockindex); + } + + sockindex++; + } + } + + ares__channel_unlock(channel); + return (int)bitmap; +} diff --git a/lib/c-ares-1.23.0/src/lib/ares_inet_net_pton.h b/lib/c-ares-1.23.0/src/lib/ares_inet_net_pton.h new file mode 100644 index 00000000000..0a52855bd8c --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares_inet_net_pton.h @@ -0,0 +1,35 @@ +/* MIT License + * + * Copyright (c) 2005 Daniel Stenberg + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ +#ifndef HEADER_CARES_INET_NET_PTON_H +#define HEADER_CARES_INET_NET_PTON_H + +#ifdef HAVE_INET_NET_PTON +# define ares_inet_net_pton(w, x, y, z) inet_net_pton(w, x, y, z) +#else +int ares_inet_net_pton(int af, const char *src, void *dst, size_t size); +#endif + +#endif /* HEADER_CARES_INET_NET_PTON_H */ diff --git a/lib/c-ares-1.23.0/src/lib/ares_init.c b/lib/c-ares-1.23.0/src/lib/ares_init.c new file mode 100644 index 00000000000..d737b5853dc --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares_init.c @@ -0,0 +1,567 @@ +/* MIT License + * + * Copyright (c) 1998 Massachusetts Institute of Technology + * Copyright (c) 2007 Daniel Stenberg + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ + +#include "ares_setup.h" + +#ifdef HAVE_SYS_PARAM_H +# include +#endif + +#ifdef HAVE_NETINET_IN_H +# include +#endif + +#ifdef HAVE_NETDB_H +# include +#endif + +#ifdef HAVE_ARPA_INET_H +# include +#endif + +#include "ares_nameser.h" + +#if defined(ANDROID) || defined(__ANDROID__) +# include +# include "ares_android.h" +/* From the Bionic sources */ +# define DNS_PROP_NAME_PREFIX "net.dns" +# define MAX_DNS_PROPERTIES 8 +#endif + +#if defined(CARES_USE_LIBRESOLV) +# include +#endif + +#if defined(USE_WINSOCK) && defined(HAVE_IPHLPAPI_H) +# include +#endif + +#include "ares.h" +#include "ares_inet_net_pton.h" +#include "ares_platform.h" +#include "ares_private.h" + +#ifdef WATT32 +# undef WIN32 /* Redefined in MingW/MSVC headers */ +#endif + + +int ares_init(ares_channel_t **channelptr) +{ + return ares_init_options(channelptr, NULL, 0); +} + +static int ares_query_timeout_cmp_cb(const void *arg1, const void *arg2) +{ + const struct query *q1 = arg1; + const struct query *q2 = arg2; + + if (q1->timeout.tv_sec > q2->timeout.tv_sec) { + return 1; + } + if (q1->timeout.tv_sec < q2->timeout.tv_sec) { + return -1; + } + + if (q1->timeout.tv_usec > q2->timeout.tv_usec) { + return 1; + } + if (q1->timeout.tv_usec < q2->timeout.tv_usec) { + return -1; + } + + return 0; +} + +static int server_sort_cb(const void *data1, const void *data2) +{ + const struct server_state *s1 = data1; + const struct server_state *s2 = data2; + + if (s1->consec_failures < s2->consec_failures) { + return -1; + } + if (s1->consec_failures > s2->consec_failures) { + return 1; + } + if (s1->idx < s2->idx) { + return -1; + } + if (s1->idx > s2->idx) { + return 1; + } + return 0; +} + +static void server_destroy_cb(void *data) +{ + if (data == NULL) { + return; + } + ares__destroy_server(data); +} + +static ares_status_t init_by_defaults(ares_channel_t *channel) +{ + char *hostname = NULL; + ares_status_t rc = ARES_SUCCESS; +#ifdef HAVE_GETHOSTNAME + const char *dot; +#endif + + /* Enable EDNS by default */ + if (!(channel->optmask & ARES_OPT_FLAGS)) { + channel->flags = ARES_FLAG_EDNS; + } + if (channel->ednspsz == 0) { + channel->ednspsz = EDNSPACKETSZ; + } + + if (channel->timeout == 0) { + channel->timeout = DEFAULT_TIMEOUT; + } + + if (channel->tries == 0) { + channel->tries = DEFAULT_TRIES; + } + + if (channel->ndots == 0) { + channel->ndots = 1; + } + + if (ares__slist_len(channel->servers) == 0) { + struct ares_addr addr; + ares__llist_t *sconfig = NULL; + + addr.family = AF_INET; + addr.addr.addr4.s_addr = htonl(INADDR_LOOPBACK); + + rc = ares__sconfig_append(&sconfig, &addr, 0, 0); + if (rc != ARES_SUCCESS) { + return rc; + } + + rc = ares__servers_update(channel, sconfig, ARES_FALSE); + ares__llist_destroy(sconfig); + + if (rc != ARES_SUCCESS) { + return rc; + } + } + +#if defined(USE_WINSOCK) +# define toolong(x) (x == -1) && (SOCKERRNO == WSAEFAULT) +#elif defined(ENAMETOOLONG) +# define toolong(x) \ + (x == -1) && ((SOCKERRNO == ENAMETOOLONG) || (SOCKERRNO == EINVAL)) +#else +# define toolong(x) (x == -1) && (SOCKERRNO == EINVAL) +#endif + + if (channel->ndomains == 0) { + /* Derive a default domain search list from the kernel hostname, + * or set it to empty if the hostname isn't helpful. + */ +#ifndef HAVE_GETHOSTNAME + channel->ndomains = 0; /* default to none */ +#else + GETHOSTNAME_TYPE_ARG2 lenv = 64; + size_t len = 64; + int res; + channel->ndomains = 0; /* default to none */ + + hostname = ares_malloc(len); + if (!hostname) { + rc = ARES_ENOMEM; + goto error; + } + + do { + res = gethostname(hostname, lenv); + + if (toolong(res)) { + char *p; + len *= 2; + lenv *= 2; + p = ares_realloc(hostname, len); + if (!p) { + rc = ARES_ENOMEM; + goto error; + } + hostname = p; + continue; + } else if (res) { + /* Lets not treat a gethostname failure as critical, since we + * are ok if gethostname doesn't even exist */ + *hostname = '\0'; + break; + } + + } while (res != 0); + + dot = strchr(hostname, '.'); + if (dot) { + /* a dot was found */ + channel->domains = ares_malloc(sizeof(char *)); + if (!channel->domains) { + rc = ARES_ENOMEM; + goto error; + } + channel->domains[0] = ares_strdup(dot + 1); + if (!channel->domains[0]) { + rc = ARES_ENOMEM; + goto error; + } + channel->ndomains = 1; + } +#endif + } + + if (channel->nsort == 0) { + channel->sortlist = NULL; + } + + if (!channel->lookups) { + channel->lookups = ares_strdup("fb"); + if (!channel->lookups) { + rc = ARES_ENOMEM; + } + } + +error: + if (rc) { + if (channel->domains && channel->domains[0]) { + ares_free(channel->domains[0]); + } + if (channel->domains) { + ares_free(channel->domains); + channel->domains = NULL; + } + + if (channel->lookups) { + ares_free(channel->lookups); + channel->lookups = NULL; + } + + if (channel->resolvconf_path) { + ares_free(channel->resolvconf_path); + channel->resolvconf_path = NULL; + } + + if (channel->hosts_path) { + ares_free(channel->hosts_path); + channel->hosts_path = NULL; + } + } + + if (hostname) { + ares_free(hostname); + } + + return rc; +} + +int ares_init_options(ares_channel_t **channelptr, + const struct ares_options *options, int optmask) +{ + ares_channel_t *channel; + ares_status_t status = ARES_SUCCESS; + + if (ares_library_initialized() != ARES_SUCCESS) { + return ARES_ENOTINITIALIZED; /* LCOV_EXCL_LINE: n/a on non-WinSock */ + } + + channel = ares_malloc_zero(sizeof(*channel)); + if (!channel) { + *channelptr = NULL; + return ARES_ENOMEM; + } + + status = ares__channel_threading_init(channel); + if (status != ARES_SUCCESS) { + goto done; + } + + /* Generate random key */ + channel->rand_state = ares__init_rand_state(); + if (channel->rand_state == NULL) { + status = ARES_ENOMEM; + DEBUGF(fprintf(stderr, "Error: init_id_key failed: %s\n", + ares_strerror(status))); + goto done; + } + + /* Initialize Server List */ + channel->servers = + ares__slist_create(channel->rand_state, server_sort_cb, server_destroy_cb); + if (channel->servers == NULL) { + status = ARES_ENOMEM; + goto done; + } + + /* Initialize our lists of queries */ + channel->all_queries = ares__llist_create(NULL); + if (channel->all_queries == NULL) { + status = ARES_ENOMEM; + goto done; + } + + channel->queries_by_qid = ares__htable_szvp_create(NULL); + if (channel->queries_by_qid == NULL) { + status = ARES_ENOMEM; + goto done; + } + + channel->queries_by_timeout = + ares__slist_create(channel->rand_state, ares_query_timeout_cmp_cb, NULL); + if (channel->queries_by_timeout == NULL) { + status = ARES_ENOMEM; + goto done; + } + + channel->connnode_by_socket = ares__htable_asvp_create(NULL); + if (channel->connnode_by_socket == NULL) { + status = ARES_ENOMEM; + goto done; + } + + /* Initialize configuration by each of the four sources, from highest + * precedence to lowest. + */ + + status = ares__init_by_options(channel, options, optmask); + if (status != ARES_SUCCESS) { + DEBUGF(fprintf(stderr, "Error: init_by_options failed: %s\n", + ares_strerror(status))); + /* If we fail to apply user-specified options, fail the whole init process + */ + goto done; + } + + if (channel->qcache_max_ttl > 0) { + status = ares__qcache_create(channel->rand_state, channel->qcache_max_ttl, + &channel->qcache); + if (status != ARES_SUCCESS) { + goto done; + } + } + + if (status == ARES_SUCCESS) { + status = ares__init_by_sysconfig(channel); + if (status != ARES_SUCCESS) { + DEBUGF(fprintf(stderr, "Error: init_by_sysconfig failed: %s\n", + ares_strerror(status))); + } + } + + /* + * No matter what failed or succeeded, seed defaults to provide + * useful behavior for things that we missed. + */ + status = init_by_defaults(channel); + if (status != ARES_SUCCESS) { + DEBUGF(fprintf(stderr, "Error: init_by_defaults failed: %s\n", + ares_strerror(status))); + } + +done: + if (status != ARES_SUCCESS) { + ares_destroy(channel); + return (int)status; + } + + *channelptr = channel; + return ARES_SUCCESS; +} + +ares_status_t ares_reinit(ares_channel_t *channel) +{ + ares_status_t status; + + if (channel == NULL) { + return ARES_EFORMERR; + } + + ares__channel_lock(channel); + + status = ares__init_by_sysconfig(channel); + if (status != ARES_SUCCESS) { + DEBUGF(fprintf(stderr, "Error: init_by_sysconfig failed: %s\n", + ares_strerror(status))); + } + + /* Flush cached queries on reinit */ + if (channel->qcache) { + ares__qcache_flush(channel->qcache); + } + + ares__channel_unlock(channel); + + return status; +} + +/* ares_dup() duplicates a channel handle with all its options and returns a + new channel handle */ +int ares_dup(ares_channel_t **dest, ares_channel_t *src) +{ + struct ares_options opts; + struct ares_addr_port_node *servers; + ares_status_t rc; + int optmask; + + if (dest == NULL || src == NULL) { + return ARES_EFORMERR; + } + + *dest = NULL; /* in case of failure return NULL explicitly */ + + ares__channel_lock(src); + /* First get the options supported by the old ares_save_options() function, + which is most of them */ + rc = (ares_status_t)ares_save_options(src, &opts, &optmask); + if (rc != ARES_SUCCESS) { + ares_destroy_options(&opts); + goto done; + } + + /* Then create the new channel with those options */ + rc = (ares_status_t)ares_init_options(dest, &opts, optmask); + + /* destroy the options copy to not leak any memory */ + ares_destroy_options(&opts); + + if (rc != ARES_SUCCESS) { + goto done; + } + + /* Now clone the options that ares_save_options() doesn't support, but are + * user-provided */ + (*dest)->sock_create_cb = src->sock_create_cb; + (*dest)->sock_create_cb_data = src->sock_create_cb_data; + (*dest)->sock_config_cb = src->sock_config_cb; + (*dest)->sock_config_cb_data = src->sock_config_cb_data; + (*dest)->sock_funcs = src->sock_funcs; + (*dest)->sock_func_cb_data = src->sock_func_cb_data; + + ares_strcpy((*dest)->local_dev_name, src->local_dev_name, + sizeof((*dest)->local_dev_name)); + (*dest)->local_ip4 = src->local_ip4; + memcpy((*dest)->local_ip6, src->local_ip6, sizeof(src->local_ip6)); + + + /* Servers are a bit unique as ares_init_options() only allows ipv4 servers + * and not a port per server, but there are other user specified ways, that + * too will toggle the optmask ARES_OPT_SERVERS to let us know. If that's + * the case, pull them in. + * + * We don't want to clone system-configuration servers though. + */ + + if (optmask & ARES_OPT_SERVERS) { + rc = (ares_status_t)ares_get_servers_ports(src, &servers); + if (rc != ARES_SUCCESS) { + ares_destroy(*dest); + *dest = NULL; + goto done; + } + + rc = (ares_status_t)ares_set_servers_ports(*dest, servers); + ares_free_data(servers); + if (rc != ARES_SUCCESS) { + ares_destroy(*dest); + *dest = NULL; + goto done; + } + } + + rc = ARES_SUCCESS; +done: + ares__channel_unlock(src); + return (int)rc; /* everything went fine */ +} + +void ares_set_local_ip4(ares_channel_t *channel, unsigned int local_ip) +{ + if (channel == NULL) { + return; + } + ares__channel_lock(channel); + channel->local_ip4 = local_ip; + ares__channel_unlock(channel); +} + +/* local_ip6 should be 16 bytes in length */ +void ares_set_local_ip6(ares_channel_t *channel, const unsigned char *local_ip6) +{ + if (channel == NULL) { + return; + } + ares__channel_lock(channel); + memcpy(&channel->local_ip6, local_ip6, sizeof(channel->local_ip6)); + ares__channel_unlock(channel); +} + +/* local_dev_name should be null terminated. */ +void ares_set_local_dev(ares_channel_t *channel, const char *local_dev_name) +{ + if (channel == NULL) { + return; + } + + ares__channel_lock(channel); + ares_strcpy(channel->local_dev_name, local_dev_name, + sizeof(channel->local_dev_name)); + channel->local_dev_name[sizeof(channel->local_dev_name) - 1] = 0; + ares__channel_unlock(channel); +} + +int ares_set_sortlist(ares_channel_t *channel, const char *sortstr) +{ + size_t nsort = 0; + struct apattern *sortlist = NULL; + ares_status_t status; + + if (!channel) { + return ARES_ENODATA; + } + ares__channel_lock(channel); + + status = ares__parse_sortlist(&sortlist, &nsort, sortstr); + if (status == ARES_SUCCESS && sortlist) { + if (channel->sortlist) { + ares_free(channel->sortlist); + } + channel->sortlist = sortlist; + channel->nsort = nsort; + + /* Save sortlist as if it was passed in as an option */ + channel->optmask |= ARES_OPT_SORTLIST; + } + ares__channel_unlock(channel); + return (int)status; +} diff --git a/lib/c-ares-1.23.0/src/lib/ares_iphlpapi.h b/lib/c-ares-1.23.0/src/lib/ares_iphlpapi.h new file mode 100644 index 00000000000..0eaacd18f69 --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares_iphlpapi.h @@ -0,0 +1,236 @@ +/* MIT License + * + * Copyright (c) 1998 Massachusetts Institute of Technology + * Copyright (c) 2004 Daniel Stenberg + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ +#ifndef HEADER_CARES_IPHLPAPI_H +#define HEADER_CARES_IPHLPAPI_H + +#if defined(USE_WINSOCK) + +# ifndef INET_ADDRSTRLEN +# define INET_ADDRSTRLEN 22 +# endif + +# ifndef INET6_ADDRSTRLEN +# define INET6_ADDRSTRLEN 65 +# endif + +/* ---------------------------------- */ +# if !defined(_WS2DEF_) && !defined(__CSADDR_DEFINED__) && \ + !defined(__CSADDR_T_DEFINED) +/* ---------------------------------- */ + +typedef struct _SOCKET_ADDRESS { + LPSOCKADDR lpSockaddr; + INT iSockaddrLength; +} SOCKET_ADDRESS, *PSOCKET_ADDRESS; + +typedef struct _CSADDR_INFO { + SOCKET_ADDRESS LocalAddr; + SOCKET_ADDRESS RemoteAddr; + INT iSocketType; + INT iProtocol; +} CSADDR_INFO, *PCSADDR_INFO; + +/* --------------------------------- */ +# endif /* ! _WS2DEF_ && \ */ +/* ! __CSADDR_DEFINED__ && \ */ +/* ! __CSADDR_T_DEFINED */ +/* --------------------------------- */ + +/* ------------------------------- */ +# if !defined(IP_ADAPTER_DDNS_ENABLED) +/* ------------------------------- */ + +# define IP_ADAPTER_ADDRESS_DNS_ELIGIBLE 0x0001 +# define IP_ADAPTER_ADDRESS_TRANSIENT 0x0002 + +# define IP_ADAPTER_DDNS_ENABLED 0x0001 +# define IP_ADAPTER_REGISTER_ADAPTER_SUFFIX 0x0002 +# define IP_ADAPTER_DHCP_ENABLED 0x0004 +# define IP_ADAPTER_RECEIVE_ONLY 0x0008 +# define IP_ADAPTER_NO_MULTICAST 0x0010 +# define IP_ADAPTER_IPV6_OTHER_STATEFUL_CONFIG 0x0020 + +# define GAA_FLAG_SKIP_UNICAST 0x0001 +# define GAA_FLAG_SKIP_ANYCAST 0x0002 +# define GAA_FLAG_SKIP_MULTICAST 0x0004 +# define GAA_FLAG_SKIP_DNS_SERVER 0x0008 +# define GAA_FLAG_INCLUDE_PREFIX 0x0010 +# define GAA_FLAG_SKIP_FRIENDLY_NAME 0x0020 + +typedef enum { + IpPrefixOriginOther = 0, + IpPrefixOriginManual, + IpPrefixOriginWellKnown, + IpPrefixOriginDhcp, + IpPrefixOriginRouterAdvertisement +} IP_PREFIX_ORIGIN; + +typedef enum { + IpSuffixOriginOther = 0, + IpSuffixOriginManual, + IpSuffixOriginWellKnown, + IpSuffixOriginDhcp, + IpSuffixOriginLinkLayerAddress, + IpSuffixOriginRandom +} IP_SUFFIX_ORIGIN; + +typedef enum { + IpDadStateInvalid = 0, + IpDadStateTentative, + IpDadStateDuplicate, + IpDadStateDeprecated, + IpDadStatePreferred +} IP_DAD_STATE; + +typedef enum { + IfOperStatusUp = 1, + IfOperStatusDown, + IfOperStatusTesting, + IfOperStatusUnknown, + IfOperStatusDormant, + IfOperStatusNotPresent, + IfOperStatusLowerLayerDown +} IF_OPER_STATUS; + +typedef enum { + ScopeLevelInterface = 0x0001, + ScopeLevelLink = 0x0002, + ScopeLevelSubnet = 0x0003, + ScopeLevelAdmin = 0x0004, + ScopeLevelSite = 0x0005, + ScopeLevelOrganization = 0x0008, + ScopeLevelGlobal = 0x000E +} SCOPE_LEVEL; + +typedef struct _IP_ADAPTER_UNICAST_ADDRESS { + union { + ULONGLONG Alignment; + + struct { + ULONG Length; + DWORD Flags; + } s; + } u; + struct _IP_ADAPTER_UNICAST_ADDRESS *Next; + SOCKET_ADDRESS Address; + IP_PREFIX_ORIGIN PrefixOrigin; + IP_SUFFIX_ORIGIN SuffixOrigin; + IP_DAD_STATE DadState; + ULONG ValidLifetime; + ULONG PreferredLifetime; + ULONG LeaseLifetime; +} IP_ADAPTER_UNICAST_ADDRESS, *PIP_ADAPTER_UNICAST_ADDRESS; + +typedef struct _IP_ADAPTER_ANYCAST_ADDRESS { + union { + ULONGLONG Alignment; + + struct { + ULONG Length; + DWORD Flags; + } s; + } u; + struct _IP_ADAPTER_ANYCAST_ADDRESS *Next; + SOCKET_ADDRESS Address; +} IP_ADAPTER_ANYCAST_ADDRESS, *PIP_ADAPTER_ANYCAST_ADDRESS; + +typedef struct _IP_ADAPTER_MULTICAST_ADDRESS { + union { + ULONGLONG Alignment; + + struct { + ULONG Length; + DWORD Flags; + } s; + } u; + struct _IP_ADAPTER_MULTICAST_ADDRESS *Next; + SOCKET_ADDRESS Address; +} IP_ADAPTER_MULTICAST_ADDRESS, *PIP_ADAPTER_MULTICAST_ADDRESS; + +typedef struct _IP_ADAPTER_DNS_SERVER_ADDRESS { + union { + ULONGLONG Alignment; + + struct { + ULONG Length; + DWORD Reserved; + } s; + } u; + struct _IP_ADAPTER_DNS_SERVER_ADDRESS *Next; + SOCKET_ADDRESS Address; +} IP_ADAPTER_DNS_SERVER_ADDRESS, *PIP_ADAPTER_DNS_SERVER_ADDRESS; + +typedef struct _IP_ADAPTER_PREFIX { + union { + ULONGLONG Alignment; + + struct { + ULONG Length; + DWORD Flags; + } s; + } u; + struct _IP_ADAPTER_PREFIX *Next; + SOCKET_ADDRESS Address; + ULONG PrefixLength; +} IP_ADAPTER_PREFIX, *PIP_ADAPTER_PREFIX; + +typedef struct _IP_ADAPTER_ADDRESSES { + union { + ULONGLONG Alignment; + + struct { + ULONG Length; + DWORD IfIndex; + } s; + } u; + struct _IP_ADAPTER_ADDRESSES *Next; + PCHAR AdapterName; + PIP_ADAPTER_UNICAST_ADDRESS FirstUnicastAddress; + PIP_ADAPTER_ANYCAST_ADDRESS FirstAnycastAddress; + PIP_ADAPTER_MULTICAST_ADDRESS FirstMulticastAddress; + PIP_ADAPTER_DNS_SERVER_ADDRESS FirstDnsServerAddress; + PWCHAR DnsSuffix; + PWCHAR Description; + PWCHAR FriendlyName; + BYTE PhysicalAddress[MAX_ADAPTER_ADDRESS_LENGTH]; + DWORD PhysicalAddressLength; + DWORD Flags; + DWORD Mtu; + DWORD IfType; + IF_OPER_STATUS OperStatus; + DWORD Ipv6IfIndex; + DWORD ZoneIndices[16]; + PIP_ADAPTER_PREFIX FirstPrefix; +} IP_ADAPTER_ADDRESSES, *PIP_ADAPTER_ADDRESSES; + +/* -------------------------------- */ +# endif /* ! IP_ADAPTER_DDNS_ENABLED */ +/* -------------------------------- */ + +#endif /* USE_WINSOCK */ + +#endif /* HEADER_CARES_IPHLPAPI_H */ diff --git a/lib/c-ares-1.23.0/src/lib/ares_ipv6.h b/lib/c-ares-1.23.0/src/lib/ares_ipv6.h new file mode 100644 index 00000000000..be8cbe98939 --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares_ipv6.h @@ -0,0 +1,92 @@ +/* MIT License + * + * Copyright (c) 2005 Dominick Meglio + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ + +#ifndef ARES_IPV6_H +#define ARES_IPV6_H + +#ifndef HAVE_PF_INET6 +# define PF_INET6 AF_INET6 +#endif + +#ifndef HAVE_STRUCT_SOCKADDR_IN6 +struct sockaddr_in6 { + unsigned short sin6_family; + unsigned short sin6_port; + unsigned long sin6_flowinfo; + struct ares_in6_addr sin6_addr; + unsigned int sin6_scope_id; +}; +#endif + +typedef union { + struct sockaddr sa; + struct sockaddr_in sa4; + struct sockaddr_in6 sa6; +} ares_sockaddr; + +#ifndef HAVE_STRUCT_ADDRINFO +struct addrinfo { + int ai_flags; + int ai_family; + int ai_socktype; + int ai_protocol; + ares_socklen_t ai_addrlen; /* Follow rfc3493 struct addrinfo */ + char *ai_canonname; + struct sockaddr *ai_addr; + struct addrinfo *ai_next; +}; +#endif + +#ifndef NS_IN6ADDRSZ +# ifndef HAVE_STRUCT_IN6_ADDR +/* We cannot have it set to zero, so we pick a fixed value here */ +# define NS_IN6ADDRSZ 16 +# else +# define NS_IN6ADDRSZ sizeof(struct in6_addr) +# endif +#endif + +#ifndef NS_INADDRSZ +# define NS_INADDRSZ sizeof(struct in_addr) +#endif + +#ifndef NS_INT16SZ +# define NS_INT16SZ 2 +#endif + +#ifndef IF_NAMESIZE +# ifdef IFNAMSIZ +# define IF_NAMESIZE IFNAMSIZ +# else +# define IF_NAMESIZE 256 +# endif +#endif + +/* Defined in inet_net_pton.c for no particular reason. */ +extern const struct ares_in6_addr ares_in6addr_any; /* :: */ + + +#endif /* ARES_IPV6_H */ diff --git a/lib/c-ares-1.23.0/src/lib/ares_library_init.c b/lib/c-ares-1.23.0/src/lib/ares_library_init.c new file mode 100644 index 00000000000..5cd39dc244b --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares_library_init.c @@ -0,0 +1,162 @@ +/* MIT License + * + * Copyright (c) 1998 Massachusetts Institute of Technology + * Copyright (c) 2004 Daniel Stenberg + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ + +#include "ares_setup.h" + +#include "ares.h" +#include "ares_private.h" + +/* library-private global and unique instance vars */ + +#if defined(ANDROID) || defined(__ANDROID__) +# include "ares_android.h" +#endif + +/* library-private global vars with source visibility restricted to this file */ + +static unsigned int ares_initialized; +static int ares_init_flags; + +/* library-private global vars with visibility across the whole library */ + +/* Some systems may return either NULL or a valid pointer on malloc(0). c-ares + * should never call malloc(0) so lets return NULL so we're more likely to find + * an issue if it were to occur. */ + +static void *default_malloc(size_t size) +{ + if (size == 0) { + return NULL; + } + return malloc(size); +} + +#if defined(WIN32) +/* We need indirections to handle Windows DLL rules. */ +static void *default_realloc(void *p, size_t size) +{ + return realloc(p, size); +} + +static void default_free(void *p) +{ + free(p); +} +#else +# define default_realloc realloc +# define default_free free +#endif +void *(*ares_malloc)(size_t size) = default_malloc; +void *(*ares_realloc)(void *ptr, size_t size) = default_realloc; +void (*ares_free)(void *ptr) = default_free; + +void *ares_malloc_zero(size_t size) +{ + void *ptr = ares_malloc(size); + if (ptr != NULL) { + memset(ptr, 0, size); + } + + return ptr; +} + +void *ares_realloc_zero(void *ptr, size_t orig_size, size_t new_size) +{ + void *p = ares_realloc(ptr, new_size); + if (p == NULL) { + return NULL; + } + + if (new_size > orig_size) { + memset((unsigned char *)p + orig_size, 0, new_size - orig_size); + } + + return p; +} + +int ares_library_init(int flags) +{ + if (ares_initialized) { + ares_initialized++; + return ARES_SUCCESS; + } + ares_initialized++; + + /* NOTE: ARES_LIB_INIT_WIN32 flag no longer used */ + + ares_init_flags = flags; + + return ARES_SUCCESS; +} + +int ares_library_init_mem(int flags, void *(*amalloc)(size_t size), + void (*afree)(void *ptr), + void *(*arealloc)(void *ptr, size_t size)) +{ + if (amalloc) { + ares_malloc = amalloc; + } + if (arealloc) { + ares_realloc = arealloc; + } + if (afree) { + ares_free = afree; + } + return ares_library_init(flags); +} + +void ares_library_cleanup(void) +{ + if (!ares_initialized) { + return; + } + ares_initialized--; + if (ares_initialized) { + return; + } + + /* NOTE: ARES_LIB_INIT_WIN32 flag no longer used */ + +#if defined(ANDROID) || defined(__ANDROID__) + ares_library_cleanup_android(); +#endif + + ares_init_flags = ARES_LIB_INIT_NONE; + ares_malloc = malloc; + ares_realloc = realloc; + ares_free = free; +} + +int ares_library_initialized(void) +{ +#ifdef USE_WINSOCK + if (!ares_initialized) { + return ARES_ENOTINITIALIZED; + } +#endif + return ARES_SUCCESS; +} diff --git a/lib/c-ares-1.23.0/src/lib/ares_math.c b/lib/c-ares-1.23.0/src/lib/ares_math.c new file mode 100644 index 00000000000..977fb78e1ce --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares_math.c @@ -0,0 +1,114 @@ +/* MIT License + * + * Copyright (c) 2023 Brad House + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ +#include "ares_setup.h" +#include "ares.h" +#include "ares_private.h" + +/* Uses public domain code snippets from + * http://graphics.stanford.edu/~seander/bithacks.html */ + +size_t ares__round_up_pow2(size_t n) +{ + /* NOTE: if already a power of 2, will return itself, not the next */ + n--; + n |= n >> 1; + n |= n >> 2; + n |= n >> 4; + n |= n >> 8; + n |= n >> 16; + if (sizeof(size_t) > 4) { + n |= n >> 32; + } + n++; + return n; +} + +size_t ares__log2(size_t n) +{ + static const unsigned char tab32[32] = { 0, 1, 28, 2, 29, 14, 24, 3, + 30, 22, 20, 15, 25, 17, 4, 8, + 31, 27, 13, 23, 21, 19, 16, 7, + 26, 12, 18, 6, 11, 5, 10, 9 }; + static const unsigned char tab64[64] = { + 63, 0, 58, 1, 59, 47, 53, 2, 60, 39, 48, 27, 54, 33, 42, 3, + 61, 51, 37, 40, 49, 18, 28, 20, 55, 30, 34, 11, 43, 14, 22, 4, + 62, 57, 46, 52, 38, 26, 32, 41, 50, 36, 17, 19, 29, 10, 13, 21, + 56, 45, 25, 31, 35, 16, 9, 12, 44, 24, 15, 8, 23, 7, 6, 5 + }; + + if (sizeof(size_t) == 4) { + return tab32[(n * 0x077CB531) >> 27]; + } + + return tab64[(n * 0x07EDD5E59A4E28C2) >> 58]; +} + +/* x^y */ +size_t ares__pow(size_t x, size_t y) +{ + size_t res = 1; + + while (y > 0) { + /* If y is odd, multiply x with result */ + if (y & 1) { + res = res * x; + } + + /* y must be even now */ + y = y >> 1; /* y /= 2; */ + x = x * x; /* x^2 */ + } + + return res; +} + +size_t ares__count_digits(size_t n) +{ + size_t digits; + + for (digits = 0; n > 0; digits++) { + n /= 10; + } + if (digits == 0) { + digits = 1; + } + + return digits; +} + +size_t ares__count_hexdigits(size_t n) +{ + size_t digits; + + for (digits = 0; n > 0; digits++) { + n /= 16; + } + if (digits == 0) { + digits = 1; + } + + return digits; +} diff --git a/lib/c-ares-1.23.0/src/lib/ares_mkquery.c b/lib/c-ares-1.23.0/src/lib/ares_mkquery.c new file mode 100644 index 00000000000..da1898e74cd --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares_mkquery.c @@ -0,0 +1,35 @@ +/* MIT License + * + * Copyright (c) 1998 Massachusetts Institute of Technology + * Copyright (c) The c-ares project and its contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ + +#include "ares_setup.h" +#include "ares.h" + +int ares_mkquery(const char *name, int dnsclass, int type, unsigned short id, + int rd, unsigned char **buf, int *buflen) +{ + return ares_create_query(name, dnsclass, type, id, rd, buf, buflen, 0); +} diff --git a/lib/c-ares-1.23.0/src/lib/ares_options.c b/lib/c-ares-1.23.0/src/lib/ares_options.c new file mode 100644 index 00000000000..7fa64499a7e --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares_options.c @@ -0,0 +1,405 @@ +/* MIT License + * + * Copyright (c) 1998 Massachusetts Institute of Technology + * Copyright (c) 2008 Daniel Stenberg + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ + +#include "ares_setup.h" + +#ifdef HAVE_ARPA_INET_H +# include +#endif + +#include "ares.h" +#include "ares_data.h" +#include "ares_inet_net_pton.h" +#include "ares_private.h" + +void ares_destroy_options(struct ares_options *options) +{ + int i; + + ares_free(options->servers); + + for (i = 0; options->domains && i < options->ndomains; i++) { + ares_free(options->domains[i]); + } + + ares_free(options->domains); + ares_free(options->sortlist); + ares_free(options->lookups); + ares_free(options->resolvconf_path); + ares_free(options->hosts_path); +} + +static struct in_addr *ares_save_opt_servers(ares_channel_t *channel, + int *nservers) +{ + ares__slist_node_t *snode; + struct in_addr *out = + ares_malloc_zero(ares__slist_len(channel->servers) * sizeof(*out)); + + *nservers = 0; + + if (out == NULL) { + return NULL; + } + + for (snode = ares__slist_node_first(channel->servers); snode != NULL; + snode = ares__slist_node_next(snode)) { + const struct server_state *server = ares__slist_node_val(snode); + + if (server->addr.family != AF_INET) { + continue; + } + + memcpy(&out[*nservers], &server->addr.addr.addr4, sizeof(*out)); + (*nservers)++; + } + + return out; +} + +/* Save options from initialized channel */ +int ares_save_options(ares_channel_t *channel, struct ares_options *options, + int *optmask) +{ + size_t i; + + /* NOTE: We can't zero the whole thing out, this is because the size of the + * struct ares_options changes over time, so if someone compiled + * with an older version, their struct size might be smaller and + * we might overwrite their memory! So using the optmask is critical + * here, as they could have only set options they knew about. + * + * Unfortunately ares_destroy_options() doesn't take an optmask, so + * there are a few pointers we *must* zero out otherwise we won't + * know if they were allocated or not + */ + options->servers = NULL; + options->domains = NULL; + options->sortlist = NULL; + options->lookups = NULL; + options->resolvconf_path = NULL; + options->hosts_path = NULL; + + if (!ARES_CONFIG_CHECK(channel)) { + return ARES_ENODATA; + } + + if (channel->optmask & ARES_OPT_FLAGS) { + options->flags = (int)channel->flags; + } + + /* We convert ARES_OPT_TIMEOUT to ARES_OPT_TIMEOUTMS in + * ares__init_by_options() */ + if (channel->optmask & ARES_OPT_TIMEOUTMS) { + options->timeout = (int)channel->timeout; + } + + if (channel->optmask & ARES_OPT_TRIES) { + options->tries = (int)channel->tries; + } + + if (channel->optmask & ARES_OPT_NDOTS) { + options->ndots = (int)channel->ndots; + } + + if (channel->optmask & ARES_OPT_MAXTIMEOUTMS) { + options->maxtimeout = (int)channel->maxtimeout; + } + + if (channel->optmask & ARES_OPT_UDP_PORT) { + options->udp_port = channel->udp_port; + } + if (channel->optmask & ARES_OPT_TCP_PORT) { + options->tcp_port = channel->tcp_port; + } + + if (channel->optmask & ARES_OPT_SOCK_STATE_CB) { + options->sock_state_cb = channel->sock_state_cb; + options->sock_state_cb_data = channel->sock_state_cb_data; + } + + if (channel->optmask & ARES_OPT_SERVERS) { + options->servers = ares_save_opt_servers(channel, &options->nservers); + if (options->servers == NULL) { + return ARES_ENOMEM; + } + } + + if (channel->optmask & ARES_OPT_DOMAINS) { + options->domains = NULL; + if (channel->ndomains) { + options->domains = ares_malloc(channel->ndomains * sizeof(char *)); + if (!options->domains) { + return ARES_ENOMEM; + } + + for (i = 0; i < channel->ndomains; i++) { + options->domains[i] = ares_strdup(channel->domains[i]); + if (!options->domains[i]) { + options->ndomains = (int)i; + return ARES_ENOMEM; + } + } + } + options->ndomains = (int)channel->ndomains; + } + + if (channel->optmask & ARES_OPT_LOOKUPS) { + options->lookups = ares_strdup(channel->lookups); + if (!options->lookups && channel->lookups) { + return ARES_ENOMEM; + } + } + + if (channel->optmask & ARES_OPT_SORTLIST) { + options->sortlist = NULL; + if (channel->nsort) { + options->sortlist = ares_malloc(channel->nsort * sizeof(struct apattern)); + if (!options->sortlist) { + return ARES_ENOMEM; + } + for (i = 0; i < channel->nsort; i++) { + options->sortlist[i] = channel->sortlist[i]; + } + } + options->nsort = (int)channel->nsort; + } + + if (channel->optmask & ARES_OPT_RESOLVCONF) { + options->resolvconf_path = ares_strdup(channel->resolvconf_path); + if (!options->resolvconf_path) { + return ARES_ENOMEM; + } + } + + if (channel->optmask & ARES_OPT_HOSTS_FILE) { + options->hosts_path = ares_strdup(channel->hosts_path); + if (!options->hosts_path) { + return ARES_ENOMEM; + } + } + + if (channel->optmask & ARES_OPT_SOCK_SNDBUF && + channel->socket_send_buffer_size > 0) { + options->socket_send_buffer_size = channel->socket_send_buffer_size; + } + + if (channel->optmask & ARES_OPT_SOCK_RCVBUF && + channel->socket_receive_buffer_size > 0) { + options->socket_receive_buffer_size = channel->socket_receive_buffer_size; + } + + if (channel->optmask & ARES_OPT_EDNSPSZ) { + options->ednspsz = (int)channel->ednspsz; + } + + if (channel->optmask & ARES_OPT_UDP_MAX_QUERIES) { + options->udp_max_queries = (int)channel->udp_max_queries; + } + + if (channel->optmask & ARES_OPT_QUERY_CACHE) { + options->qcache_max_ttl = channel->qcache_max_ttl; + } + + *optmask = (int)channel->optmask; + + return ARES_SUCCESS; +} + +static ares_status_t ares__init_options_servers(ares_channel_t *channel, + const struct in_addr *servers, + size_t nservers) +{ + ares__llist_t *slist = NULL; + ares_status_t status; + + status = ares_in_addr_to_server_config_llist(servers, nservers, &slist); + if (status != ARES_SUCCESS) { + return status; + } + + status = ares__servers_update(channel, slist, ARES_TRUE); + + ares__llist_destroy(slist); + + return status; +} + +ares_status_t ares__init_by_options(ares_channel_t *channel, + const struct ares_options *options, + int optmask) +{ + size_t i; + + if (channel == NULL) { + return ARES_ENODATA; + } + + if (options == NULL) { + if (optmask != 0) { + return ARES_ENODATA; + } + return ARES_SUCCESS; + } + + /* Easy stuff. */ + if (optmask & ARES_OPT_FLAGS) { + channel->flags = (unsigned int)options->flags; + } + + if (optmask & ARES_OPT_TIMEOUTMS) { + channel->timeout = (unsigned int)options->timeout; + } else if (optmask & ARES_OPT_TIMEOUT) { + /* Convert to milliseconds */ + optmask |= ARES_OPT_TIMEOUTMS; + optmask &= ~(ARES_OPT_TIMEOUT); + channel->timeout = (unsigned int)options->timeout * 1000; + } + + if (optmask & ARES_OPT_TRIES) { + channel->tries = (size_t)options->tries; + } + + if (optmask & ARES_OPT_NDOTS) { + channel->ndots = (size_t)options->ndots; + } + + if (optmask & ARES_OPT_MAXTIMEOUTMS) { + channel->maxtimeout = (size_t)options->maxtimeout; + } + + if (optmask & ARES_OPT_ROTATE) { + channel->rotate = ARES_TRUE; + } + + if (optmask & ARES_OPT_NOROTATE) { + channel->rotate = ARES_FALSE; + } + + if (optmask & ARES_OPT_UDP_PORT) { + channel->udp_port = options->udp_port; + } + + if (optmask & ARES_OPT_TCP_PORT) { + channel->tcp_port = options->tcp_port; + } + + if (optmask & ARES_OPT_SOCK_STATE_CB) { + channel->sock_state_cb = options->sock_state_cb; + channel->sock_state_cb_data = options->sock_state_cb_data; + } + + if (optmask & ARES_OPT_SOCK_SNDBUF && options->socket_send_buffer_size > 0) { + channel->socket_send_buffer_size = options->socket_send_buffer_size; + } + + if (optmask & ARES_OPT_SOCK_RCVBUF && + options->socket_receive_buffer_size > 0) { + channel->socket_receive_buffer_size = options->socket_receive_buffer_size; + } + + if (optmask & ARES_OPT_EDNSPSZ) { + channel->ednspsz = (size_t)options->ednspsz; + } + + /* Copy the domains, if given. Keep channel->ndomains consistent so + * we can clean up in case of error. + */ + if (optmask & ARES_OPT_DOMAINS && options->ndomains > 0) { + channel->domains = + ares_malloc_zero((size_t)options->ndomains * sizeof(char *)); + if (!channel->domains) { + return ARES_ENOMEM; + } + channel->ndomains = (size_t)options->ndomains; + for (i = 0; i < (size_t)options->ndomains; i++) { + channel->domains[i] = ares_strdup(options->domains[i]); + if (!channel->domains[i]) { + return ARES_ENOMEM; + } + } + } + + /* Set lookups, if given. */ + if (optmask & ARES_OPT_LOOKUPS) { + channel->lookups = ares_strdup(options->lookups); + if (!channel->lookups) { + return ARES_ENOMEM; + } + } + + /* copy sortlist */ + if (optmask & ARES_OPT_SORTLIST && options->nsort > 0) { + channel->nsort = (size_t)options->nsort; + channel->sortlist = + ares_malloc((size_t)options->nsort * sizeof(struct apattern)); + if (!channel->sortlist) { + return ARES_ENOMEM; + } + for (i = 0; i < (size_t)options->nsort; i++) { + channel->sortlist[i] = options->sortlist[i]; + } + } + + /* Set path for resolv.conf file, if given. */ + if (optmask & ARES_OPT_RESOLVCONF) { + channel->resolvconf_path = ares_strdup(options->resolvconf_path); + if (!channel->resolvconf_path && options->resolvconf_path) { + return ARES_ENOMEM; + } + } + + /* Set path for hosts file, if given. */ + if (optmask & ARES_OPT_HOSTS_FILE) { + channel->hosts_path = ares_strdup(options->hosts_path); + if (!channel->hosts_path && options->hosts_path) { + return ARES_ENOMEM; + } + } + + if (optmask & ARES_OPT_UDP_MAX_QUERIES) { + channel->udp_max_queries = (size_t)options->udp_max_queries; + } + + if (optmask & ARES_OPT_QUERY_CACHE) { + channel->qcache_max_ttl = options->qcache_max_ttl; + } + + /* Initialize the ipv4 servers if provided */ + if (optmask & ARES_OPT_SERVERS && options->nservers > 0) { + ares_status_t status; + status = ares__init_options_servers(channel, options->servers, + (size_t)options->nservers); + if (status != ARES_SUCCESS) { + return status; + } + } + + channel->optmask = (unsigned int)optmask; + + return ARES_SUCCESS; +} diff --git a/lib/c-ares-1.23.0/src/lib/ares_parse_a_reply.c b/lib/c-ares-1.23.0/src/lib/ares_parse_a_reply.c new file mode 100644 index 00000000000..f576575fe4b --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares_parse_a_reply.c @@ -0,0 +1,101 @@ +/* MIT License + * + * Copyright (c) 1998 Massachusetts Institute of Technology + * Copyright (c) 2019 Andrew Selivanov + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ + +#include "ares_setup.h" + +#ifdef HAVE_NETINET_IN_H +# include +#endif +#ifdef HAVE_NETDB_H +# include +#endif +#ifdef HAVE_ARPA_INET_H +# include +#endif + +#include "ares_nameser.h" + +#ifdef HAVE_STRINGS_H +# include +#endif + +#ifdef HAVE_LIMITS_H +# include +#endif + +#include "ares.h" +#include "ares_dns.h" +#include "ares_private.h" + +int ares_parse_a_reply(const unsigned char *abuf, int alen, + struct hostent **host, struct ares_addrttl *addrttls, + int *naddrttls) +{ + struct ares_addrinfo ai; + char *question_hostname = NULL; + ares_status_t status; + size_t req_naddrttls = 0; + + if (alen < 0) { + return ARES_EBADRESP; + } + + if (naddrttls) { + req_naddrttls = (size_t)*naddrttls; + *naddrttls = 0; + } + + memset(&ai, 0, sizeof(ai)); + + status = ares__parse_into_addrinfo(abuf, (size_t)alen, 0, 0, &ai); + if (status != ARES_SUCCESS && status != ARES_ENODATA) { + goto fail; + } + + if (host != NULL) { + status = ares__addrinfo2hostent(&ai, AF_INET, host); + if (status != ARES_SUCCESS && status != ARES_ENODATA) { + goto fail; + } + } + + if (addrttls != NULL && req_naddrttls) { + size_t temp_naddrttls = 0; + ares__addrinfo2addrttl(&ai, AF_INET, req_naddrttls, addrttls, NULL, + &temp_naddrttls); + *naddrttls = (int)temp_naddrttls; + } + + +fail: + ares__freeaddrinfo_cnames(ai.cnames); + ares__freeaddrinfo_nodes(ai.nodes); + ares_free(ai.name); + ares_free(question_hostname); + + return (int)status; +} diff --git a/lib/c-ares-1.23.0/src/lib/ares_parse_aaaa_reply.c b/lib/c-ares-1.23.0/src/lib/ares_parse_aaaa_reply.c new file mode 100644 index 00000000000..cef4ad7f809 --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares_parse_aaaa_reply.c @@ -0,0 +1,102 @@ +/* MIT License + * + * Copyright (c) 1998 Massachusetts Institute of Technology + * Copyright (c) 2005 Dominick Meglio + * Copyright (c) 2019 Andrew Selivanov + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ + +#include "ares_setup.h" + +#ifdef HAVE_NETINET_IN_H +# include +#endif +#ifdef HAVE_NETDB_H +# include +#endif +#ifdef HAVE_ARPA_INET_H +# include +#endif + +#include "ares_nameser.h" + +#ifdef HAVE_STRINGS_H +# include +#endif + +#ifdef HAVE_LIMITS_H +# include +#endif + +#include "ares.h" +#include "ares_dns.h" +#include "ares_inet_net_pton.h" +#include "ares_private.h" + +int ares_parse_aaaa_reply(const unsigned char *abuf, int alen, + struct hostent **host, struct ares_addr6ttl *addrttls, + int *naddrttls) +{ + struct ares_addrinfo ai; + char *question_hostname = NULL; + ares_status_t status; + size_t req_naddrttls = 0; + + if (alen < 0) { + return ARES_EBADRESP; + } + + if (naddrttls) { + req_naddrttls = (size_t)*naddrttls; + *naddrttls = 0; + } + + memset(&ai, 0, sizeof(ai)); + + status = ares__parse_into_addrinfo(abuf, (size_t)alen, 0, 0, &ai); + if (status != ARES_SUCCESS && status != ARES_ENODATA) { + goto fail; + } + + if (host != NULL) { + status = ares__addrinfo2hostent(&ai, AF_INET6, host); + if (status != ARES_SUCCESS && status != ARES_ENODATA) { + goto fail; + } + } + + if (addrttls != NULL && req_naddrttls) { + size_t temp_naddrttls = 0; + ares__addrinfo2addrttl(&ai, AF_INET6, req_naddrttls, NULL, addrttls, + &temp_naddrttls); + *naddrttls = (int)temp_naddrttls; + } + +fail: + ares__freeaddrinfo_cnames(ai.cnames); + ares__freeaddrinfo_nodes(ai.nodes); + ares_free(question_hostname); + ares_free(ai.name); + + return (int)status; +} diff --git a/lib/c-ares-1.23.0/src/lib/ares_parse_caa_reply.c b/lib/c-ares-1.23.0/src/lib/ares_parse_caa_reply.c new file mode 100644 index 00000000000..6c30305ee18 --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares_parse_caa_reply.c @@ -0,0 +1,139 @@ +/* MIT License + * + * Copyright (c) 2023 Brad House + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ + +#include "ares_setup.h" +#include "ares.h" +#include "ares_data.h" +#include "ares_private.h" + +int ares_parse_caa_reply(const unsigned char *abuf, int alen_int, + struct ares_caa_reply **caa_out) +{ + ares_status_t status; + size_t alen; + struct ares_caa_reply *caa_head = NULL; + struct ares_caa_reply *caa_last = NULL; + struct ares_caa_reply *caa_curr; + ares_dns_record_t *dnsrec = NULL; + size_t i; + + *caa_out = NULL; + + if (alen_int < 0) { + return ARES_EBADRESP; + } + + alen = (size_t)alen_int; + + status = ares_dns_parse(abuf, alen, 0, &dnsrec); + if (status != ARES_SUCCESS) { + goto done; + } + + if (ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_ANSWER) == 0) { + status = ARES_ENODATA; + goto done; + } + + for (i = 0; i < ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_ANSWER); i++) { + const unsigned char *ptr; + size_t ptr_len; + const ares_dns_rr_t *rr = + ares_dns_record_rr_get(dnsrec, ARES_SECTION_ANSWER, i); + + if (rr == NULL) { + /* Shouldn't be possible */ + status = ARES_EBADRESP; + goto done; + } + + /* XXX: Why do we allow Chaos class? */ + if (ares_dns_rr_get_class(rr) != ARES_CLASS_IN && + ares_dns_rr_get_class(rr) != ARES_CLASS_CHAOS) { + continue; + } + + /* Only looking for CAA records */ + if (ares_dns_rr_get_type(rr) != ARES_REC_TYPE_CAA) { + continue; + } + + /* Allocate storage for this CAA answer appending it to the list */ + caa_curr = ares_malloc_data(ARES_DATATYPE_CAA_REPLY); + if (caa_curr == NULL) { + status = ARES_ENOMEM; + goto done; + } + + /* Link in the record */ + if (caa_last) { + caa_last->next = caa_curr; + } else { + caa_head = caa_curr; + } + caa_last = caa_curr; + + caa_curr->critical = ares_dns_rr_get_u8(rr, ARES_RR_CAA_CRITICAL); + caa_curr->property = + (unsigned char *)ares_strdup(ares_dns_rr_get_str(rr, ARES_RR_CAA_TAG)); + if (caa_curr->property == NULL) { + status = ARES_ENOMEM; + break; + } + /* RFC6844 says this can only be ascii, so not sure why we're recording a + * length */ + caa_curr->plength = ares_strlen((const char *)caa_curr->property); + + ptr = ares_dns_rr_get_bin(rr, ARES_RR_CAA_VALUE, &ptr_len); + if (ptr == NULL) { + status = ARES_EBADRESP; + goto done; + } + + /* Wants NULL termination for some reason */ + caa_curr->value = ares_malloc(ptr_len + 1); + if (caa_curr->value == NULL) { + status = ARES_ENOMEM; + goto done; + } + memcpy(caa_curr->value, ptr, ptr_len); + caa_curr->value[ptr_len] = 0; + caa_curr->length = ptr_len; + } + +done: + /* clean up on error */ + if (status != ARES_SUCCESS) { + if (caa_head) { + ares_free_data(caa_head); + } + } else { + /* everything looks fine, return the data */ + *caa_out = caa_head; + } + ares_dns_record_destroy(dnsrec); + return (int)status; +} diff --git a/lib/c-ares-1.23.0/src/lib/ares_parse_mx_reply.c b/lib/c-ares-1.23.0/src/lib/ares_parse_mx_reply.c new file mode 100644 index 00000000000..db7155d2e8f --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares_parse_mx_reply.c @@ -0,0 +1,112 @@ +/* MIT License + * + * Copyright (c) 2023 Brad House + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ + +#include "ares_setup.h" +#include "ares.h" +#include "ares_data.h" +#include "ares_private.h" + +int ares_parse_mx_reply(const unsigned char *abuf, int alen_int, + struct ares_mx_reply **mx_out) +{ + ares_status_t status; + size_t alen; + struct ares_mx_reply *mx_head = NULL; + struct ares_mx_reply *mx_last = NULL; + struct ares_mx_reply *mx_curr; + ares_dns_record_t *dnsrec = NULL; + size_t i; + + *mx_out = NULL; + + if (alen_int < 0) { + return ARES_EBADRESP; + } + + alen = (size_t)alen_int; + + status = ares_dns_parse(abuf, alen, 0, &dnsrec); + if (status != ARES_SUCCESS) { + goto done; + } + + if (ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_ANSWER) == 0) { + status = ARES_ENODATA; + goto done; + } + + for (i = 0; i < ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_ANSWER); i++) { + const ares_dns_rr_t *rr = + ares_dns_record_rr_get(dnsrec, ARES_SECTION_ANSWER, i); + + if (rr == NULL) { + /* Shouldn't be possible */ + status = ARES_EBADRESP; + goto done; + } + + if (ares_dns_rr_get_class(rr) != ARES_CLASS_IN || + ares_dns_rr_get_type(rr) != ARES_REC_TYPE_MX) { + continue; + } + + /* Allocate storage for this MX answer appending it to the list */ + mx_curr = ares_malloc_data(ARES_DATATYPE_MX_REPLY); + if (mx_curr == NULL) { + status = ARES_ENOMEM; + goto done; + } + + /* Link in the record */ + if (mx_last) { + mx_last->next = mx_curr; + } else { + mx_head = mx_curr; + } + mx_last = mx_curr; + + mx_curr->priority = ares_dns_rr_get_u16(rr, ARES_RR_MX_PREFERENCE); + mx_curr->host = ares_strdup(ares_dns_rr_get_str(rr, ARES_RR_MX_EXCHANGE)); + + if (mx_curr->host == NULL) { + status = ARES_ENOMEM; + goto done; + } + } + +done: + /* clean up on error */ + if (status != ARES_SUCCESS) { + if (mx_head) { + ares_free_data(mx_head); + } + } else { + /* everything looks fine, return the data */ + *mx_out = mx_head; + } + ares_dns_record_destroy(dnsrec); + return (int)status; +} diff --git a/lib/c-ares-1.23.0/src/lib/ares_parse_naptr_reply.c b/lib/c-ares-1.23.0/src/lib/ares_parse_naptr_reply.c new file mode 100644 index 00000000000..1a304ccdd3a --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares_parse_naptr_reply.c @@ -0,0 +1,134 @@ +/* MIT License + * + * Copyright (c) 2023 Brad House + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ +#include "ares_setup.h" +#include "ares.h" +#include "ares_data.h" +#include "ares_private.h" + +int ares_parse_naptr_reply(const unsigned char *abuf, int alen_int, + struct ares_naptr_reply **naptr_out) +{ + ares_status_t status; + size_t alen; + struct ares_naptr_reply *naptr_head = NULL; + struct ares_naptr_reply *naptr_last = NULL; + struct ares_naptr_reply *naptr_curr; + ares_dns_record_t *dnsrec = NULL; + size_t i; + + *naptr_out = NULL; + + if (alen_int < 0) { + return ARES_EBADRESP; + } + + alen = (size_t)alen_int; + + status = ares_dns_parse(abuf, alen, 0, &dnsrec); + if (status != ARES_SUCCESS) { + goto done; + } + + if (ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_ANSWER) == 0) { + status = ARES_ENODATA; + goto done; + } + + for (i = 0; i < ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_ANSWER); i++) { + const ares_dns_rr_t *rr = + ares_dns_record_rr_get(dnsrec, ARES_SECTION_ANSWER, i); + + if (rr == NULL) { + /* Shouldn't be possible */ + status = ARES_EBADRESP; + goto done; + } + + if (ares_dns_rr_get_class(rr) != ARES_CLASS_IN || + ares_dns_rr_get_type(rr) != ARES_REC_TYPE_NAPTR) { + continue; + } + + /* Allocate storage for this NAPTR answer appending it to the list */ + naptr_curr = ares_malloc_data(ARES_DATATYPE_NAPTR_REPLY); + if (naptr_curr == NULL) { + status = ARES_ENOMEM; + goto done; + } + + /* Link in the record */ + if (naptr_last) { + naptr_last->next = naptr_curr; + } else { + naptr_head = naptr_curr; + } + naptr_last = naptr_curr; + + naptr_curr->order = ares_dns_rr_get_u16(rr, ARES_RR_NAPTR_ORDER); + naptr_curr->preference = ares_dns_rr_get_u16(rr, ARES_RR_NAPTR_PREFERENCE); + + /* XXX: Why is this unsigned char * ? */ + naptr_curr->flags = (unsigned char *)ares_strdup( + ares_dns_rr_get_str(rr, ARES_RR_NAPTR_FLAGS)); + if (naptr_curr->flags == NULL) { + status = ARES_ENOMEM; + goto done; + } + /* XXX: Why is this unsigned char * ? */ + naptr_curr->service = (unsigned char *)ares_strdup( + ares_dns_rr_get_str(rr, ARES_RR_NAPTR_SERVICES)); + if (naptr_curr->service == NULL) { + status = ARES_ENOMEM; + goto done; + } + /* XXX: Why is this unsigned char * ? */ + naptr_curr->regexp = (unsigned char *)ares_strdup( + ares_dns_rr_get_str(rr, ARES_RR_NAPTR_REGEXP)); + if (naptr_curr->regexp == NULL) { + status = ARES_ENOMEM; + goto done; + } + naptr_curr->replacement = + ares_strdup(ares_dns_rr_get_str(rr, ARES_RR_NAPTR_REPLACEMENT)); + if (naptr_curr->replacement == NULL) { + status = ARES_ENOMEM; + goto done; + } + } + +done: + /* clean up on error */ + if (status != ARES_SUCCESS) { + if (naptr_head) { + ares_free_data(naptr_head); + } + } else { + /* everything looks fine, return the data */ + *naptr_out = naptr_head; + } + ares_dns_record_destroy(dnsrec); + return (int)status; +} diff --git a/lib/c-ares-1.23.0/src/lib/ares_parse_ns_reply.c b/lib/c-ares-1.23.0/src/lib/ares_parse_ns_reply.c new file mode 100644 index 00000000000..18fda82f412 --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares_parse_ns_reply.c @@ -0,0 +1,157 @@ +/* MIT License + * + * Copyright (c) 2023 Brad House + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ + +#include "ares_setup.h" + +#ifdef HAVE_NETINET_IN_H +# include +#endif +#ifdef HAVE_NETDB_H +# include +#endif +#ifdef HAVE_ARPA_INET_H +# include +#endif + +#include "ares.h" +#include "ares_private.h" + +int ares_parse_ns_reply(const unsigned char *abuf, int alen_int, + struct hostent **host) +{ + ares_status_t status; + size_t alen; + size_t nscount = 0; + struct hostent *hostent = NULL; + const char *hostname = NULL; + ares_dns_record_t *dnsrec = NULL; + size_t i; + size_t ancount; + + *host = NULL; + + if (alen_int < 0) { + return ARES_EBADRESP; + } + + alen = (size_t)alen_int; + + status = ares_dns_parse(abuf, alen, 0, &dnsrec); + if (status != ARES_SUCCESS) { + goto done; + } + + ancount = ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_ANSWER); + if (ancount == 0) { + status = ARES_ENODATA; + goto done; + } + + /* Response structure */ + hostent = ares_malloc(sizeof(*hostent)); + if (hostent == NULL) { + status = ARES_ENOMEM; + goto done; + } + + memset(hostent, 0, sizeof(*hostent)); + + hostent->h_addr_list = ares_malloc(sizeof(*hostent->h_addr_list)); + if (hostent->h_addr_list == NULL) { + status = ARES_ENOMEM; + goto done; + } + hostent->h_addr_list[0] = NULL; + hostent->h_addrtype = AF_INET; + hostent->h_length = sizeof(struct in_addr); + + /* Fill in hostname */ + status = ares_dns_record_query_get(dnsrec, 0, &hostname, NULL, NULL); + if (status != ARES_SUCCESS) { + goto done; + } + hostent->h_name = ares_strdup(hostname); + if (hostent->h_name == NULL) { + status = ARES_ENOMEM; + goto done; + } + + /* Preallocate the maximum number + 1 */ + hostent->h_aliases = ares_malloc((ancount + 1) * sizeof(*hostent->h_aliases)); + if (hostent->h_aliases == NULL) { + status = ARES_ENOMEM; + goto done; + } + memset(hostent->h_aliases, 0, (ancount + 1) * sizeof(*hostent->h_aliases)); + + for (i = 0; i < ancount; i++) { + const ares_dns_rr_t *rr = + ares_dns_record_rr_get(dnsrec, ARES_SECTION_ANSWER, i); + + if (rr == NULL) { + /* Shouldn't be possible */ + status = ARES_EBADRESP; + goto done; + } + + if (ares_dns_rr_get_class(rr) != ARES_CLASS_IN || + ares_dns_rr_get_type(rr) != ARES_REC_TYPE_NS) { + continue; + } + + hostname = ares_dns_rr_get_str(rr, ARES_RR_NS_NSDNAME); + if (hostname == NULL) { + status = ARES_EBADRESP; + goto done; + } + + hostent->h_aliases[nscount] = ares_strdup(hostname); + if (hostent->h_aliases[nscount] == NULL) { + status = ARES_ENOMEM; + goto done; + } + nscount++; + } + + if (nscount == 0) { + status = ARES_ENODATA; + } else { + status = ARES_SUCCESS; + } + +done: + if (status != ARES_SUCCESS) { + ares_free_hostent(hostent); + /* Compatibility */ + if (status == ARES_EBADNAME) { + status = ARES_EBADRESP; + } + } else { + *host = hostent; + } + ares_dns_record_destroy(dnsrec); + return (int)status; +} diff --git a/lib/c-ares-1.23.0/src/lib/ares_parse_ptr_reply.c b/lib/c-ares-1.23.0/src/lib/ares_parse_ptr_reply.c new file mode 100644 index 00000000000..f03f601d4c3 --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares_parse_ptr_reply.c @@ -0,0 +1,198 @@ +/* MIT License + * + * Copyright (c) 2023 Brad House + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ + +#include "ares_setup.h" + +#ifdef HAVE_NETINET_IN_H +# include +#endif +#ifdef HAVE_NETDB_H +# include +#endif + +#include "ares.h" +#include "ares_private.h" + +int ares_parse_ptr_reply(const unsigned char *abuf, int alen_int, + const void *addr, int addrlen, int family, + struct hostent **host) +{ + ares_status_t status; + size_t alen; + size_t ptrcount = 0; + struct hostent *hostent = NULL; + const char *hostname = NULL; + const char *ptrname = NULL; + ares_dns_record_t *dnsrec = NULL; + size_t i; + size_t ancount; + + *host = NULL; + + if (alen_int < 0) { + return ARES_EBADRESP; + } + + alen = (size_t)alen_int; + + status = ares_dns_parse(abuf, alen, 0, &dnsrec); + if (status != ARES_SUCCESS) { + goto done; + } + + /* Fetch name from query as we will use it to compare later on. Old code + * did this check, so we'll retain it. */ + status = ares_dns_record_query_get(dnsrec, 0, &ptrname, NULL, NULL); + if (status != ARES_SUCCESS) { + goto done; + } + + ancount = ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_ANSWER); + if (ancount == 0) { + status = ARES_ENODATA; + goto done; + } + + /* Response structure */ + hostent = ares_malloc(sizeof(*hostent)); + if (hostent == NULL) { + status = ARES_ENOMEM; + goto done; + } + + memset(hostent, 0, sizeof(*hostent)); + + hostent->h_addr_list = ares_malloc(2 * sizeof(*hostent->h_addr_list)); + if (hostent->h_addr_list == NULL) { + status = ARES_ENOMEM; + goto done; + } + memset(hostent->h_addr_list, 0, 2 * sizeof(*hostent->h_addr_list)); + if (addr != NULL && addrlen > 0) { + hostent->h_addr_list[0] = ares_malloc((size_t)addrlen); + if (hostent->h_addr_list[0] == NULL) { + status = ARES_ENOMEM; + goto done; + } + memcpy(hostent->h_addr_list[0], addr, (size_t)addrlen); + } + hostent->h_addrtype = family; + hostent->h_length = addrlen; + + /* Preallocate the maximum number + 1 */ + hostent->h_aliases = ares_malloc((ancount + 1) * sizeof(*hostent->h_aliases)); + if (hostent->h_aliases == NULL) { + status = ARES_ENOMEM; + goto done; + } + memset(hostent->h_aliases, 0, (ancount + 1) * sizeof(*hostent->h_aliases)); + + + /* Cycle through answers */ + for (i = 0; i < ancount; i++) { + const char *rname = NULL; + const ares_dns_rr_t *rr = + ares_dns_record_rr_get(dnsrec, ARES_SECTION_ANSWER, i); + + if (rr == NULL) { + /* Shouldn't be possible */ + status = ARES_EBADRESP; + goto done; + } + + if (ares_dns_rr_get_class(rr) != ARES_CLASS_IN) { + continue; + } + + /* Any time we see a CNAME, replace our ptrname with its value */ + if (ares_dns_rr_get_type(rr) == ARES_REC_TYPE_CNAME) { + ptrname = ares_dns_rr_get_str(rr, ARES_RR_CNAME_CNAME); + if (ptrname == NULL) { + status = ARES_EBADRESP; + goto done; + } + } + + /* Handling for PTR records below this, otherwise skip */ + if (ares_dns_rr_get_type(rr) != ARES_REC_TYPE_PTR) { + continue; + } + + /* Old code compared the name in the rr to the ptrname, so we'll do that + * check here, but I'm not sure its necessary */ + rname = ares_dns_rr_get_name(rr); + if (rname == NULL) { + /* Shouldn't be possible */ + status = ARES_EBADRESP; + goto done; + } + if (strcasecmp(ptrname, rname) != 0) { + continue; + } + + /* Save most recent PTR record as the hostname */ + hostname = ares_dns_rr_get_str(rr, ARES_RR_PTR_DNAME); + if (hostname == NULL) { + status = ARES_EBADRESP; + goto done; + } + + /* Append as an alias */ + hostent->h_aliases[ptrcount] = ares_strdup(hostname); + if (hostent->h_aliases[ptrcount] == NULL) { + status = ARES_ENOMEM; + goto done; + } + ptrcount++; + } + + if (ptrcount == 0) { + status = ARES_ENODATA; + goto done; + } else { + status = ARES_SUCCESS; + } + + /* Fill in hostname */ + hostent->h_name = ares_strdup(hostname); + if (hostent->h_name == NULL) { + status = ARES_ENOMEM; + goto done; + } + +done: + if (status != ARES_SUCCESS) { + ares_free_hostent(hostent); + /* Compatibility */ + if (status == ARES_EBADNAME) { + status = ARES_EBADRESP; + } + } else { + *host = hostent; + } + ares_dns_record_destroy(dnsrec); + return (int)status; +} diff --git a/lib/c-ares-1.23.0/src/lib/ares_parse_soa_reply.c b/lib/c-ares-1.23.0/src/lib/ares_parse_soa_reply.c new file mode 100644 index 00000000000..2777dbcb0bb --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares_parse_soa_reply.c @@ -0,0 +1,117 @@ +/* MIT License + * + * Copyright (c) 2023 Brad House + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ + +#include "ares_setup.h" +#include "ares.h" +#include "ares_data.h" +#include "ares_private.h" + +int ares_parse_soa_reply(const unsigned char *abuf, int alen_int, + struct ares_soa_reply **soa_out) +{ + ares_status_t status; + size_t alen; + struct ares_soa_reply *soa = NULL; + ares_dns_record_t *dnsrec = NULL; + size_t i; + + *soa_out = NULL; + + if (alen_int < 0) { + return ARES_EBADRESP; + } + + alen = (size_t)alen_int; + + status = ares_dns_parse(abuf, alen, 0, &dnsrec); + if (status != ARES_SUCCESS) { + goto done; + } + + if (ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_ANSWER) == 0) { + status = ARES_EBADRESP; /* ENODATA might make more sense */ + goto done; + } + + for (i = 0; i < ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_ANSWER); i++) { + const ares_dns_rr_t *rr = + ares_dns_record_rr_get(dnsrec, ARES_SECTION_ANSWER, i); + + if (rr == NULL) { + /* Shouldn't be possible */ + status = ARES_EBADRESP; + goto done; + } + + if (ares_dns_rr_get_class(rr) != ARES_CLASS_IN || + ares_dns_rr_get_type(rr) != ARES_REC_TYPE_SOA) { + continue; + } + + /* allocate result struct */ + soa = ares_malloc_data(ARES_DATATYPE_SOA_REPLY); + if (soa == NULL) { + status = ARES_ENOMEM; + goto done; + } + + soa->serial = ares_dns_rr_get_u32(rr, ARES_RR_SOA_SERIAL); + soa->refresh = ares_dns_rr_get_u32(rr, ARES_RR_SOA_REFRESH); + soa->retry = ares_dns_rr_get_u32(rr, ARES_RR_SOA_RETRY); + soa->expire = ares_dns_rr_get_u32(rr, ARES_RR_SOA_EXPIRE); + soa->minttl = ares_dns_rr_get_u32(rr, ARES_RR_SOA_MINIMUM); + soa->nsname = ares_strdup(ares_dns_rr_get_str(rr, ARES_RR_SOA_MNAME)); + if (soa->nsname == NULL) { + status = ARES_ENOMEM; + goto done; + } + soa->hostmaster = ares_strdup(ares_dns_rr_get_str(rr, ARES_RR_SOA_RNAME)); + if (soa->hostmaster == NULL) { + status = ARES_ENOMEM; + goto done; + } + break; + } + + if (soa == NULL) { + status = ARES_EBADRESP; + } + +done: + /* clean up on error */ + if (status != ARES_SUCCESS) { + ares_free_data(soa); + /* Compatibility */ + if (status == ARES_EBADNAME) { + status = ARES_EBADRESP; + } + } else { + /* everything looks fine, return the data */ + *soa_out = soa; + } + ares_dns_record_destroy(dnsrec); + return (int)status; +} diff --git a/lib/c-ares-1.23.0/src/lib/ares_parse_srv_reply.c b/lib/c-ares-1.23.0/src/lib/ares_parse_srv_reply.c new file mode 100644 index 00000000000..f27bcce7330 --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares_parse_srv_reply.c @@ -0,0 +1,116 @@ +/* MIT License + * + * Copyright (c) 2023 Brad House + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ + +#include "ares_setup.h" +#include "ares.h" +#include "ares_data.h" +#include "ares_private.h" + +int ares_parse_srv_reply(const unsigned char *abuf, int alen_int, + struct ares_srv_reply **srv_out) +{ + ares_status_t status; + size_t alen; + struct ares_srv_reply *srv_head = NULL; + struct ares_srv_reply *srv_last = NULL; + struct ares_srv_reply *srv_curr; + ares_dns_record_t *dnsrec = NULL; + size_t i; + + *srv_out = NULL; + + if (alen_int < 0) { + return ARES_EBADRESP; + } + + alen = (size_t)alen_int; + + status = ares_dns_parse(abuf, alen, 0, &dnsrec); + if (status != ARES_SUCCESS) { + goto done; + } + + if (ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_ANSWER) == 0) { + status = ARES_ENODATA; + goto done; + } + + for (i = 0; i < ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_ANSWER); i++) { + const ares_dns_rr_t *rr = + ares_dns_record_rr_get(dnsrec, ARES_SECTION_ANSWER, i); + + if (rr == NULL) { + /* Shouldn't be possible */ + status = ARES_EBADRESP; + goto done; + } + + if (ares_dns_rr_get_class(rr) != ARES_CLASS_IN || + ares_dns_rr_get_type(rr) != ARES_REC_TYPE_SRV) { + continue; + } + + /* Allocate storage for this SRV answer appending it to the list */ + srv_curr = ares_malloc_data(ARES_DATATYPE_SRV_REPLY); + if (srv_curr == NULL) { + status = ARES_ENOMEM; + goto done; + } + + /* Link in the record */ + if (srv_last) { + srv_last->next = srv_curr; + } else { + srv_head = srv_curr; + } + srv_last = srv_curr; + + + srv_curr->priority = ares_dns_rr_get_u16(rr, ARES_RR_SRV_PRIORITY); + srv_curr->weight = ares_dns_rr_get_u16(rr, ARES_RR_SRV_WEIGHT); + srv_curr->port = ares_dns_rr_get_u16(rr, ARES_RR_SRV_PORT); + + srv_curr->host = ares_strdup(ares_dns_rr_get_str(rr, ARES_RR_SRV_TARGET)); + + if (srv_curr->host == NULL) { + status = ARES_ENOMEM; + goto done; + } + } + +done: + /* clean up on error */ + if (status != ARES_SUCCESS) { + if (srv_head) { + ares_free_data(srv_head); + } + } else { + /* everything looks fine, return the data */ + *srv_out = srv_head; + } + ares_dns_record_destroy(dnsrec); + return (int)status; +} diff --git a/lib/c-ares-1.23.0/src/lib/ares_parse_txt_reply.c b/lib/c-ares-1.23.0/src/lib/ares_parse_txt_reply.c new file mode 100644 index 00000000000..85c3644b8cb --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares_parse_txt_reply.c @@ -0,0 +1,137 @@ +/* MIT License + * + * Copyright (c) 2023 Brad House + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ + +#include "ares_setup.h" +#include "ares.h" +#include "ares_data.h" +#include "ares_private.h" + +static int ares__parse_txt_reply(const unsigned char *abuf, size_t alen, + ares_bool_t ex, void **txt_out) +{ + ares_status_t status; + struct ares_txt_ext *txt_head = NULL; + struct ares_txt_ext *txt_last = NULL; + struct ares_txt_ext *txt_curr; + ares_dns_record_t *dnsrec = NULL; + size_t i; + + *txt_out = NULL; + + status = ares_dns_parse(abuf, alen, 0, &dnsrec); + if (status != ARES_SUCCESS) { + goto done; + } + + if (ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_ANSWER) == 0) { + status = ARES_ENODATA; + goto done; + } + + for (i = 0; i < ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_ANSWER); i++) { + const ares_dns_rr_t *rr = + ares_dns_record_rr_get(dnsrec, ARES_SECTION_ANSWER, i); + const unsigned char *ptr; + size_t ptr_len; + + if (rr == NULL) { + /* Shouldn't be possible */ + status = ARES_EBADRESP; + goto done; + } + + /* XXX: Why Chaos? */ + if ((ares_dns_rr_get_class(rr) != ARES_CLASS_IN && + ares_dns_rr_get_class(rr) != ARES_CLASS_CHAOS) || + ares_dns_rr_get_type(rr) != ARES_REC_TYPE_TXT) { + continue; + } + + /* Allocate storage for this TXT answer appending it to the list */ + txt_curr = + ares_malloc_data(ex ? ARES_DATATYPE_TXT_EXT : ARES_DATATYPE_TXT_REPLY); + if (txt_curr == NULL) { + status = ARES_ENOMEM; + goto done; + } + + /* Link in the record */ + if (txt_last) { + txt_last->next = txt_curr; + } else { + txt_head = txt_curr; + } + txt_last = txt_curr; + + /* These days, records are joined, always tag as start */ + if (ex) { + txt_curr->record_start = 1; + } + + ptr = ares_dns_rr_get_bin(rr, ARES_RR_TXT_DATA, &ptr_len); + + txt_curr->txt = ares_malloc(ptr_len + 1); + if (txt_curr->txt == NULL) { + status = ARES_ENOMEM; + goto done; + } + memcpy(txt_curr->txt, ptr, ptr_len); + txt_curr->txt[ptr_len] = 0; + txt_curr->length = ptr_len; + } + +done: + /* clean up on error */ + if (status != ARES_SUCCESS) { + if (txt_head) { + ares_free_data(txt_head); + } + } else { + /* everything looks fine, return the data */ + *txt_out = txt_head; + } + ares_dns_record_destroy(dnsrec); + return (int)status; +} + +int ares_parse_txt_reply(const unsigned char *abuf, int alen, + struct ares_txt_reply **txt_out) +{ + if (alen < 0) { + return ARES_EBADRESP; + } + return ares__parse_txt_reply(abuf, (size_t)alen, ARES_FALSE, + (void **)txt_out); +} + +int ares_parse_txt_reply_ext(const unsigned char *abuf, int alen, + struct ares_txt_ext **txt_out) +{ + if (alen < 0) { + return ARES_EBADRESP; + } + return ares__parse_txt_reply(abuf, (size_t)alen, ARES_TRUE, (void **)txt_out); +} diff --git a/lib/c-ares-1.23.0/src/lib/ares_parse_uri_reply.c b/lib/c-ares-1.23.0/src/lib/ares_parse_uri_reply.c new file mode 100644 index 00000000000..bff7023f78a --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares_parse_uri_reply.c @@ -0,0 +1,115 @@ +/* MIT License + * + * Copyright (c) 2023 Brad House + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ + +#include "ares_setup.h" +#include "ares.h" +#include "ares_data.h" +#include "ares_private.h" + +int ares_parse_uri_reply(const unsigned char *abuf, int alen_int, + struct ares_uri_reply **uri_out) +{ + ares_status_t status; + size_t alen; + struct ares_uri_reply *uri_head = NULL; + struct ares_uri_reply *uri_last = NULL; + struct ares_uri_reply *uri_curr; + ares_dns_record_t *dnsrec = NULL; + size_t i; + + *uri_out = NULL; + + if (alen_int < 0) { + return ARES_EBADRESP; + } + + alen = (size_t)alen_int; + + status = ares_dns_parse(abuf, alen, 0, &dnsrec); + if (status != ARES_SUCCESS) { + goto done; + } + + if (ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_ANSWER) == 0) { + status = ARES_ENODATA; + goto done; + } + + for (i = 0; i < ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_ANSWER); i++) { + const ares_dns_rr_t *rr = + ares_dns_record_rr_get(dnsrec, ARES_SECTION_ANSWER, i); + + if (rr == NULL) { + /* Shouldn't be possible */ + status = ARES_EBADRESP; + goto done; + } + + if (ares_dns_rr_get_class(rr) != ARES_CLASS_IN || + ares_dns_rr_get_type(rr) != ARES_REC_TYPE_URI) { + continue; + } + + /* Allocate storage for this URI answer appending it to the list */ + uri_curr = ares_malloc_data(ARES_DATATYPE_URI_REPLY); + if (uri_curr == NULL) { + status = ARES_ENOMEM; + goto done; + } + + /* Link in the record */ + if (uri_last) { + uri_last->next = uri_curr; + } else { + uri_head = uri_curr; + } + uri_last = uri_curr; + + + uri_curr->priority = ares_dns_rr_get_u16(rr, ARES_RR_URI_PRIORITY); + uri_curr->weight = ares_dns_rr_get_u16(rr, ARES_RR_URI_WEIGHT); + uri_curr->uri = ares_strdup(ares_dns_rr_get_str(rr, ARES_RR_URI_TARGET)); + uri_curr->ttl = (int)ares_dns_rr_get_ttl(rr); + + if (uri_curr->uri == NULL) { + status = ARES_ENOMEM; + goto done; + } + } + +done: + /* clean up on error */ + if (status != ARES_SUCCESS) { + if (uri_head) { + ares_free_data(uri_head); + } + } else { + /* everything looks fine, return the data */ + *uri_out = uri_head; + } + ares_dns_record_destroy(dnsrec); + return (int)status; +} diff --git a/lib/c-ares-1.23.0/src/lib/ares_platform.c b/lib/c-ares-1.23.0/src/lib/ares_platform.c new file mode 100644 index 00000000000..0727ae001c8 --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares_platform.c @@ -0,0 +1,11050 @@ +/* MIT License + * + * Copyright (c) 1998 Massachusetts Institute of Technology + * Copyright (c) 2004 Daniel Stenberg + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ + +#include "ares_setup.h" + +#include "ares.h" +#include "ares_platform.h" +#include "ares_private.h" + +#if defined(WIN32) && !defined(MSDOS) + +# define V_PLATFORM_WIN32s 0 +# define V_PLATFORM_WIN32_WINDOWS 1 +# define V_PLATFORM_WIN32_NT 2 +# define V_PLATFORM_WIN32_CE 3 + +win_platform ares__getplatform(void) +{ + OSVERSIONINFOEX OsvEx; + + memset(&OsvEx, 0, sizeof(OsvEx)); + OsvEx.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); +# ifdef _MSC_VER +# pragma warning(push) +# pragma warning(disable : 4996) /* warning C4996: 'GetVersionExW': was \ + declared deprecated */ +# endif + if (!GetVersionEx((void *)&OsvEx)) { + memset(&OsvEx, 0, sizeof(OsvEx)); + OsvEx.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + if (!GetVersionEx((void *)&OsvEx)) { + return WIN_UNKNOWN; + } + } +# ifdef _MSC_VER +# pragma warning(pop) +# endif + + switch (OsvEx.dwPlatformId) { + case V_PLATFORM_WIN32s: + return WIN_3X; + + case V_PLATFORM_WIN32_WINDOWS: + return WIN_9X; + + case V_PLATFORM_WIN32_NT: + return WIN_NT; + + case V_PLATFORM_WIN32_CE: + return WIN_CE; + + default: + return WIN_UNKNOWN; + } +} + +#endif /* WIN32 && ! MSDOS */ + +#if defined(_WIN32_WCE) + +/* IANA Well Known Ports are in range 0-1023 */ +# define USE_IANA_WELL_KNOWN_PORTS 1 + +/* IANA Registered Ports are in range 1024-49151 */ +# define USE_IANA_REGISTERED_PORTS 1 + +struct pvt_servent { + char *s_name; + char **s_aliases; + unsigned short s_port; + char *s_proto; +}; + +/* + * Ref: http://www.iana.org/assignments/port-numbers + */ + +static struct pvt_servent IANAports[] = { +# ifdef USE_IANA_WELL_KNOWN_PORTS + {"tcpmux", { NULL }, 1, "tcp" }, + { "tcpmux", { NULL }, 1, "udp" }, + { "compressnet", { NULL }, 2, "tcp" }, + { "compressnet", { NULL }, 2, "udp" }, + { "compressnet", { NULL }, 3, "tcp" }, + { "compressnet", { NULL }, 3, "udp" }, + { "rje", { NULL }, 5, "tcp" }, + { "rje", { NULL }, 5, "udp" }, + { "echo", { NULL }, 7, "tcp" }, + { "echo", { NULL }, 7, "udp" }, + { "discard", { NULL }, 9, "tcp" }, + { "discard", { NULL }, 9, "udp" }, + { "discard", { NULL }, 9, "sctp"}, + { "discard", { NULL }, 9, "dccp"}, + { "systat", { NULL }, 11, "tcp" }, + { "systat", { NULL }, 11, "udp" }, + { "daytime", { NULL }, 13, "tcp" }, + { "daytime", { NULL }, 13, "udp" }, + { "qotd", { NULL }, 17, "tcp" }, + { "qotd", { NULL }, 17, "udp" }, + { "msp", { NULL }, 18, "tcp" }, + { "msp", { NULL }, 18, "udp" }, + { "chargen", { NULL }, 19, "tcp" }, + { "chargen", { NULL }, 19, "udp" }, + { "ftp-data", { NULL }, 20, "tcp" }, + { "ftp-data", { NULL }, 20, "udp" }, + { "ftp-data", { NULL }, 20, "sctp"}, + { "ftp", { NULL }, 21, "tcp" }, + { "ftp", { NULL }, 21, "udp" }, + { "ftp", { NULL }, 21, "sctp"}, + { "ssh", { NULL }, 22, "tcp" }, + { "ssh", { NULL }, 22, "udp" }, + { "ssh", { NULL }, 22, "sctp"}, + { "telnet", { NULL }, 23, "tcp" }, + { "telnet", { NULL }, 23, "udp" }, + { "smtp", { NULL }, 25, "tcp" }, + { "smtp", { NULL }, 25, "udp" }, + { "nsw-fe", { NULL }, 27, "tcp" }, + { "nsw-fe", { NULL }, 27, "udp" }, + { "msg-icp", { NULL }, 29, "tcp" }, + { "msg-icp", { NULL }, 29, "udp" }, + { "msg-auth", { NULL }, 31, "tcp" }, + { "msg-auth", { NULL }, 31, "udp" }, + { "dsp", { NULL }, 33, "tcp" }, + { "dsp", { NULL }, 33, "udp" }, + { "time", { NULL }, 37, "tcp" }, + { "time", { NULL }, 37, "udp" }, + { "rap", { NULL }, 38, "tcp" }, + { "rap", { NULL }, 38, "udp" }, + { "rlp", { NULL }, 39, "tcp" }, + { "rlp", { NULL }, 39, "udp" }, + { "graphics", { NULL }, 41, "tcp" }, + { "graphics", { NULL }, 41, "udp" }, + { "name", { NULL }, 42, "tcp" }, + { "name", { NULL }, 42, "udp" }, + { "nameserver", { NULL }, 42, "tcp" }, + { "nameserver", { NULL }, 42, "udp" }, + { "nicname", { NULL }, 43, "tcp" }, + { "nicname", { NULL }, 43, "udp" }, + { "mpm-flags", { NULL }, 44, "tcp" }, + { "mpm-flags", { NULL }, 44, "udp" }, + { "mpm", { NULL }, 45, "tcp" }, + { "mpm", { NULL }, 45, "udp" }, + { "mpm-snd", { NULL }, 46, "tcp" }, + { "mpm-snd", { NULL }, 46, "udp" }, + { "ni-ftp", { NULL }, 47, "tcp" }, + { "ni-ftp", { NULL }, 47, "udp" }, + { "auditd", { NULL }, 48, "tcp" }, + { "auditd", { NULL }, 48, "udp" }, + { "tacacs", { NULL }, 49, "tcp" }, + { "tacacs", { NULL }, 49, "udp" }, + { "re-mail-ck", { NULL }, 50, "tcp" }, + { "re-mail-ck", { NULL }, 50, "udp" }, + { "la-maint", { NULL }, 51, "tcp" }, + { "la-maint", { NULL }, 51, "udp" }, + { "xns-time", { NULL }, 52, "tcp" }, + { "xns-time", { NULL }, 52, "udp" }, + { "domain", { NULL }, 53, "tcp" }, + { "domain", { NULL }, 53, "udp" }, + { "xns-ch", { NULL }, 54, "tcp" }, + { "xns-ch", { NULL }, 54, "udp" }, + { "isi-gl", { NULL }, 55, "tcp" }, + { "isi-gl", { NULL }, 55, "udp" }, + { "xns-auth", { NULL }, 56, "tcp" }, + { "xns-auth", { NULL }, 56, "udp" }, + { "xns-mail", { NULL }, 58, "tcp" }, + { "xns-mail", { NULL }, 58, "udp" }, + { "ni-mail", { NULL }, 61, "tcp" }, + { "ni-mail", { NULL }, 61, "udp" }, + { "acas", { NULL }, 62, "tcp" }, + { "acas", { NULL }, 62, "udp" }, + { "whois++", { NULL }, 63, "tcp" }, + { "whois++", { NULL }, 63, "udp" }, + { "covia", { NULL }, 64, "tcp" }, + { "covia", { NULL }, 64, "udp" }, + { "tacacs-ds", { NULL }, 65, "tcp" }, + { "tacacs-ds", { NULL }, 65, "udp" }, + { "sql*net", { NULL }, 66, "tcp" }, + { "sql*net", { NULL }, 66, "udp" }, + { "bootps", { NULL }, 67, "tcp" }, + { "bootps", { NULL }, 67, "udp" }, + { "bootpc", { NULL }, 68, "tcp" }, + { "bootpc", { NULL }, 68, "udp" }, + { "tftp", { NULL }, 69, "tcp" }, + { "tftp", { NULL }, 69, "udp" }, + { "gopher", { NULL }, 70, "tcp" }, + { "gopher", { NULL }, 70, "udp" }, + { "netrjs-1", { NULL }, 71, "tcp" }, + { "netrjs-1", { NULL }, 71, "udp" }, + { "netrjs-2", { NULL }, 72, "tcp" }, + { "netrjs-2", { NULL }, 72, "udp" }, + { "netrjs-3", { NULL }, 73, "tcp" }, + { "netrjs-3", { NULL }, 73, "udp" }, + { "netrjs-4", { NULL }, 74, "tcp" }, + { "netrjs-4", { NULL }, 74, "udp" }, + { "deos", { NULL }, 76, "tcp" }, + { "deos", { NULL }, 76, "udp" }, + { "vettcp", { NULL }, 78, "tcp" }, + { "vettcp", { NULL }, 78, "udp" }, + { "finger", { NULL }, 79, "tcp" }, + { "finger", { NULL }, 79, "udp" }, + { "http", { NULL }, 80, "tcp" }, + { "http", { NULL }, 80, "udp" }, + { "www", { NULL }, 80, "tcp" }, + { "www", { NULL }, 80, "udp" }, + { "www-http", { NULL }, 80, "tcp" }, + { "www-http", { NULL }, 80, "udp" }, + { "http", { NULL }, 80, "sctp"}, + { "xfer", { NULL }, 82, "tcp" }, + { "xfer", { NULL }, 82, "udp" }, + { "mit-ml-dev", { NULL }, 83, "tcp" }, + { "mit-ml-dev", { NULL }, 83, "udp" }, + { "ctf", { NULL }, 84, "tcp" }, + { "ctf", { NULL }, 84, "udp" }, + { "mit-ml-dev", { NULL }, 85, "tcp" }, + { "mit-ml-dev", { NULL }, 85, "udp" }, + { "mfcobol", { NULL }, 86, "tcp" }, + { "mfcobol", { NULL }, 86, "udp" }, + { "kerberos", { NULL }, 88, "tcp" }, + { "kerberos", { NULL }, 88, "udp" }, + { "su-mit-tg", { NULL }, 89, "tcp" }, + { "su-mit-tg", { NULL }, 89, "udp" }, + { "dnsix", { NULL }, 90, "tcp" }, + { "dnsix", { NULL }, 90, "udp" }, + { "mit-dov", { NULL }, 91, "tcp" }, + { "mit-dov", { NULL }, 91, "udp" }, + { "npp", { NULL }, 92, "tcp" }, + { "npp", { NULL }, 92, "udp" }, + { "dcp", { NULL }, 93, "tcp" }, + { "dcp", { NULL }, 93, "udp" }, + { "objcall", { NULL }, 94, "tcp" }, + { "objcall", { NULL }, 94, "udp" }, + { "supdup", { NULL }, 95, "tcp" }, + { "supdup", { NULL }, 95, "udp" }, + { "dixie", { NULL }, 96, "tcp" }, + { "dixie", { NULL }, 96, "udp" }, + { "swift-rvf", { NULL }, 97, "tcp" }, + { "swift-rvf", { NULL }, 97, "udp" }, + { "tacnews", { NULL }, 98, "tcp" }, + { "tacnews", { NULL }, 98, "udp" }, + { "metagram", { NULL }, 99, "tcp" }, + { "metagram", { NULL }, 99, "udp" }, + { "newacct", { NULL }, 100, "tcp" }, + { "hostname", { NULL }, 101, "tcp" }, + { "hostname", { NULL }, 101, "udp" }, + { "iso-tsap", { NULL }, 102, "tcp" }, + { "iso-tsap", { NULL }, 102, "udp" }, + { "gppitnp", { NULL }, 103, "tcp" }, + { "gppitnp", { NULL }, 103, "udp" }, + { "acr-nema", { NULL }, 104, "tcp" }, + { "acr-nema", { NULL }, 104, "udp" }, + { "cso", { NULL }, 105, "tcp" }, + { "cso", { NULL }, 105, "udp" }, + { "csnet-ns", { NULL }, 105, "tcp" }, + { "csnet-ns", { NULL }, 105, "udp" }, + { "3com-tsmux", { NULL }, 106, "tcp" }, + { "3com-tsmux", { NULL }, 106, "udp" }, + { "rtelnet", { NULL }, 107, "tcp" }, + { "rtelnet", { NULL }, 107, "udp" }, + { "snagas", { NULL }, 108, "tcp" }, + { "snagas", { NULL }, 108, "udp" }, + { "pop2", { NULL }, 109, "tcp" }, + { "pop2", { NULL }, 109, "udp" }, + { "pop3", { NULL }, 110, "tcp" }, + { "pop3", { NULL }, 110, "udp" }, + { "sunrpc", { NULL }, 111, "tcp" }, + { "sunrpc", { NULL }, 111, "udp" }, + { "mcidas", { NULL }, 112, "tcp" }, + { "mcidas", { NULL }, 112, "udp" }, + { "ident", { NULL }, 113, "tcp" }, + { "auth", { NULL }, 113, "tcp" }, + { "auth", { NULL }, 113, "udp" }, + { "sftp", { NULL }, 115, "tcp" }, + { "sftp", { NULL }, 115, "udp" }, + { "ansanotify", { NULL }, 116, "tcp" }, + { "ansanotify", { NULL }, 116, "udp" }, + { "uucp-path", { NULL }, 117, "tcp" }, + { "uucp-path", { NULL }, 117, "udp" }, + { "sqlserv", { NULL }, 118, "tcp" }, + { "sqlserv", { NULL }, 118, "udp" }, + { "nntp", { NULL }, 119, "tcp" }, + { "nntp", { NULL }, 119, "udp" }, + { "cfdptkt", { NULL }, 120, "tcp" }, + { "cfdptkt", { NULL }, 120, "udp" }, + { "erpc", { NULL }, 121, "tcp" }, + { "erpc", { NULL }, 121, "udp" }, + { "smakynet", { NULL }, 122, "tcp" }, + { "smakynet", { NULL }, 122, "udp" }, + { "ntp", { NULL }, 123, "tcp" }, + { "ntp", { NULL }, 123, "udp" }, + { "ansatrader", { NULL }, 124, "tcp" }, + { "ansatrader", { NULL }, 124, "udp" }, + { "locus-map", { NULL }, 125, "tcp" }, + { "locus-map", { NULL }, 125, "udp" }, + { "nxedit", { NULL }, 126, "tcp" }, + { "nxedit", { NULL }, 126, "udp" }, + { "locus-con", { NULL }, 127, "tcp" }, + { "locus-con", { NULL }, 127, "udp" }, + { "gss-xlicen", { NULL }, 128, "tcp" }, + { "gss-xlicen", { NULL }, 128, "udp" }, + { "pwdgen", { NULL }, 129, "tcp" }, + { "pwdgen", { NULL }, 129, "udp" }, + { "cisco-fna", { NULL }, 130, "tcp" }, + { "cisco-fna", { NULL }, 130, "udp" }, + { "cisco-tna", { NULL }, 131, "tcp" }, + { "cisco-tna", { NULL }, 131, "udp" }, + { "cisco-sys", { NULL }, 132, "tcp" }, + { "cisco-sys", { NULL }, 132, "udp" }, + { "statsrv", { NULL }, 133, "tcp" }, + { "statsrv", { NULL }, 133, "udp" }, + { "ingres-net", { NULL }, 134, "tcp" }, + { "ingres-net", { NULL }, 134, "udp" }, + { "epmap", { NULL }, 135, "tcp" }, + { "epmap", { NULL }, 135, "udp" }, + { "profile", { NULL }, 136, "tcp" }, + { "profile", { NULL }, 136, "udp" }, + { "netbios-ns", { NULL }, 137, "tcp" }, + { "netbios-ns", { NULL }, 137, "udp" }, + { "netbios-dgm", { NULL }, 138, "tcp" }, + { "netbios-dgm", { NULL }, 138, "udp" }, + { "netbios-ssn", { NULL }, 139, "tcp" }, + { "netbios-ssn", { NULL }, 139, "udp" }, + { "emfis-data", { NULL }, 140, "tcp" }, + { "emfis-data", { NULL }, 140, "udp" }, + { "emfis-cntl", { NULL }, 141, "tcp" }, + { "emfis-cntl", { NULL }, 141, "udp" }, + { "bl-idm", { NULL }, 142, "tcp" }, + { "bl-idm", { NULL }, 142, "udp" }, + { "imap", { NULL }, 143, "tcp" }, + { "imap", { NULL }, 143, "udp" }, + { "uma", { NULL }, 144, "tcp" }, + { "uma", { NULL }, 144, "udp" }, + { "uaac", { NULL }, 145, "tcp" }, + { "uaac", { NULL }, 145, "udp" }, + { "iso-tp0", { NULL }, 146, "tcp" }, + { "iso-tp0", { NULL }, 146, "udp" }, + { "iso-ip", { NULL }, 147, "tcp" }, + { "iso-ip", { NULL }, 147, "udp" }, + { "jargon", { NULL }, 148, "tcp" }, + { "jargon", { NULL }, 148, "udp" }, + { "aed-512", { NULL }, 149, "tcp" }, + { "aed-512", { NULL }, 149, "udp" }, + { "sql-net", { NULL }, 150, "tcp" }, + { "sql-net", { NULL }, 150, "udp" }, + { "hems", { NULL }, 151, "tcp" }, + { "hems", { NULL }, 151, "udp" }, + { "bftp", { NULL }, 152, "tcp" }, + { "bftp", { NULL }, 152, "udp" }, + { "sgmp", { NULL }, 153, "tcp" }, + { "sgmp", { NULL }, 153, "udp" }, + { "netsc-prod", { NULL }, 154, "tcp" }, + { "netsc-prod", { NULL }, 154, "udp" }, + { "netsc-dev", { NULL }, 155, "tcp" }, + { "netsc-dev", { NULL }, 155, "udp" }, + { "sqlsrv", { NULL }, 156, "tcp" }, + { "sqlsrv", { NULL }, 156, "udp" }, + { "knet-cmp", { NULL }, 157, "tcp" }, + { "knet-cmp", { NULL }, 157, "udp" }, + { "pcmail-srv", { NULL }, 158, "tcp" }, + { "pcmail-srv", { NULL }, 158, "udp" }, + { "nss-routing", { NULL }, 159, "tcp" }, + { "nss-routing", { NULL }, 159, "udp" }, + { "sgmp-traps", { NULL }, 160, "tcp" }, + { "sgmp-traps", { NULL }, 160, "udp" }, + { "snmp", { NULL }, 161, "tcp" }, + { "snmp", { NULL }, 161, "udp" }, + { "snmptrap", { NULL }, 162, "tcp" }, + { "snmptrap", { NULL }, 162, "udp" }, + { "cmip-man", { NULL }, 163, "tcp" }, + { "cmip-man", { NULL }, 163, "udp" }, + { "cmip-agent", { NULL }, 164, "tcp" }, + { "cmip-agent", { NULL }, 164, "udp" }, + { "xns-courier", { NULL }, 165, "tcp" }, + { "xns-courier", { NULL }, 165, "udp" }, + { "s-net", { NULL }, 166, "tcp" }, + { "s-net", { NULL }, 166, "udp" }, + { "namp", { NULL }, 167, "tcp" }, + { "namp", { NULL }, 167, "udp" }, + { "rsvd", { NULL }, 168, "tcp" }, + { "rsvd", { NULL }, 168, "udp" }, + { "send", { NULL }, 169, "tcp" }, + { "send", { NULL }, 169, "udp" }, + { "print-srv", { NULL }, 170, "tcp" }, + { "print-srv", { NULL }, 170, "udp" }, + { "multiplex", { NULL }, 171, "tcp" }, + { "multiplex", { NULL }, 171, "udp" }, + { "cl/1", { NULL }, 172, "tcp" }, + { "cl/1", { NULL }, 172, "udp" }, + { "xyplex-mux", { NULL }, 173, "tcp" }, + { "xyplex-mux", { NULL }, 173, "udp" }, + { "mailq", { NULL }, 174, "tcp" }, + { "mailq", { NULL }, 174, "udp" }, + { "vmnet", { NULL }, 175, "tcp" }, + { "vmnet", { NULL }, 175, "udp" }, + { "genrad-mux", { NULL }, 176, "tcp" }, + { "genrad-mux", { NULL }, 176, "udp" }, + { "xdmcp", { NULL }, 177, "tcp" }, + { "xdmcp", { NULL }, 177, "udp" }, + { "nextstep", { NULL }, 178, "tcp" }, + { "nextstep", { NULL }, 178, "udp" }, + { "bgp", { NULL }, 179, "tcp" }, + { "bgp", { NULL }, 179, "udp" }, + { "bgp", { NULL }, 179, "sctp"}, + { "ris", { NULL }, 180, "tcp" }, + { "ris", { NULL }, 180, "udp" }, + { "unify", { NULL }, 181, "tcp" }, + { "unify", { NULL }, 181, "udp" }, + { "audit", { NULL }, 182, "tcp" }, + { "audit", { NULL }, 182, "udp" }, + { "ocbinder", { NULL }, 183, "tcp" }, + { "ocbinder", { NULL }, 183, "udp" }, + { "ocserver", { NULL }, 184, "tcp" }, + { "ocserver", { NULL }, 184, "udp" }, + { "remote-kis", { NULL }, 185, "tcp" }, + { "remote-kis", { NULL }, 185, "udp" }, + { "kis", { NULL }, 186, "tcp" }, + { "kis", { NULL }, 186, "udp" }, + { "aci", { NULL }, 187, "tcp" }, + { "aci", { NULL }, 187, "udp" }, + { "mumps", { NULL }, 188, "tcp" }, + { "mumps", { NULL }, 188, "udp" }, + { "qft", { NULL }, 189, "tcp" }, + { "qft", { NULL }, 189, "udp" }, + { "gacp", { NULL }, 190, "tcp" }, + { "gacp", { NULL }, 190, "udp" }, + { "prospero", { NULL }, 191, "tcp" }, + { "prospero", { NULL }, 191, "udp" }, + { "osu-nms", { NULL }, 192, "tcp" }, + { "osu-nms", { NULL }, 192, "udp" }, + { "srmp", { NULL }, 193, "tcp" }, + { "srmp", { NULL }, 193, "udp" }, + { "irc", { NULL }, 194, "tcp" }, + { "irc", { NULL }, 194, "udp" }, + { "dn6-nlm-aud", { NULL }, 195, "tcp" }, + { "dn6-nlm-aud", { NULL }, 195, "udp" }, + { "dn6-smm-red", { NULL }, 196, "tcp" }, + { "dn6-smm-red", { NULL }, 196, "udp" }, + { "dls", { NULL }, 197, "tcp" }, + { "dls", { NULL }, 197, "udp" }, + { "dls-mon", { NULL }, 198, "tcp" }, + { "dls-mon", { NULL }, 198, "udp" }, + { "smux", { NULL }, 199, "tcp" }, + { "smux", { NULL }, 199, "udp" }, + { "src", { NULL }, 200, "tcp" }, + { "src", { NULL }, 200, "udp" }, + { "at-rtmp", { NULL }, 201, "tcp" }, + { "at-rtmp", { NULL }, 201, "udp" }, + { "at-nbp", { NULL }, 202, "tcp" }, + { "at-nbp", { NULL }, 202, "udp" }, + { "at-3", { NULL }, 203, "tcp" }, + { "at-3", { NULL }, 203, "udp" }, + { "at-echo", { NULL }, 204, "tcp" }, + { "at-echo", { NULL }, 204, "udp" }, + { "at-5", { NULL }, 205, "tcp" }, + { "at-5", { NULL }, 205, "udp" }, + { "at-zis", { NULL }, 206, "tcp" }, + { "at-zis", { NULL }, 206, "udp" }, + { "at-7", { NULL }, 207, "tcp" }, + { "at-7", { NULL }, 207, "udp" }, + { "at-8", { NULL }, 208, "tcp" }, + { "at-8", { NULL }, 208, "udp" }, + { "qmtp", { NULL }, 209, "tcp" }, + { "qmtp", { NULL }, 209, "udp" }, + { "z39.50", { NULL }, 210, "tcp" }, + { "z39.50", { NULL }, 210, "udp" }, + { "914c/g", { NULL }, 211, "tcp" }, + { "914c/g", { NULL }, 211, "udp" }, + { "anet", { NULL }, 212, "tcp" }, + { "anet", { NULL }, 212, "udp" }, + { "ipx", { NULL }, 213, "tcp" }, + { "ipx", { NULL }, 213, "udp" }, + { "vmpwscs", { NULL }, 214, "tcp" }, + { "vmpwscs", { NULL }, 214, "udp" }, + { "softpc", { NULL }, 215, "tcp" }, + { "softpc", { NULL }, 215, "udp" }, + { "CAIlic", { NULL }, 216, "tcp" }, + { "CAIlic", { NULL }, 216, "udp" }, + { "dbase", { NULL }, 217, "tcp" }, + { "dbase", { NULL }, 217, "udp" }, + { "mpp", { NULL }, 218, "tcp" }, + { "mpp", { NULL }, 218, "udp" }, + { "uarps", { NULL }, 219, "tcp" }, + { "uarps", { NULL }, 219, "udp" }, + { "imap3", { NULL }, 220, "tcp" }, + { "imap3", { NULL }, 220, "udp" }, + { "fln-spx", { NULL }, 221, "tcp" }, + { "fln-spx", { NULL }, 221, "udp" }, + { "rsh-spx", { NULL }, 222, "tcp" }, + { "rsh-spx", { NULL }, 222, "udp" }, + { "cdc", { NULL }, 223, "tcp" }, + { "cdc", { NULL }, 223, "udp" }, + { "masqdialer", { NULL }, 224, "tcp" }, + { "masqdialer", { NULL }, 224, "udp" }, + { "direct", { NULL }, 242, "tcp" }, + { "direct", { NULL }, 242, "udp" }, + { "sur-meas", { NULL }, 243, "tcp" }, + { "sur-meas", { NULL }, 243, "udp" }, + { "inbusiness", { NULL }, 244, "tcp" }, + { "inbusiness", { NULL }, 244, "udp" }, + { "link", { NULL }, 245, "tcp" }, + { "link", { NULL }, 245, "udp" }, + { "dsp3270", { NULL }, 246, "tcp" }, + { "dsp3270", { NULL }, 246, "udp" }, + { "subntbcst_tftp", { NULL }, 247, "tcp" }, + { "subntbcst_tftp", { NULL }, 247, "udp" }, + { "bhfhs", { NULL }, 248, "tcp" }, + { "bhfhs", { NULL }, 248, "udp" }, + { "rap", { NULL }, 256, "tcp" }, + { "rap", { NULL }, 256, "udp" }, + { "set", { NULL }, 257, "tcp" }, + { "set", { NULL }, 257, "udp" }, + { "esro-gen", { NULL }, 259, "tcp" }, + { "esro-gen", { NULL }, 259, "udp" }, + { "openport", { NULL }, 260, "tcp" }, + { "openport", { NULL }, 260, "udp" }, + { "nsiiops", { NULL }, 261, "tcp" }, + { "nsiiops", { NULL }, 261, "udp" }, + { "arcisdms", { NULL }, 262, "tcp" }, + { "arcisdms", { NULL }, 262, "udp" }, + { "hdap", { NULL }, 263, "tcp" }, + { "hdap", { NULL }, 263, "udp" }, + { "bgmp", { NULL }, 264, "tcp" }, + { "bgmp", { NULL }, 264, "udp" }, + { "x-bone-ctl", { NULL }, 265, "tcp" }, + { "x-bone-ctl", { NULL }, 265, "udp" }, + { "sst", { NULL }, 266, "tcp" }, + { "sst", { NULL }, 266, "udp" }, + { "td-service", { NULL }, 267, "tcp" }, + { "td-service", { NULL }, 267, "udp" }, + { "td-replica", { NULL }, 268, "tcp" }, + { "td-replica", { NULL }, 268, "udp" }, + { "manet", { NULL }, 269, "tcp" }, + { "manet", { NULL }, 269, "udp" }, + { "gist", { NULL }, 270, "udp" }, + { "http-mgmt", { NULL }, 280, "tcp" }, + { "http-mgmt", { NULL }, 280, "udp" }, + { "personal-link", { NULL }, 281, "tcp" }, + { "personal-link", { NULL }, 281, "udp" }, + { "cableport-ax", { NULL }, 282, "tcp" }, + { "cableport-ax", { NULL }, 282, "udp" }, + { "rescap", { NULL }, 283, "tcp" }, + { "rescap", { NULL }, 283, "udp" }, + { "corerjd", { NULL }, 284, "tcp" }, + { "corerjd", { NULL }, 284, "udp" }, + { "fxp", { NULL }, 286, "tcp" }, + { "fxp", { NULL }, 286, "udp" }, + { "k-block", { NULL }, 287, "tcp" }, + { "k-block", { NULL }, 287, "udp" }, + { "novastorbakcup", { NULL }, 308, "tcp" }, + { "novastorbakcup", { NULL }, 308, "udp" }, + { "entrusttime", { NULL }, 309, "tcp" }, + { "entrusttime", { NULL }, 309, "udp" }, + { "bhmds", { NULL }, 310, "tcp" }, + { "bhmds", { NULL }, 310, "udp" }, + { "asip-webadmin", { NULL }, 311, "tcp" }, + { "asip-webadmin", { NULL }, 311, "udp" }, + { "vslmp", { NULL }, 312, "tcp" }, + { "vslmp", { NULL }, 312, "udp" }, + { "magenta-logic", { NULL }, 313, "tcp" }, + { "magenta-logic", { NULL }, 313, "udp" }, + { "opalis-robot", { NULL }, 314, "tcp" }, + { "opalis-robot", { NULL }, 314, "udp" }, + { "dpsi", { NULL }, 315, "tcp" }, + { "dpsi", { NULL }, 315, "udp" }, + { "decauth", { NULL }, 316, "tcp" }, + { "decauth", { NULL }, 316, "udp" }, + { "zannet", { NULL }, 317, "tcp" }, + { "zannet", { NULL }, 317, "udp" }, + { "pkix-timestamp", { NULL }, 318, "tcp" }, + { "pkix-timestamp", { NULL }, 318, "udp" }, + { "ptp-event", { NULL }, 319, "tcp" }, + { "ptp-event", { NULL }, 319, "udp" }, + { "ptp-general", { NULL }, 320, "tcp" }, + { "ptp-general", { NULL }, 320, "udp" }, + { "pip", { NULL }, 321, "tcp" }, + { "pip", { NULL }, 321, "udp" }, + { "rtsps", { NULL }, 322, "tcp" }, + { "rtsps", { NULL }, 322, "udp" }, + { "texar", { NULL }, 333, "tcp" }, + { "texar", { NULL }, 333, "udp" }, + { "pdap", { NULL }, 344, "tcp" }, + { "pdap", { NULL }, 344, "udp" }, + { "pawserv", { NULL }, 345, "tcp" }, + { "pawserv", { NULL }, 345, "udp" }, + { "zserv", { NULL }, 346, "tcp" }, + { "zserv", { NULL }, 346, "udp" }, + { "fatserv", { NULL }, 347, "tcp" }, + { "fatserv", { NULL }, 347, "udp" }, + { "csi-sgwp", { NULL }, 348, "tcp" }, + { "csi-sgwp", { NULL }, 348, "udp" }, + { "mftp", { NULL }, 349, "tcp" }, + { "mftp", { NULL }, 349, "udp" }, + { "matip-type-a", { NULL }, 350, "tcp" }, + { "matip-type-a", { NULL }, 350, "udp" }, + { "matip-type-b", { NULL }, 351, "tcp" }, + { "matip-type-b", { NULL }, 351, "udp" }, + { "bhoetty", { NULL }, 351, "tcp" }, + { "bhoetty", { NULL }, 351, "udp" }, + { "dtag-ste-sb", { NULL }, 352, "tcp" }, + { "dtag-ste-sb", { NULL }, 352, "udp" }, + { "bhoedap4", { NULL }, 352, "tcp" }, + { "bhoedap4", { NULL }, 352, "udp" }, + { "ndsauth", { NULL }, 353, "tcp" }, + { "ndsauth", { NULL }, 353, "udp" }, + { "bh611", { NULL }, 354, "tcp" }, + { "bh611", { NULL }, 354, "udp" }, + { "datex-asn", { NULL }, 355, "tcp" }, + { "datex-asn", { NULL }, 355, "udp" }, + { "cloanto-net-1", { NULL }, 356, "tcp" }, + { "cloanto-net-1", { NULL }, 356, "udp" }, + { "bhevent", { NULL }, 357, "tcp" }, + { "bhevent", { NULL }, 357, "udp" }, + { "shrinkwrap", { NULL }, 358, "tcp" }, + { "shrinkwrap", { NULL }, 358, "udp" }, + { "nsrmp", { NULL }, 359, "tcp" }, + { "nsrmp", { NULL }, 359, "udp" }, + { "scoi2odialog", { NULL }, 360, "tcp" }, + { "scoi2odialog", { NULL }, 360, "udp" }, + { "semantix", { NULL }, 361, "tcp" }, + { "semantix", { NULL }, 361, "udp" }, + { "srssend", { NULL }, 362, "tcp" }, + { "srssend", { NULL }, 362, "udp" }, + { "rsvp_tunnel", { NULL }, 363, "tcp" }, + { "rsvp_tunnel", { NULL }, 363, "udp" }, + { "aurora-cmgr", { NULL }, 364, "tcp" }, + { "aurora-cmgr", { NULL }, 364, "udp" }, + { "dtk", { NULL }, 365, "tcp" }, + { "dtk", { NULL }, 365, "udp" }, + { "odmr", { NULL }, 366, "tcp" }, + { "odmr", { NULL }, 366, "udp" }, + { "mortgageware", { NULL }, 367, "tcp" }, + { "mortgageware", { NULL }, 367, "udp" }, + { "qbikgdp", { NULL }, 368, "tcp" }, + { "qbikgdp", { NULL }, 368, "udp" }, + { "rpc2portmap", { NULL }, 369, "tcp" }, + { "rpc2portmap", { NULL }, 369, "udp" }, + { "codaauth2", { NULL }, 370, "tcp" }, + { "codaauth2", { NULL }, 370, "udp" }, + { "clearcase", { NULL }, 371, "tcp" }, + { "clearcase", { NULL }, 371, "udp" }, + { "ulistproc", { NULL }, 372, "tcp" }, + { "ulistproc", { NULL }, 372, "udp" }, + { "legent-1", { NULL }, 373, "tcp" }, + { "legent-1", { NULL }, 373, "udp" }, + { "legent-2", { NULL }, 374, "tcp" }, + { "legent-2", { NULL }, 374, "udp" }, + { "hassle", { NULL }, 375, "tcp" }, + { "hassle", { NULL }, 375, "udp" }, + { "nip", { NULL }, 376, "tcp" }, + { "nip", { NULL }, 376, "udp" }, + { "tnETOS", { NULL }, 377, "tcp" }, + { "tnETOS", { NULL }, 377, "udp" }, + { "dsETOS", { NULL }, 378, "tcp" }, + { "dsETOS", { NULL }, 378, "udp" }, + { "is99c", { NULL }, 379, "tcp" }, + { "is99c", { NULL }, 379, "udp" }, + { "is99s", { NULL }, 380, "tcp" }, + { "is99s", { NULL }, 380, "udp" }, + { "hp-collector", { NULL }, 381, "tcp" }, + { "hp-collector", { NULL }, 381, "udp" }, + { "hp-managed-node", { NULL }, 382, "tcp" }, + { "hp-managed-node", { NULL }, 382, "udp" }, + { "hp-alarm-mgr", { NULL }, 383, "tcp" }, + { "hp-alarm-mgr", { NULL }, 383, "udp" }, + { "arns", { NULL }, 384, "tcp" }, + { "arns", { NULL }, 384, "udp" }, + { "ibm-app", { NULL }, 385, "tcp" }, + { "ibm-app", { NULL }, 385, "udp" }, + { "asa", { NULL }, 386, "tcp" }, + { "asa", { NULL }, 386, "udp" }, + { "aurp", { NULL }, 387, "tcp" }, + { "aurp", { NULL }, 387, "udp" }, + { "unidata-ldm", { NULL }, 388, "tcp" }, + { "unidata-ldm", { NULL }, 388, "udp" }, + { "ldap", { NULL }, 389, "tcp" }, + { "ldap", { NULL }, 389, "udp" }, + { "uis", { NULL }, 390, "tcp" }, + { "uis", { NULL }, 390, "udp" }, + { "synotics-relay", { NULL }, 391, "tcp" }, + { "synotics-relay", { NULL }, 391, "udp" }, + { "synotics-broker", { NULL }, 392, "tcp" }, + { "synotics-broker", { NULL }, 392, "udp" }, + { "meta5", { NULL }, 393, "tcp" }, + { "meta5", { NULL }, 393, "udp" }, + { "embl-ndt", { NULL }, 394, "tcp" }, + { "embl-ndt", { NULL }, 394, "udp" }, + { "netcp", { NULL }, 395, "tcp" }, + { "netcp", { NULL }, 395, "udp" }, + { "netware-ip", { NULL }, 396, "tcp" }, + { "netware-ip", { NULL }, 396, "udp" }, + { "mptn", { NULL }, 397, "tcp" }, + { "mptn", { NULL }, 397, "udp" }, + { "kryptolan", { NULL }, 398, "tcp" }, + { "kryptolan", { NULL }, 398, "udp" }, + { "iso-tsap-c2", { NULL }, 399, "tcp" }, + { "iso-tsap-c2", { NULL }, 399, "udp" }, + { "osb-sd", { NULL }, 400, "tcp" }, + { "osb-sd", { NULL }, 400, "udp" }, + { "ups", { NULL }, 401, "tcp" }, + { "ups", { NULL }, 401, "udp" }, + { "genie", { NULL }, 402, "tcp" }, + { "genie", { NULL }, 402, "udp" }, + { "decap", { NULL }, 403, "tcp" }, + { "decap", { NULL }, 403, "udp" }, + { "nced", { NULL }, 404, "tcp" }, + { "nced", { NULL }, 404, "udp" }, + { "ncld", { NULL }, 405, "tcp" }, + { "ncld", { NULL }, 405, "udp" }, + { "imsp", { NULL }, 406, "tcp" }, + { "imsp", { NULL }, 406, "udp" }, + { "timbuktu", { NULL }, 407, "tcp" }, + { "timbuktu", { NULL }, 407, "udp" }, + { "prm-sm", { NULL }, 408, "tcp" }, + { "prm-sm", { NULL }, 408, "udp" }, + { "prm-nm", { NULL }, 409, "tcp" }, + { "prm-nm", { NULL }, 409, "udp" }, + { "decladebug", { NULL }, 410, "tcp" }, + { "decladebug", { NULL }, 410, "udp" }, + { "rmt", { NULL }, 411, "tcp" }, + { "rmt", { NULL }, 411, "udp" }, + { "synoptics-trap", { NULL }, 412, "tcp" }, + { "synoptics-trap", { NULL }, 412, "udp" }, + { "smsp", { NULL }, 413, "tcp" }, + { "smsp", { NULL }, 413, "udp" }, + { "infoseek", { NULL }, 414, "tcp" }, + { "infoseek", { NULL }, 414, "udp" }, + { "bnet", { NULL }, 415, "tcp" }, + { "bnet", { NULL }, 415, "udp" }, + { "silverplatter", { NULL }, 416, "tcp" }, + { "silverplatter", { NULL }, 416, "udp" }, + { "onmux", { NULL }, 417, "tcp" }, + { "onmux", { NULL }, 417, "udp" }, + { "hyper-g", { NULL }, 418, "tcp" }, + { "hyper-g", { NULL }, 418, "udp" }, + { "ariel1", { NULL }, 419, "tcp" }, + { "ariel1", { NULL }, 419, "udp" }, + { "smpte", { NULL }, 420, "tcp" }, + { "smpte", { NULL }, 420, "udp" }, + { "ariel2", { NULL }, 421, "tcp" }, + { "ariel2", { NULL }, 421, "udp" }, + { "ariel3", { NULL }, 422, "tcp" }, + { "ariel3", { NULL }, 422, "udp" }, + { "opc-job-start", { NULL }, 423, "tcp" }, + { "opc-job-start", { NULL }, 423, "udp" }, + { "opc-job-track", { NULL }, 424, "tcp" }, + { "opc-job-track", { NULL }, 424, "udp" }, + { "icad-el", { NULL }, 425, "tcp" }, + { "icad-el", { NULL }, 425, "udp" }, + { "smartsdp", { NULL }, 426, "tcp" }, + { "smartsdp", { NULL }, 426, "udp" }, + { "svrloc", { NULL }, 427, "tcp" }, + { "svrloc", { NULL }, 427, "udp" }, + { "ocs_cmu", { NULL }, 428, "tcp" }, + { "ocs_cmu", { NULL }, 428, "udp" }, + { "ocs_amu", { NULL }, 429, "tcp" }, + { "ocs_amu", { NULL }, 429, "udp" }, + { "utmpsd", { NULL }, 430, "tcp" }, + { "utmpsd", { NULL }, 430, "udp" }, + { "utmpcd", { NULL }, 431, "tcp" }, + { "utmpcd", { NULL }, 431, "udp" }, + { "iasd", { NULL }, 432, "tcp" }, + { "iasd", { NULL }, 432, "udp" }, + { "nnsp", { NULL }, 433, "tcp" }, + { "nnsp", { NULL }, 433, "udp" }, + { "mobileip-agent", { NULL }, 434, "tcp" }, + { "mobileip-agent", { NULL }, 434, "udp" }, + { "mobilip-mn", { NULL }, 435, "tcp" }, + { "mobilip-mn", { NULL }, 435, "udp" }, + { "dna-cml", { NULL }, 436, "tcp" }, + { "dna-cml", { NULL }, 436, "udp" }, + { "comscm", { NULL }, 437, "tcp" }, + { "comscm", { NULL }, 437, "udp" }, + { "dsfgw", { NULL }, 438, "tcp" }, + { "dsfgw", { NULL }, 438, "udp" }, + { "dasp", { NULL }, 439, "tcp" }, + { "dasp", { NULL }, 439, "udp" }, + { "sgcp", { NULL }, 440, "tcp" }, + { "sgcp", { NULL }, 440, "udp" }, + { "decvms-sysmgt", { NULL }, 441, "tcp" }, + { "decvms-sysmgt", { NULL }, 441, "udp" }, + { "cvc_hostd", { NULL }, 442, "tcp" }, + { "cvc_hostd", { NULL }, 442, "udp" }, + { "https", { NULL }, 443, "tcp" }, + { "https", { NULL }, 443, "udp" }, + { "https", { NULL }, 443, "sctp"}, + { "snpp", { NULL }, 444, "tcp" }, + { "snpp", { NULL }, 444, "udp" }, + { "microsoft-ds", { NULL }, 445, "tcp" }, + { "microsoft-ds", { NULL }, 445, "udp" }, + { "ddm-rdb", { NULL }, 446, "tcp" }, + { "ddm-rdb", { NULL }, 446, "udp" }, + { "ddm-dfm", { NULL }, 447, "tcp" }, + { "ddm-dfm", { NULL }, 447, "udp" }, + { "ddm-ssl", { NULL }, 448, "tcp" }, + { "ddm-ssl", { NULL }, 448, "udp" }, + { "as-servermap", { NULL }, 449, "tcp" }, + { "as-servermap", { NULL }, 449, "udp" }, + { "tserver", { NULL }, 450, "tcp" }, + { "tserver", { NULL }, 450, "udp" }, + { "sfs-smp-net", { NULL }, 451, "tcp" }, + { "sfs-smp-net", { NULL }, 451, "udp" }, + { "sfs-config", { NULL }, 452, "tcp" }, + { "sfs-config", { NULL }, 452, "udp" }, + { "creativeserver", { NULL }, 453, "tcp" }, + { "creativeserver", { NULL }, 453, "udp" }, + { "contentserver", { NULL }, 454, "tcp" }, + { "contentserver", { NULL }, 454, "udp" }, + { "creativepartnr", { NULL }, 455, "tcp" }, + { "creativepartnr", { NULL }, 455, "udp" }, + { "macon-tcp", { NULL }, 456, "tcp" }, + { "macon-udp", { NULL }, 456, "udp" }, + { "scohelp", { NULL }, 457, "tcp" }, + { "scohelp", { NULL }, 457, "udp" }, + { "appleqtc", { NULL }, 458, "tcp" }, + { "appleqtc", { NULL }, 458, "udp" }, + { "ampr-rcmd", { NULL }, 459, "tcp" }, + { "ampr-rcmd", { NULL }, 459, "udp" }, + { "skronk", { NULL }, 460, "tcp" }, + { "skronk", { NULL }, 460, "udp" }, + { "datasurfsrv", { NULL }, 461, "tcp" }, + { "datasurfsrv", { NULL }, 461, "udp" }, + { "datasurfsrvsec", { NULL }, 462, "tcp" }, + { "datasurfsrvsec", { NULL }, 462, "udp" }, + { "alpes", { NULL }, 463, "tcp" }, + { "alpes", { NULL }, 463, "udp" }, + { "kpasswd", { NULL }, 464, "tcp" }, + { "kpasswd", { NULL }, 464, "udp" }, + { "urd", { NULL }, 465, "tcp" }, + { "igmpv3lite", { NULL }, 465, "udp" }, + { "digital-vrc", { NULL }, 466, "tcp" }, + { "digital-vrc", { NULL }, 466, "udp" }, + { "mylex-mapd", { NULL }, 467, "tcp" }, + { "mylex-mapd", { NULL }, 467, "udp" }, + { "photuris", { NULL }, 468, "tcp" }, + { "photuris", { NULL }, 468, "udp" }, + { "rcp", { NULL }, 469, "tcp" }, + { "rcp", { NULL }, 469, "udp" }, + { "scx-proxy", { NULL }, 470, "tcp" }, + { "scx-proxy", { NULL }, 470, "udp" }, + { "mondex", { NULL }, 471, "tcp" }, + { "mondex", { NULL }, 471, "udp" }, + { "ljk-login", { NULL }, 472, "tcp" }, + { "ljk-login", { NULL }, 472, "udp" }, + { "hybrid-pop", { NULL }, 473, "tcp" }, + { "hybrid-pop", { NULL }, 473, "udp" }, + { "tn-tl-w1", { NULL }, 474, "tcp" }, + { "tn-tl-w2", { NULL }, 474, "udp" }, + { "tcpnethaspsrv", { NULL }, 475, "tcp" }, + { "tcpnethaspsrv", { NULL }, 475, "udp" }, + { "tn-tl-fd1", { NULL }, 476, "tcp" }, + { "tn-tl-fd1", { NULL }, 476, "udp" }, + { "ss7ns", { NULL }, 477, "tcp" }, + { "ss7ns", { NULL }, 477, "udp" }, + { "spsc", { NULL }, 478, "tcp" }, + { "spsc", { NULL }, 478, "udp" }, + { "iafserver", { NULL }, 479, "tcp" }, + { "iafserver", { NULL }, 479, "udp" }, + { "iafdbase", { NULL }, 480, "tcp" }, + { "iafdbase", { NULL }, 480, "udp" }, + { "ph", { NULL }, 481, "tcp" }, + { "ph", { NULL }, 481, "udp" }, + { "bgs-nsi", { NULL }, 482, "tcp" }, + { "bgs-nsi", { NULL }, 482, "udp" }, + { "ulpnet", { NULL }, 483, "tcp" }, + { "ulpnet", { NULL }, 483, "udp" }, + { "integra-sme", { NULL }, 484, "tcp" }, + { "integra-sme", { NULL }, 484, "udp" }, + { "powerburst", { NULL }, 485, "tcp" }, + { "powerburst", { NULL }, 485, "udp" }, + { "avian", { NULL }, 486, "tcp" }, + { "avian", { NULL }, 486, "udp" }, + { "saft", { NULL }, 487, "tcp" }, + { "saft", { NULL }, 487, "udp" }, + { "gss-http", { NULL }, 488, "tcp" }, + { "gss-http", { NULL }, 488, "udp" }, + { "nest-protocol", { NULL }, 489, "tcp" }, + { "nest-protocol", { NULL }, 489, "udp" }, + { "micom-pfs", { NULL }, 490, "tcp" }, + { "micom-pfs", { NULL }, 490, "udp" }, + { "go-login", { NULL }, 491, "tcp" }, + { "go-login", { NULL }, 491, "udp" }, + { "ticf-1", { NULL }, 492, "tcp" }, + { "ticf-1", { NULL }, 492, "udp" }, + { "ticf-2", { NULL }, 493, "tcp" }, + { "ticf-2", { NULL }, 493, "udp" }, + { "pov-ray", { NULL }, 494, "tcp" }, + { "pov-ray", { NULL }, 494, "udp" }, + { "intecourier", { NULL }, 495, "tcp" }, + { "intecourier", { NULL }, 495, "udp" }, + { "pim-rp-disc", { NULL }, 496, "tcp" }, + { "pim-rp-disc", { NULL }, 496, "udp" }, + { "dantz", { NULL }, 497, "tcp" }, + { "dantz", { NULL }, 497, "udp" }, + { "siam", { NULL }, 498, "tcp" }, + { "siam", { NULL }, 498, "udp" }, + { "iso-ill", { NULL }, 499, "tcp" }, + { "iso-ill", { NULL }, 499, "udp" }, + { "isakmp", { NULL }, 500, "tcp" }, + { "isakmp", { NULL }, 500, "udp" }, + { "stmf", { NULL }, 501, "tcp" }, + { "stmf", { NULL }, 501, "udp" }, + { "asa-appl-proto", { NULL }, 502, "tcp" }, + { "asa-appl-proto", { NULL }, 502, "udp" }, + { "intrinsa", { NULL }, 503, "tcp" }, + { "intrinsa", { NULL }, 503, "udp" }, + { "citadel", { NULL }, 504, "tcp" }, + { "citadel", { NULL }, 504, "udp" }, + { "mailbox-lm", { NULL }, 505, "tcp" }, + { "mailbox-lm", { NULL }, 505, "udp" }, + { "ohimsrv", { NULL }, 506, "tcp" }, + { "ohimsrv", { NULL }, 506, "udp" }, + { "crs", { NULL }, 507, "tcp" }, + { "crs", { NULL }, 507, "udp" }, + { "xvttp", { NULL }, 508, "tcp" }, + { "xvttp", { NULL }, 508, "udp" }, + { "snare", { NULL }, 509, "tcp" }, + { "snare", { NULL }, 509, "udp" }, + { "fcp", { NULL }, 510, "tcp" }, + { "fcp", { NULL }, 510, "udp" }, + { "passgo", { NULL }, 511, "tcp" }, + { "passgo", { NULL }, 511, "udp" }, + { "exec", { NULL }, 512, "tcp" }, + { "comsat", { NULL }, 512, "udp" }, + { "biff", { NULL }, 512, "udp" }, + { "login", { NULL }, 513, "tcp" }, + { "who", { NULL }, 513, "udp" }, + { "shell", { NULL }, 514, "tcp" }, + { "syslog", { NULL }, 514, "udp" }, + { "printer", { NULL }, 515, "tcp" }, + { "printer", { NULL }, 515, "udp" }, + { "videotex", { NULL }, 516, "tcp" }, + { "videotex", { NULL }, 516, "udp" }, + { "talk", { NULL }, 517, "tcp" }, + { "talk", { NULL }, 517, "udp" }, + { "ntalk", { NULL }, 518, "tcp" }, + { "ntalk", { NULL }, 518, "udp" }, + { "utime", { NULL }, 519, "tcp" }, + { "utime", { NULL }, 519, "udp" }, + { "efs", { NULL }, 520, "tcp" }, + { "router", { NULL }, 520, "udp" }, + { "ripng", { NULL }, 521, "tcp" }, + { "ripng", { NULL }, 521, "udp" }, + { "ulp", { NULL }, 522, "tcp" }, + { "ulp", { NULL }, 522, "udp" }, + { "ibm-db2", { NULL }, 523, "tcp" }, + { "ibm-db2", { NULL }, 523, "udp" }, + { "ncp", { NULL }, 524, "tcp" }, + { "ncp", { NULL }, 524, "udp" }, + { "timed", { NULL }, 525, "tcp" }, + { "timed", { NULL }, 525, "udp" }, + { "tempo", { NULL }, 526, "tcp" }, + { "tempo", { NULL }, 526, "udp" }, + { "stx", { NULL }, 527, "tcp" }, + { "stx", { NULL }, 527, "udp" }, + { "custix", { NULL }, 528, "tcp" }, + { "custix", { NULL }, 528, "udp" }, + { "irc-serv", { NULL }, 529, "tcp" }, + { "irc-serv", { NULL }, 529, "udp" }, + { "courier", { NULL }, 530, "tcp" }, + { "courier", { NULL }, 530, "udp" }, + { "conference", { NULL }, 531, "tcp" }, + { "conference", { NULL }, 531, "udp" }, + { "netnews", { NULL }, 532, "tcp" }, + { "netnews", { NULL }, 532, "udp" }, + { "netwall", { NULL }, 533, "tcp" }, + { "netwall", { NULL }, 533, "udp" }, + { "windream", { NULL }, 534, "tcp" }, + { "windream", { NULL }, 534, "udp" }, + { "iiop", { NULL }, 535, "tcp" }, + { "iiop", { NULL }, 535, "udp" }, + { "opalis-rdv", { NULL }, 536, "tcp" }, + { "opalis-rdv", { NULL }, 536, "udp" }, + { "nmsp", { NULL }, 537, "tcp" }, + { "nmsp", { NULL }, 537, "udp" }, + { "gdomap", { NULL }, 538, "tcp" }, + { "gdomap", { NULL }, 538, "udp" }, + { "apertus-ldp", { NULL }, 539, "tcp" }, + { "apertus-ldp", { NULL }, 539, "udp" }, + { "uucp", { NULL }, 540, "tcp" }, + { "uucp", { NULL }, 540, "udp" }, + { "uucp-rlogin", { NULL }, 541, "tcp" }, + { "uucp-rlogin", { NULL }, 541, "udp" }, + { "commerce", { NULL }, 542, "tcp" }, + { "commerce", { NULL }, 542, "udp" }, + { "klogin", { NULL }, 543, "tcp" }, + { "klogin", { NULL }, 543, "udp" }, + { "kshell", { NULL }, 544, "tcp" }, + { "kshell", { NULL }, 544, "udp" }, + { "appleqtcsrvr", { NULL }, 545, "tcp" }, + { "appleqtcsrvr", { NULL }, 545, "udp" }, + { "dhcpv6-client", { NULL }, 546, "tcp" }, + { "dhcpv6-client", { NULL }, 546, "udp" }, + { "dhcpv6-server", { NULL }, 547, "tcp" }, + { "dhcpv6-server", { NULL }, 547, "udp" }, + { "afpovertcp", { NULL }, 548, "tcp" }, + { "afpovertcp", { NULL }, 548, "udp" }, + { "idfp", { NULL }, 549, "tcp" }, + { "idfp", { NULL }, 549, "udp" }, + { "new-rwho", { NULL }, 550, "tcp" }, + { "new-rwho", { NULL }, 550, "udp" }, + { "cybercash", { NULL }, 551, "tcp" }, + { "cybercash", { NULL }, 551, "udp" }, + { "devshr-nts", { NULL }, 552, "tcp" }, + { "devshr-nts", { NULL }, 552, "udp" }, + { "pirp", { NULL }, 553, "tcp" }, + { "pirp", { NULL }, 553, "udp" }, + { "rtsp", { NULL }, 554, "tcp" }, + { "rtsp", { NULL }, 554, "udp" }, + { "dsf", { NULL }, 555, "tcp" }, + { "dsf", { NULL }, 555, "udp" }, + { "remotefs", { NULL }, 556, "tcp" }, + { "remotefs", { NULL }, 556, "udp" }, + { "openvms-sysipc", { NULL }, 557, "tcp" }, + { "openvms-sysipc", { NULL }, 557, "udp" }, + { "sdnskmp", { NULL }, 558, "tcp" }, + { "sdnskmp", { NULL }, 558, "udp" }, + { "teedtap", { NULL }, 559, "tcp" }, + { "teedtap", { NULL }, 559, "udp" }, + { "rmonitor", { NULL }, 560, "tcp" }, + { "rmonitor", { NULL }, 560, "udp" }, + { "monitor", { NULL }, 561, "tcp" }, + { "monitor", { NULL }, 561, "udp" }, + { "chshell", { NULL }, 562, "tcp" }, + { "chshell", { NULL }, 562, "udp" }, + { "nntps", { NULL }, 563, "tcp" }, + { "nntps", { NULL }, 563, "udp" }, + { "9pfs", { NULL }, 564, "tcp" }, + { "9pfs", { NULL }, 564, "udp" }, + { "whoami", { NULL }, 565, "tcp" }, + { "whoami", { NULL }, 565, "udp" }, + { "streettalk", { NULL }, 566, "tcp" }, + { "streettalk", { NULL }, 566, "udp" }, + { "banyan-rpc", { NULL }, 567, "tcp" }, + { "banyan-rpc", { NULL }, 567, "udp" }, + { "ms-shuttle", { NULL }, 568, "tcp" }, + { "ms-shuttle", { NULL }, 568, "udp" }, + { "ms-rome", { NULL }, 569, "tcp" }, + { "ms-rome", { NULL }, 569, "udp" }, + { "meter", { NULL }, 570, "tcp" }, + { "meter", { NULL }, 570, "udp" }, + { "meter", { NULL }, 571, "tcp" }, + { "meter", { NULL }, 571, "udp" }, + { "sonar", { NULL }, 572, "tcp" }, + { "sonar", { NULL }, 572, "udp" }, + { "banyan-vip", { NULL }, 573, "tcp" }, + { "banyan-vip", { NULL }, 573, "udp" }, + { "ftp-agent", { NULL }, 574, "tcp" }, + { "ftp-agent", { NULL }, 574, "udp" }, + { "vemmi", { NULL }, 575, "tcp" }, + { "vemmi", { NULL }, 575, "udp" }, + { "ipcd", { NULL }, 576, "tcp" }, + { "ipcd", { NULL }, 576, "udp" }, + { "vnas", { NULL }, 577, "tcp" }, + { "vnas", { NULL }, 577, "udp" }, + { "ipdd", { NULL }, 578, "tcp" }, + { "ipdd", { NULL }, 578, "udp" }, + { "decbsrv", { NULL }, 579, "tcp" }, + { "decbsrv", { NULL }, 579, "udp" }, + { "sntp-heartbeat", { NULL }, 580, "tcp" }, + { "sntp-heartbeat", { NULL }, 580, "udp" }, + { "bdp", { NULL }, 581, "tcp" }, + { "bdp", { NULL }, 581, "udp" }, + { "scc-security", { NULL }, 582, "tcp" }, + { "scc-security", { NULL }, 582, "udp" }, + { "philips-vc", { NULL }, 583, "tcp" }, + { "philips-vc", { NULL }, 583, "udp" }, + { "keyserver", { NULL }, 584, "tcp" }, + { "keyserver", { NULL }, 584, "udp" }, + { "password-chg", { NULL }, 586, "tcp" }, + { "password-chg", { NULL }, 586, "udp" }, + { "submission", { NULL }, 587, "tcp" }, + { "submission", { NULL }, 587, "udp" }, + { "cal", { NULL }, 588, "tcp" }, + { "cal", { NULL }, 588, "udp" }, + { "eyelink", { NULL }, 589, "tcp" }, + { "eyelink", { NULL }, 589, "udp" }, + { "tns-cml", { NULL }, 590, "tcp" }, + { "tns-cml", { NULL }, 590, "udp" }, + { "http-alt", { NULL }, 591, "tcp" }, + { "http-alt", { NULL }, 591, "udp" }, + { "eudora-set", { NULL }, 592, "tcp" }, + { "eudora-set", { NULL }, 592, "udp" }, + { "http-rpc-epmap", { NULL }, 593, "tcp" }, + { "http-rpc-epmap", { NULL }, 593, "udp" }, + { "tpip", { NULL }, 594, "tcp" }, + { "tpip", { NULL }, 594, "udp" }, + { "cab-protocol", { NULL }, 595, "tcp" }, + { "cab-protocol", { NULL }, 595, "udp" }, + { "smsd", { NULL }, 596, "tcp" }, + { "smsd", { NULL }, 596, "udp" }, + { "ptcnameservice", { NULL }, 597, "tcp" }, + { "ptcnameservice", { NULL }, 597, "udp" }, + { "sco-websrvrmg3", { NULL }, 598, "tcp" }, + { "sco-websrvrmg3", { NULL }, 598, "udp" }, + { "acp", { NULL }, 599, "tcp" }, + { "acp", { NULL }, 599, "udp" }, + { "ipcserver", { NULL }, 600, "tcp" }, + { "ipcserver", { NULL }, 600, "udp" }, + { "syslog-conn", { NULL }, 601, "tcp" }, + { "syslog-conn", { NULL }, 601, "udp" }, + { "xmlrpc-beep", { NULL }, 602, "tcp" }, + { "xmlrpc-beep", { NULL }, 602, "udp" }, + { "idxp", { NULL }, 603, "tcp" }, + { "idxp", { NULL }, 603, "udp" }, + { "tunnel", { NULL }, 604, "tcp" }, + { "tunnel", { NULL }, 604, "udp" }, + { "soap-beep", { NULL }, 605, "tcp" }, + { "soap-beep", { NULL }, 605, "udp" }, + { "urm", { NULL }, 606, "tcp" }, + { "urm", { NULL }, 606, "udp" }, + { "nqs", { NULL }, 607, "tcp" }, + { "nqs", { NULL }, 607, "udp" }, + { "sift-uft", { NULL }, 608, "tcp" }, + { "sift-uft", { NULL }, 608, "udp" }, + { "npmp-trap", { NULL }, 609, "tcp" }, + { "npmp-trap", { NULL }, 609, "udp" }, + { "npmp-local", { NULL }, 610, "tcp" }, + { "npmp-local", { NULL }, 610, "udp" }, + { "npmp-gui", { NULL }, 611, "tcp" }, + { "npmp-gui", { NULL }, 611, "udp" }, + { "hmmp-ind", { NULL }, 612, "tcp" }, + { "hmmp-ind", { NULL }, 612, "udp" }, + { "hmmp-op", { NULL }, 613, "tcp" }, + { "hmmp-op", { NULL }, 613, "udp" }, + { "sshell", { NULL }, 614, "tcp" }, + { "sshell", { NULL }, 614, "udp" }, + { "sco-inetmgr", { NULL }, 615, "tcp" }, + { "sco-inetmgr", { NULL }, 615, "udp" }, + { "sco-sysmgr", { NULL }, 616, "tcp" }, + { "sco-sysmgr", { NULL }, 616, "udp" }, + { "sco-dtmgr", { NULL }, 617, "tcp" }, + { "sco-dtmgr", { NULL }, 617, "udp" }, + { "dei-icda", { NULL }, 618, "tcp" }, + { "dei-icda", { NULL }, 618, "udp" }, + { "compaq-evm", { NULL }, 619, "tcp" }, + { "compaq-evm", { NULL }, 619, "udp" }, + { "sco-websrvrmgr", { NULL }, 620, "tcp" }, + { "sco-websrvrmgr", { NULL }, 620, "udp" }, + { "escp-ip", { NULL }, 621, "tcp" }, + { "escp-ip", { NULL }, 621, "udp" }, + { "collaborator", { NULL }, 622, "tcp" }, + { "collaborator", { NULL }, 622, "udp" }, + { "oob-ws-http", { NULL }, 623, "tcp" }, + { "asf-rmcp", { NULL }, 623, "udp" }, + { "cryptoadmin", { NULL }, 624, "tcp" }, + { "cryptoadmin", { NULL }, 624, "udp" }, + { "dec_dlm", { NULL }, 625, "tcp" }, + { "dec_dlm", { NULL }, 625, "udp" }, + { "asia", { NULL }, 626, "tcp" }, + { "asia", { NULL }, 626, "udp" }, + { "passgo-tivoli", { NULL }, 627, "tcp" }, + { "passgo-tivoli", { NULL }, 627, "udp" }, + { "qmqp", { NULL }, 628, "tcp" }, + { "qmqp", { NULL }, 628, "udp" }, + { "3com-amp3", { NULL }, 629, "tcp" }, + { "3com-amp3", { NULL }, 629, "udp" }, + { "rda", { NULL }, 630, "tcp" }, + { "rda", { NULL }, 630, "udp" }, + { "ipp", { NULL }, 631, "tcp" }, + { "ipp", { NULL }, 631, "udp" }, + { "bmpp", { NULL }, 632, "tcp" }, + { "bmpp", { NULL }, 632, "udp" }, + { "servstat", { NULL }, 633, "tcp" }, + { "servstat", { NULL }, 633, "udp" }, + { "ginad", { NULL }, 634, "tcp" }, + { "ginad", { NULL }, 634, "udp" }, + { "rlzdbase", { NULL }, 635, "tcp" }, + { "rlzdbase", { NULL }, 635, "udp" }, + { "ldaps", { NULL }, 636, "tcp" }, + { "ldaps", { NULL }, 636, "udp" }, + { "lanserver", { NULL }, 637, "tcp" }, + { "lanserver", { NULL }, 637, "udp" }, + { "mcns-sec", { NULL }, 638, "tcp" }, + { "mcns-sec", { NULL }, 638, "udp" }, + { "msdp", { NULL }, 639, "tcp" }, + { "msdp", { NULL }, 639, "udp" }, + { "entrust-sps", { NULL }, 640, "tcp" }, + { "entrust-sps", { NULL }, 640, "udp" }, + { "repcmd", { NULL }, 641, "tcp" }, + { "repcmd", { NULL }, 641, "udp" }, + { "esro-emsdp", { NULL }, 642, "tcp" }, + { "esro-emsdp", { NULL }, 642, "udp" }, + { "sanity", { NULL }, 643, "tcp" }, + { "sanity", { NULL }, 643, "udp" }, + { "dwr", { NULL }, 644, "tcp" }, + { "dwr", { NULL }, 644, "udp" }, + { "pssc", { NULL }, 645, "tcp" }, + { "pssc", { NULL }, 645, "udp" }, + { "ldp", { NULL }, 646, "tcp" }, + { "ldp", { NULL }, 646, "udp" }, + { "dhcp-failover", { NULL }, 647, "tcp" }, + { "dhcp-failover", { NULL }, 647, "udp" }, + { "rrp", { NULL }, 648, "tcp" }, + { "rrp", { NULL }, 648, "udp" }, + { "cadview-3d", { NULL }, 649, "tcp" }, + { "cadview-3d", { NULL }, 649, "udp" }, + { "obex", { NULL }, 650, "tcp" }, + { "obex", { NULL }, 650, "udp" }, + { "ieee-mms", { NULL }, 651, "tcp" }, + { "ieee-mms", { NULL }, 651, "udp" }, + { "hello-port", { NULL }, 652, "tcp" }, + { "hello-port", { NULL }, 652, "udp" }, + { "repscmd", { NULL }, 653, "tcp" }, + { "repscmd", { NULL }, 653, "udp" }, + { "aodv", { NULL }, 654, "tcp" }, + { "aodv", { NULL }, 654, "udp" }, + { "tinc", { NULL }, 655, "tcp" }, + { "tinc", { NULL }, 655, "udp" }, + { "spmp", { NULL }, 656, "tcp" }, + { "spmp", { NULL }, 656, "udp" }, + { "rmc", { NULL }, 657, "tcp" }, + { "rmc", { NULL }, 657, "udp" }, + { "tenfold", { NULL }, 658, "tcp" }, + { "tenfold", { NULL }, 658, "udp" }, + { "mac-srvr-admin", { NULL }, 660, "tcp" }, + { "mac-srvr-admin", { NULL }, 660, "udp" }, + { "hap", { NULL }, 661, "tcp" }, + { "hap", { NULL }, 661, "udp" }, + { "pftp", { NULL }, 662, "tcp" }, + { "pftp", { NULL }, 662, "udp" }, + { "purenoise", { NULL }, 663, "tcp" }, + { "purenoise", { NULL }, 663, "udp" }, + { "oob-ws-https", { NULL }, 664, "tcp" }, + { "asf-secure-rmcp", { NULL }, 664, "udp" }, + { "sun-dr", { NULL }, 665, "tcp" }, + { "sun-dr", { NULL }, 665, "udp" }, + { "mdqs", { NULL }, 666, "tcp" }, + { "mdqs", { NULL }, 666, "udp" }, + { "doom", { NULL }, 666, "tcp" }, + { "doom", { NULL }, 666, "udp" }, + { "disclose", { NULL }, 667, "tcp" }, + { "disclose", { NULL }, 667, "udp" }, + { "mecomm", { NULL }, 668, "tcp" }, + { "mecomm", { NULL }, 668, "udp" }, + { "meregister", { NULL }, 669, "tcp" }, + { "meregister", { NULL }, 669, "udp" }, + { "vacdsm-sws", { NULL }, 670, "tcp" }, + { "vacdsm-sws", { NULL }, 670, "udp" }, + { "vacdsm-app", { NULL }, 671, "tcp" }, + { "vacdsm-app", { NULL }, 671, "udp" }, + { "vpps-qua", { NULL }, 672, "tcp" }, + { "vpps-qua", { NULL }, 672, "udp" }, + { "cimplex", { NULL }, 673, "tcp" }, + { "cimplex", { NULL }, 673, "udp" }, + { "acap", { NULL }, 674, "tcp" }, + { "acap", { NULL }, 674, "udp" }, + { "dctp", { NULL }, 675, "tcp" }, + { "dctp", { NULL }, 675, "udp" }, + { "vpps-via", { NULL }, 676, "tcp" }, + { "vpps-via", { NULL }, 676, "udp" }, + { "vpp", { NULL }, 677, "tcp" }, + { "vpp", { NULL }, 677, "udp" }, + { "ggf-ncp", { NULL }, 678, "tcp" }, + { "ggf-ncp", { NULL }, 678, "udp" }, + { "mrm", { NULL }, 679, "tcp" }, + { "mrm", { NULL }, 679, "udp" }, + { "entrust-aaas", { NULL }, 680, "tcp" }, + { "entrust-aaas", { NULL }, 680, "udp" }, + { "entrust-aams", { NULL }, 681, "tcp" }, + { "entrust-aams", { NULL }, 681, "udp" }, + { "xfr", { NULL }, 682, "tcp" }, + { "xfr", { NULL }, 682, "udp" }, + { "corba-iiop", { NULL }, 683, "tcp" }, + { "corba-iiop", { NULL }, 683, "udp" }, + { "corba-iiop-ssl", { NULL }, 684, "tcp" }, + { "corba-iiop-ssl", { NULL }, 684, "udp" }, + { "mdc-portmapper", { NULL }, 685, "tcp" }, + { "mdc-portmapper", { NULL }, 685, "udp" }, + { "hcp-wismar", { NULL }, 686, "tcp" }, + { "hcp-wismar", { NULL }, 686, "udp" }, + { "asipregistry", { NULL }, 687, "tcp" }, + { "asipregistry", { NULL }, 687, "udp" }, + { "realm-rusd", { NULL }, 688, "tcp" }, + { "realm-rusd", { NULL }, 688, "udp" }, + { "nmap", { NULL }, 689, "tcp" }, + { "nmap", { NULL }, 689, "udp" }, + { "vatp", { NULL }, 690, "tcp" }, + { "vatp", { NULL }, 690, "udp" }, + { "msexch-routing", { NULL }, 691, "tcp" }, + { "msexch-routing", { NULL }, 691, "udp" }, + { "hyperwave-isp", { NULL }, 692, "tcp" }, + { "hyperwave-isp", { NULL }, 692, "udp" }, + { "connendp", { NULL }, 693, "tcp" }, + { "connendp", { NULL }, 693, "udp" }, + { "ha-cluster", { NULL }, 694, "tcp" }, + { "ha-cluster", { NULL }, 694, "udp" }, + { "ieee-mms-ssl", { NULL }, 695, "tcp" }, + { "ieee-mms-ssl", { NULL }, 695, "udp" }, + { "rushd", { NULL }, 696, "tcp" }, + { "rushd", { NULL }, 696, "udp" }, + { "uuidgen", { NULL }, 697, "tcp" }, + { "uuidgen", { NULL }, 697, "udp" }, + { "olsr", { NULL }, 698, "tcp" }, + { "olsr", { NULL }, 698, "udp" }, + { "accessnetwork", { NULL }, 699, "tcp" }, + { "accessnetwork", { NULL }, 699, "udp" }, + { "epp", { NULL }, 700, "tcp" }, + { "epp", { NULL }, 700, "udp" }, + { "lmp", { NULL }, 701, "tcp" }, + { "lmp", { NULL }, 701, "udp" }, + { "iris-beep", { NULL }, 702, "tcp" }, + { "iris-beep", { NULL }, 702, "udp" }, + { "elcsd", { NULL }, 704, "tcp" }, + { "elcsd", { NULL }, 704, "udp" }, + { "agentx", { NULL }, 705, "tcp" }, + { "agentx", { NULL }, 705, "udp" }, + { "silc", { NULL }, 706, "tcp" }, + { "silc", { NULL }, 706, "udp" }, + { "borland-dsj", { NULL }, 707, "tcp" }, + { "borland-dsj", { NULL }, 707, "udp" }, + { "entrust-kmsh", { NULL }, 709, "tcp" }, + { "entrust-kmsh", { NULL }, 709, "udp" }, + { "entrust-ash", { NULL }, 710, "tcp" }, + { "entrust-ash", { NULL }, 710, "udp" }, + { "cisco-tdp", { NULL }, 711, "tcp" }, + { "cisco-tdp", { NULL }, 711, "udp" }, + { "tbrpf", { NULL }, 712, "tcp" }, + { "tbrpf", { NULL }, 712, "udp" }, + { "iris-xpc", { NULL }, 713, "tcp" }, + { "iris-xpc", { NULL }, 713, "udp" }, + { "iris-xpcs", { NULL }, 714, "tcp" }, + { "iris-xpcs", { NULL }, 714, "udp" }, + { "iris-lwz", { NULL }, 715, "tcp" }, + { "iris-lwz", { NULL }, 715, "udp" }, + { "pana", { NULL }, 716, "udp" }, + { "netviewdm1", { NULL }, 729, "tcp" }, + { "netviewdm1", { NULL }, 729, "udp" }, + { "netviewdm2", { NULL }, 730, "tcp" }, + { "netviewdm2", { NULL }, 730, "udp" }, + { "netviewdm3", { NULL }, 731, "tcp" }, + { "netviewdm3", { NULL }, 731, "udp" }, + { "netgw", { NULL }, 741, "tcp" }, + { "netgw", { NULL }, 741, "udp" }, + { "netrcs", { NULL }, 742, "tcp" }, + { "netrcs", { NULL }, 742, "udp" }, + { "flexlm", { NULL }, 744, "tcp" }, + { "flexlm", { NULL }, 744, "udp" }, + { "fujitsu-dev", { NULL }, 747, "tcp" }, + { "fujitsu-dev", { NULL }, 747, "udp" }, + { "ris-cm", { NULL }, 748, "tcp" }, + { "ris-cm", { NULL }, 748, "udp" }, + { "kerberos-adm", { NULL }, 749, "tcp" }, + { "kerberos-adm", { NULL }, 749, "udp" }, + { "rfile", { NULL }, 750, "tcp" }, + { "loadav", { NULL }, 750, "udp" }, + { "kerberos-iv", { NULL }, 750, "udp" }, + { "pump", { NULL }, 751, "tcp" }, + { "pump", { NULL }, 751, "udp" }, + { "qrh", { NULL }, 752, "tcp" }, + { "qrh", { NULL }, 752, "udp" }, + { "rrh", { NULL }, 753, "tcp" }, + { "rrh", { NULL }, 753, "udp" }, + { "tell", { NULL }, 754, "tcp" }, + { "tell", { NULL }, 754, "udp" }, + { "nlogin", { NULL }, 758, "tcp" }, + { "nlogin", { NULL }, 758, "udp" }, + { "con", { NULL }, 759, "tcp" }, + { "con", { NULL }, 759, "udp" }, + { "ns", { NULL }, 760, "tcp" }, + { "ns", { NULL }, 760, "udp" }, + { "rxe", { NULL }, 761, "tcp" }, + { "rxe", { NULL }, 761, "udp" }, + { "quotad", { NULL }, 762, "tcp" }, + { "quotad", { NULL }, 762, "udp" }, + { "cycleserv", { NULL }, 763, "tcp" }, + { "cycleserv", { NULL }, 763, "udp" }, + { "omserv", { NULL }, 764, "tcp" }, + { "omserv", { NULL }, 764, "udp" }, + { "webster", { NULL }, 765, "tcp" }, + { "webster", { NULL }, 765, "udp" }, + { "phonebook", { NULL }, 767, "tcp" }, + { "phonebook", { NULL }, 767, "udp" }, + { "vid", { NULL }, 769, "tcp" }, + { "vid", { NULL }, 769, "udp" }, + { "cadlock", { NULL }, 770, "tcp" }, + { "cadlock", { NULL }, 770, "udp" }, + { "rtip", { NULL }, 771, "tcp" }, + { "rtip", { NULL }, 771, "udp" }, + { "cycleserv2", { NULL }, 772, "tcp" }, + { "cycleserv2", { NULL }, 772, "udp" }, + { "submit", { NULL }, 773, "tcp" }, + { "notify", { NULL }, 773, "udp" }, + { "rpasswd", { NULL }, 774, "tcp" }, + { "acmaint_dbd", { NULL }, 774, "udp" }, + { "entomb", { NULL }, 775, "tcp" }, + { "acmaint_transd", { NULL }, 775, "udp" }, + { "wpages", { NULL }, 776, "tcp" }, + { "wpages", { NULL }, 776, "udp" }, + { "multiling-http", { NULL }, 777, "tcp" }, + { "multiling-http", { NULL }, 777, "udp" }, + { "wpgs", { NULL }, 780, "tcp" }, + { "wpgs", { NULL }, 780, "udp" }, + { "mdbs_daemon", { NULL }, 800, "tcp" }, + { "mdbs_daemon", { NULL }, 800, "udp" }, + { "device", { NULL }, 801, "tcp" }, + { "device", { NULL }, 801, "udp" }, + { "fcp-udp", { NULL }, 810, "tcp" }, + { "fcp-udp", { NULL }, 810, "udp" }, + { "itm-mcell-s", { NULL }, 828, "tcp" }, + { "itm-mcell-s", { NULL }, 828, "udp" }, + { "pkix-3-ca-ra", { NULL }, 829, "tcp" }, + { "pkix-3-ca-ra", { NULL }, 829, "udp" }, + { "netconf-ssh", { NULL }, 830, "tcp" }, + { "netconf-ssh", { NULL }, 830, "udp" }, + { "netconf-beep", { NULL }, 831, "tcp" }, + { "netconf-beep", { NULL }, 831, "udp" }, + { "netconfsoaphttp", { NULL }, 832, "tcp" }, + { "netconfsoaphttp", { NULL }, 832, "udp" }, + { "netconfsoapbeep", { NULL }, 833, "tcp" }, + { "netconfsoapbeep", { NULL }, 833, "udp" }, + { "dhcp-failover2", { NULL }, 847, "tcp" }, + { "dhcp-failover2", { NULL }, 847, "udp" }, + { "gdoi", { NULL }, 848, "tcp" }, + { "gdoi", { NULL }, 848, "udp" }, + { "iscsi", { NULL }, 860, "tcp" }, + { "iscsi", { NULL }, 860, "udp" }, + { "owamp-control", { NULL }, 861, "tcp" }, + { "owamp-control", { NULL }, 861, "udp" }, + { "twamp-control", { NULL }, 862, "tcp" }, + { "twamp-control", { NULL }, 862, "udp" }, + { "rsync", { NULL }, 873, "tcp" }, + { "rsync", { NULL }, 873, "udp" }, + { "iclcnet-locate", { NULL }, 886, "tcp" }, + { "iclcnet-locate", { NULL }, 886, "udp" }, + { "iclcnet_svinfo", { NULL }, 887, "tcp" }, + { "iclcnet_svinfo", { NULL }, 887, "udp" }, + { "accessbuilder", { NULL }, 888, "tcp" }, + { "accessbuilder", { NULL }, 888, "udp" }, + { "cddbp", { NULL }, 888, "tcp" }, + { "omginitialrefs", { NULL }, 900, "tcp" }, + { "omginitialrefs", { NULL }, 900, "udp" }, + { "smpnameres", { NULL }, 901, "tcp" }, + { "smpnameres", { NULL }, 901, "udp" }, + { "ideafarm-door", { NULL }, 902, "tcp" }, + { "ideafarm-door", { NULL }, 902, "udp" }, + { "ideafarm-panic", { NULL }, 903, "tcp" }, + { "ideafarm-panic", { NULL }, 903, "udp" }, + { "kink", { NULL }, 910, "tcp" }, + { "kink", { NULL }, 910, "udp" }, + { "xact-backup", { NULL }, 911, "tcp" }, + { "xact-backup", { NULL }, 911, "udp" }, + { "apex-mesh", { NULL }, 912, "tcp" }, + { "apex-mesh", { NULL }, 912, "udp" }, + { "apex-edge", { NULL }, 913, "tcp" }, + { "apex-edge", { NULL }, 913, "udp" }, + { "ftps-data", { NULL }, 989, "tcp" }, + { "ftps-data", { NULL }, 989, "udp" }, + { "ftps", { NULL }, 990, "tcp" }, + { "ftps", { NULL }, 990, "udp" }, + { "nas", { NULL }, 991, "tcp" }, + { "nas", { NULL }, 991, "udp" }, + { "telnets", { NULL }, 992, "tcp" }, + { "telnets", { NULL }, 992, "udp" }, + { "imaps", { NULL }, 993, "tcp" }, + { "imaps", { NULL }, 993, "udp" }, + { "ircs", { NULL }, 994, "tcp" }, + { "ircs", { NULL }, 994, "udp" }, + { "pop3s", { NULL }, 995, "tcp" }, + { "pop3s", { NULL }, 995, "udp" }, + { "vsinet", { NULL }, 996, "tcp" }, + { "vsinet", { NULL }, 996, "udp" }, + { "maitrd", { NULL }, 997, "tcp" }, + { "maitrd", { NULL }, 997, "udp" }, + { "busboy", { NULL }, 998, "tcp" }, + { "puparp", { NULL }, 998, "udp" }, + { "garcon", { NULL }, 999, "tcp" }, + { "applix", { NULL }, 999, "udp" }, + { "puprouter", { NULL }, 999, "tcp" }, + { "puprouter", { NULL }, 999, "udp" }, + { "cadlock2", { NULL }, 1000, "tcp" }, + { "cadlock2", { NULL }, 1000, "udp" }, + { "surf", { NULL }, 1010, "tcp" }, + { "surf", { NULL }, 1010, "udp" }, + { "exp1", { NULL }, 1021, "tcp" }, + { "exp1", { NULL }, 1021, "udp" }, + { "exp2", { NULL }, 1022, "tcp" }, + { "exp2", { NULL }, 1022, "udp" }, +# endif /* USE_IANA_WELL_KNOWN_PORTS */ +# ifdef USE_IANA_REGISTERED_PORTS + { "blackjack", { NULL }, 1025, "tcp" }, + { "blackjack", { NULL }, 1025, "udp" }, + { "cap", { NULL }, 1026, "tcp" }, + { "cap", { NULL }, 1026, "udp" }, + { "solid-mux", { NULL }, 1029, "tcp" }, + { "solid-mux", { NULL }, 1029, "udp" }, + { "iad1", { NULL }, 1030, "tcp" }, + { "iad1", { NULL }, 1030, "udp" }, + { "iad2", { NULL }, 1031, "tcp" }, + { "iad2", { NULL }, 1031, "udp" }, + { "iad3", { NULL }, 1032, "tcp" }, + { "iad3", { NULL }, 1032, "udp" }, + { "netinfo-local", { NULL }, 1033, "tcp" }, + { "netinfo-local", { NULL }, 1033, "udp" }, + { "activesync", { NULL }, 1034, "tcp" }, + { "activesync", { NULL }, 1034, "udp" }, + { "mxxrlogin", { NULL }, 1035, "tcp" }, + { "mxxrlogin", { NULL }, 1035, "udp" }, + { "nsstp", { NULL }, 1036, "tcp" }, + { "nsstp", { NULL }, 1036, "udp" }, + { "ams", { NULL }, 1037, "tcp" }, + { "ams", { NULL }, 1037, "udp" }, + { "mtqp", { NULL }, 1038, "tcp" }, + { "mtqp", { NULL }, 1038, "udp" }, + { "sbl", { NULL }, 1039, "tcp" }, + { "sbl", { NULL }, 1039, "udp" }, + { "netarx", { NULL }, 1040, "tcp" }, + { "netarx", { NULL }, 1040, "udp" }, + { "danf-ak2", { NULL }, 1041, "tcp" }, + { "danf-ak2", { NULL }, 1041, "udp" }, + { "afrog", { NULL }, 1042, "tcp" }, + { "afrog", { NULL }, 1042, "udp" }, + { "boinc-client", { NULL }, 1043, "tcp" }, + { "boinc-client", { NULL }, 1043, "udp" }, + { "dcutility", { NULL }, 1044, "tcp" }, + { "dcutility", { NULL }, 1044, "udp" }, + { "fpitp", { NULL }, 1045, "tcp" }, + { "fpitp", { NULL }, 1045, "udp" }, + { "wfremotertm", { NULL }, 1046, "tcp" }, + { "wfremotertm", { NULL }, 1046, "udp" }, + { "neod1", { NULL }, 1047, "tcp" }, + { "neod1", { NULL }, 1047, "udp" }, + { "neod2", { NULL }, 1048, "tcp" }, + { "neod2", { NULL }, 1048, "udp" }, + { "td-postman", { NULL }, 1049, "tcp" }, + { "td-postman", { NULL }, 1049, "udp" }, + { "cma", { NULL }, 1050, "tcp" }, + { "cma", { NULL }, 1050, "udp" }, + { "optima-vnet", { NULL }, 1051, "tcp" }, + { "optima-vnet", { NULL }, 1051, "udp" }, + { "ddt", { NULL }, 1052, "tcp" }, + { "ddt", { NULL }, 1052, "udp" }, + { "remote-as", { NULL }, 1053, "tcp" }, + { "remote-as", { NULL }, 1053, "udp" }, + { "brvread", { NULL }, 1054, "tcp" }, + { "brvread", { NULL }, 1054, "udp" }, + { "ansyslmd", { NULL }, 1055, "tcp" }, + { "ansyslmd", { NULL }, 1055, "udp" }, + { "vfo", { NULL }, 1056, "tcp" }, + { "vfo", { NULL }, 1056, "udp" }, + { "startron", { NULL }, 1057, "tcp" }, + { "startron", { NULL }, 1057, "udp" }, + { "nim", { NULL }, 1058, "tcp" }, + { "nim", { NULL }, 1058, "udp" }, + { "nimreg", { NULL }, 1059, "tcp" }, + { "nimreg", { NULL }, 1059, "udp" }, + { "polestar", { NULL }, 1060, "tcp" }, + { "polestar", { NULL }, 1060, "udp" }, + { "kiosk", { NULL }, 1061, "tcp" }, + { "kiosk", { NULL }, 1061, "udp" }, + { "veracity", { NULL }, 1062, "tcp" }, + { "veracity", { NULL }, 1062, "udp" }, + { "kyoceranetdev", { NULL }, 1063, "tcp" }, + { "kyoceranetdev", { NULL }, 1063, "udp" }, + { "jstel", { NULL }, 1064, "tcp" }, + { "jstel", { NULL }, 1064, "udp" }, + { "syscomlan", { NULL }, 1065, "tcp" }, + { "syscomlan", { NULL }, 1065, "udp" }, + { "fpo-fns", { NULL }, 1066, "tcp" }, + { "fpo-fns", { NULL }, 1066, "udp" }, + { "instl_boots", { NULL }, 1067, "tcp" }, + { "instl_boots", { NULL }, 1067, "udp" }, + { "instl_bootc", { NULL }, 1068, "tcp" }, + { "instl_bootc", { NULL }, 1068, "udp" }, + { "cognex-insight", { NULL }, 1069, "tcp" }, + { "cognex-insight", { NULL }, 1069, "udp" }, + { "gmrupdateserv", { NULL }, 1070, "tcp" }, + { "gmrupdateserv", { NULL }, 1070, "udp" }, + { "bsquare-voip", { NULL }, 1071, "tcp" }, + { "bsquare-voip", { NULL }, 1071, "udp" }, + { "cardax", { NULL }, 1072, "tcp" }, + { "cardax", { NULL }, 1072, "udp" }, + { "bridgecontrol", { NULL }, 1073, "tcp" }, + { "bridgecontrol", { NULL }, 1073, "udp" }, + { "warmspotMgmt", { NULL }, 1074, "tcp" }, + { "warmspotMgmt", { NULL }, 1074, "udp" }, + { "rdrmshc", { NULL }, 1075, "tcp" }, + { "rdrmshc", { NULL }, 1075, "udp" }, + { "dab-sti-c", { NULL }, 1076, "tcp" }, + { "dab-sti-c", { NULL }, 1076, "udp" }, + { "imgames", { NULL }, 1077, "tcp" }, + { "imgames", { NULL }, 1077, "udp" }, + { "avocent-proxy", { NULL }, 1078, "tcp" }, + { "avocent-proxy", { NULL }, 1078, "udp" }, + { "asprovatalk", { NULL }, 1079, "tcp" }, + { "asprovatalk", { NULL }, 1079, "udp" }, + { "socks", { NULL }, 1080, "tcp" }, + { "socks", { NULL }, 1080, "udp" }, + { "pvuniwien", { NULL }, 1081, "tcp" }, + { "pvuniwien", { NULL }, 1081, "udp" }, + { "amt-esd-prot", { NULL }, 1082, "tcp" }, + { "amt-esd-prot", { NULL }, 1082, "udp" }, + { "ansoft-lm-1", { NULL }, 1083, "tcp" }, + { "ansoft-lm-1", { NULL }, 1083, "udp" }, + { "ansoft-lm-2", { NULL }, 1084, "tcp" }, + { "ansoft-lm-2", { NULL }, 1084, "udp" }, + { "webobjects", { NULL }, 1085, "tcp" }, + { "webobjects", { NULL }, 1085, "udp" }, + { "cplscrambler-lg", { NULL }, 1086, "tcp" }, + { "cplscrambler-lg", { NULL }, 1086, "udp" }, + { "cplscrambler-in", { NULL }, 1087, "tcp" }, + { "cplscrambler-in", { NULL }, 1087, "udp" }, + { "cplscrambler-al", { NULL }, 1088, "tcp" }, + { "cplscrambler-al", { NULL }, 1088, "udp" }, + { "ff-annunc", { NULL }, 1089, "tcp" }, + { "ff-annunc", { NULL }, 1089, "udp" }, + { "ff-fms", { NULL }, 1090, "tcp" }, + { "ff-fms", { NULL }, 1090, "udp" }, + { "ff-sm", { NULL }, 1091, "tcp" }, + { "ff-sm", { NULL }, 1091, "udp" }, + { "obrpd", { NULL }, 1092, "tcp" }, + { "obrpd", { NULL }, 1092, "udp" }, + { "proofd", { NULL }, 1093, "tcp" }, + { "proofd", { NULL }, 1093, "udp" }, + { "rootd", { NULL }, 1094, "tcp" }, + { "rootd", { NULL }, 1094, "udp" }, + { "nicelink", { NULL }, 1095, "tcp" }, + { "nicelink", { NULL }, 1095, "udp" }, + { "cnrprotocol", { NULL }, 1096, "tcp" }, + { "cnrprotocol", { NULL }, 1096, "udp" }, + { "sunclustermgr", { NULL }, 1097, "tcp" }, + { "sunclustermgr", { NULL }, 1097, "udp" }, + { "rmiactivation", { NULL }, 1098, "tcp" }, + { "rmiactivation", { NULL }, 1098, "udp" }, + { "rmiregistry", { NULL }, 1099, "tcp" }, + { "rmiregistry", { NULL }, 1099, "udp" }, + { "mctp", { NULL }, 1100, "tcp" }, + { "mctp", { NULL }, 1100, "udp" }, + { "pt2-discover", { NULL }, 1101, "tcp" }, + { "pt2-discover", { NULL }, 1101, "udp" }, + { "adobeserver-1", { NULL }, 1102, "tcp" }, + { "adobeserver-1", { NULL }, 1102, "udp" }, + { "adobeserver-2", { NULL }, 1103, "tcp" }, + { "adobeserver-2", { NULL }, 1103, "udp" }, + { "xrl", { NULL }, 1104, "tcp" }, + { "xrl", { NULL }, 1104, "udp" }, + { "ftranhc", { NULL }, 1105, "tcp" }, + { "ftranhc", { NULL }, 1105, "udp" }, + { "isoipsigport-1", { NULL }, 1106, "tcp" }, + { "isoipsigport-1", { NULL }, 1106, "udp" }, + { "isoipsigport-2", { NULL }, 1107, "tcp" }, + { "isoipsigport-2", { NULL }, 1107, "udp" }, + { "ratio-adp", { NULL }, 1108, "tcp" }, + { "ratio-adp", { NULL }, 1108, "udp" }, + { "webadmstart", { NULL }, 1110, "tcp" }, + { "nfsd-keepalive", { NULL }, 1110, "udp" }, + { "lmsocialserver", { NULL }, 1111, "tcp" }, + { "lmsocialserver", { NULL }, 1111, "udp" }, + { "icp", { NULL }, 1112, "tcp" }, + { "icp", { NULL }, 1112, "udp" }, + { "ltp-deepspace", { NULL }, 1113, "tcp" }, + { "ltp-deepspace", { NULL }, 1113, "udp" }, + { "mini-sql", { NULL }, 1114, "tcp" }, + { "mini-sql", { NULL }, 1114, "udp" }, + { "ardus-trns", { NULL }, 1115, "tcp" }, + { "ardus-trns", { NULL }, 1115, "udp" }, + { "ardus-cntl", { NULL }, 1116, "tcp" }, + { "ardus-cntl", { NULL }, 1116, "udp" }, + { "ardus-mtrns", { NULL }, 1117, "tcp" }, + { "ardus-mtrns", { NULL }, 1117, "udp" }, + { "sacred", { NULL }, 1118, "tcp" }, + { "sacred", { NULL }, 1118, "udp" }, + { "bnetgame", { NULL }, 1119, "tcp" }, + { "bnetgame", { NULL }, 1119, "udp" }, + { "bnetfile", { NULL }, 1120, "tcp" }, + { "bnetfile", { NULL }, 1120, "udp" }, + { "rmpp", { NULL }, 1121, "tcp" }, + { "rmpp", { NULL }, 1121, "udp" }, + { "availant-mgr", { NULL }, 1122, "tcp" }, + { "availant-mgr", { NULL }, 1122, "udp" }, + { "murray", { NULL }, 1123, "tcp" }, + { "murray", { NULL }, 1123, "udp" }, + { "hpvmmcontrol", { NULL }, 1124, "tcp" }, + { "hpvmmcontrol", { NULL }, 1124, "udp" }, + { "hpvmmagent", { NULL }, 1125, "tcp" }, + { "hpvmmagent", { NULL }, 1125, "udp" }, + { "hpvmmdata", { NULL }, 1126, "tcp" }, + { "hpvmmdata", { NULL }, 1126, "udp" }, + { "kwdb-commn", { NULL }, 1127, "tcp" }, + { "kwdb-commn", { NULL }, 1127, "udp" }, + { "saphostctrl", { NULL }, 1128, "tcp" }, + { "saphostctrl", { NULL }, 1128, "udp" }, + { "saphostctrls", { NULL }, 1129, "tcp" }, + { "saphostctrls", { NULL }, 1129, "udp" }, + { "casp", { NULL }, 1130, "tcp" }, + { "casp", { NULL }, 1130, "udp" }, + { "caspssl", { NULL }, 1131, "tcp" }, + { "caspssl", { NULL }, 1131, "udp" }, + { "kvm-via-ip", { NULL }, 1132, "tcp" }, + { "kvm-via-ip", { NULL }, 1132, "udp" }, + { "dfn", { NULL }, 1133, "tcp" }, + { "dfn", { NULL }, 1133, "udp" }, + { "aplx", { NULL }, 1134, "tcp" }, + { "aplx", { NULL }, 1134, "udp" }, + { "omnivision", { NULL }, 1135, "tcp" }, + { "omnivision", { NULL }, 1135, "udp" }, + { "hhb-gateway", { NULL }, 1136, "tcp" }, + { "hhb-gateway", { NULL }, 1136, "udp" }, + { "trim", { NULL }, 1137, "tcp" }, + { "trim", { NULL }, 1137, "udp" }, + { "encrypted_admin", { NULL }, 1138, "tcp" }, + { "encrypted_admin", { NULL }, 1138, "udp" }, + { "evm", { NULL }, 1139, "tcp" }, + { "evm", { NULL }, 1139, "udp" }, + { "autonoc", { NULL }, 1140, "tcp" }, + { "autonoc", { NULL }, 1140, "udp" }, + { "mxomss", { NULL }, 1141, "tcp" }, + { "mxomss", { NULL }, 1141, "udp" }, + { "edtools", { NULL }, 1142, "tcp" }, + { "edtools", { NULL }, 1142, "udp" }, + { "imyx", { NULL }, 1143, "tcp" }, + { "imyx", { NULL }, 1143, "udp" }, + { "fuscript", { NULL }, 1144, "tcp" }, + { "fuscript", { NULL }, 1144, "udp" }, + { "x9-icue", { NULL }, 1145, "tcp" }, + { "x9-icue", { NULL }, 1145, "udp" }, + { "audit-transfer", { NULL }, 1146, "tcp" }, + { "audit-transfer", { NULL }, 1146, "udp" }, + { "capioverlan", { NULL }, 1147, "tcp" }, + { "capioverlan", { NULL }, 1147, "udp" }, + { "elfiq-repl", { NULL }, 1148, "tcp" }, + { "elfiq-repl", { NULL }, 1148, "udp" }, + { "bvtsonar", { NULL }, 1149, "tcp" }, + { "bvtsonar", { NULL }, 1149, "udp" }, + { "blaze", { NULL }, 1150, "tcp" }, + { "blaze", { NULL }, 1150, "udp" }, + { "unizensus", { NULL }, 1151, "tcp" }, + { "unizensus", { NULL }, 1151, "udp" }, + { "winpoplanmess", { NULL }, 1152, "tcp" }, + { "winpoplanmess", { NULL }, 1152, "udp" }, + { "c1222-acse", { NULL }, 1153, "tcp" }, + { "c1222-acse", { NULL }, 1153, "udp" }, + { "resacommunity", { NULL }, 1154, "tcp" }, + { "resacommunity", { NULL }, 1154, "udp" }, + { "nfa", { NULL }, 1155, "tcp" }, + { "nfa", { NULL }, 1155, "udp" }, + { "iascontrol-oms", { NULL }, 1156, "tcp" }, + { "iascontrol-oms", { NULL }, 1156, "udp" }, + { "iascontrol", { NULL }, 1157, "tcp" }, + { "iascontrol", { NULL }, 1157, "udp" }, + { "dbcontrol-oms", { NULL }, 1158, "tcp" }, + { "dbcontrol-oms", { NULL }, 1158, "udp" }, + { "oracle-oms", { NULL }, 1159, "tcp" }, + { "oracle-oms", { NULL }, 1159, "udp" }, + { "olsv", { NULL }, 1160, "tcp" }, + { "olsv", { NULL }, 1160, "udp" }, + { "health-polling", { NULL }, 1161, "tcp" }, + { "health-polling", { NULL }, 1161, "udp" }, + { "health-trap", { NULL }, 1162, "tcp" }, + { "health-trap", { NULL }, 1162, "udp" }, + { "sddp", { NULL }, 1163, "tcp" }, + { "sddp", { NULL }, 1163, "udp" }, + { "qsm-proxy", { NULL }, 1164, "tcp" }, + { "qsm-proxy", { NULL }, 1164, "udp" }, + { "qsm-gui", { NULL }, 1165, "tcp" }, + { "qsm-gui", { NULL }, 1165, "udp" }, + { "qsm-remote", { NULL }, 1166, "tcp" }, + { "qsm-remote", { NULL }, 1166, "udp" }, + { "cisco-ipsla", { NULL }, 1167, "tcp" }, + { "cisco-ipsla", { NULL }, 1167, "udp" }, + { "cisco-ipsla", { NULL }, 1167, "sctp"}, + { "vchat", { NULL }, 1168, "tcp" }, + { "vchat", { NULL }, 1168, "udp" }, + { "tripwire", { NULL }, 1169, "tcp" }, + { "tripwire", { NULL }, 1169, "udp" }, + { "atc-lm", { NULL }, 1170, "tcp" }, + { "atc-lm", { NULL }, 1170, "udp" }, + { "atc-appserver", { NULL }, 1171, "tcp" }, + { "atc-appserver", { NULL }, 1171, "udp" }, + { "dnap", { NULL }, 1172, "tcp" }, + { "dnap", { NULL }, 1172, "udp" }, + { "d-cinema-rrp", { NULL }, 1173, "tcp" }, + { "d-cinema-rrp", { NULL }, 1173, "udp" }, + { "fnet-remote-ui", { NULL }, 1174, "tcp" }, + { "fnet-remote-ui", { NULL }, 1174, "udp" }, + { "dossier", { NULL }, 1175, "tcp" }, + { "dossier", { NULL }, 1175, "udp" }, + { "indigo-server", { NULL }, 1176, "tcp" }, + { "indigo-server", { NULL }, 1176, "udp" }, + { "dkmessenger", { NULL }, 1177, "tcp" }, + { "dkmessenger", { NULL }, 1177, "udp" }, + { "sgi-storman", { NULL }, 1178, "tcp" }, + { "sgi-storman", { NULL }, 1178, "udp" }, + { "b2n", { NULL }, 1179, "tcp" }, + { "b2n", { NULL }, 1179, "udp" }, + { "mc-client", { NULL }, 1180, "tcp" }, + { "mc-client", { NULL }, 1180, "udp" }, + { "3comnetman", { NULL }, 1181, "tcp" }, + { "3comnetman", { NULL }, 1181, "udp" }, + { "accelenet", { NULL }, 1182, "tcp" }, + { "accelenet-data", { NULL }, 1182, "udp" }, + { "llsurfup-http", { NULL }, 1183, "tcp" }, + { "llsurfup-http", { NULL }, 1183, "udp" }, + { "llsurfup-https", { NULL }, 1184, "tcp" }, + { "llsurfup-https", { NULL }, 1184, "udp" }, + { "catchpole", { NULL }, 1185, "tcp" }, + { "catchpole", { NULL }, 1185, "udp" }, + { "mysql-cluster", { NULL }, 1186, "tcp" }, + { "mysql-cluster", { NULL }, 1186, "udp" }, + { "alias", { NULL }, 1187, "tcp" }, + { "alias", { NULL }, 1187, "udp" }, + { "hp-webadmin", { NULL }, 1188, "tcp" }, + { "hp-webadmin", { NULL }, 1188, "udp" }, + { "unet", { NULL }, 1189, "tcp" }, + { "unet", { NULL }, 1189, "udp" }, + { "commlinx-avl", { NULL }, 1190, "tcp" }, + { "commlinx-avl", { NULL }, 1190, "udp" }, + { "gpfs", { NULL }, 1191, "tcp" }, + { "gpfs", { NULL }, 1191, "udp" }, + { "caids-sensor", { NULL }, 1192, "tcp" }, + { "caids-sensor", { NULL }, 1192, "udp" }, + { "fiveacross", { NULL }, 1193, "tcp" }, + { "fiveacross", { NULL }, 1193, "udp" }, + { "openvpn", { NULL }, 1194, "tcp" }, + { "openvpn", { NULL }, 1194, "udp" }, + { "rsf-1", { NULL }, 1195, "tcp" }, + { "rsf-1", { NULL }, 1195, "udp" }, + { "netmagic", { NULL }, 1196, "tcp" }, + { "netmagic", { NULL }, 1196, "udp" }, + { "carrius-rshell", { NULL }, 1197, "tcp" }, + { "carrius-rshell", { NULL }, 1197, "udp" }, + { "cajo-discovery", { NULL }, 1198, "tcp" }, + { "cajo-discovery", { NULL }, 1198, "udp" }, + { "dmidi", { NULL }, 1199, "tcp" }, + { "dmidi", { NULL }, 1199, "udp" }, + { "scol", { NULL }, 1200, "tcp" }, + { "scol", { NULL }, 1200, "udp" }, + { "nucleus-sand", { NULL }, 1201, "tcp" }, + { "nucleus-sand", { NULL }, 1201, "udp" }, + { "caiccipc", { NULL }, 1202, "tcp" }, + { "caiccipc", { NULL }, 1202, "udp" }, + { "ssslic-mgr", { NULL }, 1203, "tcp" }, + { "ssslic-mgr", { NULL }, 1203, "udp" }, + { "ssslog-mgr", { NULL }, 1204, "tcp" }, + { "ssslog-mgr", { NULL }, 1204, "udp" }, + { "accord-mgc", { NULL }, 1205, "tcp" }, + { "accord-mgc", { NULL }, 1205, "udp" }, + { "anthony-data", { NULL }, 1206, "tcp" }, + { "anthony-data", { NULL }, 1206, "udp" }, + { "metasage", { NULL }, 1207, "tcp" }, + { "metasage", { NULL }, 1207, "udp" }, + { "seagull-ais", { NULL }, 1208, "tcp" }, + { "seagull-ais", { NULL }, 1208, "udp" }, + { "ipcd3", { NULL }, 1209, "tcp" }, + { "ipcd3", { NULL }, 1209, "udp" }, + { "eoss", { NULL }, 1210, "tcp" }, + { "eoss", { NULL }, 1210, "udp" }, + { "groove-dpp", { NULL }, 1211, "tcp" }, + { "groove-dpp", { NULL }, 1211, "udp" }, + { "lupa", { NULL }, 1212, "tcp" }, + { "lupa", { NULL }, 1212, "udp" }, + { "mpc-lifenet", { NULL }, 1213, "tcp" }, + { "mpc-lifenet", { NULL }, 1213, "udp" }, + { "kazaa", { NULL }, 1214, "tcp" }, + { "kazaa", { NULL }, 1214, "udp" }, + { "scanstat-1", { NULL }, 1215, "tcp" }, + { "scanstat-1", { NULL }, 1215, "udp" }, + { "etebac5", { NULL }, 1216, "tcp" }, + { "etebac5", { NULL }, 1216, "udp" }, + { "hpss-ndapi", { NULL }, 1217, "tcp" }, + { "hpss-ndapi", { NULL }, 1217, "udp" }, + { "aeroflight-ads", { NULL }, 1218, "tcp" }, + { "aeroflight-ads", { NULL }, 1218, "udp" }, + { "aeroflight-ret", { NULL }, 1219, "tcp" }, + { "aeroflight-ret", { NULL }, 1219, "udp" }, + { "qt-serveradmin", { NULL }, 1220, "tcp" }, + { "qt-serveradmin", { NULL }, 1220, "udp" }, + { "sweetware-apps", { NULL }, 1221, "tcp" }, + { "sweetware-apps", { NULL }, 1221, "udp" }, + { "nerv", { NULL }, 1222, "tcp" }, + { "nerv", { NULL }, 1222, "udp" }, + { "tgp", { NULL }, 1223, "tcp" }, + { "tgp", { NULL }, 1223, "udp" }, + { "vpnz", { NULL }, 1224, "tcp" }, + { "vpnz", { NULL }, 1224, "udp" }, + { "slinkysearch", { NULL }, 1225, "tcp" }, + { "slinkysearch", { NULL }, 1225, "udp" }, + { "stgxfws", { NULL }, 1226, "tcp" }, + { "stgxfws", { NULL }, 1226, "udp" }, + { "dns2go", { NULL }, 1227, "tcp" }, + { "dns2go", { NULL }, 1227, "udp" }, + { "florence", { NULL }, 1228, "tcp" }, + { "florence", { NULL }, 1228, "udp" }, + { "zented", { NULL }, 1229, "tcp" }, + { "zented", { NULL }, 1229, "udp" }, + { "periscope", { NULL }, 1230, "tcp" }, + { "periscope", { NULL }, 1230, "udp" }, + { "menandmice-lpm", { NULL }, 1231, "tcp" }, + { "menandmice-lpm", { NULL }, 1231, "udp" }, + { "univ-appserver", { NULL }, 1233, "tcp" }, + { "univ-appserver", { NULL }, 1233, "udp" }, + { "search-agent", { NULL }, 1234, "tcp" }, + { "search-agent", { NULL }, 1234, "udp" }, + { "mosaicsyssvc1", { NULL }, 1235, "tcp" }, + { "mosaicsyssvc1", { NULL }, 1235, "udp" }, + { "bvcontrol", { NULL }, 1236, "tcp" }, + { "bvcontrol", { NULL }, 1236, "udp" }, + { "tsdos390", { NULL }, 1237, "tcp" }, + { "tsdos390", { NULL }, 1237, "udp" }, + { "hacl-qs", { NULL }, 1238, "tcp" }, + { "hacl-qs", { NULL }, 1238, "udp" }, + { "nmsd", { NULL }, 1239, "tcp" }, + { "nmsd", { NULL }, 1239, "udp" }, + { "instantia", { NULL }, 1240, "tcp" }, + { "instantia", { NULL }, 1240, "udp" }, + { "nessus", { NULL }, 1241, "tcp" }, + { "nessus", { NULL }, 1241, "udp" }, + { "nmasoverip", { NULL }, 1242, "tcp" }, + { "nmasoverip", { NULL }, 1242, "udp" }, + { "serialgateway", { NULL }, 1243, "tcp" }, + { "serialgateway", { NULL }, 1243, "udp" }, + { "isbconference1", { NULL }, 1244, "tcp" }, + { "isbconference1", { NULL }, 1244, "udp" }, + { "isbconference2", { NULL }, 1245, "tcp" }, + { "isbconference2", { NULL }, 1245, "udp" }, + { "payrouter", { NULL }, 1246, "tcp" }, + { "payrouter", { NULL }, 1246, "udp" }, + { "visionpyramid", { NULL }, 1247, "tcp" }, + { "visionpyramid", { NULL }, 1247, "udp" }, + { "hermes", { NULL }, 1248, "tcp" }, + { "hermes", { NULL }, 1248, "udp" }, + { "mesavistaco", { NULL }, 1249, "tcp" }, + { "mesavistaco", { NULL }, 1249, "udp" }, + { "swldy-sias", { NULL }, 1250, "tcp" }, + { "swldy-sias", { NULL }, 1250, "udp" }, + { "servergraph", { NULL }, 1251, "tcp" }, + { "servergraph", { NULL }, 1251, "udp" }, + { "bspne-pcc", { NULL }, 1252, "tcp" }, + { "bspne-pcc", { NULL }, 1252, "udp" }, + { "q55-pcc", { NULL }, 1253, "tcp" }, + { "q55-pcc", { NULL }, 1253, "udp" }, + { "de-noc", { NULL }, 1254, "tcp" }, + { "de-noc", { NULL }, 1254, "udp" }, + { "de-cache-query", { NULL }, 1255, "tcp" }, + { "de-cache-query", { NULL }, 1255, "udp" }, + { "de-server", { NULL }, 1256, "tcp" }, + { "de-server", { NULL }, 1256, "udp" }, + { "shockwave2", { NULL }, 1257, "tcp" }, + { "shockwave2", { NULL }, 1257, "udp" }, + { "opennl", { NULL }, 1258, "tcp" }, + { "opennl", { NULL }, 1258, "udp" }, + { "opennl-voice", { NULL }, 1259, "tcp" }, + { "opennl-voice", { NULL }, 1259, "udp" }, + { "ibm-ssd", { NULL }, 1260, "tcp" }, + { "ibm-ssd", { NULL }, 1260, "udp" }, + { "mpshrsv", { NULL }, 1261, "tcp" }, + { "mpshrsv", { NULL }, 1261, "udp" }, + { "qnts-orb", { NULL }, 1262, "tcp" }, + { "qnts-orb", { NULL }, 1262, "udp" }, + { "dka", { NULL }, 1263, "tcp" }, + { "dka", { NULL }, 1263, "udp" }, + { "prat", { NULL }, 1264, "tcp" }, + { "prat", { NULL }, 1264, "udp" }, + { "dssiapi", { NULL }, 1265, "tcp" }, + { "dssiapi", { NULL }, 1265, "udp" }, + { "dellpwrappks", { NULL }, 1266, "tcp" }, + { "dellpwrappks", { NULL }, 1266, "udp" }, + { "epc", { NULL }, 1267, "tcp" }, + { "epc", { NULL }, 1267, "udp" }, + { "propel-msgsys", { NULL }, 1268, "tcp" }, + { "propel-msgsys", { NULL }, 1268, "udp" }, + { "watilapp", { NULL }, 1269, "tcp" }, + { "watilapp", { NULL }, 1269, "udp" }, + { "opsmgr", { NULL }, 1270, "tcp" }, + { "opsmgr", { NULL }, 1270, "udp" }, + { "excw", { NULL }, 1271, "tcp" }, + { "excw", { NULL }, 1271, "udp" }, + { "cspmlockmgr", { NULL }, 1272, "tcp" }, + { "cspmlockmgr", { NULL }, 1272, "udp" }, + { "emc-gateway", { NULL }, 1273, "tcp" }, + { "emc-gateway", { NULL }, 1273, "udp" }, + { "t1distproc", { NULL }, 1274, "tcp" }, + { "t1distproc", { NULL }, 1274, "udp" }, + { "ivcollector", { NULL }, 1275, "tcp" }, + { "ivcollector", { NULL }, 1275, "udp" }, + { "ivmanager", { NULL }, 1276, "tcp" }, + { "ivmanager", { NULL }, 1276, "udp" }, + { "miva-mqs", { NULL }, 1277, "tcp" }, + { "miva-mqs", { NULL }, 1277, "udp" }, + { "dellwebadmin-1", { NULL }, 1278, "tcp" }, + { "dellwebadmin-1", { NULL }, 1278, "udp" }, + { "dellwebadmin-2", { NULL }, 1279, "tcp" }, + { "dellwebadmin-2", { NULL }, 1279, "udp" }, + { "pictrography", { NULL }, 1280, "tcp" }, + { "pictrography", { NULL }, 1280, "udp" }, + { "healthd", { NULL }, 1281, "tcp" }, + { "healthd", { NULL }, 1281, "udp" }, + { "emperion", { NULL }, 1282, "tcp" }, + { "emperion", { NULL }, 1282, "udp" }, + { "productinfo", { NULL }, 1283, "tcp" }, + { "productinfo", { NULL }, 1283, "udp" }, + { "iee-qfx", { NULL }, 1284, "tcp" }, + { "iee-qfx", { NULL }, 1284, "udp" }, + { "neoiface", { NULL }, 1285, "tcp" }, + { "neoiface", { NULL }, 1285, "udp" }, + { "netuitive", { NULL }, 1286, "tcp" }, + { "netuitive", { NULL }, 1286, "udp" }, + { "routematch", { NULL }, 1287, "tcp" }, + { "routematch", { NULL }, 1287, "udp" }, + { "navbuddy", { NULL }, 1288, "tcp" }, + { "navbuddy", { NULL }, 1288, "udp" }, + { "jwalkserver", { NULL }, 1289, "tcp" }, + { "jwalkserver", { NULL }, 1289, "udp" }, + { "winjaserver", { NULL }, 1290, "tcp" }, + { "winjaserver", { NULL }, 1290, "udp" }, + { "seagulllms", { NULL }, 1291, "tcp" }, + { "seagulllms", { NULL }, 1291, "udp" }, + { "dsdn", { NULL }, 1292, "tcp" }, + { "dsdn", { NULL }, 1292, "udp" }, + { "pkt-krb-ipsec", { NULL }, 1293, "tcp" }, + { "pkt-krb-ipsec", { NULL }, 1293, "udp" }, + { "cmmdriver", { NULL }, 1294, "tcp" }, + { "cmmdriver", { NULL }, 1294, "udp" }, + { "ehtp", { NULL }, 1295, "tcp" }, + { "ehtp", { NULL }, 1295, "udp" }, + { "dproxy", { NULL }, 1296, "tcp" }, + { "dproxy", { NULL }, 1296, "udp" }, + { "sdproxy", { NULL }, 1297, "tcp" }, + { "sdproxy", { NULL }, 1297, "udp" }, + { "lpcp", { NULL }, 1298, "tcp" }, + { "lpcp", { NULL }, 1298, "udp" }, + { "hp-sci", { NULL }, 1299, "tcp" }, + { "hp-sci", { NULL }, 1299, "udp" }, + { "h323hostcallsc", { NULL }, 1300, "tcp" }, + { "h323hostcallsc", { NULL }, 1300, "udp" }, + { "ci3-software-1", { NULL }, 1301, "tcp" }, + { "ci3-software-1", { NULL }, 1301, "udp" }, + { "ci3-software-2", { NULL }, 1302, "tcp" }, + { "ci3-software-2", { NULL }, 1302, "udp" }, + { "sftsrv", { NULL }, 1303, "tcp" }, + { "sftsrv", { NULL }, 1303, "udp" }, + { "boomerang", { NULL }, 1304, "tcp" }, + { "boomerang", { NULL }, 1304, "udp" }, + { "pe-mike", { NULL }, 1305, "tcp" }, + { "pe-mike", { NULL }, 1305, "udp" }, + { "re-conn-proto", { NULL }, 1306, "tcp" }, + { "re-conn-proto", { NULL }, 1306, "udp" }, + { "pacmand", { NULL }, 1307, "tcp" }, + { "pacmand", { NULL }, 1307, "udp" }, + { "odsi", { NULL }, 1308, "tcp" }, + { "odsi", { NULL }, 1308, "udp" }, + { "jtag-server", { NULL }, 1309, "tcp" }, + { "jtag-server", { NULL }, 1309, "udp" }, + { "husky", { NULL }, 1310, "tcp" }, + { "husky", { NULL }, 1310, "udp" }, + { "rxmon", { NULL }, 1311, "tcp" }, + { "rxmon", { NULL }, 1311, "udp" }, + { "sti-envision", { NULL }, 1312, "tcp" }, + { "sti-envision", { NULL }, 1312, "udp" }, + { "bmc_patroldb", { NULL }, 1313, "tcp" }, + { "bmc_patroldb", { NULL }, 1313, "udp" }, + { "pdps", { NULL }, 1314, "tcp" }, + { "pdps", { NULL }, 1314, "udp" }, + { "els", { NULL }, 1315, "tcp" }, + { "els", { NULL }, 1315, "udp" }, + { "exbit-escp", { NULL }, 1316, "tcp" }, + { "exbit-escp", { NULL }, 1316, "udp" }, + { "vrts-ipcserver", { NULL }, 1317, "tcp" }, + { "vrts-ipcserver", { NULL }, 1317, "udp" }, + { "krb5gatekeeper", { NULL }, 1318, "tcp" }, + { "krb5gatekeeper", { NULL }, 1318, "udp" }, + { "amx-icsp", { NULL }, 1319, "tcp" }, + { "amx-icsp", { NULL }, 1319, "udp" }, + { "amx-axbnet", { NULL }, 1320, "tcp" }, + { "amx-axbnet", { NULL }, 1320, "udp" }, + { "pip", { NULL }, 1321, "tcp" }, + { "pip", { NULL }, 1321, "udp" }, + { "novation", { NULL }, 1322, "tcp" }, + { "novation", { NULL }, 1322, "udp" }, + { "brcd", { NULL }, 1323, "tcp" }, + { "brcd", { NULL }, 1323, "udp" }, + { "delta-mcp", { NULL }, 1324, "tcp" }, + { "delta-mcp", { NULL }, 1324, "udp" }, + { "dx-instrument", { NULL }, 1325, "tcp" }, + { "dx-instrument", { NULL }, 1325, "udp" }, + { "wimsic", { NULL }, 1326, "tcp" }, + { "wimsic", { NULL }, 1326, "udp" }, + { "ultrex", { NULL }, 1327, "tcp" }, + { "ultrex", { NULL }, 1327, "udp" }, + { "ewall", { NULL }, 1328, "tcp" }, + { "ewall", { NULL }, 1328, "udp" }, + { "netdb-export", { NULL }, 1329, "tcp" }, + { "netdb-export", { NULL }, 1329, "udp" }, + { "streetperfect", { NULL }, 1330, "tcp" }, + { "streetperfect", { NULL }, 1330, "udp" }, + { "intersan", { NULL }, 1331, "tcp" }, + { "intersan", { NULL }, 1331, "udp" }, + { "pcia-rxp-b", { NULL }, 1332, "tcp" }, + { "pcia-rxp-b", { NULL }, 1332, "udp" }, + { "passwrd-policy", { NULL }, 1333, "tcp" }, + { "passwrd-policy", { NULL }, 1333, "udp" }, + { "writesrv", { NULL }, 1334, "tcp" }, + { "writesrv", { NULL }, 1334, "udp" }, + { "digital-notary", { NULL }, 1335, "tcp" }, + { "digital-notary", { NULL }, 1335, "udp" }, + { "ischat", { NULL }, 1336, "tcp" }, + { "ischat", { NULL }, 1336, "udp" }, + { "menandmice-dns", { NULL }, 1337, "tcp" }, + { "menandmice-dns", { NULL }, 1337, "udp" }, + { "wmc-log-svc", { NULL }, 1338, "tcp" }, + { "wmc-log-svc", { NULL }, 1338, "udp" }, + { "kjtsiteserver", { NULL }, 1339, "tcp" }, + { "kjtsiteserver", { NULL }, 1339, "udp" }, + { "naap", { NULL }, 1340, "tcp" }, + { "naap", { NULL }, 1340, "udp" }, + { "qubes", { NULL }, 1341, "tcp" }, + { "qubes", { NULL }, 1341, "udp" }, + { "esbroker", { NULL }, 1342, "tcp" }, + { "esbroker", { NULL }, 1342, "udp" }, + { "re101", { NULL }, 1343, "tcp" }, + { "re101", { NULL }, 1343, "udp" }, + { "icap", { NULL }, 1344, "tcp" }, + { "icap", { NULL }, 1344, "udp" }, + { "vpjp", { NULL }, 1345, "tcp" }, + { "vpjp", { NULL }, 1345, "udp" }, + { "alta-ana-lm", { NULL }, 1346, "tcp" }, + { "alta-ana-lm", { NULL }, 1346, "udp" }, + { "bbn-mmc", { NULL }, 1347, "tcp" }, + { "bbn-mmc", { NULL }, 1347, "udp" }, + { "bbn-mmx", { NULL }, 1348, "tcp" }, + { "bbn-mmx", { NULL }, 1348, "udp" }, + { "sbook", { NULL }, 1349, "tcp" }, + { "sbook", { NULL }, 1349, "udp" }, + { "editbench", { NULL }, 1350, "tcp" }, + { "editbench", { NULL }, 1350, "udp" }, + { "equationbuilder", { NULL }, 1351, "tcp" }, + { "equationbuilder", { NULL }, 1351, "udp" }, + { "lotusnote", { NULL }, 1352, "tcp" }, + { "lotusnote", { NULL }, 1352, "udp" }, + { "relief", { NULL }, 1353, "tcp" }, + { "relief", { NULL }, 1353, "udp" }, + { "XSIP-network", { NULL }, 1354, "tcp" }, + { "XSIP-network", { NULL }, 1354, "udp" }, + { "intuitive-edge", { NULL }, 1355, "tcp" }, + { "intuitive-edge", { NULL }, 1355, "udp" }, + { "cuillamartin", { NULL }, 1356, "tcp" }, + { "cuillamartin", { NULL }, 1356, "udp" }, + { "pegboard", { NULL }, 1357, "tcp" }, + { "pegboard", { NULL }, 1357, "udp" }, + { "connlcli", { NULL }, 1358, "tcp" }, + { "connlcli", { NULL }, 1358, "udp" }, + { "ftsrv", { NULL }, 1359, "tcp" }, + { "ftsrv", { NULL }, 1359, "udp" }, + { "mimer", { NULL }, 1360, "tcp" }, + { "mimer", { NULL }, 1360, "udp" }, + { "linx", { NULL }, 1361, "tcp" }, + { "linx", { NULL }, 1361, "udp" }, + { "timeflies", { NULL }, 1362, "tcp" }, + { "timeflies", { NULL }, 1362, "udp" }, + { "ndm-requester", { NULL }, 1363, "tcp" }, + { "ndm-requester", { NULL }, 1363, "udp" }, + { "ndm-server", { NULL }, 1364, "tcp" }, + { "ndm-server", { NULL }, 1364, "udp" }, + { "adapt-sna", { NULL }, 1365, "tcp" }, + { "adapt-sna", { NULL }, 1365, "udp" }, + { "netware-csp", { NULL }, 1366, "tcp" }, + { "netware-csp", { NULL }, 1366, "udp" }, + { "dcs", { NULL }, 1367, "tcp" }, + { "dcs", { NULL }, 1367, "udp" }, + { "screencast", { NULL }, 1368, "tcp" }, + { "screencast", { NULL }, 1368, "udp" }, + { "gv-us", { NULL }, 1369, "tcp" }, + { "gv-us", { NULL }, 1369, "udp" }, + { "us-gv", { NULL }, 1370, "tcp" }, + { "us-gv", { NULL }, 1370, "udp" }, + { "fc-cli", { NULL }, 1371, "tcp" }, + { "fc-cli", { NULL }, 1371, "udp" }, + { "fc-ser", { NULL }, 1372, "tcp" }, + { "fc-ser", { NULL }, 1372, "udp" }, + { "chromagrafx", { NULL }, 1373, "tcp" }, + { "chromagrafx", { NULL }, 1373, "udp" }, + { "molly", { NULL }, 1374, "tcp" }, + { "molly", { NULL }, 1374, "udp" }, + { "bytex", { NULL }, 1375, "tcp" }, + { "bytex", { NULL }, 1375, "udp" }, + { "ibm-pps", { NULL }, 1376, "tcp" }, + { "ibm-pps", { NULL }, 1376, "udp" }, + { "cichlid", { NULL }, 1377, "tcp" }, + { "cichlid", { NULL }, 1377, "udp" }, + { "elan", { NULL }, 1378, "tcp" }, + { "elan", { NULL }, 1378, "udp" }, + { "dbreporter", { NULL }, 1379, "tcp" }, + { "dbreporter", { NULL }, 1379, "udp" }, + { "telesis-licman", { NULL }, 1380, "tcp" }, + { "telesis-licman", { NULL }, 1380, "udp" }, + { "apple-licman", { NULL }, 1381, "tcp" }, + { "apple-licman", { NULL }, 1381, "udp" }, + { "udt_os", { NULL }, 1382, "tcp" }, + { "udt_os", { NULL }, 1382, "udp" }, + { "gwha", { NULL }, 1383, "tcp" }, + { "gwha", { NULL }, 1383, "udp" }, + { "os-licman", { NULL }, 1384, "tcp" }, + { "os-licman", { NULL }, 1384, "udp" }, + { "atex_elmd", { NULL }, 1385, "tcp" }, + { "atex_elmd", { NULL }, 1385, "udp" }, + { "checksum", { NULL }, 1386, "tcp" }, + { "checksum", { NULL }, 1386, "udp" }, + { "cadsi-lm", { NULL }, 1387, "tcp" }, + { "cadsi-lm", { NULL }, 1387, "udp" }, + { "objective-dbc", { NULL }, 1388, "tcp" }, + { "objective-dbc", { NULL }, 1388, "udp" }, + { "iclpv-dm", { NULL }, 1389, "tcp" }, + { "iclpv-dm", { NULL }, 1389, "udp" }, + { "iclpv-sc", { NULL }, 1390, "tcp" }, + { "iclpv-sc", { NULL }, 1390, "udp" }, + { "iclpv-sas", { NULL }, 1391, "tcp" }, + { "iclpv-sas", { NULL }, 1391, "udp" }, + { "iclpv-pm", { NULL }, 1392, "tcp" }, + { "iclpv-pm", { NULL }, 1392, "udp" }, + { "iclpv-nls", { NULL }, 1393, "tcp" }, + { "iclpv-nls", { NULL }, 1393, "udp" }, + { "iclpv-nlc", { NULL }, 1394, "tcp" }, + { "iclpv-nlc", { NULL }, 1394, "udp" }, + { "iclpv-wsm", { NULL }, 1395, "tcp" }, + { "iclpv-wsm", { NULL }, 1395, "udp" }, + { "dvl-activemail", { NULL }, 1396, "tcp" }, + { "dvl-activemail", { NULL }, 1396, "udp" }, + { "audio-activmail", { NULL }, 1397, "tcp" }, + { "audio-activmail", { NULL }, 1397, "udp" }, + { "video-activmail", { NULL }, 1398, "tcp" }, + { "video-activmail", { NULL }, 1398, "udp" }, + { "cadkey-licman", { NULL }, 1399, "tcp" }, + { "cadkey-licman", { NULL }, 1399, "udp" }, + { "cadkey-tablet", { NULL }, 1400, "tcp" }, + { "cadkey-tablet", { NULL }, 1400, "udp" }, + { "goldleaf-licman", { NULL }, 1401, "tcp" }, + { "goldleaf-licman", { NULL }, 1401, "udp" }, + { "prm-sm-np", { NULL }, 1402, "tcp" }, + { "prm-sm-np", { NULL }, 1402, "udp" }, + { "prm-nm-np", { NULL }, 1403, "tcp" }, + { "prm-nm-np", { NULL }, 1403, "udp" }, + { "igi-lm", { NULL }, 1404, "tcp" }, + { "igi-lm", { NULL }, 1404, "udp" }, + { "ibm-res", { NULL }, 1405, "tcp" }, + { "ibm-res", { NULL }, 1405, "udp" }, + { "netlabs-lm", { NULL }, 1406, "tcp" }, + { "netlabs-lm", { NULL }, 1406, "udp" }, + { "dbsa-lm", { NULL }, 1407, "tcp" }, + { "dbsa-lm", { NULL }, 1407, "udp" }, + { "sophia-lm", { NULL }, 1408, "tcp" }, + { "sophia-lm", { NULL }, 1408, "udp" }, + { "here-lm", { NULL }, 1409, "tcp" }, + { "here-lm", { NULL }, 1409, "udp" }, + { "hiq", { NULL }, 1410, "tcp" }, + { "hiq", { NULL }, 1410, "udp" }, + { "af", { NULL }, 1411, "tcp" }, + { "af", { NULL }, 1411, "udp" }, + { "innosys", { NULL }, 1412, "tcp" }, + { "innosys", { NULL }, 1412, "udp" }, + { "innosys-acl", { NULL }, 1413, "tcp" }, + { "innosys-acl", { NULL }, 1413, "udp" }, + { "ibm-mqseries", { NULL }, 1414, "tcp" }, + { "ibm-mqseries", { NULL }, 1414, "udp" }, + { "dbstar", { NULL }, 1415, "tcp" }, + { "dbstar", { NULL }, 1415, "udp" }, + { "novell-lu6.2", { NULL }, 1416, "tcp" }, + { "novell-lu6.2", { NULL }, 1416, "udp" }, + { "timbuktu-srv1", { NULL }, 1417, "tcp" }, + { "timbuktu-srv1", { NULL }, 1417, "udp" }, + { "timbuktu-srv2", { NULL }, 1418, "tcp" }, + { "timbuktu-srv2", { NULL }, 1418, "udp" }, + { "timbuktu-srv3", { NULL }, 1419, "tcp" }, + { "timbuktu-srv3", { NULL }, 1419, "udp" }, + { "timbuktu-srv4", { NULL }, 1420, "tcp" }, + { "timbuktu-srv4", { NULL }, 1420, "udp" }, + { "gandalf-lm", { NULL }, 1421, "tcp" }, + { "gandalf-lm", { NULL }, 1421, "udp" }, + { "autodesk-lm", { NULL }, 1422, "tcp" }, + { "autodesk-lm", { NULL }, 1422, "udp" }, + { "essbase", { NULL }, 1423, "tcp" }, + { "essbase", { NULL }, 1423, "udp" }, + { "hybrid", { NULL }, 1424, "tcp" }, + { "hybrid", { NULL }, 1424, "udp" }, + { "zion-lm", { NULL }, 1425, "tcp" }, + { "zion-lm", { NULL }, 1425, "udp" }, + { "sais", { NULL }, 1426, "tcp" }, + { "sais", { NULL }, 1426, "udp" }, + { "mloadd", { NULL }, 1427, "tcp" }, + { "mloadd", { NULL }, 1427, "udp" }, + { "informatik-lm", { NULL }, 1428, "tcp" }, + { "informatik-lm", { NULL }, 1428, "udp" }, + { "nms", { NULL }, 1429, "tcp" }, + { "nms", { NULL }, 1429, "udp" }, + { "tpdu", { NULL }, 1430, "tcp" }, + { "tpdu", { NULL }, 1430, "udp" }, + { "rgtp", { NULL }, 1431, "tcp" }, + { "rgtp", { NULL }, 1431, "udp" }, + { "blueberry-lm", { NULL }, 1432, "tcp" }, + { "blueberry-lm", { NULL }, 1432, "udp" }, + { "ms-sql-s", { NULL }, 1433, "tcp" }, + { "ms-sql-s", { NULL }, 1433, "udp" }, + { "ms-sql-m", { NULL }, 1434, "tcp" }, + { "ms-sql-m", { NULL }, 1434, "udp" }, + { "ibm-cics", { NULL }, 1435, "tcp" }, + { "ibm-cics", { NULL }, 1435, "udp" }, + { "saism", { NULL }, 1436, "tcp" }, + { "saism", { NULL }, 1436, "udp" }, + { "tabula", { NULL }, 1437, "tcp" }, + { "tabula", { NULL }, 1437, "udp" }, + { "eicon-server", { NULL }, 1438, "tcp" }, + { "eicon-server", { NULL }, 1438, "udp" }, + { "eicon-x25", { NULL }, 1439, "tcp" }, + { "eicon-x25", { NULL }, 1439, "udp" }, + { "eicon-slp", { NULL }, 1440, "tcp" }, + { "eicon-slp", { NULL }, 1440, "udp" }, + { "cadis-1", { NULL }, 1441, "tcp" }, + { "cadis-1", { NULL }, 1441, "udp" }, + { "cadis-2", { NULL }, 1442, "tcp" }, + { "cadis-2", { NULL }, 1442, "udp" }, + { "ies-lm", { NULL }, 1443, "tcp" }, + { "ies-lm", { NULL }, 1443, "udp" }, + { "marcam-lm", { NULL }, 1444, "tcp" }, + { "marcam-lm", { NULL }, 1444, "udp" }, + { "proxima-lm", { NULL }, 1445, "tcp" }, + { "proxima-lm", { NULL }, 1445, "udp" }, + { "ora-lm", { NULL }, 1446, "tcp" }, + { "ora-lm", { NULL }, 1446, "udp" }, + { "apri-lm", { NULL }, 1447, "tcp" }, + { "apri-lm", { NULL }, 1447, "udp" }, + { "oc-lm", { NULL }, 1448, "tcp" }, + { "oc-lm", { NULL }, 1448, "udp" }, + { "peport", { NULL }, 1449, "tcp" }, + { "peport", { NULL }, 1449, "udp" }, + { "dwf", { NULL }, 1450, "tcp" }, + { "dwf", { NULL }, 1450, "udp" }, + { "infoman", { NULL }, 1451, "tcp" }, + { "infoman", { NULL }, 1451, "udp" }, + { "gtegsc-lm", { NULL }, 1452, "tcp" }, + { "gtegsc-lm", { NULL }, 1452, "udp" }, + { "genie-lm", { NULL }, 1453, "tcp" }, + { "genie-lm", { NULL }, 1453, "udp" }, + { "interhdl_elmd", { NULL }, 1454, "tcp" }, + { "interhdl_elmd", { NULL }, 1454, "udp" }, + { "esl-lm", { NULL }, 1455, "tcp" }, + { "esl-lm", { NULL }, 1455, "udp" }, + { "dca", { NULL }, 1456, "tcp" }, + { "dca", { NULL }, 1456, "udp" }, + { "valisys-lm", { NULL }, 1457, "tcp" }, + { "valisys-lm", { NULL }, 1457, "udp" }, + { "nrcabq-lm", { NULL }, 1458, "tcp" }, + { "nrcabq-lm", { NULL }, 1458, "udp" }, + { "proshare1", { NULL }, 1459, "tcp" }, + { "proshare1", { NULL }, 1459, "udp" }, + { "proshare2", { NULL }, 1460, "tcp" }, + { "proshare2", { NULL }, 1460, "udp" }, + { "ibm_wrless_lan", { NULL }, 1461, "tcp" }, + { "ibm_wrless_lan", { NULL }, 1461, "udp" }, + { "world-lm", { NULL }, 1462, "tcp" }, + { "world-lm", { NULL }, 1462, "udp" }, + { "nucleus", { NULL }, 1463, "tcp" }, + { "nucleus", { NULL }, 1463, "udp" }, + { "msl_lmd", { NULL }, 1464, "tcp" }, + { "msl_lmd", { NULL }, 1464, "udp" }, + { "pipes", { NULL }, 1465, "tcp" }, + { "pipes", { NULL }, 1465, "udp" }, + { "oceansoft-lm", { NULL }, 1466, "tcp" }, + { "oceansoft-lm", { NULL }, 1466, "udp" }, + { "csdmbase", { NULL }, 1467, "tcp" }, + { "csdmbase", { NULL }, 1467, "udp" }, + { "csdm", { NULL }, 1468, "tcp" }, + { "csdm", { NULL }, 1468, "udp" }, + { "aal-lm", { NULL }, 1469, "tcp" }, + { "aal-lm", { NULL }, 1469, "udp" }, + { "uaiact", { NULL }, 1470, "tcp" }, + { "uaiact", { NULL }, 1470, "udp" }, + { "csdmbase", { NULL }, 1471, "tcp" }, + { "csdmbase", { NULL }, 1471, "udp" }, + { "csdm", { NULL }, 1472, "tcp" }, + { "csdm", { NULL }, 1472, "udp" }, + { "openmath", { NULL }, 1473, "tcp" }, + { "openmath", { NULL }, 1473, "udp" }, + { "telefinder", { NULL }, 1474, "tcp" }, + { "telefinder", { NULL }, 1474, "udp" }, + { "taligent-lm", { NULL }, 1475, "tcp" }, + { "taligent-lm", { NULL }, 1475, "udp" }, + { "clvm-cfg", { NULL }, 1476, "tcp" }, + { "clvm-cfg", { NULL }, 1476, "udp" }, + { "ms-sna-server", { NULL }, 1477, "tcp" }, + { "ms-sna-server", { NULL }, 1477, "udp" }, + { "ms-sna-base", { NULL }, 1478, "tcp" }, + { "ms-sna-base", { NULL }, 1478, "udp" }, + { "dberegister", { NULL }, 1479, "tcp" }, + { "dberegister", { NULL }, 1479, "udp" }, + { "pacerforum", { NULL }, 1480, "tcp" }, + { "pacerforum", { NULL }, 1480, "udp" }, + { "airs", { NULL }, 1481, "tcp" }, + { "airs", { NULL }, 1481, "udp" }, + { "miteksys-lm", { NULL }, 1482, "tcp" }, + { "miteksys-lm", { NULL }, 1482, "udp" }, + { "afs", { NULL }, 1483, "tcp" }, + { "afs", { NULL }, 1483, "udp" }, + { "confluent", { NULL }, 1484, "tcp" }, + { "confluent", { NULL }, 1484, "udp" }, + { "lansource", { NULL }, 1485, "tcp" }, + { "lansource", { NULL }, 1485, "udp" }, + { "nms_topo_serv", { NULL }, 1486, "tcp" }, + { "nms_topo_serv", { NULL }, 1486, "udp" }, + { "localinfosrvr", { NULL }, 1487, "tcp" }, + { "localinfosrvr", { NULL }, 1487, "udp" }, + { "docstor", { NULL }, 1488, "tcp" }, + { "docstor", { NULL }, 1488, "udp" }, + { "dmdocbroker", { NULL }, 1489, "tcp" }, + { "dmdocbroker", { NULL }, 1489, "udp" }, + { "insitu-conf", { NULL }, 1490, "tcp" }, + { "insitu-conf", { NULL }, 1490, "udp" }, + { "stone-design-1", { NULL }, 1492, "tcp" }, + { "stone-design-1", { NULL }, 1492, "udp" }, + { "netmap_lm", { NULL }, 1493, "tcp" }, + { "netmap_lm", { NULL }, 1493, "udp" }, + { "ica", { NULL }, 1494, "tcp" }, + { "ica", { NULL }, 1494, "udp" }, + { "cvc", { NULL }, 1495, "tcp" }, + { "cvc", { NULL }, 1495, "udp" }, + { "liberty-lm", { NULL }, 1496, "tcp" }, + { "liberty-lm", { NULL }, 1496, "udp" }, + { "rfx-lm", { NULL }, 1497, "tcp" }, + { "rfx-lm", { NULL }, 1497, "udp" }, + { "sybase-sqlany", { NULL }, 1498, "tcp" }, + { "sybase-sqlany", { NULL }, 1498, "udp" }, + { "fhc", { NULL }, 1499, "tcp" }, + { "fhc", { NULL }, 1499, "udp" }, + { "vlsi-lm", { NULL }, 1500, "tcp" }, + { "vlsi-lm", { NULL }, 1500, "udp" }, + { "saiscm", { NULL }, 1501, "tcp" }, + { "saiscm", { NULL }, 1501, "udp" }, + { "shivadiscovery", { NULL }, 1502, "tcp" }, + { "shivadiscovery", { NULL }, 1502, "udp" }, + { "imtc-mcs", { NULL }, 1503, "tcp" }, + { "imtc-mcs", { NULL }, 1503, "udp" }, + { "evb-elm", { NULL }, 1504, "tcp" }, + { "evb-elm", { NULL }, 1504, "udp" }, + { "funkproxy", { NULL }, 1505, "tcp" }, + { "funkproxy", { NULL }, 1505, "udp" }, + { "utcd", { NULL }, 1506, "tcp" }, + { "utcd", { NULL }, 1506, "udp" }, + { "symplex", { NULL }, 1507, "tcp" }, + { "symplex", { NULL }, 1507, "udp" }, + { "diagmond", { NULL }, 1508, "tcp" }, + { "diagmond", { NULL }, 1508, "udp" }, + { "robcad-lm", { NULL }, 1509, "tcp" }, + { "robcad-lm", { NULL }, 1509, "udp" }, + { "mvx-lm", { NULL }, 1510, "tcp" }, + { "mvx-lm", { NULL }, 1510, "udp" }, + { "3l-l1", { NULL }, 1511, "tcp" }, + { "3l-l1", { NULL }, 1511, "udp" }, + { "wins", { NULL }, 1512, "tcp" }, + { "wins", { NULL }, 1512, "udp" }, + { "fujitsu-dtc", { NULL }, 1513, "tcp" }, + { "fujitsu-dtc", { NULL }, 1513, "udp" }, + { "fujitsu-dtcns", { NULL }, 1514, "tcp" }, + { "fujitsu-dtcns", { NULL }, 1514, "udp" }, + { "ifor-protocol", { NULL }, 1515, "tcp" }, + { "ifor-protocol", { NULL }, 1515, "udp" }, + { "vpad", { NULL }, 1516, "tcp" }, + { "vpad", { NULL }, 1516, "udp" }, + { "vpac", { NULL }, 1517, "tcp" }, + { "vpac", { NULL }, 1517, "udp" }, + { "vpvd", { NULL }, 1518, "tcp" }, + { "vpvd", { NULL }, 1518, "udp" }, + { "vpvc", { NULL }, 1519, "tcp" }, + { "vpvc", { NULL }, 1519, "udp" }, + { "atm-zip-office", { NULL }, 1520, "tcp" }, + { "atm-zip-office", { NULL }, 1520, "udp" }, + { "ncube-lm", { NULL }, 1521, "tcp" }, + { "ncube-lm", { NULL }, 1521, "udp" }, + { "ricardo-lm", { NULL }, 1522, "tcp" }, + { "ricardo-lm", { NULL }, 1522, "udp" }, + { "cichild-lm", { NULL }, 1523, "tcp" }, + { "cichild-lm", { NULL }, 1523, "udp" }, + { "ingreslock", { NULL }, 1524, "tcp" }, + { "ingreslock", { NULL }, 1524, "udp" }, + { "orasrv", { NULL }, 1525, "tcp" }, + { "orasrv", { NULL }, 1525, "udp" }, + { "prospero-np", { NULL }, 1525, "tcp" }, + { "prospero-np", { NULL }, 1525, "udp" }, + { "pdap-np", { NULL }, 1526, "tcp" }, + { "pdap-np", { NULL }, 1526, "udp" }, + { "tlisrv", { NULL }, 1527, "tcp" }, + { "tlisrv", { NULL }, 1527, "udp" }, + { "coauthor", { NULL }, 1529, "tcp" }, + { "coauthor", { NULL }, 1529, "udp" }, + { "rap-service", { NULL }, 1530, "tcp" }, + { "rap-service", { NULL }, 1530, "udp" }, + { "rap-listen", { NULL }, 1531, "tcp" }, + { "rap-listen", { NULL }, 1531, "udp" }, + { "miroconnect", { NULL }, 1532, "tcp" }, + { "miroconnect", { NULL }, 1532, "udp" }, + { "virtual-places", { NULL }, 1533, "tcp" }, + { "virtual-places", { NULL }, 1533, "udp" }, + { "micromuse-lm", { NULL }, 1534, "tcp" }, + { "micromuse-lm", { NULL }, 1534, "udp" }, + { "ampr-info", { NULL }, 1535, "tcp" }, + { "ampr-info", { NULL }, 1535, "udp" }, + { "ampr-inter", { NULL }, 1536, "tcp" }, + { "ampr-inter", { NULL }, 1536, "udp" }, + { "sdsc-lm", { NULL }, 1537, "tcp" }, + { "sdsc-lm", { NULL }, 1537, "udp" }, + { "3ds-lm", { NULL }, 1538, "tcp" }, + { "3ds-lm", { NULL }, 1538, "udp" }, + { "intellistor-lm", { NULL }, 1539, "tcp" }, + { "intellistor-lm", { NULL }, 1539, "udp" }, + { "rds", { NULL }, 1540, "tcp" }, + { "rds", { NULL }, 1540, "udp" }, + { "rds2", { NULL }, 1541, "tcp" }, + { "rds2", { NULL }, 1541, "udp" }, + { "gridgen-elmd", { NULL }, 1542, "tcp" }, + { "gridgen-elmd", { NULL }, 1542, "udp" }, + { "simba-cs", { NULL }, 1543, "tcp" }, + { "simba-cs", { NULL }, 1543, "udp" }, + { "aspeclmd", { NULL }, 1544, "tcp" }, + { "aspeclmd", { NULL }, 1544, "udp" }, + { "vistium-share", { NULL }, 1545, "tcp" }, + { "vistium-share", { NULL }, 1545, "udp" }, + { "abbaccuray", { NULL }, 1546, "tcp" }, + { "abbaccuray", { NULL }, 1546, "udp" }, + { "laplink", { NULL }, 1547, "tcp" }, + { "laplink", { NULL }, 1547, "udp" }, + { "axon-lm", { NULL }, 1548, "tcp" }, + { "axon-lm", { NULL }, 1548, "udp" }, + { "shivahose", { NULL }, 1549, "tcp" }, + { "shivasound", { NULL }, 1549, "udp" }, + { "3m-image-lm", { NULL }, 1550, "tcp" }, + { "3m-image-lm", { NULL }, 1550, "udp" }, + { "hecmtl-db", { NULL }, 1551, "tcp" }, + { "hecmtl-db", { NULL }, 1551, "udp" }, + { "pciarray", { NULL }, 1552, "tcp" }, + { "pciarray", { NULL }, 1552, "udp" }, + { "sna-cs", { NULL }, 1553, "tcp" }, + { "sna-cs", { NULL }, 1553, "udp" }, + { "caci-lm", { NULL }, 1554, "tcp" }, + { "caci-lm", { NULL }, 1554, "udp" }, + { "livelan", { NULL }, 1555, "tcp" }, + { "livelan", { NULL }, 1555, "udp" }, + { "veritas_pbx", { NULL }, 1556, "tcp" }, + { "veritas_pbx", { NULL }, 1556, "udp" }, + { "arbortext-lm", { NULL }, 1557, "tcp" }, + { "arbortext-lm", { NULL }, 1557, "udp" }, + { "xingmpeg", { NULL }, 1558, "tcp" }, + { "xingmpeg", { NULL }, 1558, "udp" }, + { "web2host", { NULL }, 1559, "tcp" }, + { "web2host", { NULL }, 1559, "udp" }, + { "asci-val", { NULL }, 1560, "tcp" }, + { "asci-val", { NULL }, 1560, "udp" }, + { "facilityview", { NULL }, 1561, "tcp" }, + { "facilityview", { NULL }, 1561, "udp" }, + { "pconnectmgr", { NULL }, 1562, "tcp" }, + { "pconnectmgr", { NULL }, 1562, "udp" }, + { "cadabra-lm", { NULL }, 1563, "tcp" }, + { "cadabra-lm", { NULL }, 1563, "udp" }, + { "pay-per-view", { NULL }, 1564, "tcp" }, + { "pay-per-view", { NULL }, 1564, "udp" }, + { "winddlb", { NULL }, 1565, "tcp" }, + { "winddlb", { NULL }, 1565, "udp" }, + { "corelvideo", { NULL }, 1566, "tcp" }, + { "corelvideo", { NULL }, 1566, "udp" }, + { "jlicelmd", { NULL }, 1567, "tcp" }, + { "jlicelmd", { NULL }, 1567, "udp" }, + { "tsspmap", { NULL }, 1568, "tcp" }, + { "tsspmap", { NULL }, 1568, "udp" }, + { "ets", { NULL }, 1569, "tcp" }, + { "ets", { NULL }, 1569, "udp" }, + { "orbixd", { NULL }, 1570, "tcp" }, + { "orbixd", { NULL }, 1570, "udp" }, + { "rdb-dbs-disp", { NULL }, 1571, "tcp" }, + { "rdb-dbs-disp", { NULL }, 1571, "udp" }, + { "chip-lm", { NULL }, 1572, "tcp" }, + { "chip-lm", { NULL }, 1572, "udp" }, + { "itscomm-ns", { NULL }, 1573, "tcp" }, + { "itscomm-ns", { NULL }, 1573, "udp" }, + { "mvel-lm", { NULL }, 1574, "tcp" }, + { "mvel-lm", { NULL }, 1574, "udp" }, + { "oraclenames", { NULL }, 1575, "tcp" }, + { "oraclenames", { NULL }, 1575, "udp" }, + { "moldflow-lm", { NULL }, 1576, "tcp" }, + { "moldflow-lm", { NULL }, 1576, "udp" }, + { "hypercube-lm", { NULL }, 1577, "tcp" }, + { "hypercube-lm", { NULL }, 1577, "udp" }, + { "jacobus-lm", { NULL }, 1578, "tcp" }, + { "jacobus-lm", { NULL }, 1578, "udp" }, + { "ioc-sea-lm", { NULL }, 1579, "tcp" }, + { "ioc-sea-lm", { NULL }, 1579, "udp" }, + { "tn-tl-r1", { NULL }, 1580, "tcp" }, + { "tn-tl-r2", { NULL }, 1580, "udp" }, + { "mil-2045-47001", { NULL }, 1581, "tcp" }, + { "mil-2045-47001", { NULL }, 1581, "udp" }, + { "msims", { NULL }, 1582, "tcp" }, + { "msims", { NULL }, 1582, "udp" }, + { "simbaexpress", { NULL }, 1583, "tcp" }, + { "simbaexpress", { NULL }, 1583, "udp" }, + { "tn-tl-fd2", { NULL }, 1584, "tcp" }, + { "tn-tl-fd2", { NULL }, 1584, "udp" }, + { "intv", { NULL }, 1585, "tcp" }, + { "intv", { NULL }, 1585, "udp" }, + { "ibm-abtact", { NULL }, 1586, "tcp" }, + { "ibm-abtact", { NULL }, 1586, "udp" }, + { "pra_elmd", { NULL }, 1587, "tcp" }, + { "pra_elmd", { NULL }, 1587, "udp" }, + { "triquest-lm", { NULL }, 1588, "tcp" }, + { "triquest-lm", { NULL }, 1588, "udp" }, + { "vqp", { NULL }, 1589, "tcp" }, + { "vqp", { NULL }, 1589, "udp" }, + { "gemini-lm", { NULL }, 1590, "tcp" }, + { "gemini-lm", { NULL }, 1590, "udp" }, + { "ncpm-pm", { NULL }, 1591, "tcp" }, + { "ncpm-pm", { NULL }, 1591, "udp" }, + { "commonspace", { NULL }, 1592, "tcp" }, + { "commonspace", { NULL }, 1592, "udp" }, + { "mainsoft-lm", { NULL }, 1593, "tcp" }, + { "mainsoft-lm", { NULL }, 1593, "udp" }, + { "sixtrak", { NULL }, 1594, "tcp" }, + { "sixtrak", { NULL }, 1594, "udp" }, + { "radio", { NULL }, 1595, "tcp" }, + { "radio", { NULL }, 1595, "udp" }, + { "radio-sm", { NULL }, 1596, "tcp" }, + { "radio-bc", { NULL }, 1596, "udp" }, + { "orbplus-iiop", { NULL }, 1597, "tcp" }, + { "orbplus-iiop", { NULL }, 1597, "udp" }, + { "picknfs", { NULL }, 1598, "tcp" }, + { "picknfs", { NULL }, 1598, "udp" }, + { "simbaservices", { NULL }, 1599, "tcp" }, + { "simbaservices", { NULL }, 1599, "udp" }, + { "issd", { NULL }, 1600, "tcp" }, + { "issd", { NULL }, 1600, "udp" }, + { "aas", { NULL }, 1601, "tcp" }, + { "aas", { NULL }, 1601, "udp" }, + { "inspect", { NULL }, 1602, "tcp" }, + { "inspect", { NULL }, 1602, "udp" }, + { "picodbc", { NULL }, 1603, "tcp" }, + { "picodbc", { NULL }, 1603, "udp" }, + { "icabrowser", { NULL }, 1604, "tcp" }, + { "icabrowser", { NULL }, 1604, "udp" }, + { "slp", { NULL }, 1605, "tcp" }, + { "slp", { NULL }, 1605, "udp" }, + { "slm-api", { NULL }, 1606, "tcp" }, + { "slm-api", { NULL }, 1606, "udp" }, + { "stt", { NULL }, 1607, "tcp" }, + { "stt", { NULL }, 1607, "udp" }, + { "smart-lm", { NULL }, 1608, "tcp" }, + { "smart-lm", { NULL }, 1608, "udp" }, + { "isysg-lm", { NULL }, 1609, "tcp" }, + { "isysg-lm", { NULL }, 1609, "udp" }, + { "taurus-wh", { NULL }, 1610, "tcp" }, + { "taurus-wh", { NULL }, 1610, "udp" }, + { "ill", { NULL }, 1611, "tcp" }, + { "ill", { NULL }, 1611, "udp" }, + { "netbill-trans", { NULL }, 1612, "tcp" }, + { "netbill-trans", { NULL }, 1612, "udp" }, + { "netbill-keyrep", { NULL }, 1613, "tcp" }, + { "netbill-keyrep", { NULL }, 1613, "udp" }, + { "netbill-cred", { NULL }, 1614, "tcp" }, + { "netbill-cred", { NULL }, 1614, "udp" }, + { "netbill-auth", { NULL }, 1615, "tcp" }, + { "netbill-auth", { NULL }, 1615, "udp" }, + { "netbill-prod", { NULL }, 1616, "tcp" }, + { "netbill-prod", { NULL }, 1616, "udp" }, + { "nimrod-agent", { NULL }, 1617, "tcp" }, + { "nimrod-agent", { NULL }, 1617, "udp" }, + { "skytelnet", { NULL }, 1618, "tcp" }, + { "skytelnet", { NULL }, 1618, "udp" }, + { "xs-openstorage", { NULL }, 1619, "tcp" }, + { "xs-openstorage", { NULL }, 1619, "udp" }, + { "faxportwinport", { NULL }, 1620, "tcp" }, + { "faxportwinport", { NULL }, 1620, "udp" }, + { "softdataphone", { NULL }, 1621, "tcp" }, + { "softdataphone", { NULL }, 1621, "udp" }, + { "ontime", { NULL }, 1622, "tcp" }, + { "ontime", { NULL }, 1622, "udp" }, + { "jaleosnd", { NULL }, 1623, "tcp" }, + { "jaleosnd", { NULL }, 1623, "udp" }, + { "udp-sr-port", { NULL }, 1624, "tcp" }, + { "udp-sr-port", { NULL }, 1624, "udp" }, + { "svs-omagent", { NULL }, 1625, "tcp" }, + { "svs-omagent", { NULL }, 1625, "udp" }, + { "shockwave", { NULL }, 1626, "tcp" }, + { "shockwave", { NULL }, 1626, "udp" }, + { "t128-gateway", { NULL }, 1627, "tcp" }, + { "t128-gateway", { NULL }, 1627, "udp" }, + { "lontalk-norm", { NULL }, 1628, "tcp" }, + { "lontalk-norm", { NULL }, 1628, "udp" }, + { "lontalk-urgnt", { NULL }, 1629, "tcp" }, + { "lontalk-urgnt", { NULL }, 1629, "udp" }, + { "oraclenet8cman", { NULL }, 1630, "tcp" }, + { "oraclenet8cman", { NULL }, 1630, "udp" }, + { "visitview", { NULL }, 1631, "tcp" }, + { "visitview", { NULL }, 1631, "udp" }, + { "pammratc", { NULL }, 1632, "tcp" }, + { "pammratc", { NULL }, 1632, "udp" }, + { "pammrpc", { NULL }, 1633, "tcp" }, + { "pammrpc", { NULL }, 1633, "udp" }, + { "loaprobe", { NULL }, 1634, "tcp" }, + { "loaprobe", { NULL }, 1634, "udp" }, + { "edb-server1", { NULL }, 1635, "tcp" }, + { "edb-server1", { NULL }, 1635, "udp" }, + { "isdc", { NULL }, 1636, "tcp" }, + { "isdc", { NULL }, 1636, "udp" }, + { "islc", { NULL }, 1637, "tcp" }, + { "islc", { NULL }, 1637, "udp" }, + { "ismc", { NULL }, 1638, "tcp" }, + { "ismc", { NULL }, 1638, "udp" }, + { "cert-initiator", { NULL }, 1639, "tcp" }, + { "cert-initiator", { NULL }, 1639, "udp" }, + { "cert-responder", { NULL }, 1640, "tcp" }, + { "cert-responder", { NULL }, 1640, "udp" }, + { "invision", { NULL }, 1641, "tcp" }, + { "invision", { NULL }, 1641, "udp" }, + { "isis-am", { NULL }, 1642, "tcp" }, + { "isis-am", { NULL }, 1642, "udp" }, + { "isis-ambc", { NULL }, 1643, "tcp" }, + { "isis-ambc", { NULL }, 1643, "udp" }, + { "saiseh", { NULL }, 1644, "tcp" }, + { "sightline", { NULL }, 1645, "tcp" }, + { "sightline", { NULL }, 1645, "udp" }, + { "sa-msg-port", { NULL }, 1646, "tcp" }, + { "sa-msg-port", { NULL }, 1646, "udp" }, + { "rsap", { NULL }, 1647, "tcp" }, + { "rsap", { NULL }, 1647, "udp" }, + { "concurrent-lm", { NULL }, 1648, "tcp" }, + { "concurrent-lm", { NULL }, 1648, "udp" }, + { "kermit", { NULL }, 1649, "tcp" }, + { "kermit", { NULL }, 1649, "udp" }, + { "nkd", { NULL }, 1650, "tcp" }, + { "nkd", { NULL }, 1650, "udp" }, + { "shiva_confsrvr", { NULL }, 1651, "tcp" }, + { "shiva_confsrvr", { NULL }, 1651, "udp" }, + { "xnmp", { NULL }, 1652, "tcp" }, + { "xnmp", { NULL }, 1652, "udp" }, + { "alphatech-lm", { NULL }, 1653, "tcp" }, + { "alphatech-lm", { NULL }, 1653, "udp" }, + { "stargatealerts", { NULL }, 1654, "tcp" }, + { "stargatealerts", { NULL }, 1654, "udp" }, + { "dec-mbadmin", { NULL }, 1655, "tcp" }, + { "dec-mbadmin", { NULL }, 1655, "udp" }, + { "dec-mbadmin-h", { NULL }, 1656, "tcp" }, + { "dec-mbadmin-h", { NULL }, 1656, "udp" }, + { "fujitsu-mmpdc", { NULL }, 1657, "tcp" }, + { "fujitsu-mmpdc", { NULL }, 1657, "udp" }, + { "sixnetudr", { NULL }, 1658, "tcp" }, + { "sixnetudr", { NULL }, 1658, "udp" }, + { "sg-lm", { NULL }, 1659, "tcp" }, + { "sg-lm", { NULL }, 1659, "udp" }, + { "skip-mc-gikreq", { NULL }, 1660, "tcp" }, + { "skip-mc-gikreq", { NULL }, 1660, "udp" }, + { "netview-aix-1", { NULL }, 1661, "tcp" }, + { "netview-aix-1", { NULL }, 1661, "udp" }, + { "netview-aix-2", { NULL }, 1662, "tcp" }, + { "netview-aix-2", { NULL }, 1662, "udp" }, + { "netview-aix-3", { NULL }, 1663, "tcp" }, + { "netview-aix-3", { NULL }, 1663, "udp" }, + { "netview-aix-4", { NULL }, 1664, "tcp" }, + { "netview-aix-4", { NULL }, 1664, "udp" }, + { "netview-aix-5", { NULL }, 1665, "tcp" }, + { "netview-aix-5", { NULL }, 1665, "udp" }, + { "netview-aix-6", { NULL }, 1666, "tcp" }, + { "netview-aix-6", { NULL }, 1666, "udp" }, + { "netview-aix-7", { NULL }, 1667, "tcp" }, + { "netview-aix-7", { NULL }, 1667, "udp" }, + { "netview-aix-8", { NULL }, 1668, "tcp" }, + { "netview-aix-8", { NULL }, 1668, "udp" }, + { "netview-aix-9", { NULL }, 1669, "tcp" }, + { "netview-aix-9", { NULL }, 1669, "udp" }, + { "netview-aix-10", { NULL }, 1670, "tcp" }, + { "netview-aix-10", { NULL }, 1670, "udp" }, + { "netview-aix-11", { NULL }, 1671, "tcp" }, + { "netview-aix-11", { NULL }, 1671, "udp" }, + { "netview-aix-12", { NULL }, 1672, "tcp" }, + { "netview-aix-12", { NULL }, 1672, "udp" }, + { "proshare-mc-1", { NULL }, 1673, "tcp" }, + { "proshare-mc-1", { NULL }, 1673, "udp" }, + { "proshare-mc-2", { NULL }, 1674, "tcp" }, + { "proshare-mc-2", { NULL }, 1674, "udp" }, + { "pdp", { NULL }, 1675, "tcp" }, + { "pdp", { NULL }, 1675, "udp" }, + { "netcomm1", { NULL }, 1676, "tcp" }, + { "netcomm2", { NULL }, 1676, "udp" }, + { "groupwise", { NULL }, 1677, "tcp" }, + { "groupwise", { NULL }, 1677, "udp" }, + { "prolink", { NULL }, 1678, "tcp" }, + { "prolink", { NULL }, 1678, "udp" }, + { "darcorp-lm", { NULL }, 1679, "tcp" }, + { "darcorp-lm", { NULL }, 1679, "udp" }, + { "microcom-sbp", { NULL }, 1680, "tcp" }, + { "microcom-sbp", { NULL }, 1680, "udp" }, + { "sd-elmd", { NULL }, 1681, "tcp" }, + { "sd-elmd", { NULL }, 1681, "udp" }, + { "lanyon-lantern", { NULL }, 1682, "tcp" }, + { "lanyon-lantern", { NULL }, 1682, "udp" }, + { "ncpm-hip", { NULL }, 1683, "tcp" }, + { "ncpm-hip", { NULL }, 1683, "udp" }, + { "snaresecure", { NULL }, 1684, "tcp" }, + { "snaresecure", { NULL }, 1684, "udp" }, + { "n2nremote", { NULL }, 1685, "tcp" }, + { "n2nremote", { NULL }, 1685, "udp" }, + { "cvmon", { NULL }, 1686, "tcp" }, + { "cvmon", { NULL }, 1686, "udp" }, + { "nsjtp-ctrl", { NULL }, 1687, "tcp" }, + { "nsjtp-ctrl", { NULL }, 1687, "udp" }, + { "nsjtp-data", { NULL }, 1688, "tcp" }, + { "nsjtp-data", { NULL }, 1688, "udp" }, + { "firefox", { NULL }, 1689, "tcp" }, + { "firefox", { NULL }, 1689, "udp" }, + { "ng-umds", { NULL }, 1690, "tcp" }, + { "ng-umds", { NULL }, 1690, "udp" }, + { "empire-empuma", { NULL }, 1691, "tcp" }, + { "empire-empuma", { NULL }, 1691, "udp" }, + { "sstsys-lm", { NULL }, 1692, "tcp" }, + { "sstsys-lm", { NULL }, 1692, "udp" }, + { "rrirtr", { NULL }, 1693, "tcp" }, + { "rrirtr", { NULL }, 1693, "udp" }, + { "rrimwm", { NULL }, 1694, "tcp" }, + { "rrimwm", { NULL }, 1694, "udp" }, + { "rrilwm", { NULL }, 1695, "tcp" }, + { "rrilwm", { NULL }, 1695, "udp" }, + { "rrifmm", { NULL }, 1696, "tcp" }, + { "rrifmm", { NULL }, 1696, "udp" }, + { "rrisat", { NULL }, 1697, "tcp" }, + { "rrisat", { NULL }, 1697, "udp" }, + { "rsvp-encap-1", { NULL }, 1698, "tcp" }, + { "rsvp-encap-1", { NULL }, 1698, "udp" }, + { "rsvp-encap-2", { NULL }, 1699, "tcp" }, + { "rsvp-encap-2", { NULL }, 1699, "udp" }, + { "mps-raft", { NULL }, 1700, "tcp" }, + { "mps-raft", { NULL }, 1700, "udp" }, + { "l2f", { NULL }, 1701, "tcp" }, + { "l2f", { NULL }, 1701, "udp" }, + { "l2tp", { NULL }, 1701, "tcp" }, + { "l2tp", { NULL }, 1701, "udp" }, + { "deskshare", { NULL }, 1702, "tcp" }, + { "deskshare", { NULL }, 1702, "udp" }, + { "hb-engine", { NULL }, 1703, "tcp" }, + { "hb-engine", { NULL }, 1703, "udp" }, + { "bcs-broker", { NULL }, 1704, "tcp" }, + { "bcs-broker", { NULL }, 1704, "udp" }, + { "slingshot", { NULL }, 1705, "tcp" }, + { "slingshot", { NULL }, 1705, "udp" }, + { "jetform", { NULL }, 1706, "tcp" }, + { "jetform", { NULL }, 1706, "udp" }, + { "vdmplay", { NULL }, 1707, "tcp" }, + { "vdmplay", { NULL }, 1707, "udp" }, + { "gat-lmd", { NULL }, 1708, "tcp" }, + { "gat-lmd", { NULL }, 1708, "udp" }, + { "centra", { NULL }, 1709, "tcp" }, + { "centra", { NULL }, 1709, "udp" }, + { "impera", { NULL }, 1710, "tcp" }, + { "impera", { NULL }, 1710, "udp" }, + { "pptconference", { NULL }, 1711, "tcp" }, + { "pptconference", { NULL }, 1711, "udp" }, + { "registrar", { NULL }, 1712, "tcp" }, + { "registrar", { NULL }, 1712, "udp" }, + { "conferencetalk", { NULL }, 1713, "tcp" }, + { "conferencetalk", { NULL }, 1713, "udp" }, + { "sesi-lm", { NULL }, 1714, "tcp" }, + { "sesi-lm", { NULL }, 1714, "udp" }, + { "houdini-lm", { NULL }, 1715, "tcp" }, + { "houdini-lm", { NULL }, 1715, "udp" }, + { "xmsg", { NULL }, 1716, "tcp" }, + { "xmsg", { NULL }, 1716, "udp" }, + { "fj-hdnet", { NULL }, 1717, "tcp" }, + { "fj-hdnet", { NULL }, 1717, "udp" }, + { "h323gatedisc", { NULL }, 1718, "tcp" }, + { "h323gatedisc", { NULL }, 1718, "udp" }, + { "h323gatestat", { NULL }, 1719, "tcp" }, + { "h323gatestat", { NULL }, 1719, "udp" }, + { "h323hostcall", { NULL }, 1720, "tcp" }, + { "h323hostcall", { NULL }, 1720, "udp" }, + { "caicci", { NULL }, 1721, "tcp" }, + { "caicci", { NULL }, 1721, "udp" }, + { "hks-lm", { NULL }, 1722, "tcp" }, + { "hks-lm", { NULL }, 1722, "udp" }, + { "pptp", { NULL }, 1723, "tcp" }, + { "pptp", { NULL }, 1723, "udp" }, + { "csbphonemaster", { NULL }, 1724, "tcp" }, + { "csbphonemaster", { NULL }, 1724, "udp" }, + { "iden-ralp", { NULL }, 1725, "tcp" }, + { "iden-ralp", { NULL }, 1725, "udp" }, + { "iberiagames", { NULL }, 1726, "tcp" }, + { "iberiagames", { NULL }, 1726, "udp" }, + { "winddx", { NULL }, 1727, "tcp" }, + { "winddx", { NULL }, 1727, "udp" }, + { "telindus", { NULL }, 1728, "tcp" }, + { "telindus", { NULL }, 1728, "udp" }, + { "citynl", { NULL }, 1729, "tcp" }, + { "citynl", { NULL }, 1729, "udp" }, + { "roketz", { NULL }, 1730, "tcp" }, + { "roketz", { NULL }, 1730, "udp" }, + { "msiccp", { NULL }, 1731, "tcp" }, + { "msiccp", { NULL }, 1731, "udp" }, + { "proxim", { NULL }, 1732, "tcp" }, + { "proxim", { NULL }, 1732, "udp" }, + { "siipat", { NULL }, 1733, "tcp" }, + { "siipat", { NULL }, 1733, "udp" }, + { "cambertx-lm", { NULL }, 1734, "tcp" }, + { "cambertx-lm", { NULL }, 1734, "udp" }, + { "privatechat", { NULL }, 1735, "tcp" }, + { "privatechat", { NULL }, 1735, "udp" }, + { "street-stream", { NULL }, 1736, "tcp" }, + { "street-stream", { NULL }, 1736, "udp" }, + { "ultimad", { NULL }, 1737, "tcp" }, + { "ultimad", { NULL }, 1737, "udp" }, + { "gamegen1", { NULL }, 1738, "tcp" }, + { "gamegen1", { NULL }, 1738, "udp" }, + { "webaccess", { NULL }, 1739, "tcp" }, + { "webaccess", { NULL }, 1739, "udp" }, + { "encore", { NULL }, 1740, "tcp" }, + { "encore", { NULL }, 1740, "udp" }, + { "cisco-net-mgmt", { NULL }, 1741, "tcp" }, + { "cisco-net-mgmt", { NULL }, 1741, "udp" }, + { "3Com-nsd", { NULL }, 1742, "tcp" }, + { "3Com-nsd", { NULL }, 1742, "udp" }, + { "cinegrfx-lm", { NULL }, 1743, "tcp" }, + { "cinegrfx-lm", { NULL }, 1743, "udp" }, + { "ncpm-ft", { NULL }, 1744, "tcp" }, + { "ncpm-ft", { NULL }, 1744, "udp" }, + { "remote-winsock", { NULL }, 1745, "tcp" }, + { "remote-winsock", { NULL }, 1745, "udp" }, + { "ftrapid-1", { NULL }, 1746, "tcp" }, + { "ftrapid-1", { NULL }, 1746, "udp" }, + { "ftrapid-2", { NULL }, 1747, "tcp" }, + { "ftrapid-2", { NULL }, 1747, "udp" }, + { "oracle-em1", { NULL }, 1748, "tcp" }, + { "oracle-em1", { NULL }, 1748, "udp" }, + { "aspen-services", { NULL }, 1749, "tcp" }, + { "aspen-services", { NULL }, 1749, "udp" }, + { "sslp", { NULL }, 1750, "tcp" }, + { "sslp", { NULL }, 1750, "udp" }, + { "swiftnet", { NULL }, 1751, "tcp" }, + { "swiftnet", { NULL }, 1751, "udp" }, + { "lofr-lm", { NULL }, 1752, "tcp" }, + { "lofr-lm", { NULL }, 1752, "udp" }, + { "oracle-em2", { NULL }, 1754, "tcp" }, + { "oracle-em2", { NULL }, 1754, "udp" }, + { "ms-streaming", { NULL }, 1755, "tcp" }, + { "ms-streaming", { NULL }, 1755, "udp" }, + { "capfast-lmd", { NULL }, 1756, "tcp" }, + { "capfast-lmd", { NULL }, 1756, "udp" }, + { "cnhrp", { NULL }, 1757, "tcp" }, + { "cnhrp", { NULL }, 1757, "udp" }, + { "tftp-mcast", { NULL }, 1758, "tcp" }, + { "tftp-mcast", { NULL }, 1758, "udp" }, + { "spss-lm", { NULL }, 1759, "tcp" }, + { "spss-lm", { NULL }, 1759, "udp" }, + { "www-ldap-gw", { NULL }, 1760, "tcp" }, + { "www-ldap-gw", { NULL }, 1760, "udp" }, + { "cft-0", { NULL }, 1761, "tcp" }, + { "cft-0", { NULL }, 1761, "udp" }, + { "cft-1", { NULL }, 1762, "tcp" }, + { "cft-1", { NULL }, 1762, "udp" }, + { "cft-2", { NULL }, 1763, "tcp" }, + { "cft-2", { NULL }, 1763, "udp" }, + { "cft-3", { NULL }, 1764, "tcp" }, + { "cft-3", { NULL }, 1764, "udp" }, + { "cft-4", { NULL }, 1765, "tcp" }, + { "cft-4", { NULL }, 1765, "udp" }, + { "cft-5", { NULL }, 1766, "tcp" }, + { "cft-5", { NULL }, 1766, "udp" }, + { "cft-6", { NULL }, 1767, "tcp" }, + { "cft-6", { NULL }, 1767, "udp" }, + { "cft-7", { NULL }, 1768, "tcp" }, + { "cft-7", { NULL }, 1768, "udp" }, + { "bmc-net-adm", { NULL }, 1769, "tcp" }, + { "bmc-net-adm", { NULL }, 1769, "udp" }, + { "bmc-net-svc", { NULL }, 1770, "tcp" }, + { "bmc-net-svc", { NULL }, 1770, "udp" }, + { "vaultbase", { NULL }, 1771, "tcp" }, + { "vaultbase", { NULL }, 1771, "udp" }, + { "essweb-gw", { NULL }, 1772, "tcp" }, + { "essweb-gw", { NULL }, 1772, "udp" }, + { "kmscontrol", { NULL }, 1773, "tcp" }, + { "kmscontrol", { NULL }, 1773, "udp" }, + { "global-dtserv", { NULL }, 1774, "tcp" }, + { "global-dtserv", { NULL }, 1774, "udp" }, + { "femis", { NULL }, 1776, "tcp" }, + { "femis", { NULL }, 1776, "udp" }, + { "powerguardian", { NULL }, 1777, "tcp" }, + { "powerguardian", { NULL }, 1777, "udp" }, + { "prodigy-intrnet", { NULL }, 1778, "tcp" }, + { "prodigy-intrnet", { NULL }, 1778, "udp" }, + { "pharmasoft", { NULL }, 1779, "tcp" }, + { "pharmasoft", { NULL }, 1779, "udp" }, + { "dpkeyserv", { NULL }, 1780, "tcp" }, + { "dpkeyserv", { NULL }, 1780, "udp" }, + { "answersoft-lm", { NULL }, 1781, "tcp" }, + { "answersoft-lm", { NULL }, 1781, "udp" }, + { "hp-hcip", { NULL }, 1782, "tcp" }, + { "hp-hcip", { NULL }, 1782, "udp" }, + { "finle-lm", { NULL }, 1784, "tcp" }, + { "finle-lm", { NULL }, 1784, "udp" }, + { "windlm", { NULL }, 1785, "tcp" }, + { "windlm", { NULL }, 1785, "udp" }, + { "funk-logger", { NULL }, 1786, "tcp" }, + { "funk-logger", { NULL }, 1786, "udp" }, + { "funk-license", { NULL }, 1787, "tcp" }, + { "funk-license", { NULL }, 1787, "udp" }, + { "psmond", { NULL }, 1788, "tcp" }, + { "psmond", { NULL }, 1788, "udp" }, + { "hello", { NULL }, 1789, "tcp" }, + { "hello", { NULL }, 1789, "udp" }, + { "nmsp", { NULL }, 1790, "tcp" }, + { "nmsp", { NULL }, 1790, "udp" }, + { "ea1", { NULL }, 1791, "tcp" }, + { "ea1", { NULL }, 1791, "udp" }, + { "ibm-dt-2", { NULL }, 1792, "tcp" }, + { "ibm-dt-2", { NULL }, 1792, "udp" }, + { "rsc-robot", { NULL }, 1793, "tcp" }, + { "rsc-robot", { NULL }, 1793, "udp" }, + { "cera-bcm", { NULL }, 1794, "tcp" }, + { "cera-bcm", { NULL }, 1794, "udp" }, + { "dpi-proxy", { NULL }, 1795, "tcp" }, + { "dpi-proxy", { NULL }, 1795, "udp" }, + { "vocaltec-admin", { NULL }, 1796, "tcp" }, + { "vocaltec-admin", { NULL }, 1796, "udp" }, + { "uma", { NULL }, 1797, "tcp" }, + { "uma", { NULL }, 1797, "udp" }, + { "etp", { NULL }, 1798, "tcp" }, + { "etp", { NULL }, 1798, "udp" }, + { "netrisk", { NULL }, 1799, "tcp" }, + { "netrisk", { NULL }, 1799, "udp" }, + { "ansys-lm", { NULL }, 1800, "tcp" }, + { "ansys-lm", { NULL }, 1800, "udp" }, + { "msmq", { NULL }, 1801, "tcp" }, + { "msmq", { NULL }, 1801, "udp" }, + { "concomp1", { NULL }, 1802, "tcp" }, + { "concomp1", { NULL }, 1802, "udp" }, + { "hp-hcip-gwy", { NULL }, 1803, "tcp" }, + { "hp-hcip-gwy", { NULL }, 1803, "udp" }, + { "enl", { NULL }, 1804, "tcp" }, + { "enl", { NULL }, 1804, "udp" }, + { "enl-name", { NULL }, 1805, "tcp" }, + { "enl-name", { NULL }, 1805, "udp" }, + { "musiconline", { NULL }, 1806, "tcp" }, + { "musiconline", { NULL }, 1806, "udp" }, + { "fhsp", { NULL }, 1807, "tcp" }, + { "fhsp", { NULL }, 1807, "udp" }, + { "oracle-vp2", { NULL }, 1808, "tcp" }, + { "oracle-vp2", { NULL }, 1808, "udp" }, + { "oracle-vp1", { NULL }, 1809, "tcp" }, + { "oracle-vp1", { NULL }, 1809, "udp" }, + { "jerand-lm", { NULL }, 1810, "tcp" }, + { "jerand-lm", { NULL }, 1810, "udp" }, + { "scientia-sdb", { NULL }, 1811, "tcp" }, + { "scientia-sdb", { NULL }, 1811, "udp" }, + { "radius", { NULL }, 1812, "tcp" }, + { "radius", { NULL }, 1812, "udp" }, + { "radius-acct", { NULL }, 1813, "tcp" }, + { "radius-acct", { NULL }, 1813, "udp" }, + { "tdp-suite", { NULL }, 1814, "tcp" }, + { "tdp-suite", { NULL }, 1814, "udp" }, + { "mmpft", { NULL }, 1815, "tcp" }, + { "mmpft", { NULL }, 1815, "udp" }, + { "harp", { NULL }, 1816, "tcp" }, + { "harp", { NULL }, 1816, "udp" }, + { "rkb-oscs", { NULL }, 1817, "tcp" }, + { "rkb-oscs", { NULL }, 1817, "udp" }, + { "etftp", { NULL }, 1818, "tcp" }, + { "etftp", { NULL }, 1818, "udp" }, + { "plato-lm", { NULL }, 1819, "tcp" }, + { "plato-lm", { NULL }, 1819, "udp" }, + { "mcagent", { NULL }, 1820, "tcp" }, + { "mcagent", { NULL }, 1820, "udp" }, + { "donnyworld", { NULL }, 1821, "tcp" }, + { "donnyworld", { NULL }, 1821, "udp" }, + { "es-elmd", { NULL }, 1822, "tcp" }, + { "es-elmd", { NULL }, 1822, "udp" }, + { "unisys-lm", { NULL }, 1823, "tcp" }, + { "unisys-lm", { NULL }, 1823, "udp" }, + { "metrics-pas", { NULL }, 1824, "tcp" }, + { "metrics-pas", { NULL }, 1824, "udp" }, + { "direcpc-video", { NULL }, 1825, "tcp" }, + { "direcpc-video", { NULL }, 1825, "udp" }, + { "ardt", { NULL }, 1826, "tcp" }, + { "ardt", { NULL }, 1826, "udp" }, + { "asi", { NULL }, 1827, "tcp" }, + { "asi", { NULL }, 1827, "udp" }, + { "itm-mcell-u", { NULL }, 1828, "tcp" }, + { "itm-mcell-u", { NULL }, 1828, "udp" }, + { "optika-emedia", { NULL }, 1829, "tcp" }, + { "optika-emedia", { NULL }, 1829, "udp" }, + { "net8-cman", { NULL }, 1830, "tcp" }, + { "net8-cman", { NULL }, 1830, "udp" }, + { "myrtle", { NULL }, 1831, "tcp" }, + { "myrtle", { NULL }, 1831, "udp" }, + { "tht-treasure", { NULL }, 1832, "tcp" }, + { "tht-treasure", { NULL }, 1832, "udp" }, + { "udpradio", { NULL }, 1833, "tcp" }, + { "udpradio", { NULL }, 1833, "udp" }, + { "ardusuni", { NULL }, 1834, "tcp" }, + { "ardusuni", { NULL }, 1834, "udp" }, + { "ardusmul", { NULL }, 1835, "tcp" }, + { "ardusmul", { NULL }, 1835, "udp" }, + { "ste-smsc", { NULL }, 1836, "tcp" }, + { "ste-smsc", { NULL }, 1836, "udp" }, + { "csoft1", { NULL }, 1837, "tcp" }, + { "csoft1", { NULL }, 1837, "udp" }, + { "talnet", { NULL }, 1838, "tcp" }, + { "talnet", { NULL }, 1838, "udp" }, + { "netopia-vo1", { NULL }, 1839, "tcp" }, + { "netopia-vo1", { NULL }, 1839, "udp" }, + { "netopia-vo2", { NULL }, 1840, "tcp" }, + { "netopia-vo2", { NULL }, 1840, "udp" }, + { "netopia-vo3", { NULL }, 1841, "tcp" }, + { "netopia-vo3", { NULL }, 1841, "udp" }, + { "netopia-vo4", { NULL }, 1842, "tcp" }, + { "netopia-vo4", { NULL }, 1842, "udp" }, + { "netopia-vo5", { NULL }, 1843, "tcp" }, + { "netopia-vo5", { NULL }, 1843, "udp" }, + { "direcpc-dll", { NULL }, 1844, "tcp" }, + { "direcpc-dll", { NULL }, 1844, "udp" }, + { "altalink", { NULL }, 1845, "tcp" }, + { "altalink", { NULL }, 1845, "udp" }, + { "tunstall-pnc", { NULL }, 1846, "tcp" }, + { "tunstall-pnc", { NULL }, 1846, "udp" }, + { "slp-notify", { NULL }, 1847, "tcp" }, + { "slp-notify", { NULL }, 1847, "udp" }, + { "fjdocdist", { NULL }, 1848, "tcp" }, + { "fjdocdist", { NULL }, 1848, "udp" }, + { "alpha-sms", { NULL }, 1849, "tcp" }, + { "alpha-sms", { NULL }, 1849, "udp" }, + { "gsi", { NULL }, 1850, "tcp" }, + { "gsi", { NULL }, 1850, "udp" }, + { "ctcd", { NULL }, 1851, "tcp" }, + { "ctcd", { NULL }, 1851, "udp" }, + { "virtual-time", { NULL }, 1852, "tcp" }, + { "virtual-time", { NULL }, 1852, "udp" }, + { "vids-avtp", { NULL }, 1853, "tcp" }, + { "vids-avtp", { NULL }, 1853, "udp" }, + { "buddy-draw", { NULL }, 1854, "tcp" }, + { "buddy-draw", { NULL }, 1854, "udp" }, + { "fiorano-rtrsvc", { NULL }, 1855, "tcp" }, + { "fiorano-rtrsvc", { NULL }, 1855, "udp" }, + { "fiorano-msgsvc", { NULL }, 1856, "tcp" }, + { "fiorano-msgsvc", { NULL }, 1856, "udp" }, + { "datacaptor", { NULL }, 1857, "tcp" }, + { "datacaptor", { NULL }, 1857, "udp" }, + { "privateark", { NULL }, 1858, "tcp" }, + { "privateark", { NULL }, 1858, "udp" }, + { "gammafetchsvr", { NULL }, 1859, "tcp" }, + { "gammafetchsvr", { NULL }, 1859, "udp" }, + { "sunscalar-svc", { NULL }, 1860, "tcp" }, + { "sunscalar-svc", { NULL }, 1860, "udp" }, + { "lecroy-vicp", { NULL }, 1861, "tcp" }, + { "lecroy-vicp", { NULL }, 1861, "udp" }, + { "mysql-cm-agent", { NULL }, 1862, "tcp" }, + { "mysql-cm-agent", { NULL }, 1862, "udp" }, + { "msnp", { NULL }, 1863, "tcp" }, + { "msnp", { NULL }, 1863, "udp" }, + { "paradym-31port", { NULL }, 1864, "tcp" }, + { "paradym-31port", { NULL }, 1864, "udp" }, + { "entp", { NULL }, 1865, "tcp" }, + { "entp", { NULL }, 1865, "udp" }, + { "swrmi", { NULL }, 1866, "tcp" }, + { "swrmi", { NULL }, 1866, "udp" }, + { "udrive", { NULL }, 1867, "tcp" }, + { "udrive", { NULL }, 1867, "udp" }, + { "viziblebrowser", { NULL }, 1868, "tcp" }, + { "viziblebrowser", { NULL }, 1868, "udp" }, + { "transact", { NULL }, 1869, "tcp" }, + { "transact", { NULL }, 1869, "udp" }, + { "sunscalar-dns", { NULL }, 1870, "tcp" }, + { "sunscalar-dns", { NULL }, 1870, "udp" }, + { "canocentral0", { NULL }, 1871, "tcp" }, + { "canocentral0", { NULL }, 1871, "udp" }, + { "canocentral1", { NULL }, 1872, "tcp" }, + { "canocentral1", { NULL }, 1872, "udp" }, + { "fjmpjps", { NULL }, 1873, "tcp" }, + { "fjmpjps", { NULL }, 1873, "udp" }, + { "fjswapsnp", { NULL }, 1874, "tcp" }, + { "fjswapsnp", { NULL }, 1874, "udp" }, + { "westell-stats", { NULL }, 1875, "tcp" }, + { "westell-stats", { NULL }, 1875, "udp" }, + { "ewcappsrv", { NULL }, 1876, "tcp" }, + { "ewcappsrv", { NULL }, 1876, "udp" }, + { "hp-webqosdb", { NULL }, 1877, "tcp" }, + { "hp-webqosdb", { NULL }, 1877, "udp" }, + { "drmsmc", { NULL }, 1878, "tcp" }, + { "drmsmc", { NULL }, 1878, "udp" }, + { "nettgain-nms", { NULL }, 1879, "tcp" }, + { "nettgain-nms", { NULL }, 1879, "udp" }, + { "vsat-control", { NULL }, 1880, "tcp" }, + { "vsat-control", { NULL }, 1880, "udp" }, + { "ibm-mqseries2", { NULL }, 1881, "tcp" }, + { "ibm-mqseries2", { NULL }, 1881, "udp" }, + { "ecsqdmn", { NULL }, 1882, "tcp" }, + { "ecsqdmn", { NULL }, 1882, "udp" }, + { "ibm-mqisdp", { NULL }, 1883, "tcp" }, + { "ibm-mqisdp", { NULL }, 1883, "udp" }, + { "idmaps", { NULL }, 1884, "tcp" }, + { "idmaps", { NULL }, 1884, "udp" }, + { "vrtstrapserver", { NULL }, 1885, "tcp" }, + { "vrtstrapserver", { NULL }, 1885, "udp" }, + { "leoip", { NULL }, 1886, "tcp" }, + { "leoip", { NULL }, 1886, "udp" }, + { "filex-lport", { NULL }, 1887, "tcp" }, + { "filex-lport", { NULL }, 1887, "udp" }, + { "ncconfig", { NULL }, 1888, "tcp" }, + { "ncconfig", { NULL }, 1888, "udp" }, + { "unify-adapter", { NULL }, 1889, "tcp" }, + { "unify-adapter", { NULL }, 1889, "udp" }, + { "wilkenlistener", { NULL }, 1890, "tcp" }, + { "wilkenlistener", { NULL }, 1890, "udp" }, + { "childkey-notif", { NULL }, 1891, "tcp" }, + { "childkey-notif", { NULL }, 1891, "udp" }, + { "childkey-ctrl", { NULL }, 1892, "tcp" }, + { "childkey-ctrl", { NULL }, 1892, "udp" }, + { "elad", { NULL }, 1893, "tcp" }, + { "elad", { NULL }, 1893, "udp" }, + { "o2server-port", { NULL }, 1894, "tcp" }, + { "o2server-port", { NULL }, 1894, "udp" }, + { "b-novative-ls", { NULL }, 1896, "tcp" }, + { "b-novative-ls", { NULL }, 1896, "udp" }, + { "metaagent", { NULL }, 1897, "tcp" }, + { "metaagent", { NULL }, 1897, "udp" }, + { "cymtec-port", { NULL }, 1898, "tcp" }, + { "cymtec-port", { NULL }, 1898, "udp" }, + { "mc2studios", { NULL }, 1899, "tcp" }, + { "mc2studios", { NULL }, 1899, "udp" }, + { "ssdp", { NULL }, 1900, "tcp" }, + { "ssdp", { NULL }, 1900, "udp" }, + { "fjicl-tep-a", { NULL }, 1901, "tcp" }, + { "fjicl-tep-a", { NULL }, 1901, "udp" }, + { "fjicl-tep-b", { NULL }, 1902, "tcp" }, + { "fjicl-tep-b", { NULL }, 1902, "udp" }, + { "linkname", { NULL }, 1903, "tcp" }, + { "linkname", { NULL }, 1903, "udp" }, + { "fjicl-tep-c", { NULL }, 1904, "tcp" }, + { "fjicl-tep-c", { NULL }, 1904, "udp" }, + { "sugp", { NULL }, 1905, "tcp" }, + { "sugp", { NULL }, 1905, "udp" }, + { "tpmd", { NULL }, 1906, "tcp" }, + { "tpmd", { NULL }, 1906, "udp" }, + { "intrastar", { NULL }, 1907, "tcp" }, + { "intrastar", { NULL }, 1907, "udp" }, + { "dawn", { NULL }, 1908, "tcp" }, + { "dawn", { NULL }, 1908, "udp" }, + { "global-wlink", { NULL }, 1909, "tcp" }, + { "global-wlink", { NULL }, 1909, "udp" }, + { "ultrabac", { NULL }, 1910, "tcp" }, + { "ultrabac", { NULL }, 1910, "udp" }, + { "mtp", { NULL }, 1911, "tcp" }, + { "mtp", { NULL }, 1911, "udp" }, + { "rhp-iibp", { NULL }, 1912, "tcp" }, + { "rhp-iibp", { NULL }, 1912, "udp" }, + { "armadp", { NULL }, 1913, "tcp" }, + { "armadp", { NULL }, 1913, "udp" }, + { "elm-momentum", { NULL }, 1914, "tcp" }, + { "elm-momentum", { NULL }, 1914, "udp" }, + { "facelink", { NULL }, 1915, "tcp" }, + { "facelink", { NULL }, 1915, "udp" }, + { "persona", { NULL }, 1916, "tcp" }, + { "persona", { NULL }, 1916, "udp" }, + { "noagent", { NULL }, 1917, "tcp" }, + { "noagent", { NULL }, 1917, "udp" }, + { "can-nds", { NULL }, 1918, "tcp" }, + { "can-nds", { NULL }, 1918, "udp" }, + { "can-dch", { NULL }, 1919, "tcp" }, + { "can-dch", { NULL }, 1919, "udp" }, + { "can-ferret", { NULL }, 1920, "tcp" }, + { "can-ferret", { NULL }, 1920, "udp" }, + { "noadmin", { NULL }, 1921, "tcp" }, + { "noadmin", { NULL }, 1921, "udp" }, + { "tapestry", { NULL }, 1922, "tcp" }, + { "tapestry", { NULL }, 1922, "udp" }, + { "spice", { NULL }, 1923, "tcp" }, + { "spice", { NULL }, 1923, "udp" }, + { "xiip", { NULL }, 1924, "tcp" }, + { "xiip", { NULL }, 1924, "udp" }, + { "discovery-port", { NULL }, 1925, "tcp" }, + { "discovery-port", { NULL }, 1925, "udp" }, + { "egs", { NULL }, 1926, "tcp" }, + { "egs", { NULL }, 1926, "udp" }, + { "videte-cipc", { NULL }, 1927, "tcp" }, + { "videte-cipc", { NULL }, 1927, "udp" }, + { "emsd-port", { NULL }, 1928, "tcp" }, + { "emsd-port", { NULL }, 1928, "udp" }, + { "bandwiz-system", { NULL }, 1929, "tcp" }, + { "bandwiz-system", { NULL }, 1929, "udp" }, + { "driveappserver", { NULL }, 1930, "tcp" }, + { "driveappserver", { NULL }, 1930, "udp" }, + { "amdsched", { NULL }, 1931, "tcp" }, + { "amdsched", { NULL }, 1931, "udp" }, + { "ctt-broker", { NULL }, 1932, "tcp" }, + { "ctt-broker", { NULL }, 1932, "udp" }, + { "xmapi", { NULL }, 1933, "tcp" }, + { "xmapi", { NULL }, 1933, "udp" }, + { "xaapi", { NULL }, 1934, "tcp" }, + { "xaapi", { NULL }, 1934, "udp" }, + { "macromedia-fcs", { NULL }, 1935, "tcp" }, + { "macromedia-fcs", { NULL }, 1935, "udp" }, + { "jetcmeserver", { NULL }, 1936, "tcp" }, + { "jetcmeserver", { NULL }, 1936, "udp" }, + { "jwserver", { NULL }, 1937, "tcp" }, + { "jwserver", { NULL }, 1937, "udp" }, + { "jwclient", { NULL }, 1938, "tcp" }, + { "jwclient", { NULL }, 1938, "udp" }, + { "jvserver", { NULL }, 1939, "tcp" }, + { "jvserver", { NULL }, 1939, "udp" }, + { "jvclient", { NULL }, 1940, "tcp" }, + { "jvclient", { NULL }, 1940, "udp" }, + { "dic-aida", { NULL }, 1941, "tcp" }, + { "dic-aida", { NULL }, 1941, "udp" }, + { "res", { NULL }, 1942, "tcp" }, + { "res", { NULL }, 1942, "udp" }, + { "beeyond-media", { NULL }, 1943, "tcp" }, + { "beeyond-media", { NULL }, 1943, "udp" }, + { "close-combat", { NULL }, 1944, "tcp" }, + { "close-combat", { NULL }, 1944, "udp" }, + { "dialogic-elmd", { NULL }, 1945, "tcp" }, + { "dialogic-elmd", { NULL }, 1945, "udp" }, + { "tekpls", { NULL }, 1946, "tcp" }, + { "tekpls", { NULL }, 1946, "udp" }, + { "sentinelsrm", { NULL }, 1947, "tcp" }, + { "sentinelsrm", { NULL }, 1947, "udp" }, + { "eye2eye", { NULL }, 1948, "tcp" }, + { "eye2eye", { NULL }, 1948, "udp" }, + { "ismaeasdaqlive", { NULL }, 1949, "tcp" }, + { "ismaeasdaqlive", { NULL }, 1949, "udp" }, + { "ismaeasdaqtest", { NULL }, 1950, "tcp" }, + { "ismaeasdaqtest", { NULL }, 1950, "udp" }, + { "bcs-lmserver", { NULL }, 1951, "tcp" }, + { "bcs-lmserver", { NULL }, 1951, "udp" }, + { "mpnjsc", { NULL }, 1952, "tcp" }, + { "mpnjsc", { NULL }, 1952, "udp" }, + { "rapidbase", { NULL }, 1953, "tcp" }, + { "rapidbase", { NULL }, 1953, "udp" }, + { "abr-api", { NULL }, 1954, "tcp" }, + { "abr-api", { NULL }, 1954, "udp" }, + { "abr-secure", { NULL }, 1955, "tcp" }, + { "abr-secure", { NULL }, 1955, "udp" }, + { "vrtl-vmf-ds", { NULL }, 1956, "tcp" }, + { "vrtl-vmf-ds", { NULL }, 1956, "udp" }, + { "unix-status", { NULL }, 1957, "tcp" }, + { "unix-status", { NULL }, 1957, "udp" }, + { "dxadmind", { NULL }, 1958, "tcp" }, + { "dxadmind", { NULL }, 1958, "udp" }, + { "simp-all", { NULL }, 1959, "tcp" }, + { "simp-all", { NULL }, 1959, "udp" }, + { "nasmanager", { NULL }, 1960, "tcp" }, + { "nasmanager", { NULL }, 1960, "udp" }, + { "bts-appserver", { NULL }, 1961, "tcp" }, + { "bts-appserver", { NULL }, 1961, "udp" }, + { "biap-mp", { NULL }, 1962, "tcp" }, + { "biap-mp", { NULL }, 1962, "udp" }, + { "webmachine", { NULL }, 1963, "tcp" }, + { "webmachine", { NULL }, 1963, "udp" }, + { "solid-e-engine", { NULL }, 1964, "tcp" }, + { "solid-e-engine", { NULL }, 1964, "udp" }, + { "tivoli-npm", { NULL }, 1965, "tcp" }, + { "tivoli-npm", { NULL }, 1965, "udp" }, + { "slush", { NULL }, 1966, "tcp" }, + { "slush", { NULL }, 1966, "udp" }, + { "sns-quote", { NULL }, 1967, "tcp" }, + { "sns-quote", { NULL }, 1967, "udp" }, + { "lipsinc", { NULL }, 1968, "tcp" }, + { "lipsinc", { NULL }, 1968, "udp" }, + { "lipsinc1", { NULL }, 1969, "tcp" }, + { "lipsinc1", { NULL }, 1969, "udp" }, + { "netop-rc", { NULL }, 1970, "tcp" }, + { "netop-rc", { NULL }, 1970, "udp" }, + { "netop-school", { NULL }, 1971, "tcp" }, + { "netop-school", { NULL }, 1971, "udp" }, + { "intersys-cache", { NULL }, 1972, "tcp" }, + { "intersys-cache", { NULL }, 1972, "udp" }, + { "dlsrap", { NULL }, 1973, "tcp" }, + { "dlsrap", { NULL }, 1973, "udp" }, + { "drp", { NULL }, 1974, "tcp" }, + { "drp", { NULL }, 1974, "udp" }, + { "tcoflashagent", { NULL }, 1975, "tcp" }, + { "tcoflashagent", { NULL }, 1975, "udp" }, + { "tcoregagent", { NULL }, 1976, "tcp" }, + { "tcoregagent", { NULL }, 1976, "udp" }, + { "tcoaddressbook", { NULL }, 1977, "tcp" }, + { "tcoaddressbook", { NULL }, 1977, "udp" }, + { "unisql", { NULL }, 1978, "tcp" }, + { "unisql", { NULL }, 1978, "udp" }, + { "unisql-java", { NULL }, 1979, "tcp" }, + { "unisql-java", { NULL }, 1979, "udp" }, + { "pearldoc-xact", { NULL }, 1980, "tcp" }, + { "pearldoc-xact", { NULL }, 1980, "udp" }, + { "p2pq", { NULL }, 1981, "tcp" }, + { "p2pq", { NULL }, 1981, "udp" }, + { "estamp", { NULL }, 1982, "tcp" }, + { "estamp", { NULL }, 1982, "udp" }, + { "lhtp", { NULL }, 1983, "tcp" }, + { "lhtp", { NULL }, 1983, "udp" }, + { "bb", { NULL }, 1984, "tcp" }, + { "bb", { NULL }, 1984, "udp" }, + { "hsrp", { NULL }, 1985, "tcp" }, + { "hsrp", { NULL }, 1985, "udp" }, + { "licensedaemon", { NULL }, 1986, "tcp" }, + { "licensedaemon", { NULL }, 1986, "udp" }, + { "tr-rsrb-p1", { NULL }, 1987, "tcp" }, + { "tr-rsrb-p1", { NULL }, 1987, "udp" }, + { "tr-rsrb-p2", { NULL }, 1988, "tcp" }, + { "tr-rsrb-p2", { NULL }, 1988, "udp" }, + { "tr-rsrb-p3", { NULL }, 1989, "tcp" }, + { "tr-rsrb-p3", { NULL }, 1989, "udp" }, + { "mshnet", { NULL }, 1989, "tcp" }, + { "mshnet", { NULL }, 1989, "udp" }, + { "stun-p1", { NULL }, 1990, "tcp" }, + { "stun-p1", { NULL }, 1990, "udp" }, + { "stun-p2", { NULL }, 1991, "tcp" }, + { "stun-p2", { NULL }, 1991, "udp" }, + { "stun-p3", { NULL }, 1992, "tcp" }, + { "stun-p3", { NULL }, 1992, "udp" }, + { "ipsendmsg", { NULL }, 1992, "tcp" }, + { "ipsendmsg", { NULL }, 1992, "udp" }, + { "snmp-tcp-port", { NULL }, 1993, "tcp" }, + { "snmp-tcp-port", { NULL }, 1993, "udp" }, + { "stun-port", { NULL }, 1994, "tcp" }, + { "stun-port", { NULL }, 1994, "udp" }, + { "perf-port", { NULL }, 1995, "tcp" }, + { "perf-port", { NULL }, 1995, "udp" }, + { "tr-rsrb-port", { NULL }, 1996, "tcp" }, + { "tr-rsrb-port", { NULL }, 1996, "udp" }, + { "gdp-port", { NULL }, 1997, "tcp" }, + { "gdp-port", { NULL }, 1997, "udp" }, + { "x25-svc-port", { NULL }, 1998, "tcp" }, + { "x25-svc-port", { NULL }, 1998, "udp" }, + { "tcp-id-port", { NULL }, 1999, "tcp" }, + { "tcp-id-port", { NULL }, 1999, "udp" }, + { "cisco-sccp", { NULL }, 2000, "tcp" }, + { "cisco-sccp", { NULL }, 2000, "udp" }, + { "dc", { NULL }, 2001, "tcp" }, + { "wizard", { NULL }, 2001, "udp" }, + { "globe", { NULL }, 2002, "tcp" }, + { "globe", { NULL }, 2002, "udp" }, + { "brutus", { NULL }, 2003, "tcp" }, + { "brutus", { NULL }, 2003, "udp" }, + { "mailbox", { NULL }, 2004, "tcp" }, + { "emce", { NULL }, 2004, "udp" }, + { "berknet", { NULL }, 2005, "tcp" }, + { "oracle", { NULL }, 2005, "udp" }, + { "invokator", { NULL }, 2006, "tcp" }, + { "raid-cd", { NULL }, 2006, "udp" }, + { "dectalk", { NULL }, 2007, "tcp" }, + { "raid-am", { NULL }, 2007, "udp" }, + { "conf", { NULL }, 2008, "tcp" }, + { "terminaldb", { NULL }, 2008, "udp" }, + { "news", { NULL }, 2009, "tcp" }, + { "whosockami", { NULL }, 2009, "udp" }, + { "search", { NULL }, 2010, "tcp" }, + { "pipe_server", { NULL }, 2010, "udp" }, + { "raid-cc", { NULL }, 2011, "tcp" }, + { "servserv", { NULL }, 2011, "udp" }, + { "ttyinfo", { NULL }, 2012, "tcp" }, + { "raid-ac", { NULL }, 2012, "udp" }, + { "raid-am", { NULL }, 2013, "tcp" }, + { "raid-cd", { NULL }, 2013, "udp" }, + { "troff", { NULL }, 2014, "tcp" }, + { "raid-sf", { NULL }, 2014, "udp" }, + { "cypress", { NULL }, 2015, "tcp" }, + { "raid-cs", { NULL }, 2015, "udp" }, + { "bootserver", { NULL }, 2016, "tcp" }, + { "bootserver", { NULL }, 2016, "udp" }, + { "cypress-stat", { NULL }, 2017, "tcp" }, + { "bootclient", { NULL }, 2017, "udp" }, + { "terminaldb", { NULL }, 2018, "tcp" }, + { "rellpack", { NULL }, 2018, "udp" }, + { "whosockami", { NULL }, 2019, "tcp" }, + { "about", { NULL }, 2019, "udp" }, + { "xinupageserver", { NULL }, 2020, "tcp" }, + { "xinupageserver", { NULL }, 2020, "udp" }, + { "servexec", { NULL }, 2021, "tcp" }, + { "xinuexpansion1", { NULL }, 2021, "udp" }, + { "down", { NULL }, 2022, "tcp" }, + { "xinuexpansion2", { NULL }, 2022, "udp" }, + { "xinuexpansion3", { NULL }, 2023, "tcp" }, + { "xinuexpansion3", { NULL }, 2023, "udp" }, + { "xinuexpansion4", { NULL }, 2024, "tcp" }, + { "xinuexpansion4", { NULL }, 2024, "udp" }, + { "ellpack", { NULL }, 2025, "tcp" }, + { "xribs", { NULL }, 2025, "udp" }, + { "scrabble", { NULL }, 2026, "tcp" }, + { "scrabble", { NULL }, 2026, "udp" }, + { "shadowserver", { NULL }, 2027, "tcp" }, + { "shadowserver", { NULL }, 2027, "udp" }, + { "submitserver", { NULL }, 2028, "tcp" }, + { "submitserver", { NULL }, 2028, "udp" }, + { "hsrpv6", { NULL }, 2029, "tcp" }, + { "hsrpv6", { NULL }, 2029, "udp" }, + { "device2", { NULL }, 2030, "tcp" }, + { "device2", { NULL }, 2030, "udp" }, + { "mobrien-chat", { NULL }, 2031, "tcp" }, + { "mobrien-chat", { NULL }, 2031, "udp" }, + { "blackboard", { NULL }, 2032, "tcp" }, + { "blackboard", { NULL }, 2032, "udp" }, + { "glogger", { NULL }, 2033, "tcp" }, + { "glogger", { NULL }, 2033, "udp" }, + { "scoremgr", { NULL }, 2034, "tcp" }, + { "scoremgr", { NULL }, 2034, "udp" }, + { "imsldoc", { NULL }, 2035, "tcp" }, + { "imsldoc", { NULL }, 2035, "udp" }, + { "e-dpnet", { NULL }, 2036, "tcp" }, + { "e-dpnet", { NULL }, 2036, "udp" }, + { "applus", { NULL }, 2037, "tcp" }, + { "applus", { NULL }, 2037, "udp" }, + { "objectmanager", { NULL }, 2038, "tcp" }, + { "objectmanager", { NULL }, 2038, "udp" }, + { "prizma", { NULL }, 2039, "tcp" }, + { "prizma", { NULL }, 2039, "udp" }, + { "lam", { NULL }, 2040, "tcp" }, + { "lam", { NULL }, 2040, "udp" }, + { "interbase", { NULL }, 2041, "tcp" }, + { "interbase", { NULL }, 2041, "udp" }, + { "isis", { NULL }, 2042, "tcp" }, + { "isis", { NULL }, 2042, "udp" }, + { "isis-bcast", { NULL }, 2043, "tcp" }, + { "isis-bcast", { NULL }, 2043, "udp" }, + { "rimsl", { NULL }, 2044, "tcp" }, + { "rimsl", { NULL }, 2044, "udp" }, + { "cdfunc", { NULL }, 2045, "tcp" }, + { "cdfunc", { NULL }, 2045, "udp" }, + { "sdfunc", { NULL }, 2046, "tcp" }, + { "sdfunc", { NULL }, 2046, "udp" }, + { "dls", { NULL }, 2047, "tcp" }, + { "dls", { NULL }, 2047, "udp" }, + { "dls-monitor", { NULL }, 2048, "tcp" }, + { "dls-monitor", { NULL }, 2048, "udp" }, + { "shilp", { NULL }, 2049, "tcp" }, + { "shilp", { NULL }, 2049, "udp" }, + { "nfs", { NULL }, 2049, "tcp" }, + { "nfs", { NULL }, 2049, "udp" }, + { "nfs", { NULL }, 2049, "sctp"}, + { "av-emb-config", { NULL }, 2050, "tcp" }, + { "av-emb-config", { NULL }, 2050, "udp" }, + { "epnsdp", { NULL }, 2051, "tcp" }, + { "epnsdp", { NULL }, 2051, "udp" }, + { "clearvisn", { NULL }, 2052, "tcp" }, + { "clearvisn", { NULL }, 2052, "udp" }, + { "lot105-ds-upd", { NULL }, 2053, "tcp" }, + { "lot105-ds-upd", { NULL }, 2053, "udp" }, + { "weblogin", { NULL }, 2054, "tcp" }, + { "weblogin", { NULL }, 2054, "udp" }, + { "iop", { NULL }, 2055, "tcp" }, + { "iop", { NULL }, 2055, "udp" }, + { "omnisky", { NULL }, 2056, "tcp" }, + { "omnisky", { NULL }, 2056, "udp" }, + { "rich-cp", { NULL }, 2057, "tcp" }, + { "rich-cp", { NULL }, 2057, "udp" }, + { "newwavesearch", { NULL }, 2058, "tcp" }, + { "newwavesearch", { NULL }, 2058, "udp" }, + { "bmc-messaging", { NULL }, 2059, "tcp" }, + { "bmc-messaging", { NULL }, 2059, "udp" }, + { "teleniumdaemon", { NULL }, 2060, "tcp" }, + { "teleniumdaemon", { NULL }, 2060, "udp" }, + { "netmount", { NULL }, 2061, "tcp" }, + { "netmount", { NULL }, 2061, "udp" }, + { "icg-swp", { NULL }, 2062, "tcp" }, + { "icg-swp", { NULL }, 2062, "udp" }, + { "icg-bridge", { NULL }, 2063, "tcp" }, + { "icg-bridge", { NULL }, 2063, "udp" }, + { "icg-iprelay", { NULL }, 2064, "tcp" }, + { "icg-iprelay", { NULL }, 2064, "udp" }, + { "dlsrpn", { NULL }, 2065, "tcp" }, + { "dlsrpn", { NULL }, 2065, "udp" }, + { "aura", { NULL }, 2066, "tcp" }, + { "aura", { NULL }, 2066, "udp" }, + { "dlswpn", { NULL }, 2067, "tcp" }, + { "dlswpn", { NULL }, 2067, "udp" }, + { "avauthsrvprtcl", { NULL }, 2068, "tcp" }, + { "avauthsrvprtcl", { NULL }, 2068, "udp" }, + { "event-port", { NULL }, 2069, "tcp" }, + { "event-port", { NULL }, 2069, "udp" }, + { "ah-esp-encap", { NULL }, 2070, "tcp" }, + { "ah-esp-encap", { NULL }, 2070, "udp" }, + { "acp-port", { NULL }, 2071, "tcp" }, + { "acp-port", { NULL }, 2071, "udp" }, + { "msync", { NULL }, 2072, "tcp" }, + { "msync", { NULL }, 2072, "udp" }, + { "gxs-data-port", { NULL }, 2073, "tcp" }, + { "gxs-data-port", { NULL }, 2073, "udp" }, + { "vrtl-vmf-sa", { NULL }, 2074, "tcp" }, + { "vrtl-vmf-sa", { NULL }, 2074, "udp" }, + { "newlixengine", { NULL }, 2075, "tcp" }, + { "newlixengine", { NULL }, 2075, "udp" }, + { "newlixconfig", { NULL }, 2076, "tcp" }, + { "newlixconfig", { NULL }, 2076, "udp" }, + { "tsrmagt", { NULL }, 2077, "tcp" }, + { "tsrmagt", { NULL }, 2077, "udp" }, + { "tpcsrvr", { NULL }, 2078, "tcp" }, + { "tpcsrvr", { NULL }, 2078, "udp" }, + { "idware-router", { NULL }, 2079, "tcp" }, + { "idware-router", { NULL }, 2079, "udp" }, + { "autodesk-nlm", { NULL }, 2080, "tcp" }, + { "autodesk-nlm", { NULL }, 2080, "udp" }, + { "kme-trap-port", { NULL }, 2081, "tcp" }, + { "kme-trap-port", { NULL }, 2081, "udp" }, + { "infowave", { NULL }, 2082, "tcp" }, + { "infowave", { NULL }, 2082, "udp" }, + { "radsec", { NULL }, 2083, "tcp" }, + { "radsec", { NULL }, 2083, "udp" }, + { "sunclustergeo", { NULL }, 2084, "tcp" }, + { "sunclustergeo", { NULL }, 2084, "udp" }, + { "ada-cip", { NULL }, 2085, "tcp" }, + { "ada-cip", { NULL }, 2085, "udp" }, + { "gnunet", { NULL }, 2086, "tcp" }, + { "gnunet", { NULL }, 2086, "udp" }, + { "eli", { NULL }, 2087, "tcp" }, + { "eli", { NULL }, 2087, "udp" }, + { "ip-blf", { NULL }, 2088, "tcp" }, + { "ip-blf", { NULL }, 2088, "udp" }, + { "sep", { NULL }, 2089, "tcp" }, + { "sep", { NULL }, 2089, "udp" }, + { "lrp", { NULL }, 2090, "tcp" }, + { "lrp", { NULL }, 2090, "udp" }, + { "prp", { NULL }, 2091, "tcp" }, + { "prp", { NULL }, 2091, "udp" }, + { "descent3", { NULL }, 2092, "tcp" }, + { "descent3", { NULL }, 2092, "udp" }, + { "nbx-cc", { NULL }, 2093, "tcp" }, + { "nbx-cc", { NULL }, 2093, "udp" }, + { "nbx-au", { NULL }, 2094, "tcp" }, + { "nbx-au", { NULL }, 2094, "udp" }, + { "nbx-ser", { NULL }, 2095, "tcp" }, + { "nbx-ser", { NULL }, 2095, "udp" }, + { "nbx-dir", { NULL }, 2096, "tcp" }, + { "nbx-dir", { NULL }, 2096, "udp" }, + { "jetformpreview", { NULL }, 2097, "tcp" }, + { "jetformpreview", { NULL }, 2097, "udp" }, + { "dialog-port", { NULL }, 2098, "tcp" }, + { "dialog-port", { NULL }, 2098, "udp" }, + { "h2250-annex-g", { NULL }, 2099, "tcp" }, + { "h2250-annex-g", { NULL }, 2099, "udp" }, + { "amiganetfs", { NULL }, 2100, "tcp" }, + { "amiganetfs", { NULL }, 2100, "udp" }, + { "rtcm-sc104", { NULL }, 2101, "tcp" }, + { "rtcm-sc104", { NULL }, 2101, "udp" }, + { "zephyr-srv", { NULL }, 2102, "tcp" }, + { "zephyr-srv", { NULL }, 2102, "udp" }, + { "zephyr-clt", { NULL }, 2103, "tcp" }, + { "zephyr-clt", { NULL }, 2103, "udp" }, + { "zephyr-hm", { NULL }, 2104, "tcp" }, + { "zephyr-hm", { NULL }, 2104, "udp" }, + { "minipay", { NULL }, 2105, "tcp" }, + { "minipay", { NULL }, 2105, "udp" }, + { "mzap", { NULL }, 2106, "tcp" }, + { "mzap", { NULL }, 2106, "udp" }, + { "bintec-admin", { NULL }, 2107, "tcp" }, + { "bintec-admin", { NULL }, 2107, "udp" }, + { "comcam", { NULL }, 2108, "tcp" }, + { "comcam", { NULL }, 2108, "udp" }, + { "ergolight", { NULL }, 2109, "tcp" }, + { "ergolight", { NULL }, 2109, "udp" }, + { "umsp", { NULL }, 2110, "tcp" }, + { "umsp", { NULL }, 2110, "udp" }, + { "dsatp", { NULL }, 2111, "tcp" }, + { "dsatp", { NULL }, 2111, "udp" }, + { "idonix-metanet", { NULL }, 2112, "tcp" }, + { "idonix-metanet", { NULL }, 2112, "udp" }, + { "hsl-storm", { NULL }, 2113, "tcp" }, + { "hsl-storm", { NULL }, 2113, "udp" }, + { "newheights", { NULL }, 2114, "tcp" }, + { "newheights", { NULL }, 2114, "udp" }, + { "kdm", { NULL }, 2115, "tcp" }, + { "kdm", { NULL }, 2115, "udp" }, + { "ccowcmr", { NULL }, 2116, "tcp" }, + { "ccowcmr", { NULL }, 2116, "udp" }, + { "mentaclient", { NULL }, 2117, "tcp" }, + { "mentaclient", { NULL }, 2117, "udp" }, + { "mentaserver", { NULL }, 2118, "tcp" }, + { "mentaserver", { NULL }, 2118, "udp" }, + { "gsigatekeeper", { NULL }, 2119, "tcp" }, + { "gsigatekeeper", { NULL }, 2119, "udp" }, + { "qencp", { NULL }, 2120, "tcp" }, + { "qencp", { NULL }, 2120, "udp" }, + { "scientia-ssdb", { NULL }, 2121, "tcp" }, + { "scientia-ssdb", { NULL }, 2121, "udp" }, + { "caupc-remote", { NULL }, 2122, "tcp" }, + { "caupc-remote", { NULL }, 2122, "udp" }, + { "gtp-control", { NULL }, 2123, "tcp" }, + { "gtp-control", { NULL }, 2123, "udp" }, + { "elatelink", { NULL }, 2124, "tcp" }, + { "elatelink", { NULL }, 2124, "udp" }, + { "lockstep", { NULL }, 2125, "tcp" }, + { "lockstep", { NULL }, 2125, "udp" }, + { "pktcable-cops", { NULL }, 2126, "tcp" }, + { "pktcable-cops", { NULL }, 2126, "udp" }, + { "index-pc-wb", { NULL }, 2127, "tcp" }, + { "index-pc-wb", { NULL }, 2127, "udp" }, + { "net-steward", { NULL }, 2128, "tcp" }, + { "net-steward", { NULL }, 2128, "udp" }, + { "cs-live", { NULL }, 2129, "tcp" }, + { "cs-live", { NULL }, 2129, "udp" }, + { "xds", { NULL }, 2130, "tcp" }, + { "xds", { NULL }, 2130, "udp" }, + { "avantageb2b", { NULL }, 2131, "tcp" }, + { "avantageb2b", { NULL }, 2131, "udp" }, + { "solera-epmap", { NULL }, 2132, "tcp" }, + { "solera-epmap", { NULL }, 2132, "udp" }, + { "zymed-zpp", { NULL }, 2133, "tcp" }, + { "zymed-zpp", { NULL }, 2133, "udp" }, + { "avenue", { NULL }, 2134, "tcp" }, + { "avenue", { NULL }, 2134, "udp" }, + { "gris", { NULL }, 2135, "tcp" }, + { "gris", { NULL }, 2135, "udp" }, + { "appworxsrv", { NULL }, 2136, "tcp" }, + { "appworxsrv", { NULL }, 2136, "udp" }, + { "connect", { NULL }, 2137, "tcp" }, + { "connect", { NULL }, 2137, "udp" }, + { "unbind-cluster", { NULL }, 2138, "tcp" }, + { "unbind-cluster", { NULL }, 2138, "udp" }, + { "ias-auth", { NULL }, 2139, "tcp" }, + { "ias-auth", { NULL }, 2139, "udp" }, + { "ias-reg", { NULL }, 2140, "tcp" }, + { "ias-reg", { NULL }, 2140, "udp" }, + { "ias-admind", { NULL }, 2141, "tcp" }, + { "ias-admind", { NULL }, 2141, "udp" }, + { "tdmoip", { NULL }, 2142, "tcp" }, + { "tdmoip", { NULL }, 2142, "udp" }, + { "lv-jc", { NULL }, 2143, "tcp" }, + { "lv-jc", { NULL }, 2143, "udp" }, + { "lv-ffx", { NULL }, 2144, "tcp" }, + { "lv-ffx", { NULL }, 2144, "udp" }, + { "lv-pici", { NULL }, 2145, "tcp" }, + { "lv-pici", { NULL }, 2145, "udp" }, + { "lv-not", { NULL }, 2146, "tcp" }, + { "lv-not", { NULL }, 2146, "udp" }, + { "lv-auth", { NULL }, 2147, "tcp" }, + { "lv-auth", { NULL }, 2147, "udp" }, + { "veritas-ucl", { NULL }, 2148, "tcp" }, + { "veritas-ucl", { NULL }, 2148, "udp" }, + { "acptsys", { NULL }, 2149, "tcp" }, + { "acptsys", { NULL }, 2149, "udp" }, + { "dynamic3d", { NULL }, 2150, "tcp" }, + { "dynamic3d", { NULL }, 2150, "udp" }, + { "docent", { NULL }, 2151, "tcp" }, + { "docent", { NULL }, 2151, "udp" }, + { "gtp-user", { NULL }, 2152, "tcp" }, + { "gtp-user", { NULL }, 2152, "udp" }, + { "ctlptc", { NULL }, 2153, "tcp" }, + { "ctlptc", { NULL }, 2153, "udp" }, + { "stdptc", { NULL }, 2154, "tcp" }, + { "stdptc", { NULL }, 2154, "udp" }, + { "brdptc", { NULL }, 2155, "tcp" }, + { "brdptc", { NULL }, 2155, "udp" }, + { "trp", { NULL }, 2156, "tcp" }, + { "trp", { NULL }, 2156, "udp" }, + { "xnds", { NULL }, 2157, "tcp" }, + { "xnds", { NULL }, 2157, "udp" }, + { "touchnetplus", { NULL }, 2158, "tcp" }, + { "touchnetplus", { NULL }, 2158, "udp" }, + { "gdbremote", { NULL }, 2159, "tcp" }, + { "gdbremote", { NULL }, 2159, "udp" }, + { "apc-2160", { NULL }, 2160, "tcp" }, + { "apc-2160", { NULL }, 2160, "udp" }, + { "apc-2161", { NULL }, 2161, "tcp" }, + { "apc-2161", { NULL }, 2161, "udp" }, + { "navisphere", { NULL }, 2162, "tcp" }, + { "navisphere", { NULL }, 2162, "udp" }, + { "navisphere-sec", { NULL }, 2163, "tcp" }, + { "navisphere-sec", { NULL }, 2163, "udp" }, + { "ddns-v3", { NULL }, 2164, "tcp" }, + { "ddns-v3", { NULL }, 2164, "udp" }, + { "x-bone-api", { NULL }, 2165, "tcp" }, + { "x-bone-api", { NULL }, 2165, "udp" }, + { "iwserver", { NULL }, 2166, "tcp" }, + { "iwserver", { NULL }, 2166, "udp" }, + { "raw-serial", { NULL }, 2167, "tcp" }, + { "raw-serial", { NULL }, 2167, "udp" }, + { "easy-soft-mux", { NULL }, 2168, "tcp" }, + { "easy-soft-mux", { NULL }, 2168, "udp" }, + { "brain", { NULL }, 2169, "tcp" }, + { "brain", { NULL }, 2169, "udp" }, + { "eyetv", { NULL }, 2170, "tcp" }, + { "eyetv", { NULL }, 2170, "udp" }, + { "msfw-storage", { NULL }, 2171, "tcp" }, + { "msfw-storage", { NULL }, 2171, "udp" }, + { "msfw-s-storage", { NULL }, 2172, "tcp" }, + { "msfw-s-storage", { NULL }, 2172, "udp" }, + { "msfw-replica", { NULL }, 2173, "tcp" }, + { "msfw-replica", { NULL }, 2173, "udp" }, + { "msfw-array", { NULL }, 2174, "tcp" }, + { "msfw-array", { NULL }, 2174, "udp" }, + { "airsync", { NULL }, 2175, "tcp" }, + { "airsync", { NULL }, 2175, "udp" }, + { "rapi", { NULL }, 2176, "tcp" }, + { "rapi", { NULL }, 2176, "udp" }, + { "qwave", { NULL }, 2177, "tcp" }, + { "qwave", { NULL }, 2177, "udp" }, + { "bitspeer", { NULL }, 2178, "tcp" }, + { "bitspeer", { NULL }, 2178, "udp" }, + { "vmrdp", { NULL }, 2179, "tcp" }, + { "vmrdp", { NULL }, 2179, "udp" }, + { "mc-gt-srv", { NULL }, 2180, "tcp" }, + { "mc-gt-srv", { NULL }, 2180, "udp" }, + { "eforward", { NULL }, 2181, "tcp" }, + { "eforward", { NULL }, 2181, "udp" }, + { "cgn-stat", { NULL }, 2182, "tcp" }, + { "cgn-stat", { NULL }, 2182, "udp" }, + { "cgn-config", { NULL }, 2183, "tcp" }, + { "cgn-config", { NULL }, 2183, "udp" }, + { "nvd", { NULL }, 2184, "tcp" }, + { "nvd", { NULL }, 2184, "udp" }, + { "onbase-dds", { NULL }, 2185, "tcp" }, + { "onbase-dds", { NULL }, 2185, "udp" }, + { "gtaua", { NULL }, 2186, "tcp" }, + { "gtaua", { NULL }, 2186, "udp" }, + { "ssmc", { NULL }, 2187, "tcp" }, + { "ssmd", { NULL }, 2187, "udp" }, + { "tivoconnect", { NULL }, 2190, "tcp" }, + { "tivoconnect", { NULL }, 2190, "udp" }, + { "tvbus", { NULL }, 2191, "tcp" }, + { "tvbus", { NULL }, 2191, "udp" }, + { "asdis", { NULL }, 2192, "tcp" }, + { "asdis", { NULL }, 2192, "udp" }, + { "drwcs", { NULL }, 2193, "tcp" }, + { "drwcs", { NULL }, 2193, "udp" }, + { "mnp-exchange", { NULL }, 2197, "tcp" }, + { "mnp-exchange", { NULL }, 2197, "udp" }, + { "onehome-remote", { NULL }, 2198, "tcp" }, + { "onehome-remote", { NULL }, 2198, "udp" }, + { "onehome-help", { NULL }, 2199, "tcp" }, + { "onehome-help", { NULL }, 2199, "udp" }, + { "ici", { NULL }, 2200, "tcp" }, + { "ici", { NULL }, 2200, "udp" }, + { "ats", { NULL }, 2201, "tcp" }, + { "ats", { NULL }, 2201, "udp" }, + { "imtc-map", { NULL }, 2202, "tcp" }, + { "imtc-map", { NULL }, 2202, "udp" }, + { "b2-runtime", { NULL }, 2203, "tcp" }, + { "b2-runtime", { NULL }, 2203, "udp" }, + { "b2-license", { NULL }, 2204, "tcp" }, + { "b2-license", { NULL }, 2204, "udp" }, + { "jps", { NULL }, 2205, "tcp" }, + { "jps", { NULL }, 2205, "udp" }, + { "hpocbus", { NULL }, 2206, "tcp" }, + { "hpocbus", { NULL }, 2206, "udp" }, + { "hpssd", { NULL }, 2207, "tcp" }, + { "hpssd", { NULL }, 2207, "udp" }, + { "hpiod", { NULL }, 2208, "tcp" }, + { "hpiod", { NULL }, 2208, "udp" }, + { "rimf-ps", { NULL }, 2209, "tcp" }, + { "rimf-ps", { NULL }, 2209, "udp" }, + { "noaaport", { NULL }, 2210, "tcp" }, + { "noaaport", { NULL }, 2210, "udp" }, + { "emwin", { NULL }, 2211, "tcp" }, + { "emwin", { NULL }, 2211, "udp" }, + { "leecoposserver", { NULL }, 2212, "tcp" }, + { "leecoposserver", { NULL }, 2212, "udp" }, + { "kali", { NULL }, 2213, "tcp" }, + { "kali", { NULL }, 2213, "udp" }, + { "rpi", { NULL }, 2214, "tcp" }, + { "rpi", { NULL }, 2214, "udp" }, + { "ipcore", { NULL }, 2215, "tcp" }, + { "ipcore", { NULL }, 2215, "udp" }, + { "vtu-comms", { NULL }, 2216, "tcp" }, + { "vtu-comms", { NULL }, 2216, "udp" }, + { "gotodevice", { NULL }, 2217, "tcp" }, + { "gotodevice", { NULL }, 2217, "udp" }, + { "bounzza", { NULL }, 2218, "tcp" }, + { "bounzza", { NULL }, 2218, "udp" }, + { "netiq-ncap", { NULL }, 2219, "tcp" }, + { "netiq-ncap", { NULL }, 2219, "udp" }, + { "netiq", { NULL }, 2220, "tcp" }, + { "netiq", { NULL }, 2220, "udp" }, + { "rockwell-csp1", { NULL }, 2221, "tcp" }, + { "rockwell-csp1", { NULL }, 2221, "udp" }, + { "EtherNet/IP-1", { NULL }, 2222, "tcp" }, + { "EtherNet/IP-1", { NULL }, 2222, "udp" }, + { "rockwell-csp2", { NULL }, 2223, "tcp" }, + { "rockwell-csp2", { NULL }, 2223, "udp" }, + { "efi-mg", { NULL }, 2224, "tcp" }, + { "efi-mg", { NULL }, 2224, "udp" }, + { "rcip-itu", { NULL }, 2225, "tcp" }, + { "rcip-itu", { NULL }, 2225, "sctp"}, + { "di-drm", { NULL }, 2226, "tcp" }, + { "di-drm", { NULL }, 2226, "udp" }, + { "di-msg", { NULL }, 2227, "tcp" }, + { "di-msg", { NULL }, 2227, "udp" }, + { "ehome-ms", { NULL }, 2228, "tcp" }, + { "ehome-ms", { NULL }, 2228, "udp" }, + { "datalens", { NULL }, 2229, "tcp" }, + { "datalens", { NULL }, 2229, "udp" }, + { "queueadm", { NULL }, 2230, "tcp" }, + { "queueadm", { NULL }, 2230, "udp" }, + { "wimaxasncp", { NULL }, 2231, "tcp" }, + { "wimaxasncp", { NULL }, 2231, "udp" }, + { "ivs-video", { NULL }, 2232, "tcp" }, + { "ivs-video", { NULL }, 2232, "udp" }, + { "infocrypt", { NULL }, 2233, "tcp" }, + { "infocrypt", { NULL }, 2233, "udp" }, + { "directplay", { NULL }, 2234, "tcp" }, + { "directplay", { NULL }, 2234, "udp" }, + { "sercomm-wlink", { NULL }, 2235, "tcp" }, + { "sercomm-wlink", { NULL }, 2235, "udp" }, + { "nani", { NULL }, 2236, "tcp" }, + { "nani", { NULL }, 2236, "udp" }, + { "optech-port1-lm", { NULL }, 2237, "tcp" }, + { "optech-port1-lm", { NULL }, 2237, "udp" }, + { "aviva-sna", { NULL }, 2238, "tcp" }, + { "aviva-sna", { NULL }, 2238, "udp" }, + { "imagequery", { NULL }, 2239, "tcp" }, + { "imagequery", { NULL }, 2239, "udp" }, + { "recipe", { NULL }, 2240, "tcp" }, + { "recipe", { NULL }, 2240, "udp" }, + { "ivsd", { NULL }, 2241, "tcp" }, + { "ivsd", { NULL }, 2241, "udp" }, + { "foliocorp", { NULL }, 2242, "tcp" }, + { "foliocorp", { NULL }, 2242, "udp" }, + { "magicom", { NULL }, 2243, "tcp" }, + { "magicom", { NULL }, 2243, "udp" }, + { "nmsserver", { NULL }, 2244, "tcp" }, + { "nmsserver", { NULL }, 2244, "udp" }, + { "hao", { NULL }, 2245, "tcp" }, + { "hao", { NULL }, 2245, "udp" }, + { "pc-mta-addrmap", { NULL }, 2246, "tcp" }, + { "pc-mta-addrmap", { NULL }, 2246, "udp" }, + { "antidotemgrsvr", { NULL }, 2247, "tcp" }, + { "antidotemgrsvr", { NULL }, 2247, "udp" }, + { "ums", { NULL }, 2248, "tcp" }, + { "ums", { NULL }, 2248, "udp" }, + { "rfmp", { NULL }, 2249, "tcp" }, + { "rfmp", { NULL }, 2249, "udp" }, + { "remote-collab", { NULL }, 2250, "tcp" }, + { "remote-collab", { NULL }, 2250, "udp" }, + { "dif-port", { NULL }, 2251, "tcp" }, + { "dif-port", { NULL }, 2251, "udp" }, + { "njenet-ssl", { NULL }, 2252, "tcp" }, + { "njenet-ssl", { NULL }, 2252, "udp" }, + { "dtv-chan-req", { NULL }, 2253, "tcp" }, + { "dtv-chan-req", { NULL }, 2253, "udp" }, + { "seispoc", { NULL }, 2254, "tcp" }, + { "seispoc", { NULL }, 2254, "udp" }, + { "vrtp", { NULL }, 2255, "tcp" }, + { "vrtp", { NULL }, 2255, "udp" }, + { "pcc-mfp", { NULL }, 2256, "tcp" }, + { "pcc-mfp", { NULL }, 2256, "udp" }, + { "simple-tx-rx", { NULL }, 2257, "tcp" }, + { "simple-tx-rx", { NULL }, 2257, "udp" }, + { "rcts", { NULL }, 2258, "tcp" }, + { "rcts", { NULL }, 2258, "udp" }, + { "acd-pm", { NULL }, 2259, "tcp" }, + { "acd-pm", { NULL }, 2259, "udp" }, + { "apc-2260", { NULL }, 2260, "tcp" }, + { "apc-2260", { NULL }, 2260, "udp" }, + { "comotionmaster", { NULL }, 2261, "tcp" }, + { "comotionmaster", { NULL }, 2261, "udp" }, + { "comotionback", { NULL }, 2262, "tcp" }, + { "comotionback", { NULL }, 2262, "udp" }, + { "ecwcfg", { NULL }, 2263, "tcp" }, + { "ecwcfg", { NULL }, 2263, "udp" }, + { "apx500api-1", { NULL }, 2264, "tcp" }, + { "apx500api-1", { NULL }, 2264, "udp" }, + { "apx500api-2", { NULL }, 2265, "tcp" }, + { "apx500api-2", { NULL }, 2265, "udp" }, + { "mfserver", { NULL }, 2266, "tcp" }, + { "mfserver", { NULL }, 2266, "udp" }, + { "ontobroker", { NULL }, 2267, "tcp" }, + { "ontobroker", { NULL }, 2267, "udp" }, + { "amt", { NULL }, 2268, "tcp" }, + { "amt", { NULL }, 2268, "udp" }, + { "mikey", { NULL }, 2269, "tcp" }, + { "mikey", { NULL }, 2269, "udp" }, + { "starschool", { NULL }, 2270, "tcp" }, + { "starschool", { NULL }, 2270, "udp" }, + { "mmcals", { NULL }, 2271, "tcp" }, + { "mmcals", { NULL }, 2271, "udp" }, + { "mmcal", { NULL }, 2272, "tcp" }, + { "mmcal", { NULL }, 2272, "udp" }, + { "mysql-im", { NULL }, 2273, "tcp" }, + { "mysql-im", { NULL }, 2273, "udp" }, + { "pcttunnell", { NULL }, 2274, "tcp" }, + { "pcttunnell", { NULL }, 2274, "udp" }, + { "ibridge-data", { NULL }, 2275, "tcp" }, + { "ibridge-data", { NULL }, 2275, "udp" }, + { "ibridge-mgmt", { NULL }, 2276, "tcp" }, + { "ibridge-mgmt", { NULL }, 2276, "udp" }, + { "bluectrlproxy", { NULL }, 2277, "tcp" }, + { "bluectrlproxy", { NULL }, 2277, "udp" }, + { "s3db", { NULL }, 2278, "tcp" }, + { "s3db", { NULL }, 2278, "udp" }, + { "xmquery", { NULL }, 2279, "tcp" }, + { "xmquery", { NULL }, 2279, "udp" }, + { "lnvpoller", { NULL }, 2280, "tcp" }, + { "lnvpoller", { NULL }, 2280, "udp" }, + { "lnvconsole", { NULL }, 2281, "tcp" }, + { "lnvconsole", { NULL }, 2281, "udp" }, + { "lnvalarm", { NULL }, 2282, "tcp" }, + { "lnvalarm", { NULL }, 2282, "udp" }, + { "lnvstatus", { NULL }, 2283, "tcp" }, + { "lnvstatus", { NULL }, 2283, "udp" }, + { "lnvmaps", { NULL }, 2284, "tcp" }, + { "lnvmaps", { NULL }, 2284, "udp" }, + { "lnvmailmon", { NULL }, 2285, "tcp" }, + { "lnvmailmon", { NULL }, 2285, "udp" }, + { "nas-metering", { NULL }, 2286, "tcp" }, + { "nas-metering", { NULL }, 2286, "udp" }, + { "dna", { NULL }, 2287, "tcp" }, + { "dna", { NULL }, 2287, "udp" }, + { "netml", { NULL }, 2288, "tcp" }, + { "netml", { NULL }, 2288, "udp" }, + { "dict-lookup", { NULL }, 2289, "tcp" }, + { "dict-lookup", { NULL }, 2289, "udp" }, + { "sonus-logging", { NULL }, 2290, "tcp" }, + { "sonus-logging", { NULL }, 2290, "udp" }, + { "eapsp", { NULL }, 2291, "tcp" }, + { "eapsp", { NULL }, 2291, "udp" }, + { "mib-streaming", { NULL }, 2292, "tcp" }, + { "mib-streaming", { NULL }, 2292, "udp" }, + { "npdbgmngr", { NULL }, 2293, "tcp" }, + { "npdbgmngr", { NULL }, 2293, "udp" }, + { "konshus-lm", { NULL }, 2294, "tcp" }, + { "konshus-lm", { NULL }, 2294, "udp" }, + { "advant-lm", { NULL }, 2295, "tcp" }, + { "advant-lm", { NULL }, 2295, "udp" }, + { "theta-lm", { NULL }, 2296, "tcp" }, + { "theta-lm", { NULL }, 2296, "udp" }, + { "d2k-datamover1", { NULL }, 2297, "tcp" }, + { "d2k-datamover1", { NULL }, 2297, "udp" }, + { "d2k-datamover2", { NULL }, 2298, "tcp" }, + { "d2k-datamover2", { NULL }, 2298, "udp" }, + { "pc-telecommute", { NULL }, 2299, "tcp" }, + { "pc-telecommute", { NULL }, 2299, "udp" }, + { "cvmmon", { NULL }, 2300, "tcp" }, + { "cvmmon", { NULL }, 2300, "udp" }, + { "cpq-wbem", { NULL }, 2301, "tcp" }, + { "cpq-wbem", { NULL }, 2301, "udp" }, + { "binderysupport", { NULL }, 2302, "tcp" }, + { "binderysupport", { NULL }, 2302, "udp" }, + { "proxy-gateway", { NULL }, 2303, "tcp" }, + { "proxy-gateway", { NULL }, 2303, "udp" }, + { "attachmate-uts", { NULL }, 2304, "tcp" }, + { "attachmate-uts", { NULL }, 2304, "udp" }, + { "mt-scaleserver", { NULL }, 2305, "tcp" }, + { "mt-scaleserver", { NULL }, 2305, "udp" }, + { "tappi-boxnet", { NULL }, 2306, "tcp" }, + { "tappi-boxnet", { NULL }, 2306, "udp" }, + { "pehelp", { NULL }, 2307, "tcp" }, + { "pehelp", { NULL }, 2307, "udp" }, + { "sdhelp", { NULL }, 2308, "tcp" }, + { "sdhelp", { NULL }, 2308, "udp" }, + { "sdserver", { NULL }, 2309, "tcp" }, + { "sdserver", { NULL }, 2309, "udp" }, + { "sdclient", { NULL }, 2310, "tcp" }, + { "sdclient", { NULL }, 2310, "udp" }, + { "messageservice", { NULL }, 2311, "tcp" }, + { "messageservice", { NULL }, 2311, "udp" }, + { "wanscaler", { NULL }, 2312, "tcp" }, + { "wanscaler", { NULL }, 2312, "udp" }, + { "iapp", { NULL }, 2313, "tcp" }, + { "iapp", { NULL }, 2313, "udp" }, + { "cr-websystems", { NULL }, 2314, "tcp" }, + { "cr-websystems", { NULL }, 2314, "udp" }, + { "precise-sft", { NULL }, 2315, "tcp" }, + { "precise-sft", { NULL }, 2315, "udp" }, + { "sent-lm", { NULL }, 2316, "tcp" }, + { "sent-lm", { NULL }, 2316, "udp" }, + { "attachmate-g32", { NULL }, 2317, "tcp" }, + { "attachmate-g32", { NULL }, 2317, "udp" }, + { "cadencecontrol", { NULL }, 2318, "tcp" }, + { "cadencecontrol", { NULL }, 2318, "udp" }, + { "infolibria", { NULL }, 2319, "tcp" }, + { "infolibria", { NULL }, 2319, "udp" }, + { "siebel-ns", { NULL }, 2320, "tcp" }, + { "siebel-ns", { NULL }, 2320, "udp" }, + { "rdlap", { NULL }, 2321, "tcp" }, + { "rdlap", { NULL }, 2321, "udp" }, + { "ofsd", { NULL }, 2322, "tcp" }, + { "ofsd", { NULL }, 2322, "udp" }, + { "3d-nfsd", { NULL }, 2323, "tcp" }, + { "3d-nfsd", { NULL }, 2323, "udp" }, + { "cosmocall", { NULL }, 2324, "tcp" }, + { "cosmocall", { NULL }, 2324, "udp" }, + { "ansysli", { NULL }, 2325, "tcp" }, + { "ansysli", { NULL }, 2325, "udp" }, + { "idcp", { NULL }, 2326, "tcp" }, + { "idcp", { NULL }, 2326, "udp" }, + { "xingcsm", { NULL }, 2327, "tcp" }, + { "xingcsm", { NULL }, 2327, "udp" }, + { "netrix-sftm", { NULL }, 2328, "tcp" }, + { "netrix-sftm", { NULL }, 2328, "udp" }, + { "nvd", { NULL }, 2329, "tcp" }, + { "nvd", { NULL }, 2329, "udp" }, + { "tscchat", { NULL }, 2330, "tcp" }, + { "tscchat", { NULL }, 2330, "udp" }, + { "agentview", { NULL }, 2331, "tcp" }, + { "agentview", { NULL }, 2331, "udp" }, + { "rcc-host", { NULL }, 2332, "tcp" }, + { "rcc-host", { NULL }, 2332, "udp" }, + { "snapp", { NULL }, 2333, "tcp" }, + { "snapp", { NULL }, 2333, "udp" }, + { "ace-client", { NULL }, 2334, "tcp" }, + { "ace-client", { NULL }, 2334, "udp" }, + { "ace-proxy", { NULL }, 2335, "tcp" }, + { "ace-proxy", { NULL }, 2335, "udp" }, + { "appleugcontrol", { NULL }, 2336, "tcp" }, + { "appleugcontrol", { NULL }, 2336, "udp" }, + { "ideesrv", { NULL }, 2337, "tcp" }, + { "ideesrv", { NULL }, 2337, "udp" }, + { "norton-lambert", { NULL }, 2338, "tcp" }, + { "norton-lambert", { NULL }, 2338, "udp" }, + { "3com-webview", { NULL }, 2339, "tcp" }, + { "3com-webview", { NULL }, 2339, "udp" }, + { "wrs_registry", { NULL }, 2340, "tcp" }, + { "wrs_registry", { NULL }, 2340, "udp" }, + { "xiostatus", { NULL }, 2341, "tcp" }, + { "xiostatus", { NULL }, 2341, "udp" }, + { "manage-exec", { NULL }, 2342, "tcp" }, + { "manage-exec", { NULL }, 2342, "udp" }, + { "nati-logos", { NULL }, 2343, "tcp" }, + { "nati-logos", { NULL }, 2343, "udp" }, + { "fcmsys", { NULL }, 2344, "tcp" }, + { "fcmsys", { NULL }, 2344, "udp" }, + { "dbm", { NULL }, 2345, "tcp" }, + { "dbm", { NULL }, 2345, "udp" }, + { "redstorm_join", { NULL }, 2346, "tcp" }, + { "redstorm_join", { NULL }, 2346, "udp" }, + { "redstorm_find", { NULL }, 2347, "tcp" }, + { "redstorm_find", { NULL }, 2347, "udp" }, + { "redstorm_info", { NULL }, 2348, "tcp" }, + { "redstorm_info", { NULL }, 2348, "udp" }, + { "redstorm_diag", { NULL }, 2349, "tcp" }, + { "redstorm_diag", { NULL }, 2349, "udp" }, + { "psbserver", { NULL }, 2350, "tcp" }, + { "psbserver", { NULL }, 2350, "udp" }, + { "psrserver", { NULL }, 2351, "tcp" }, + { "psrserver", { NULL }, 2351, "udp" }, + { "pslserver", { NULL }, 2352, "tcp" }, + { "pslserver", { NULL }, 2352, "udp" }, + { "pspserver", { NULL }, 2353, "tcp" }, + { "pspserver", { NULL }, 2353, "udp" }, + { "psprserver", { NULL }, 2354, "tcp" }, + { "psprserver", { NULL }, 2354, "udp" }, + { "psdbserver", { NULL }, 2355, "tcp" }, + { "psdbserver", { NULL }, 2355, "udp" }, + { "gxtelmd", { NULL }, 2356, "tcp" }, + { "gxtelmd", { NULL }, 2356, "udp" }, + { "unihub-server", { NULL }, 2357, "tcp" }, + { "unihub-server", { NULL }, 2357, "udp" }, + { "futrix", { NULL }, 2358, "tcp" }, + { "futrix", { NULL }, 2358, "udp" }, + { "flukeserver", { NULL }, 2359, "tcp" }, + { "flukeserver", { NULL }, 2359, "udp" }, + { "nexstorindltd", { NULL }, 2360, "tcp" }, + { "nexstorindltd", { NULL }, 2360, "udp" }, + { "tl1", { NULL }, 2361, "tcp" }, + { "tl1", { NULL }, 2361, "udp" }, + { "digiman", { NULL }, 2362, "tcp" }, + { "digiman", { NULL }, 2362, "udp" }, + { "mediacntrlnfsd", { NULL }, 2363, "tcp" }, + { "mediacntrlnfsd", { NULL }, 2363, "udp" }, + { "oi-2000", { NULL }, 2364, "tcp" }, + { "oi-2000", { NULL }, 2364, "udp" }, + { "dbref", { NULL }, 2365, "tcp" }, + { "dbref", { NULL }, 2365, "udp" }, + { "qip-login", { NULL }, 2366, "tcp" }, + { "qip-login", { NULL }, 2366, "udp" }, + { "service-ctrl", { NULL }, 2367, "tcp" }, + { "service-ctrl", { NULL }, 2367, "udp" }, + { "opentable", { NULL }, 2368, "tcp" }, + { "opentable", { NULL }, 2368, "udp" }, + { "l3-hbmon", { NULL }, 2370, "tcp" }, + { "l3-hbmon", { NULL }, 2370, "udp" }, + { "worldwire", { NULL }, 2371, "tcp" }, + { "worldwire", { NULL }, 2371, "udp" }, + { "lanmessenger", { NULL }, 2372, "tcp" }, + { "lanmessenger", { NULL }, 2372, "udp" }, + { "remographlm", { NULL }, 2373, "tcp" }, + { "hydra", { NULL }, 2374, "tcp" }, + { "compaq-https", { NULL }, 2381, "tcp" }, + { "compaq-https", { NULL }, 2381, "udp" }, + { "ms-olap3", { NULL }, 2382, "tcp" }, + { "ms-olap3", { NULL }, 2382, "udp" }, + { "ms-olap4", { NULL }, 2383, "tcp" }, + { "ms-olap4", { NULL }, 2383, "udp" }, + { "sd-request", { NULL }, 2384, "tcp" }, + { "sd-capacity", { NULL }, 2384, "udp" }, + { "sd-data", { NULL }, 2385, "tcp" }, + { "sd-data", { NULL }, 2385, "udp" }, + { "virtualtape", { NULL }, 2386, "tcp" }, + { "virtualtape", { NULL }, 2386, "udp" }, + { "vsamredirector", { NULL }, 2387, "tcp" }, + { "vsamredirector", { NULL }, 2387, "udp" }, + { "mynahautostart", { NULL }, 2388, "tcp" }, + { "mynahautostart", { NULL }, 2388, "udp" }, + { "ovsessionmgr", { NULL }, 2389, "tcp" }, + { "ovsessionmgr", { NULL }, 2389, "udp" }, + { "rsmtp", { NULL }, 2390, "tcp" }, + { "rsmtp", { NULL }, 2390, "udp" }, + { "3com-net-mgmt", { NULL }, 2391, "tcp" }, + { "3com-net-mgmt", { NULL }, 2391, "udp" }, + { "tacticalauth", { NULL }, 2392, "tcp" }, + { "tacticalauth", { NULL }, 2392, "udp" }, + { "ms-olap1", { NULL }, 2393, "tcp" }, + { "ms-olap1", { NULL }, 2393, "udp" }, + { "ms-olap2", { NULL }, 2394, "tcp" }, + { "ms-olap2", { NULL }, 2394, "udp" }, + { "lan900_remote", { NULL }, 2395, "tcp" }, + { "lan900_remote", { NULL }, 2395, "udp" }, + { "wusage", { NULL }, 2396, "tcp" }, + { "wusage", { NULL }, 2396, "udp" }, + { "ncl", { NULL }, 2397, "tcp" }, + { "ncl", { NULL }, 2397, "udp" }, + { "orbiter", { NULL }, 2398, "tcp" }, + { "orbiter", { NULL }, 2398, "udp" }, + { "fmpro-fdal", { NULL }, 2399, "tcp" }, + { "fmpro-fdal", { NULL }, 2399, "udp" }, + { "opequus-server", { NULL }, 2400, "tcp" }, + { "opequus-server", { NULL }, 2400, "udp" }, + { "cvspserver", { NULL }, 2401, "tcp" }, + { "cvspserver", { NULL }, 2401, "udp" }, + { "taskmaster2000", { NULL }, 2402, "tcp" }, + { "taskmaster2000", { NULL }, 2402, "udp" }, + { "taskmaster2000", { NULL }, 2403, "tcp" }, + { "taskmaster2000", { NULL }, 2403, "udp" }, + { "iec-104", { NULL }, 2404, "tcp" }, + { "iec-104", { NULL }, 2404, "udp" }, + { "trc-netpoll", { NULL }, 2405, "tcp" }, + { "trc-netpoll", { NULL }, 2405, "udp" }, + { "jediserver", { NULL }, 2406, "tcp" }, + { "jediserver", { NULL }, 2406, "udp" }, + { "orion", { NULL }, 2407, "tcp" }, + { "orion", { NULL }, 2407, "udp" }, + { "optimanet", { NULL }, 2408, "tcp" }, + { "optimanet", { NULL }, 2408, "udp" }, + { "sns-protocol", { NULL }, 2409, "tcp" }, + { "sns-protocol", { NULL }, 2409, "udp" }, + { "vrts-registry", { NULL }, 2410, "tcp" }, + { "vrts-registry", { NULL }, 2410, "udp" }, + { "netwave-ap-mgmt", { NULL }, 2411, "tcp" }, + { "netwave-ap-mgmt", { NULL }, 2411, "udp" }, + { "cdn", { NULL }, 2412, "tcp" }, + { "cdn", { NULL }, 2412, "udp" }, + { "orion-rmi-reg", { NULL }, 2413, "tcp" }, + { "orion-rmi-reg", { NULL }, 2413, "udp" }, + { "beeyond", { NULL }, 2414, "tcp" }, + { "beeyond", { NULL }, 2414, "udp" }, + { "codima-rtp", { NULL }, 2415, "tcp" }, + { "codima-rtp", { NULL }, 2415, "udp" }, + { "rmtserver", { NULL }, 2416, "tcp" }, + { "rmtserver", { NULL }, 2416, "udp" }, + { "composit-server", { NULL }, 2417, "tcp" }, + { "composit-server", { NULL }, 2417, "udp" }, + { "cas", { NULL }, 2418, "tcp" }, + { "cas", { NULL }, 2418, "udp" }, + { "attachmate-s2s", { NULL }, 2419, "tcp" }, + { "attachmate-s2s", { NULL }, 2419, "udp" }, + { "dslremote-mgmt", { NULL }, 2420, "tcp" }, + { "dslremote-mgmt", { NULL }, 2420, "udp" }, + { "g-talk", { NULL }, 2421, "tcp" }, + { "g-talk", { NULL }, 2421, "udp" }, + { "crmsbits", { NULL }, 2422, "tcp" }, + { "crmsbits", { NULL }, 2422, "udp" }, + { "rnrp", { NULL }, 2423, "tcp" }, + { "rnrp", { NULL }, 2423, "udp" }, + { "kofax-svr", { NULL }, 2424, "tcp" }, + { "kofax-svr", { NULL }, 2424, "udp" }, + { "fjitsuappmgr", { NULL }, 2425, "tcp" }, + { "fjitsuappmgr", { NULL }, 2425, "udp" }, + { "mgcp-gateway", { NULL }, 2427, "tcp" }, + { "mgcp-gateway", { NULL }, 2427, "udp" }, + { "ott", { NULL }, 2428, "tcp" }, + { "ott", { NULL }, 2428, "udp" }, + { "ft-role", { NULL }, 2429, "tcp" }, + { "ft-role", { NULL }, 2429, "udp" }, + { "venus", { NULL }, 2430, "tcp" }, + { "venus", { NULL }, 2430, "udp" }, + { "venus-se", { NULL }, 2431, "tcp" }, + { "venus-se", { NULL }, 2431, "udp" }, + { "codasrv", { NULL }, 2432, "tcp" }, + { "codasrv", { NULL }, 2432, "udp" }, + { "codasrv-se", { NULL }, 2433, "tcp" }, + { "codasrv-se", { NULL }, 2433, "udp" }, + { "pxc-epmap", { NULL }, 2434, "tcp" }, + { "pxc-epmap", { NULL }, 2434, "udp" }, + { "optilogic", { NULL }, 2435, "tcp" }, + { "optilogic", { NULL }, 2435, "udp" }, + { "topx", { NULL }, 2436, "tcp" }, + { "topx", { NULL }, 2436, "udp" }, + { "unicontrol", { NULL }, 2437, "tcp" }, + { "unicontrol", { NULL }, 2437, "udp" }, + { "msp", { NULL }, 2438, "tcp" }, + { "msp", { NULL }, 2438, "udp" }, + { "sybasedbsynch", { NULL }, 2439, "tcp" }, + { "sybasedbsynch", { NULL }, 2439, "udp" }, + { "spearway", { NULL }, 2440, "tcp" }, + { "spearway", { NULL }, 2440, "udp" }, + { "pvsw-inet", { NULL }, 2441, "tcp" }, + { "pvsw-inet", { NULL }, 2441, "udp" }, + { "netangel", { NULL }, 2442, "tcp" }, + { "netangel", { NULL }, 2442, "udp" }, + { "powerclientcsf", { NULL }, 2443, "tcp" }, + { "powerclientcsf", { NULL }, 2443, "udp" }, + { "btpp2sectrans", { NULL }, 2444, "tcp" }, + { "btpp2sectrans", { NULL }, 2444, "udp" }, + { "dtn1", { NULL }, 2445, "tcp" }, + { "dtn1", { NULL }, 2445, "udp" }, + { "bues_service", { NULL }, 2446, "tcp" }, + { "bues_service", { NULL }, 2446, "udp" }, + { "ovwdb", { NULL }, 2447, "tcp" }, + { "ovwdb", { NULL }, 2447, "udp" }, + { "hpppssvr", { NULL }, 2448, "tcp" }, + { "hpppssvr", { NULL }, 2448, "udp" }, + { "ratl", { NULL }, 2449, "tcp" }, + { "ratl", { NULL }, 2449, "udp" }, + { "netadmin", { NULL }, 2450, "tcp" }, + { "netadmin", { NULL }, 2450, "udp" }, + { "netchat", { NULL }, 2451, "tcp" }, + { "netchat", { NULL }, 2451, "udp" }, + { "snifferclient", { NULL }, 2452, "tcp" }, + { "snifferclient", { NULL }, 2452, "udp" }, + { "madge-ltd", { NULL }, 2453, "tcp" }, + { "madge-ltd", { NULL }, 2453, "udp" }, + { "indx-dds", { NULL }, 2454, "tcp" }, + { "indx-dds", { NULL }, 2454, "udp" }, + { "wago-io-system", { NULL }, 2455, "tcp" }, + { "wago-io-system", { NULL }, 2455, "udp" }, + { "altav-remmgt", { NULL }, 2456, "tcp" }, + { "altav-remmgt", { NULL }, 2456, "udp" }, + { "rapido-ip", { NULL }, 2457, "tcp" }, + { "rapido-ip", { NULL }, 2457, "udp" }, + { "griffin", { NULL }, 2458, "tcp" }, + { "griffin", { NULL }, 2458, "udp" }, + { "community", { NULL }, 2459, "tcp" }, + { "community", { NULL }, 2459, "udp" }, + { "ms-theater", { NULL }, 2460, "tcp" }, + { "ms-theater", { NULL }, 2460, "udp" }, + { "qadmifoper", { NULL }, 2461, "tcp" }, + { "qadmifoper", { NULL }, 2461, "udp" }, + { "qadmifevent", { NULL }, 2462, "tcp" }, + { "qadmifevent", { NULL }, 2462, "udp" }, + { "lsi-raid-mgmt", { NULL }, 2463, "tcp" }, + { "lsi-raid-mgmt", { NULL }, 2463, "udp" }, + { "direcpc-si", { NULL }, 2464, "tcp" }, + { "direcpc-si", { NULL }, 2464, "udp" }, + { "lbm", { NULL }, 2465, "tcp" }, + { "lbm", { NULL }, 2465, "udp" }, + { "lbf", { NULL }, 2466, "tcp" }, + { "lbf", { NULL }, 2466, "udp" }, + { "high-criteria", { NULL }, 2467, "tcp" }, + { "high-criteria", { NULL }, 2467, "udp" }, + { "qip-msgd", { NULL }, 2468, "tcp" }, + { "qip-msgd", { NULL }, 2468, "udp" }, + { "mti-tcs-comm", { NULL }, 2469, "tcp" }, + { "mti-tcs-comm", { NULL }, 2469, "udp" }, + { "taskman-port", { NULL }, 2470, "tcp" }, + { "taskman-port", { NULL }, 2470, "udp" }, + { "seaodbc", { NULL }, 2471, "tcp" }, + { "seaodbc", { NULL }, 2471, "udp" }, + { "c3", { NULL }, 2472, "tcp" }, + { "c3", { NULL }, 2472, "udp" }, + { "aker-cdp", { NULL }, 2473, "tcp" }, + { "aker-cdp", { NULL }, 2473, "udp" }, + { "vitalanalysis", { NULL }, 2474, "tcp" }, + { "vitalanalysis", { NULL }, 2474, "udp" }, + { "ace-server", { NULL }, 2475, "tcp" }, + { "ace-server", { NULL }, 2475, "udp" }, + { "ace-svr-prop", { NULL }, 2476, "tcp" }, + { "ace-svr-prop", { NULL }, 2476, "udp" }, + { "ssm-cvs", { NULL }, 2477, "tcp" }, + { "ssm-cvs", { NULL }, 2477, "udp" }, + { "ssm-cssps", { NULL }, 2478, "tcp" }, + { "ssm-cssps", { NULL }, 2478, "udp" }, + { "ssm-els", { NULL }, 2479, "tcp" }, + { "ssm-els", { NULL }, 2479, "udp" }, + { "powerexchange", { NULL }, 2480, "tcp" }, + { "powerexchange", { NULL }, 2480, "udp" }, + { "giop", { NULL }, 2481, "tcp" }, + { "giop", { NULL }, 2481, "udp" }, + { "giop-ssl", { NULL }, 2482, "tcp" }, + { "giop-ssl", { NULL }, 2482, "udp" }, + { "ttc", { NULL }, 2483, "tcp" }, + { "ttc", { NULL }, 2483, "udp" }, + { "ttc-ssl", { NULL }, 2484, "tcp" }, + { "ttc-ssl", { NULL }, 2484, "udp" }, + { "netobjects1", { NULL }, 2485, "tcp" }, + { "netobjects1", { NULL }, 2485, "udp" }, + { "netobjects2", { NULL }, 2486, "tcp" }, + { "netobjects2", { NULL }, 2486, "udp" }, + { "pns", { NULL }, 2487, "tcp" }, + { "pns", { NULL }, 2487, "udp" }, + { "moy-corp", { NULL }, 2488, "tcp" }, + { "moy-corp", { NULL }, 2488, "udp" }, + { "tsilb", { NULL }, 2489, "tcp" }, + { "tsilb", { NULL }, 2489, "udp" }, + { "qip-qdhcp", { NULL }, 2490, "tcp" }, + { "qip-qdhcp", { NULL }, 2490, "udp" }, + { "conclave-cpp", { NULL }, 2491, "tcp" }, + { "conclave-cpp", { NULL }, 2491, "udp" }, + { "groove", { NULL }, 2492, "tcp" }, + { "groove", { NULL }, 2492, "udp" }, + { "talarian-mqs", { NULL }, 2493, "tcp" }, + { "talarian-mqs", { NULL }, 2493, "udp" }, + { "bmc-ar", { NULL }, 2494, "tcp" }, + { "bmc-ar", { NULL }, 2494, "udp" }, + { "fast-rem-serv", { NULL }, 2495, "tcp" }, + { "fast-rem-serv", { NULL }, 2495, "udp" }, + { "dirgis", { NULL }, 2496, "tcp" }, + { "dirgis", { NULL }, 2496, "udp" }, + { "quaddb", { NULL }, 2497, "tcp" }, + { "quaddb", { NULL }, 2497, "udp" }, + { "odn-castraq", { NULL }, 2498, "tcp" }, + { "odn-castraq", { NULL }, 2498, "udp" }, + { "unicontrol", { NULL }, 2499, "tcp" }, + { "unicontrol", { NULL }, 2499, "udp" }, + { "rtsserv", { NULL }, 2500, "tcp" }, + { "rtsserv", { NULL }, 2500, "udp" }, + { "rtsclient", { NULL }, 2501, "tcp" }, + { "rtsclient", { NULL }, 2501, "udp" }, + { "kentrox-prot", { NULL }, 2502, "tcp" }, + { "kentrox-prot", { NULL }, 2502, "udp" }, + { "nms-dpnss", { NULL }, 2503, "tcp" }, + { "nms-dpnss", { NULL }, 2503, "udp" }, + { "wlbs", { NULL }, 2504, "tcp" }, + { "wlbs", { NULL }, 2504, "udp" }, + { "ppcontrol", { NULL }, 2505, "tcp" }, + { "ppcontrol", { NULL }, 2505, "udp" }, + { "jbroker", { NULL }, 2506, "tcp" }, + { "jbroker", { NULL }, 2506, "udp" }, + { "spock", { NULL }, 2507, "tcp" }, + { "spock", { NULL }, 2507, "udp" }, + { "jdatastore", { NULL }, 2508, "tcp" }, + { "jdatastore", { NULL }, 2508, "udp" }, + { "fjmpss", { NULL }, 2509, "tcp" }, + { "fjmpss", { NULL }, 2509, "udp" }, + { "fjappmgrbulk", { NULL }, 2510, "tcp" }, + { "fjappmgrbulk", { NULL }, 2510, "udp" }, + { "metastorm", { NULL }, 2511, "tcp" }, + { "metastorm", { NULL }, 2511, "udp" }, + { "citrixima", { NULL }, 2512, "tcp" }, + { "citrixima", { NULL }, 2512, "udp" }, + { "citrixadmin", { NULL }, 2513, "tcp" }, + { "citrixadmin", { NULL }, 2513, "udp" }, + { "facsys-ntp", { NULL }, 2514, "tcp" }, + { "facsys-ntp", { NULL }, 2514, "udp" }, + { "facsys-router", { NULL }, 2515, "tcp" }, + { "facsys-router", { NULL }, 2515, "udp" }, + { "maincontrol", { NULL }, 2516, "tcp" }, + { "maincontrol", { NULL }, 2516, "udp" }, + { "call-sig-trans", { NULL }, 2517, "tcp" }, + { "call-sig-trans", { NULL }, 2517, "udp" }, + { "willy", { NULL }, 2518, "tcp" }, + { "willy", { NULL }, 2518, "udp" }, + { "globmsgsvc", { NULL }, 2519, "tcp" }, + { "globmsgsvc", { NULL }, 2519, "udp" }, + { "pvsw", { NULL }, 2520, "tcp" }, + { "pvsw", { NULL }, 2520, "udp" }, + { "adaptecmgr", { NULL }, 2521, "tcp" }, + { "adaptecmgr", { NULL }, 2521, "udp" }, + { "windb", { NULL }, 2522, "tcp" }, + { "windb", { NULL }, 2522, "udp" }, + { "qke-llc-v3", { NULL }, 2523, "tcp" }, + { "qke-llc-v3", { NULL }, 2523, "udp" }, + { "optiwave-lm", { NULL }, 2524, "tcp" }, + { "optiwave-lm", { NULL }, 2524, "udp" }, + { "ms-v-worlds", { NULL }, 2525, "tcp" }, + { "ms-v-worlds", { NULL }, 2525, "udp" }, + { "ema-sent-lm", { NULL }, 2526, "tcp" }, + { "ema-sent-lm", { NULL }, 2526, "udp" }, + { "iqserver", { NULL }, 2527, "tcp" }, + { "iqserver", { NULL }, 2527, "udp" }, + { "ncr_ccl", { NULL }, 2528, "tcp" }, + { "ncr_ccl", { NULL }, 2528, "udp" }, + { "utsftp", { NULL }, 2529, "tcp" }, + { "utsftp", { NULL }, 2529, "udp" }, + { "vrcommerce", { NULL }, 2530, "tcp" }, + { "vrcommerce", { NULL }, 2530, "udp" }, + { "ito-e-gui", { NULL }, 2531, "tcp" }, + { "ito-e-gui", { NULL }, 2531, "udp" }, + { "ovtopmd", { NULL }, 2532, "tcp" }, + { "ovtopmd", { NULL }, 2532, "udp" }, + { "snifferserver", { NULL }, 2533, "tcp" }, + { "snifferserver", { NULL }, 2533, "udp" }, + { "combox-web-acc", { NULL }, 2534, "tcp" }, + { "combox-web-acc", { NULL }, 2534, "udp" }, + { "madcap", { NULL }, 2535, "tcp" }, + { "madcap", { NULL }, 2535, "udp" }, + { "btpp2audctr1", { NULL }, 2536, "tcp" }, + { "btpp2audctr1", { NULL }, 2536, "udp" }, + { "upgrade", { NULL }, 2537, "tcp" }, + { "upgrade", { NULL }, 2537, "udp" }, + { "vnwk-prapi", { NULL }, 2538, "tcp" }, + { "vnwk-prapi", { NULL }, 2538, "udp" }, + { "vsiadmin", { NULL }, 2539, "tcp" }, + { "vsiadmin", { NULL }, 2539, "udp" }, + { "lonworks", { NULL }, 2540, "tcp" }, + { "lonworks", { NULL }, 2540, "udp" }, + { "lonworks2", { NULL }, 2541, "tcp" }, + { "lonworks2", { NULL }, 2541, "udp" }, + { "udrawgraph", { NULL }, 2542, "tcp" }, + { "udrawgraph", { NULL }, 2542, "udp" }, + { "reftek", { NULL }, 2543, "tcp" }, + { "reftek", { NULL }, 2543, "udp" }, + { "novell-zen", { NULL }, 2544, "tcp" }, + { "novell-zen", { NULL }, 2544, "udp" }, + { "sis-emt", { NULL }, 2545, "tcp" }, + { "sis-emt", { NULL }, 2545, "udp" }, + { "vytalvaultbrtp", { NULL }, 2546, "tcp" }, + { "vytalvaultbrtp", { NULL }, 2546, "udp" }, + { "vytalvaultvsmp", { NULL }, 2547, "tcp" }, + { "vytalvaultvsmp", { NULL }, 2547, "udp" }, + { "vytalvaultpipe", { NULL }, 2548, "tcp" }, + { "vytalvaultpipe", { NULL }, 2548, "udp" }, + { "ipass", { NULL }, 2549, "tcp" }, + { "ipass", { NULL }, 2549, "udp" }, + { "ads", { NULL }, 2550, "tcp" }, + { "ads", { NULL }, 2550, "udp" }, + { "isg-uda-server", { NULL }, 2551, "tcp" }, + { "isg-uda-server", { NULL }, 2551, "udp" }, + { "call-logging", { NULL }, 2552, "tcp" }, + { "call-logging", { NULL }, 2552, "udp" }, + { "efidiningport", { NULL }, 2553, "tcp" }, + { "efidiningport", { NULL }, 2553, "udp" }, + { "vcnet-link-v10", { NULL }, 2554, "tcp" }, + { "vcnet-link-v10", { NULL }, 2554, "udp" }, + { "compaq-wcp", { NULL }, 2555, "tcp" }, + { "compaq-wcp", { NULL }, 2555, "udp" }, + { "nicetec-nmsvc", { NULL }, 2556, "tcp" }, + { "nicetec-nmsvc", { NULL }, 2556, "udp" }, + { "nicetec-mgmt", { NULL }, 2557, "tcp" }, + { "nicetec-mgmt", { NULL }, 2557, "udp" }, + { "pclemultimedia", { NULL }, 2558, "tcp" }, + { "pclemultimedia", { NULL }, 2558, "udp" }, + { "lstp", { NULL }, 2559, "tcp" }, + { "lstp", { NULL }, 2559, "udp" }, + { "labrat", { NULL }, 2560, "tcp" }, + { "labrat", { NULL }, 2560, "udp" }, + { "mosaixcc", { NULL }, 2561, "tcp" }, + { "mosaixcc", { NULL }, 2561, "udp" }, + { "delibo", { NULL }, 2562, "tcp" }, + { "delibo", { NULL }, 2562, "udp" }, + { "cti-redwood", { NULL }, 2563, "tcp" }, + { "cti-redwood", { NULL }, 2563, "udp" }, + { "hp-3000-telnet", { NULL }, 2564, "tcp" }, + { "coord-svr", { NULL }, 2565, "tcp" }, + { "coord-svr", { NULL }, 2565, "udp" }, + { "pcs-pcw", { NULL }, 2566, "tcp" }, + { "pcs-pcw", { NULL }, 2566, "udp" }, + { "clp", { NULL }, 2567, "tcp" }, + { "clp", { NULL }, 2567, "udp" }, + { "spamtrap", { NULL }, 2568, "tcp" }, + { "spamtrap", { NULL }, 2568, "udp" }, + { "sonuscallsig", { NULL }, 2569, "tcp" }, + { "sonuscallsig", { NULL }, 2569, "udp" }, + { "hs-port", { NULL }, 2570, "tcp" }, + { "hs-port", { NULL }, 2570, "udp" }, + { "cecsvc", { NULL }, 2571, "tcp" }, + { "cecsvc", { NULL }, 2571, "udp" }, + { "ibp", { NULL }, 2572, "tcp" }, + { "ibp", { NULL }, 2572, "udp" }, + { "trustestablish", { NULL }, 2573, "tcp" }, + { "trustestablish", { NULL }, 2573, "udp" }, + { "blockade-bpsp", { NULL }, 2574, "tcp" }, + { "blockade-bpsp", { NULL }, 2574, "udp" }, + { "hl7", { NULL }, 2575, "tcp" }, + { "hl7", { NULL }, 2575, "udp" }, + { "tclprodebugger", { NULL }, 2576, "tcp" }, + { "tclprodebugger", { NULL }, 2576, "udp" }, + { "scipticslsrvr", { NULL }, 2577, "tcp" }, + { "scipticslsrvr", { NULL }, 2577, "udp" }, + { "rvs-isdn-dcp", { NULL }, 2578, "tcp" }, + { "rvs-isdn-dcp", { NULL }, 2578, "udp" }, + { "mpfoncl", { NULL }, 2579, "tcp" }, + { "mpfoncl", { NULL }, 2579, "udp" }, + { "tributary", { NULL }, 2580, "tcp" }, + { "tributary", { NULL }, 2580, "udp" }, + { "argis-te", { NULL }, 2581, "tcp" }, + { "argis-te", { NULL }, 2581, "udp" }, + { "argis-ds", { NULL }, 2582, "tcp" }, + { "argis-ds", { NULL }, 2582, "udp" }, + { "mon", { NULL }, 2583, "tcp" }, + { "mon", { NULL }, 2583, "udp" }, + { "cyaserv", { NULL }, 2584, "tcp" }, + { "cyaserv", { NULL }, 2584, "udp" }, + { "netx-server", { NULL }, 2585, "tcp" }, + { "netx-server", { NULL }, 2585, "udp" }, + { "netx-agent", { NULL }, 2586, "tcp" }, + { "netx-agent", { NULL }, 2586, "udp" }, + { "masc", { NULL }, 2587, "tcp" }, + { "masc", { NULL }, 2587, "udp" }, + { "privilege", { NULL }, 2588, "tcp" }, + { "privilege", { NULL }, 2588, "udp" }, + { "quartus-tcl", { NULL }, 2589, "tcp" }, + { "quartus-tcl", { NULL }, 2589, "udp" }, + { "idotdist", { NULL }, 2590, "tcp" }, + { "idotdist", { NULL }, 2590, "udp" }, + { "maytagshuffle", { NULL }, 2591, "tcp" }, + { "maytagshuffle", { NULL }, 2591, "udp" }, + { "netrek", { NULL }, 2592, "tcp" }, + { "netrek", { NULL }, 2592, "udp" }, + { "mns-mail", { NULL }, 2593, "tcp" }, + { "mns-mail", { NULL }, 2593, "udp" }, + { "dts", { NULL }, 2594, "tcp" }, + { "dts", { NULL }, 2594, "udp" }, + { "worldfusion1", { NULL }, 2595, "tcp" }, + { "worldfusion1", { NULL }, 2595, "udp" }, + { "worldfusion2", { NULL }, 2596, "tcp" }, + { "worldfusion2", { NULL }, 2596, "udp" }, + { "homesteadglory", { NULL }, 2597, "tcp" }, + { "homesteadglory", { NULL }, 2597, "udp" }, + { "citriximaclient", { NULL }, 2598, "tcp" }, + { "citriximaclient", { NULL }, 2598, "udp" }, + { "snapd", { NULL }, 2599, "tcp" }, + { "snapd", { NULL }, 2599, "udp" }, + { "hpstgmgr", { NULL }, 2600, "tcp" }, + { "hpstgmgr", { NULL }, 2600, "udp" }, + { "discp-client", { NULL }, 2601, "tcp" }, + { "discp-client", { NULL }, 2601, "udp" }, + { "discp-server", { NULL }, 2602, "tcp" }, + { "discp-server", { NULL }, 2602, "udp" }, + { "servicemeter", { NULL }, 2603, "tcp" }, + { "servicemeter", { NULL }, 2603, "udp" }, + { "nsc-ccs", { NULL }, 2604, "tcp" }, + { "nsc-ccs", { NULL }, 2604, "udp" }, + { "nsc-posa", { NULL }, 2605, "tcp" }, + { "nsc-posa", { NULL }, 2605, "udp" }, + { "netmon", { NULL }, 2606, "tcp" }, + { "netmon", { NULL }, 2606, "udp" }, + { "connection", { NULL }, 2607, "tcp" }, + { "connection", { NULL }, 2607, "udp" }, + { "wag-service", { NULL }, 2608, "tcp" }, + { "wag-service", { NULL }, 2608, "udp" }, + { "system-monitor", { NULL }, 2609, "tcp" }, + { "system-monitor", { NULL }, 2609, "udp" }, + { "versa-tek", { NULL }, 2610, "tcp" }, + { "versa-tek", { NULL }, 2610, "udp" }, + { "lionhead", { NULL }, 2611, "tcp" }, + { "lionhead", { NULL }, 2611, "udp" }, + { "qpasa-agent", { NULL }, 2612, "tcp" }, + { "qpasa-agent", { NULL }, 2612, "udp" }, + { "smntubootstrap", { NULL }, 2613, "tcp" }, + { "smntubootstrap", { NULL }, 2613, "udp" }, + { "neveroffline", { NULL }, 2614, "tcp" }, + { "neveroffline", { NULL }, 2614, "udp" }, + { "firepower", { NULL }, 2615, "tcp" }, + { "firepower", { NULL }, 2615, "udp" }, + { "appswitch-emp", { NULL }, 2616, "tcp" }, + { "appswitch-emp", { NULL }, 2616, "udp" }, + { "cmadmin", { NULL }, 2617, "tcp" }, + { "cmadmin", { NULL }, 2617, "udp" }, + { "priority-e-com", { NULL }, 2618, "tcp" }, + { "priority-e-com", { NULL }, 2618, "udp" }, + { "bruce", { NULL }, 2619, "tcp" }, + { "bruce", { NULL }, 2619, "udp" }, + { "lpsrecommender", { NULL }, 2620, "tcp" }, + { "lpsrecommender", { NULL }, 2620, "udp" }, + { "miles-apart", { NULL }, 2621, "tcp" }, + { "miles-apart", { NULL }, 2621, "udp" }, + { "metricadbc", { NULL }, 2622, "tcp" }, + { "metricadbc", { NULL }, 2622, "udp" }, + { "lmdp", { NULL }, 2623, "tcp" }, + { "lmdp", { NULL }, 2623, "udp" }, + { "aria", { NULL }, 2624, "tcp" }, + { "aria", { NULL }, 2624, "udp" }, + { "blwnkl-port", { NULL }, 2625, "tcp" }, + { "blwnkl-port", { NULL }, 2625, "udp" }, + { "gbjd816", { NULL }, 2626, "tcp" }, + { "gbjd816", { NULL }, 2626, "udp" }, + { "moshebeeri", { NULL }, 2627, "tcp" }, + { "moshebeeri", { NULL }, 2627, "udp" }, + { "dict", { NULL }, 2628, "tcp" }, + { "dict", { NULL }, 2628, "udp" }, + { "sitaraserver", { NULL }, 2629, "tcp" }, + { "sitaraserver", { NULL }, 2629, "udp" }, + { "sitaramgmt", { NULL }, 2630, "tcp" }, + { "sitaramgmt", { NULL }, 2630, "udp" }, + { "sitaradir", { NULL }, 2631, "tcp" }, + { "sitaradir", { NULL }, 2631, "udp" }, + { "irdg-post", { NULL }, 2632, "tcp" }, + { "irdg-post", { NULL }, 2632, "udp" }, + { "interintelli", { NULL }, 2633, "tcp" }, + { "interintelli", { NULL }, 2633, "udp" }, + { "pk-electronics", { NULL }, 2634, "tcp" }, + { "pk-electronics", { NULL }, 2634, "udp" }, + { "backburner", { NULL }, 2635, "tcp" }, + { "backburner", { NULL }, 2635, "udp" }, + { "solve", { NULL }, 2636, "tcp" }, + { "solve", { NULL }, 2636, "udp" }, + { "imdocsvc", { NULL }, 2637, "tcp" }, + { "imdocsvc", { NULL }, 2637, "udp" }, + { "sybaseanywhere", { NULL }, 2638, "tcp" }, + { "sybaseanywhere", { NULL }, 2638, "udp" }, + { "aminet", { NULL }, 2639, "tcp" }, + { "aminet", { NULL }, 2639, "udp" }, + { "sai_sentlm", { NULL }, 2640, "tcp" }, + { "sai_sentlm", { NULL }, 2640, "udp" }, + { "hdl-srv", { NULL }, 2641, "tcp" }, + { "hdl-srv", { NULL }, 2641, "udp" }, + { "tragic", { NULL }, 2642, "tcp" }, + { "tragic", { NULL }, 2642, "udp" }, + { "gte-samp", { NULL }, 2643, "tcp" }, + { "gte-samp", { NULL }, 2643, "udp" }, + { "travsoft-ipx-t", { NULL }, 2644, "tcp" }, + { "travsoft-ipx-t", { NULL }, 2644, "udp" }, + { "novell-ipx-cmd", { NULL }, 2645, "tcp" }, + { "novell-ipx-cmd", { NULL }, 2645, "udp" }, + { "and-lm", { NULL }, 2646, "tcp" }, + { "and-lm", { NULL }, 2646, "udp" }, + { "syncserver", { NULL }, 2647, "tcp" }, + { "syncserver", { NULL }, 2647, "udp" }, + { "upsnotifyprot", { NULL }, 2648, "tcp" }, + { "upsnotifyprot", { NULL }, 2648, "udp" }, + { "vpsipport", { NULL }, 2649, "tcp" }, + { "vpsipport", { NULL }, 2649, "udp" }, + { "eristwoguns", { NULL }, 2650, "tcp" }, + { "eristwoguns", { NULL }, 2650, "udp" }, + { "ebinsite", { NULL }, 2651, "tcp" }, + { "ebinsite", { NULL }, 2651, "udp" }, + { "interpathpanel", { NULL }, 2652, "tcp" }, + { "interpathpanel", { NULL }, 2652, "udp" }, + { "sonus", { NULL }, 2653, "tcp" }, + { "sonus", { NULL }, 2653, "udp" }, + { "corel_vncadmin", { NULL }, 2654, "tcp" }, + { "corel_vncadmin", { NULL }, 2654, "udp" }, + { "unglue", { NULL }, 2655, "tcp" }, + { "unglue", { NULL }, 2655, "udp" }, + { "kana", { NULL }, 2656, "tcp" }, + { "kana", { NULL }, 2656, "udp" }, + { "sns-dispatcher", { NULL }, 2657, "tcp" }, + { "sns-dispatcher", { NULL }, 2657, "udp" }, + { "sns-admin", { NULL }, 2658, "tcp" }, + { "sns-admin", { NULL }, 2658, "udp" }, + { "sns-query", { NULL }, 2659, "tcp" }, + { "sns-query", { NULL }, 2659, "udp" }, + { "gcmonitor", { NULL }, 2660, "tcp" }, + { "gcmonitor", { NULL }, 2660, "udp" }, + { "olhost", { NULL }, 2661, "tcp" }, + { "olhost", { NULL }, 2661, "udp" }, + { "bintec-capi", { NULL }, 2662, "tcp" }, + { "bintec-capi", { NULL }, 2662, "udp" }, + { "bintec-tapi", { NULL }, 2663, "tcp" }, + { "bintec-tapi", { NULL }, 2663, "udp" }, + { "patrol-mq-gm", { NULL }, 2664, "tcp" }, + { "patrol-mq-gm", { NULL }, 2664, "udp" }, + { "patrol-mq-nm", { NULL }, 2665, "tcp" }, + { "patrol-mq-nm", { NULL }, 2665, "udp" }, + { "extensis", { NULL }, 2666, "tcp" }, + { "extensis", { NULL }, 2666, "udp" }, + { "alarm-clock-s", { NULL }, 2667, "tcp" }, + { "alarm-clock-s", { NULL }, 2667, "udp" }, + { "alarm-clock-c", { NULL }, 2668, "tcp" }, + { "alarm-clock-c", { NULL }, 2668, "udp" }, + { "toad", { NULL }, 2669, "tcp" }, + { "toad", { NULL }, 2669, "udp" }, + { "tve-announce", { NULL }, 2670, "tcp" }, + { "tve-announce", { NULL }, 2670, "udp" }, + { "newlixreg", { NULL }, 2671, "tcp" }, + { "newlixreg", { NULL }, 2671, "udp" }, + { "nhserver", { NULL }, 2672, "tcp" }, + { "nhserver", { NULL }, 2672, "udp" }, + { "firstcall42", { NULL }, 2673, "tcp" }, + { "firstcall42", { NULL }, 2673, "udp" }, + { "ewnn", { NULL }, 2674, "tcp" }, + { "ewnn", { NULL }, 2674, "udp" }, + { "ttc-etap", { NULL }, 2675, "tcp" }, + { "ttc-etap", { NULL }, 2675, "udp" }, + { "simslink", { NULL }, 2676, "tcp" }, + { "simslink", { NULL }, 2676, "udp" }, + { "gadgetgate1way", { NULL }, 2677, "tcp" }, + { "gadgetgate1way", { NULL }, 2677, "udp" }, + { "gadgetgate2way", { NULL }, 2678, "tcp" }, + { "gadgetgate2way", { NULL }, 2678, "udp" }, + { "syncserverssl", { NULL }, 2679, "tcp" }, + { "syncserverssl", { NULL }, 2679, "udp" }, + { "pxc-sapxom", { NULL }, 2680, "tcp" }, + { "pxc-sapxom", { NULL }, 2680, "udp" }, + { "mpnjsomb", { NULL }, 2681, "tcp" }, + { "mpnjsomb", { NULL }, 2681, "udp" }, + { "ncdloadbalance", { NULL }, 2683, "tcp" }, + { "ncdloadbalance", { NULL }, 2683, "udp" }, + { "mpnjsosv", { NULL }, 2684, "tcp" }, + { "mpnjsosv", { NULL }, 2684, "udp" }, + { "mpnjsocl", { NULL }, 2685, "tcp" }, + { "mpnjsocl", { NULL }, 2685, "udp" }, + { "mpnjsomg", { NULL }, 2686, "tcp" }, + { "mpnjsomg", { NULL }, 2686, "udp" }, + { "pq-lic-mgmt", { NULL }, 2687, "tcp" }, + { "pq-lic-mgmt", { NULL }, 2687, "udp" }, + { "md-cg-http", { NULL }, 2688, "tcp" }, + { "md-cg-http", { NULL }, 2688, "udp" }, + { "fastlynx", { NULL }, 2689, "tcp" }, + { "fastlynx", { NULL }, 2689, "udp" }, + { "hp-nnm-data", { NULL }, 2690, "tcp" }, + { "hp-nnm-data", { NULL }, 2690, "udp" }, + { "itinternet", { NULL }, 2691, "tcp" }, + { "itinternet", { NULL }, 2691, "udp" }, + { "admins-lms", { NULL }, 2692, "tcp" }, + { "admins-lms", { NULL }, 2692, "udp" }, + { "pwrsevent", { NULL }, 2694, "tcp" }, + { "pwrsevent", { NULL }, 2694, "udp" }, + { "vspread", { NULL }, 2695, "tcp" }, + { "vspread", { NULL }, 2695, "udp" }, + { "unifyadmin", { NULL }, 2696, "tcp" }, + { "unifyadmin", { NULL }, 2696, "udp" }, + { "oce-snmp-trap", { NULL }, 2697, "tcp" }, + { "oce-snmp-trap", { NULL }, 2697, "udp" }, + { "mck-ivpip", { NULL }, 2698, "tcp" }, + { "mck-ivpip", { NULL }, 2698, "udp" }, + { "csoft-plusclnt", { NULL }, 2699, "tcp" }, + { "csoft-plusclnt", { NULL }, 2699, "udp" }, + { "tqdata", { NULL }, 2700, "tcp" }, + { "tqdata", { NULL }, 2700, "udp" }, + { "sms-rcinfo", { NULL }, 2701, "tcp" }, + { "sms-rcinfo", { NULL }, 2701, "udp" }, + { "sms-xfer", { NULL }, 2702, "tcp" }, + { "sms-xfer", { NULL }, 2702, "udp" }, + { "sms-chat", { NULL }, 2703, "tcp" }, + { "sms-chat", { NULL }, 2703, "udp" }, + { "sms-remctrl", { NULL }, 2704, "tcp" }, + { "sms-remctrl", { NULL }, 2704, "udp" }, + { "sds-admin", { NULL }, 2705, "tcp" }, + { "sds-admin", { NULL }, 2705, "udp" }, + { "ncdmirroring", { NULL }, 2706, "tcp" }, + { "ncdmirroring", { NULL }, 2706, "udp" }, + { "emcsymapiport", { NULL }, 2707, "tcp" }, + { "emcsymapiport", { NULL }, 2707, "udp" }, + { "banyan-net", { NULL }, 2708, "tcp" }, + { "banyan-net", { NULL }, 2708, "udp" }, + { "supermon", { NULL }, 2709, "tcp" }, + { "supermon", { NULL }, 2709, "udp" }, + { "sso-service", { NULL }, 2710, "tcp" }, + { "sso-service", { NULL }, 2710, "udp" }, + { "sso-control", { NULL }, 2711, "tcp" }, + { "sso-control", { NULL }, 2711, "udp" }, + { "aocp", { NULL }, 2712, "tcp" }, + { "aocp", { NULL }, 2712, "udp" }, + { "raventbs", { NULL }, 2713, "tcp" }, + { "raventbs", { NULL }, 2713, "udp" }, + { "raventdm", { NULL }, 2714, "tcp" }, + { "raventdm", { NULL }, 2714, "udp" }, + { "hpstgmgr2", { NULL }, 2715, "tcp" }, + { "hpstgmgr2", { NULL }, 2715, "udp" }, + { "inova-ip-disco", { NULL }, 2716, "tcp" }, + { "inova-ip-disco", { NULL }, 2716, "udp" }, + { "pn-requester", { NULL }, 2717, "tcp" }, + { "pn-requester", { NULL }, 2717, "udp" }, + { "pn-requester2", { NULL }, 2718, "tcp" }, + { "pn-requester2", { NULL }, 2718, "udp" }, + { "scan-change", { NULL }, 2719, "tcp" }, + { "scan-change", { NULL }, 2719, "udp" }, + { "wkars", { NULL }, 2720, "tcp" }, + { "wkars", { NULL }, 2720, "udp" }, + { "smart-diagnose", { NULL }, 2721, "tcp" }, + { "smart-diagnose", { NULL }, 2721, "udp" }, + { "proactivesrvr", { NULL }, 2722, "tcp" }, + { "proactivesrvr", { NULL }, 2722, "udp" }, + { "watchdog-nt", { NULL }, 2723, "tcp" }, + { "watchdog-nt", { NULL }, 2723, "udp" }, + { "qotps", { NULL }, 2724, "tcp" }, + { "qotps", { NULL }, 2724, "udp" }, + { "msolap-ptp2", { NULL }, 2725, "tcp" }, + { "msolap-ptp2", { NULL }, 2725, "udp" }, + { "tams", { NULL }, 2726, "tcp" }, + { "tams", { NULL }, 2726, "udp" }, + { "mgcp-callagent", { NULL }, 2727, "tcp" }, + { "mgcp-callagent", { NULL }, 2727, "udp" }, + { "sqdr", { NULL }, 2728, "tcp" }, + { "sqdr", { NULL }, 2728, "udp" }, + { "tcim-control", { NULL }, 2729, "tcp" }, + { "tcim-control", { NULL }, 2729, "udp" }, + { "nec-raidplus", { NULL }, 2730, "tcp" }, + { "nec-raidplus", { NULL }, 2730, "udp" }, + { "fyre-messanger", { NULL }, 2731, "tcp" }, + { "fyre-messanger", { NULL }, 2731, "udp" }, + { "g5m", { NULL }, 2732, "tcp" }, + { "g5m", { NULL }, 2732, "udp" }, + { "signet-ctf", { NULL }, 2733, "tcp" }, + { "signet-ctf", { NULL }, 2733, "udp" }, + { "ccs-software", { NULL }, 2734, "tcp" }, + { "ccs-software", { NULL }, 2734, "udp" }, + { "netiq-mc", { NULL }, 2735, "tcp" }, + { "netiq-mc", { NULL }, 2735, "udp" }, + { "radwiz-nms-srv", { NULL }, 2736, "tcp" }, + { "radwiz-nms-srv", { NULL }, 2736, "udp" }, + { "srp-feedback", { NULL }, 2737, "tcp" }, + { "srp-feedback", { NULL }, 2737, "udp" }, + { "ndl-tcp-ois-gw", { NULL }, 2738, "tcp" }, + { "ndl-tcp-ois-gw", { NULL }, 2738, "udp" }, + { "tn-timing", { NULL }, 2739, "tcp" }, + { "tn-timing", { NULL }, 2739, "udp" }, + { "alarm", { NULL }, 2740, "tcp" }, + { "alarm", { NULL }, 2740, "udp" }, + { "tsb", { NULL }, 2741, "tcp" }, + { "tsb", { NULL }, 2741, "udp" }, + { "tsb2", { NULL }, 2742, "tcp" }, + { "tsb2", { NULL }, 2742, "udp" }, + { "murx", { NULL }, 2743, "tcp" }, + { "murx", { NULL }, 2743, "udp" }, + { "honyaku", { NULL }, 2744, "tcp" }, + { "honyaku", { NULL }, 2744, "udp" }, + { "urbisnet", { NULL }, 2745, "tcp" }, + { "urbisnet", { NULL }, 2745, "udp" }, + { "cpudpencap", { NULL }, 2746, "tcp" }, + { "cpudpencap", { NULL }, 2746, "udp" }, + { "fjippol-swrly", { NULL }, 2747, "tcp" }, + { "fjippol-swrly", { NULL }, 2747, "udp" }, + { "fjippol-polsvr", { NULL }, 2748, "tcp" }, + { "fjippol-polsvr", { NULL }, 2748, "udp" }, + { "fjippol-cnsl", { NULL }, 2749, "tcp" }, + { "fjippol-cnsl", { NULL }, 2749, "udp" }, + { "fjippol-port1", { NULL }, 2750, "tcp" }, + { "fjippol-port1", { NULL }, 2750, "udp" }, + { "fjippol-port2", { NULL }, 2751, "tcp" }, + { "fjippol-port2", { NULL }, 2751, "udp" }, + { "rsisysaccess", { NULL }, 2752, "tcp" }, + { "rsisysaccess", { NULL }, 2752, "udp" }, + { "de-spot", { NULL }, 2753, "tcp" }, + { "de-spot", { NULL }, 2753, "udp" }, + { "apollo-cc", { NULL }, 2754, "tcp" }, + { "apollo-cc", { NULL }, 2754, "udp" }, + { "expresspay", { NULL }, 2755, "tcp" }, + { "expresspay", { NULL }, 2755, "udp" }, + { "simplement-tie", { NULL }, 2756, "tcp" }, + { "simplement-tie", { NULL }, 2756, "udp" }, + { "cnrp", { NULL }, 2757, "tcp" }, + { "cnrp", { NULL }, 2757, "udp" }, + { "apollo-status", { NULL }, 2758, "tcp" }, + { "apollo-status", { NULL }, 2758, "udp" }, + { "apollo-gms", { NULL }, 2759, "tcp" }, + { "apollo-gms", { NULL }, 2759, "udp" }, + { "sabams", { NULL }, 2760, "tcp" }, + { "sabams", { NULL }, 2760, "udp" }, + { "dicom-iscl", { NULL }, 2761, "tcp" }, + { "dicom-iscl", { NULL }, 2761, "udp" }, + { "dicom-tls", { NULL }, 2762, "tcp" }, + { "dicom-tls", { NULL }, 2762, "udp" }, + { "desktop-dna", { NULL }, 2763, "tcp" }, + { "desktop-dna", { NULL }, 2763, "udp" }, + { "data-insurance", { NULL }, 2764, "tcp" }, + { "data-insurance", { NULL }, 2764, "udp" }, + { "qip-audup", { NULL }, 2765, "tcp" }, + { "qip-audup", { NULL }, 2765, "udp" }, + { "compaq-scp", { NULL }, 2766, "tcp" }, + { "compaq-scp", { NULL }, 2766, "udp" }, + { "uadtc", { NULL }, 2767, "tcp" }, + { "uadtc", { NULL }, 2767, "udp" }, + { "uacs", { NULL }, 2768, "tcp" }, + { "uacs", { NULL }, 2768, "udp" }, + { "exce", { NULL }, 2769, "tcp" }, + { "exce", { NULL }, 2769, "udp" }, + { "veronica", { NULL }, 2770, "tcp" }, + { "veronica", { NULL }, 2770, "udp" }, + { "vergencecm", { NULL }, 2771, "tcp" }, + { "vergencecm", { NULL }, 2771, "udp" }, + { "auris", { NULL }, 2772, "tcp" }, + { "auris", { NULL }, 2772, "udp" }, + { "rbakcup1", { NULL }, 2773, "tcp" }, + { "rbakcup1", { NULL }, 2773, "udp" }, + { "rbakcup2", { NULL }, 2774, "tcp" }, + { "rbakcup2", { NULL }, 2774, "udp" }, + { "smpp", { NULL }, 2775, "tcp" }, + { "smpp", { NULL }, 2775, "udp" }, + { "ridgeway1", { NULL }, 2776, "tcp" }, + { "ridgeway1", { NULL }, 2776, "udp" }, + { "ridgeway2", { NULL }, 2777, "tcp" }, + { "ridgeway2", { NULL }, 2777, "udp" }, + { "gwen-sonya", { NULL }, 2778, "tcp" }, + { "gwen-sonya", { NULL }, 2778, "udp" }, + { "lbc-sync", { NULL }, 2779, "tcp" }, + { "lbc-sync", { NULL }, 2779, "udp" }, + { "lbc-control", { NULL }, 2780, "tcp" }, + { "lbc-control", { NULL }, 2780, "udp" }, + { "whosells", { NULL }, 2781, "tcp" }, + { "whosells", { NULL }, 2781, "udp" }, + { "everydayrc", { NULL }, 2782, "tcp" }, + { "everydayrc", { NULL }, 2782, "udp" }, + { "aises", { NULL }, 2783, "tcp" }, + { "aises", { NULL }, 2783, "udp" }, + { "www-dev", { NULL }, 2784, "tcp" }, + { "www-dev", { NULL }, 2784, "udp" }, + { "aic-np", { NULL }, 2785, "tcp" }, + { "aic-np", { NULL }, 2785, "udp" }, + { "aic-oncrpc", { NULL }, 2786, "tcp" }, + { "aic-oncrpc", { NULL }, 2786, "udp" }, + { "piccolo", { NULL }, 2787, "tcp" }, + { "piccolo", { NULL }, 2787, "udp" }, + { "fryeserv", { NULL }, 2788, "tcp" }, + { "fryeserv", { NULL }, 2788, "udp" }, + { "media-agent", { NULL }, 2789, "tcp" }, + { "media-agent", { NULL }, 2789, "udp" }, + { "plgproxy", { NULL }, 2790, "tcp" }, + { "plgproxy", { NULL }, 2790, "udp" }, + { "mtport-regist", { NULL }, 2791, "tcp" }, + { "mtport-regist", { NULL }, 2791, "udp" }, + { "f5-globalsite", { NULL }, 2792, "tcp" }, + { "f5-globalsite", { NULL }, 2792, "udp" }, + { "initlsmsad", { NULL }, 2793, "tcp" }, + { "initlsmsad", { NULL }, 2793, "udp" }, + { "livestats", { NULL }, 2795, "tcp" }, + { "livestats", { NULL }, 2795, "udp" }, + { "ac-tech", { NULL }, 2796, "tcp" }, + { "ac-tech", { NULL }, 2796, "udp" }, + { "esp-encap", { NULL }, 2797, "tcp" }, + { "esp-encap", { NULL }, 2797, "udp" }, + { "tmesis-upshot", { NULL }, 2798, "tcp" }, + { "tmesis-upshot", { NULL }, 2798, "udp" }, + { "icon-discover", { NULL }, 2799, "tcp" }, + { "icon-discover", { NULL }, 2799, "udp" }, + { "acc-raid", { NULL }, 2800, "tcp" }, + { "acc-raid", { NULL }, 2800, "udp" }, + { "igcp", { NULL }, 2801, "tcp" }, + { "igcp", { NULL }, 2801, "udp" }, + { "veritas-tcp1", { NULL }, 2802, "tcp" }, + { "veritas-udp1", { NULL }, 2802, "udp" }, + { "btprjctrl", { NULL }, 2803, "tcp" }, + { "btprjctrl", { NULL }, 2803, "udp" }, + { "dvr-esm", { NULL }, 2804, "tcp" }, + { "dvr-esm", { NULL }, 2804, "udp" }, + { "wta-wsp-s", { NULL }, 2805, "tcp" }, + { "wta-wsp-s", { NULL }, 2805, "udp" }, + { "cspuni", { NULL }, 2806, "tcp" }, + { "cspuni", { NULL }, 2806, "udp" }, + { "cspmulti", { NULL }, 2807, "tcp" }, + { "cspmulti", { NULL }, 2807, "udp" }, + { "j-lan-p", { NULL }, 2808, "tcp" }, + { "j-lan-p", { NULL }, 2808, "udp" }, + { "corbaloc", { NULL }, 2809, "tcp" }, + { "corbaloc", { NULL }, 2809, "udp" }, + { "netsteward", { NULL }, 2810, "tcp" }, + { "netsteward", { NULL }, 2810, "udp" }, + { "gsiftp", { NULL }, 2811, "tcp" }, + { "gsiftp", { NULL }, 2811, "udp" }, + { "atmtcp", { NULL }, 2812, "tcp" }, + { "atmtcp", { NULL }, 2812, "udp" }, + { "llm-pass", { NULL }, 2813, "tcp" }, + { "llm-pass", { NULL }, 2813, "udp" }, + { "llm-csv", { NULL }, 2814, "tcp" }, + { "llm-csv", { NULL }, 2814, "udp" }, + { "lbc-measure", { NULL }, 2815, "tcp" }, + { "lbc-measure", { NULL }, 2815, "udp" }, + { "lbc-watchdog", { NULL }, 2816, "tcp" }, + { "lbc-watchdog", { NULL }, 2816, "udp" }, + { "nmsigport", { NULL }, 2817, "tcp" }, + { "nmsigport", { NULL }, 2817, "udp" }, + { "rmlnk", { NULL }, 2818, "tcp" }, + { "rmlnk", { NULL }, 2818, "udp" }, + { "fc-faultnotify", { NULL }, 2819, "tcp" }, + { "fc-faultnotify", { NULL }, 2819, "udp" }, + { "univision", { NULL }, 2820, "tcp" }, + { "univision", { NULL }, 2820, "udp" }, + { "vrts-at-port", { NULL }, 2821, "tcp" }, + { "vrts-at-port", { NULL }, 2821, "udp" }, + { "ka0wuc", { NULL }, 2822, "tcp" }, + { "ka0wuc", { NULL }, 2822, "udp" }, + { "cqg-netlan", { NULL }, 2823, "tcp" }, + { "cqg-netlan", { NULL }, 2823, "udp" }, + { "cqg-netlan-1", { NULL }, 2824, "tcp" }, + { "cqg-netlan-1", { NULL }, 2824, "udp" }, + { "slc-systemlog", { NULL }, 2826, "tcp" }, + { "slc-systemlog", { NULL }, 2826, "udp" }, + { "slc-ctrlrloops", { NULL }, 2827, "tcp" }, + { "slc-ctrlrloops", { NULL }, 2827, "udp" }, + { "itm-lm", { NULL }, 2828, "tcp" }, + { "itm-lm", { NULL }, 2828, "udp" }, + { "silkp1", { NULL }, 2829, "tcp" }, + { "silkp1", { NULL }, 2829, "udp" }, + { "silkp2", { NULL }, 2830, "tcp" }, + { "silkp2", { NULL }, 2830, "udp" }, + { "silkp3", { NULL }, 2831, "tcp" }, + { "silkp3", { NULL }, 2831, "udp" }, + { "silkp4", { NULL }, 2832, "tcp" }, + { "silkp4", { NULL }, 2832, "udp" }, + { "glishd", { NULL }, 2833, "tcp" }, + { "glishd", { NULL }, 2833, "udp" }, + { "evtp", { NULL }, 2834, "tcp" }, + { "evtp", { NULL }, 2834, "udp" }, + { "evtp-data", { NULL }, 2835, "tcp" }, + { "evtp-data", { NULL }, 2835, "udp" }, + { "catalyst", { NULL }, 2836, "tcp" }, + { "catalyst", { NULL }, 2836, "udp" }, + { "repliweb", { NULL }, 2837, "tcp" }, + { "repliweb", { NULL }, 2837, "udp" }, + { "starbot", { NULL }, 2838, "tcp" }, + { "starbot", { NULL }, 2838, "udp" }, + { "nmsigport", { NULL }, 2839, "tcp" }, + { "nmsigport", { NULL }, 2839, "udp" }, + { "l3-exprt", { NULL }, 2840, "tcp" }, + { "l3-exprt", { NULL }, 2840, "udp" }, + { "l3-ranger", { NULL }, 2841, "tcp" }, + { "l3-ranger", { NULL }, 2841, "udp" }, + { "l3-hawk", { NULL }, 2842, "tcp" }, + { "l3-hawk", { NULL }, 2842, "udp" }, + { "pdnet", { NULL }, 2843, "tcp" }, + { "pdnet", { NULL }, 2843, "udp" }, + { "bpcp-poll", { NULL }, 2844, "tcp" }, + { "bpcp-poll", { NULL }, 2844, "udp" }, + { "bpcp-trap", { NULL }, 2845, "tcp" }, + { "bpcp-trap", { NULL }, 2845, "udp" }, + { "aimpp-hello", { NULL }, 2846, "tcp" }, + { "aimpp-hello", { NULL }, 2846, "udp" }, + { "aimpp-port-req", { NULL }, 2847, "tcp" }, + { "aimpp-port-req", { NULL }, 2847, "udp" }, + { "amt-blc-port", { NULL }, 2848, "tcp" }, + { "amt-blc-port", { NULL }, 2848, "udp" }, + { "fxp", { NULL }, 2849, "tcp" }, + { "fxp", { NULL }, 2849, "udp" }, + { "metaconsole", { NULL }, 2850, "tcp" }, + { "metaconsole", { NULL }, 2850, "udp" }, + { "webemshttp", { NULL }, 2851, "tcp" }, + { "webemshttp", { NULL }, 2851, "udp" }, + { "bears-01", { NULL }, 2852, "tcp" }, + { "bears-01", { NULL }, 2852, "udp" }, + { "ispipes", { NULL }, 2853, "tcp" }, + { "ispipes", { NULL }, 2853, "udp" }, + { "infomover", { NULL }, 2854, "tcp" }, + { "infomover", { NULL }, 2854, "udp" }, + { "msrp", { NULL }, 2855, "tcp" }, + { "msrp", { NULL }, 2855, "udp" }, + { "cesdinv", { NULL }, 2856, "tcp" }, + { "cesdinv", { NULL }, 2856, "udp" }, + { "simctlp", { NULL }, 2857, "tcp" }, + { "simctlp", { NULL }, 2857, "udp" }, + { "ecnp", { NULL }, 2858, "tcp" }, + { "ecnp", { NULL }, 2858, "udp" }, + { "activememory", { NULL }, 2859, "tcp" }, + { "activememory", { NULL }, 2859, "udp" }, + { "dialpad-voice1", { NULL }, 2860, "tcp" }, + { "dialpad-voice1", { NULL }, 2860, "udp" }, + { "dialpad-voice2", { NULL }, 2861, "tcp" }, + { "dialpad-voice2", { NULL }, 2861, "udp" }, + { "ttg-protocol", { NULL }, 2862, "tcp" }, + { "ttg-protocol", { NULL }, 2862, "udp" }, + { "sonardata", { NULL }, 2863, "tcp" }, + { "sonardata", { NULL }, 2863, "udp" }, + { "astromed-main", { NULL }, 2864, "tcp" }, + { "astromed-main", { NULL }, 2864, "udp" }, + { "pit-vpn", { NULL }, 2865, "tcp" }, + { "pit-vpn", { NULL }, 2865, "udp" }, + { "iwlistener", { NULL }, 2866, "tcp" }, + { "iwlistener", { NULL }, 2866, "udp" }, + { "esps-portal", { NULL }, 2867, "tcp" }, + { "esps-portal", { NULL }, 2867, "udp" }, + { "npep-messaging", { NULL }, 2868, "tcp" }, + { "npep-messaging", { NULL }, 2868, "udp" }, + { "icslap", { NULL }, 2869, "tcp" }, + { "icslap", { NULL }, 2869, "udp" }, + { "daishi", { NULL }, 2870, "tcp" }, + { "daishi", { NULL }, 2870, "udp" }, + { "msi-selectplay", { NULL }, 2871, "tcp" }, + { "msi-selectplay", { NULL }, 2871, "udp" }, + { "radix", { NULL }, 2872, "tcp" }, + { "radix", { NULL }, 2872, "udp" }, + { "dxmessagebase1", { NULL }, 2874, "tcp" }, + { "dxmessagebase1", { NULL }, 2874, "udp" }, + { "dxmessagebase2", { NULL }, 2875, "tcp" }, + { "dxmessagebase2", { NULL }, 2875, "udp" }, + { "sps-tunnel", { NULL }, 2876, "tcp" }, + { "sps-tunnel", { NULL }, 2876, "udp" }, + { "bluelance", { NULL }, 2877, "tcp" }, + { "bluelance", { NULL }, 2877, "udp" }, + { "aap", { NULL }, 2878, "tcp" }, + { "aap", { NULL }, 2878, "udp" }, + { "ucentric-ds", { NULL }, 2879, "tcp" }, + { "ucentric-ds", { NULL }, 2879, "udp" }, + { "synapse", { NULL }, 2880, "tcp" }, + { "synapse", { NULL }, 2880, "udp" }, + { "ndsp", { NULL }, 2881, "tcp" }, + { "ndsp", { NULL }, 2881, "udp" }, + { "ndtp", { NULL }, 2882, "tcp" }, + { "ndtp", { NULL }, 2882, "udp" }, + { "ndnp", { NULL }, 2883, "tcp" }, + { "ndnp", { NULL }, 2883, "udp" }, + { "flashmsg", { NULL }, 2884, "tcp" }, + { "flashmsg", { NULL }, 2884, "udp" }, + { "topflow", { NULL }, 2885, "tcp" }, + { "topflow", { NULL }, 2885, "udp" }, + { "responselogic", { NULL }, 2886, "tcp" }, + { "responselogic", { NULL }, 2886, "udp" }, + { "aironetddp", { NULL }, 2887, "tcp" }, + { "aironetddp", { NULL }, 2887, "udp" }, + { "spcsdlobby", { NULL }, 2888, "tcp" }, + { "spcsdlobby", { NULL }, 2888, "udp" }, + { "rsom", { NULL }, 2889, "tcp" }, + { "rsom", { NULL }, 2889, "udp" }, + { "cspclmulti", { NULL }, 2890, "tcp" }, + { "cspclmulti", { NULL }, 2890, "udp" }, + { "cinegrfx-elmd", { NULL }, 2891, "tcp" }, + { "cinegrfx-elmd", { NULL }, 2891, "udp" }, + { "snifferdata", { NULL }, 2892, "tcp" }, + { "snifferdata", { NULL }, 2892, "udp" }, + { "vseconnector", { NULL }, 2893, "tcp" }, + { "vseconnector", { NULL }, 2893, "udp" }, + { "abacus-remote", { NULL }, 2894, "tcp" }, + { "abacus-remote", { NULL }, 2894, "udp" }, + { "natuslink", { NULL }, 2895, "tcp" }, + { "natuslink", { NULL }, 2895, "udp" }, + { "ecovisiong6-1", { NULL }, 2896, "tcp" }, + { "ecovisiong6-1", { NULL }, 2896, "udp" }, + { "citrix-rtmp", { NULL }, 2897, "tcp" }, + { "citrix-rtmp", { NULL }, 2897, "udp" }, + { "appliance-cfg", { NULL }, 2898, "tcp" }, + { "appliance-cfg", { NULL }, 2898, "udp" }, + { "powergemplus", { NULL }, 2899, "tcp" }, + { "powergemplus", { NULL }, 2899, "udp" }, + { "quicksuite", { NULL }, 2900, "tcp" }, + { "quicksuite", { NULL }, 2900, "udp" }, + { "allstorcns", { NULL }, 2901, "tcp" }, + { "allstorcns", { NULL }, 2901, "udp" }, + { "netaspi", { NULL }, 2902, "tcp" }, + { "netaspi", { NULL }, 2902, "udp" }, + { "suitcase", { NULL }, 2903, "tcp" }, + { "suitcase", { NULL }, 2903, "udp" }, + { "m2ua", { NULL }, 2904, "tcp" }, + { "m2ua", { NULL }, 2904, "udp" }, + { "m2ua", { NULL }, 2904, "sctp"}, + { "m3ua", { NULL }, 2905, "tcp" }, + { "m3ua", { NULL }, 2905, "sctp"}, + { "caller9", { NULL }, 2906, "tcp" }, + { "caller9", { NULL }, 2906, "udp" }, + { "webmethods-b2b", { NULL }, 2907, "tcp" }, + { "webmethods-b2b", { NULL }, 2907, "udp" }, + { "mao", { NULL }, 2908, "tcp" }, + { "mao", { NULL }, 2908, "udp" }, + { "funk-dialout", { NULL }, 2909, "tcp" }, + { "funk-dialout", { NULL }, 2909, "udp" }, + { "tdaccess", { NULL }, 2910, "tcp" }, + { "tdaccess", { NULL }, 2910, "udp" }, + { "blockade", { NULL }, 2911, "tcp" }, + { "blockade", { NULL }, 2911, "udp" }, + { "epicon", { NULL }, 2912, "tcp" }, + { "epicon", { NULL }, 2912, "udp" }, + { "boosterware", { NULL }, 2913, "tcp" }, + { "boosterware", { NULL }, 2913, "udp" }, + { "gamelobby", { NULL }, 2914, "tcp" }, + { "gamelobby", { NULL }, 2914, "udp" }, + { "tksocket", { NULL }, 2915, "tcp" }, + { "tksocket", { NULL }, 2915, "udp" }, + { "elvin_server", { NULL }, 2916, "tcp" }, + { "elvin_server", { NULL }, 2916, "udp" }, + { "elvin_client", { NULL }, 2917, "tcp" }, + { "elvin_client", { NULL }, 2917, "udp" }, + { "kastenchasepad", { NULL }, 2918, "tcp" }, + { "kastenchasepad", { NULL }, 2918, "udp" }, + { "roboer", { NULL }, 2919, "tcp" }, + { "roboer", { NULL }, 2919, "udp" }, + { "roboeda", { NULL }, 2920, "tcp" }, + { "roboeda", { NULL }, 2920, "udp" }, + { "cesdcdman", { NULL }, 2921, "tcp" }, + { "cesdcdman", { NULL }, 2921, "udp" }, + { "cesdcdtrn", { NULL }, 2922, "tcp" }, + { "cesdcdtrn", { NULL }, 2922, "udp" }, + { "wta-wsp-wtp-s", { NULL }, 2923, "tcp" }, + { "wta-wsp-wtp-s", { NULL }, 2923, "udp" }, + { "precise-vip", { NULL }, 2924, "tcp" }, + { "precise-vip", { NULL }, 2924, "udp" }, + { "mobile-file-dl", { NULL }, 2926, "tcp" }, + { "mobile-file-dl", { NULL }, 2926, "udp" }, + { "unimobilectrl", { NULL }, 2927, "tcp" }, + { "unimobilectrl", { NULL }, 2927, "udp" }, + { "redstone-cpss", { NULL }, 2928, "tcp" }, + { "redstone-cpss", { NULL }, 2928, "udp" }, + { "amx-webadmin", { NULL }, 2929, "tcp" }, + { "amx-webadmin", { NULL }, 2929, "udp" }, + { "amx-weblinx", { NULL }, 2930, "tcp" }, + { "amx-weblinx", { NULL }, 2930, "udp" }, + { "circle-x", { NULL }, 2931, "tcp" }, + { "circle-x", { NULL }, 2931, "udp" }, + { "incp", { NULL }, 2932, "tcp" }, + { "incp", { NULL }, 2932, "udp" }, + { "4-tieropmgw", { NULL }, 2933, "tcp" }, + { "4-tieropmgw", { NULL }, 2933, "udp" }, + { "4-tieropmcli", { NULL }, 2934, "tcp" }, + { "4-tieropmcli", { NULL }, 2934, "udp" }, + { "qtp", { NULL }, 2935, "tcp" }, + { "qtp", { NULL }, 2935, "udp" }, + { "otpatch", { NULL }, 2936, "tcp" }, + { "otpatch", { NULL }, 2936, "udp" }, + { "pnaconsult-lm", { NULL }, 2937, "tcp" }, + { "pnaconsult-lm", { NULL }, 2937, "udp" }, + { "sm-pas-1", { NULL }, 2938, "tcp" }, + { "sm-pas-1", { NULL }, 2938, "udp" }, + { "sm-pas-2", { NULL }, 2939, "tcp" }, + { "sm-pas-2", { NULL }, 2939, "udp" }, + { "sm-pas-3", { NULL }, 2940, "tcp" }, + { "sm-pas-3", { NULL }, 2940, "udp" }, + { "sm-pas-4", { NULL }, 2941, "tcp" }, + { "sm-pas-4", { NULL }, 2941, "udp" }, + { "sm-pas-5", { NULL }, 2942, "tcp" }, + { "sm-pas-5", { NULL }, 2942, "udp" }, + { "ttnrepository", { NULL }, 2943, "tcp" }, + { "ttnrepository", { NULL }, 2943, "udp" }, + { "megaco-h248", { NULL }, 2944, "tcp" }, + { "megaco-h248", { NULL }, 2944, "udp" }, + { "megaco-h248", { NULL }, 2944, "sctp"}, + { "h248-binary", { NULL }, 2945, "tcp" }, + { "h248-binary", { NULL }, 2945, "udp" }, + { "h248-binary", { NULL }, 2945, "sctp"}, + { "fjsvmpor", { NULL }, 2946, "tcp" }, + { "fjsvmpor", { NULL }, 2946, "udp" }, + { "gpsd", { NULL }, 2947, "tcp" }, + { "gpsd", { NULL }, 2947, "udp" }, + { "wap-push", { NULL }, 2948, "tcp" }, + { "wap-push", { NULL }, 2948, "udp" }, + { "wap-pushsecure", { NULL }, 2949, "tcp" }, + { "wap-pushsecure", { NULL }, 2949, "udp" }, + { "esip", { NULL }, 2950, "tcp" }, + { "esip", { NULL }, 2950, "udp" }, + { "ottp", { NULL }, 2951, "tcp" }, + { "ottp", { NULL }, 2951, "udp" }, + { "mpfwsas", { NULL }, 2952, "tcp" }, + { "mpfwsas", { NULL }, 2952, "udp" }, + { "ovalarmsrv", { NULL }, 2953, "tcp" }, + { "ovalarmsrv", { NULL }, 2953, "udp" }, + { "ovalarmsrv-cmd", { NULL }, 2954, "tcp" }, + { "ovalarmsrv-cmd", { NULL }, 2954, "udp" }, + { "csnotify", { NULL }, 2955, "tcp" }, + { "csnotify", { NULL }, 2955, "udp" }, + { "ovrimosdbman", { NULL }, 2956, "tcp" }, + { "ovrimosdbman", { NULL }, 2956, "udp" }, + { "jmact5", { NULL }, 2957, "tcp" }, + { "jmact5", { NULL }, 2957, "udp" }, + { "jmact6", { NULL }, 2958, "tcp" }, + { "jmact6", { NULL }, 2958, "udp" }, + { "rmopagt", { NULL }, 2959, "tcp" }, + { "rmopagt", { NULL }, 2959, "udp" }, + { "dfoxserver", { NULL }, 2960, "tcp" }, + { "dfoxserver", { NULL }, 2960, "udp" }, + { "boldsoft-lm", { NULL }, 2961, "tcp" }, + { "boldsoft-lm", { NULL }, 2961, "udp" }, + { "iph-policy-cli", { NULL }, 2962, "tcp" }, + { "iph-policy-cli", { NULL }, 2962, "udp" }, + { "iph-policy-adm", { NULL }, 2963, "tcp" }, + { "iph-policy-adm", { NULL }, 2963, "udp" }, + { "bullant-srap", { NULL }, 2964, "tcp" }, + { "bullant-srap", { NULL }, 2964, "udp" }, + { "bullant-rap", { NULL }, 2965, "tcp" }, + { "bullant-rap", { NULL }, 2965, "udp" }, + { "idp-infotrieve", { NULL }, 2966, "tcp" }, + { "idp-infotrieve", { NULL }, 2966, "udp" }, + { "ssc-agent", { NULL }, 2967, "tcp" }, + { "ssc-agent", { NULL }, 2967, "udp" }, + { "enpp", { NULL }, 2968, "tcp" }, + { "enpp", { NULL }, 2968, "udp" }, + { "essp", { NULL }, 2969, "tcp" }, + { "essp", { NULL }, 2969, "udp" }, + { "index-net", { NULL }, 2970, "tcp" }, + { "index-net", { NULL }, 2970, "udp" }, + { "netclip", { NULL }, 2971, "tcp" }, + { "netclip", { NULL }, 2971, "udp" }, + { "pmsm-webrctl", { NULL }, 2972, "tcp" }, + { "pmsm-webrctl", { NULL }, 2972, "udp" }, + { "svnetworks", { NULL }, 2973, "tcp" }, + { "svnetworks", { NULL }, 2973, "udp" }, + { "signal", { NULL }, 2974, "tcp" }, + { "signal", { NULL }, 2974, "udp" }, + { "fjmpcm", { NULL }, 2975, "tcp" }, + { "fjmpcm", { NULL }, 2975, "udp" }, + { "cns-srv-port", { NULL }, 2976, "tcp" }, + { "cns-srv-port", { NULL }, 2976, "udp" }, + { "ttc-etap-ns", { NULL }, 2977, "tcp" }, + { "ttc-etap-ns", { NULL }, 2977, "udp" }, + { "ttc-etap-ds", { NULL }, 2978, "tcp" }, + { "ttc-etap-ds", { NULL }, 2978, "udp" }, + { "h263-video", { NULL }, 2979, "tcp" }, + { "h263-video", { NULL }, 2979, "udp" }, + { "wimd", { NULL }, 2980, "tcp" }, + { "wimd", { NULL }, 2980, "udp" }, + { "mylxamport", { NULL }, 2981, "tcp" }, + { "mylxamport", { NULL }, 2981, "udp" }, + { "iwb-whiteboard", { NULL }, 2982, "tcp" }, + { "iwb-whiteboard", { NULL }, 2982, "udp" }, + { "netplan", { NULL }, 2983, "tcp" }, + { "netplan", { NULL }, 2983, "udp" }, + { "hpidsadmin", { NULL }, 2984, "tcp" }, + { "hpidsadmin", { NULL }, 2984, "udp" }, + { "hpidsagent", { NULL }, 2985, "tcp" }, + { "hpidsagent", { NULL }, 2985, "udp" }, + { "stonefalls", { NULL }, 2986, "tcp" }, + { "stonefalls", { NULL }, 2986, "udp" }, + { "identify", { NULL }, 2987, "tcp" }, + { "identify", { NULL }, 2987, "udp" }, + { "hippad", { NULL }, 2988, "tcp" }, + { "hippad", { NULL }, 2988, "udp" }, + { "zarkov", { NULL }, 2989, "tcp" }, + { "zarkov", { NULL }, 2989, "udp" }, + { "boscap", { NULL }, 2990, "tcp" }, + { "boscap", { NULL }, 2990, "udp" }, + { "wkstn-mon", { NULL }, 2991, "tcp" }, + { "wkstn-mon", { NULL }, 2991, "udp" }, + { "avenyo", { NULL }, 2992, "tcp" }, + { "avenyo", { NULL }, 2992, "udp" }, + { "veritas-vis1", { NULL }, 2993, "tcp" }, + { "veritas-vis1", { NULL }, 2993, "udp" }, + { "veritas-vis2", { NULL }, 2994, "tcp" }, + { "veritas-vis2", { NULL }, 2994, "udp" }, + { "idrs", { NULL }, 2995, "tcp" }, + { "idrs", { NULL }, 2995, "udp" }, + { "vsixml", { NULL }, 2996, "tcp" }, + { "vsixml", { NULL }, 2996, "udp" }, + { "rebol", { NULL }, 2997, "tcp" }, + { "rebol", { NULL }, 2997, "udp" }, + { "realsecure", { NULL }, 2998, "tcp" }, + { "realsecure", { NULL }, 2998, "udp" }, + { "remoteware-un", { NULL }, 2999, "tcp" }, + { "remoteware-un", { NULL }, 2999, "udp" }, + { "hbci", { NULL }, 3000, "tcp" }, + { "hbci", { NULL }, 3000, "udp" }, + { "remoteware-cl", { NULL }, 3000, "tcp" }, + { "remoteware-cl", { NULL }, 3000, "udp" }, + { "exlm-agent", { NULL }, 3002, "tcp" }, + { "exlm-agent", { NULL }, 3002, "udp" }, + { "remoteware-srv", { NULL }, 3002, "tcp" }, + { "remoteware-srv", { NULL }, 3002, "udp" }, + { "cgms", { NULL }, 3003, "tcp" }, + { "cgms", { NULL }, 3003, "udp" }, + { "csoftragent", { NULL }, 3004, "tcp" }, + { "csoftragent", { NULL }, 3004, "udp" }, + { "geniuslm", { NULL }, 3005, "tcp" }, + { "geniuslm", { NULL }, 3005, "udp" }, + { "ii-admin", { NULL }, 3006, "tcp" }, + { "ii-admin", { NULL }, 3006, "udp" }, + { "lotusmtap", { NULL }, 3007, "tcp" }, + { "lotusmtap", { NULL }, 3007, "udp" }, + { "midnight-tech", { NULL }, 3008, "tcp" }, + { "midnight-tech", { NULL }, 3008, "udp" }, + { "pxc-ntfy", { NULL }, 3009, "tcp" }, + { "pxc-ntfy", { NULL }, 3009, "udp" }, + { "gw", { NULL }, 3010, "tcp" }, + { "ping-pong", { NULL }, 3010, "udp" }, + { "trusted-web", { NULL }, 3011, "tcp" }, + { "trusted-web", { NULL }, 3011, "udp" }, + { "twsdss", { NULL }, 3012, "tcp" }, + { "twsdss", { NULL }, 3012, "udp" }, + { "gilatskysurfer", { NULL }, 3013, "tcp" }, + { "gilatskysurfer", { NULL }, 3013, "udp" }, + { "broker_service", { NULL }, 3014, "tcp" }, + { "broker_service", { NULL }, 3014, "udp" }, + { "nati-dstp", { NULL }, 3015, "tcp" }, + { "nati-dstp", { NULL }, 3015, "udp" }, + { "notify_srvr", { NULL }, 3016, "tcp" }, + { "notify_srvr", { NULL }, 3016, "udp" }, + { "event_listener", { NULL }, 3017, "tcp" }, + { "event_listener", { NULL }, 3017, "udp" }, + { "srvc_registry", { NULL }, 3018, "tcp" }, + { "srvc_registry", { NULL }, 3018, "udp" }, + { "resource_mgr", { NULL }, 3019, "tcp" }, + { "resource_mgr", { NULL }, 3019, "udp" }, + { "cifs", { NULL }, 3020, "tcp" }, + { "cifs", { NULL }, 3020, "udp" }, + { "agriserver", { NULL }, 3021, "tcp" }, + { "agriserver", { NULL }, 3021, "udp" }, + { "csregagent", { NULL }, 3022, "tcp" }, + { "csregagent", { NULL }, 3022, "udp" }, + { "magicnotes", { NULL }, 3023, "tcp" }, + { "magicnotes", { NULL }, 3023, "udp" }, + { "nds_sso", { NULL }, 3024, "tcp" }, + { "nds_sso", { NULL }, 3024, "udp" }, + { "arepa-raft", { NULL }, 3025, "tcp" }, + { "arepa-raft", { NULL }, 3025, "udp" }, + { "agri-gateway", { NULL }, 3026, "tcp" }, + { "agri-gateway", { NULL }, 3026, "udp" }, + { "LiebDevMgmt_C", { NULL }, 3027, "tcp" }, + { "LiebDevMgmt_C", { NULL }, 3027, "udp" }, + { "LiebDevMgmt_DM", { NULL }, 3028, "tcp" }, + { "LiebDevMgmt_DM", { NULL }, 3028, "udp" }, + { "LiebDevMgmt_A", { NULL }, 3029, "tcp" }, + { "LiebDevMgmt_A", { NULL }, 3029, "udp" }, + { "arepa-cas", { NULL }, 3030, "tcp" }, + { "arepa-cas", { NULL }, 3030, "udp" }, + { "eppc", { NULL }, 3031, "tcp" }, + { "eppc", { NULL }, 3031, "udp" }, + { "redwood-chat", { NULL }, 3032, "tcp" }, + { "redwood-chat", { NULL }, 3032, "udp" }, + { "pdb", { NULL }, 3033, "tcp" }, + { "pdb", { NULL }, 3033, "udp" }, + { "osmosis-aeea", { NULL }, 3034, "tcp" }, + { "osmosis-aeea", { NULL }, 3034, "udp" }, + { "fjsv-gssagt", { NULL }, 3035, "tcp" }, + { "fjsv-gssagt", { NULL }, 3035, "udp" }, + { "hagel-dump", { NULL }, 3036, "tcp" }, + { "hagel-dump", { NULL }, 3036, "udp" }, + { "hp-san-mgmt", { NULL }, 3037, "tcp" }, + { "hp-san-mgmt", { NULL }, 3037, "udp" }, + { "santak-ups", { NULL }, 3038, "tcp" }, + { "santak-ups", { NULL }, 3038, "udp" }, + { "cogitate", { NULL }, 3039, "tcp" }, + { "cogitate", { NULL }, 3039, "udp" }, + { "tomato-springs", { NULL }, 3040, "tcp" }, + { "tomato-springs", { NULL }, 3040, "udp" }, + { "di-traceware", { NULL }, 3041, "tcp" }, + { "di-traceware", { NULL }, 3041, "udp" }, + { "journee", { NULL }, 3042, "tcp" }, + { "journee", { NULL }, 3042, "udp" }, + { "brp", { NULL }, 3043, "tcp" }, + { "brp", { NULL }, 3043, "udp" }, + { "epp", { NULL }, 3044, "tcp" }, + { "epp", { NULL }, 3044, "udp" }, + { "responsenet", { NULL }, 3045, "tcp" }, + { "responsenet", { NULL }, 3045, "udp" }, + { "di-ase", { NULL }, 3046, "tcp" }, + { "di-ase", { NULL }, 3046, "udp" }, + { "hlserver", { NULL }, 3047, "tcp" }, + { "hlserver", { NULL }, 3047, "udp" }, + { "pctrader", { NULL }, 3048, "tcp" }, + { "pctrader", { NULL }, 3048, "udp" }, + { "nsws", { NULL }, 3049, "tcp" }, + { "nsws", { NULL }, 3049, "udp" }, + { "gds_db", { NULL }, 3050, "tcp" }, + { "gds_db", { NULL }, 3050, "udp" }, + { "galaxy-server", { NULL }, 3051, "tcp" }, + { "galaxy-server", { NULL }, 3051, "udp" }, + { "apc-3052", { NULL }, 3052, "tcp" }, + { "apc-3052", { NULL }, 3052, "udp" }, + { "dsom-server", { NULL }, 3053, "tcp" }, + { "dsom-server", { NULL }, 3053, "udp" }, + { "amt-cnf-prot", { NULL }, 3054, "tcp" }, + { "amt-cnf-prot", { NULL }, 3054, "udp" }, + { "policyserver", { NULL }, 3055, "tcp" }, + { "policyserver", { NULL }, 3055, "udp" }, + { "cdl-server", { NULL }, 3056, "tcp" }, + { "cdl-server", { NULL }, 3056, "udp" }, + { "goahead-fldup", { NULL }, 3057, "tcp" }, + { "goahead-fldup", { NULL }, 3057, "udp" }, + { "videobeans", { NULL }, 3058, "tcp" }, + { "videobeans", { NULL }, 3058, "udp" }, + { "qsoft", { NULL }, 3059, "tcp" }, + { "qsoft", { NULL }, 3059, "udp" }, + { "interserver", { NULL }, 3060, "tcp" }, + { "interserver", { NULL }, 3060, "udp" }, + { "cautcpd", { NULL }, 3061, "tcp" }, + { "cautcpd", { NULL }, 3061, "udp" }, + { "ncacn-ip-tcp", { NULL }, 3062, "tcp" }, + { "ncacn-ip-tcp", { NULL }, 3062, "udp" }, + { "ncadg-ip-udp", { NULL }, 3063, "tcp" }, + { "ncadg-ip-udp", { NULL }, 3063, "udp" }, + { "rprt", { NULL }, 3064, "tcp" }, + { "rprt", { NULL }, 3064, "udp" }, + { "slinterbase", { NULL }, 3065, "tcp" }, + { "slinterbase", { NULL }, 3065, "udp" }, + { "netattachsdmp", { NULL }, 3066, "tcp" }, + { "netattachsdmp", { NULL }, 3066, "udp" }, + { "fjhpjp", { NULL }, 3067, "tcp" }, + { "fjhpjp", { NULL }, 3067, "udp" }, + { "ls3bcast", { NULL }, 3068, "tcp" }, + { "ls3bcast", { NULL }, 3068, "udp" }, + { "ls3", { NULL }, 3069, "tcp" }, + { "ls3", { NULL }, 3069, "udp" }, + { "mgxswitch", { NULL }, 3070, "tcp" }, + { "mgxswitch", { NULL }, 3070, "udp" }, + { "csd-mgmt-port", { NULL }, 3071, "tcp" }, + { "csd-mgmt-port", { NULL }, 3071, "udp" }, + { "csd-monitor", { NULL }, 3072, "tcp" }, + { "csd-monitor", { NULL }, 3072, "udp" }, + { "vcrp", { NULL }, 3073, "tcp" }, + { "vcrp", { NULL }, 3073, "udp" }, + { "xbox", { NULL }, 3074, "tcp" }, + { "xbox", { NULL }, 3074, "udp" }, + { "orbix-locator", { NULL }, 3075, "tcp" }, + { "orbix-locator", { NULL }, 3075, "udp" }, + { "orbix-config", { NULL }, 3076, "tcp" }, + { "orbix-config", { NULL }, 3076, "udp" }, + { "orbix-loc-ssl", { NULL }, 3077, "tcp" }, + { "orbix-loc-ssl", { NULL }, 3077, "udp" }, + { "orbix-cfg-ssl", { NULL }, 3078, "tcp" }, + { "orbix-cfg-ssl", { NULL }, 3078, "udp" }, + { "lv-frontpanel", { NULL }, 3079, "tcp" }, + { "lv-frontpanel", { NULL }, 3079, "udp" }, + { "stm_pproc", { NULL }, 3080, "tcp" }, + { "stm_pproc", { NULL }, 3080, "udp" }, + { "tl1-lv", { NULL }, 3081, "tcp" }, + { "tl1-lv", { NULL }, 3081, "udp" }, + { "tl1-raw", { NULL }, 3082, "tcp" }, + { "tl1-raw", { NULL }, 3082, "udp" }, + { "tl1-telnet", { NULL }, 3083, "tcp" }, + { "tl1-telnet", { NULL }, 3083, "udp" }, + { "itm-mccs", { NULL }, 3084, "tcp" }, + { "itm-mccs", { NULL }, 3084, "udp" }, + { "pcihreq", { NULL }, 3085, "tcp" }, + { "pcihreq", { NULL }, 3085, "udp" }, + { "jdl-dbkitchen", { NULL }, 3086, "tcp" }, + { "jdl-dbkitchen", { NULL }, 3086, "udp" }, + { "asoki-sma", { NULL }, 3087, "tcp" }, + { "asoki-sma", { NULL }, 3087, "udp" }, + { "xdtp", { NULL }, 3088, "tcp" }, + { "xdtp", { NULL }, 3088, "udp" }, + { "ptk-alink", { NULL }, 3089, "tcp" }, + { "ptk-alink", { NULL }, 3089, "udp" }, + { "stss", { NULL }, 3090, "tcp" }, + { "stss", { NULL }, 3090, "udp" }, + { "1ci-smcs", { NULL }, 3091, "tcp" }, + { "1ci-smcs", { NULL }, 3091, "udp" }, + { "rapidmq-center", { NULL }, 3093, "tcp" }, + { "rapidmq-center", { NULL }, 3093, "udp" }, + { "rapidmq-reg", { NULL }, 3094, "tcp" }, + { "rapidmq-reg", { NULL }, 3094, "udp" }, + { "panasas", { NULL }, 3095, "tcp" }, + { "panasas", { NULL }, 3095, "udp" }, + { "ndl-aps", { NULL }, 3096, "tcp" }, + { "ndl-aps", { NULL }, 3096, "udp" }, + { "itu-bicc-stc", { NULL }, 3097, "sctp"}, + { "umm-port", { NULL }, 3098, "tcp" }, + { "umm-port", { NULL }, 3098, "udp" }, + { "chmd", { NULL }, 3099, "tcp" }, + { "chmd", { NULL }, 3099, "udp" }, + { "opcon-xps", { NULL }, 3100, "tcp" }, + { "opcon-xps", { NULL }, 3100, "udp" }, + { "hp-pxpib", { NULL }, 3101, "tcp" }, + { "hp-pxpib", { NULL }, 3101, "udp" }, + { "slslavemon", { NULL }, 3102, "tcp" }, + { "slslavemon", { NULL }, 3102, "udp" }, + { "autocuesmi", { NULL }, 3103, "tcp" }, + { "autocuesmi", { NULL }, 3103, "udp" }, + { "autocuelog", { NULL }, 3104, "tcp" }, + { "autocuetime", { NULL }, 3104, "udp" }, + { "cardbox", { NULL }, 3105, "tcp" }, + { "cardbox", { NULL }, 3105, "udp" }, + { "cardbox-http", { NULL }, 3106, "tcp" }, + { "cardbox-http", { NULL }, 3106, "udp" }, + { "business", { NULL }, 3107, "tcp" }, + { "business", { NULL }, 3107, "udp" }, + { "geolocate", { NULL }, 3108, "tcp" }, + { "geolocate", { NULL }, 3108, "udp" }, + { "personnel", { NULL }, 3109, "tcp" }, + { "personnel", { NULL }, 3109, "udp" }, + { "sim-control", { NULL }, 3110, "tcp" }, + { "sim-control", { NULL }, 3110, "udp" }, + { "wsynch", { NULL }, 3111, "tcp" }, + { "wsynch", { NULL }, 3111, "udp" }, + { "ksysguard", { NULL }, 3112, "tcp" }, + { "ksysguard", { NULL }, 3112, "udp" }, + { "cs-auth-svr", { NULL }, 3113, "tcp" }, + { "cs-auth-svr", { NULL }, 3113, "udp" }, + { "ccmad", { NULL }, 3114, "tcp" }, + { "ccmad", { NULL }, 3114, "udp" }, + { "mctet-master", { NULL }, 3115, "tcp" }, + { "mctet-master", { NULL }, 3115, "udp" }, + { "mctet-gateway", { NULL }, 3116, "tcp" }, + { "mctet-gateway", { NULL }, 3116, "udp" }, + { "mctet-jserv", { NULL }, 3117, "tcp" }, + { "mctet-jserv", { NULL }, 3117, "udp" }, + { "pkagent", { NULL }, 3118, "tcp" }, + { "pkagent", { NULL }, 3118, "udp" }, + { "d2000kernel", { NULL }, 3119, "tcp" }, + { "d2000kernel", { NULL }, 3119, "udp" }, + { "d2000webserver", { NULL }, 3120, "tcp" }, + { "d2000webserver", { NULL }, 3120, "udp" }, + { "vtr-emulator", { NULL }, 3122, "tcp" }, + { "vtr-emulator", { NULL }, 3122, "udp" }, + { "edix", { NULL }, 3123, "tcp" }, + { "edix", { NULL }, 3123, "udp" }, + { "beacon-port", { NULL }, 3124, "tcp" }, + { "beacon-port", { NULL }, 3124, "udp" }, + { "a13-an", { NULL }, 3125, "tcp" }, + { "a13-an", { NULL }, 3125, "udp" }, + { "ctx-bridge", { NULL }, 3127, "tcp" }, + { "ctx-bridge", { NULL }, 3127, "udp" }, + { "ndl-aas", { NULL }, 3128, "tcp" }, + { "ndl-aas", { NULL }, 3128, "udp" }, + { "netport-id", { NULL }, 3129, "tcp" }, + { "netport-id", { NULL }, 3129, "udp" }, + { "icpv2", { NULL }, 3130, "tcp" }, + { "icpv2", { NULL }, 3130, "udp" }, + { "netbookmark", { NULL }, 3131, "tcp" }, + { "netbookmark", { NULL }, 3131, "udp" }, + { "ms-rule-engine", { NULL }, 3132, "tcp" }, + { "ms-rule-engine", { NULL }, 3132, "udp" }, + { "prism-deploy", { NULL }, 3133, "tcp" }, + { "prism-deploy", { NULL }, 3133, "udp" }, + { "ecp", { NULL }, 3134, "tcp" }, + { "ecp", { NULL }, 3134, "udp" }, + { "peerbook-port", { NULL }, 3135, "tcp" }, + { "peerbook-port", { NULL }, 3135, "udp" }, + { "grubd", { NULL }, 3136, "tcp" }, + { "grubd", { NULL }, 3136, "udp" }, + { "rtnt-1", { NULL }, 3137, "tcp" }, + { "rtnt-1", { NULL }, 3137, "udp" }, + { "rtnt-2", { NULL }, 3138, "tcp" }, + { "rtnt-2", { NULL }, 3138, "udp" }, + { "incognitorv", { NULL }, 3139, "tcp" }, + { "incognitorv", { NULL }, 3139, "udp" }, + { "ariliamulti", { NULL }, 3140, "tcp" }, + { "ariliamulti", { NULL }, 3140, "udp" }, + { "vmodem", { NULL }, 3141, "tcp" }, + { "vmodem", { NULL }, 3141, "udp" }, + { "rdc-wh-eos", { NULL }, 3142, "tcp" }, + { "rdc-wh-eos", { NULL }, 3142, "udp" }, + { "seaview", { NULL }, 3143, "tcp" }, + { "seaview", { NULL }, 3143, "udp" }, + { "tarantella", { NULL }, 3144, "tcp" }, + { "tarantella", { NULL }, 3144, "udp" }, + { "csi-lfap", { NULL }, 3145, "tcp" }, + { "csi-lfap", { NULL }, 3145, "udp" }, + { "bears-02", { NULL }, 3146, "tcp" }, + { "bears-02", { NULL }, 3146, "udp" }, + { "rfio", { NULL }, 3147, "tcp" }, + { "rfio", { NULL }, 3147, "udp" }, + { "nm-game-admin", { NULL }, 3148, "tcp" }, + { "nm-game-admin", { NULL }, 3148, "udp" }, + { "nm-game-server", { NULL }, 3149, "tcp" }, + { "nm-game-server", { NULL }, 3149, "udp" }, + { "nm-asses-admin", { NULL }, 3150, "tcp" }, + { "nm-asses-admin", { NULL }, 3150, "udp" }, + { "nm-assessor", { NULL }, 3151, "tcp" }, + { "nm-assessor", { NULL }, 3151, "udp" }, + { "feitianrockey", { NULL }, 3152, "tcp" }, + { "feitianrockey", { NULL }, 3152, "udp" }, + { "s8-client-port", { NULL }, 3153, "tcp" }, + { "s8-client-port", { NULL }, 3153, "udp" }, + { "ccmrmi", { NULL }, 3154, "tcp" }, + { "ccmrmi", { NULL }, 3154, "udp" }, + { "jpegmpeg", { NULL }, 3155, "tcp" }, + { "jpegmpeg", { NULL }, 3155, "udp" }, + { "indura", { NULL }, 3156, "tcp" }, + { "indura", { NULL }, 3156, "udp" }, + { "e3consultants", { NULL }, 3157, "tcp" }, + { "e3consultants", { NULL }, 3157, "udp" }, + { "stvp", { NULL }, 3158, "tcp" }, + { "stvp", { NULL }, 3158, "udp" }, + { "navegaweb-port", { NULL }, 3159, "tcp" }, + { "navegaweb-port", { NULL }, 3159, "udp" }, + { "tip-app-server", { NULL }, 3160, "tcp" }, + { "tip-app-server", { NULL }, 3160, "udp" }, + { "doc1lm", { NULL }, 3161, "tcp" }, + { "doc1lm", { NULL }, 3161, "udp" }, + { "sflm", { NULL }, 3162, "tcp" }, + { "sflm", { NULL }, 3162, "udp" }, + { "res-sap", { NULL }, 3163, "tcp" }, + { "res-sap", { NULL }, 3163, "udp" }, + { "imprs", { NULL }, 3164, "tcp" }, + { "imprs", { NULL }, 3164, "udp" }, + { "newgenpay", { NULL }, 3165, "tcp" }, + { "newgenpay", { NULL }, 3165, "udp" }, + { "sossecollector", { NULL }, 3166, "tcp" }, + { "sossecollector", { NULL }, 3166, "udp" }, + { "nowcontact", { NULL }, 3167, "tcp" }, + { "nowcontact", { NULL }, 3167, "udp" }, + { "poweronnud", { NULL }, 3168, "tcp" }, + { "poweronnud", { NULL }, 3168, "udp" }, + { "serverview-as", { NULL }, 3169, "tcp" }, + { "serverview-as", { NULL }, 3169, "udp" }, + { "serverview-asn", { NULL }, 3170, "tcp" }, + { "serverview-asn", { NULL }, 3170, "udp" }, + { "serverview-gf", { NULL }, 3171, "tcp" }, + { "serverview-gf", { NULL }, 3171, "udp" }, + { "serverview-rm", { NULL }, 3172, "tcp" }, + { "serverview-rm", { NULL }, 3172, "udp" }, + { "serverview-icc", { NULL }, 3173, "tcp" }, + { "serverview-icc", { NULL }, 3173, "udp" }, + { "armi-server", { NULL }, 3174, "tcp" }, + { "armi-server", { NULL }, 3174, "udp" }, + { "t1-e1-over-ip", { NULL }, 3175, "tcp" }, + { "t1-e1-over-ip", { NULL }, 3175, "udp" }, + { "ars-master", { NULL }, 3176, "tcp" }, + { "ars-master", { NULL }, 3176, "udp" }, + { "phonex-port", { NULL }, 3177, "tcp" }, + { "phonex-port", { NULL }, 3177, "udp" }, + { "radclientport", { NULL }, 3178, "tcp" }, + { "radclientport", { NULL }, 3178, "udp" }, + { "h2gf-w-2m", { NULL }, 3179, "tcp" }, + { "h2gf-w-2m", { NULL }, 3179, "udp" }, + { "mc-brk-srv", { NULL }, 3180, "tcp" }, + { "mc-brk-srv", { NULL }, 3180, "udp" }, + { "bmcpatrolagent", { NULL }, 3181, "tcp" }, + { "bmcpatrolagent", { NULL }, 3181, "udp" }, + { "bmcpatrolrnvu", { NULL }, 3182, "tcp" }, + { "bmcpatrolrnvu", { NULL }, 3182, "udp" }, + { "cops-tls", { NULL }, 3183, "tcp" }, + { "cops-tls", { NULL }, 3183, "udp" }, + { "apogeex-port", { NULL }, 3184, "tcp" }, + { "apogeex-port", { NULL }, 3184, "udp" }, + { "smpppd", { NULL }, 3185, "tcp" }, + { "smpppd", { NULL }, 3185, "udp" }, + { "iiw-port", { NULL }, 3186, "tcp" }, + { "iiw-port", { NULL }, 3186, "udp" }, + { "odi-port", { NULL }, 3187, "tcp" }, + { "odi-port", { NULL }, 3187, "udp" }, + { "brcm-comm-port", { NULL }, 3188, "tcp" }, + { "brcm-comm-port", { NULL }, 3188, "udp" }, + { "pcle-infex", { NULL }, 3189, "tcp" }, + { "pcle-infex", { NULL }, 3189, "udp" }, + { "csvr-proxy", { NULL }, 3190, "tcp" }, + { "csvr-proxy", { NULL }, 3190, "udp" }, + { "csvr-sslproxy", { NULL }, 3191, "tcp" }, + { "csvr-sslproxy", { NULL }, 3191, "udp" }, + { "firemonrcc", { NULL }, 3192, "tcp" }, + { "firemonrcc", { NULL }, 3192, "udp" }, + { "spandataport", { NULL }, 3193, "tcp" }, + { "spandataport", { NULL }, 3193, "udp" }, + { "magbind", { NULL }, 3194, "tcp" }, + { "magbind", { NULL }, 3194, "udp" }, + { "ncu-1", { NULL }, 3195, "tcp" }, + { "ncu-1", { NULL }, 3195, "udp" }, + { "ncu-2", { NULL }, 3196, "tcp" }, + { "ncu-2", { NULL }, 3196, "udp" }, + { "embrace-dp-s", { NULL }, 3197, "tcp" }, + { "embrace-dp-s", { NULL }, 3197, "udp" }, + { "embrace-dp-c", { NULL }, 3198, "tcp" }, + { "embrace-dp-c", { NULL }, 3198, "udp" }, + { "dmod-workspace", { NULL }, 3199, "tcp" }, + { "dmod-workspace", { NULL }, 3199, "udp" }, + { "tick-port", { NULL }, 3200, "tcp" }, + { "tick-port", { NULL }, 3200, "udp" }, + { "cpq-tasksmart", { NULL }, 3201, "tcp" }, + { "cpq-tasksmart", { NULL }, 3201, "udp" }, + { "intraintra", { NULL }, 3202, "tcp" }, + { "intraintra", { NULL }, 3202, "udp" }, + { "netwatcher-mon", { NULL }, 3203, "tcp" }, + { "netwatcher-mon", { NULL }, 3203, "udp" }, + { "netwatcher-db", { NULL }, 3204, "tcp" }, + { "netwatcher-db", { NULL }, 3204, "udp" }, + { "isns", { NULL }, 3205, "tcp" }, + { "isns", { NULL }, 3205, "udp" }, + { "ironmail", { NULL }, 3206, "tcp" }, + { "ironmail", { NULL }, 3206, "udp" }, + { "vx-auth-port", { NULL }, 3207, "tcp" }, + { "vx-auth-port", { NULL }, 3207, "udp" }, + { "pfu-prcallback", { NULL }, 3208, "tcp" }, + { "pfu-prcallback", { NULL }, 3208, "udp" }, + { "netwkpathengine", { NULL }, 3209, "tcp" }, + { "netwkpathengine", { NULL }, 3209, "udp" }, + { "flamenco-proxy", { NULL }, 3210, "tcp" }, + { "flamenco-proxy", { NULL }, 3210, "udp" }, + { "avsecuremgmt", { NULL }, 3211, "tcp" }, + { "avsecuremgmt", { NULL }, 3211, "udp" }, + { "surveyinst", { NULL }, 3212, "tcp" }, + { "surveyinst", { NULL }, 3212, "udp" }, + { "neon24x7", { NULL }, 3213, "tcp" }, + { "neon24x7", { NULL }, 3213, "udp" }, + { "jmq-daemon-1", { NULL }, 3214, "tcp" }, + { "jmq-daemon-1", { NULL }, 3214, "udp" }, + { "jmq-daemon-2", { NULL }, 3215, "tcp" }, + { "jmq-daemon-2", { NULL }, 3215, "udp" }, + { "ferrari-foam", { NULL }, 3216, "tcp" }, + { "ferrari-foam", { NULL }, 3216, "udp" }, + { "unite", { NULL }, 3217, "tcp" }, + { "unite", { NULL }, 3217, "udp" }, + { "smartpackets", { NULL }, 3218, "tcp" }, + { "smartpackets", { NULL }, 3218, "udp" }, + { "wms-messenger", { NULL }, 3219, "tcp" }, + { "wms-messenger", { NULL }, 3219, "udp" }, + { "xnm-ssl", { NULL }, 3220, "tcp" }, + { "xnm-ssl", { NULL }, 3220, "udp" }, + { "xnm-clear-text", { NULL }, 3221, "tcp" }, + { "xnm-clear-text", { NULL }, 3221, "udp" }, + { "glbp", { NULL }, 3222, "tcp" }, + { "glbp", { NULL }, 3222, "udp" }, + { "digivote", { NULL }, 3223, "tcp" }, + { "digivote", { NULL }, 3223, "udp" }, + { "aes-discovery", { NULL }, 3224, "tcp" }, + { "aes-discovery", { NULL }, 3224, "udp" }, + { "fcip-port", { NULL }, 3225, "tcp" }, + { "fcip-port", { NULL }, 3225, "udp" }, + { "isi-irp", { NULL }, 3226, "tcp" }, + { "isi-irp", { NULL }, 3226, "udp" }, + { "dwnmshttp", { NULL }, 3227, "tcp" }, + { "dwnmshttp", { NULL }, 3227, "udp" }, + { "dwmsgserver", { NULL }, 3228, "tcp" }, + { "dwmsgserver", { NULL }, 3228, "udp" }, + { "global-cd-port", { NULL }, 3229, "tcp" }, + { "global-cd-port", { NULL }, 3229, "udp" }, + { "sftdst-port", { NULL }, 3230, "tcp" }, + { "sftdst-port", { NULL }, 3230, "udp" }, + { "vidigo", { NULL }, 3231, "tcp" }, + { "vidigo", { NULL }, 3231, "udp" }, + { "mdtp", { NULL }, 3232, "tcp" }, + { "mdtp", { NULL }, 3232, "udp" }, + { "whisker", { NULL }, 3233, "tcp" }, + { "whisker", { NULL }, 3233, "udp" }, + { "alchemy", { NULL }, 3234, "tcp" }, + { "alchemy", { NULL }, 3234, "udp" }, + { "mdap-port", { NULL }, 3235, "tcp" }, + { "mdap-port", { NULL }, 3235, "udp" }, + { "apparenet-ts", { NULL }, 3236, "tcp" }, + { "apparenet-ts", { NULL }, 3236, "udp" }, + { "apparenet-tps", { NULL }, 3237, "tcp" }, + { "apparenet-tps", { NULL }, 3237, "udp" }, + { "apparenet-as", { NULL }, 3238, "tcp" }, + { "apparenet-as", { NULL }, 3238, "udp" }, + { "apparenet-ui", { NULL }, 3239, "tcp" }, + { "apparenet-ui", { NULL }, 3239, "udp" }, + { "triomotion", { NULL }, 3240, "tcp" }, + { "triomotion", { NULL }, 3240, "udp" }, + { "sysorb", { NULL }, 3241, "tcp" }, + { "sysorb", { NULL }, 3241, "udp" }, + { "sdp-id-port", { NULL }, 3242, "tcp" }, + { "sdp-id-port", { NULL }, 3242, "udp" }, + { "timelot", { NULL }, 3243, "tcp" }, + { "timelot", { NULL }, 3243, "udp" }, + { "onesaf", { NULL }, 3244, "tcp" }, + { "onesaf", { NULL }, 3244, "udp" }, + { "vieo-fe", { NULL }, 3245, "tcp" }, + { "vieo-fe", { NULL }, 3245, "udp" }, + { "dvt-system", { NULL }, 3246, "tcp" }, + { "dvt-system", { NULL }, 3246, "udp" }, + { "dvt-data", { NULL }, 3247, "tcp" }, + { "dvt-data", { NULL }, 3247, "udp" }, + { "procos-lm", { NULL }, 3248, "tcp" }, + { "procos-lm", { NULL }, 3248, "udp" }, + { "ssp", { NULL }, 3249, "tcp" }, + { "ssp", { NULL }, 3249, "udp" }, + { "hicp", { NULL }, 3250, "tcp" }, + { "hicp", { NULL }, 3250, "udp" }, + { "sysscanner", { NULL }, 3251, "tcp" }, + { "sysscanner", { NULL }, 3251, "udp" }, + { "dhe", { NULL }, 3252, "tcp" }, + { "dhe", { NULL }, 3252, "udp" }, + { "pda-data", { NULL }, 3253, "tcp" }, + { "pda-data", { NULL }, 3253, "udp" }, + { "pda-sys", { NULL }, 3254, "tcp" }, + { "pda-sys", { NULL }, 3254, "udp" }, + { "semaphore", { NULL }, 3255, "tcp" }, + { "semaphore", { NULL }, 3255, "udp" }, + { "cpqrpm-agent", { NULL }, 3256, "tcp" }, + { "cpqrpm-agent", { NULL }, 3256, "udp" }, + { "cpqrpm-server", { NULL }, 3257, "tcp" }, + { "cpqrpm-server", { NULL }, 3257, "udp" }, + { "ivecon-port", { NULL }, 3258, "tcp" }, + { "ivecon-port", { NULL }, 3258, "udp" }, + { "epncdp2", { NULL }, 3259, "tcp" }, + { "epncdp2", { NULL }, 3259, "udp" }, + { "iscsi-target", { NULL }, 3260, "tcp" }, + { "iscsi-target", { NULL }, 3260, "udp" }, + { "winshadow", { NULL }, 3261, "tcp" }, + { "winshadow", { NULL }, 3261, "udp" }, + { "necp", { NULL }, 3262, "tcp" }, + { "necp", { NULL }, 3262, "udp" }, + { "ecolor-imager", { NULL }, 3263, "tcp" }, + { "ecolor-imager", { NULL }, 3263, "udp" }, + { "ccmail", { NULL }, 3264, "tcp" }, + { "ccmail", { NULL }, 3264, "udp" }, + { "altav-tunnel", { NULL }, 3265, "tcp" }, + { "altav-tunnel", { NULL }, 3265, "udp" }, + { "ns-cfg-server", { NULL }, 3266, "tcp" }, + { "ns-cfg-server", { NULL }, 3266, "udp" }, + { "ibm-dial-out", { NULL }, 3267, "tcp" }, + { "ibm-dial-out", { NULL }, 3267, "udp" }, + { "msft-gc", { NULL }, 3268, "tcp" }, + { "msft-gc", { NULL }, 3268, "udp" }, + { "msft-gc-ssl", { NULL }, 3269, "tcp" }, + { "msft-gc-ssl", { NULL }, 3269, "udp" }, + { "verismart", { NULL }, 3270, "tcp" }, + { "verismart", { NULL }, 3270, "udp" }, + { "csoft-prev", { NULL }, 3271, "tcp" }, + { "csoft-prev", { NULL }, 3271, "udp" }, + { "user-manager", { NULL }, 3272, "tcp" }, + { "user-manager", { NULL }, 3272, "udp" }, + { "sxmp", { NULL }, 3273, "tcp" }, + { "sxmp", { NULL }, 3273, "udp" }, + { "ordinox-server", { NULL }, 3274, "tcp" }, + { "ordinox-server", { NULL }, 3274, "udp" }, + { "samd", { NULL }, 3275, "tcp" }, + { "samd", { NULL }, 3275, "udp" }, + { "maxim-asics", { NULL }, 3276, "tcp" }, + { "maxim-asics", { NULL }, 3276, "udp" }, + { "awg-proxy", { NULL }, 3277, "tcp" }, + { "awg-proxy", { NULL }, 3277, "udp" }, + { "lkcmserver", { NULL }, 3278, "tcp" }, + { "lkcmserver", { NULL }, 3278, "udp" }, + { "admind", { NULL }, 3279, "tcp" }, + { "admind", { NULL }, 3279, "udp" }, + { "vs-server", { NULL }, 3280, "tcp" }, + { "vs-server", { NULL }, 3280, "udp" }, + { "sysopt", { NULL }, 3281, "tcp" }, + { "sysopt", { NULL }, 3281, "udp" }, + { "datusorb", { NULL }, 3282, "tcp" }, + { "datusorb", { NULL }, 3282, "udp" }, + { "net-assistant", { NULL }, 3283, "tcp" }, + { "net-assistant", { NULL }, 3283, "udp" }, + { "4talk", { NULL }, 3284, "tcp" }, + { "4talk", { NULL }, 3284, "udp" }, + { "plato", { NULL }, 3285, "tcp" }, + { "plato", { NULL }, 3285, "udp" }, + { "e-net", { NULL }, 3286, "tcp" }, + { "e-net", { NULL }, 3286, "udp" }, + { "directvdata", { NULL }, 3287, "tcp" }, + { "directvdata", { NULL }, 3287, "udp" }, + { "cops", { NULL }, 3288, "tcp" }, + { "cops", { NULL }, 3288, "udp" }, + { "enpc", { NULL }, 3289, "tcp" }, + { "enpc", { NULL }, 3289, "udp" }, + { "caps-lm", { NULL }, 3290, "tcp" }, + { "caps-lm", { NULL }, 3290, "udp" }, + { "sah-lm", { NULL }, 3291, "tcp" }, + { "sah-lm", { NULL }, 3291, "udp" }, + { "cart-o-rama", { NULL }, 3292, "tcp" }, + { "cart-o-rama", { NULL }, 3292, "udp" }, + { "fg-fps", { NULL }, 3293, "tcp" }, + { "fg-fps", { NULL }, 3293, "udp" }, + { "fg-gip", { NULL }, 3294, "tcp" }, + { "fg-gip", { NULL }, 3294, "udp" }, + { "dyniplookup", { NULL }, 3295, "tcp" }, + { "dyniplookup", { NULL }, 3295, "udp" }, + { "rib-slm", { NULL }, 3296, "tcp" }, + { "rib-slm", { NULL }, 3296, "udp" }, + { "cytel-lm", { NULL }, 3297, "tcp" }, + { "cytel-lm", { NULL }, 3297, "udp" }, + { "deskview", { NULL }, 3298, "tcp" }, + { "deskview", { NULL }, 3298, "udp" }, + { "pdrncs", { NULL }, 3299, "tcp" }, + { "pdrncs", { NULL }, 3299, "udp" }, + { "mcs-fastmail", { NULL }, 3302, "tcp" }, + { "mcs-fastmail", { NULL }, 3302, "udp" }, + { "opsession-clnt", { NULL }, 3303, "tcp" }, + { "opsession-clnt", { NULL }, 3303, "udp" }, + { "opsession-srvr", { NULL }, 3304, "tcp" }, + { "opsession-srvr", { NULL }, 3304, "udp" }, + { "odette-ftp", { NULL }, 3305, "tcp" }, + { "odette-ftp", { NULL }, 3305, "udp" }, + { "mysql", { NULL }, 3306, "tcp" }, + { "mysql", { NULL }, 3306, "udp" }, + { "opsession-prxy", { NULL }, 3307, "tcp" }, + { "opsession-prxy", { NULL }, 3307, "udp" }, + { "tns-server", { NULL }, 3308, "tcp" }, + { "tns-server", { NULL }, 3308, "udp" }, + { "tns-adv", { NULL }, 3309, "tcp" }, + { "tns-adv", { NULL }, 3309, "udp" }, + { "dyna-access", { NULL }, 3310, "tcp" }, + { "dyna-access", { NULL }, 3310, "udp" }, + { "mcns-tel-ret", { NULL }, 3311, "tcp" }, + { "mcns-tel-ret", { NULL }, 3311, "udp" }, + { "appman-server", { NULL }, 3312, "tcp" }, + { "appman-server", { NULL }, 3312, "udp" }, + { "uorb", { NULL }, 3313, "tcp" }, + { "uorb", { NULL }, 3313, "udp" }, + { "uohost", { NULL }, 3314, "tcp" }, + { "uohost", { NULL }, 3314, "udp" }, + { "cdid", { NULL }, 3315, "tcp" }, + { "cdid", { NULL }, 3315, "udp" }, + { "aicc-cmi", { NULL }, 3316, "tcp" }, + { "aicc-cmi", { NULL }, 3316, "udp" }, + { "vsaiport", { NULL }, 3317, "tcp" }, + { "vsaiport", { NULL }, 3317, "udp" }, + { "ssrip", { NULL }, 3318, "tcp" }, + { "ssrip", { NULL }, 3318, "udp" }, + { "sdt-lmd", { NULL }, 3319, "tcp" }, + { "sdt-lmd", { NULL }, 3319, "udp" }, + { "officelink2000", { NULL }, 3320, "tcp" }, + { "officelink2000", { NULL }, 3320, "udp" }, + { "vnsstr", { NULL }, 3321, "tcp" }, + { "vnsstr", { NULL }, 3321, "udp" }, + { "sftu", { NULL }, 3326, "tcp" }, + { "sftu", { NULL }, 3326, "udp" }, + { "bbars", { NULL }, 3327, "tcp" }, + { "bbars", { NULL }, 3327, "udp" }, + { "egptlm", { NULL }, 3328, "tcp" }, + { "egptlm", { NULL }, 3328, "udp" }, + { "hp-device-disc", { NULL }, 3329, "tcp" }, + { "hp-device-disc", { NULL }, 3329, "udp" }, + { "mcs-calypsoicf", { NULL }, 3330, "tcp" }, + { "mcs-calypsoicf", { NULL }, 3330, "udp" }, + { "mcs-messaging", { NULL }, 3331, "tcp" }, + { "mcs-messaging", { NULL }, 3331, "udp" }, + { "mcs-mailsvr", { NULL }, 3332, "tcp" }, + { "mcs-mailsvr", { NULL }, 3332, "udp" }, + { "dec-notes", { NULL }, 3333, "tcp" }, + { "dec-notes", { NULL }, 3333, "udp" }, + { "directv-web", { NULL }, 3334, "tcp" }, + { "directv-web", { NULL }, 3334, "udp" }, + { "directv-soft", { NULL }, 3335, "tcp" }, + { "directv-soft", { NULL }, 3335, "udp" }, + { "directv-tick", { NULL }, 3336, "tcp" }, + { "directv-tick", { NULL }, 3336, "udp" }, + { "directv-catlg", { NULL }, 3337, "tcp" }, + { "directv-catlg", { NULL }, 3337, "udp" }, + { "anet-b", { NULL }, 3338, "tcp" }, + { "anet-b", { NULL }, 3338, "udp" }, + { "anet-l", { NULL }, 3339, "tcp" }, + { "anet-l", { NULL }, 3339, "udp" }, + { "anet-m", { NULL }, 3340, "tcp" }, + { "anet-m", { NULL }, 3340, "udp" }, + { "anet-h", { NULL }, 3341, "tcp" }, + { "anet-h", { NULL }, 3341, "udp" }, + { "webtie", { NULL }, 3342, "tcp" }, + { "webtie", { NULL }, 3342, "udp" }, + { "ms-cluster-net", { NULL }, 3343, "tcp" }, + { "ms-cluster-net", { NULL }, 3343, "udp" }, + { "bnt-manager", { NULL }, 3344, "tcp" }, + { "bnt-manager", { NULL }, 3344, "udp" }, + { "influence", { NULL }, 3345, "tcp" }, + { "influence", { NULL }, 3345, "udp" }, + { "trnsprntproxy", { NULL }, 3346, "tcp" }, + { "trnsprntproxy", { NULL }, 3346, "udp" }, + { "phoenix-rpc", { NULL }, 3347, "tcp" }, + { "phoenix-rpc", { NULL }, 3347, "udp" }, + { "pangolin-laser", { NULL }, 3348, "tcp" }, + { "pangolin-laser", { NULL }, 3348, "udp" }, + { "chevinservices", { NULL }, 3349, "tcp" }, + { "chevinservices", { NULL }, 3349, "udp" }, + { "findviatv", { NULL }, 3350, "tcp" }, + { "findviatv", { NULL }, 3350, "udp" }, + { "btrieve", { NULL }, 3351, "tcp" }, + { "btrieve", { NULL }, 3351, "udp" }, + { "ssql", { NULL }, 3352, "tcp" }, + { "ssql", { NULL }, 3352, "udp" }, + { "fatpipe", { NULL }, 3353, "tcp" }, + { "fatpipe", { NULL }, 3353, "udp" }, + { "suitjd", { NULL }, 3354, "tcp" }, + { "suitjd", { NULL }, 3354, "udp" }, + { "ordinox-dbase", { NULL }, 3355, "tcp" }, + { "ordinox-dbase", { NULL }, 3355, "udp" }, + { "upnotifyps", { NULL }, 3356, "tcp" }, + { "upnotifyps", { NULL }, 3356, "udp" }, + { "adtech-test", { NULL }, 3357, "tcp" }, + { "adtech-test", { NULL }, 3357, "udp" }, + { "mpsysrmsvr", { NULL }, 3358, "tcp" }, + { "mpsysrmsvr", { NULL }, 3358, "udp" }, + { "wg-netforce", { NULL }, 3359, "tcp" }, + { "wg-netforce", { NULL }, 3359, "udp" }, + { "kv-server", { NULL }, 3360, "tcp" }, + { "kv-server", { NULL }, 3360, "udp" }, + { "kv-agent", { NULL }, 3361, "tcp" }, + { "kv-agent", { NULL }, 3361, "udp" }, + { "dj-ilm", { NULL }, 3362, "tcp" }, + { "dj-ilm", { NULL }, 3362, "udp" }, + { "nati-vi-server", { NULL }, 3363, "tcp" }, + { "nati-vi-server", { NULL }, 3363, "udp" }, + { "creativeserver", { NULL }, 3364, "tcp" }, + { "creativeserver", { NULL }, 3364, "udp" }, + { "contentserver", { NULL }, 3365, "tcp" }, + { "contentserver", { NULL }, 3365, "udp" }, + { "creativepartnr", { NULL }, 3366, "tcp" }, + { "creativepartnr", { NULL }, 3366, "udp" }, + { "tip2", { NULL }, 3372, "tcp" }, + { "tip2", { NULL }, 3372, "udp" }, + { "lavenir-lm", { NULL }, 3373, "tcp" }, + { "lavenir-lm", { NULL }, 3373, "udp" }, + { "cluster-disc", { NULL }, 3374, "tcp" }, + { "cluster-disc", { NULL }, 3374, "udp" }, + { "vsnm-agent", { NULL }, 3375, "tcp" }, + { "vsnm-agent", { NULL }, 3375, "udp" }, + { "cdbroker", { NULL }, 3376, "tcp" }, + { "cdbroker", { NULL }, 3376, "udp" }, + { "cogsys-lm", { NULL }, 3377, "tcp" }, + { "cogsys-lm", { NULL }, 3377, "udp" }, + { "wsicopy", { NULL }, 3378, "tcp" }, + { "wsicopy", { NULL }, 3378, "udp" }, + { "socorfs", { NULL }, 3379, "tcp" }, + { "socorfs", { NULL }, 3379, "udp" }, + { "sns-channels", { NULL }, 3380, "tcp" }, + { "sns-channels", { NULL }, 3380, "udp" }, + { "geneous", { NULL }, 3381, "tcp" }, + { "geneous", { NULL }, 3381, "udp" }, + { "fujitsu-neat", { NULL }, 3382, "tcp" }, + { "fujitsu-neat", { NULL }, 3382, "udp" }, + { "esp-lm", { NULL }, 3383, "tcp" }, + { "esp-lm", { NULL }, 3383, "udp" }, + { "hp-clic", { NULL }, 3384, "tcp" }, + { "hp-clic", { NULL }, 3384, "udp" }, + { "qnxnetman", { NULL }, 3385, "tcp" }, + { "qnxnetman", { NULL }, 3385, "udp" }, + { "gprs-data", { NULL }, 3386, "tcp" }, + { "gprs-sig", { NULL }, 3386, "udp" }, + { "backroomnet", { NULL }, 3387, "tcp" }, + { "backroomnet", { NULL }, 3387, "udp" }, + { "cbserver", { NULL }, 3388, "tcp" }, + { "cbserver", { NULL }, 3388, "udp" }, + { "ms-wbt-server", { NULL }, 3389, "tcp" }, + { "ms-wbt-server", { NULL }, 3389, "udp" }, + { "dsc", { NULL }, 3390, "tcp" }, + { "dsc", { NULL }, 3390, "udp" }, + { "savant", { NULL }, 3391, "tcp" }, + { "savant", { NULL }, 3391, "udp" }, + { "efi-lm", { NULL }, 3392, "tcp" }, + { "efi-lm", { NULL }, 3392, "udp" }, + { "d2k-tapestry1", { NULL }, 3393, "tcp" }, + { "d2k-tapestry1", { NULL }, 3393, "udp" }, + { "d2k-tapestry2", { NULL }, 3394, "tcp" }, + { "d2k-tapestry2", { NULL }, 3394, "udp" }, + { "dyna-lm", { NULL }, 3395, "tcp" }, + { "dyna-lm", { NULL }, 3395, "udp" }, + { "printer_agent", { NULL }, 3396, "tcp" }, + { "printer_agent", { NULL }, 3396, "udp" }, + { "cloanto-lm", { NULL }, 3397, "tcp" }, + { "cloanto-lm", { NULL }, 3397, "udp" }, + { "mercantile", { NULL }, 3398, "tcp" }, + { "mercantile", { NULL }, 3398, "udp" }, + { "csms", { NULL }, 3399, "tcp" }, + { "csms", { NULL }, 3399, "udp" }, + { "csms2", { NULL }, 3400, "tcp" }, + { "csms2", { NULL }, 3400, "udp" }, + { "filecast", { NULL }, 3401, "tcp" }, + { "filecast", { NULL }, 3401, "udp" }, + { "fxaengine-net", { NULL }, 3402, "tcp" }, + { "fxaengine-net", { NULL }, 3402, "udp" }, + { "nokia-ann-ch1", { NULL }, 3405, "tcp" }, + { "nokia-ann-ch1", { NULL }, 3405, "udp" }, + { "nokia-ann-ch2", { NULL }, 3406, "tcp" }, + { "nokia-ann-ch2", { NULL }, 3406, "udp" }, + { "ldap-admin", { NULL }, 3407, "tcp" }, + { "ldap-admin", { NULL }, 3407, "udp" }, + { "BESApi", { NULL }, 3408, "tcp" }, + { "BESApi", { NULL }, 3408, "udp" }, + { "networklens", { NULL }, 3409, "tcp" }, + { "networklens", { NULL }, 3409, "udp" }, + { "networklenss", { NULL }, 3410, "tcp" }, + { "networklenss", { NULL }, 3410, "udp" }, + { "biolink-auth", { NULL }, 3411, "tcp" }, + { "biolink-auth", { NULL }, 3411, "udp" }, + { "xmlblaster", { NULL }, 3412, "tcp" }, + { "xmlblaster", { NULL }, 3412, "udp" }, + { "svnet", { NULL }, 3413, "tcp" }, + { "svnet", { NULL }, 3413, "udp" }, + { "wip-port", { NULL }, 3414, "tcp" }, + { "wip-port", { NULL }, 3414, "udp" }, + { "bcinameservice", { NULL }, 3415, "tcp" }, + { "bcinameservice", { NULL }, 3415, "udp" }, + { "commandport", { NULL }, 3416, "tcp" }, + { "commandport", { NULL }, 3416, "udp" }, + { "csvr", { NULL }, 3417, "tcp" }, + { "csvr", { NULL }, 3417, "udp" }, + { "rnmap", { NULL }, 3418, "tcp" }, + { "rnmap", { NULL }, 3418, "udp" }, + { "softaudit", { NULL }, 3419, "tcp" }, + { "softaudit", { NULL }, 3419, "udp" }, + { "ifcp-port", { NULL }, 3420, "tcp" }, + { "ifcp-port", { NULL }, 3420, "udp" }, + { "bmap", { NULL }, 3421, "tcp" }, + { "bmap", { NULL }, 3421, "udp" }, + { "rusb-sys-port", { NULL }, 3422, "tcp" }, + { "rusb-sys-port", { NULL }, 3422, "udp" }, + { "xtrm", { NULL }, 3423, "tcp" }, + { "xtrm", { NULL }, 3423, "udp" }, + { "xtrms", { NULL }, 3424, "tcp" }, + { "xtrms", { NULL }, 3424, "udp" }, + { "agps-port", { NULL }, 3425, "tcp" }, + { "agps-port", { NULL }, 3425, "udp" }, + { "arkivio", { NULL }, 3426, "tcp" }, + { "arkivio", { NULL }, 3426, "udp" }, + { "websphere-snmp", { NULL }, 3427, "tcp" }, + { "websphere-snmp", { NULL }, 3427, "udp" }, + { "twcss", { NULL }, 3428, "tcp" }, + { "twcss", { NULL }, 3428, "udp" }, + { "gcsp", { NULL }, 3429, "tcp" }, + { "gcsp", { NULL }, 3429, "udp" }, + { "ssdispatch", { NULL }, 3430, "tcp" }, + { "ssdispatch", { NULL }, 3430, "udp" }, + { "ndl-als", { NULL }, 3431, "tcp" }, + { "ndl-als", { NULL }, 3431, "udp" }, + { "osdcp", { NULL }, 3432, "tcp" }, + { "osdcp", { NULL }, 3432, "udp" }, + { "alta-smp", { NULL }, 3433, "tcp" }, + { "alta-smp", { NULL }, 3433, "udp" }, + { "opencm", { NULL }, 3434, "tcp" }, + { "opencm", { NULL }, 3434, "udp" }, + { "pacom", { NULL }, 3435, "tcp" }, + { "pacom", { NULL }, 3435, "udp" }, + { "gc-config", { NULL }, 3436, "tcp" }, + { "gc-config", { NULL }, 3436, "udp" }, + { "autocueds", { NULL }, 3437, "tcp" }, + { "autocueds", { NULL }, 3437, "udp" }, + { "spiral-admin", { NULL }, 3438, "tcp" }, + { "spiral-admin", { NULL }, 3438, "udp" }, + { "hri-port", { NULL }, 3439, "tcp" }, + { "hri-port", { NULL }, 3439, "udp" }, + { "ans-console", { NULL }, 3440, "tcp" }, + { "ans-console", { NULL }, 3440, "udp" }, + { "connect-client", { NULL }, 3441, "tcp" }, + { "connect-client", { NULL }, 3441, "udp" }, + { "connect-server", { NULL }, 3442, "tcp" }, + { "connect-server", { NULL }, 3442, "udp" }, + { "ov-nnm-websrv", { NULL }, 3443, "tcp" }, + { "ov-nnm-websrv", { NULL }, 3443, "udp" }, + { "denali-server", { NULL }, 3444, "tcp" }, + { "denali-server", { NULL }, 3444, "udp" }, + { "monp", { NULL }, 3445, "tcp" }, + { "monp", { NULL }, 3445, "udp" }, + { "3comfaxrpc", { NULL }, 3446, "tcp" }, + { "3comfaxrpc", { NULL }, 3446, "udp" }, + { "directnet", { NULL }, 3447, "tcp" }, + { "directnet", { NULL }, 3447, "udp" }, + { "dnc-port", { NULL }, 3448, "tcp" }, + { "dnc-port", { NULL }, 3448, "udp" }, + { "hotu-chat", { NULL }, 3449, "tcp" }, + { "hotu-chat", { NULL }, 3449, "udp" }, + { "castorproxy", { NULL }, 3450, "tcp" }, + { "castorproxy", { NULL }, 3450, "udp" }, + { "asam", { NULL }, 3451, "tcp" }, + { "asam", { NULL }, 3451, "udp" }, + { "sabp-signal", { NULL }, 3452, "tcp" }, + { "sabp-signal", { NULL }, 3452, "udp" }, + { "pscupd", { NULL }, 3453, "tcp" }, + { "pscupd", { NULL }, 3453, "udp" }, + { "mira", { NULL }, 3454, "tcp" }, + { "prsvp", { NULL }, 3455, "tcp" }, + { "prsvp", { NULL }, 3455, "udp" }, + { "vat", { NULL }, 3456, "tcp" }, + { "vat", { NULL }, 3456, "udp" }, + { "vat-control", { NULL }, 3457, "tcp" }, + { "vat-control", { NULL }, 3457, "udp" }, + { "d3winosfi", { NULL }, 3458, "tcp" }, + { "d3winosfi", { NULL }, 3458, "udp" }, + { "integral", { NULL }, 3459, "tcp" }, + { "integral", { NULL }, 3459, "udp" }, + { "edm-manager", { NULL }, 3460, "tcp" }, + { "edm-manager", { NULL }, 3460, "udp" }, + { "edm-stager", { NULL }, 3461, "tcp" }, + { "edm-stager", { NULL }, 3461, "udp" }, + { "edm-std-notify", { NULL }, 3462, "tcp" }, + { "edm-std-notify", { NULL }, 3462, "udp" }, + { "edm-adm-notify", { NULL }, 3463, "tcp" }, + { "edm-adm-notify", { NULL }, 3463, "udp" }, + { "edm-mgr-sync", { NULL }, 3464, "tcp" }, + { "edm-mgr-sync", { NULL }, 3464, "udp" }, + { "edm-mgr-cntrl", { NULL }, 3465, "tcp" }, + { "edm-mgr-cntrl", { NULL }, 3465, "udp" }, + { "workflow", { NULL }, 3466, "tcp" }, + { "workflow", { NULL }, 3466, "udp" }, + { "rcst", { NULL }, 3467, "tcp" }, + { "rcst", { NULL }, 3467, "udp" }, + { "ttcmremotectrl", { NULL }, 3468, "tcp" }, + { "ttcmremotectrl", { NULL }, 3468, "udp" }, + { "pluribus", { NULL }, 3469, "tcp" }, + { "pluribus", { NULL }, 3469, "udp" }, + { "jt400", { NULL }, 3470, "tcp" }, + { "jt400", { NULL }, 3470, "udp" }, + { "jt400-ssl", { NULL }, 3471, "tcp" }, + { "jt400-ssl", { NULL }, 3471, "udp" }, + { "jaugsremotec-1", { NULL }, 3472, "tcp" }, + { "jaugsremotec-1", { NULL }, 3472, "udp" }, + { "jaugsremotec-2", { NULL }, 3473, "tcp" }, + { "jaugsremotec-2", { NULL }, 3473, "udp" }, + { "ttntspauto", { NULL }, 3474, "tcp" }, + { "ttntspauto", { NULL }, 3474, "udp" }, + { "genisar-port", { NULL }, 3475, "tcp" }, + { "genisar-port", { NULL }, 3475, "udp" }, + { "nppmp", { NULL }, 3476, "tcp" }, + { "nppmp", { NULL }, 3476, "udp" }, + { "ecomm", { NULL }, 3477, "tcp" }, + { "ecomm", { NULL }, 3477, "udp" }, + { "stun", { NULL }, 3478, "tcp" }, + { "stun", { NULL }, 3478, "udp" }, + { "turn", { NULL }, 3478, "tcp" }, + { "turn", { NULL }, 3478, "udp" }, + { "stun-behavior", { NULL }, 3478, "tcp" }, + { "stun-behavior", { NULL }, 3478, "udp" }, + { "twrpc", { NULL }, 3479, "tcp" }, + { "twrpc", { NULL }, 3479, "udp" }, + { "plethora", { NULL }, 3480, "tcp" }, + { "plethora", { NULL }, 3480, "udp" }, + { "cleanerliverc", { NULL }, 3481, "tcp" }, + { "cleanerliverc", { NULL }, 3481, "udp" }, + { "vulture", { NULL }, 3482, "tcp" }, + { "vulture", { NULL }, 3482, "udp" }, + { "slim-devices", { NULL }, 3483, "tcp" }, + { "slim-devices", { NULL }, 3483, "udp" }, + { "gbs-stp", { NULL }, 3484, "tcp" }, + { "gbs-stp", { NULL }, 3484, "udp" }, + { "celatalk", { NULL }, 3485, "tcp" }, + { "celatalk", { NULL }, 3485, "udp" }, + { "ifsf-hb-port", { NULL }, 3486, "tcp" }, + { "ifsf-hb-port", { NULL }, 3486, "udp" }, + { "ltctcp", { NULL }, 3487, "tcp" }, + { "ltcudp", { NULL }, 3487, "udp" }, + { "fs-rh-srv", { NULL }, 3488, "tcp" }, + { "fs-rh-srv", { NULL }, 3488, "udp" }, + { "dtp-dia", { NULL }, 3489, "tcp" }, + { "dtp-dia", { NULL }, 3489, "udp" }, + { "colubris", { NULL }, 3490, "tcp" }, + { "colubris", { NULL }, 3490, "udp" }, + { "swr-port", { NULL }, 3491, "tcp" }, + { "swr-port", { NULL }, 3491, "udp" }, + { "tvdumtray-port", { NULL }, 3492, "tcp" }, + { "tvdumtray-port", { NULL }, 3492, "udp" }, + { "nut", { NULL }, 3493, "tcp" }, + { "nut", { NULL }, 3493, "udp" }, + { "ibm3494", { NULL }, 3494, "tcp" }, + { "ibm3494", { NULL }, 3494, "udp" }, + { "seclayer-tcp", { NULL }, 3495, "tcp" }, + { "seclayer-tcp", { NULL }, 3495, "udp" }, + { "seclayer-tls", { NULL }, 3496, "tcp" }, + { "seclayer-tls", { NULL }, 3496, "udp" }, + { "ipether232port", { NULL }, 3497, "tcp" }, + { "ipether232port", { NULL }, 3497, "udp" }, + { "dashpas-port", { NULL }, 3498, "tcp" }, + { "dashpas-port", { NULL }, 3498, "udp" }, + { "sccip-media", { NULL }, 3499, "tcp" }, + { "sccip-media", { NULL }, 3499, "udp" }, + { "rtmp-port", { NULL }, 3500, "tcp" }, + { "rtmp-port", { NULL }, 3500, "udp" }, + { "isoft-p2p", { NULL }, 3501, "tcp" }, + { "isoft-p2p", { NULL }, 3501, "udp" }, + { "avinstalldisc", { NULL }, 3502, "tcp" }, + { "avinstalldisc", { NULL }, 3502, "udp" }, + { "lsp-ping", { NULL }, 3503, "tcp" }, + { "lsp-ping", { NULL }, 3503, "udp" }, + { "ironstorm", { NULL }, 3504, "tcp" }, + { "ironstorm", { NULL }, 3504, "udp" }, + { "ccmcomm", { NULL }, 3505, "tcp" }, + { "ccmcomm", { NULL }, 3505, "udp" }, + { "apc-3506", { NULL }, 3506, "tcp" }, + { "apc-3506", { NULL }, 3506, "udp" }, + { "nesh-broker", { NULL }, 3507, "tcp" }, + { "nesh-broker", { NULL }, 3507, "udp" }, + { "interactionweb", { NULL }, 3508, "tcp" }, + { "interactionweb", { NULL }, 3508, "udp" }, + { "vt-ssl", { NULL }, 3509, "tcp" }, + { "vt-ssl", { NULL }, 3509, "udp" }, + { "xss-port", { NULL }, 3510, "tcp" }, + { "xss-port", { NULL }, 3510, "udp" }, + { "webmail-2", { NULL }, 3511, "tcp" }, + { "webmail-2", { NULL }, 3511, "udp" }, + { "aztec", { NULL }, 3512, "tcp" }, + { "aztec", { NULL }, 3512, "udp" }, + { "arcpd", { NULL }, 3513, "tcp" }, + { "arcpd", { NULL }, 3513, "udp" }, + { "must-p2p", { NULL }, 3514, "tcp" }, + { "must-p2p", { NULL }, 3514, "udp" }, + { "must-backplane", { NULL }, 3515, "tcp" }, + { "must-backplane", { NULL }, 3515, "udp" }, + { "smartcard-port", { NULL }, 3516, "tcp" }, + { "smartcard-port", { NULL }, 3516, "udp" }, + { "802-11-iapp", { NULL }, 3517, "tcp" }, + { "802-11-iapp", { NULL }, 3517, "udp" }, + { "artifact-msg", { NULL }, 3518, "tcp" }, + { "artifact-msg", { NULL }, 3518, "udp" }, + { "nvmsgd", { NULL }, 3519, "tcp" }, + { "galileo", { NULL }, 3519, "udp" }, + { "galileolog", { NULL }, 3520, "tcp" }, + { "galileolog", { NULL }, 3520, "udp" }, + { "mc3ss", { NULL }, 3521, "tcp" }, + { "mc3ss", { NULL }, 3521, "udp" }, + { "nssocketport", { NULL }, 3522, "tcp" }, + { "nssocketport", { NULL }, 3522, "udp" }, + { "odeumservlink", { NULL }, 3523, "tcp" }, + { "odeumservlink", { NULL }, 3523, "udp" }, + { "ecmport", { NULL }, 3524, "tcp" }, + { "ecmport", { NULL }, 3524, "udp" }, + { "eisport", { NULL }, 3525, "tcp" }, + { "eisport", { NULL }, 3525, "udp" }, + { "starquiz-port", { NULL }, 3526, "tcp" }, + { "starquiz-port", { NULL }, 3526, "udp" }, + { "beserver-msg-q", { NULL }, 3527, "tcp" }, + { "beserver-msg-q", { NULL }, 3527, "udp" }, + { "jboss-iiop", { NULL }, 3528, "tcp" }, + { "jboss-iiop", { NULL }, 3528, "udp" }, + { "jboss-iiop-ssl", { NULL }, 3529, "tcp" }, + { "jboss-iiop-ssl", { NULL }, 3529, "udp" }, + { "gf", { NULL }, 3530, "tcp" }, + { "gf", { NULL }, 3530, "udp" }, + { "joltid", { NULL }, 3531, "tcp" }, + { "joltid", { NULL }, 3531, "udp" }, + { "raven-rmp", { NULL }, 3532, "tcp" }, + { "raven-rmp", { NULL }, 3532, "udp" }, + { "raven-rdp", { NULL }, 3533, "tcp" }, + { "raven-rdp", { NULL }, 3533, "udp" }, + { "urld-port", { NULL }, 3534, "tcp" }, + { "urld-port", { NULL }, 3534, "udp" }, + { "ms-la", { NULL }, 3535, "tcp" }, + { "ms-la", { NULL }, 3535, "udp" }, + { "snac", { NULL }, 3536, "tcp" }, + { "snac", { NULL }, 3536, "udp" }, + { "ni-visa-remote", { NULL }, 3537, "tcp" }, + { "ni-visa-remote", { NULL }, 3537, "udp" }, + { "ibm-diradm", { NULL }, 3538, "tcp" }, + { "ibm-diradm", { NULL }, 3538, "udp" }, + { "ibm-diradm-ssl", { NULL }, 3539, "tcp" }, + { "ibm-diradm-ssl", { NULL }, 3539, "udp" }, + { "pnrp-port", { NULL }, 3540, "tcp" }, + { "pnrp-port", { NULL }, 3540, "udp" }, + { "voispeed-port", { NULL }, 3541, "tcp" }, + { "voispeed-port", { NULL }, 3541, "udp" }, + { "hacl-monitor", { NULL }, 3542, "tcp" }, + { "hacl-monitor", { NULL }, 3542, "udp" }, + { "qftest-lookup", { NULL }, 3543, "tcp" }, + { "qftest-lookup", { NULL }, 3543, "udp" }, + { "teredo", { NULL }, 3544, "tcp" }, + { "teredo", { NULL }, 3544, "udp" }, + { "camac", { NULL }, 3545, "tcp" }, + { "camac", { NULL }, 3545, "udp" }, + { "symantec-sim", { NULL }, 3547, "tcp" }, + { "symantec-sim", { NULL }, 3547, "udp" }, + { "interworld", { NULL }, 3548, "tcp" }, + { "interworld", { NULL }, 3548, "udp" }, + { "tellumat-nms", { NULL }, 3549, "tcp" }, + { "tellumat-nms", { NULL }, 3549, "udp" }, + { "ssmpp", { NULL }, 3550, "tcp" }, + { "ssmpp", { NULL }, 3550, "udp" }, + { "apcupsd", { NULL }, 3551, "tcp" }, + { "apcupsd", { NULL }, 3551, "udp" }, + { "taserver", { NULL }, 3552, "tcp" }, + { "taserver", { NULL }, 3552, "udp" }, + { "rbr-discovery", { NULL }, 3553, "tcp" }, + { "rbr-discovery", { NULL }, 3553, "udp" }, + { "questnotify", { NULL }, 3554, "tcp" }, + { "questnotify", { NULL }, 3554, "udp" }, + { "razor", { NULL }, 3555, "tcp" }, + { "razor", { NULL }, 3555, "udp" }, + { "sky-transport", { NULL }, 3556, "tcp" }, + { "sky-transport", { NULL }, 3556, "udp" }, + { "personalos-001", { NULL }, 3557, "tcp" }, + { "personalos-001", { NULL }, 3557, "udp" }, + { "mcp-port", { NULL }, 3558, "tcp" }, + { "mcp-port", { NULL }, 3558, "udp" }, + { "cctv-port", { NULL }, 3559, "tcp" }, + { "cctv-port", { NULL }, 3559, "udp" }, + { "iniserve-port", { NULL }, 3560, "tcp" }, + { "iniserve-port", { NULL }, 3560, "udp" }, + { "bmc-onekey", { NULL }, 3561, "tcp" }, + { "bmc-onekey", { NULL }, 3561, "udp" }, + { "sdbproxy", { NULL }, 3562, "tcp" }, + { "sdbproxy", { NULL }, 3562, "udp" }, + { "watcomdebug", { NULL }, 3563, "tcp" }, + { "watcomdebug", { NULL }, 3563, "udp" }, + { "esimport", { NULL }, 3564, "tcp" }, + { "esimport", { NULL }, 3564, "udp" }, + { "m2pa", { NULL }, 3565, "tcp" }, + { "m2pa", { NULL }, 3565, "sctp"}, + { "quest-data-hub", { NULL }, 3566, "tcp" }, + { "oap", { NULL }, 3567, "tcp" }, + { "oap", { NULL }, 3567, "udp" }, + { "oap-s", { NULL }, 3568, "tcp" }, + { "oap-s", { NULL }, 3568, "udp" }, + { "mbg-ctrl", { NULL }, 3569, "tcp" }, + { "mbg-ctrl", { NULL }, 3569, "udp" }, + { "mccwebsvr-port", { NULL }, 3570, "tcp" }, + { "mccwebsvr-port", { NULL }, 3570, "udp" }, + { "megardsvr-port", { NULL }, 3571, "tcp" }, + { "megardsvr-port", { NULL }, 3571, "udp" }, + { "megaregsvrport", { NULL }, 3572, "tcp" }, + { "megaregsvrport", { NULL }, 3572, "udp" }, + { "tag-ups-1", { NULL }, 3573, "tcp" }, + { "tag-ups-1", { NULL }, 3573, "udp" }, + { "dmaf-server", { NULL }, 3574, "tcp" }, + { "dmaf-caster", { NULL }, 3574, "udp" }, + { "ccm-port", { NULL }, 3575, "tcp" }, + { "ccm-port", { NULL }, 3575, "udp" }, + { "cmc-port", { NULL }, 3576, "tcp" }, + { "cmc-port", { NULL }, 3576, "udp" }, + { "config-port", { NULL }, 3577, "tcp" }, + { "config-port", { NULL }, 3577, "udp" }, + { "data-port", { NULL }, 3578, "tcp" }, + { "data-port", { NULL }, 3578, "udp" }, + { "ttat3lb", { NULL }, 3579, "tcp" }, + { "ttat3lb", { NULL }, 3579, "udp" }, + { "nati-svrloc", { NULL }, 3580, "tcp" }, + { "nati-svrloc", { NULL }, 3580, "udp" }, + { "kfxaclicensing", { NULL }, 3581, "tcp" }, + { "kfxaclicensing", { NULL }, 3581, "udp" }, + { "press", { NULL }, 3582, "tcp" }, + { "press", { NULL }, 3582, "udp" }, + { "canex-watch", { NULL }, 3583, "tcp" }, + { "canex-watch", { NULL }, 3583, "udp" }, + { "u-dbap", { NULL }, 3584, "tcp" }, + { "u-dbap", { NULL }, 3584, "udp" }, + { "emprise-lls", { NULL }, 3585, "tcp" }, + { "emprise-lls", { NULL }, 3585, "udp" }, + { "emprise-lsc", { NULL }, 3586, "tcp" }, + { "emprise-lsc", { NULL }, 3586, "udp" }, + { "p2pgroup", { NULL }, 3587, "tcp" }, + { "p2pgroup", { NULL }, 3587, "udp" }, + { "sentinel", { NULL }, 3588, "tcp" }, + { "sentinel", { NULL }, 3588, "udp" }, + { "isomair", { NULL }, 3589, "tcp" }, + { "isomair", { NULL }, 3589, "udp" }, + { "wv-csp-sms", { NULL }, 3590, "tcp" }, + { "wv-csp-sms", { NULL }, 3590, "udp" }, + { "gtrack-server", { NULL }, 3591, "tcp" }, + { "gtrack-server", { NULL }, 3591, "udp" }, + { "gtrack-ne", { NULL }, 3592, "tcp" }, + { "gtrack-ne", { NULL }, 3592, "udp" }, + { "bpmd", { NULL }, 3593, "tcp" }, + { "bpmd", { NULL }, 3593, "udp" }, + { "mediaspace", { NULL }, 3594, "tcp" }, + { "mediaspace", { NULL }, 3594, "udp" }, + { "shareapp", { NULL }, 3595, "tcp" }, + { "shareapp", { NULL }, 3595, "udp" }, + { "iw-mmogame", { NULL }, 3596, "tcp" }, + { "iw-mmogame", { NULL }, 3596, "udp" }, + { "a14", { NULL }, 3597, "tcp" }, + { "a14", { NULL }, 3597, "udp" }, + { "a15", { NULL }, 3598, "tcp" }, + { "a15", { NULL }, 3598, "udp" }, + { "quasar-server", { NULL }, 3599, "tcp" }, + { "quasar-server", { NULL }, 3599, "udp" }, + { "trap-daemon", { NULL }, 3600, "tcp" }, + { "trap-daemon", { NULL }, 3600, "udp" }, + { "visinet-gui", { NULL }, 3601, "tcp" }, + { "visinet-gui", { NULL }, 3601, "udp" }, + { "infiniswitchcl", { NULL }, 3602, "tcp" }, + { "infiniswitchcl", { NULL }, 3602, "udp" }, + { "int-rcv-cntrl", { NULL }, 3603, "tcp" }, + { "int-rcv-cntrl", { NULL }, 3603, "udp" }, + { "bmc-jmx-port", { NULL }, 3604, "tcp" }, + { "bmc-jmx-port", { NULL }, 3604, "udp" }, + { "comcam-io", { NULL }, 3605, "tcp" }, + { "comcam-io", { NULL }, 3605, "udp" }, + { "splitlock", { NULL }, 3606, "tcp" }, + { "splitlock", { NULL }, 3606, "udp" }, + { "precise-i3", { NULL }, 3607, "tcp" }, + { "precise-i3", { NULL }, 3607, "udp" }, + { "trendchip-dcp", { NULL }, 3608, "tcp" }, + { "trendchip-dcp", { NULL }, 3608, "udp" }, + { "cpdi-pidas-cm", { NULL }, 3609, "tcp" }, + { "cpdi-pidas-cm", { NULL }, 3609, "udp" }, + { "echonet", { NULL }, 3610, "tcp" }, + { "echonet", { NULL }, 3610, "udp" }, + { "six-degrees", { NULL }, 3611, "tcp" }, + { "six-degrees", { NULL }, 3611, "udp" }, + { "hp-dataprotect", { NULL }, 3612, "tcp" }, + { "hp-dataprotect", { NULL }, 3612, "udp" }, + { "alaris-disc", { NULL }, 3613, "tcp" }, + { "alaris-disc", { NULL }, 3613, "udp" }, + { "sigma-port", { NULL }, 3614, "tcp" }, + { "sigma-port", { NULL }, 3614, "udp" }, + { "start-network", { NULL }, 3615, "tcp" }, + { "start-network", { NULL }, 3615, "udp" }, + { "cd3o-protocol", { NULL }, 3616, "tcp" }, + { "cd3o-protocol", { NULL }, 3616, "udp" }, + { "sharp-server", { NULL }, 3617, "tcp" }, + { "sharp-server", { NULL }, 3617, "udp" }, + { "aairnet-1", { NULL }, 3618, "tcp" }, + { "aairnet-1", { NULL }, 3618, "udp" }, + { "aairnet-2", { NULL }, 3619, "tcp" }, + { "aairnet-2", { NULL }, 3619, "udp" }, + { "ep-pcp", { NULL }, 3620, "tcp" }, + { "ep-pcp", { NULL }, 3620, "udp" }, + { "ep-nsp", { NULL }, 3621, "tcp" }, + { "ep-nsp", { NULL }, 3621, "udp" }, + { "ff-lr-port", { NULL }, 3622, "tcp" }, + { "ff-lr-port", { NULL }, 3622, "udp" }, + { "haipe-discover", { NULL }, 3623, "tcp" }, + { "haipe-discover", { NULL }, 3623, "udp" }, + { "dist-upgrade", { NULL }, 3624, "tcp" }, + { "dist-upgrade", { NULL }, 3624, "udp" }, + { "volley", { NULL }, 3625, "tcp" }, + { "volley", { NULL }, 3625, "udp" }, + { "bvcdaemon-port", { NULL }, 3626, "tcp" }, + { "bvcdaemon-port", { NULL }, 3626, "udp" }, + { "jamserverport", { NULL }, 3627, "tcp" }, + { "jamserverport", { NULL }, 3627, "udp" }, + { "ept-machine", { NULL }, 3628, "tcp" }, + { "ept-machine", { NULL }, 3628, "udp" }, + { "escvpnet", { NULL }, 3629, "tcp" }, + { "escvpnet", { NULL }, 3629, "udp" }, + { "cs-remote-db", { NULL }, 3630, "tcp" }, + { "cs-remote-db", { NULL }, 3630, "udp" }, + { "cs-services", { NULL }, 3631, "tcp" }, + { "cs-services", { NULL }, 3631, "udp" }, + { "distcc", { NULL }, 3632, "tcp" }, + { "distcc", { NULL }, 3632, "udp" }, + { "wacp", { NULL }, 3633, "tcp" }, + { "wacp", { NULL }, 3633, "udp" }, + { "hlibmgr", { NULL }, 3634, "tcp" }, + { "hlibmgr", { NULL }, 3634, "udp" }, + { "sdo", { NULL }, 3635, "tcp" }, + { "sdo", { NULL }, 3635, "udp" }, + { "servistaitsm", { NULL }, 3636, "tcp" }, + { "servistaitsm", { NULL }, 3636, "udp" }, + { "scservp", { NULL }, 3637, "tcp" }, + { "scservp", { NULL }, 3637, "udp" }, + { "ehp-backup", { NULL }, 3638, "tcp" }, + { "ehp-backup", { NULL }, 3638, "udp" }, + { "xap-ha", { NULL }, 3639, "tcp" }, + { "xap-ha", { NULL }, 3639, "udp" }, + { "netplay-port1", { NULL }, 3640, "tcp" }, + { "netplay-port1", { NULL }, 3640, "udp" }, + { "netplay-port2", { NULL }, 3641, "tcp" }, + { "netplay-port2", { NULL }, 3641, "udp" }, + { "juxml-port", { NULL }, 3642, "tcp" }, + { "juxml-port", { NULL }, 3642, "udp" }, + { "audiojuggler", { NULL }, 3643, "tcp" }, + { "audiojuggler", { NULL }, 3643, "udp" }, + { "ssowatch", { NULL }, 3644, "tcp" }, + { "ssowatch", { NULL }, 3644, "udp" }, + { "cyc", { NULL }, 3645, "tcp" }, + { "cyc", { NULL }, 3645, "udp" }, + { "xss-srv-port", { NULL }, 3646, "tcp" }, + { "xss-srv-port", { NULL }, 3646, "udp" }, + { "splitlock-gw", { NULL }, 3647, "tcp" }, + { "splitlock-gw", { NULL }, 3647, "udp" }, + { "fjcp", { NULL }, 3648, "tcp" }, + { "fjcp", { NULL }, 3648, "udp" }, + { "nmmp", { NULL }, 3649, "tcp" }, + { "nmmp", { NULL }, 3649, "udp" }, + { "prismiq-plugin", { NULL }, 3650, "tcp" }, + { "prismiq-plugin", { NULL }, 3650, "udp" }, + { "xrpc-registry", { NULL }, 3651, "tcp" }, + { "xrpc-registry", { NULL }, 3651, "udp" }, + { "vxcrnbuport", { NULL }, 3652, "tcp" }, + { "vxcrnbuport", { NULL }, 3652, "udp" }, + { "tsp", { NULL }, 3653, "tcp" }, + { "tsp", { NULL }, 3653, "udp" }, + { "vaprtm", { NULL }, 3654, "tcp" }, + { "vaprtm", { NULL }, 3654, "udp" }, + { "abatemgr", { NULL }, 3655, "tcp" }, + { "abatemgr", { NULL }, 3655, "udp" }, + { "abatjss", { NULL }, 3656, "tcp" }, + { "abatjss", { NULL }, 3656, "udp" }, + { "immedianet-bcn", { NULL }, 3657, "tcp" }, + { "immedianet-bcn", { NULL }, 3657, "udp" }, + { "ps-ams", { NULL }, 3658, "tcp" }, + { "ps-ams", { NULL }, 3658, "udp" }, + { "apple-sasl", { NULL }, 3659, "tcp" }, + { "apple-sasl", { NULL }, 3659, "udp" }, + { "can-nds-ssl", { NULL }, 3660, "tcp" }, + { "can-nds-ssl", { NULL }, 3660, "udp" }, + { "can-ferret-ssl", { NULL }, 3661, "tcp" }, + { "can-ferret-ssl", { NULL }, 3661, "udp" }, + { "pserver", { NULL }, 3662, "tcp" }, + { "pserver", { NULL }, 3662, "udp" }, + { "dtp", { NULL }, 3663, "tcp" }, + { "dtp", { NULL }, 3663, "udp" }, + { "ups-engine", { NULL }, 3664, "tcp" }, + { "ups-engine", { NULL }, 3664, "udp" }, + { "ent-engine", { NULL }, 3665, "tcp" }, + { "ent-engine", { NULL }, 3665, "udp" }, + { "eserver-pap", { NULL }, 3666, "tcp" }, + { "eserver-pap", { NULL }, 3666, "udp" }, + { "infoexch", { NULL }, 3667, "tcp" }, + { "infoexch", { NULL }, 3667, "udp" }, + { "dell-rm-port", { NULL }, 3668, "tcp" }, + { "dell-rm-port", { NULL }, 3668, "udp" }, + { "casanswmgmt", { NULL }, 3669, "tcp" }, + { "casanswmgmt", { NULL }, 3669, "udp" }, + { "smile", { NULL }, 3670, "tcp" }, + { "smile", { NULL }, 3670, "udp" }, + { "efcp", { NULL }, 3671, "tcp" }, + { "efcp", { NULL }, 3671, "udp" }, + { "lispworks-orb", { NULL }, 3672, "tcp" }, + { "lispworks-orb", { NULL }, 3672, "udp" }, + { "mediavault-gui", { NULL }, 3673, "tcp" }, + { "mediavault-gui", { NULL }, 3673, "udp" }, + { "wininstall-ipc", { NULL }, 3674, "tcp" }, + { "wininstall-ipc", { NULL }, 3674, "udp" }, + { "calltrax", { NULL }, 3675, "tcp" }, + { "calltrax", { NULL }, 3675, "udp" }, + { "va-pacbase", { NULL }, 3676, "tcp" }, + { "va-pacbase", { NULL }, 3676, "udp" }, + { "roverlog", { NULL }, 3677, "tcp" }, + { "roverlog", { NULL }, 3677, "udp" }, + { "ipr-dglt", { NULL }, 3678, "tcp" }, + { "ipr-dglt", { NULL }, 3678, "udp" }, + { "newton-dock", { NULL }, 3679, "tcp" }, + { "newton-dock", { NULL }, 3679, "udp" }, + { "npds-tracker", { NULL }, 3680, "tcp" }, + { "npds-tracker", { NULL }, 3680, "udp" }, + { "bts-x73", { NULL }, 3681, "tcp" }, + { "bts-x73", { NULL }, 3681, "udp" }, + { "cas-mapi", { NULL }, 3682, "tcp" }, + { "cas-mapi", { NULL }, 3682, "udp" }, + { "bmc-ea", { NULL }, 3683, "tcp" }, + { "bmc-ea", { NULL }, 3683, "udp" }, + { "faxstfx-port", { NULL }, 3684, "tcp" }, + { "faxstfx-port", { NULL }, 3684, "udp" }, + { "dsx-agent", { NULL }, 3685, "tcp" }, + { "dsx-agent", { NULL }, 3685, "udp" }, + { "tnmpv2", { NULL }, 3686, "tcp" }, + { "tnmpv2", { NULL }, 3686, "udp" }, + { "simple-push", { NULL }, 3687, "tcp" }, + { "simple-push", { NULL }, 3687, "udp" }, + { "simple-push-s", { NULL }, 3688, "tcp" }, + { "simple-push-s", { NULL }, 3688, "udp" }, + { "daap", { NULL }, 3689, "tcp" }, + { "daap", { NULL }, 3689, "udp" }, + { "svn", { NULL }, 3690, "tcp" }, + { "svn", { NULL }, 3690, "udp" }, + { "magaya-network", { NULL }, 3691, "tcp" }, + { "magaya-network", { NULL }, 3691, "udp" }, + { "intelsync", { NULL }, 3692, "tcp" }, + { "intelsync", { NULL }, 3692, "udp" }, + { "bmc-data-coll", { NULL }, 3695, "tcp" }, + { "bmc-data-coll", { NULL }, 3695, "udp" }, + { "telnetcpcd", { NULL }, 3696, "tcp" }, + { "telnetcpcd", { NULL }, 3696, "udp" }, + { "nw-license", { NULL }, 3697, "tcp" }, + { "nw-license", { NULL }, 3697, "udp" }, + { "sagectlpanel", { NULL }, 3698, "tcp" }, + { "sagectlpanel", { NULL }, 3698, "udp" }, + { "kpn-icw", { NULL }, 3699, "tcp" }, + { "kpn-icw", { NULL }, 3699, "udp" }, + { "lrs-paging", { NULL }, 3700, "tcp" }, + { "lrs-paging", { NULL }, 3700, "udp" }, + { "netcelera", { NULL }, 3701, "tcp" }, + { "netcelera", { NULL }, 3701, "udp" }, + { "ws-discovery", { NULL }, 3702, "tcp" }, + { "ws-discovery", { NULL }, 3702, "udp" }, + { "adobeserver-3", { NULL }, 3703, "tcp" }, + { "adobeserver-3", { NULL }, 3703, "udp" }, + { "adobeserver-4", { NULL }, 3704, "tcp" }, + { "adobeserver-4", { NULL }, 3704, "udp" }, + { "adobeserver-5", { NULL }, 3705, "tcp" }, + { "adobeserver-5", { NULL }, 3705, "udp" }, + { "rt-event", { NULL }, 3706, "tcp" }, + { "rt-event", { NULL }, 3706, "udp" }, + { "rt-event-s", { NULL }, 3707, "tcp" }, + { "rt-event-s", { NULL }, 3707, "udp" }, + { "sun-as-iiops", { NULL }, 3708, "tcp" }, + { "sun-as-iiops", { NULL }, 3708, "udp" }, + { "ca-idms", { NULL }, 3709, "tcp" }, + { "ca-idms", { NULL }, 3709, "udp" }, + { "portgate-auth", { NULL }, 3710, "tcp" }, + { "portgate-auth", { NULL }, 3710, "udp" }, + { "edb-server2", { NULL }, 3711, "tcp" }, + { "edb-server2", { NULL }, 3711, "udp" }, + { "sentinel-ent", { NULL }, 3712, "tcp" }, + { "sentinel-ent", { NULL }, 3712, "udp" }, + { "tftps", { NULL }, 3713, "tcp" }, + { "tftps", { NULL }, 3713, "udp" }, + { "delos-dms", { NULL }, 3714, "tcp" }, + { "delos-dms", { NULL }, 3714, "udp" }, + { "anoto-rendezv", { NULL }, 3715, "tcp" }, + { "anoto-rendezv", { NULL }, 3715, "udp" }, + { "wv-csp-sms-cir", { NULL }, 3716, "tcp" }, + { "wv-csp-sms-cir", { NULL }, 3716, "udp" }, + { "wv-csp-udp-cir", { NULL }, 3717, "tcp" }, + { "wv-csp-udp-cir", { NULL }, 3717, "udp" }, + { "opus-services", { NULL }, 3718, "tcp" }, + { "opus-services", { NULL }, 3718, "udp" }, + { "itelserverport", { NULL }, 3719, "tcp" }, + { "itelserverport", { NULL }, 3719, "udp" }, + { "ufastro-instr", { NULL }, 3720, "tcp" }, + { "ufastro-instr", { NULL }, 3720, "udp" }, + { "xsync", { NULL }, 3721, "tcp" }, + { "xsync", { NULL }, 3721, "udp" }, + { "xserveraid", { NULL }, 3722, "tcp" }, + { "xserveraid", { NULL }, 3722, "udp" }, + { "sychrond", { NULL }, 3723, "tcp" }, + { "sychrond", { NULL }, 3723, "udp" }, + { "blizwow", { NULL }, 3724, "tcp" }, + { "blizwow", { NULL }, 3724, "udp" }, + { "na-er-tip", { NULL }, 3725, "tcp" }, + { "na-er-tip", { NULL }, 3725, "udp" }, + { "array-manager", { NULL }, 3726, "tcp" }, + { "array-manager", { NULL }, 3726, "udp" }, + { "e-mdu", { NULL }, 3727, "tcp" }, + { "e-mdu", { NULL }, 3727, "udp" }, + { "e-woa", { NULL }, 3728, "tcp" }, + { "e-woa", { NULL }, 3728, "udp" }, + { "fksp-audit", { NULL }, 3729, "tcp" }, + { "fksp-audit", { NULL }, 3729, "udp" }, + { "client-ctrl", { NULL }, 3730, "tcp" }, + { "client-ctrl", { NULL }, 3730, "udp" }, + { "smap", { NULL }, 3731, "tcp" }, + { "smap", { NULL }, 3731, "udp" }, + { "m-wnn", { NULL }, 3732, "tcp" }, + { "m-wnn", { NULL }, 3732, "udp" }, + { "multip-msg", { NULL }, 3733, "tcp" }, + { "multip-msg", { NULL }, 3733, "udp" }, + { "synel-data", { NULL }, 3734, "tcp" }, + { "synel-data", { NULL }, 3734, "udp" }, + { "pwdis", { NULL }, 3735, "tcp" }, + { "pwdis", { NULL }, 3735, "udp" }, + { "rs-rmi", { NULL }, 3736, "tcp" }, + { "rs-rmi", { NULL }, 3736, "udp" }, + { "xpanel", { NULL }, 3737, "tcp" }, + { "versatalk", { NULL }, 3738, "tcp" }, + { "versatalk", { NULL }, 3738, "udp" }, + { "launchbird-lm", { NULL }, 3739, "tcp" }, + { "launchbird-lm", { NULL }, 3739, "udp" }, + { "heartbeat", { NULL }, 3740, "tcp" }, + { "heartbeat", { NULL }, 3740, "udp" }, + { "wysdma", { NULL }, 3741, "tcp" }, + { "wysdma", { NULL }, 3741, "udp" }, + { "cst-port", { NULL }, 3742, "tcp" }, + { "cst-port", { NULL }, 3742, "udp" }, + { "ipcs-command", { NULL }, 3743, "tcp" }, + { "ipcs-command", { NULL }, 3743, "udp" }, + { "sasg", { NULL }, 3744, "tcp" }, + { "sasg", { NULL }, 3744, "udp" }, + { "gw-call-port", { NULL }, 3745, "tcp" }, + { "gw-call-port", { NULL }, 3745, "udp" }, + { "linktest", { NULL }, 3746, "tcp" }, + { "linktest", { NULL }, 3746, "udp" }, + { "linktest-s", { NULL }, 3747, "tcp" }, + { "linktest-s", { NULL }, 3747, "udp" }, + { "webdata", { NULL }, 3748, "tcp" }, + { "webdata", { NULL }, 3748, "udp" }, + { "cimtrak", { NULL }, 3749, "tcp" }, + { "cimtrak", { NULL }, 3749, "udp" }, + { "cbos-ip-port", { NULL }, 3750, "tcp" }, + { "cbos-ip-port", { NULL }, 3750, "udp" }, + { "gprs-cube", { NULL }, 3751, "tcp" }, + { "gprs-cube", { NULL }, 3751, "udp" }, + { "vipremoteagent", { NULL }, 3752, "tcp" }, + { "vipremoteagent", { NULL }, 3752, "udp" }, + { "nattyserver", { NULL }, 3753, "tcp" }, + { "nattyserver", { NULL }, 3753, "udp" }, + { "timestenbroker", { NULL }, 3754, "tcp" }, + { "timestenbroker", { NULL }, 3754, "udp" }, + { "sas-remote-hlp", { NULL }, 3755, "tcp" }, + { "sas-remote-hlp", { NULL }, 3755, "udp" }, + { "canon-capt", { NULL }, 3756, "tcp" }, + { "canon-capt", { NULL }, 3756, "udp" }, + { "grf-port", { NULL }, 3757, "tcp" }, + { "grf-port", { NULL }, 3757, "udp" }, + { "apw-registry", { NULL }, 3758, "tcp" }, + { "apw-registry", { NULL }, 3758, "udp" }, + { "exapt-lmgr", { NULL }, 3759, "tcp" }, + { "exapt-lmgr", { NULL }, 3759, "udp" }, + { "adtempusclient", { NULL }, 3760, "tcp" }, + { "adtempusclient", { NULL }, 3760, "udp" }, + { "gsakmp", { NULL }, 3761, "tcp" }, + { "gsakmp", { NULL }, 3761, "udp" }, + { "gbs-smp", { NULL }, 3762, "tcp" }, + { "gbs-smp", { NULL }, 3762, "udp" }, + { "xo-wave", { NULL }, 3763, "tcp" }, + { "xo-wave", { NULL }, 3763, "udp" }, + { "mni-prot-rout", { NULL }, 3764, "tcp" }, + { "mni-prot-rout", { NULL }, 3764, "udp" }, + { "rtraceroute", { NULL }, 3765, "tcp" }, + { "rtraceroute", { NULL }, 3765, "udp" }, + { "listmgr-port", { NULL }, 3767, "tcp" }, + { "listmgr-port", { NULL }, 3767, "udp" }, + { "rblcheckd", { NULL }, 3768, "tcp" }, + { "rblcheckd", { NULL }, 3768, "udp" }, + { "haipe-otnk", { NULL }, 3769, "tcp" }, + { "haipe-otnk", { NULL }, 3769, "udp" }, + { "cindycollab", { NULL }, 3770, "tcp" }, + { "cindycollab", { NULL }, 3770, "udp" }, + { "paging-port", { NULL }, 3771, "tcp" }, + { "paging-port", { NULL }, 3771, "udp" }, + { "ctp", { NULL }, 3772, "tcp" }, + { "ctp", { NULL }, 3772, "udp" }, + { "ctdhercules", { NULL }, 3773, "tcp" }, + { "ctdhercules", { NULL }, 3773, "udp" }, + { "zicom", { NULL }, 3774, "tcp" }, + { "zicom", { NULL }, 3774, "udp" }, + { "ispmmgr", { NULL }, 3775, "tcp" }, + { "ispmmgr", { NULL }, 3775, "udp" }, + { "dvcprov-port", { NULL }, 3776, "tcp" }, + { "dvcprov-port", { NULL }, 3776, "udp" }, + { "jibe-eb", { NULL }, 3777, "tcp" }, + { "jibe-eb", { NULL }, 3777, "udp" }, + { "c-h-it-port", { NULL }, 3778, "tcp" }, + { "c-h-it-port", { NULL }, 3778, "udp" }, + { "cognima", { NULL }, 3779, "tcp" }, + { "cognima", { NULL }, 3779, "udp" }, + { "nnp", { NULL }, 3780, "tcp" }, + { "nnp", { NULL }, 3780, "udp" }, + { "abcvoice-port", { NULL }, 3781, "tcp" }, + { "abcvoice-port", { NULL }, 3781, "udp" }, + { "iso-tp0s", { NULL }, 3782, "tcp" }, + { "iso-tp0s", { NULL }, 3782, "udp" }, + { "bim-pem", { NULL }, 3783, "tcp" }, + { "bim-pem", { NULL }, 3783, "udp" }, + { "bfd-control", { NULL }, 3784, "tcp" }, + { "bfd-control", { NULL }, 3784, "udp" }, + { "bfd-echo", { NULL }, 3785, "tcp" }, + { "bfd-echo", { NULL }, 3785, "udp" }, + { "upstriggervsw", { NULL }, 3786, "tcp" }, + { "upstriggervsw", { NULL }, 3786, "udp" }, + { "fintrx", { NULL }, 3787, "tcp" }, + { "fintrx", { NULL }, 3787, "udp" }, + { "isrp-port", { NULL }, 3788, "tcp" }, + { "isrp-port", { NULL }, 3788, "udp" }, + { "remotedeploy", { NULL }, 3789, "tcp" }, + { "remotedeploy", { NULL }, 3789, "udp" }, + { "quickbooksrds", { NULL }, 3790, "tcp" }, + { "quickbooksrds", { NULL }, 3790, "udp" }, + { "tvnetworkvideo", { NULL }, 3791, "tcp" }, + { "tvnetworkvideo", { NULL }, 3791, "udp" }, + { "sitewatch", { NULL }, 3792, "tcp" }, + { "sitewatch", { NULL }, 3792, "udp" }, + { "dcsoftware", { NULL }, 3793, "tcp" }, + { "dcsoftware", { NULL }, 3793, "udp" }, + { "jaus", { NULL }, 3794, "tcp" }, + { "jaus", { NULL }, 3794, "udp" }, + { "myblast", { NULL }, 3795, "tcp" }, + { "myblast", { NULL }, 3795, "udp" }, + { "spw-dialer", { NULL }, 3796, "tcp" }, + { "spw-dialer", { NULL }, 3796, "udp" }, + { "idps", { NULL }, 3797, "tcp" }, + { "idps", { NULL }, 3797, "udp" }, + { "minilock", { NULL }, 3798, "tcp" }, + { "minilock", { NULL }, 3798, "udp" }, + { "radius-dynauth", { NULL }, 3799, "tcp" }, + { "radius-dynauth", { NULL }, 3799, "udp" }, + { "pwgpsi", { NULL }, 3800, "tcp" }, + { "pwgpsi", { NULL }, 3800, "udp" }, + { "ibm-mgr", { NULL }, 3801, "tcp" }, + { "ibm-mgr", { NULL }, 3801, "udp" }, + { "vhd", { NULL }, 3802, "tcp" }, + { "vhd", { NULL }, 3802, "udp" }, + { "soniqsync", { NULL }, 3803, "tcp" }, + { "soniqsync", { NULL }, 3803, "udp" }, + { "iqnet-port", { NULL }, 3804, "tcp" }, + { "iqnet-port", { NULL }, 3804, "udp" }, + { "tcpdataserver", { NULL }, 3805, "tcp" }, + { "tcpdataserver", { NULL }, 3805, "udp" }, + { "wsmlb", { NULL }, 3806, "tcp" }, + { "wsmlb", { NULL }, 3806, "udp" }, + { "spugna", { NULL }, 3807, "tcp" }, + { "spugna", { NULL }, 3807, "udp" }, + { "sun-as-iiops-ca", { NULL }, 3808, "tcp" }, + { "sun-as-iiops-ca", { NULL }, 3808, "udp" }, + { "apocd", { NULL }, 3809, "tcp" }, + { "apocd", { NULL }, 3809, "udp" }, + { "wlanauth", { NULL }, 3810, "tcp" }, + { "wlanauth", { NULL }, 3810, "udp" }, + { "amp", { NULL }, 3811, "tcp" }, + { "amp", { NULL }, 3811, "udp" }, + { "neto-wol-server", { NULL }, 3812, "tcp" }, + { "neto-wol-server", { NULL }, 3812, "udp" }, + { "rap-ip", { NULL }, 3813, "tcp" }, + { "rap-ip", { NULL }, 3813, "udp" }, + { "neto-dcs", { NULL }, 3814, "tcp" }, + { "neto-dcs", { NULL }, 3814, "udp" }, + { "lansurveyorxml", { NULL }, 3815, "tcp" }, + { "lansurveyorxml", { NULL }, 3815, "udp" }, + { "sunlps-http", { NULL }, 3816, "tcp" }, + { "sunlps-http", { NULL }, 3816, "udp" }, + { "tapeware", { NULL }, 3817, "tcp" }, + { "tapeware", { NULL }, 3817, "udp" }, + { "crinis-hb", { NULL }, 3818, "tcp" }, + { "crinis-hb", { NULL }, 3818, "udp" }, + { "epl-slp", { NULL }, 3819, "tcp" }, + { "epl-slp", { NULL }, 3819, "udp" }, + { "scp", { NULL }, 3820, "tcp" }, + { "scp", { NULL }, 3820, "udp" }, + { "pmcp", { NULL }, 3821, "tcp" }, + { "pmcp", { NULL }, 3821, "udp" }, + { "acp-discovery", { NULL }, 3822, "tcp" }, + { "acp-discovery", { NULL }, 3822, "udp" }, + { "acp-conduit", { NULL }, 3823, "tcp" }, + { "acp-conduit", { NULL }, 3823, "udp" }, + { "acp-policy", { NULL }, 3824, "tcp" }, + { "acp-policy", { NULL }, 3824, "udp" }, + { "ffserver", { NULL }, 3825, "tcp" }, + { "ffserver", { NULL }, 3825, "udp" }, + { "wormux", { NULL }, 3826, "tcp" }, + { "wormux", { NULL }, 3826, "udp" }, + { "netmpi", { NULL }, 3827, "tcp" }, + { "netmpi", { NULL }, 3827, "udp" }, + { "neteh", { NULL }, 3828, "tcp" }, + { "neteh", { NULL }, 3828, "udp" }, + { "neteh-ext", { NULL }, 3829, "tcp" }, + { "neteh-ext", { NULL }, 3829, "udp" }, + { "cernsysmgmtagt", { NULL }, 3830, "tcp" }, + { "cernsysmgmtagt", { NULL }, 3830, "udp" }, + { "dvapps", { NULL }, 3831, "tcp" }, + { "dvapps", { NULL }, 3831, "udp" }, + { "xxnetserver", { NULL }, 3832, "tcp" }, + { "xxnetserver", { NULL }, 3832, "udp" }, + { "aipn-auth", { NULL }, 3833, "tcp" }, + { "aipn-auth", { NULL }, 3833, "udp" }, + { "spectardata", { NULL }, 3834, "tcp" }, + { "spectardata", { NULL }, 3834, "udp" }, + { "spectardb", { NULL }, 3835, "tcp" }, + { "spectardb", { NULL }, 3835, "udp" }, + { "markem-dcp", { NULL }, 3836, "tcp" }, + { "markem-dcp", { NULL }, 3836, "udp" }, + { "mkm-discovery", { NULL }, 3837, "tcp" }, + { "mkm-discovery", { NULL }, 3837, "udp" }, + { "sos", { NULL }, 3838, "tcp" }, + { "sos", { NULL }, 3838, "udp" }, + { "amx-rms", { NULL }, 3839, "tcp" }, + { "amx-rms", { NULL }, 3839, "udp" }, + { "flirtmitmir", { NULL }, 3840, "tcp" }, + { "flirtmitmir", { NULL }, 3840, "udp" }, + { "zfirm-shiprush3", { NULL }, 3841, "tcp" }, + { "zfirm-shiprush3", { NULL }, 3841, "udp" }, + { "nhci", { NULL }, 3842, "tcp" }, + { "nhci", { NULL }, 3842, "udp" }, + { "quest-agent", { NULL }, 3843, "tcp" }, + { "quest-agent", { NULL }, 3843, "udp" }, + { "rnm", { NULL }, 3844, "tcp" }, + { "rnm", { NULL }, 3844, "udp" }, + { "v-one-spp", { NULL }, 3845, "tcp" }, + { "v-one-spp", { NULL }, 3845, "udp" }, + { "an-pcp", { NULL }, 3846, "tcp" }, + { "an-pcp", { NULL }, 3846, "udp" }, + { "msfw-control", { NULL }, 3847, "tcp" }, + { "msfw-control", { NULL }, 3847, "udp" }, + { "item", { NULL }, 3848, "tcp" }, + { "item", { NULL }, 3848, "udp" }, + { "spw-dnspreload", { NULL }, 3849, "tcp" }, + { "spw-dnspreload", { NULL }, 3849, "udp" }, + { "qtms-bootstrap", { NULL }, 3850, "tcp" }, + { "qtms-bootstrap", { NULL }, 3850, "udp" }, + { "spectraport", { NULL }, 3851, "tcp" }, + { "spectraport", { NULL }, 3851, "udp" }, + { "sse-app-config", { NULL }, 3852, "tcp" }, + { "sse-app-config", { NULL }, 3852, "udp" }, + { "sscan", { NULL }, 3853, "tcp" }, + { "sscan", { NULL }, 3853, "udp" }, + { "stryker-com", { NULL }, 3854, "tcp" }, + { "stryker-com", { NULL }, 3854, "udp" }, + { "opentrac", { NULL }, 3855, "tcp" }, + { "opentrac", { NULL }, 3855, "udp" }, + { "informer", { NULL }, 3856, "tcp" }, + { "informer", { NULL }, 3856, "udp" }, + { "trap-port", { NULL }, 3857, "tcp" }, + { "trap-port", { NULL }, 3857, "udp" }, + { "trap-port-mom", { NULL }, 3858, "tcp" }, + { "trap-port-mom", { NULL }, 3858, "udp" }, + { "nav-port", { NULL }, 3859, "tcp" }, + { "nav-port", { NULL }, 3859, "udp" }, + { "sasp", { NULL }, 3860, "tcp" }, + { "sasp", { NULL }, 3860, "udp" }, + { "winshadow-hd", { NULL }, 3861, "tcp" }, + { "winshadow-hd", { NULL }, 3861, "udp" }, + { "giga-pocket", { NULL }, 3862, "tcp" }, + { "giga-pocket", { NULL }, 3862, "udp" }, + { "asap-tcp", { NULL }, 3863, "tcp" }, + { "asap-udp", { NULL }, 3863, "udp" }, + { "asap-sctp", { NULL }, 3863, "sctp"}, + { "asap-tcp-tls", { NULL }, 3864, "tcp" }, + { "asap-sctp-tls", { NULL }, 3864, "sctp"}, + { "xpl", { NULL }, 3865, "tcp" }, + { "xpl", { NULL }, 3865, "udp" }, + { "dzdaemon", { NULL }, 3866, "tcp" }, + { "dzdaemon", { NULL }, 3866, "udp" }, + { "dzoglserver", { NULL }, 3867, "tcp" }, + { "dzoglserver", { NULL }, 3867, "udp" }, + { "diameter", { NULL }, 3868, "tcp" }, + { "diameter", { NULL }, 3868, "sctp"}, + { "ovsam-mgmt", { NULL }, 3869, "tcp" }, + { "ovsam-mgmt", { NULL }, 3869, "udp" }, + { "ovsam-d-agent", { NULL }, 3870, "tcp" }, + { "ovsam-d-agent", { NULL }, 3870, "udp" }, + { "avocent-adsap", { NULL }, 3871, "tcp" }, + { "avocent-adsap", { NULL }, 3871, "udp" }, + { "oem-agent", { NULL }, 3872, "tcp" }, + { "oem-agent", { NULL }, 3872, "udp" }, + { "fagordnc", { NULL }, 3873, "tcp" }, + { "fagordnc", { NULL }, 3873, "udp" }, + { "sixxsconfig", { NULL }, 3874, "tcp" }, + { "sixxsconfig", { NULL }, 3874, "udp" }, + { "pnbscada", { NULL }, 3875, "tcp" }, + { "pnbscada", { NULL }, 3875, "udp" }, + { "dl_agent", { NULL }, 3876, "tcp" }, + { "dl_agent", { NULL }, 3876, "udp" }, + { "xmpcr-interface", { NULL }, 3877, "tcp" }, + { "xmpcr-interface", { NULL }, 3877, "udp" }, + { "fotogcad", { NULL }, 3878, "tcp" }, + { "fotogcad", { NULL }, 3878, "udp" }, + { "appss-lm", { NULL }, 3879, "tcp" }, + { "appss-lm", { NULL }, 3879, "udp" }, + { "igrs", { NULL }, 3880, "tcp" }, + { "igrs", { NULL }, 3880, "udp" }, + { "idac", { NULL }, 3881, "tcp" }, + { "idac", { NULL }, 3881, "udp" }, + { "msdts1", { NULL }, 3882, "tcp" }, + { "msdts1", { NULL }, 3882, "udp" }, + { "vrpn", { NULL }, 3883, "tcp" }, + { "vrpn", { NULL }, 3883, "udp" }, + { "softrack-meter", { NULL }, 3884, "tcp" }, + { "softrack-meter", { NULL }, 3884, "udp" }, + { "topflow-ssl", { NULL }, 3885, "tcp" }, + { "topflow-ssl", { NULL }, 3885, "udp" }, + { "nei-management", { NULL }, 3886, "tcp" }, + { "nei-management", { NULL }, 3886, "udp" }, + { "ciphire-data", { NULL }, 3887, "tcp" }, + { "ciphire-data", { NULL }, 3887, "udp" }, + { "ciphire-serv", { NULL }, 3888, "tcp" }, + { "ciphire-serv", { NULL }, 3888, "udp" }, + { "dandv-tester", { NULL }, 3889, "tcp" }, + { "dandv-tester", { NULL }, 3889, "udp" }, + { "ndsconnect", { NULL }, 3890, "tcp" }, + { "ndsconnect", { NULL }, 3890, "udp" }, + { "rtc-pm-port", { NULL }, 3891, "tcp" }, + { "rtc-pm-port", { NULL }, 3891, "udp" }, + { "pcc-image-port", { NULL }, 3892, "tcp" }, + { "pcc-image-port", { NULL }, 3892, "udp" }, + { "cgi-starapi", { NULL }, 3893, "tcp" }, + { "cgi-starapi", { NULL }, 3893, "udp" }, + { "syam-agent", { NULL }, 3894, "tcp" }, + { "syam-agent", { NULL }, 3894, "udp" }, + { "syam-smc", { NULL }, 3895, "tcp" }, + { "syam-smc", { NULL }, 3895, "udp" }, + { "sdo-tls", { NULL }, 3896, "tcp" }, + { "sdo-tls", { NULL }, 3896, "udp" }, + { "sdo-ssh", { NULL }, 3897, "tcp" }, + { "sdo-ssh", { NULL }, 3897, "udp" }, + { "senip", { NULL }, 3898, "tcp" }, + { "senip", { NULL }, 3898, "udp" }, + { "itv-control", { NULL }, 3899, "tcp" }, + { "itv-control", { NULL }, 3899, "udp" }, + { "udt_os", { NULL }, 3900, "tcp" }, + { "udt_os", { NULL }, 3900, "udp" }, + { "nimsh", { NULL }, 3901, "tcp" }, + { "nimsh", { NULL }, 3901, "udp" }, + { "nimaux", { NULL }, 3902, "tcp" }, + { "nimaux", { NULL }, 3902, "udp" }, + { "charsetmgr", { NULL }, 3903, "tcp" }, + { "charsetmgr", { NULL }, 3903, "udp" }, + { "omnilink-port", { NULL }, 3904, "tcp" }, + { "omnilink-port", { NULL }, 3904, "udp" }, + { "mupdate", { NULL }, 3905, "tcp" }, + { "mupdate", { NULL }, 3905, "udp" }, + { "topovista-data", { NULL }, 3906, "tcp" }, + { "topovista-data", { NULL }, 3906, "udp" }, + { "imoguia-port", { NULL }, 3907, "tcp" }, + { "imoguia-port", { NULL }, 3907, "udp" }, + { "hppronetman", { NULL }, 3908, "tcp" }, + { "hppronetman", { NULL }, 3908, "udp" }, + { "surfcontrolcpa", { NULL }, 3909, "tcp" }, + { "surfcontrolcpa", { NULL }, 3909, "udp" }, + { "prnrequest", { NULL }, 3910, "tcp" }, + { "prnrequest", { NULL }, 3910, "udp" }, + { "prnstatus", { NULL }, 3911, "tcp" }, + { "prnstatus", { NULL }, 3911, "udp" }, + { "gbmt-stars", { NULL }, 3912, "tcp" }, + { "gbmt-stars", { NULL }, 3912, "udp" }, + { "listcrt-port", { NULL }, 3913, "tcp" }, + { "listcrt-port", { NULL }, 3913, "udp" }, + { "listcrt-port-2", { NULL }, 3914, "tcp" }, + { "listcrt-port-2", { NULL }, 3914, "udp" }, + { "agcat", { NULL }, 3915, "tcp" }, + { "agcat", { NULL }, 3915, "udp" }, + { "wysdmc", { NULL }, 3916, "tcp" }, + { "wysdmc", { NULL }, 3916, "udp" }, + { "aftmux", { NULL }, 3917, "tcp" }, + { "aftmux", { NULL }, 3917, "udp" }, + { "pktcablemmcops", { NULL }, 3918, "tcp" }, + { "pktcablemmcops", { NULL }, 3918, "udp" }, + { "hyperip", { NULL }, 3919, "tcp" }, + { "hyperip", { NULL }, 3919, "udp" }, + { "exasoftport1", { NULL }, 3920, "tcp" }, + { "exasoftport1", { NULL }, 3920, "udp" }, + { "herodotus-net", { NULL }, 3921, "tcp" }, + { "herodotus-net", { NULL }, 3921, "udp" }, + { "sor-update", { NULL }, 3922, "tcp" }, + { "sor-update", { NULL }, 3922, "udp" }, + { "symb-sb-port", { NULL }, 3923, "tcp" }, + { "symb-sb-port", { NULL }, 3923, "udp" }, + { "mpl-gprs-port", { NULL }, 3924, "tcp" }, + { "mpl-gprs-port", { NULL }, 3924, "udp" }, + { "zmp", { NULL }, 3925, "tcp" }, + { "zmp", { NULL }, 3925, "udp" }, + { "winport", { NULL }, 3926, "tcp" }, + { "winport", { NULL }, 3926, "udp" }, + { "natdataservice", { NULL }, 3927, "tcp" }, + { "natdataservice", { NULL }, 3927, "udp" }, + { "netboot-pxe", { NULL }, 3928, "tcp" }, + { "netboot-pxe", { NULL }, 3928, "udp" }, + { "smauth-port", { NULL }, 3929, "tcp" }, + { "smauth-port", { NULL }, 3929, "udp" }, + { "syam-webserver", { NULL }, 3930, "tcp" }, + { "syam-webserver", { NULL }, 3930, "udp" }, + { "msr-plugin-port", { NULL }, 3931, "tcp" }, + { "msr-plugin-port", { NULL }, 3931, "udp" }, + { "dyn-site", { NULL }, 3932, "tcp" }, + { "dyn-site", { NULL }, 3932, "udp" }, + { "plbserve-port", { NULL }, 3933, "tcp" }, + { "plbserve-port", { NULL }, 3933, "udp" }, + { "sunfm-port", { NULL }, 3934, "tcp" }, + { "sunfm-port", { NULL }, 3934, "udp" }, + { "sdp-portmapper", { NULL }, 3935, "tcp" }, + { "sdp-portmapper", { NULL }, 3935, "udp" }, + { "mailprox", { NULL }, 3936, "tcp" }, + { "mailprox", { NULL }, 3936, "udp" }, + { "dvbservdsc", { NULL }, 3937, "tcp" }, + { "dvbservdsc", { NULL }, 3937, "udp" }, + { "dbcontrol_agent", { NULL }, 3938, "tcp" }, + { "dbcontrol_agent", { NULL }, 3938, "udp" }, + { "aamp", { NULL }, 3939, "tcp" }, + { "aamp", { NULL }, 3939, "udp" }, + { "xecp-node", { NULL }, 3940, "tcp" }, + { "xecp-node", { NULL }, 3940, "udp" }, + { "homeportal-web", { NULL }, 3941, "tcp" }, + { "homeportal-web", { NULL }, 3941, "udp" }, + { "srdp", { NULL }, 3942, "tcp" }, + { "srdp", { NULL }, 3942, "udp" }, + { "tig", { NULL }, 3943, "tcp" }, + { "tig", { NULL }, 3943, "udp" }, + { "sops", { NULL }, 3944, "tcp" }, + { "sops", { NULL }, 3944, "udp" }, + { "emcads", { NULL }, 3945, "tcp" }, + { "emcads", { NULL }, 3945, "udp" }, + { "backupedge", { NULL }, 3946, "tcp" }, + { "backupedge", { NULL }, 3946, "udp" }, + { "ccp", { NULL }, 3947, "tcp" }, + { "ccp", { NULL }, 3947, "udp" }, + { "apdap", { NULL }, 3948, "tcp" }, + { "apdap", { NULL }, 3948, "udp" }, + { "drip", { NULL }, 3949, "tcp" }, + { "drip", { NULL }, 3949, "udp" }, + { "namemunge", { NULL }, 3950, "tcp" }, + { "namemunge", { NULL }, 3950, "udp" }, + { "pwgippfax", { NULL }, 3951, "tcp" }, + { "pwgippfax", { NULL }, 3951, "udp" }, + { "i3-sessionmgr", { NULL }, 3952, "tcp" }, + { "i3-sessionmgr", { NULL }, 3952, "udp" }, + { "xmlink-connect", { NULL }, 3953, "tcp" }, + { "xmlink-connect", { NULL }, 3953, "udp" }, + { "adrep", { NULL }, 3954, "tcp" }, + { "adrep", { NULL }, 3954, "udp" }, + { "p2pcommunity", { NULL }, 3955, "tcp" }, + { "p2pcommunity", { NULL }, 3955, "udp" }, + { "gvcp", { NULL }, 3956, "tcp" }, + { "gvcp", { NULL }, 3956, "udp" }, + { "mqe-broker", { NULL }, 3957, "tcp" }, + { "mqe-broker", { NULL }, 3957, "udp" }, + { "mqe-agent", { NULL }, 3958, "tcp" }, + { "mqe-agent", { NULL }, 3958, "udp" }, + { "treehopper", { NULL }, 3959, "tcp" }, + { "treehopper", { NULL }, 3959, "udp" }, + { "bess", { NULL }, 3960, "tcp" }, + { "bess", { NULL }, 3960, "udp" }, + { "proaxess", { NULL }, 3961, "tcp" }, + { "proaxess", { NULL }, 3961, "udp" }, + { "sbi-agent", { NULL }, 3962, "tcp" }, + { "sbi-agent", { NULL }, 3962, "udp" }, + { "thrp", { NULL }, 3963, "tcp" }, + { "thrp", { NULL }, 3963, "udp" }, + { "sasggprs", { NULL }, 3964, "tcp" }, + { "sasggprs", { NULL }, 3964, "udp" }, + { "ati-ip-to-ncpe", { NULL }, 3965, "tcp" }, + { "ati-ip-to-ncpe", { NULL }, 3965, "udp" }, + { "bflckmgr", { NULL }, 3966, "tcp" }, + { "bflckmgr", { NULL }, 3966, "udp" }, + { "ppsms", { NULL }, 3967, "tcp" }, + { "ppsms", { NULL }, 3967, "udp" }, + { "ianywhere-dbns", { NULL }, 3968, "tcp" }, + { "ianywhere-dbns", { NULL }, 3968, "udp" }, + { "landmarks", { NULL }, 3969, "tcp" }, + { "landmarks", { NULL }, 3969, "udp" }, + { "lanrevagent", { NULL }, 3970, "tcp" }, + { "lanrevagent", { NULL }, 3970, "udp" }, + { "lanrevserver", { NULL }, 3971, "tcp" }, + { "lanrevserver", { NULL }, 3971, "udp" }, + { "iconp", { NULL }, 3972, "tcp" }, + { "iconp", { NULL }, 3972, "udp" }, + { "progistics", { NULL }, 3973, "tcp" }, + { "progistics", { NULL }, 3973, "udp" }, + { "citysearch", { NULL }, 3974, "tcp" }, + { "citysearch", { NULL }, 3974, "udp" }, + { "airshot", { NULL }, 3975, "tcp" }, + { "airshot", { NULL }, 3975, "udp" }, + { "opswagent", { NULL }, 3976, "tcp" }, + { "opswagent", { NULL }, 3976, "udp" }, + { "opswmanager", { NULL }, 3977, "tcp" }, + { "opswmanager", { NULL }, 3977, "udp" }, + { "secure-cfg-svr", { NULL }, 3978, "tcp" }, + { "secure-cfg-svr", { NULL }, 3978, "udp" }, + { "smwan", { NULL }, 3979, "tcp" }, + { "smwan", { NULL }, 3979, "udp" }, + { "acms", { NULL }, 3980, "tcp" }, + { "acms", { NULL }, 3980, "udp" }, + { "starfish", { NULL }, 3981, "tcp" }, + { "starfish", { NULL }, 3981, "udp" }, + { "eis", { NULL }, 3982, "tcp" }, + { "eis", { NULL }, 3982, "udp" }, + { "eisp", { NULL }, 3983, "tcp" }, + { "eisp", { NULL }, 3983, "udp" }, + { "mapper-nodemgr", { NULL }, 3984, "tcp" }, + { "mapper-nodemgr", { NULL }, 3984, "udp" }, + { "mapper-mapethd", { NULL }, 3985, "tcp" }, + { "mapper-mapethd", { NULL }, 3985, "udp" }, + { "mapper-ws_ethd", { NULL }, 3986, "tcp" }, + { "mapper-ws_ethd", { NULL }, 3986, "udp" }, + { "centerline", { NULL }, 3987, "tcp" }, + { "centerline", { NULL }, 3987, "udp" }, + { "dcs-config", { NULL }, 3988, "tcp" }, + { "dcs-config", { NULL }, 3988, "udp" }, + { "bv-queryengine", { NULL }, 3989, "tcp" }, + { "bv-queryengine", { NULL }, 3989, "udp" }, + { "bv-is", { NULL }, 3990, "tcp" }, + { "bv-is", { NULL }, 3990, "udp" }, + { "bv-smcsrv", { NULL }, 3991, "tcp" }, + { "bv-smcsrv", { NULL }, 3991, "udp" }, + { "bv-ds", { NULL }, 3992, "tcp" }, + { "bv-ds", { NULL }, 3992, "udp" }, + { "bv-agent", { NULL }, 3993, "tcp" }, + { "bv-agent", { NULL }, 3993, "udp" }, + { "iss-mgmt-ssl", { NULL }, 3995, "tcp" }, + { "iss-mgmt-ssl", { NULL }, 3995, "udp" }, + { "abcsoftware", { NULL }, 3996, "tcp" }, + { "abcsoftware", { NULL }, 3996, "udp" }, + { "agentsease-db", { NULL }, 3997, "tcp" }, + { "agentsease-db", { NULL }, 3997, "udp" }, + { "dnx", { NULL }, 3998, "tcp" }, + { "dnx", { NULL }, 3998, "udp" }, + { "nvcnet", { NULL }, 3999, "tcp" }, + { "nvcnet", { NULL }, 3999, "udp" }, + { "terabase", { NULL }, 4000, "tcp" }, + { "terabase", { NULL }, 4000, "udp" }, + { "newoak", { NULL }, 4001, "tcp" }, + { "newoak", { NULL }, 4001, "udp" }, + { "pxc-spvr-ft", { NULL }, 4002, "tcp" }, + { "pxc-spvr-ft", { NULL }, 4002, "udp" }, + { "pxc-splr-ft", { NULL }, 4003, "tcp" }, + { "pxc-splr-ft", { NULL }, 4003, "udp" }, + { "pxc-roid", { NULL }, 4004, "tcp" }, + { "pxc-roid", { NULL }, 4004, "udp" }, + { "pxc-pin", { NULL }, 4005, "tcp" }, + { "pxc-pin", { NULL }, 4005, "udp" }, + { "pxc-spvr", { NULL }, 4006, "tcp" }, + { "pxc-spvr", { NULL }, 4006, "udp" }, + { "pxc-splr", { NULL }, 4007, "tcp" }, + { "pxc-splr", { NULL }, 4007, "udp" }, + { "netcheque", { NULL }, 4008, "tcp" }, + { "netcheque", { NULL }, 4008, "udp" }, + { "chimera-hwm", { NULL }, 4009, "tcp" }, + { "chimera-hwm", { NULL }, 4009, "udp" }, + { "samsung-unidex", { NULL }, 4010, "tcp" }, + { "samsung-unidex", { NULL }, 4010, "udp" }, + { "altserviceboot", { NULL }, 4011, "tcp" }, + { "altserviceboot", { NULL }, 4011, "udp" }, + { "pda-gate", { NULL }, 4012, "tcp" }, + { "pda-gate", { NULL }, 4012, "udp" }, + { "acl-manager", { NULL }, 4013, "tcp" }, + { "acl-manager", { NULL }, 4013, "udp" }, + { "taiclock", { NULL }, 4014, "tcp" }, + { "taiclock", { NULL }, 4014, "udp" }, + { "talarian-mcast1", { NULL }, 4015, "tcp" }, + { "talarian-mcast1", { NULL }, 4015, "udp" }, + { "talarian-mcast2", { NULL }, 4016, "tcp" }, + { "talarian-mcast2", { NULL }, 4016, "udp" }, + { "talarian-mcast3", { NULL }, 4017, "tcp" }, + { "talarian-mcast3", { NULL }, 4017, "udp" }, + { "talarian-mcast4", { NULL }, 4018, "tcp" }, + { "talarian-mcast4", { NULL }, 4018, "udp" }, + { "talarian-mcast5", { NULL }, 4019, "tcp" }, + { "talarian-mcast5", { NULL }, 4019, "udp" }, + { "trap", { NULL }, 4020, "tcp" }, + { "trap", { NULL }, 4020, "udp" }, + { "nexus-portal", { NULL }, 4021, "tcp" }, + { "nexus-portal", { NULL }, 4021, "udp" }, + { "dnox", { NULL }, 4022, "tcp" }, + { "dnox", { NULL }, 4022, "udp" }, + { "esnm-zoning", { NULL }, 4023, "tcp" }, + { "esnm-zoning", { NULL }, 4023, "udp" }, + { "tnp1-port", { NULL }, 4024, "tcp" }, + { "tnp1-port", { NULL }, 4024, "udp" }, + { "partimage", { NULL }, 4025, "tcp" }, + { "partimage", { NULL }, 4025, "udp" }, + { "as-debug", { NULL }, 4026, "tcp" }, + { "as-debug", { NULL }, 4026, "udp" }, + { "bxp", { NULL }, 4027, "tcp" }, + { "bxp", { NULL }, 4027, "udp" }, + { "dtserver-port", { NULL }, 4028, "tcp" }, + { "dtserver-port", { NULL }, 4028, "udp" }, + { "ip-qsig", { NULL }, 4029, "tcp" }, + { "ip-qsig", { NULL }, 4029, "udp" }, + { "jdmn-port", { NULL }, 4030, "tcp" }, + { "jdmn-port", { NULL }, 4030, "udp" }, + { "suucp", { NULL }, 4031, "tcp" }, + { "suucp", { NULL }, 4031, "udp" }, + { "vrts-auth-port", { NULL }, 4032, "tcp" }, + { "vrts-auth-port", { NULL }, 4032, "udp" }, + { "sanavigator", { NULL }, 4033, "tcp" }, + { "sanavigator", { NULL }, 4033, "udp" }, + { "ubxd", { NULL }, 4034, "tcp" }, + { "ubxd", { NULL }, 4034, "udp" }, + { "wap-push-http", { NULL }, 4035, "tcp" }, + { "wap-push-http", { NULL }, 4035, "udp" }, + { "wap-push-https", { NULL }, 4036, "tcp" }, + { "wap-push-https", { NULL }, 4036, "udp" }, + { "ravehd", { NULL }, 4037, "tcp" }, + { "ravehd", { NULL }, 4037, "udp" }, + { "fazzt-ptp", { NULL }, 4038, "tcp" }, + { "fazzt-ptp", { NULL }, 4038, "udp" }, + { "fazzt-admin", { NULL }, 4039, "tcp" }, + { "fazzt-admin", { NULL }, 4039, "udp" }, + { "yo-main", { NULL }, 4040, "tcp" }, + { "yo-main", { NULL }, 4040, "udp" }, + { "houston", { NULL }, 4041, "tcp" }, + { "houston", { NULL }, 4041, "udp" }, + { "ldxp", { NULL }, 4042, "tcp" }, + { "ldxp", { NULL }, 4042, "udp" }, + { "nirp", { NULL }, 4043, "tcp" }, + { "nirp", { NULL }, 4043, "udp" }, + { "ltp", { NULL }, 4044, "tcp" }, + { "ltp", { NULL }, 4044, "udp" }, + { "npp", { NULL }, 4045, "tcp" }, + { "npp", { NULL }, 4045, "udp" }, + { "acp-proto", { NULL }, 4046, "tcp" }, + { "acp-proto", { NULL }, 4046, "udp" }, + { "ctp-state", { NULL }, 4047, "tcp" }, + { "ctp-state", { NULL }, 4047, "udp" }, + { "wafs", { NULL }, 4049, "tcp" }, + { "wafs", { NULL }, 4049, "udp" }, + { "cisco-wafs", { NULL }, 4050, "tcp" }, + { "cisco-wafs", { NULL }, 4050, "udp" }, + { "cppdp", { NULL }, 4051, "tcp" }, + { "cppdp", { NULL }, 4051, "udp" }, + { "interact", { NULL }, 4052, "tcp" }, + { "interact", { NULL }, 4052, "udp" }, + { "ccu-comm-1", { NULL }, 4053, "tcp" }, + { "ccu-comm-1", { NULL }, 4053, "udp" }, + { "ccu-comm-2", { NULL }, 4054, "tcp" }, + { "ccu-comm-2", { NULL }, 4054, "udp" }, + { "ccu-comm-3", { NULL }, 4055, "tcp" }, + { "ccu-comm-3", { NULL }, 4055, "udp" }, + { "lms", { NULL }, 4056, "tcp" }, + { "lms", { NULL }, 4056, "udp" }, + { "wfm", { NULL }, 4057, "tcp" }, + { "wfm", { NULL }, 4057, "udp" }, + { "kingfisher", { NULL }, 4058, "tcp" }, + { "kingfisher", { NULL }, 4058, "udp" }, + { "dlms-cosem", { NULL }, 4059, "tcp" }, + { "dlms-cosem", { NULL }, 4059, "udp" }, + { "dsmeter_iatc", { NULL }, 4060, "tcp" }, + { "dsmeter_iatc", { NULL }, 4060, "udp" }, + { "ice-location", { NULL }, 4061, "tcp" }, + { "ice-location", { NULL }, 4061, "udp" }, + { "ice-slocation", { NULL }, 4062, "tcp" }, + { "ice-slocation", { NULL }, 4062, "udp" }, + { "ice-router", { NULL }, 4063, "tcp" }, + { "ice-router", { NULL }, 4063, "udp" }, + { "ice-srouter", { NULL }, 4064, "tcp" }, + { "ice-srouter", { NULL }, 4064, "udp" }, + { "avanti_cdp", { NULL }, 4065, "tcp" }, + { "avanti_cdp", { NULL }, 4065, "udp" }, + { "pmas", { NULL }, 4066, "tcp" }, + { "pmas", { NULL }, 4066, "udp" }, + { "idp", { NULL }, 4067, "tcp" }, + { "idp", { NULL }, 4067, "udp" }, + { "ipfltbcst", { NULL }, 4068, "tcp" }, + { "ipfltbcst", { NULL }, 4068, "udp" }, + { "minger", { NULL }, 4069, "tcp" }, + { "minger", { NULL }, 4069, "udp" }, + { "tripe", { NULL }, 4070, "tcp" }, + { "tripe", { NULL }, 4070, "udp" }, + { "aibkup", { NULL }, 4071, "tcp" }, + { "aibkup", { NULL }, 4071, "udp" }, + { "zieto-sock", { NULL }, 4072, "tcp" }, + { "zieto-sock", { NULL }, 4072, "udp" }, + { "iRAPP", { NULL }, 4073, "tcp" }, + { "iRAPP", { NULL }, 4073, "udp" }, + { "cequint-cityid", { NULL }, 4074, "tcp" }, + { "cequint-cityid", { NULL }, 4074, "udp" }, + { "perimlan", { NULL }, 4075, "tcp" }, + { "perimlan", { NULL }, 4075, "udp" }, + { "seraph", { NULL }, 4076, "tcp" }, + { "seraph", { NULL }, 4076, "udp" }, + { "ascomalarm", { NULL }, 4077, "udp" }, + { "cssp", { NULL }, 4078, "tcp" }, + { "santools", { NULL }, 4079, "tcp" }, + { "santools", { NULL }, 4079, "udp" }, + { "lorica-in", { NULL }, 4080, "tcp" }, + { "lorica-in", { NULL }, 4080, "udp" }, + { "lorica-in-sec", { NULL }, 4081, "tcp" }, + { "lorica-in-sec", { NULL }, 4081, "udp" }, + { "lorica-out", { NULL }, 4082, "tcp" }, + { "lorica-out", { NULL }, 4082, "udp" }, + { "lorica-out-sec", { NULL }, 4083, "tcp" }, + { "lorica-out-sec", { NULL }, 4083, "udp" }, + { "fortisphere-vm", { NULL }, 4084, "udp" }, + { "ezmessagesrv", { NULL }, 4085, "tcp" }, + { "ftsync", { NULL }, 4086, "udp" }, + { "applusservice", { NULL }, 4087, "tcp" }, + { "npsp", { NULL }, 4088, "tcp" }, + { "opencore", { NULL }, 4089, "tcp" }, + { "opencore", { NULL }, 4089, "udp" }, + { "omasgport", { NULL }, 4090, "tcp" }, + { "omasgport", { NULL }, 4090, "udp" }, + { "ewinstaller", { NULL }, 4091, "tcp" }, + { "ewinstaller", { NULL }, 4091, "udp" }, + { "ewdgs", { NULL }, 4092, "tcp" }, + { "ewdgs", { NULL }, 4092, "udp" }, + { "pvxpluscs", { NULL }, 4093, "tcp" }, + { "pvxpluscs", { NULL }, 4093, "udp" }, + { "sysrqd", { NULL }, 4094, "tcp" }, + { "sysrqd", { NULL }, 4094, "udp" }, + { "xtgui", { NULL }, 4095, "tcp" }, + { "xtgui", { NULL }, 4095, "udp" }, + { "bre", { NULL }, 4096, "tcp" }, + { "bre", { NULL }, 4096, "udp" }, + { "patrolview", { NULL }, 4097, "tcp" }, + { "patrolview", { NULL }, 4097, "udp" }, + { "drmsfsd", { NULL }, 4098, "tcp" }, + { "drmsfsd", { NULL }, 4098, "udp" }, + { "dpcp", { NULL }, 4099, "tcp" }, + { "dpcp", { NULL }, 4099, "udp" }, + { "igo-incognito", { NULL }, 4100, "tcp" }, + { "igo-incognito", { NULL }, 4100, "udp" }, + { "brlp-0", { NULL }, 4101, "tcp" }, + { "brlp-0", { NULL }, 4101, "udp" }, + { "brlp-1", { NULL }, 4102, "tcp" }, + { "brlp-1", { NULL }, 4102, "udp" }, + { "brlp-2", { NULL }, 4103, "tcp" }, + { "brlp-2", { NULL }, 4103, "udp" }, + { "brlp-3", { NULL }, 4104, "tcp" }, + { "brlp-3", { NULL }, 4104, "udp" }, + { "shofarplayer", { NULL }, 4105, "tcp" }, + { "shofarplayer", { NULL }, 4105, "udp" }, + { "synchronite", { NULL }, 4106, "tcp" }, + { "synchronite", { NULL }, 4106, "udp" }, + { "j-ac", { NULL }, 4107, "tcp" }, + { "j-ac", { NULL }, 4107, "udp" }, + { "accel", { NULL }, 4108, "tcp" }, + { "accel", { NULL }, 4108, "udp" }, + { "izm", { NULL }, 4109, "tcp" }, + { "izm", { NULL }, 4109, "udp" }, + { "g2tag", { NULL }, 4110, "tcp" }, + { "g2tag", { NULL }, 4110, "udp" }, + { "xgrid", { NULL }, 4111, "tcp" }, + { "xgrid", { NULL }, 4111, "udp" }, + { "apple-vpns-rp", { NULL }, 4112, "tcp" }, + { "apple-vpns-rp", { NULL }, 4112, "udp" }, + { "aipn-reg", { NULL }, 4113, "tcp" }, + { "aipn-reg", { NULL }, 4113, "udp" }, + { "jomamqmonitor", { NULL }, 4114, "tcp" }, + { "jomamqmonitor", { NULL }, 4114, "udp" }, + { "cds", { NULL }, 4115, "tcp" }, + { "cds", { NULL }, 4115, "udp" }, + { "smartcard-tls", { NULL }, 4116, "tcp" }, + { "smartcard-tls", { NULL }, 4116, "udp" }, + { "hillrserv", { NULL }, 4117, "tcp" }, + { "hillrserv", { NULL }, 4117, "udp" }, + { "netscript", { NULL }, 4118, "tcp" }, + { "netscript", { NULL }, 4118, "udp" }, + { "assuria-slm", { NULL }, 4119, "tcp" }, + { "assuria-slm", { NULL }, 4119, "udp" }, + { "e-builder", { NULL }, 4121, "tcp" }, + { "e-builder", { NULL }, 4121, "udp" }, + { "fprams", { NULL }, 4122, "tcp" }, + { "fprams", { NULL }, 4122, "udp" }, + { "z-wave", { NULL }, 4123, "tcp" }, + { "z-wave", { NULL }, 4123, "udp" }, + { "tigv2", { NULL }, 4124, "tcp" }, + { "tigv2", { NULL }, 4124, "udp" }, + { "opsview-envoy", { NULL }, 4125, "tcp" }, + { "opsview-envoy", { NULL }, 4125, "udp" }, + { "ddrepl", { NULL }, 4126, "tcp" }, + { "ddrepl", { NULL }, 4126, "udp" }, + { "unikeypro", { NULL }, 4127, "tcp" }, + { "unikeypro", { NULL }, 4127, "udp" }, + { "nufw", { NULL }, 4128, "tcp" }, + { "nufw", { NULL }, 4128, "udp" }, + { "nuauth", { NULL }, 4129, "tcp" }, + { "nuauth", { NULL }, 4129, "udp" }, + { "fronet", { NULL }, 4130, "tcp" }, + { "fronet", { NULL }, 4130, "udp" }, + { "stars", { NULL }, 4131, "tcp" }, + { "stars", { NULL }, 4131, "udp" }, + { "nuts_dem", { NULL }, 4132, "tcp" }, + { "nuts_dem", { NULL }, 4132, "udp" }, + { "nuts_bootp", { NULL }, 4133, "tcp" }, + { "nuts_bootp", { NULL }, 4133, "udp" }, + { "nifty-hmi", { NULL }, 4134, "tcp" }, + { "nifty-hmi", { NULL }, 4134, "udp" }, + { "cl-db-attach", { NULL }, 4135, "tcp" }, + { "cl-db-attach", { NULL }, 4135, "udp" }, + { "cl-db-request", { NULL }, 4136, "tcp" }, + { "cl-db-request", { NULL }, 4136, "udp" }, + { "cl-db-remote", { NULL }, 4137, "tcp" }, + { "cl-db-remote", { NULL }, 4137, "udp" }, + { "nettest", { NULL }, 4138, "tcp" }, + { "nettest", { NULL }, 4138, "udp" }, + { "thrtx", { NULL }, 4139, "tcp" }, + { "thrtx", { NULL }, 4139, "udp" }, + { "cedros_fds", { NULL }, 4140, "tcp" }, + { "cedros_fds", { NULL }, 4140, "udp" }, + { "oirtgsvc", { NULL }, 4141, "tcp" }, + { "oirtgsvc", { NULL }, 4141, "udp" }, + { "oidocsvc", { NULL }, 4142, "tcp" }, + { "oidocsvc", { NULL }, 4142, "udp" }, + { "oidsr", { NULL }, 4143, "tcp" }, + { "oidsr", { NULL }, 4143, "udp" }, + { "vvr-control", { NULL }, 4145, "tcp" }, + { "vvr-control", { NULL }, 4145, "udp" }, + { "tgcconnect", { NULL }, 4146, "tcp" }, + { "tgcconnect", { NULL }, 4146, "udp" }, + { "vrxpservman", { NULL }, 4147, "tcp" }, + { "vrxpservman", { NULL }, 4147, "udp" }, + { "hhb-handheld", { NULL }, 4148, "tcp" }, + { "hhb-handheld", { NULL }, 4148, "udp" }, + { "agslb", { NULL }, 4149, "tcp" }, + { "agslb", { NULL }, 4149, "udp" }, + { "PowerAlert-nsa", { NULL }, 4150, "tcp" }, + { "PowerAlert-nsa", { NULL }, 4150, "udp" }, + { "menandmice_noh", { NULL }, 4151, "tcp" }, + { "menandmice_noh", { NULL }, 4151, "udp" }, + { "idig_mux", { NULL }, 4152, "tcp" }, + { "idig_mux", { NULL }, 4152, "udp" }, + { "mbl-battd", { NULL }, 4153, "tcp" }, + { "mbl-battd", { NULL }, 4153, "udp" }, + { "atlinks", { NULL }, 4154, "tcp" }, + { "atlinks", { NULL }, 4154, "udp" }, + { "bzr", { NULL }, 4155, "tcp" }, + { "bzr", { NULL }, 4155, "udp" }, + { "stat-results", { NULL }, 4156, "tcp" }, + { "stat-results", { NULL }, 4156, "udp" }, + { "stat-scanner", { NULL }, 4157, "tcp" }, + { "stat-scanner", { NULL }, 4157, "udp" }, + { "stat-cc", { NULL }, 4158, "tcp" }, + { "stat-cc", { NULL }, 4158, "udp" }, + { "nss", { NULL }, 4159, "tcp" }, + { "nss", { NULL }, 4159, "udp" }, + { "jini-discovery", { NULL }, 4160, "tcp" }, + { "jini-discovery", { NULL }, 4160, "udp" }, + { "omscontact", { NULL }, 4161, "tcp" }, + { "omscontact", { NULL }, 4161, "udp" }, + { "omstopology", { NULL }, 4162, "tcp" }, + { "omstopology", { NULL }, 4162, "udp" }, + { "silverpeakpeer", { NULL }, 4163, "tcp" }, + { "silverpeakpeer", { NULL }, 4163, "udp" }, + { "silverpeakcomm", { NULL }, 4164, "tcp" }, + { "silverpeakcomm", { NULL }, 4164, "udp" }, + { "altcp", { NULL }, 4165, "tcp" }, + { "altcp", { NULL }, 4165, "udp" }, + { "joost", { NULL }, 4166, "tcp" }, + { "joost", { NULL }, 4166, "udp" }, + { "ddgn", { NULL }, 4167, "tcp" }, + { "ddgn", { NULL }, 4167, "udp" }, + { "pslicser", { NULL }, 4168, "tcp" }, + { "pslicser", { NULL }, 4168, "udp" }, + { "iadt", { NULL }, 4169, "tcp" }, + { "iadt-disc", { NULL }, 4169, "udp" }, + { "d-cinema-csp", { NULL }, 4170, "tcp" }, + { "ml-svnet", { NULL }, 4171, "tcp" }, + { "pcoip", { NULL }, 4172, "tcp" }, + { "pcoip", { NULL }, 4172, "udp" }, + { "smcluster", { NULL }, 4174, "tcp" }, + { "bccp", { NULL }, 4175, "tcp" }, + { "tl-ipcproxy", { NULL }, 4176, "tcp" }, + { "wello", { NULL }, 4177, "tcp" }, + { "wello", { NULL }, 4177, "udp" }, + { "storman", { NULL }, 4178, "tcp" }, + { "storman", { NULL }, 4178, "udp" }, + { "MaxumSP", { NULL }, 4179, "tcp" }, + { "MaxumSP", { NULL }, 4179, "udp" }, + { "httpx", { NULL }, 4180, "tcp" }, + { "httpx", { NULL }, 4180, "udp" }, + { "macbak", { NULL }, 4181, "tcp" }, + { "macbak", { NULL }, 4181, "udp" }, + { "pcptcpservice", { NULL }, 4182, "tcp" }, + { "pcptcpservice", { NULL }, 4182, "udp" }, + { "gmmp", { NULL }, 4183, "tcp" }, + { "gmmp", { NULL }, 4183, "udp" }, + { "universe_suite", { NULL }, 4184, "tcp" }, + { "universe_suite", { NULL }, 4184, "udp" }, + { "wcpp", { NULL }, 4185, "tcp" }, + { "wcpp", { NULL }, 4185, "udp" }, + { "boxbackupstore", { NULL }, 4186, "tcp" }, + { "csc_proxy", { NULL }, 4187, "tcp" }, + { "vatata", { NULL }, 4188, "tcp" }, + { "vatata", { NULL }, 4188, "udp" }, + { "pcep", { NULL }, 4189, "tcp" }, + { "sieve", { NULL }, 4190, "tcp" }, + { "dsmipv6", { NULL }, 4191, "udp" }, + { "azeti", { NULL }, 4192, "tcp" }, + { "azeti-bd", { NULL }, 4192, "udp" }, + { "pvxplusio", { NULL }, 4193, "tcp" }, + { "eims-admin", { NULL }, 4199, "tcp" }, + { "eims-admin", { NULL }, 4199, "udp" }, + { "corelccam", { NULL }, 4300, "tcp" }, + { "corelccam", { NULL }, 4300, "udp" }, + { "d-data", { NULL }, 4301, "tcp" }, + { "d-data", { NULL }, 4301, "udp" }, + { "d-data-control", { NULL }, 4302, "tcp" }, + { "d-data-control", { NULL }, 4302, "udp" }, + { "srcp", { NULL }, 4303, "tcp" }, + { "srcp", { NULL }, 4303, "udp" }, + { "owserver", { NULL }, 4304, "tcp" }, + { "owserver", { NULL }, 4304, "udp" }, + { "batman", { NULL }, 4305, "tcp" }, + { "batman", { NULL }, 4305, "udp" }, + { "pinghgl", { NULL }, 4306, "tcp" }, + { "pinghgl", { NULL }, 4306, "udp" }, + { "visicron-vs", { NULL }, 4307, "tcp" }, + { "visicron-vs", { NULL }, 4307, "udp" }, + { "compx-lockview", { NULL }, 4308, "tcp" }, + { "compx-lockview", { NULL }, 4308, "udp" }, + { "dserver", { NULL }, 4309, "tcp" }, + { "dserver", { NULL }, 4309, "udp" }, + { "mirrtex", { NULL }, 4310, "tcp" }, + { "mirrtex", { NULL }, 4310, "udp" }, + { "p6ssmc", { NULL }, 4311, "tcp" }, + { "pscl-mgt", { NULL }, 4312, "tcp" }, + { "perrla", { NULL }, 4313, "tcp" }, + { "fdt-rcatp", { NULL }, 4320, "tcp" }, + { "fdt-rcatp", { NULL }, 4320, "udp" }, + { "rwhois", { NULL }, 4321, "tcp" }, + { "rwhois", { NULL }, 4321, "udp" }, + { "trim-event", { NULL }, 4322, "tcp" }, + { "trim-event", { NULL }, 4322, "udp" }, + { "trim-ice", { NULL }, 4323, "tcp" }, + { "trim-ice", { NULL }, 4323, "udp" }, + { "balour", { NULL }, 4324, "tcp" }, + { "balour", { NULL }, 4324, "udp" }, + { "geognosisman", { NULL }, 4325, "tcp" }, + { "geognosisman", { NULL }, 4325, "udp" }, + { "geognosis", { NULL }, 4326, "tcp" }, + { "geognosis", { NULL }, 4326, "udp" }, + { "jaxer-web", { NULL }, 4327, "tcp" }, + { "jaxer-web", { NULL }, 4327, "udp" }, + { "jaxer-manager", { NULL }, 4328, "tcp" }, + { "jaxer-manager", { NULL }, 4328, "udp" }, + { "publiqare-sync", { NULL }, 4329, "tcp" }, + { "gaia", { NULL }, 4340, "tcp" }, + { "gaia", { NULL }, 4340, "udp" }, + { "lisp-data", { NULL }, 4341, "tcp" }, + { "lisp-data", { NULL }, 4341, "udp" }, + { "lisp-cons", { NULL }, 4342, "tcp" }, + { "lisp-control", { NULL }, 4342, "udp" }, + { "unicall", { NULL }, 4343, "tcp" }, + { "unicall", { NULL }, 4343, "udp" }, + { "vinainstall", { NULL }, 4344, "tcp" }, + { "vinainstall", { NULL }, 4344, "udp" }, + { "m4-network-as", { NULL }, 4345, "tcp" }, + { "m4-network-as", { NULL }, 4345, "udp" }, + { "elanlm", { NULL }, 4346, "tcp" }, + { "elanlm", { NULL }, 4346, "udp" }, + { "lansurveyor", { NULL }, 4347, "tcp" }, + { "lansurveyor", { NULL }, 4347, "udp" }, + { "itose", { NULL }, 4348, "tcp" }, + { "itose", { NULL }, 4348, "udp" }, + { "fsportmap", { NULL }, 4349, "tcp" }, + { "fsportmap", { NULL }, 4349, "udp" }, + { "net-device", { NULL }, 4350, "tcp" }, + { "net-device", { NULL }, 4350, "udp" }, + { "plcy-net-svcs", { NULL }, 4351, "tcp" }, + { "plcy-net-svcs", { NULL }, 4351, "udp" }, + { "pjlink", { NULL }, 4352, "tcp" }, + { "pjlink", { NULL }, 4352, "udp" }, + { "f5-iquery", { NULL }, 4353, "tcp" }, + { "f5-iquery", { NULL }, 4353, "udp" }, + { "qsnet-trans", { NULL }, 4354, "tcp" }, + { "qsnet-trans", { NULL }, 4354, "udp" }, + { "qsnet-workst", { NULL }, 4355, "tcp" }, + { "qsnet-workst", { NULL }, 4355, "udp" }, + { "qsnet-assist", { NULL }, 4356, "tcp" }, + { "qsnet-assist", { NULL }, 4356, "udp" }, + { "qsnet-cond", { NULL }, 4357, "tcp" }, + { "qsnet-cond", { NULL }, 4357, "udp" }, + { "qsnet-nucl", { NULL }, 4358, "tcp" }, + { "qsnet-nucl", { NULL }, 4358, "udp" }, + { "omabcastltkm", { NULL }, 4359, "tcp" }, + { "omabcastltkm", { NULL }, 4359, "udp" }, + { "matrix_vnet", { NULL }, 4360, "tcp" }, + { "nacnl", { NULL }, 4361, "udp" }, + { "afore-vdp-disc", { NULL }, 4362, "udp" }, + { "wxbrief", { NULL }, 4368, "tcp" }, + { "wxbrief", { NULL }, 4368, "udp" }, + { "epmd", { NULL }, 4369, "tcp" }, + { "epmd", { NULL }, 4369, "udp" }, + { "elpro_tunnel", { NULL }, 4370, "tcp" }, + { "elpro_tunnel", { NULL }, 4370, "udp" }, + { "l2c-control", { NULL }, 4371, "tcp" }, + { "l2c-disc", { NULL }, 4371, "udp" }, + { "l2c-data", { NULL }, 4372, "tcp" }, + { "l2c-data", { NULL }, 4372, "udp" }, + { "remctl", { NULL }, 4373, "tcp" }, + { "remctl", { NULL }, 4373, "udp" }, + { "psi-ptt", { NULL }, 4374, "tcp" }, + { "tolteces", { NULL }, 4375, "tcp" }, + { "tolteces", { NULL }, 4375, "udp" }, + { "bip", { NULL }, 4376, "tcp" }, + { "bip", { NULL }, 4376, "udp" }, + { "cp-spxsvr", { NULL }, 4377, "tcp" }, + { "cp-spxsvr", { NULL }, 4377, "udp" }, + { "cp-spxdpy", { NULL }, 4378, "tcp" }, + { "cp-spxdpy", { NULL }, 4378, "udp" }, + { "ctdb", { NULL }, 4379, "tcp" }, + { "ctdb", { NULL }, 4379, "udp" }, + { "xandros-cms", { NULL }, 4389, "tcp" }, + { "xandros-cms", { NULL }, 4389, "udp" }, + { "wiegand", { NULL }, 4390, "tcp" }, + { "wiegand", { NULL }, 4390, "udp" }, + { "apwi-imserver", { NULL }, 4391, "tcp" }, + { "apwi-rxserver", { NULL }, 4392, "tcp" }, + { "apwi-rxspooler", { NULL }, 4393, "tcp" }, + { "apwi-disc", { NULL }, 4394, "udp" }, + { "omnivisionesx", { NULL }, 4395, "tcp" }, + { "omnivisionesx", { NULL }, 4395, "udp" }, + { "fly", { NULL }, 4396, "tcp" }, + { "ds-srv", { NULL }, 4400, "tcp" }, + { "ds-srv", { NULL }, 4400, "udp" }, + { "ds-srvr", { NULL }, 4401, "tcp" }, + { "ds-srvr", { NULL }, 4401, "udp" }, + { "ds-clnt", { NULL }, 4402, "tcp" }, + { "ds-clnt", { NULL }, 4402, "udp" }, + { "ds-user", { NULL }, 4403, "tcp" }, + { "ds-user", { NULL }, 4403, "udp" }, + { "ds-admin", { NULL }, 4404, "tcp" }, + { "ds-admin", { NULL }, 4404, "udp" }, + { "ds-mail", { NULL }, 4405, "tcp" }, + { "ds-mail", { NULL }, 4405, "udp" }, + { "ds-slp", { NULL }, 4406, "tcp" }, + { "ds-slp", { NULL }, 4406, "udp" }, + { "nacagent", { NULL }, 4407, "tcp" }, + { "slscc", { NULL }, 4408, "tcp" }, + { "netcabinet-com", { NULL }, 4409, "tcp" }, + { "itwo-server", { NULL }, 4410, "tcp" }, + { "netrockey6", { NULL }, 4425, "tcp" }, + { "netrockey6", { NULL }, 4425, "udp" }, + { "beacon-port-2", { NULL }, 4426, "tcp" }, + { "beacon-port-2", { NULL }, 4426, "udp" }, + { "drizzle", { NULL }, 4427, "tcp" }, + { "omviserver", { NULL }, 4428, "tcp" }, + { "omviagent", { NULL }, 4429, "tcp" }, + { "rsqlserver", { NULL }, 4430, "tcp" }, + { "rsqlserver", { NULL }, 4430, "udp" }, + { "wspipe", { NULL }, 4431, "tcp" }, + { "netblox", { NULL }, 4441, "udp" }, + { "saris", { NULL }, 4442, "tcp" }, + { "saris", { NULL }, 4442, "udp" }, + { "pharos", { NULL }, 4443, "tcp" }, + { "pharos", { NULL }, 4443, "udp" }, + { "krb524", { NULL }, 4444, "tcp" }, + { "krb524", { NULL }, 4444, "udp" }, + { "nv-video", { NULL }, 4444, "tcp" }, + { "nv-video", { NULL }, 4444, "udp" }, + { "upnotifyp", { NULL }, 4445, "tcp" }, + { "upnotifyp", { NULL }, 4445, "udp" }, + { "n1-fwp", { NULL }, 4446, "tcp" }, + { "n1-fwp", { NULL }, 4446, "udp" }, + { "n1-rmgmt", { NULL }, 4447, "tcp" }, + { "n1-rmgmt", { NULL }, 4447, "udp" }, + { "asc-slmd", { NULL }, 4448, "tcp" }, + { "asc-slmd", { NULL }, 4448, "udp" }, + { "privatewire", { NULL }, 4449, "tcp" }, + { "privatewire", { NULL }, 4449, "udp" }, + { "camp", { NULL }, 4450, "tcp" }, + { "camp", { NULL }, 4450, "udp" }, + { "ctisystemmsg", { NULL }, 4451, "tcp" }, + { "ctisystemmsg", { NULL }, 4451, "udp" }, + { "ctiprogramload", { NULL }, 4452, "tcp" }, + { "ctiprogramload", { NULL }, 4452, "udp" }, + { "nssalertmgr", { NULL }, 4453, "tcp" }, + { "nssalertmgr", { NULL }, 4453, "udp" }, + { "nssagentmgr", { NULL }, 4454, "tcp" }, + { "nssagentmgr", { NULL }, 4454, "udp" }, + { "prchat-user", { NULL }, 4455, "tcp" }, + { "prchat-user", { NULL }, 4455, "udp" }, + { "prchat-server", { NULL }, 4456, "tcp" }, + { "prchat-server", { NULL }, 4456, "udp" }, + { "prRegister", { NULL }, 4457, "tcp" }, + { "prRegister", { NULL }, 4457, "udp" }, + { "mcp", { NULL }, 4458, "tcp" }, + { "mcp", { NULL }, 4458, "udp" }, + { "hpssmgmt", { NULL }, 4484, "tcp" }, + { "hpssmgmt", { NULL }, 4484, "udp" }, + { "assyst-dr", { NULL }, 4485, "tcp" }, + { "icms", { NULL }, 4486, "tcp" }, + { "icms", { NULL }, 4486, "udp" }, + { "prex-tcp", { NULL }, 4487, "tcp" }, + { "awacs-ice", { NULL }, 4488, "tcp" }, + { "awacs-ice", { NULL }, 4488, "udp" }, + { "ipsec-nat-t", { NULL }, 4500, "tcp" }, + { "ipsec-nat-t", { NULL }, 4500, "udp" }, + { "ehs", { NULL }, 4535, "tcp" }, + { "ehs", { NULL }, 4535, "udp" }, + { "ehs-ssl", { NULL }, 4536, "tcp" }, + { "ehs-ssl", { NULL }, 4536, "udp" }, + { "wssauthsvc", { NULL }, 4537, "tcp" }, + { "wssauthsvc", { NULL }, 4537, "udp" }, + { "swx-gate", { NULL }, 4538, "tcp" }, + { "swx-gate", { NULL }, 4538, "udp" }, + { "worldscores", { NULL }, 4545, "tcp" }, + { "worldscores", { NULL }, 4545, "udp" }, + { "sf-lm", { NULL }, 4546, "tcp" }, + { "sf-lm", { NULL }, 4546, "udp" }, + { "lanner-lm", { NULL }, 4547, "tcp" }, + { "lanner-lm", { NULL }, 4547, "udp" }, + { "synchromesh", { NULL }, 4548, "tcp" }, + { "synchromesh", { NULL }, 4548, "udp" }, + { "aegate", { NULL }, 4549, "tcp" }, + { "aegate", { NULL }, 4549, "udp" }, + { "gds-adppiw-db", { NULL }, 4550, "tcp" }, + { "gds-adppiw-db", { NULL }, 4550, "udp" }, + { "ieee-mih", { NULL }, 4551, "tcp" }, + { "ieee-mih", { NULL }, 4551, "udp" }, + { "menandmice-mon", { NULL }, 4552, "tcp" }, + { "menandmice-mon", { NULL }, 4552, "udp" }, + { "icshostsvc", { NULL }, 4553, "tcp" }, + { "msfrs", { NULL }, 4554, "tcp" }, + { "msfrs", { NULL }, 4554, "udp" }, + { "rsip", { NULL }, 4555, "tcp" }, + { "rsip", { NULL }, 4555, "udp" }, + { "dtn-bundle-tcp", { NULL }, 4556, "tcp" }, + { "dtn-bundle-udp", { NULL }, 4556, "udp" }, + { "mtcevrunqss", { NULL }, 4557, "udp" }, + { "mtcevrunqman", { NULL }, 4558, "udp" }, + { "hylafax", { NULL }, 4559, "tcp" }, + { "hylafax", { NULL }, 4559, "udp" }, + { "kwtc", { NULL }, 4566, "tcp" }, + { "kwtc", { NULL }, 4566, "udp" }, + { "tram", { NULL }, 4567, "tcp" }, + { "tram", { NULL }, 4567, "udp" }, + { "bmc-reporting", { NULL }, 4568, "tcp" }, + { "bmc-reporting", { NULL }, 4568, "udp" }, + { "iax", { NULL }, 4569, "tcp" }, + { "iax", { NULL }, 4569, "udp" }, + { "rid", { NULL }, 4590, "tcp" }, + { "l3t-at-an", { NULL }, 4591, "tcp" }, + { "l3t-at-an", { NULL }, 4591, "udp" }, + { "hrpd-ith-at-an", { NULL }, 4592, "udp" }, + { "ipt-anri-anri", { NULL }, 4593, "tcp" }, + { "ipt-anri-anri", { NULL }, 4593, "udp" }, + { "ias-session", { NULL }, 4594, "tcp" }, + { "ias-session", { NULL }, 4594, "udp" }, + { "ias-paging", { NULL }, 4595, "tcp" }, + { "ias-paging", { NULL }, 4595, "udp" }, + { "ias-neighbor", { NULL }, 4596, "tcp" }, + { "ias-neighbor", { NULL }, 4596, "udp" }, + { "a21-an-1xbs", { NULL }, 4597, "tcp" }, + { "a21-an-1xbs", { NULL }, 4597, "udp" }, + { "a16-an-an", { NULL }, 4598, "tcp" }, + { "a16-an-an", { NULL }, 4598, "udp" }, + { "a17-an-an", { NULL }, 4599, "tcp" }, + { "a17-an-an", { NULL }, 4599, "udp" }, + { "piranha1", { NULL }, 4600, "tcp" }, + { "piranha1", { NULL }, 4600, "udp" }, + { "piranha2", { NULL }, 4601, "tcp" }, + { "piranha2", { NULL }, 4601, "udp" }, + { "mtsserver", { NULL }, 4602, "tcp" }, + { "menandmice-upg", { NULL }, 4603, "tcp" }, + { "playsta2-app", { NULL }, 4658, "tcp" }, + { "playsta2-app", { NULL }, 4658, "udp" }, + { "playsta2-lob", { NULL }, 4659, "tcp" }, + { "playsta2-lob", { NULL }, 4659, "udp" }, + { "smaclmgr", { NULL }, 4660, "tcp" }, + { "smaclmgr", { NULL }, 4660, "udp" }, + { "kar2ouche", { NULL }, 4661, "tcp" }, + { "kar2ouche", { NULL }, 4661, "udp" }, + { "oms", { NULL }, 4662, "tcp" }, + { "oms", { NULL }, 4662, "udp" }, + { "noteit", { NULL }, 4663, "tcp" }, + { "noteit", { NULL }, 4663, "udp" }, + { "ems", { NULL }, 4664, "tcp" }, + { "ems", { NULL }, 4664, "udp" }, + { "contclientms", { NULL }, 4665, "tcp" }, + { "contclientms", { NULL }, 4665, "udp" }, + { "eportcomm", { NULL }, 4666, "tcp" }, + { "eportcomm", { NULL }, 4666, "udp" }, + { "mmacomm", { NULL }, 4667, "tcp" }, + { "mmacomm", { NULL }, 4667, "udp" }, + { "mmaeds", { NULL }, 4668, "tcp" }, + { "mmaeds", { NULL }, 4668, "udp" }, + { "eportcommdata", { NULL }, 4669, "tcp" }, + { "eportcommdata", { NULL }, 4669, "udp" }, + { "light", { NULL }, 4670, "tcp" }, + { "light", { NULL }, 4670, "udp" }, + { "acter", { NULL }, 4671, "tcp" }, + { "acter", { NULL }, 4671, "udp" }, + { "rfa", { NULL }, 4672, "tcp" }, + { "rfa", { NULL }, 4672, "udp" }, + { "cxws", { NULL }, 4673, "tcp" }, + { "cxws", { NULL }, 4673, "udp" }, + { "appiq-mgmt", { NULL }, 4674, "tcp" }, + { "appiq-mgmt", { NULL }, 4674, "udp" }, + { "dhct-status", { NULL }, 4675, "tcp" }, + { "dhct-status", { NULL }, 4675, "udp" }, + { "dhct-alerts", { NULL }, 4676, "tcp" }, + { "dhct-alerts", { NULL }, 4676, "udp" }, + { "bcs", { NULL }, 4677, "tcp" }, + { "bcs", { NULL }, 4677, "udp" }, + { "traversal", { NULL }, 4678, "tcp" }, + { "traversal", { NULL }, 4678, "udp" }, + { "mgesupervision", { NULL }, 4679, "tcp" }, + { "mgesupervision", { NULL }, 4679, "udp" }, + { "mgemanagement", { NULL }, 4680, "tcp" }, + { "mgemanagement", { NULL }, 4680, "udp" }, + { "parliant", { NULL }, 4681, "tcp" }, + { "parliant", { NULL }, 4681, "udp" }, + { "finisar", { NULL }, 4682, "tcp" }, + { "finisar", { NULL }, 4682, "udp" }, + { "spike", { NULL }, 4683, "tcp" }, + { "spike", { NULL }, 4683, "udp" }, + { "rfid-rp1", { NULL }, 4684, "tcp" }, + { "rfid-rp1", { NULL }, 4684, "udp" }, + { "autopac", { NULL }, 4685, "tcp" }, + { "autopac", { NULL }, 4685, "udp" }, + { "msp-os", { NULL }, 4686, "tcp" }, + { "msp-os", { NULL }, 4686, "udp" }, + { "nst", { NULL }, 4687, "tcp" }, + { "nst", { NULL }, 4687, "udp" }, + { "mobile-p2p", { NULL }, 4688, "tcp" }, + { "mobile-p2p", { NULL }, 4688, "udp" }, + { "altovacentral", { NULL }, 4689, "tcp" }, + { "altovacentral", { NULL }, 4689, "udp" }, + { "prelude", { NULL }, 4690, "tcp" }, + { "prelude", { NULL }, 4690, "udp" }, + { "mtn", { NULL }, 4691, "tcp" }, + { "mtn", { NULL }, 4691, "udp" }, + { "conspiracy", { NULL }, 4692, "tcp" }, + { "conspiracy", { NULL }, 4692, "udp" }, + { "netxms-agent", { NULL }, 4700, "tcp" }, + { "netxms-agent", { NULL }, 4700, "udp" }, + { "netxms-mgmt", { NULL }, 4701, "tcp" }, + { "netxms-mgmt", { NULL }, 4701, "udp" }, + { "netxms-sync", { NULL }, 4702, "tcp" }, + { "netxms-sync", { NULL }, 4702, "udp" }, + { "npqes-test", { NULL }, 4703, "tcp" }, + { "assuria-ins", { NULL }, 4704, "tcp" }, + { "truckstar", { NULL }, 4725, "tcp" }, + { "truckstar", { NULL }, 4725, "udp" }, + { "a26-fap-fgw", { NULL }, 4726, "udp" }, + { "fcis", { NULL }, 4727, "tcp" }, + { "fcis-disc", { NULL }, 4727, "udp" }, + { "capmux", { NULL }, 4728, "tcp" }, + { "capmux", { NULL }, 4728, "udp" }, + { "gsmtap", { NULL }, 4729, "udp" }, + { "gearman", { NULL }, 4730, "tcp" }, + { "gearman", { NULL }, 4730, "udp" }, + { "remcap", { NULL }, 4731, "tcp" }, + { "ohmtrigger", { NULL }, 4732, "udp" }, + { "resorcs", { NULL }, 4733, "tcp" }, + { "ipdr-sp", { NULL }, 4737, "tcp" }, + { "ipdr-sp", { NULL }, 4737, "udp" }, + { "solera-lpn", { NULL }, 4738, "tcp" }, + { "solera-lpn", { NULL }, 4738, "udp" }, + { "ipfix", { NULL }, 4739, "tcp" }, + { "ipfix", { NULL }, 4739, "udp" }, + { "ipfix", { NULL }, 4739, "sctp"}, + { "ipfixs", { NULL }, 4740, "tcp" }, + { "ipfixs", { NULL }, 4740, "sctp"}, + { "ipfixs", { NULL }, 4740, "udp" }, + { "lumimgrd", { NULL }, 4741, "tcp" }, + { "lumimgrd", { NULL }, 4741, "udp" }, + { "sicct", { NULL }, 4742, "tcp" }, + { "sicct-sdp", { NULL }, 4742, "udp" }, + { "openhpid", { NULL }, 4743, "tcp" }, + { "openhpid", { NULL }, 4743, "udp" }, + { "ifsp", { NULL }, 4744, "tcp" }, + { "ifsp", { NULL }, 4744, "udp" }, + { "fmp", { NULL }, 4745, "tcp" }, + { "fmp", { NULL }, 4745, "udp" }, + { "profilemac", { NULL }, 4749, "tcp" }, + { "profilemac", { NULL }, 4749, "udp" }, + { "ssad", { NULL }, 4750, "tcp" }, + { "ssad", { NULL }, 4750, "udp" }, + { "spocp", { NULL }, 4751, "tcp" }, + { "spocp", { NULL }, 4751, "udp" }, + { "snap", { NULL }, 4752, "tcp" }, + { "snap", { NULL }, 4752, "udp" }, + { "bfd-multi-ctl", { NULL }, 4784, "tcp" }, + { "bfd-multi-ctl", { NULL }, 4784, "udp" }, + { "cncp", { NULL }, 4785, "udp" }, + { "smart-install", { NULL }, 4786, "tcp" }, + { "sia-ctrl-plane", { NULL }, 4787, "tcp" }, + { "iims", { NULL }, 4800, "tcp" }, + { "iims", { NULL }, 4800, "udp" }, + { "iwec", { NULL }, 4801, "tcp" }, + { "iwec", { NULL }, 4801, "udp" }, + { "ilss", { NULL }, 4802, "tcp" }, + { "ilss", { NULL }, 4802, "udp" }, + { "notateit", { NULL }, 4803, "tcp" }, + { "notateit-disc", { NULL }, 4803, "udp" }, + { "aja-ntv4-disc", { NULL }, 4804, "udp" }, + { "htcp", { NULL }, 4827, "tcp" }, + { "htcp", { NULL }, 4827, "udp" }, + { "varadero-0", { NULL }, 4837, "tcp" }, + { "varadero-0", { NULL }, 4837, "udp" }, + { "varadero-1", { NULL }, 4838, "tcp" }, + { "varadero-1", { NULL }, 4838, "udp" }, + { "varadero-2", { NULL }, 4839, "tcp" }, + { "varadero-2", { NULL }, 4839, "udp" }, + { "opcua-tcp", { NULL }, 4840, "tcp" }, + { "opcua-udp", { NULL }, 4840, "udp" }, + { "quosa", { NULL }, 4841, "tcp" }, + { "quosa", { NULL }, 4841, "udp" }, + { "gw-asv", { NULL }, 4842, "tcp" }, + { "gw-asv", { NULL }, 4842, "udp" }, + { "opcua-tls", { NULL }, 4843, "tcp" }, + { "opcua-tls", { NULL }, 4843, "udp" }, + { "gw-log", { NULL }, 4844, "tcp" }, + { "gw-log", { NULL }, 4844, "udp" }, + { "wcr-remlib", { NULL }, 4845, "tcp" }, + { "wcr-remlib", { NULL }, 4845, "udp" }, + { "contamac_icm", { NULL }, 4846, "tcp" }, + { "contamac_icm", { NULL }, 4846, "udp" }, + { "wfc", { NULL }, 4847, "tcp" }, + { "wfc", { NULL }, 4847, "udp" }, + { "appserv-http", { NULL }, 4848, "tcp" }, + { "appserv-http", { NULL }, 4848, "udp" }, + { "appserv-https", { NULL }, 4849, "tcp" }, + { "appserv-https", { NULL }, 4849, "udp" }, + { "sun-as-nodeagt", { NULL }, 4850, "tcp" }, + { "sun-as-nodeagt", { NULL }, 4850, "udp" }, + { "derby-repli", { NULL }, 4851, "tcp" }, + { "derby-repli", { NULL }, 4851, "udp" }, + { "unify-debug", { NULL }, 4867, "tcp" }, + { "unify-debug", { NULL }, 4867, "udp" }, + { "phrelay", { NULL }, 4868, "tcp" }, + { "phrelay", { NULL }, 4868, "udp" }, + { "phrelaydbg", { NULL }, 4869, "tcp" }, + { "phrelaydbg", { NULL }, 4869, "udp" }, + { "cc-tracking", { NULL }, 4870, "tcp" }, + { "cc-tracking", { NULL }, 4870, "udp" }, + { "wired", { NULL }, 4871, "tcp" }, + { "wired", { NULL }, 4871, "udp" }, + { "tritium-can", { NULL }, 4876, "tcp" }, + { "tritium-can", { NULL }, 4876, "udp" }, + { "lmcs", { NULL }, 4877, "tcp" }, + { "lmcs", { NULL }, 4877, "udp" }, + { "inst-discovery", { NULL }, 4878, "udp" }, + { "wsdl-event", { NULL }, 4879, "tcp" }, + { "hislip", { NULL }, 4880, "tcp" }, + { "socp-t", { NULL }, 4881, "udp" }, + { "socp-c", { NULL }, 4882, "udp" }, + { "wmlserver", { NULL }, 4883, "tcp" }, + { "hivestor", { NULL }, 4884, "tcp" }, + { "hivestor", { NULL }, 4884, "udp" }, + { "abbs", { NULL }, 4885, "tcp" }, + { "abbs", { NULL }, 4885, "udp" }, + { "lyskom", { NULL }, 4894, "tcp" }, + { "lyskom", { NULL }, 4894, "udp" }, + { "radmin-port", { NULL }, 4899, "tcp" }, + { "radmin-port", { NULL }, 4899, "udp" }, + { "hfcs", { NULL }, 4900, "tcp" }, + { "hfcs", { NULL }, 4900, "udp" }, + { "flr_agent", { NULL }, 4901, "tcp" }, + { "magiccontrol", { NULL }, 4902, "tcp" }, + { "lutap", { NULL }, 4912, "tcp" }, + { "lutcp", { NULL }, 4913, "tcp" }, + { "bones", { NULL }, 4914, "tcp" }, + { "bones", { NULL }, 4914, "udp" }, + { "frcs", { NULL }, 4915, "tcp" }, + { "atsc-mh-ssc", { NULL }, 4937, "udp" }, + { "eq-office-4940", { NULL }, 4940, "tcp" }, + { "eq-office-4940", { NULL }, 4940, "udp" }, + { "eq-office-4941", { NULL }, 4941, "tcp" }, + { "eq-office-4941", { NULL }, 4941, "udp" }, + { "eq-office-4942", { NULL }, 4942, "tcp" }, + { "eq-office-4942", { NULL }, 4942, "udp" }, + { "munin", { NULL }, 4949, "tcp" }, + { "munin", { NULL }, 4949, "udp" }, + { "sybasesrvmon", { NULL }, 4950, "tcp" }, + { "sybasesrvmon", { NULL }, 4950, "udp" }, + { "pwgwims", { NULL }, 4951, "tcp" }, + { "pwgwims", { NULL }, 4951, "udp" }, + { "sagxtsds", { NULL }, 4952, "tcp" }, + { "sagxtsds", { NULL }, 4952, "udp" }, + { "dbsyncarbiter", { NULL }, 4953, "tcp" }, + { "ccss-qmm", { NULL }, 4969, "tcp" }, + { "ccss-qmm", { NULL }, 4969, "udp" }, + { "ccss-qsm", { NULL }, 4970, "tcp" }, + { "ccss-qsm", { NULL }, 4970, "udp" }, + { "webyast", { NULL }, 4984, "tcp" }, + { "gerhcs", { NULL }, 4985, "tcp" }, + { "mrip", { NULL }, 4986, "tcp" }, + { "mrip", { NULL }, 4986, "udp" }, + { "smar-se-port1", { NULL }, 4987, "tcp" }, + { "smar-se-port1", { NULL }, 4987, "udp" }, + { "smar-se-port2", { NULL }, 4988, "tcp" }, + { "smar-se-port2", { NULL }, 4988, "udp" }, + { "parallel", { NULL }, 4989, "tcp" }, + { "parallel", { NULL }, 4989, "udp" }, + { "busycal", { NULL }, 4990, "tcp" }, + { "busycal", { NULL }, 4990, "udp" }, + { "vrt", { NULL }, 4991, "tcp" }, + { "vrt", { NULL }, 4991, "udp" }, + { "hfcs-manager", { NULL }, 4999, "tcp" }, + { "hfcs-manager", { NULL }, 4999, "udp" }, + { "commplex-main", { NULL }, 5000, "tcp" }, + { "commplex-main", { NULL }, 5000, "udp" }, + { "commplex-link", { NULL }, 5001, "tcp" }, + { "commplex-link", { NULL }, 5001, "udp" }, + { "rfe", { NULL }, 5002, "tcp" }, + { "rfe", { NULL }, 5002, "udp" }, + { "fmpro-internal", { NULL }, 5003, "tcp" }, + { "fmpro-internal", { NULL }, 5003, "udp" }, + { "avt-profile-1", { NULL }, 5004, "tcp" }, + { "avt-profile-1", { NULL }, 5004, "udp" }, + { "avt-profile-1", { NULL }, 5004, "dccp"}, + { "avt-profile-2", { NULL }, 5005, "tcp" }, + { "avt-profile-2", { NULL }, 5005, "udp" }, + { "avt-profile-2", { NULL }, 5005, "dccp"}, + { "wsm-server", { NULL }, 5006, "tcp" }, + { "wsm-server", { NULL }, 5006, "udp" }, + { "wsm-server-ssl", { NULL }, 5007, "tcp" }, + { "wsm-server-ssl", { NULL }, 5007, "udp" }, + { "synapsis-edge", { NULL }, 5008, "tcp" }, + { "synapsis-edge", { NULL }, 5008, "udp" }, + { "winfs", { NULL }, 5009, "tcp" }, + { "winfs", { NULL }, 5009, "udp" }, + { "telelpathstart", { NULL }, 5010, "tcp" }, + { "telelpathstart", { NULL }, 5010, "udp" }, + { "telelpathattack", { NULL }, 5011, "tcp" }, + { "telelpathattack", { NULL }, 5011, "udp" }, + { "nsp", { NULL }, 5012, "tcp" }, + { "nsp", { NULL }, 5012, "udp" }, + { "fmpro-v6", { NULL }, 5013, "tcp" }, + { "fmpro-v6", { NULL }, 5013, "udp" }, + { "onpsocket", { NULL }, 5014, "udp" }, + { "fmwp", { NULL }, 5015, "tcp" }, + { "zenginkyo-1", { NULL }, 5020, "tcp" }, + { "zenginkyo-1", { NULL }, 5020, "udp" }, + { "zenginkyo-2", { NULL }, 5021, "tcp" }, + { "zenginkyo-2", { NULL }, 5021, "udp" }, + { "mice", { NULL }, 5022, "tcp" }, + { "mice", { NULL }, 5022, "udp" }, + { "htuilsrv", { NULL }, 5023, "tcp" }, + { "htuilsrv", { NULL }, 5023, "udp" }, + { "scpi-telnet", { NULL }, 5024, "tcp" }, + { "scpi-telnet", { NULL }, 5024, "udp" }, + { "scpi-raw", { NULL }, 5025, "tcp" }, + { "scpi-raw", { NULL }, 5025, "udp" }, + { "strexec-d", { NULL }, 5026, "tcp" }, + { "strexec-d", { NULL }, 5026, "udp" }, + { "strexec-s", { NULL }, 5027, "tcp" }, + { "strexec-s", { NULL }, 5027, "udp" }, + { "qvr", { NULL }, 5028, "tcp" }, + { "infobright", { NULL }, 5029, "tcp" }, + { "infobright", { NULL }, 5029, "udp" }, + { "surfpass", { NULL }, 5030, "tcp" }, + { "surfpass", { NULL }, 5030, "udp" }, + { "dmp", { NULL }, 5031, "udp" }, + { "asnaacceler8db", { NULL }, 5042, "tcp" }, + { "asnaacceler8db", { NULL }, 5042, "udp" }, + { "swxadmin", { NULL }, 5043, "tcp" }, + { "swxadmin", { NULL }, 5043, "udp" }, + { "lxi-evntsvc", { NULL }, 5044, "tcp" }, + { "lxi-evntsvc", { NULL }, 5044, "udp" }, + { "osp", { NULL }, 5045, "tcp" }, + { "vpm-udp", { NULL }, 5046, "udp" }, + { "iscape", { NULL }, 5047, "udp" }, + { "texai", { NULL }, 5048, "tcp" }, + { "ivocalize", { NULL }, 5049, "tcp" }, + { "ivocalize", { NULL }, 5049, "udp" }, + { "mmcc", { NULL }, 5050, "tcp" }, + { "mmcc", { NULL }, 5050, "udp" }, + { "ita-agent", { NULL }, 5051, "tcp" }, + { "ita-agent", { NULL }, 5051, "udp" }, + { "ita-manager", { NULL }, 5052, "tcp" }, + { "ita-manager", { NULL }, 5052, "udp" }, + { "rlm", { NULL }, 5053, "tcp" }, + { "rlm-admin", { NULL }, 5054, "tcp" }, + { "unot", { NULL }, 5055, "tcp" }, + { "unot", { NULL }, 5055, "udp" }, + { "intecom-ps1", { NULL }, 5056, "tcp" }, + { "intecom-ps1", { NULL }, 5056, "udp" }, + { "intecom-ps2", { NULL }, 5057, "tcp" }, + { "intecom-ps2", { NULL }, 5057, "udp" }, + { "locus-disc", { NULL }, 5058, "udp" }, + { "sds", { NULL }, 5059, "tcp" }, + { "sds", { NULL }, 5059, "udp" }, + { "sip", { NULL }, 5060, "tcp" }, + { "sip", { NULL }, 5060, "udp" }, + { "sip-tls", { NULL }, 5061, "tcp" }, + { "sip-tls", { NULL }, 5061, "udp" }, + { "na-localise", { NULL }, 5062, "tcp" }, + { "na-localise", { NULL }, 5062, "udp" }, + { "csrpc", { NULL }, 5063, "tcp" }, + { "ca-1", { NULL }, 5064, "tcp" }, + { "ca-1", { NULL }, 5064, "udp" }, + { "ca-2", { NULL }, 5065, "tcp" }, + { "ca-2", { NULL }, 5065, "udp" }, + { "stanag-5066", { NULL }, 5066, "tcp" }, + { "stanag-5066", { NULL }, 5066, "udp" }, + { "authentx", { NULL }, 5067, "tcp" }, + { "authentx", { NULL }, 5067, "udp" }, + { "bitforestsrv", { NULL }, 5068, "tcp" }, + { "i-net-2000-npr", { NULL }, 5069, "tcp" }, + { "i-net-2000-npr", { NULL }, 5069, "udp" }, + { "vtsas", { NULL }, 5070, "tcp" }, + { "vtsas", { NULL }, 5070, "udp" }, + { "powerschool", { NULL }, 5071, "tcp" }, + { "powerschool", { NULL }, 5071, "udp" }, + { "ayiya", { NULL }, 5072, "tcp" }, + { "ayiya", { NULL }, 5072, "udp" }, + { "tag-pm", { NULL }, 5073, "tcp" }, + { "tag-pm", { NULL }, 5073, "udp" }, + { "alesquery", { NULL }, 5074, "tcp" }, + { "alesquery", { NULL }, 5074, "udp" }, + { "cp-spxrpts", { NULL }, 5079, "udp" }, + { "onscreen", { NULL }, 5080, "tcp" }, + { "onscreen", { NULL }, 5080, "udp" }, + { "sdl-ets", { NULL }, 5081, "tcp" }, + { "sdl-ets", { NULL }, 5081, "udp" }, + { "qcp", { NULL }, 5082, "tcp" }, + { "qcp", { NULL }, 5082, "udp" }, + { "qfp", { NULL }, 5083, "tcp" }, + { "qfp", { NULL }, 5083, "udp" }, + { "llrp", { NULL }, 5084, "tcp" }, + { "llrp", { NULL }, 5084, "udp" }, + { "encrypted-llrp", { NULL }, 5085, "tcp" }, + { "encrypted-llrp", { NULL }, 5085, "udp" }, + { "aprigo-cs", { NULL }, 5086, "tcp" }, + { "car", { NULL }, 5090, "sctp"}, + { "cxtp", { NULL }, 5091, "sctp"}, + { "magpie", { NULL }, 5092, "udp" }, + { "sentinel-lm", { NULL }, 5093, "tcp" }, + { "sentinel-lm", { NULL }, 5093, "udp" }, + { "hart-ip", { NULL }, 5094, "tcp" }, + { "hart-ip", { NULL }, 5094, "udp" }, + { "sentlm-srv2srv", { NULL }, 5099, "tcp" }, + { "sentlm-srv2srv", { NULL }, 5099, "udp" }, + { "socalia", { NULL }, 5100, "tcp" }, + { "socalia", { NULL }, 5100, "udp" }, + { "talarian-tcp", { NULL }, 5101, "tcp" }, + { "talarian-udp", { NULL }, 5101, "udp" }, + { "oms-nonsecure", { NULL }, 5102, "tcp" }, + { "oms-nonsecure", { NULL }, 5102, "udp" }, + { "actifio-c2c", { NULL }, 5103, "tcp" }, + { "tinymessage", { NULL }, 5104, "udp" }, + { "hughes-ap", { NULL }, 5105, "udp" }, + { "taep-as-svc", { NULL }, 5111, "tcp" }, + { "taep-as-svc", { NULL }, 5111, "udp" }, + { "pm-cmdsvr", { NULL }, 5112, "tcp" }, + { "pm-cmdsvr", { NULL }, 5112, "udp" }, + { "ev-services", { NULL }, 5114, "tcp" }, + { "autobuild", { NULL }, 5115, "tcp" }, + { "emb-proj-cmd", { NULL }, 5116, "udp" }, + { "gradecam", { NULL }, 5117, "tcp" }, + { "nbt-pc", { NULL }, 5133, "tcp" }, + { "nbt-pc", { NULL }, 5133, "udp" }, + { "ppactivation", { NULL }, 5134, "tcp" }, + { "erp-scale", { NULL }, 5135, "tcp" }, + { "minotaur-sa", { NULL }, 5136, "udp" }, + { "ctsd", { NULL }, 5137, "tcp" }, + { "ctsd", { NULL }, 5137, "udp" }, + { "rmonitor_secure", { NULL }, 5145, "tcp" }, + { "rmonitor_secure", { NULL }, 5145, "udp" }, + { "social-alarm", { NULL }, 5146, "tcp" }, + { "atmp", { NULL }, 5150, "tcp" }, + { "atmp", { NULL }, 5150, "udp" }, + { "esri_sde", { NULL }, 5151, "tcp" }, + { "esri_sde", { NULL }, 5151, "udp" }, + { "sde-discovery", { NULL }, 5152, "tcp" }, + { "sde-discovery", { NULL }, 5152, "udp" }, + { "toruxserver", { NULL }, 5153, "tcp" }, + { "bzflag", { NULL }, 5154, "tcp" }, + { "bzflag", { NULL }, 5154, "udp" }, + { "asctrl-agent", { NULL }, 5155, "tcp" }, + { "asctrl-agent", { NULL }, 5155, "udp" }, + { "rugameonline", { NULL }, 5156, "tcp" }, + { "mediat", { NULL }, 5157, "tcp" }, + { "snmpssh", { NULL }, 5161, "tcp" }, + { "snmpssh-trap", { NULL }, 5162, "tcp" }, + { "sbackup", { NULL }, 5163, "tcp" }, + { "vpa", { NULL }, 5164, "tcp" }, + { "vpa-disc", { NULL }, 5164, "udp" }, + { "ife_icorp", { NULL }, 5165, "tcp" }, + { "ife_icorp", { NULL }, 5165, "udp" }, + { "winpcs", { NULL }, 5166, "tcp" }, + { "winpcs", { NULL }, 5166, "udp" }, + { "scte104", { NULL }, 5167, "tcp" }, + { "scte104", { NULL }, 5167, "udp" }, + { "scte30", { NULL }, 5168, "tcp" }, + { "scte30", { NULL }, 5168, "udp" }, + { "aol", { NULL }, 5190, "tcp" }, + { "aol", { NULL }, 5190, "udp" }, + { "aol-1", { NULL }, 5191, "tcp" }, + { "aol-1", { NULL }, 5191, "udp" }, + { "aol-2", { NULL }, 5192, "tcp" }, + { "aol-2", { NULL }, 5192, "udp" }, + { "aol-3", { NULL }, 5193, "tcp" }, + { "aol-3", { NULL }, 5193, "udp" }, + { "cpscomm", { NULL }, 5194, "tcp" }, + { "targus-getdata", { NULL }, 5200, "tcp" }, + { "targus-getdata", { NULL }, 5200, "udp" }, + { "targus-getdata1", { NULL }, 5201, "tcp" }, + { "targus-getdata1", { NULL }, 5201, "udp" }, + { "targus-getdata2", { NULL }, 5202, "tcp" }, + { "targus-getdata2", { NULL }, 5202, "udp" }, + { "targus-getdata3", { NULL }, 5203, "tcp" }, + { "targus-getdata3", { NULL }, 5203, "udp" }, + { "3exmp", { NULL }, 5221, "tcp" }, + { "xmpp-client", { NULL }, 5222, "tcp" }, + { "hpvirtgrp", { NULL }, 5223, "tcp" }, + { "hpvirtgrp", { NULL }, 5223, "udp" }, + { "hpvirtctrl", { NULL }, 5224, "tcp" }, + { "hpvirtctrl", { NULL }, 5224, "udp" }, + { "hp-server", { NULL }, 5225, "tcp" }, + { "hp-server", { NULL }, 5225, "udp" }, + { "hp-status", { NULL }, 5226, "tcp" }, + { "hp-status", { NULL }, 5226, "udp" }, + { "perfd", { NULL }, 5227, "tcp" }, + { "perfd", { NULL }, 5227, "udp" }, + { "hpvroom", { NULL }, 5228, "tcp" }, + { "csedaemon", { NULL }, 5232, "tcp" }, + { "enfs", { NULL }, 5233, "tcp" }, + { "eenet", { NULL }, 5234, "tcp" }, + { "eenet", { NULL }, 5234, "udp" }, + { "galaxy-network", { NULL }, 5235, "tcp" }, + { "galaxy-network", { NULL }, 5235, "udp" }, + { "padl2sim", { NULL }, 5236, "tcp" }, + { "padl2sim", { NULL }, 5236, "udp" }, + { "mnet-discovery", { NULL }, 5237, "tcp" }, + { "mnet-discovery", { NULL }, 5237, "udp" }, + { "downtools", { NULL }, 5245, "tcp" }, + { "downtools-disc", { NULL }, 5245, "udp" }, + { "capwap-control", { NULL }, 5246, "udp" }, + { "capwap-data", { NULL }, 5247, "udp" }, + { "caacws", { NULL }, 5248, "tcp" }, + { "caacws", { NULL }, 5248, "udp" }, + { "caaclang2", { NULL }, 5249, "tcp" }, + { "caaclang2", { NULL }, 5249, "udp" }, + { "soagateway", { NULL }, 5250, "tcp" }, + { "soagateway", { NULL }, 5250, "udp" }, + { "caevms", { NULL }, 5251, "tcp" }, + { "caevms", { NULL }, 5251, "udp" }, + { "movaz-ssc", { NULL }, 5252, "tcp" }, + { "movaz-ssc", { NULL }, 5252, "udp" }, + { "kpdp", { NULL }, 5253, "tcp" }, + { "3com-njack-1", { NULL }, 5264, "tcp" }, + { "3com-njack-1", { NULL }, 5264, "udp" }, + { "3com-njack-2", { NULL }, 5265, "tcp" }, + { "3com-njack-2", { NULL }, 5265, "udp" }, + { "xmpp-server", { NULL }, 5269, "tcp" }, + { "xmp", { NULL }, 5270, "tcp" }, + { "xmp", { NULL }, 5270, "udp" }, + { "cuelink", { NULL }, 5271, "tcp" }, + { "cuelink-disc", { NULL }, 5271, "udp" }, + { "pk", { NULL }, 5272, "tcp" }, + { "pk", { NULL }, 5272, "udp" }, + { "xmpp-bosh", { NULL }, 5280, "tcp" }, + { "undo-lm", { NULL }, 5281, "tcp" }, + { "transmit-port", { NULL }, 5282, "tcp" }, + { "transmit-port", { NULL }, 5282, "udp" }, + { "presence", { NULL }, 5298, "tcp" }, + { "presence", { NULL }, 5298, "udp" }, + { "nlg-data", { NULL }, 5299, "tcp" }, + { "nlg-data", { NULL }, 5299, "udp" }, + { "hacl-hb", { NULL }, 5300, "tcp" }, + { "hacl-hb", { NULL }, 5300, "udp" }, + { "hacl-gs", { NULL }, 5301, "tcp" }, + { "hacl-gs", { NULL }, 5301, "udp" }, + { "hacl-cfg", { NULL }, 5302, "tcp" }, + { "hacl-cfg", { NULL }, 5302, "udp" }, + { "hacl-probe", { NULL }, 5303, "tcp" }, + { "hacl-probe", { NULL }, 5303, "udp" }, + { "hacl-local", { NULL }, 5304, "tcp" }, + { "hacl-local", { NULL }, 5304, "udp" }, + { "hacl-test", { NULL }, 5305, "tcp" }, + { "hacl-test", { NULL }, 5305, "udp" }, + { "sun-mc-grp", { NULL }, 5306, "tcp" }, + { "sun-mc-grp", { NULL }, 5306, "udp" }, + { "sco-aip", { NULL }, 5307, "tcp" }, + { "sco-aip", { NULL }, 5307, "udp" }, + { "cfengine", { NULL }, 5308, "tcp" }, + { "cfengine", { NULL }, 5308, "udp" }, + { "jprinter", { NULL }, 5309, "tcp" }, + { "jprinter", { NULL }, 5309, "udp" }, + { "outlaws", { NULL }, 5310, "tcp" }, + { "outlaws", { NULL }, 5310, "udp" }, + { "permabit-cs", { NULL }, 5312, "tcp" }, + { "permabit-cs", { NULL }, 5312, "udp" }, + { "rrdp", { NULL }, 5313, "tcp" }, + { "rrdp", { NULL }, 5313, "udp" }, + { "opalis-rbt-ipc", { NULL }, 5314, "tcp" }, + { "opalis-rbt-ipc", { NULL }, 5314, "udp" }, + { "hacl-poll", { NULL }, 5315, "tcp" }, + { "hacl-poll", { NULL }, 5315, "udp" }, + { "hpdevms", { NULL }, 5316, "tcp" }, + { "hpdevms", { NULL }, 5316, "udp" }, + { "bsfserver-zn", { NULL }, 5320, "tcp" }, + { "bsfsvr-zn-ssl", { NULL }, 5321, "tcp" }, + { "kfserver", { NULL }, 5343, "tcp" }, + { "kfserver", { NULL }, 5343, "udp" }, + { "xkotodrcp", { NULL }, 5344, "tcp" }, + { "xkotodrcp", { NULL }, 5344, "udp" }, + { "stuns", { NULL }, 5349, "tcp" }, + { "stuns", { NULL }, 5349, "udp" }, + { "turns", { NULL }, 5349, "tcp" }, + { "turns", { NULL }, 5349, "udp" }, + { "stun-behaviors", { NULL }, 5349, "tcp" }, + { "stun-behaviors", { NULL }, 5349, "udp" }, + { "nat-pmp-status", { NULL }, 5350, "tcp" }, + { "nat-pmp-status", { NULL }, 5350, "udp" }, + { "nat-pmp", { NULL }, 5351, "tcp" }, + { "nat-pmp", { NULL }, 5351, "udp" }, + { "dns-llq", { NULL }, 5352, "tcp" }, + { "dns-llq", { NULL }, 5352, "udp" }, + { "mdns", { NULL }, 5353, "tcp" }, + { "mdns", { NULL }, 5353, "udp" }, + { "mdnsresponder", { NULL }, 5354, "tcp" }, + { "mdnsresponder", { NULL }, 5354, "udp" }, + { "llmnr", { NULL }, 5355, "tcp" }, + { "llmnr", { NULL }, 5355, "udp" }, + { "ms-smlbiz", { NULL }, 5356, "tcp" }, + { "ms-smlbiz", { NULL }, 5356, "udp" }, + { "wsdapi", { NULL }, 5357, "tcp" }, + { "wsdapi", { NULL }, 5357, "udp" }, + { "wsdapi-s", { NULL }, 5358, "tcp" }, + { "wsdapi-s", { NULL }, 5358, "udp" }, + { "ms-alerter", { NULL }, 5359, "tcp" }, + { "ms-alerter", { NULL }, 5359, "udp" }, + { "ms-sideshow", { NULL }, 5360, "tcp" }, + { "ms-sideshow", { NULL }, 5360, "udp" }, + { "ms-s-sideshow", { NULL }, 5361, "tcp" }, + { "ms-s-sideshow", { NULL }, 5361, "udp" }, + { "serverwsd2", { NULL }, 5362, "tcp" }, + { "serverwsd2", { NULL }, 5362, "udp" }, + { "net-projection", { NULL }, 5363, "tcp" }, + { "net-projection", { NULL }, 5363, "udp" }, + { "stresstester", { NULL }, 5397, "tcp" }, + { "stresstester", { NULL }, 5397, "udp" }, + { "elektron-admin", { NULL }, 5398, "tcp" }, + { "elektron-admin", { NULL }, 5398, "udp" }, + { "securitychase", { NULL }, 5399, "tcp" }, + { "securitychase", { NULL }, 5399, "udp" }, + { "excerpt", { NULL }, 5400, "tcp" }, + { "excerpt", { NULL }, 5400, "udp" }, + { "excerpts", { NULL }, 5401, "tcp" }, + { "excerpts", { NULL }, 5401, "udp" }, + { "mftp", { NULL }, 5402, "tcp" }, + { "mftp", { NULL }, 5402, "udp" }, + { "hpoms-ci-lstn", { NULL }, 5403, "tcp" }, + { "hpoms-ci-lstn", { NULL }, 5403, "udp" }, + { "hpoms-dps-lstn", { NULL }, 5404, "tcp" }, + { "hpoms-dps-lstn", { NULL }, 5404, "udp" }, + { "netsupport", { NULL }, 5405, "tcp" }, + { "netsupport", { NULL }, 5405, "udp" }, + { "systemics-sox", { NULL }, 5406, "tcp" }, + { "systemics-sox", { NULL }, 5406, "udp" }, + { "foresyte-clear", { NULL }, 5407, "tcp" }, + { "foresyte-clear", { NULL }, 5407, "udp" }, + { "foresyte-sec", { NULL }, 5408, "tcp" }, + { "foresyte-sec", { NULL }, 5408, "udp" }, + { "salient-dtasrv", { NULL }, 5409, "tcp" }, + { "salient-dtasrv", { NULL }, 5409, "udp" }, + { "salient-usrmgr", { NULL }, 5410, "tcp" }, + { "salient-usrmgr", { NULL }, 5410, "udp" }, + { "actnet", { NULL }, 5411, "tcp" }, + { "actnet", { NULL }, 5411, "udp" }, + { "continuus", { NULL }, 5412, "tcp" }, + { "continuus", { NULL }, 5412, "udp" }, + { "wwiotalk", { NULL }, 5413, "tcp" }, + { "wwiotalk", { NULL }, 5413, "udp" }, + { "statusd", { NULL }, 5414, "tcp" }, + { "statusd", { NULL }, 5414, "udp" }, + { "ns-server", { NULL }, 5415, "tcp" }, + { "ns-server", { NULL }, 5415, "udp" }, + { "sns-gateway", { NULL }, 5416, "tcp" }, + { "sns-gateway", { NULL }, 5416, "udp" }, + { "sns-agent", { NULL }, 5417, "tcp" }, + { "sns-agent", { NULL }, 5417, "udp" }, + { "mcntp", { NULL }, 5418, "tcp" }, + { "mcntp", { NULL }, 5418, "udp" }, + { "dj-ice", { NULL }, 5419, "tcp" }, + { "dj-ice", { NULL }, 5419, "udp" }, + { "cylink-c", { NULL }, 5420, "tcp" }, + { "cylink-c", { NULL }, 5420, "udp" }, + { "netsupport2", { NULL }, 5421, "tcp" }, + { "netsupport2", { NULL }, 5421, "udp" }, + { "salient-mux", { NULL }, 5422, "tcp" }, + { "salient-mux", { NULL }, 5422, "udp" }, + { "virtualuser", { NULL }, 5423, "tcp" }, + { "virtualuser", { NULL }, 5423, "udp" }, + { "beyond-remote", { NULL }, 5424, "tcp" }, + { "beyond-remote", { NULL }, 5424, "udp" }, + { "br-channel", { NULL }, 5425, "tcp" }, + { "br-channel", { NULL }, 5425, "udp" }, + { "devbasic", { NULL }, 5426, "tcp" }, + { "devbasic", { NULL }, 5426, "udp" }, + { "sco-peer-tta", { NULL }, 5427, "tcp" }, + { "sco-peer-tta", { NULL }, 5427, "udp" }, + { "telaconsole", { NULL }, 5428, "tcp" }, + { "telaconsole", { NULL }, 5428, "udp" }, + { "base", { NULL }, 5429, "tcp" }, + { "base", { NULL }, 5429, "udp" }, + { "radec-corp", { NULL }, 5430, "tcp" }, + { "radec-corp", { NULL }, 5430, "udp" }, + { "park-agent", { NULL }, 5431, "tcp" }, + { "park-agent", { NULL }, 5431, "udp" }, + { "postgresql", { NULL }, 5432, "tcp" }, + { "postgresql", { NULL }, 5432, "udp" }, + { "pyrrho", { NULL }, 5433, "tcp" }, + { "pyrrho", { NULL }, 5433, "udp" }, + { "sgi-arrayd", { NULL }, 5434, "tcp" }, + { "sgi-arrayd", { NULL }, 5434, "udp" }, + { "sceanics", { NULL }, 5435, "tcp" }, + { "sceanics", { NULL }, 5435, "udp" }, + { "pmip6-cntl", { NULL }, 5436, "udp" }, + { "pmip6-data", { NULL }, 5437, "udp" }, + { "spss", { NULL }, 5443, "tcp" }, + { "spss", { NULL }, 5443, "udp" }, + { "surebox", { NULL }, 5453, "tcp" }, + { "surebox", { NULL }, 5453, "udp" }, + { "apc-5454", { NULL }, 5454, "tcp" }, + { "apc-5454", { NULL }, 5454, "udp" }, + { "apc-5455", { NULL }, 5455, "tcp" }, + { "apc-5455", { NULL }, 5455, "udp" }, + { "apc-5456", { NULL }, 5456, "tcp" }, + { "apc-5456", { NULL }, 5456, "udp" }, + { "silkmeter", { NULL }, 5461, "tcp" }, + { "silkmeter", { NULL }, 5461, "udp" }, + { "ttl-publisher", { NULL }, 5462, "tcp" }, + { "ttl-publisher", { NULL }, 5462, "udp" }, + { "ttlpriceproxy", { NULL }, 5463, "tcp" }, + { "ttlpriceproxy", { NULL }, 5463, "udp" }, + { "quailnet", { NULL }, 5464, "tcp" }, + { "quailnet", { NULL }, 5464, "udp" }, + { "netops-broker", { NULL }, 5465, "tcp" }, + { "netops-broker", { NULL }, 5465, "udp" }, + { "fcp-addr-srvr1", { NULL }, 5500, "tcp" }, + { "fcp-addr-srvr1", { NULL }, 5500, "udp" }, + { "fcp-addr-srvr2", { NULL }, 5501, "tcp" }, + { "fcp-addr-srvr2", { NULL }, 5501, "udp" }, + { "fcp-srvr-inst1", { NULL }, 5502, "tcp" }, + { "fcp-srvr-inst1", { NULL }, 5502, "udp" }, + { "fcp-srvr-inst2", { NULL }, 5503, "tcp" }, + { "fcp-srvr-inst2", { NULL }, 5503, "udp" }, + { "fcp-cics-gw1", { NULL }, 5504, "tcp" }, + { "fcp-cics-gw1", { NULL }, 5504, "udp" }, + { "checkoutdb", { NULL }, 5505, "tcp" }, + { "checkoutdb", { NULL }, 5505, "udp" }, + { "amc", { NULL }, 5506, "tcp" }, + { "amc", { NULL }, 5506, "udp" }, + { "sgi-eventmond", { NULL }, 5553, "tcp" }, + { "sgi-eventmond", { NULL }, 5553, "udp" }, + { "sgi-esphttp", { NULL }, 5554, "tcp" }, + { "sgi-esphttp", { NULL }, 5554, "udp" }, + { "personal-agent", { NULL }, 5555, "tcp" }, + { "personal-agent", { NULL }, 5555, "udp" }, + { "freeciv", { NULL }, 5556, "tcp" }, + { "freeciv", { NULL }, 5556, "udp" }, + { "farenet", { NULL }, 5557, "tcp" }, + { "westec-connect", { NULL }, 5566, "tcp" }, + { "m-oap", { NULL }, 5567, "tcp" }, + { "m-oap", { NULL }, 5567, "udp" }, + { "sdt", { NULL }, 5568, "tcp" }, + { "sdt", { NULL }, 5568, "udp" }, + { "sdmmp", { NULL }, 5573, "tcp" }, + { "sdmmp", { NULL }, 5573, "udp" }, + { "lsi-bobcat", { NULL }, 5574, "tcp" }, + { "ora-oap", { NULL }, 5575, "tcp" }, + { "fdtracks", { NULL }, 5579, "tcp" }, + { "tmosms0", { NULL }, 5580, "tcp" }, + { "tmosms0", { NULL }, 5580, "udp" }, + { "tmosms1", { NULL }, 5581, "tcp" }, + { "tmosms1", { NULL }, 5581, "udp" }, + { "fac-restore", { NULL }, 5582, "tcp" }, + { "fac-restore", { NULL }, 5582, "udp" }, + { "tmo-icon-sync", { NULL }, 5583, "tcp" }, + { "tmo-icon-sync", { NULL }, 5583, "udp" }, + { "bis-web", { NULL }, 5584, "tcp" }, + { "bis-web", { NULL }, 5584, "udp" }, + { "bis-sync", { NULL }, 5585, "tcp" }, + { "bis-sync", { NULL }, 5585, "udp" }, + { "ininmessaging", { NULL }, 5597, "tcp" }, + { "ininmessaging", { NULL }, 5597, "udp" }, + { "mctfeed", { NULL }, 5598, "tcp" }, + { "mctfeed", { NULL }, 5598, "udp" }, + { "esinstall", { NULL }, 5599, "tcp" }, + { "esinstall", { NULL }, 5599, "udp" }, + { "esmmanager", { NULL }, 5600, "tcp" }, + { "esmmanager", { NULL }, 5600, "udp" }, + { "esmagent", { NULL }, 5601, "tcp" }, + { "esmagent", { NULL }, 5601, "udp" }, + { "a1-msc", { NULL }, 5602, "tcp" }, + { "a1-msc", { NULL }, 5602, "udp" }, + { "a1-bs", { NULL }, 5603, "tcp" }, + { "a1-bs", { NULL }, 5603, "udp" }, + { "a3-sdunode", { NULL }, 5604, "tcp" }, + { "a3-sdunode", { NULL }, 5604, "udp" }, + { "a4-sdunode", { NULL }, 5605, "tcp" }, + { "a4-sdunode", { NULL }, 5605, "udp" }, + { "ninaf", { NULL }, 5627, "tcp" }, + { "ninaf", { NULL }, 5627, "udp" }, + { "htrust", { NULL }, 5628, "tcp" }, + { "htrust", { NULL }, 5628, "udp" }, + { "symantec-sfdb", { NULL }, 5629, "tcp" }, + { "symantec-sfdb", { NULL }, 5629, "udp" }, + { "precise-comm", { NULL }, 5630, "tcp" }, + { "precise-comm", { NULL }, 5630, "udp" }, + { "pcanywheredata", { NULL }, 5631, "tcp" }, + { "pcanywheredata", { NULL }, 5631, "udp" }, + { "pcanywherestat", { NULL }, 5632, "tcp" }, + { "pcanywherestat", { NULL }, 5632, "udp" }, + { "beorl", { NULL }, 5633, "tcp" }, + { "beorl", { NULL }, 5633, "udp" }, + { "xprtld", { NULL }, 5634, "tcp" }, + { "xprtld", { NULL }, 5634, "udp" }, + { "sfmsso", { NULL }, 5635, "tcp" }, + { "sfm-db-server", { NULL }, 5636, "tcp" }, + { "cssc", { NULL }, 5637, "tcp" }, + { "amqps", { NULL }, 5671, "tcp" }, + { "amqps", { NULL }, 5671, "udp" }, + { "amqp", { NULL }, 5672, "tcp" }, + { "amqp", { NULL }, 5672, "udp" }, + { "amqp", { NULL }, 5672, "sctp"}, + { "jms", { NULL }, 5673, "tcp" }, + { "jms", { NULL }, 5673, "udp" }, + { "hyperscsi-port", { NULL }, 5674, "tcp" }, + { "hyperscsi-port", { NULL }, 5674, "udp" }, + { "v5ua", { NULL }, 5675, "tcp" }, + { "v5ua", { NULL }, 5675, "udp" }, + { "v5ua", { NULL }, 5675, "sctp"}, + { "raadmin", { NULL }, 5676, "tcp" }, + { "raadmin", { NULL }, 5676, "udp" }, + { "questdb2-lnchr", { NULL }, 5677, "tcp" }, + { "questdb2-lnchr", { NULL }, 5677, "udp" }, + { "rrac", { NULL }, 5678, "tcp" }, + { "rrac", { NULL }, 5678, "udp" }, + { "dccm", { NULL }, 5679, "tcp" }, + { "dccm", { NULL }, 5679, "udp" }, + { "auriga-router", { NULL }, 5680, "tcp" }, + { "auriga-router", { NULL }, 5680, "udp" }, + { "ncxcp", { NULL }, 5681, "tcp" }, + { "ncxcp", { NULL }, 5681, "udp" }, + { "brightcore", { NULL }, 5682, "udp" }, + { "ggz", { NULL }, 5688, "tcp" }, + { "ggz", { NULL }, 5688, "udp" }, + { "qmvideo", { NULL }, 5689, "tcp" }, + { "qmvideo", { NULL }, 5689, "udp" }, + { "proshareaudio", { NULL }, 5713, "tcp" }, + { "proshareaudio", { NULL }, 5713, "udp" }, + { "prosharevideo", { NULL }, 5714, "tcp" }, + { "prosharevideo", { NULL }, 5714, "udp" }, + { "prosharedata", { NULL }, 5715, "tcp" }, + { "prosharedata", { NULL }, 5715, "udp" }, + { "prosharerequest", { NULL }, 5716, "tcp" }, + { "prosharerequest", { NULL }, 5716, "udp" }, + { "prosharenotify", { NULL }, 5717, "tcp" }, + { "prosharenotify", { NULL }, 5717, "udp" }, + { "dpm", { NULL }, 5718, "tcp" }, + { "dpm", { NULL }, 5718, "udp" }, + { "dpm-agent", { NULL }, 5719, "tcp" }, + { "dpm-agent", { NULL }, 5719, "udp" }, + { "ms-licensing", { NULL }, 5720, "tcp" }, + { "ms-licensing", { NULL }, 5720, "udp" }, + { "dtpt", { NULL }, 5721, "tcp" }, + { "dtpt", { NULL }, 5721, "udp" }, + { "msdfsr", { NULL }, 5722, "tcp" }, + { "msdfsr", { NULL }, 5722, "udp" }, + { "omhs", { NULL }, 5723, "tcp" }, + { "omhs", { NULL }, 5723, "udp" }, + { "omsdk", { NULL }, 5724, "tcp" }, + { "omsdk", { NULL }, 5724, "udp" }, + { "ms-ilm", { NULL }, 5725, "tcp" }, + { "ms-ilm-sts", { NULL }, 5726, "tcp" }, + { "asgenf", { NULL }, 5727, "tcp" }, + { "io-dist-data", { NULL }, 5728, "tcp" }, + { "io-dist-group", { NULL }, 5728, "udp" }, + { "openmail", { NULL }, 5729, "tcp" }, + { "openmail", { NULL }, 5729, "udp" }, + { "unieng", { NULL }, 5730, "tcp" }, + { "unieng", { NULL }, 5730, "udp" }, + { "ida-discover1", { NULL }, 5741, "tcp" }, + { "ida-discover1", { NULL }, 5741, "udp" }, + { "ida-discover2", { NULL }, 5742, "tcp" }, + { "ida-discover2", { NULL }, 5742, "udp" }, + { "watchdoc-pod", { NULL }, 5743, "tcp" }, + { "watchdoc-pod", { NULL }, 5743, "udp" }, + { "watchdoc", { NULL }, 5744, "tcp" }, + { "watchdoc", { NULL }, 5744, "udp" }, + { "fcopy-server", { NULL }, 5745, "tcp" }, + { "fcopy-server", { NULL }, 5745, "udp" }, + { "fcopys-server", { NULL }, 5746, "tcp" }, + { "fcopys-server", { NULL }, 5746, "udp" }, + { "tunatic", { NULL }, 5747, "tcp" }, + { "tunatic", { NULL }, 5747, "udp" }, + { "tunalyzer", { NULL }, 5748, "tcp" }, + { "tunalyzer", { NULL }, 5748, "udp" }, + { "rscd", { NULL }, 5750, "tcp" }, + { "rscd", { NULL }, 5750, "udp" }, + { "openmailg", { NULL }, 5755, "tcp" }, + { "openmailg", { NULL }, 5755, "udp" }, + { "x500ms", { NULL }, 5757, "tcp" }, + { "x500ms", { NULL }, 5757, "udp" }, + { "openmailns", { NULL }, 5766, "tcp" }, + { "openmailns", { NULL }, 5766, "udp" }, + { "s-openmail", { NULL }, 5767, "tcp" }, + { "s-openmail", { NULL }, 5767, "udp" }, + { "openmailpxy", { NULL }, 5768, "tcp" }, + { "openmailpxy", { NULL }, 5768, "udp" }, + { "spramsca", { NULL }, 5769, "tcp" }, + { "spramsca", { NULL }, 5769, "udp" }, + { "spramsd", { NULL }, 5770, "tcp" }, + { "spramsd", { NULL }, 5770, "udp" }, + { "netagent", { NULL }, 5771, "tcp" }, + { "netagent", { NULL }, 5771, "udp" }, + { "dali-port", { NULL }, 5777, "tcp" }, + { "dali-port", { NULL }, 5777, "udp" }, + { "vts-rpc", { NULL }, 5780, "tcp" }, + { "3par-evts", { NULL }, 5781, "tcp" }, + { "3par-evts", { NULL }, 5781, "udp" }, + { "3par-mgmt", { NULL }, 5782, "tcp" }, + { "3par-mgmt", { NULL }, 5782, "udp" }, + { "3par-mgmt-ssl", { NULL }, 5783, "tcp" }, + { "3par-mgmt-ssl", { NULL }, 5783, "udp" }, + { "ibar", { NULL }, 5784, "udp" }, + { "3par-rcopy", { NULL }, 5785, "tcp" }, + { "3par-rcopy", { NULL }, 5785, "udp" }, + { "cisco-redu", { NULL }, 5786, "udp" }, + { "waascluster", { NULL }, 5787, "udp" }, + { "xtreamx", { NULL }, 5793, "tcp" }, + { "xtreamx", { NULL }, 5793, "udp" }, + { "spdp", { NULL }, 5794, "udp" }, + { "icmpd", { NULL }, 5813, "tcp" }, + { "icmpd", { NULL }, 5813, "udp" }, + { "spt-automation", { NULL }, 5814, "tcp" }, + { "spt-automation", { NULL }, 5814, "udp" }, + { "wherehoo", { NULL }, 5859, "tcp" }, + { "wherehoo", { NULL }, 5859, "udp" }, + { "ppsuitemsg", { NULL }, 5863, "tcp" }, + { "ppsuitemsg", { NULL }, 5863, "udp" }, + { "rfb", { NULL }, 5900, "tcp" }, + { "rfb", { NULL }, 5900, "udp" }, + { "cm", { NULL }, 5910, "tcp" }, + { "cm", { NULL }, 5910, "udp" }, + { "cpdlc", { NULL }, 5911, "tcp" }, + { "cpdlc", { NULL }, 5911, "udp" }, + { "fis", { NULL }, 5912, "tcp" }, + { "fis", { NULL }, 5912, "udp" }, + { "ads-c", { NULL }, 5913, "tcp" }, + { "ads-c", { NULL }, 5913, "udp" }, + { "indy", { NULL }, 5963, "tcp" }, + { "indy", { NULL }, 5963, "udp" }, + { "mppolicy-v5", { NULL }, 5968, "tcp" }, + { "mppolicy-v5", { NULL }, 5968, "udp" }, + { "mppolicy-mgr", { NULL }, 5969, "tcp" }, + { "mppolicy-mgr", { NULL }, 5969, "udp" }, + { "couchdb", { NULL }, 5984, "tcp" }, + { "couchdb", { NULL }, 5984, "udp" }, + { "wsman", { NULL }, 5985, "tcp" }, + { "wsman", { NULL }, 5985, "udp" }, + { "wsmans", { NULL }, 5986, "tcp" }, + { "wsmans", { NULL }, 5986, "udp" }, + { "wbem-rmi", { NULL }, 5987, "tcp" }, + { "wbem-rmi", { NULL }, 5987, "udp" }, + { "wbem-http", { NULL }, 5988, "tcp" }, + { "wbem-http", { NULL }, 5988, "udp" }, + { "wbem-https", { NULL }, 5989, "tcp" }, + { "wbem-https", { NULL }, 5989, "udp" }, + { "wbem-exp-https", { NULL }, 5990, "tcp" }, + { "wbem-exp-https", { NULL }, 5990, "udp" }, + { "nuxsl", { NULL }, 5991, "tcp" }, + { "nuxsl", { NULL }, 5991, "udp" }, + { "consul-insight", { NULL }, 5992, "tcp" }, + { "consul-insight", { NULL }, 5992, "udp" }, + { "cvsup", { NULL }, 5999, "tcp" }, + { "cvsup", { NULL }, 5999, "udp" }, + { "ndl-ahp-svc", { NULL }, 6064, "tcp" }, + { "ndl-ahp-svc", { NULL }, 6064, "udp" }, + { "winpharaoh", { NULL }, 6065, "tcp" }, + { "winpharaoh", { NULL }, 6065, "udp" }, + { "ewctsp", { NULL }, 6066, "tcp" }, + { "ewctsp", { NULL }, 6066, "udp" }, + { "gsmp", { NULL }, 6068, "tcp" }, + { "gsmp", { NULL }, 6068, "udp" }, + { "trip", { NULL }, 6069, "tcp" }, + { "trip", { NULL }, 6069, "udp" }, + { "messageasap", { NULL }, 6070, "tcp" }, + { "messageasap", { NULL }, 6070, "udp" }, + { "ssdtp", { NULL }, 6071, "tcp" }, + { "ssdtp", { NULL }, 6071, "udp" }, + { "diagnose-proc", { NULL }, 6072, "tcp" }, + { "diagnose-proc", { NULL }, 6072, "udp" }, + { "directplay8", { NULL }, 6073, "tcp" }, + { "directplay8", { NULL }, 6073, "udp" }, + { "max", { NULL }, 6074, "tcp" }, + { "max", { NULL }, 6074, "udp" }, + { "dpm-acm", { NULL }, 6075, "tcp" }, + { "miami-bcast", { NULL }, 6083, "udp" }, + { "p2p-sip", { NULL }, 6084, "tcp" }, + { "konspire2b", { NULL }, 6085, "tcp" }, + { "konspire2b", { NULL }, 6085, "udp" }, + { "pdtp", { NULL }, 6086, "tcp" }, + { "pdtp", { NULL }, 6086, "udp" }, + { "ldss", { NULL }, 6087, "tcp" }, + { "ldss", { NULL }, 6087, "udp" }, + { "raxa-mgmt", { NULL }, 6099, "tcp" }, + { "synchronet-db", { NULL }, 6100, "tcp" }, + { "synchronet-db", { NULL }, 6100, "udp" }, + { "synchronet-rtc", { NULL }, 6101, "tcp" }, + { "synchronet-rtc", { NULL }, 6101, "udp" }, + { "synchronet-upd", { NULL }, 6102, "tcp" }, + { "synchronet-upd", { NULL }, 6102, "udp" }, + { "rets", { NULL }, 6103, "tcp" }, + { "rets", { NULL }, 6103, "udp" }, + { "dbdb", { NULL }, 6104, "tcp" }, + { "dbdb", { NULL }, 6104, "udp" }, + { "primaserver", { NULL }, 6105, "tcp" }, + { "primaserver", { NULL }, 6105, "udp" }, + { "mpsserver", { NULL }, 6106, "tcp" }, + { "mpsserver", { NULL }, 6106, "udp" }, + { "etc-control", { NULL }, 6107, "tcp" }, + { "etc-control", { NULL }, 6107, "udp" }, + { "sercomm-scadmin", { NULL }, 6108, "tcp" }, + { "sercomm-scadmin", { NULL }, 6108, "udp" }, + { "globecast-id", { NULL }, 6109, "tcp" }, + { "globecast-id", { NULL }, 6109, "udp" }, + { "softcm", { NULL }, 6110, "tcp" }, + { "softcm", { NULL }, 6110, "udp" }, + { "spc", { NULL }, 6111, "tcp" }, + { "spc", { NULL }, 6111, "udp" }, + { "dtspcd", { NULL }, 6112, "tcp" }, + { "dtspcd", { NULL }, 6112, "udp" }, + { "dayliteserver", { NULL }, 6113, "tcp" }, + { "wrspice", { NULL }, 6114, "tcp" }, + { "xic", { NULL }, 6115, "tcp" }, + { "xtlserv", { NULL }, 6116, "tcp" }, + { "daylitetouch", { NULL }, 6117, "tcp" }, + { "spdy", { NULL }, 6121, "tcp" }, + { "bex-webadmin", { NULL }, 6122, "tcp" }, + { "bex-webadmin", { NULL }, 6122, "udp" }, + { "backup-express", { NULL }, 6123, "tcp" }, + { "backup-express", { NULL }, 6123, "udp" }, + { "pnbs", { NULL }, 6124, "tcp" }, + { "pnbs", { NULL }, 6124, "udp" }, + { "nbt-wol", { NULL }, 6133, "tcp" }, + { "nbt-wol", { NULL }, 6133, "udp" }, + { "pulsonixnls", { NULL }, 6140, "tcp" }, + { "pulsonixnls", { NULL }, 6140, "udp" }, + { "meta-corp", { NULL }, 6141, "tcp" }, + { "meta-corp", { NULL }, 6141, "udp" }, + { "aspentec-lm", { NULL }, 6142, "tcp" }, + { "aspentec-lm", { NULL }, 6142, "udp" }, + { "watershed-lm", { NULL }, 6143, "tcp" }, + { "watershed-lm", { NULL }, 6143, "udp" }, + { "statsci1-lm", { NULL }, 6144, "tcp" }, + { "statsci1-lm", { NULL }, 6144, "udp" }, + { "statsci2-lm", { NULL }, 6145, "tcp" }, + { "statsci2-lm", { NULL }, 6145, "udp" }, + { "lonewolf-lm", { NULL }, 6146, "tcp" }, + { "lonewolf-lm", { NULL }, 6146, "udp" }, + { "montage-lm", { NULL }, 6147, "tcp" }, + { "montage-lm", { NULL }, 6147, "udp" }, + { "ricardo-lm", { NULL }, 6148, "tcp" }, + { "ricardo-lm", { NULL }, 6148, "udp" }, + { "tal-pod", { NULL }, 6149, "tcp" }, + { "tal-pod", { NULL }, 6149, "udp" }, + { "efb-aci", { NULL }, 6159, "tcp" }, + { "patrol-ism", { NULL }, 6161, "tcp" }, + { "patrol-ism", { NULL }, 6161, "udp" }, + { "patrol-coll", { NULL }, 6162, "tcp" }, + { "patrol-coll", { NULL }, 6162, "udp" }, + { "pscribe", { NULL }, 6163, "tcp" }, + { "pscribe", { NULL }, 6163, "udp" }, + { "lm-x", { NULL }, 6200, "tcp" }, + { "lm-x", { NULL }, 6200, "udp" }, + { "radmind", { NULL }, 6222, "tcp" }, + { "radmind", { NULL }, 6222, "udp" }, + { "jeol-nsdtp-1", { NULL }, 6241, "tcp" }, + { "jeol-nsddp-1", { NULL }, 6241, "udp" }, + { "jeol-nsdtp-2", { NULL }, 6242, "tcp" }, + { "jeol-nsddp-2", { NULL }, 6242, "udp" }, + { "jeol-nsdtp-3", { NULL }, 6243, "tcp" }, + { "jeol-nsddp-3", { NULL }, 6243, "udp" }, + { "jeol-nsdtp-4", { NULL }, 6244, "tcp" }, + { "jeol-nsddp-4", { NULL }, 6244, "udp" }, + { "tl1-raw-ssl", { NULL }, 6251, "tcp" }, + { "tl1-raw-ssl", { NULL }, 6251, "udp" }, + { "tl1-ssh", { NULL }, 6252, "tcp" }, + { "tl1-ssh", { NULL }, 6252, "udp" }, + { "crip", { NULL }, 6253, "tcp" }, + { "crip", { NULL }, 6253, "udp" }, + { "gld", { NULL }, 6267, "tcp" }, + { "grid", { NULL }, 6268, "tcp" }, + { "grid", { NULL }, 6268, "udp" }, + { "grid-alt", { NULL }, 6269, "tcp" }, + { "grid-alt", { NULL }, 6269, "udp" }, + { "bmc-grx", { NULL }, 6300, "tcp" }, + { "bmc-grx", { NULL }, 6300, "udp" }, + { "bmc_ctd_ldap", { NULL }, 6301, "tcp" }, + { "bmc_ctd_ldap", { NULL }, 6301, "udp" }, + { "ufmp", { NULL }, 6306, "tcp" }, + { "ufmp", { NULL }, 6306, "udp" }, + { "scup", { NULL }, 6315, "tcp" }, + { "scup-disc", { NULL }, 6315, "udp" }, + { "abb-escp", { NULL }, 6316, "tcp" }, + { "abb-escp", { NULL }, 6316, "udp" }, + { "repsvc", { NULL }, 6320, "tcp" }, + { "repsvc", { NULL }, 6320, "udp" }, + { "emp-server1", { NULL }, 6321, "tcp" }, + { "emp-server1", { NULL }, 6321, "udp" }, + { "emp-server2", { NULL }, 6322, "tcp" }, + { "emp-server2", { NULL }, 6322, "udp" }, + { "sflow", { NULL }, 6343, "tcp" }, + { "sflow", { NULL }, 6343, "udp" }, + { "gnutella-svc", { NULL }, 6346, "tcp" }, + { "gnutella-svc", { NULL }, 6346, "udp" }, + { "gnutella-rtr", { NULL }, 6347, "tcp" }, + { "gnutella-rtr", { NULL }, 6347, "udp" }, + { "adap", { NULL }, 6350, "tcp" }, + { "adap", { NULL }, 6350, "udp" }, + { "pmcs", { NULL }, 6355, "tcp" }, + { "pmcs", { NULL }, 6355, "udp" }, + { "metaedit-mu", { NULL }, 6360, "tcp" }, + { "metaedit-mu", { NULL }, 6360, "udp" }, + { "metaedit-se", { NULL }, 6370, "tcp" }, + { "metaedit-se", { NULL }, 6370, "udp" }, + { "metatude-mds", { NULL }, 6382, "tcp" }, + { "metatude-mds", { NULL }, 6382, "udp" }, + { "clariion-evr01", { NULL }, 6389, "tcp" }, + { "clariion-evr01", { NULL }, 6389, "udp" }, + { "metaedit-ws", { NULL }, 6390, "tcp" }, + { "metaedit-ws", { NULL }, 6390, "udp" }, + { "faxcomservice", { NULL }, 6417, "tcp" }, + { "faxcomservice", { NULL }, 6417, "udp" }, + { "syserverremote", { NULL }, 6418, "tcp" }, + { "svdrp", { NULL }, 6419, "tcp" }, + { "nim-vdrshell", { NULL }, 6420, "tcp" }, + { "nim-vdrshell", { NULL }, 6420, "udp" }, + { "nim-wan", { NULL }, 6421, "tcp" }, + { "nim-wan", { NULL }, 6421, "udp" }, + { "pgbouncer", { NULL }, 6432, "tcp" }, + { "sun-sr-https", { NULL }, 6443, "tcp" }, + { "sun-sr-https", { NULL }, 6443, "udp" }, + { "sge_qmaster", { NULL }, 6444, "tcp" }, + { "sge_qmaster", { NULL }, 6444, "udp" }, + { "sge_execd", { NULL }, 6445, "tcp" }, + { "sge_execd", { NULL }, 6445, "udp" }, + { "mysql-proxy", { NULL }, 6446, "tcp" }, + { "mysql-proxy", { NULL }, 6446, "udp" }, + { "skip-cert-recv", { NULL }, 6455, "tcp" }, + { "skip-cert-send", { NULL }, 6456, "udp" }, + { "lvision-lm", { NULL }, 6471, "tcp" }, + { "lvision-lm", { NULL }, 6471, "udp" }, + { "sun-sr-http", { NULL }, 6480, "tcp" }, + { "sun-sr-http", { NULL }, 6480, "udp" }, + { "servicetags", { NULL }, 6481, "tcp" }, + { "servicetags", { NULL }, 6481, "udp" }, + { "ldoms-mgmt", { NULL }, 6482, "tcp" }, + { "ldoms-mgmt", { NULL }, 6482, "udp" }, + { "SunVTS-RMI", { NULL }, 6483, "tcp" }, + { "SunVTS-RMI", { NULL }, 6483, "udp" }, + { "sun-sr-jms", { NULL }, 6484, "tcp" }, + { "sun-sr-jms", { NULL }, 6484, "udp" }, + { "sun-sr-iiop", { NULL }, 6485, "tcp" }, + { "sun-sr-iiop", { NULL }, 6485, "udp" }, + { "sun-sr-iiops", { NULL }, 6486, "tcp" }, + { "sun-sr-iiops", { NULL }, 6486, "udp" }, + { "sun-sr-iiop-aut", { NULL }, 6487, "tcp" }, + { "sun-sr-iiop-aut", { NULL }, 6487, "udp" }, + { "sun-sr-jmx", { NULL }, 6488, "tcp" }, + { "sun-sr-jmx", { NULL }, 6488, "udp" }, + { "sun-sr-admin", { NULL }, 6489, "tcp" }, + { "sun-sr-admin", { NULL }, 6489, "udp" }, + { "boks", { NULL }, 6500, "tcp" }, + { "boks", { NULL }, 6500, "udp" }, + { "boks_servc", { NULL }, 6501, "tcp" }, + { "boks_servc", { NULL }, 6501, "udp" }, + { "boks_servm", { NULL }, 6502, "tcp" }, + { "boks_servm", { NULL }, 6502, "udp" }, + { "boks_clntd", { NULL }, 6503, "tcp" }, + { "boks_clntd", { NULL }, 6503, "udp" }, + { "badm_priv", { NULL }, 6505, "tcp" }, + { "badm_priv", { NULL }, 6505, "udp" }, + { "badm_pub", { NULL }, 6506, "tcp" }, + { "badm_pub", { NULL }, 6506, "udp" }, + { "bdir_priv", { NULL }, 6507, "tcp" }, + { "bdir_priv", { NULL }, 6507, "udp" }, + { "bdir_pub", { NULL }, 6508, "tcp" }, + { "bdir_pub", { NULL }, 6508, "udp" }, + { "mgcs-mfp-port", { NULL }, 6509, "tcp" }, + { "mgcs-mfp-port", { NULL }, 6509, "udp" }, + { "mcer-port", { NULL }, 6510, "tcp" }, + { "mcer-port", { NULL }, 6510, "udp" }, + { "netconf-tls", { NULL }, 6513, "tcp" }, + { "syslog-tls", { NULL }, 6514, "tcp" }, + { "syslog-tls", { NULL }, 6514, "udp" }, + { "syslog-tls", { NULL }, 6514, "dccp"}, + { "elipse-rec", { NULL }, 6515, "tcp" }, + { "elipse-rec", { NULL }, 6515, "udp" }, + { "lds-distrib", { NULL }, 6543, "tcp" }, + { "lds-distrib", { NULL }, 6543, "udp" }, + { "lds-dump", { NULL }, 6544, "tcp" }, + { "lds-dump", { NULL }, 6544, "udp" }, + { "apc-6547", { NULL }, 6547, "tcp" }, + { "apc-6547", { NULL }, 6547, "udp" }, + { "apc-6548", { NULL }, 6548, "tcp" }, + { "apc-6548", { NULL }, 6548, "udp" }, + { "apc-6549", { NULL }, 6549, "tcp" }, + { "apc-6549", { NULL }, 6549, "udp" }, + { "fg-sysupdate", { NULL }, 6550, "tcp" }, + { "fg-sysupdate", { NULL }, 6550, "udp" }, + { "sum", { NULL }, 6551, "tcp" }, + { "sum", { NULL }, 6551, "udp" }, + { "xdsxdm", { NULL }, 6558, "tcp" }, + { "xdsxdm", { NULL }, 6558, "udp" }, + { "sane-port", { NULL }, 6566, "tcp" }, + { "sane-port", { NULL }, 6566, "udp" }, + { "esp", { NULL }, 6567, "tcp" }, + { "esp", { NULL }, 6567, "udp" }, + { "canit_store", { NULL }, 6568, "tcp" }, + { "rp-reputation", { NULL }, 6568, "udp" }, + { "affiliate", { NULL }, 6579, "tcp" }, + { "affiliate", { NULL }, 6579, "udp" }, + { "parsec-master", { NULL }, 6580, "tcp" }, + { "parsec-master", { NULL }, 6580, "udp" }, + { "parsec-peer", { NULL }, 6581, "tcp" }, + { "parsec-peer", { NULL }, 6581, "udp" }, + { "parsec-game", { NULL }, 6582, "tcp" }, + { "parsec-game", { NULL }, 6582, "udp" }, + { "joaJewelSuite", { NULL }, 6583, "tcp" }, + { "joaJewelSuite", { NULL }, 6583, "udp" }, + { "mshvlm", { NULL }, 6600, "tcp" }, + { "mstmg-sstp", { NULL }, 6601, "tcp" }, + { "wsscomfrmwk", { NULL }, 6602, "tcp" }, + { "odette-ftps", { NULL }, 6619, "tcp" }, + { "odette-ftps", { NULL }, 6619, "udp" }, + { "kftp-data", { NULL }, 6620, "tcp" }, + { "kftp-data", { NULL }, 6620, "udp" }, + { "kftp", { NULL }, 6621, "tcp" }, + { "kftp", { NULL }, 6621, "udp" }, + { "mcftp", { NULL }, 6622, "tcp" }, + { "mcftp", { NULL }, 6622, "udp" }, + { "ktelnet", { NULL }, 6623, "tcp" }, + { "ktelnet", { NULL }, 6623, "udp" }, + { "datascaler-db", { NULL }, 6624, "tcp" }, + { "datascaler-ctl", { NULL }, 6625, "tcp" }, + { "wago-service", { NULL }, 6626, "tcp" }, + { "wago-service", { NULL }, 6626, "udp" }, + { "nexgen", { NULL }, 6627, "tcp" }, + { "nexgen", { NULL }, 6627, "udp" }, + { "afesc-mc", { NULL }, 6628, "tcp" }, + { "afesc-mc", { NULL }, 6628, "udp" }, + { "mxodbc-connect", { NULL }, 6632, "tcp" }, + { "pcs-sf-ui-man", { NULL }, 6655, "tcp" }, + { "emgmsg", { NULL }, 6656, "tcp" }, + { "palcom-disc", { NULL }, 6657, "udp" }, + { "vocaltec-gold", { NULL }, 6670, "tcp" }, + { "vocaltec-gold", { NULL }, 6670, "udp" }, + { "p4p-portal", { NULL }, 6671, "tcp" }, + { "p4p-portal", { NULL }, 6671, "udp" }, + { "vision_server", { NULL }, 6672, "tcp" }, + { "vision_server", { NULL }, 6672, "udp" }, + { "vision_elmd", { NULL }, 6673, "tcp" }, + { "vision_elmd", { NULL }, 6673, "udp" }, + { "vfbp", { NULL }, 6678, "tcp" }, + { "vfbp-disc", { NULL }, 6678, "udp" }, + { "osaut", { NULL }, 6679, "tcp" }, + { "osaut", { NULL }, 6679, "udp" }, + { "clever-ctrace", { NULL }, 6687, "tcp" }, + { "clever-tcpip", { NULL }, 6688, "tcp" }, + { "tsa", { NULL }, 6689, "tcp" }, + { "tsa", { NULL }, 6689, "udp" }, + { "babel", { NULL }, 6697, "udp" }, + { "kti-icad-srvr", { NULL }, 6701, "tcp" }, + { "kti-icad-srvr", { NULL }, 6701, "udp" }, + { "e-design-net", { NULL }, 6702, "tcp" }, + { "e-design-net", { NULL }, 6702, "udp" }, + { "e-design-web", { NULL }, 6703, "tcp" }, + { "e-design-web", { NULL }, 6703, "udp" }, + { "frc-hp", { NULL }, 6704, "sctp"}, + { "frc-mp", { NULL }, 6705, "sctp"}, + { "frc-lp", { NULL }, 6706, "sctp"}, + { "ibprotocol", { NULL }, 6714, "tcp" }, + { "ibprotocol", { NULL }, 6714, "udp" }, + { "fibotrader-com", { NULL }, 6715, "tcp" }, + { "fibotrader-com", { NULL }, 6715, "udp" }, + { "bmc-perf-agent", { NULL }, 6767, "tcp" }, + { "bmc-perf-agent", { NULL }, 6767, "udp" }, + { "bmc-perf-mgrd", { NULL }, 6768, "tcp" }, + { "bmc-perf-mgrd", { NULL }, 6768, "udp" }, + { "adi-gxp-srvprt", { NULL }, 6769, "tcp" }, + { "adi-gxp-srvprt", { NULL }, 6769, "udp" }, + { "plysrv-http", { NULL }, 6770, "tcp" }, + { "plysrv-http", { NULL }, 6770, "udp" }, + { "plysrv-https", { NULL }, 6771, "tcp" }, + { "plysrv-https", { NULL }, 6771, "udp" }, + { "dgpf-exchg", { NULL }, 6785, "tcp" }, + { "dgpf-exchg", { NULL }, 6785, "udp" }, + { "smc-jmx", { NULL }, 6786, "tcp" }, + { "smc-jmx", { NULL }, 6786, "udp" }, + { "smc-admin", { NULL }, 6787, "tcp" }, + { "smc-admin", { NULL }, 6787, "udp" }, + { "smc-http", { NULL }, 6788, "tcp" }, + { "smc-http", { NULL }, 6788, "udp" }, + { "smc-https", { NULL }, 6789, "tcp" }, + { "smc-https", { NULL }, 6789, "udp" }, + { "hnmp", { NULL }, 6790, "tcp" }, + { "hnmp", { NULL }, 6790, "udp" }, + { "hnm", { NULL }, 6791, "tcp" }, + { "hnm", { NULL }, 6791, "udp" }, + { "acnet", { NULL }, 6801, "tcp" }, + { "acnet", { NULL }, 6801, "udp" }, + { "pentbox-sim", { NULL }, 6817, "tcp" }, + { "ambit-lm", { NULL }, 6831, "tcp" }, + { "ambit-lm", { NULL }, 6831, "udp" }, + { "netmo-default", { NULL }, 6841, "tcp" }, + { "netmo-default", { NULL }, 6841, "udp" }, + { "netmo-http", { NULL }, 6842, "tcp" }, + { "netmo-http", { NULL }, 6842, "udp" }, + { "iccrushmore", { NULL }, 6850, "tcp" }, + { "iccrushmore", { NULL }, 6850, "udp" }, + { "acctopus-cc", { NULL }, 6868, "tcp" }, + { "acctopus-st", { NULL }, 6868, "udp" }, + { "muse", { NULL }, 6888, "tcp" }, + { "muse", { NULL }, 6888, "udp" }, + { "jetstream", { NULL }, 6901, "tcp" }, + { "xsmsvc", { NULL }, 6936, "tcp" }, + { "xsmsvc", { NULL }, 6936, "udp" }, + { "bioserver", { NULL }, 6946, "tcp" }, + { "bioserver", { NULL }, 6946, "udp" }, + { "otlp", { NULL }, 6951, "tcp" }, + { "otlp", { NULL }, 6951, "udp" }, + { "jmact3", { NULL }, 6961, "tcp" }, + { "jmact3", { NULL }, 6961, "udp" }, + { "jmevt2", { NULL }, 6962, "tcp" }, + { "jmevt2", { NULL }, 6962, "udp" }, + { "swismgr1", { NULL }, 6963, "tcp" }, + { "swismgr1", { NULL }, 6963, "udp" }, + { "swismgr2", { NULL }, 6964, "tcp" }, + { "swismgr2", { NULL }, 6964, "udp" }, + { "swistrap", { NULL }, 6965, "tcp" }, + { "swistrap", { NULL }, 6965, "udp" }, + { "swispol", { NULL }, 6966, "tcp" }, + { "swispol", { NULL }, 6966, "udp" }, + { "acmsoda", { NULL }, 6969, "tcp" }, + { "acmsoda", { NULL }, 6969, "udp" }, + { "MobilitySrv", { NULL }, 6997, "tcp" }, + { "MobilitySrv", { NULL }, 6997, "udp" }, + { "iatp-highpri", { NULL }, 6998, "tcp" }, + { "iatp-highpri", { NULL }, 6998, "udp" }, + { "iatp-normalpri", { NULL }, 6999, "tcp" }, + { "iatp-normalpri", { NULL }, 6999, "udp" }, + { "afs3-fileserver", { NULL }, 7000, "tcp" }, + { "afs3-fileserver", { NULL }, 7000, "udp" }, + { "afs3-callback", { NULL }, 7001, "tcp" }, + { "afs3-callback", { NULL }, 7001, "udp" }, + { "afs3-prserver", { NULL }, 7002, "tcp" }, + { "afs3-prserver", { NULL }, 7002, "udp" }, + { "afs3-vlserver", { NULL }, 7003, "tcp" }, + { "afs3-vlserver", { NULL }, 7003, "udp" }, + { "afs3-kaserver", { NULL }, 7004, "tcp" }, + { "afs3-kaserver", { NULL }, 7004, "udp" }, + { "afs3-volser", { NULL }, 7005, "tcp" }, + { "afs3-volser", { NULL }, 7005, "udp" }, + { "afs3-errors", { NULL }, 7006, "tcp" }, + { "afs3-errors", { NULL }, 7006, "udp" }, + { "afs3-bos", { NULL }, 7007, "tcp" }, + { "afs3-bos", { NULL }, 7007, "udp" }, + { "afs3-update", { NULL }, 7008, "tcp" }, + { "afs3-update", { NULL }, 7008, "udp" }, + { "afs3-rmtsys", { NULL }, 7009, "tcp" }, + { "afs3-rmtsys", { NULL }, 7009, "udp" }, + { "ups-onlinet", { NULL }, 7010, "tcp" }, + { "ups-onlinet", { NULL }, 7010, "udp" }, + { "talon-disc", { NULL }, 7011, "tcp" }, + { "talon-disc", { NULL }, 7011, "udp" }, + { "talon-engine", { NULL }, 7012, "tcp" }, + { "talon-engine", { NULL }, 7012, "udp" }, + { "microtalon-dis", { NULL }, 7013, "tcp" }, + { "microtalon-dis", { NULL }, 7013, "udp" }, + { "microtalon-com", { NULL }, 7014, "tcp" }, + { "microtalon-com", { NULL }, 7014, "udp" }, + { "talon-webserver", { NULL }, 7015, "tcp" }, + { "talon-webserver", { NULL }, 7015, "udp" }, + { "dpserve", { NULL }, 7020, "tcp" }, + { "dpserve", { NULL }, 7020, "udp" }, + { "dpserveadmin", { NULL }, 7021, "tcp" }, + { "dpserveadmin", { NULL }, 7021, "udp" }, + { "ctdp", { NULL }, 7022, "tcp" }, + { "ctdp", { NULL }, 7022, "udp" }, + { "ct2nmcs", { NULL }, 7023, "tcp" }, + { "ct2nmcs", { NULL }, 7023, "udp" }, + { "vmsvc", { NULL }, 7024, "tcp" }, + { "vmsvc", { NULL }, 7024, "udp" }, + { "vmsvc-2", { NULL }, 7025, "tcp" }, + { "vmsvc-2", { NULL }, 7025, "udp" }, + { "op-probe", { NULL }, 7030, "tcp" }, + { "op-probe", { NULL }, 7030, "udp" }, + { "arcp", { NULL }, 7070, "tcp" }, + { "arcp", { NULL }, 7070, "udp" }, + { "iwg1", { NULL }, 7071, "tcp" }, + { "iwg1", { NULL }, 7071, "udp" }, + { "empowerid", { NULL }, 7080, "tcp" }, + { "empowerid", { NULL }, 7080, "udp" }, + { "lazy-ptop", { NULL }, 7099, "tcp" }, + { "lazy-ptop", { NULL }, 7099, "udp" }, + { "font-service", { NULL }, 7100, "tcp" }, + { "font-service", { NULL }, 7100, "udp" }, + { "elcn", { NULL }, 7101, "tcp" }, + { "elcn", { NULL }, 7101, "udp" }, + { "aes-x170", { NULL }, 7107, "udp" }, + { "virprot-lm", { NULL }, 7121, "tcp" }, + { "virprot-lm", { NULL }, 7121, "udp" }, + { "scenidm", { NULL }, 7128, "tcp" }, + { "scenidm", { NULL }, 7128, "udp" }, + { "scenccs", { NULL }, 7129, "tcp" }, + { "scenccs", { NULL }, 7129, "udp" }, + { "cabsm-comm", { NULL }, 7161, "tcp" }, + { "cabsm-comm", { NULL }, 7161, "udp" }, + { "caistoragemgr", { NULL }, 7162, "tcp" }, + { "caistoragemgr", { NULL }, 7162, "udp" }, + { "cacsambroker", { NULL }, 7163, "tcp" }, + { "cacsambroker", { NULL }, 7163, "udp" }, + { "fsr", { NULL }, 7164, "tcp" }, + { "fsr", { NULL }, 7164, "udp" }, + { "doc-server", { NULL }, 7165, "tcp" }, + { "doc-server", { NULL }, 7165, "udp" }, + { "aruba-server", { NULL }, 7166, "tcp" }, + { "aruba-server", { NULL }, 7166, "udp" }, + { "casrmagent", { NULL }, 7167, "tcp" }, + { "cnckadserver", { NULL }, 7168, "tcp" }, + { "ccag-pib", { NULL }, 7169, "tcp" }, + { "ccag-pib", { NULL }, 7169, "udp" }, + { "nsrp", { NULL }, 7170, "tcp" }, + { "nsrp", { NULL }, 7170, "udp" }, + { "drm-production", { NULL }, 7171, "tcp" }, + { "drm-production", { NULL }, 7171, "udp" }, + { "zsecure", { NULL }, 7173, "tcp" }, + { "clutild", { NULL }, 7174, "tcp" }, + { "clutild", { NULL }, 7174, "udp" }, + { "fodms", { NULL }, 7200, "tcp" }, + { "fodms", { NULL }, 7200, "udp" }, + { "dlip", { NULL }, 7201, "tcp" }, + { "dlip", { NULL }, 7201, "udp" }, + { "ramp", { NULL }, 7227, "tcp" }, + { "ramp", { NULL }, 7227, "udp" }, + { "citrixupp", { NULL }, 7228, "tcp" }, + { "citrixuppg", { NULL }, 7229, "tcp" }, + { "pads", { NULL }, 7237, "tcp" }, + { "cnap", { NULL }, 7262, "tcp" }, + { "cnap", { NULL }, 7262, "udp" }, + { "watchme-7272", { NULL }, 7272, "tcp" }, + { "watchme-7272", { NULL }, 7272, "udp" }, + { "oma-rlp", { NULL }, 7273, "tcp" }, + { "oma-rlp", { NULL }, 7273, "udp" }, + { "oma-rlp-s", { NULL }, 7274, "tcp" }, + { "oma-rlp-s", { NULL }, 7274, "udp" }, + { "oma-ulp", { NULL }, 7275, "tcp" }, + { "oma-ulp", { NULL }, 7275, "udp" }, + { "oma-ilp", { NULL }, 7276, "tcp" }, + { "oma-ilp", { NULL }, 7276, "udp" }, + { "oma-ilp-s", { NULL }, 7277, "tcp" }, + { "oma-ilp-s", { NULL }, 7277, "udp" }, + { "oma-dcdocbs", { NULL }, 7278, "tcp" }, + { "oma-dcdocbs", { NULL }, 7278, "udp" }, + { "ctxlic", { NULL }, 7279, "tcp" }, + { "ctxlic", { NULL }, 7279, "udp" }, + { "itactionserver1", { NULL }, 7280, "tcp" }, + { "itactionserver1", { NULL }, 7280, "udp" }, + { "itactionserver2", { NULL }, 7281, "tcp" }, + { "itactionserver2", { NULL }, 7281, "udp" }, + { "mzca-action", { NULL }, 7282, "tcp" }, + { "mzca-alert", { NULL }, 7282, "udp" }, + { "lcm-server", { NULL }, 7365, "tcp" }, + { "lcm-server", { NULL }, 7365, "udp" }, + { "mindfilesys", { NULL }, 7391, "tcp" }, + { "mindfilesys", { NULL }, 7391, "udp" }, + { "mrssrendezvous", { NULL }, 7392, "tcp" }, + { "mrssrendezvous", { NULL }, 7392, "udp" }, + { "nfoldman", { NULL }, 7393, "tcp" }, + { "nfoldman", { NULL }, 7393, "udp" }, + { "fse", { NULL }, 7394, "tcp" }, + { "fse", { NULL }, 7394, "udp" }, + { "winqedit", { NULL }, 7395, "tcp" }, + { "winqedit", { NULL }, 7395, "udp" }, + { "hexarc", { NULL }, 7397, "tcp" }, + { "hexarc", { NULL }, 7397, "udp" }, + { "rtps-discovery", { NULL }, 7400, "tcp" }, + { "rtps-discovery", { NULL }, 7400, "udp" }, + { "rtps-dd-ut", { NULL }, 7401, "tcp" }, + { "rtps-dd-ut", { NULL }, 7401, "udp" }, + { "rtps-dd-mt", { NULL }, 7402, "tcp" }, + { "rtps-dd-mt", { NULL }, 7402, "udp" }, + { "ionixnetmon", { NULL }, 7410, "tcp" }, + { "ionixnetmon", { NULL }, 7410, "udp" }, + { "mtportmon", { NULL }, 7421, "tcp" }, + { "mtportmon", { NULL }, 7421, "udp" }, + { "pmdmgr", { NULL }, 7426, "tcp" }, + { "pmdmgr", { NULL }, 7426, "udp" }, + { "oveadmgr", { NULL }, 7427, "tcp" }, + { "oveadmgr", { NULL }, 7427, "udp" }, + { "ovladmgr", { NULL }, 7428, "tcp" }, + { "ovladmgr", { NULL }, 7428, "udp" }, + { "opi-sock", { NULL }, 7429, "tcp" }, + { "opi-sock", { NULL }, 7429, "udp" }, + { "xmpv7", { NULL }, 7430, "tcp" }, + { "xmpv7", { NULL }, 7430, "udp" }, + { "pmd", { NULL }, 7431, "tcp" }, + { "pmd", { NULL }, 7431, "udp" }, + { "faximum", { NULL }, 7437, "tcp" }, + { "faximum", { NULL }, 7437, "udp" }, + { "oracleas-https", { NULL }, 7443, "tcp" }, + { "oracleas-https", { NULL }, 7443, "udp" }, + { "rise", { NULL }, 7473, "tcp" }, + { "rise", { NULL }, 7473, "udp" }, + { "telops-lmd", { NULL }, 7491, "tcp" }, + { "telops-lmd", { NULL }, 7491, "udp" }, + { "silhouette", { NULL }, 7500, "tcp" }, + { "silhouette", { NULL }, 7500, "udp" }, + { "ovbus", { NULL }, 7501, "tcp" }, + { "ovbus", { NULL }, 7501, "udp" }, + { "acplt", { NULL }, 7509, "tcp" }, + { "ovhpas", { NULL }, 7510, "tcp" }, + { "ovhpas", { NULL }, 7510, "udp" }, + { "pafec-lm", { NULL }, 7511, "tcp" }, + { "pafec-lm", { NULL }, 7511, "udp" }, + { "saratoga", { NULL }, 7542, "tcp" }, + { "saratoga", { NULL }, 7542, "udp" }, + { "atul", { NULL }, 7543, "tcp" }, + { "atul", { NULL }, 7543, "udp" }, + { "nta-ds", { NULL }, 7544, "tcp" }, + { "nta-ds", { NULL }, 7544, "udp" }, + { "nta-us", { NULL }, 7545, "tcp" }, + { "nta-us", { NULL }, 7545, "udp" }, + { "cfs", { NULL }, 7546, "tcp" }, + { "cfs", { NULL }, 7546, "udp" }, + { "cwmp", { NULL }, 7547, "tcp" }, + { "cwmp", { NULL }, 7547, "udp" }, + { "tidp", { NULL }, 7548, "tcp" }, + { "tidp", { NULL }, 7548, "udp" }, + { "nls-tl", { NULL }, 7549, "tcp" }, + { "nls-tl", { NULL }, 7549, "udp" }, + { "sncp", { NULL }, 7560, "tcp" }, + { "sncp", { NULL }, 7560, "udp" }, + { "cfw", { NULL }, 7563, "tcp" }, + { "vsi-omega", { NULL }, 7566, "tcp" }, + { "vsi-omega", { NULL }, 7566, "udp" }, + { "dell-eql-asm", { NULL }, 7569, "tcp" }, + { "aries-kfinder", { NULL }, 7570, "tcp" }, + { "aries-kfinder", { NULL }, 7570, "udp" }, + { "sun-lm", { NULL }, 7588, "tcp" }, + { "sun-lm", { NULL }, 7588, "udp" }, + { "indi", { NULL }, 7624, "tcp" }, + { "indi", { NULL }, 7624, "udp" }, + { "simco", { NULL }, 7626, "tcp" }, + { "simco", { NULL }, 7626, "sctp"}, + { "soap-http", { NULL }, 7627, "tcp" }, + { "soap-http", { NULL }, 7627, "udp" }, + { "zen-pawn", { NULL }, 7628, "tcp" }, + { "zen-pawn", { NULL }, 7628, "udp" }, + { "xdas", { NULL }, 7629, "tcp" }, + { "xdas", { NULL }, 7629, "udp" }, + { "hawk", { NULL }, 7630, "tcp" }, + { "tesla-sys-msg", { NULL }, 7631, "tcp" }, + { "pmdfmgt", { NULL }, 7633, "tcp" }, + { "pmdfmgt", { NULL }, 7633, "udp" }, + { "cuseeme", { NULL }, 7648, "tcp" }, + { "cuseeme", { NULL }, 7648, "udp" }, + { "imqstomp", { NULL }, 7672, "tcp" }, + { "imqstomps", { NULL }, 7673, "tcp" }, + { "imqtunnels", { NULL }, 7674, "tcp" }, + { "imqtunnels", { NULL }, 7674, "udp" }, + { "imqtunnel", { NULL }, 7675, "tcp" }, + { "imqtunnel", { NULL }, 7675, "udp" }, + { "imqbrokerd", { NULL }, 7676, "tcp" }, + { "imqbrokerd", { NULL }, 7676, "udp" }, + { "sun-user-https", { NULL }, 7677, "tcp" }, + { "sun-user-https", { NULL }, 7677, "udp" }, + { "pando-pub", { NULL }, 7680, "tcp" }, + { "pando-pub", { NULL }, 7680, "udp" }, + { "collaber", { NULL }, 7689, "tcp" }, + { "collaber", { NULL }, 7689, "udp" }, + { "klio", { NULL }, 7697, "tcp" }, + { "klio", { NULL }, 7697, "udp" }, + { "em7-secom", { NULL }, 7700, "tcp" }, + { "sync-em7", { NULL }, 7707, "tcp" }, + { "sync-em7", { NULL }, 7707, "udp" }, + { "scinet", { NULL }, 7708, "tcp" }, + { "scinet", { NULL }, 7708, "udp" }, + { "medimageportal", { NULL }, 7720, "tcp" }, + { "medimageportal", { NULL }, 7720, "udp" }, + { "nsdeepfreezectl", { NULL }, 7724, "tcp" }, + { "nsdeepfreezectl", { NULL }, 7724, "udp" }, + { "nitrogen", { NULL }, 7725, "tcp" }, + { "nitrogen", { NULL }, 7725, "udp" }, + { "freezexservice", { NULL }, 7726, "tcp" }, + { "freezexservice", { NULL }, 7726, "udp" }, + { "trident-data", { NULL }, 7727, "tcp" }, + { "trident-data", { NULL }, 7727, "udp" }, + { "smip", { NULL }, 7734, "tcp" }, + { "smip", { NULL }, 7734, "udp" }, + { "aiagent", { NULL }, 7738, "tcp" }, + { "aiagent", { NULL }, 7738, "udp" }, + { "scriptview", { NULL }, 7741, "tcp" }, + { "scriptview", { NULL }, 7741, "udp" }, + { "msss", { NULL }, 7742, "tcp" }, + { "sstp-1", { NULL }, 7743, "tcp" }, + { "sstp-1", { NULL }, 7743, "udp" }, + { "raqmon-pdu", { NULL }, 7744, "tcp" }, + { "raqmon-pdu", { NULL }, 7744, "udp" }, + { "prgp", { NULL }, 7747, "tcp" }, + { "prgp", { NULL }, 7747, "udp" }, + { "cbt", { NULL }, 7777, "tcp" }, + { "cbt", { NULL }, 7777, "udp" }, + { "interwise", { NULL }, 7778, "tcp" }, + { "interwise", { NULL }, 7778, "udp" }, + { "vstat", { NULL }, 7779, "tcp" }, + { "vstat", { NULL }, 7779, "udp" }, + { "accu-lmgr", { NULL }, 7781, "tcp" }, + { "accu-lmgr", { NULL }, 7781, "udp" }, + { "minivend", { NULL }, 7786, "tcp" }, + { "minivend", { NULL }, 7786, "udp" }, + { "popup-reminders", { NULL }, 7787, "tcp" }, + { "popup-reminders", { NULL }, 7787, "udp" }, + { "office-tools", { NULL }, 7789, "tcp" }, + { "office-tools", { NULL }, 7789, "udp" }, + { "q3ade", { NULL }, 7794, "tcp" }, + { "q3ade", { NULL }, 7794, "udp" }, + { "pnet-conn", { NULL }, 7797, "tcp" }, + { "pnet-conn", { NULL }, 7797, "udp" }, + { "pnet-enc", { NULL }, 7798, "tcp" }, + { "pnet-enc", { NULL }, 7798, "udp" }, + { "altbsdp", { NULL }, 7799, "tcp" }, + { "altbsdp", { NULL }, 7799, "udp" }, + { "asr", { NULL }, 7800, "tcp" }, + { "asr", { NULL }, 7800, "udp" }, + { "ssp-client", { NULL }, 7801, "tcp" }, + { "ssp-client", { NULL }, 7801, "udp" }, + { "rbt-wanopt", { NULL }, 7810, "tcp" }, + { "rbt-wanopt", { NULL }, 7810, "udp" }, + { "apc-7845", { NULL }, 7845, "tcp" }, + { "apc-7845", { NULL }, 7845, "udp" }, + { "apc-7846", { NULL }, 7846, "tcp" }, + { "apc-7846", { NULL }, 7846, "udp" }, + { "mobileanalyzer", { NULL }, 7869, "tcp" }, + { "rbt-smc", { NULL }, 7870, "tcp" }, + { "pss", { NULL }, 7880, "tcp" }, + { "pss", { NULL }, 7880, "udp" }, + { "ubroker", { NULL }, 7887, "tcp" }, + { "ubroker", { NULL }, 7887, "udp" }, + { "mevent", { NULL }, 7900, "tcp" }, + { "mevent", { NULL }, 7900, "udp" }, + { "tnos-sp", { NULL }, 7901, "tcp" }, + { "tnos-sp", { NULL }, 7901, "udp" }, + { "tnos-dp", { NULL }, 7902, "tcp" }, + { "tnos-dp", { NULL }, 7902, "udp" }, + { "tnos-dps", { NULL }, 7903, "tcp" }, + { "tnos-dps", { NULL }, 7903, "udp" }, + { "qo-secure", { NULL }, 7913, "tcp" }, + { "qo-secure", { NULL }, 7913, "udp" }, + { "t2-drm", { NULL }, 7932, "tcp" }, + { "t2-drm", { NULL }, 7932, "udp" }, + { "t2-brm", { NULL }, 7933, "tcp" }, + { "t2-brm", { NULL }, 7933, "udp" }, + { "supercell", { NULL }, 7967, "tcp" }, + { "supercell", { NULL }, 7967, "udp" }, + { "micromuse-ncps", { NULL }, 7979, "tcp" }, + { "micromuse-ncps", { NULL }, 7979, "udp" }, + { "quest-vista", { NULL }, 7980, "tcp" }, + { "quest-vista", { NULL }, 7980, "udp" }, + { "sossd-collect", { NULL }, 7981, "tcp" }, + { "sossd-agent", { NULL }, 7982, "tcp" }, + { "sossd-disc", { NULL }, 7982, "udp" }, + { "pushns", { NULL }, 7997, "tcp" }, + { "usicontentpush", { NULL }, 7998, "udp" }, + { "irdmi2", { NULL }, 7999, "tcp" }, + { "irdmi2", { NULL }, 7999, "udp" }, + { "irdmi", { NULL }, 8000, "tcp" }, + { "irdmi", { NULL }, 8000, "udp" }, + { "vcom-tunnel", { NULL }, 8001, "tcp" }, + { "vcom-tunnel", { NULL }, 8001, "udp" }, + { "teradataordbms", { NULL }, 8002, "tcp" }, + { "teradataordbms", { NULL }, 8002, "udp" }, + { "mcreport", { NULL }, 8003, "tcp" }, + { "mcreport", { NULL }, 8003, "udp" }, + { "mxi", { NULL }, 8005, "tcp" }, + { "mxi", { NULL }, 8005, "udp" }, + { "http-alt", { NULL }, 8008, "tcp" }, + { "http-alt", { NULL }, 8008, "udp" }, + { "qbdb", { NULL }, 8019, "tcp" }, + { "qbdb", { NULL }, 8019, "udp" }, + { "intu-ec-svcdisc", { NULL }, 8020, "tcp" }, + { "intu-ec-svcdisc", { NULL }, 8020, "udp" }, + { "intu-ec-client", { NULL }, 8021, "tcp" }, + { "intu-ec-client", { NULL }, 8021, "udp" }, + { "oa-system", { NULL }, 8022, "tcp" }, + { "oa-system", { NULL }, 8022, "udp" }, + { "ca-audit-da", { NULL }, 8025, "tcp" }, + { "ca-audit-da", { NULL }, 8025, "udp" }, + { "ca-audit-ds", { NULL }, 8026, "tcp" }, + { "ca-audit-ds", { NULL }, 8026, "udp" }, + { "pro-ed", { NULL }, 8032, "tcp" }, + { "pro-ed", { NULL }, 8032, "udp" }, + { "mindprint", { NULL }, 8033, "tcp" }, + { "mindprint", { NULL }, 8033, "udp" }, + { "vantronix-mgmt", { NULL }, 8034, "tcp" }, + { "vantronix-mgmt", { NULL }, 8034, "udp" }, + { "ampify", { NULL }, 8040, "tcp" }, + { "ampify", { NULL }, 8040, "udp" }, + { "fs-agent", { NULL }, 8042, "tcp" }, + { "fs-server", { NULL }, 8043, "tcp" }, + { "fs-mgmt", { NULL }, 8044, "tcp" }, + { "senomix01", { NULL }, 8052, "tcp" }, + { "senomix01", { NULL }, 8052, "udp" }, + { "senomix02", { NULL }, 8053, "tcp" }, + { "senomix02", { NULL }, 8053, "udp" }, + { "senomix03", { NULL }, 8054, "tcp" }, + { "senomix03", { NULL }, 8054, "udp" }, + { "senomix04", { NULL }, 8055, "tcp" }, + { "senomix04", { NULL }, 8055, "udp" }, + { "senomix05", { NULL }, 8056, "tcp" }, + { "senomix05", { NULL }, 8056, "udp" }, + { "senomix06", { NULL }, 8057, "tcp" }, + { "senomix06", { NULL }, 8057, "udp" }, + { "senomix07", { NULL }, 8058, "tcp" }, + { "senomix07", { NULL }, 8058, "udp" }, + { "senomix08", { NULL }, 8059, "tcp" }, + { "senomix08", { NULL }, 8059, "udp" }, + { "gadugadu", { NULL }, 8074, "tcp" }, + { "gadugadu", { NULL }, 8074, "udp" }, + { "http-alt", { NULL }, 8080, "tcp" }, + { "http-alt", { NULL }, 8080, "udp" }, + { "sunproxyadmin", { NULL }, 8081, "tcp" }, + { "sunproxyadmin", { NULL }, 8081, "udp" }, + { "us-cli", { NULL }, 8082, "tcp" }, + { "us-cli", { NULL }, 8082, "udp" }, + { "us-srv", { NULL }, 8083, "tcp" }, + { "us-srv", { NULL }, 8083, "udp" }, + { "d-s-n", { NULL }, 8086, "tcp" }, + { "d-s-n", { NULL }, 8086, "udp" }, + { "simplifymedia", { NULL }, 8087, "tcp" }, + { "simplifymedia", { NULL }, 8087, "udp" }, + { "radan-http", { NULL }, 8088, "tcp" }, + { "radan-http", { NULL }, 8088, "udp" }, + { "jamlink", { NULL }, 8091, "tcp" }, + { "sac", { NULL }, 8097, "tcp" }, + { "sac", { NULL }, 8097, "udp" }, + { "xprint-server", { NULL }, 8100, "tcp" }, + { "xprint-server", { NULL }, 8100, "udp" }, + { "ldoms-migr", { NULL }, 8101, "tcp" }, + { "mtl8000-matrix", { NULL }, 8115, "tcp" }, + { "mtl8000-matrix", { NULL }, 8115, "udp" }, + { "cp-cluster", { NULL }, 8116, "tcp" }, + { "cp-cluster", { NULL }, 8116, "udp" }, + { "privoxy", { NULL }, 8118, "tcp" }, + { "privoxy", { NULL }, 8118, "udp" }, + { "apollo-data", { NULL }, 8121, "tcp" }, + { "apollo-data", { NULL }, 8121, "udp" }, + { "apollo-admin", { NULL }, 8122, "tcp" }, + { "apollo-admin", { NULL }, 8122, "udp" }, + { "paycash-online", { NULL }, 8128, "tcp" }, + { "paycash-online", { NULL }, 8128, "udp" }, + { "paycash-wbp", { NULL }, 8129, "tcp" }, + { "paycash-wbp", { NULL }, 8129, "udp" }, + { "indigo-vrmi", { NULL }, 8130, "tcp" }, + { "indigo-vrmi", { NULL }, 8130, "udp" }, + { "indigo-vbcp", { NULL }, 8131, "tcp" }, + { "indigo-vbcp", { NULL }, 8131, "udp" }, + { "dbabble", { NULL }, 8132, "tcp" }, + { "dbabble", { NULL }, 8132, "udp" }, + { "isdd", { NULL }, 8148, "tcp" }, + { "isdd", { NULL }, 8148, "udp" }, + { "patrol", { NULL }, 8160, "tcp" }, + { "patrol", { NULL }, 8160, "udp" }, + { "patrol-snmp", { NULL }, 8161, "tcp" }, + { "patrol-snmp", { NULL }, 8161, "udp" }, + { "vmware-fdm", { NULL }, 8182, "tcp" }, + { "vmware-fdm", { NULL }, 8182, "udp" }, + { "proremote", { NULL }, 8183, "tcp" }, + { "itach", { NULL }, 8184, "tcp" }, + { "itach", { NULL }, 8184, "udp" }, + { "spytechphone", { NULL }, 8192, "tcp" }, + { "spytechphone", { NULL }, 8192, "udp" }, + { "blp1", { NULL }, 8194, "tcp" }, + { "blp1", { NULL }, 8194, "udp" }, + { "blp2", { NULL }, 8195, "tcp" }, + { "blp2", { NULL }, 8195, "udp" }, + { "vvr-data", { NULL }, 8199, "tcp" }, + { "vvr-data", { NULL }, 8199, "udp" }, + { "trivnet1", { NULL }, 8200, "tcp" }, + { "trivnet1", { NULL }, 8200, "udp" }, + { "trivnet2", { NULL }, 8201, "tcp" }, + { "trivnet2", { NULL }, 8201, "udp" }, + { "lm-perfworks", { NULL }, 8204, "tcp" }, + { "lm-perfworks", { NULL }, 8204, "udp" }, + { "lm-instmgr", { NULL }, 8205, "tcp" }, + { "lm-instmgr", { NULL }, 8205, "udp" }, + { "lm-dta", { NULL }, 8206, "tcp" }, + { "lm-dta", { NULL }, 8206, "udp" }, + { "lm-sserver", { NULL }, 8207, "tcp" }, + { "lm-sserver", { NULL }, 8207, "udp" }, + { "lm-webwatcher", { NULL }, 8208, "tcp" }, + { "lm-webwatcher", { NULL }, 8208, "udp" }, + { "rexecj", { NULL }, 8230, "tcp" }, + { "rexecj", { NULL }, 8230, "udp" }, + { "synapse-nhttps", { NULL }, 8243, "tcp" }, + { "synapse-nhttps", { NULL }, 8243, "udp" }, + { "pando-sec", { NULL }, 8276, "tcp" }, + { "pando-sec", { NULL }, 8276, "udp" }, + { "synapse-nhttp", { NULL }, 8280, "tcp" }, + { "synapse-nhttp", { NULL }, 8280, "udp" }, + { "blp3", { NULL }, 8292, "tcp" }, + { "blp3", { NULL }, 8292, "udp" }, + { "hiperscan-id", { NULL }, 8293, "tcp" }, + { "blp4", { NULL }, 8294, "tcp" }, + { "blp4", { NULL }, 8294, "udp" }, + { "tmi", { NULL }, 8300, "tcp" }, + { "tmi", { NULL }, 8300, "udp" }, + { "amberon", { NULL }, 8301, "tcp" }, + { "amberon", { NULL }, 8301, "udp" }, + { "tnp-discover", { NULL }, 8320, "tcp" }, + { "tnp-discover", { NULL }, 8320, "udp" }, + { "tnp", { NULL }, 8321, "tcp" }, + { "tnp", { NULL }, 8321, "udp" }, + { "server-find", { NULL }, 8351, "tcp" }, + { "server-find", { NULL }, 8351, "udp" }, + { "cruise-enum", { NULL }, 8376, "tcp" }, + { "cruise-enum", { NULL }, 8376, "udp" }, + { "cruise-swroute", { NULL }, 8377, "tcp" }, + { "cruise-swroute", { NULL }, 8377, "udp" }, + { "cruise-config", { NULL }, 8378, "tcp" }, + { "cruise-config", { NULL }, 8378, "udp" }, + { "cruise-diags", { NULL }, 8379, "tcp" }, + { "cruise-diags", { NULL }, 8379, "udp" }, + { "cruise-update", { NULL }, 8380, "tcp" }, + { "cruise-update", { NULL }, 8380, "udp" }, + { "m2mservices", { NULL }, 8383, "tcp" }, + { "m2mservices", { NULL }, 8383, "udp" }, + { "cvd", { NULL }, 8400, "tcp" }, + { "cvd", { NULL }, 8400, "udp" }, + { "sabarsd", { NULL }, 8401, "tcp" }, + { "sabarsd", { NULL }, 8401, "udp" }, + { "abarsd", { NULL }, 8402, "tcp" }, + { "abarsd", { NULL }, 8402, "udp" }, + { "admind", { NULL }, 8403, "tcp" }, + { "admind", { NULL }, 8403, "udp" }, + { "svcloud", { NULL }, 8404, "tcp" }, + { "svbackup", { NULL }, 8405, "tcp" }, + { "espeech", { NULL }, 8416, "tcp" }, + { "espeech", { NULL }, 8416, "udp" }, + { "espeech-rtp", { NULL }, 8417, "tcp" }, + { "espeech-rtp", { NULL }, 8417, "udp" }, + { "cybro-a-bus", { NULL }, 8442, "tcp" }, + { "cybro-a-bus", { NULL }, 8442, "udp" }, + { "pcsync-https", { NULL }, 8443, "tcp" }, + { "pcsync-https", { NULL }, 8443, "udp" }, + { "pcsync-http", { NULL }, 8444, "tcp" }, + { "pcsync-http", { NULL }, 8444, "udp" }, + { "npmp", { NULL }, 8450, "tcp" }, + { "npmp", { NULL }, 8450, "udp" }, + { "cisco-avp", { NULL }, 8470, "tcp" }, + { "pim-port", { NULL }, 8471, "tcp" }, + { "pim-port", { NULL }, 8471, "sctp"}, + { "otv", { NULL }, 8472, "tcp" }, + { "otv", { NULL }, 8472, "udp" }, + { "vp2p", { NULL }, 8473, "tcp" }, + { "vp2p", { NULL }, 8473, "udp" }, + { "noteshare", { NULL }, 8474, "tcp" }, + { "noteshare", { NULL }, 8474, "udp" }, + { "fmtp", { NULL }, 8500, "tcp" }, + { "fmtp", { NULL }, 8500, "udp" }, + { "rtsp-alt", { NULL }, 8554, "tcp" }, + { "rtsp-alt", { NULL }, 8554, "udp" }, + { "d-fence", { NULL }, 8555, "tcp" }, + { "d-fence", { NULL }, 8555, "udp" }, + { "oap-admin", { NULL }, 8567, "tcp" }, + { "oap-admin", { NULL }, 8567, "udp" }, + { "asterix", { NULL }, 8600, "tcp" }, + { "asterix", { NULL }, 8600, "udp" }, + { "canon-mfnp", { NULL }, 8610, "tcp" }, + { "canon-mfnp", { NULL }, 8610, "udp" }, + { "canon-bjnp1", { NULL }, 8611, "tcp" }, + { "canon-bjnp1", { NULL }, 8611, "udp" }, + { "canon-bjnp2", { NULL }, 8612, "tcp" }, + { "canon-bjnp2", { NULL }, 8612, "udp" }, + { "canon-bjnp3", { NULL }, 8613, "tcp" }, + { "canon-bjnp3", { NULL }, 8613, "udp" }, + { "canon-bjnp4", { NULL }, 8614, "tcp" }, + { "canon-bjnp4", { NULL }, 8614, "udp" }, + { "sun-as-jmxrmi", { NULL }, 8686, "tcp" }, + { "sun-as-jmxrmi", { NULL }, 8686, "udp" }, + { "vnyx", { NULL }, 8699, "tcp" }, + { "vnyx", { NULL }, 8699, "udp" }, + { "dtp-net", { NULL }, 8732, "udp" }, + { "ibus", { NULL }, 8733, "tcp" }, + { "ibus", { NULL }, 8733, "udp" }, + { "mc-appserver", { NULL }, 8763, "tcp" }, + { "mc-appserver", { NULL }, 8763, "udp" }, + { "openqueue", { NULL }, 8764, "tcp" }, + { "openqueue", { NULL }, 8764, "udp" }, + { "ultraseek-http", { NULL }, 8765, "tcp" }, + { "ultraseek-http", { NULL }, 8765, "udp" }, + { "dpap", { NULL }, 8770, "tcp" }, + { "dpap", { NULL }, 8770, "udp" }, + { "msgclnt", { NULL }, 8786, "tcp" }, + { "msgclnt", { NULL }, 8786, "udp" }, + { "msgsrvr", { NULL }, 8787, "tcp" }, + { "msgsrvr", { NULL }, 8787, "udp" }, + { "sunwebadmin", { NULL }, 8800, "tcp" }, + { "sunwebadmin", { NULL }, 8800, "udp" }, + { "truecm", { NULL }, 8804, "tcp" }, + { "truecm", { NULL }, 8804, "udp" }, + { "dxspider", { NULL }, 8873, "tcp" }, + { "dxspider", { NULL }, 8873, "udp" }, + { "cddbp-alt", { NULL }, 8880, "tcp" }, + { "cddbp-alt", { NULL }, 8880, "udp" }, + { "secure-mqtt", { NULL }, 8883, "tcp" }, + { "secure-mqtt", { NULL }, 8883, "udp" }, + { "ddi-tcp-1", { NULL }, 8888, "tcp" }, + { "ddi-udp-1", { NULL }, 8888, "udp" }, + { "ddi-tcp-2", { NULL }, 8889, "tcp" }, + { "ddi-udp-2", { NULL }, 8889, "udp" }, + { "ddi-tcp-3", { NULL }, 8890, "tcp" }, + { "ddi-udp-3", { NULL }, 8890, "udp" }, + { "ddi-tcp-4", { NULL }, 8891, "tcp" }, + { "ddi-udp-4", { NULL }, 8891, "udp" }, + { "ddi-tcp-5", { NULL }, 8892, "tcp" }, + { "ddi-udp-5", { NULL }, 8892, "udp" }, + { "ddi-tcp-6", { NULL }, 8893, "tcp" }, + { "ddi-udp-6", { NULL }, 8893, "udp" }, + { "ddi-tcp-7", { NULL }, 8894, "tcp" }, + { "ddi-udp-7", { NULL }, 8894, "udp" }, + { "ospf-lite", { NULL }, 8899, "tcp" }, + { "ospf-lite", { NULL }, 8899, "udp" }, + { "jmb-cds1", { NULL }, 8900, "tcp" }, + { "jmb-cds1", { NULL }, 8900, "udp" }, + { "jmb-cds2", { NULL }, 8901, "tcp" }, + { "jmb-cds2", { NULL }, 8901, "udp" }, + { "manyone-http", { NULL }, 8910, "tcp" }, + { "manyone-http", { NULL }, 8910, "udp" }, + { "manyone-xml", { NULL }, 8911, "tcp" }, + { "manyone-xml", { NULL }, 8911, "udp" }, + { "wcbackup", { NULL }, 8912, "tcp" }, + { "wcbackup", { NULL }, 8912, "udp" }, + { "dragonfly", { NULL }, 8913, "tcp" }, + { "dragonfly", { NULL }, 8913, "udp" }, + { "twds", { NULL }, 8937, "tcp" }, + { "cumulus-admin", { NULL }, 8954, "tcp" }, + { "cumulus-admin", { NULL }, 8954, "udp" }, + { "sunwebadmins", { NULL }, 8989, "tcp" }, + { "sunwebadmins", { NULL }, 8989, "udp" }, + { "http-wmap", { NULL }, 8990, "tcp" }, + { "http-wmap", { NULL }, 8990, "udp" }, + { "https-wmap", { NULL }, 8991, "tcp" }, + { "https-wmap", { NULL }, 8991, "udp" }, + { "bctp", { NULL }, 8999, "tcp" }, + { "bctp", { NULL }, 8999, "udp" }, + { "cslistener", { NULL }, 9000, "tcp" }, + { "cslistener", { NULL }, 9000, "udp" }, + { "etlservicemgr", { NULL }, 9001, "tcp" }, + { "etlservicemgr", { NULL }, 9001, "udp" }, + { "dynamid", { NULL }, 9002, "tcp" }, + { "dynamid", { NULL }, 9002, "udp" }, + { "ogs-client", { NULL }, 9007, "udp" }, + { "ogs-server", { NULL }, 9008, "tcp" }, + { "pichat", { NULL }, 9009, "tcp" }, + { "pichat", { NULL }, 9009, "udp" }, + { "sdr", { NULL }, 9010, "tcp" }, + { "tambora", { NULL }, 9020, "tcp" }, + { "tambora", { NULL }, 9020, "udp" }, + { "panagolin-ident", { NULL }, 9021, "tcp" }, + { "panagolin-ident", { NULL }, 9021, "udp" }, + { "paragent", { NULL }, 9022, "tcp" }, + { "paragent", { NULL }, 9022, "udp" }, + { "swa-1", { NULL }, 9023, "tcp" }, + { "swa-1", { NULL }, 9023, "udp" }, + { "swa-2", { NULL }, 9024, "tcp" }, + { "swa-2", { NULL }, 9024, "udp" }, + { "swa-3", { NULL }, 9025, "tcp" }, + { "swa-3", { NULL }, 9025, "udp" }, + { "swa-4", { NULL }, 9026, "tcp" }, + { "swa-4", { NULL }, 9026, "udp" }, + { "versiera", { NULL }, 9050, "tcp" }, + { "fio-cmgmt", { NULL }, 9051, "tcp" }, + { "glrpc", { NULL }, 9080, "tcp" }, + { "glrpc", { NULL }, 9080, "udp" }, + { "lcs-ap", { NULL }, 9082, "sctp"}, + { "emc-pp-mgmtsvc", { NULL }, 9083, "tcp" }, + { "aurora", { NULL }, 9084, "tcp" }, + { "aurora", { NULL }, 9084, "udp" }, + { "aurora", { NULL }, 9084, "sctp"}, + { "ibm-rsyscon", { NULL }, 9085, "tcp" }, + { "ibm-rsyscon", { NULL }, 9085, "udp" }, + { "net2display", { NULL }, 9086, "tcp" }, + { "net2display", { NULL }, 9086, "udp" }, + { "classic", { NULL }, 9087, "tcp" }, + { "classic", { NULL }, 9087, "udp" }, + { "sqlexec", { NULL }, 9088, "tcp" }, + { "sqlexec", { NULL }, 9088, "udp" }, + { "sqlexec-ssl", { NULL }, 9089, "tcp" }, + { "sqlexec-ssl", { NULL }, 9089, "udp" }, + { "websm", { NULL }, 9090, "tcp" }, + { "websm", { NULL }, 9090, "udp" }, + { "xmltec-xmlmail", { NULL }, 9091, "tcp" }, + { "xmltec-xmlmail", { NULL }, 9091, "udp" }, + { "XmlIpcRegSvc", { NULL }, 9092, "tcp" }, + { "XmlIpcRegSvc", { NULL }, 9092, "udp" }, + { "hp-pdl-datastr", { NULL }, 9100, "tcp" }, + { "hp-pdl-datastr", { NULL }, 9100, "udp" }, + { "pdl-datastream", { NULL }, 9100, "tcp" }, + { "pdl-datastream", { NULL }, 9100, "udp" }, + { "bacula-dir", { NULL }, 9101, "tcp" }, + { "bacula-dir", { NULL }, 9101, "udp" }, + { "bacula-fd", { NULL }, 9102, "tcp" }, + { "bacula-fd", { NULL }, 9102, "udp" }, + { "bacula-sd", { NULL }, 9103, "tcp" }, + { "bacula-sd", { NULL }, 9103, "udp" }, + { "peerwire", { NULL }, 9104, "tcp" }, + { "peerwire", { NULL }, 9104, "udp" }, + { "xadmin", { NULL }, 9105, "tcp" }, + { "xadmin", { NULL }, 9105, "udp" }, + { "astergate", { NULL }, 9106, "tcp" }, + { "astergate-disc", { NULL }, 9106, "udp" }, + { "astergatefax", { NULL }, 9107, "tcp" }, + { "mxit", { NULL }, 9119, "tcp" }, + { "mxit", { NULL }, 9119, "udp" }, + { "dddp", { NULL }, 9131, "tcp" }, + { "dddp", { NULL }, 9131, "udp" }, + { "apani1", { NULL }, 9160, "tcp" }, + { "apani1", { NULL }, 9160, "udp" }, + { "apani2", { NULL }, 9161, "tcp" }, + { "apani2", { NULL }, 9161, "udp" }, + { "apani3", { NULL }, 9162, "tcp" }, + { "apani3", { NULL }, 9162, "udp" }, + { "apani4", { NULL }, 9163, "tcp" }, + { "apani4", { NULL }, 9163, "udp" }, + { "apani5", { NULL }, 9164, "tcp" }, + { "apani5", { NULL }, 9164, "udp" }, + { "sun-as-jpda", { NULL }, 9191, "tcp" }, + { "sun-as-jpda", { NULL }, 9191, "udp" }, + { "wap-wsp", { NULL }, 9200, "tcp" }, + { "wap-wsp", { NULL }, 9200, "udp" }, + { "wap-wsp-wtp", { NULL }, 9201, "tcp" }, + { "wap-wsp-wtp", { NULL }, 9201, "udp" }, + { "wap-wsp-s", { NULL }, 9202, "tcp" }, + { "wap-wsp-s", { NULL }, 9202, "udp" }, + { "wap-wsp-wtp-s", { NULL }, 9203, "tcp" }, + { "wap-wsp-wtp-s", { NULL }, 9203, "udp" }, + { "wap-vcard", { NULL }, 9204, "tcp" }, + { "wap-vcard", { NULL }, 9204, "udp" }, + { "wap-vcal", { NULL }, 9205, "tcp" }, + { "wap-vcal", { NULL }, 9205, "udp" }, + { "wap-vcard-s", { NULL }, 9206, "tcp" }, + { "wap-vcard-s", { NULL }, 9206, "udp" }, + { "wap-vcal-s", { NULL }, 9207, "tcp" }, + { "wap-vcal-s", { NULL }, 9207, "udp" }, + { "rjcdb-vcards", { NULL }, 9208, "tcp" }, + { "rjcdb-vcards", { NULL }, 9208, "udp" }, + { "almobile-system", { NULL }, 9209, "tcp" }, + { "almobile-system", { NULL }, 9209, "udp" }, + { "oma-mlp", { NULL }, 9210, "tcp" }, + { "oma-mlp", { NULL }, 9210, "udp" }, + { "oma-mlp-s", { NULL }, 9211, "tcp" }, + { "oma-mlp-s", { NULL }, 9211, "udp" }, + { "serverviewdbms", { NULL }, 9212, "tcp" }, + { "serverviewdbms", { NULL }, 9212, "udp" }, + { "serverstart", { NULL }, 9213, "tcp" }, + { "serverstart", { NULL }, 9213, "udp" }, + { "ipdcesgbs", { NULL }, 9214, "tcp" }, + { "ipdcesgbs", { NULL }, 9214, "udp" }, + { "insis", { NULL }, 9215, "tcp" }, + { "insis", { NULL }, 9215, "udp" }, + { "acme", { NULL }, 9216, "tcp" }, + { "acme", { NULL }, 9216, "udp" }, + { "fsc-port", { NULL }, 9217, "tcp" }, + { "fsc-port", { NULL }, 9217, "udp" }, + { "teamcoherence", { NULL }, 9222, "tcp" }, + { "teamcoherence", { NULL }, 9222, "udp" }, + { "mon", { NULL }, 9255, "tcp" }, + { "mon", { NULL }, 9255, "udp" }, + { "pegasus", { NULL }, 9278, "tcp" }, + { "pegasus", { NULL }, 9278, "udp" }, + { "pegasus-ctl", { NULL }, 9279, "tcp" }, + { "pegasus-ctl", { NULL }, 9279, "udp" }, + { "pgps", { NULL }, 9280, "tcp" }, + { "pgps", { NULL }, 9280, "udp" }, + { "swtp-port1", { NULL }, 9281, "tcp" }, + { "swtp-port1", { NULL }, 9281, "udp" }, + { "swtp-port2", { NULL }, 9282, "tcp" }, + { "swtp-port2", { NULL }, 9282, "udp" }, + { "callwaveiam", { NULL }, 9283, "tcp" }, + { "callwaveiam", { NULL }, 9283, "udp" }, + { "visd", { NULL }, 9284, "tcp" }, + { "visd", { NULL }, 9284, "udp" }, + { "n2h2server", { NULL }, 9285, "tcp" }, + { "n2h2server", { NULL }, 9285, "udp" }, + { "n2receive", { NULL }, 9286, "udp" }, + { "cumulus", { NULL }, 9287, "tcp" }, + { "cumulus", { NULL }, 9287, "udp" }, + { "armtechdaemon", { NULL }, 9292, "tcp" }, + { "armtechdaemon", { NULL }, 9292, "udp" }, + { "storview", { NULL }, 9293, "tcp" }, + { "storview", { NULL }, 9293, "udp" }, + { "armcenterhttp", { NULL }, 9294, "tcp" }, + { "armcenterhttp", { NULL }, 9294, "udp" }, + { "armcenterhttps", { NULL }, 9295, "tcp" }, + { "armcenterhttps", { NULL }, 9295, "udp" }, + { "vrace", { NULL }, 9300, "tcp" }, + { "vrace", { NULL }, 9300, "udp" }, + { "sphinxql", { NULL }, 9306, "tcp" }, + { "sphinxapi", { NULL }, 9312, "tcp" }, + { "secure-ts", { NULL }, 9318, "tcp" }, + { "secure-ts", { NULL }, 9318, "udp" }, + { "guibase", { NULL }, 9321, "tcp" }, + { "guibase", { NULL }, 9321, "udp" }, + { "mpidcmgr", { NULL }, 9343, "tcp" }, + { "mpidcmgr", { NULL }, 9343, "udp" }, + { "mphlpdmc", { NULL }, 9344, "tcp" }, + { "mphlpdmc", { NULL }, 9344, "udp" }, + { "ctechlicensing", { NULL }, 9346, "tcp" }, + { "ctechlicensing", { NULL }, 9346, "udp" }, + { "fjdmimgr", { NULL }, 9374, "tcp" }, + { "fjdmimgr", { NULL }, 9374, "udp" }, + { "boxp", { NULL }, 9380, "tcp" }, + { "boxp", { NULL }, 9380, "udp" }, + { "d2dconfig", { NULL }, 9387, "tcp" }, + { "d2ddatatrans", { NULL }, 9388, "tcp" }, + { "adws", { NULL }, 9389, "tcp" }, + { "otp", { NULL }, 9390, "tcp" }, + { "fjinvmgr", { NULL }, 9396, "tcp" }, + { "fjinvmgr", { NULL }, 9396, "udp" }, + { "mpidcagt", { NULL }, 9397, "tcp" }, + { "mpidcagt", { NULL }, 9397, "udp" }, + { "sec-t4net-srv", { NULL }, 9400, "tcp" }, + { "sec-t4net-srv", { NULL }, 9400, "udp" }, + { "sec-t4net-clt", { NULL }, 9401, "tcp" }, + { "sec-t4net-clt", { NULL }, 9401, "udp" }, + { "sec-pc2fax-srv", { NULL }, 9402, "tcp" }, + { "sec-pc2fax-srv", { NULL }, 9402, "udp" }, + { "git", { NULL }, 9418, "tcp" }, + { "git", { NULL }, 9418, "udp" }, + { "tungsten-https", { NULL }, 9443, "tcp" }, + { "tungsten-https", { NULL }, 9443, "udp" }, + { "wso2esb-console", { NULL }, 9444, "tcp" }, + { "wso2esb-console", { NULL }, 9444, "udp" }, + { "sntlkeyssrvr", { NULL }, 9450, "tcp" }, + { "sntlkeyssrvr", { NULL }, 9450, "udp" }, + { "ismserver", { NULL }, 9500, "tcp" }, + { "ismserver", { NULL }, 9500, "udp" }, + { "sma-spw", { NULL }, 9522, "udp" }, + { "mngsuite", { NULL }, 9535, "tcp" }, + { "mngsuite", { NULL }, 9535, "udp" }, + { "laes-bf", { NULL }, 9536, "tcp" }, + { "laes-bf", { NULL }, 9536, "udp" }, + { "trispen-sra", { NULL }, 9555, "tcp" }, + { "trispen-sra", { NULL }, 9555, "udp" }, + { "ldgateway", { NULL }, 9592, "tcp" }, + { "ldgateway", { NULL }, 9592, "udp" }, + { "cba8", { NULL }, 9593, "tcp" }, + { "cba8", { NULL }, 9593, "udp" }, + { "msgsys", { NULL }, 9594, "tcp" }, + { "msgsys", { NULL }, 9594, "udp" }, + { "pds", { NULL }, 9595, "tcp" }, + { "pds", { NULL }, 9595, "udp" }, + { "mercury-disc", { NULL }, 9596, "tcp" }, + { "mercury-disc", { NULL }, 9596, "udp" }, + { "pd-admin", { NULL }, 9597, "tcp" }, + { "pd-admin", { NULL }, 9597, "udp" }, + { "vscp", { NULL }, 9598, "tcp" }, + { "vscp", { NULL }, 9598, "udp" }, + { "robix", { NULL }, 9599, "tcp" }, + { "robix", { NULL }, 9599, "udp" }, + { "micromuse-ncpw", { NULL }, 9600, "tcp" }, + { "micromuse-ncpw", { NULL }, 9600, "udp" }, + { "streamcomm-ds", { NULL }, 9612, "tcp" }, + { "streamcomm-ds", { NULL }, 9612, "udp" }, + { "iadt-tls", { NULL }, 9614, "tcp" }, + { "erunbook_agent", { NULL }, 9616, "tcp" }, + { "erunbook_server", { NULL }, 9617, "tcp" }, + { "condor", { NULL }, 9618, "tcp" }, + { "condor", { NULL }, 9618, "udp" }, + { "odbcpathway", { NULL }, 9628, "tcp" }, + { "odbcpathway", { NULL }, 9628, "udp" }, + { "uniport", { NULL }, 9629, "tcp" }, + { "uniport", { NULL }, 9629, "udp" }, + { "peoctlr", { NULL }, 9630, "tcp" }, + { "peocoll", { NULL }, 9631, "tcp" }, + { "mc-comm", { NULL }, 9632, "udp" }, + { "pqsflows", { NULL }, 9640, "tcp" }, + { "xmms2", { NULL }, 9667, "tcp" }, + { "xmms2", { NULL }, 9667, "udp" }, + { "tec5-sdctp", { NULL }, 9668, "tcp" }, + { "tec5-sdctp", { NULL }, 9668, "udp" }, + { "client-wakeup", { NULL }, 9694, "tcp" }, + { "client-wakeup", { NULL }, 9694, "udp" }, + { "ccnx", { NULL }, 9695, "tcp" }, + { "ccnx", { NULL }, 9695, "udp" }, + { "board-roar", { NULL }, 9700, "tcp" }, + { "board-roar", { NULL }, 9700, "udp" }, + { "l5nas-parchan", { NULL }, 9747, "tcp" }, + { "l5nas-parchan", { NULL }, 9747, "udp" }, + { "board-voip", { NULL }, 9750, "tcp" }, + { "board-voip", { NULL }, 9750, "udp" }, + { "rasadv", { NULL }, 9753, "tcp" }, + { "rasadv", { NULL }, 9753, "udp" }, + { "tungsten-http", { NULL }, 9762, "tcp" }, + { "tungsten-http", { NULL }, 9762, "udp" }, + { "davsrc", { NULL }, 9800, "tcp" }, + { "davsrc", { NULL }, 9800, "udp" }, + { "sstp-2", { NULL }, 9801, "tcp" }, + { "sstp-2", { NULL }, 9801, "udp" }, + { "davsrcs", { NULL }, 9802, "tcp" }, + { "davsrcs", { NULL }, 9802, "udp" }, + { "sapv1", { NULL }, 9875, "tcp" }, + { "sapv1", { NULL }, 9875, "udp" }, + { "sd", { NULL }, 9876, "tcp" }, + { "sd", { NULL }, 9876, "udp" }, + { "cyborg-systems", { NULL }, 9888, "tcp" }, + { "cyborg-systems", { NULL }, 9888, "udp" }, + { "gt-proxy", { NULL }, 9889, "tcp" }, + { "gt-proxy", { NULL }, 9889, "udp" }, + { "monkeycom", { NULL }, 9898, "tcp" }, + { "monkeycom", { NULL }, 9898, "udp" }, + { "sctp-tunneling", { NULL }, 9899, "tcp" }, + { "sctp-tunneling", { NULL }, 9899, "udp" }, + { "iua", { NULL }, 9900, "tcp" }, + { "iua", { NULL }, 9900, "udp" }, + { "iua", { NULL }, 9900, "sctp"}, + { "enrp", { NULL }, 9901, "udp" }, + { "enrp-sctp", { NULL }, 9901, "sctp"}, + { "enrp-sctp-tls", { NULL }, 9902, "sctp"}, + { "domaintime", { NULL }, 9909, "tcp" }, + { "domaintime", { NULL }, 9909, "udp" }, + { "sype-transport", { NULL }, 9911, "tcp" }, + { "sype-transport", { NULL }, 9911, "udp" }, + { "apc-9950", { NULL }, 9950, "tcp" }, + { "apc-9950", { NULL }, 9950, "udp" }, + { "apc-9951", { NULL }, 9951, "tcp" }, + { "apc-9951", { NULL }, 9951, "udp" }, + { "apc-9952", { NULL }, 9952, "tcp" }, + { "apc-9952", { NULL }, 9952, "udp" }, + { "acis", { NULL }, 9953, "tcp" }, + { "acis", { NULL }, 9953, "udp" }, + { "odnsp", { NULL }, 9966, "tcp" }, + { "odnsp", { NULL }, 9966, "udp" }, + { "dsm-scm-target", { NULL }, 9987, "tcp" }, + { "dsm-scm-target", { NULL }, 9987, "udp" }, + { "nsesrvr", { NULL }, 9988, "tcp" }, + { "osm-appsrvr", { NULL }, 9990, "tcp" }, + { "osm-appsrvr", { NULL }, 9990, "udp" }, + { "osm-oev", { NULL }, 9991, "tcp" }, + { "osm-oev", { NULL }, 9991, "udp" }, + { "palace-1", { NULL }, 9992, "tcp" }, + { "palace-1", { NULL }, 9992, "udp" }, + { "palace-2", { NULL }, 9993, "tcp" }, + { "palace-2", { NULL }, 9993, "udp" }, + { "palace-3", { NULL }, 9994, "tcp" }, + { "palace-3", { NULL }, 9994, "udp" }, + { "palace-4", { NULL }, 9995, "tcp" }, + { "palace-4", { NULL }, 9995, "udp" }, + { "palace-5", { NULL }, 9996, "tcp" }, + { "palace-5", { NULL }, 9996, "udp" }, + { "palace-6", { NULL }, 9997, "tcp" }, + { "palace-6", { NULL }, 9997, "udp" }, + { "distinct32", { NULL }, 9998, "tcp" }, + { "distinct32", { NULL }, 9998, "udp" }, + { "distinct", { NULL }, 9999, "tcp" }, + { "distinct", { NULL }, 9999, "udp" }, + { "ndmp", { NULL }, 10000, "tcp" }, + { "ndmp", { NULL }, 10000, "udp" }, + { "scp-config", { NULL }, 10001, "tcp" }, + { "scp-config", { NULL }, 10001, "udp" }, + { "documentum", { NULL }, 10002, "tcp" }, + { "documentum", { NULL }, 10002, "udp" }, + { "documentum_s", { NULL }, 10003, "tcp" }, + { "documentum_s", { NULL }, 10003, "udp" }, + { "emcrmirccd", { NULL }, 10004, "tcp" }, + { "emcrmird", { NULL }, 10005, "tcp" }, + { "mvs-capacity", { NULL }, 10007, "tcp" }, + { "mvs-capacity", { NULL }, 10007, "udp" }, + { "octopus", { NULL }, 10008, "tcp" }, + { "octopus", { NULL }, 10008, "udp" }, + { "swdtp-sv", { NULL }, 10009, "tcp" }, + { "swdtp-sv", { NULL }, 10009, "udp" }, + { "rxapi", { NULL }, 10010, "tcp" }, + { "zabbix-agent", { NULL }, 10050, "tcp" }, + { "zabbix-agent", { NULL }, 10050, "udp" }, + { "zabbix-trapper", { NULL }, 10051, "tcp" }, + { "zabbix-trapper", { NULL }, 10051, "udp" }, + { "qptlmd", { NULL }, 10055, "tcp" }, + { "amanda", { NULL }, 10080, "tcp" }, + { "amanda", { NULL }, 10080, "udp" }, + { "famdc", { NULL }, 10081, "tcp" }, + { "famdc", { NULL }, 10081, "udp" }, + { "itap-ddtp", { NULL }, 10100, "tcp" }, + { "itap-ddtp", { NULL }, 10100, "udp" }, + { "ezmeeting-2", { NULL }, 10101, "tcp" }, + { "ezmeeting-2", { NULL }, 10101, "udp" }, + { "ezproxy-2", { NULL }, 10102, "tcp" }, + { "ezproxy-2", { NULL }, 10102, "udp" }, + { "ezrelay", { NULL }, 10103, "tcp" }, + { "ezrelay", { NULL }, 10103, "udp" }, + { "swdtp", { NULL }, 10104, "tcp" }, + { "swdtp", { NULL }, 10104, "udp" }, + { "bctp-server", { NULL }, 10107, "tcp" }, + { "bctp-server", { NULL }, 10107, "udp" }, + { "nmea-0183", { NULL }, 10110, "tcp" }, + { "nmea-0183", { NULL }, 10110, "udp" }, + { "netiq-endpoint", { NULL }, 10113, "tcp" }, + { "netiq-endpoint", { NULL }, 10113, "udp" }, + { "netiq-qcheck", { NULL }, 10114, "tcp" }, + { "netiq-qcheck", { NULL }, 10114, "udp" }, + { "netiq-endpt", { NULL }, 10115, "tcp" }, + { "netiq-endpt", { NULL }, 10115, "udp" }, + { "netiq-voipa", { NULL }, 10116, "tcp" }, + { "netiq-voipa", { NULL }, 10116, "udp" }, + { "iqrm", { NULL }, 10117, "tcp" }, + { "iqrm", { NULL }, 10117, "udp" }, + { "bmc-perf-sd", { NULL }, 10128, "tcp" }, + { "bmc-perf-sd", { NULL }, 10128, "udp" }, + { "bmc-gms", { NULL }, 10129, "tcp" }, + { "qb-db-server", { NULL }, 10160, "tcp" }, + { "qb-db-server", { NULL }, 10160, "udp" }, + { "snmptls", { NULL }, 10161, "tcp" }, + { "snmpdtls", { NULL }, 10161, "udp" }, + { "snmptls-trap", { NULL }, 10162, "tcp" }, + { "snmpdtls-trap", { NULL }, 10162, "udp" }, + { "trisoap", { NULL }, 10200, "tcp" }, + { "trisoap", { NULL }, 10200, "udp" }, + { "rsms", { NULL }, 10201, "tcp" }, + { "rscs", { NULL }, 10201, "udp" }, + { "apollo-relay", { NULL }, 10252, "tcp" }, + { "apollo-relay", { NULL }, 10252, "udp" }, + { "axis-wimp-port", { NULL }, 10260, "tcp" }, + { "axis-wimp-port", { NULL }, 10260, "udp" }, + { "blocks", { NULL }, 10288, "tcp" }, + { "blocks", { NULL }, 10288, "udp" }, + { "cosir", { NULL }, 10321, "tcp" }, + { "hip-nat-t", { NULL }, 10500, "udp" }, + { "MOS-lower", { NULL }, 10540, "tcp" }, + { "MOS-lower", { NULL }, 10540, "udp" }, + { "MOS-upper", { NULL }, 10541, "tcp" }, + { "MOS-upper", { NULL }, 10541, "udp" }, + { "MOS-aux", { NULL }, 10542, "tcp" }, + { "MOS-aux", { NULL }, 10542, "udp" }, + { "MOS-soap", { NULL }, 10543, "tcp" }, + { "MOS-soap", { NULL }, 10543, "udp" }, + { "MOS-soap-opt", { NULL }, 10544, "tcp" }, + { "MOS-soap-opt", { NULL }, 10544, "udp" }, + { "gap", { NULL }, 10800, "tcp" }, + { "gap", { NULL }, 10800, "udp" }, + { "lpdg", { NULL }, 10805, "tcp" }, + { "lpdg", { NULL }, 10805, "udp" }, + { "nbd", { NULL }, 10809, "tcp" }, + { "nmc-disc", { NULL }, 10810, "udp" }, + { "helix", { NULL }, 10860, "tcp" }, + { "helix", { NULL }, 10860, "udp" }, + { "rmiaux", { NULL }, 10990, "tcp" }, + { "rmiaux", { NULL }, 10990, "udp" }, + { "irisa", { NULL }, 11000, "tcp" }, + { "irisa", { NULL }, 11000, "udp" }, + { "metasys", { NULL }, 11001, "tcp" }, + { "metasys", { NULL }, 11001, "udp" }, + { "netapp-icmgmt", { NULL }, 11104, "tcp" }, + { "netapp-icdata", { NULL }, 11105, "tcp" }, + { "sgi-lk", { NULL }, 11106, "tcp" }, + { "sgi-lk", { NULL }, 11106, "udp" }, + { "vce", { NULL }, 11111, "tcp" }, + { "vce", { NULL }, 11111, "udp" }, + { "dicom", { NULL }, 11112, "tcp" }, + { "dicom", { NULL }, 11112, "udp" }, + { "suncacao-snmp", { NULL }, 11161, "tcp" }, + { "suncacao-snmp", { NULL }, 11161, "udp" }, + { "suncacao-jmxmp", { NULL }, 11162, "tcp" }, + { "suncacao-jmxmp", { NULL }, 11162, "udp" }, + { "suncacao-rmi", { NULL }, 11163, "tcp" }, + { "suncacao-rmi", { NULL }, 11163, "udp" }, + { "suncacao-csa", { NULL }, 11164, "tcp" }, + { "suncacao-csa", { NULL }, 11164, "udp" }, + { "suncacao-websvc", { NULL }, 11165, "tcp" }, + { "suncacao-websvc", { NULL }, 11165, "udp" }, + { "snss", { NULL }, 11171, "udp" }, + { "oemcacao-jmxmp", { NULL }, 11172, "tcp" }, + { "oemcacao-rmi", { NULL }, 11174, "tcp" }, + { "oemcacao-websvc", { NULL }, 11175, "tcp" }, + { "smsqp", { NULL }, 11201, "tcp" }, + { "smsqp", { NULL }, 11201, "udp" }, + { "wifree", { NULL }, 11208, "tcp" }, + { "wifree", { NULL }, 11208, "udp" }, + { "memcache", { NULL }, 11211, "tcp" }, + { "memcache", { NULL }, 11211, "udp" }, + { "imip", { NULL }, 11319, "tcp" }, + { "imip", { NULL }, 11319, "udp" }, + { "imip-channels", { NULL }, 11320, "tcp" }, + { "imip-channels", { NULL }, 11320, "udp" }, + { "arena-server", { NULL }, 11321, "tcp" }, + { "arena-server", { NULL }, 11321, "udp" }, + { "atm-uhas", { NULL }, 11367, "tcp" }, + { "atm-uhas", { NULL }, 11367, "udp" }, + { "hkp", { NULL }, 11371, "tcp" }, + { "hkp", { NULL }, 11371, "udp" }, + { "asgcypresstcps", { NULL }, 11489, "tcp" }, + { "tempest-port", { NULL }, 11600, "tcp" }, + { "tempest-port", { NULL }, 11600, "udp" }, + { "h323callsigalt", { NULL }, 11720, "tcp" }, + { "h323callsigalt", { NULL }, 11720, "udp" }, + { "intrepid-ssl", { NULL }, 11751, "tcp" }, + { "intrepid-ssl", { NULL }, 11751, "udp" }, + { "xoraya", { NULL }, 11876, "tcp" }, + { "xoraya", { NULL }, 11876, "udp" }, + { "x2e-disc", { NULL }, 11877, "udp" }, + { "sysinfo-sp", { NULL }, 11967, "tcp" }, + { "sysinfo-sp", { NULL }, 11967, "udp" }, + { "wmereceiving", { NULL }, 11997, "sctp"}, + { "wmedistribution", { NULL }, 11998, "sctp"}, + { "wmereporting", { NULL }, 11999, "sctp"}, + { "entextxid", { NULL }, 12000, "tcp" }, + { "entextxid", { NULL }, 12000, "udp" }, + { "entextnetwk", { NULL }, 12001, "tcp" }, + { "entextnetwk", { NULL }, 12001, "udp" }, + { "entexthigh", { NULL }, 12002, "tcp" }, + { "entexthigh", { NULL }, 12002, "udp" }, + { "entextmed", { NULL }, 12003, "tcp" }, + { "entextmed", { NULL }, 12003, "udp" }, + { "entextlow", { NULL }, 12004, "tcp" }, + { "entextlow", { NULL }, 12004, "udp" }, + { "dbisamserver1", { NULL }, 12005, "tcp" }, + { "dbisamserver1", { NULL }, 12005, "udp" }, + { "dbisamserver2", { NULL }, 12006, "tcp" }, + { "dbisamserver2", { NULL }, 12006, "udp" }, + { "accuracer", { NULL }, 12007, "tcp" }, + { "accuracer", { NULL }, 12007, "udp" }, + { "accuracer-dbms", { NULL }, 12008, "tcp" }, + { "accuracer-dbms", { NULL }, 12008, "udp" }, + { "edbsrvr", { NULL }, 12010, "tcp" }, + { "vipera", { NULL }, 12012, "tcp" }, + { "vipera", { NULL }, 12012, "udp" }, + { "vipera-ssl", { NULL }, 12013, "tcp" }, + { "vipera-ssl", { NULL }, 12013, "udp" }, + { "rets-ssl", { NULL }, 12109, "tcp" }, + { "rets-ssl", { NULL }, 12109, "udp" }, + { "nupaper-ss", { NULL }, 12121, "tcp" }, + { "nupaper-ss", { NULL }, 12121, "udp" }, + { "cawas", { NULL }, 12168, "tcp" }, + { "cawas", { NULL }, 12168, "udp" }, + { "hivep", { NULL }, 12172, "tcp" }, + { "hivep", { NULL }, 12172, "udp" }, + { "linogridengine", { NULL }, 12300, "tcp" }, + { "linogridengine", { NULL }, 12300, "udp" }, + { "warehouse-sss", { NULL }, 12321, "tcp" }, + { "warehouse-sss", { NULL }, 12321, "udp" }, + { "warehouse", { NULL }, 12322, "tcp" }, + { "warehouse", { NULL }, 12322, "udp" }, + { "italk", { NULL }, 12345, "tcp" }, + { "italk", { NULL }, 12345, "udp" }, + { "tsaf", { NULL }, 12753, "tcp" }, + { "tsaf", { NULL }, 12753, "udp" }, + { "i-zipqd", { NULL }, 13160, "tcp" }, + { "i-zipqd", { NULL }, 13160, "udp" }, + { "bcslogc", { NULL }, 13216, "tcp" }, + { "bcslogc", { NULL }, 13216, "udp" }, + { "rs-pias", { NULL }, 13217, "tcp" }, + { "rs-pias", { NULL }, 13217, "udp" }, + { "emc-vcas-tcp", { NULL }, 13218, "tcp" }, + { "emc-vcas-udp", { NULL }, 13218, "udp" }, + { "powwow-client", { NULL }, 13223, "tcp" }, + { "powwow-client", { NULL }, 13223, "udp" }, + { "powwow-server", { NULL }, 13224, "tcp" }, + { "powwow-server", { NULL }, 13224, "udp" }, + { "doip-data", { NULL }, 13400, "tcp" }, + { "doip-disc", { NULL }, 13400, "udp" }, + { "bprd", { NULL }, 13720, "tcp" }, + { "bprd", { NULL }, 13720, "udp" }, + { "bpdbm", { NULL }, 13721, "tcp" }, + { "bpdbm", { NULL }, 13721, "udp" }, + { "bpjava-msvc", { NULL }, 13722, "tcp" }, + { "bpjava-msvc", { NULL }, 13722, "udp" }, + { "vnetd", { NULL }, 13724, "tcp" }, + { "vnetd", { NULL }, 13724, "udp" }, + { "bpcd", { NULL }, 13782, "tcp" }, + { "bpcd", { NULL }, 13782, "udp" }, + { "vopied", { NULL }, 13783, "tcp" }, + { "vopied", { NULL }, 13783, "udp" }, + { "nbdb", { NULL }, 13785, "tcp" }, + { "nbdb", { NULL }, 13785, "udp" }, + { "nomdb", { NULL }, 13786, "tcp" }, + { "nomdb", { NULL }, 13786, "udp" }, + { "dsmcc-config", { NULL }, 13818, "tcp" }, + { "dsmcc-config", { NULL }, 13818, "udp" }, + { "dsmcc-session", { NULL }, 13819, "tcp" }, + { "dsmcc-session", { NULL }, 13819, "udp" }, + { "dsmcc-passthru", { NULL }, 13820, "tcp" }, + { "dsmcc-passthru", { NULL }, 13820, "udp" }, + { "dsmcc-download", { NULL }, 13821, "tcp" }, + { "dsmcc-download", { NULL }, 13821, "udp" }, + { "dsmcc-ccp", { NULL }, 13822, "tcp" }, + { "dsmcc-ccp", { NULL }, 13822, "udp" }, + { "bmdss", { NULL }, 13823, "tcp" }, + { "dta-systems", { NULL }, 13929, "tcp" }, + { "dta-systems", { NULL }, 13929, "udp" }, + { "medevolve", { NULL }, 13930, "tcp" }, + { "scotty-ft", { NULL }, 14000, "tcp" }, + { "scotty-ft", { NULL }, 14000, "udp" }, + { "sua", { NULL }, 14001, "tcp" }, + { "sua", { NULL }, 14001, "udp" }, + { "sua", { NULL }, 14001, "sctp"}, + { "sage-best-com1", { NULL }, 14033, "tcp" }, + { "sage-best-com1", { NULL }, 14033, "udp" }, + { "sage-best-com2", { NULL }, 14034, "tcp" }, + { "sage-best-com2", { NULL }, 14034, "udp" }, + { "vcs-app", { NULL }, 14141, "tcp" }, + { "vcs-app", { NULL }, 14141, "udp" }, + { "icpp", { NULL }, 14142, "tcp" }, + { "icpp", { NULL }, 14142, "udp" }, + { "gcm-app", { NULL }, 14145, "tcp" }, + { "gcm-app", { NULL }, 14145, "udp" }, + { "vrts-tdd", { NULL }, 14149, "tcp" }, + { "vrts-tdd", { NULL }, 14149, "udp" }, + { "vcscmd", { NULL }, 14150, "tcp" }, + { "vad", { NULL }, 14154, "tcp" }, + { "vad", { NULL }, 14154, "udp" }, + { "cps", { NULL }, 14250, "tcp" }, + { "cps", { NULL }, 14250, "udp" }, + { "ca-web-update", { NULL }, 14414, "tcp" }, + { "ca-web-update", { NULL }, 14414, "udp" }, + { "hde-lcesrvr-1", { NULL }, 14936, "tcp" }, + { "hde-lcesrvr-1", { NULL }, 14936, "udp" }, + { "hde-lcesrvr-2", { NULL }, 14937, "tcp" }, + { "hde-lcesrvr-2", { NULL }, 14937, "udp" }, + { "hydap", { NULL }, 15000, "tcp" }, + { "hydap", { NULL }, 15000, "udp" }, + { "xpilot", { NULL }, 15345, "tcp" }, + { "xpilot", { NULL }, 15345, "udp" }, + { "3link", { NULL }, 15363, "tcp" }, + { "3link", { NULL }, 15363, "udp" }, + { "cisco-snat", { NULL }, 15555, "tcp" }, + { "cisco-snat", { NULL }, 15555, "udp" }, + { "bex-xr", { NULL }, 15660, "tcp" }, + { "bex-xr", { NULL }, 15660, "udp" }, + { "ptp", { NULL }, 15740, "tcp" }, + { "ptp", { NULL }, 15740, "udp" }, + { "2ping", { NULL }, 15998, "udp" }, + { "programmar", { NULL }, 15999, "tcp" }, + { "fmsas", { NULL }, 16000, "tcp" }, + { "fmsascon", { NULL }, 16001, "tcp" }, + { "gsms", { NULL }, 16002, "tcp" }, + { "alfin", { NULL }, 16003, "udp" }, + { "jwpc", { NULL }, 16020, "tcp" }, + { "jwpc-bin", { NULL }, 16021, "tcp" }, + { "sun-sea-port", { NULL }, 16161, "tcp" }, + { "sun-sea-port", { NULL }, 16161, "udp" }, + { "solaris-audit", { NULL }, 16162, "tcp" }, + { "etb4j", { NULL }, 16309, "tcp" }, + { "etb4j", { NULL }, 16309, "udp" }, + { "pduncs", { NULL }, 16310, "tcp" }, + { "pduncs", { NULL }, 16310, "udp" }, + { "pdefmns", { NULL }, 16311, "tcp" }, + { "pdefmns", { NULL }, 16311, "udp" }, + { "netserialext1", { NULL }, 16360, "tcp" }, + { "netserialext1", { NULL }, 16360, "udp" }, + { "netserialext2", { NULL }, 16361, "tcp" }, + { "netserialext2", { NULL }, 16361, "udp" }, + { "netserialext3", { NULL }, 16367, "tcp" }, + { "netserialext3", { NULL }, 16367, "udp" }, + { "netserialext4", { NULL }, 16368, "tcp" }, + { "netserialext4", { NULL }, 16368, "udp" }, + { "connected", { NULL }, 16384, "tcp" }, + { "connected", { NULL }, 16384, "udp" }, + { "xoms", { NULL }, 16619, "tcp" }, + { "newbay-snc-mc", { NULL }, 16900, "tcp" }, + { "newbay-snc-mc", { NULL }, 16900, "udp" }, + { "sgcip", { NULL }, 16950, "tcp" }, + { "sgcip", { NULL }, 16950, "udp" }, + { "intel-rci-mp", { NULL }, 16991, "tcp" }, + { "intel-rci-mp", { NULL }, 16991, "udp" }, + { "amt-soap-http", { NULL }, 16992, "tcp" }, + { "amt-soap-http", { NULL }, 16992, "udp" }, + { "amt-soap-https", { NULL }, 16993, "tcp" }, + { "amt-soap-https", { NULL }, 16993, "udp" }, + { "amt-redir-tcp", { NULL }, 16994, "tcp" }, + { "amt-redir-tcp", { NULL }, 16994, "udp" }, + { "amt-redir-tls", { NULL }, 16995, "tcp" }, + { "amt-redir-tls", { NULL }, 16995, "udp" }, + { "isode-dua", { NULL }, 17007, "tcp" }, + { "isode-dua", { NULL }, 17007, "udp" }, + { "soundsvirtual", { NULL }, 17185, "tcp" }, + { "soundsvirtual", { NULL }, 17185, "udp" }, + { "chipper", { NULL }, 17219, "tcp" }, + { "chipper", { NULL }, 17219, "udp" }, + { "integrius-stp", { NULL }, 17234, "tcp" }, + { "integrius-stp", { NULL }, 17234, "udp" }, + { "ssh-mgmt", { NULL }, 17235, "tcp" }, + { "ssh-mgmt", { NULL }, 17235, "udp" }, + { "db-lsp", { NULL }, 17500, "tcp" }, + { "db-lsp-disc", { NULL }, 17500, "udp" }, + { "ea", { NULL }, 17729, "tcp" }, + { "ea", { NULL }, 17729, "udp" }, + { "zep", { NULL }, 17754, "tcp" }, + { "zep", { NULL }, 17754, "udp" }, + { "zigbee-ip", { NULL }, 17755, "tcp" }, + { "zigbee-ip", { NULL }, 17755, "udp" }, + { "zigbee-ips", { NULL }, 17756, "tcp" }, + { "zigbee-ips", { NULL }, 17756, "udp" }, + { "sw-orion", { NULL }, 17777, "tcp" }, + { "biimenu", { NULL }, 18000, "tcp" }, + { "biimenu", { NULL }, 18000, "udp" }, + { "radpdf", { NULL }, 18104, "tcp" }, + { "racf", { NULL }, 18136, "tcp" }, + { "opsec-cvp", { NULL }, 18181, "tcp" }, + { "opsec-cvp", { NULL }, 18181, "udp" }, + { "opsec-ufp", { NULL }, 18182, "tcp" }, + { "opsec-ufp", { NULL }, 18182, "udp" }, + { "opsec-sam", { NULL }, 18183, "tcp" }, + { "opsec-sam", { NULL }, 18183, "udp" }, + { "opsec-lea", { NULL }, 18184, "tcp" }, + { "opsec-lea", { NULL }, 18184, "udp" }, + { "opsec-omi", { NULL }, 18185, "tcp" }, + { "opsec-omi", { NULL }, 18185, "udp" }, + { "ohsc", { NULL }, 18186, "tcp" }, + { "ohsc", { NULL }, 18186, "udp" }, + { "opsec-ela", { NULL }, 18187, "tcp" }, + { "opsec-ela", { NULL }, 18187, "udp" }, + { "checkpoint-rtm", { NULL }, 18241, "tcp" }, + { "checkpoint-rtm", { NULL }, 18241, "udp" }, + { "gv-pf", { NULL }, 18262, "tcp" }, + { "gv-pf", { NULL }, 18262, "udp" }, + { "ac-cluster", { NULL }, 18463, "tcp" }, + { "ac-cluster", { NULL }, 18463, "udp" }, + { "rds-ib", { NULL }, 18634, "tcp" }, + { "rds-ib", { NULL }, 18634, "udp" }, + { "rds-ip", { NULL }, 18635, "tcp" }, + { "rds-ip", { NULL }, 18635, "udp" }, + { "ique", { NULL }, 18769, "tcp" }, + { "ique", { NULL }, 18769, "udp" }, + { "infotos", { NULL }, 18881, "tcp" }, + { "infotos", { NULL }, 18881, "udp" }, + { "apc-necmp", { NULL }, 18888, "tcp" }, + { "apc-necmp", { NULL }, 18888, "udp" }, + { "igrid", { NULL }, 19000, "tcp" }, + { "igrid", { NULL }, 19000, "udp" }, + { "j-link", { NULL }, 19020, "tcp" }, + { "opsec-uaa", { NULL }, 19191, "tcp" }, + { "opsec-uaa", { NULL }, 19191, "udp" }, + { "ua-secureagent", { NULL }, 19194, "tcp" }, + { "ua-secureagent", { NULL }, 19194, "udp" }, + { "keysrvr", { NULL }, 19283, "tcp" }, + { "keysrvr", { NULL }, 19283, "udp" }, + { "keyshadow", { NULL }, 19315, "tcp" }, + { "keyshadow", { NULL }, 19315, "udp" }, + { "mtrgtrans", { NULL }, 19398, "tcp" }, + { "mtrgtrans", { NULL }, 19398, "udp" }, + { "hp-sco", { NULL }, 19410, "tcp" }, + { "hp-sco", { NULL }, 19410, "udp" }, + { "hp-sca", { NULL }, 19411, "tcp" }, + { "hp-sca", { NULL }, 19411, "udp" }, + { "hp-sessmon", { NULL }, 19412, "tcp" }, + { "hp-sessmon", { NULL }, 19412, "udp" }, + { "fxuptp", { NULL }, 19539, "tcp" }, + { "fxuptp", { NULL }, 19539, "udp" }, + { "sxuptp", { NULL }, 19540, "tcp" }, + { "sxuptp", { NULL }, 19540, "udp" }, + { "jcp", { NULL }, 19541, "tcp" }, + { "jcp", { NULL }, 19541, "udp" }, + { "iec-104-sec", { NULL }, 19998, "tcp" }, + { "dnp-sec", { NULL }, 19999, "tcp" }, + { "dnp-sec", { NULL }, 19999, "udp" }, + { "dnp", { NULL }, 20000, "tcp" }, + { "dnp", { NULL }, 20000, "udp" }, + { "microsan", { NULL }, 20001, "tcp" }, + { "microsan", { NULL }, 20001, "udp" }, + { "commtact-http", { NULL }, 20002, "tcp" }, + { "commtact-http", { NULL }, 20002, "udp" }, + { "commtact-https", { NULL }, 20003, "tcp" }, + { "commtact-https", { NULL }, 20003, "udp" }, + { "openwebnet", { NULL }, 20005, "tcp" }, + { "openwebnet", { NULL }, 20005, "udp" }, + { "ss-idi-disc", { NULL }, 20012, "udp" }, + { "ss-idi", { NULL }, 20013, "tcp" }, + { "opendeploy", { NULL }, 20014, "tcp" }, + { "opendeploy", { NULL }, 20014, "udp" }, + { "nburn_id", { NULL }, 20034, "tcp" }, + { "nburn_id", { NULL }, 20034, "udp" }, + { "tmophl7mts", { NULL }, 20046, "tcp" }, + { "tmophl7mts", { NULL }, 20046, "udp" }, + { "mountd", { NULL }, 20048, "tcp" }, + { "mountd", { NULL }, 20048, "udp" }, + { "nfsrdma", { NULL }, 20049, "tcp" }, + { "nfsrdma", { NULL }, 20049, "udp" }, + { "nfsrdma", { NULL }, 20049, "sctp"}, + { "tolfab", { NULL }, 20167, "tcp" }, + { "tolfab", { NULL }, 20167, "udp" }, + { "ipdtp-port", { NULL }, 20202, "tcp" }, + { "ipdtp-port", { NULL }, 20202, "udp" }, + { "ipulse-ics", { NULL }, 20222, "tcp" }, + { "ipulse-ics", { NULL }, 20222, "udp" }, + { "emwavemsg", { NULL }, 20480, "tcp" }, + { "emwavemsg", { NULL }, 20480, "udp" }, + { "track", { NULL }, 20670, "tcp" }, + { "track", { NULL }, 20670, "udp" }, + { "athand-mmp", { NULL }, 20999, "tcp" }, + { "athand-mmp", { NULL }, 20999, "udp" }, + { "irtrans", { NULL }, 21000, "tcp" }, + { "irtrans", { NULL }, 21000, "udp" }, + { "dfserver", { NULL }, 21554, "tcp" }, + { "dfserver", { NULL }, 21554, "udp" }, + { "vofr-gateway", { NULL }, 21590, "tcp" }, + { "vofr-gateway", { NULL }, 21590, "udp" }, + { "tvpm", { NULL }, 21800, "tcp" }, + { "tvpm", { NULL }, 21800, "udp" }, + { "webphone", { NULL }, 21845, "tcp" }, + { "webphone", { NULL }, 21845, "udp" }, + { "netspeak-is", { NULL }, 21846, "tcp" }, + { "netspeak-is", { NULL }, 21846, "udp" }, + { "netspeak-cs", { NULL }, 21847, "tcp" }, + { "netspeak-cs", { NULL }, 21847, "udp" }, + { "netspeak-acd", { NULL }, 21848, "tcp" }, + { "netspeak-acd", { NULL }, 21848, "udp" }, + { "netspeak-cps", { NULL }, 21849, "tcp" }, + { "netspeak-cps", { NULL }, 21849, "udp" }, + { "snapenetio", { NULL }, 22000, "tcp" }, + { "snapenetio", { NULL }, 22000, "udp" }, + { "optocontrol", { NULL }, 22001, "tcp" }, + { "optocontrol", { NULL }, 22001, "udp" }, + { "optohost002", { NULL }, 22002, "tcp" }, + { "optohost002", { NULL }, 22002, "udp" }, + { "optohost003", { NULL }, 22003, "tcp" }, + { "optohost003", { NULL }, 22003, "udp" }, + { "optohost004", { NULL }, 22004, "tcp" }, + { "optohost004", { NULL }, 22004, "udp" }, + { "optohost004", { NULL }, 22005, "tcp" }, + { "optohost004", { NULL }, 22005, "udp" }, + { "dcap", { NULL }, 22125, "tcp" }, + { "gsidcap", { NULL }, 22128, "tcp" }, + { "wnn6", { NULL }, 22273, "tcp" }, + { "wnn6", { NULL }, 22273, "udp" }, + { "cis", { NULL }, 22305, "tcp" }, + { "cis", { NULL }, 22305, "udp" }, + { "cis-secure", { NULL }, 22343, "tcp" }, + { "cis-secure", { NULL }, 22343, "udp" }, + { "WibuKey", { NULL }, 22347, "tcp" }, + { "WibuKey", { NULL }, 22347, "udp" }, + { "CodeMeter", { NULL }, 22350, "tcp" }, + { "CodeMeter", { NULL }, 22350, "udp" }, + { "vocaltec-wconf", { NULL }, 22555, "tcp" }, + { "vocaltec-phone", { NULL }, 22555, "udp" }, + { "talikaserver", { NULL }, 22763, "tcp" }, + { "talikaserver", { NULL }, 22763, "udp" }, + { "aws-brf", { NULL }, 22800, "tcp" }, + { "aws-brf", { NULL }, 22800, "udp" }, + { "brf-gw", { NULL }, 22951, "tcp" }, + { "brf-gw", { NULL }, 22951, "udp" }, + { "inovaport1", { NULL }, 23000, "tcp" }, + { "inovaport1", { NULL }, 23000, "udp" }, + { "inovaport2", { NULL }, 23001, "tcp" }, + { "inovaport2", { NULL }, 23001, "udp" }, + { "inovaport3", { NULL }, 23002, "tcp" }, + { "inovaport3", { NULL }, 23002, "udp" }, + { "inovaport4", { NULL }, 23003, "tcp" }, + { "inovaport4", { NULL }, 23003, "udp" }, + { "inovaport5", { NULL }, 23004, "tcp" }, + { "inovaport5", { NULL }, 23004, "udp" }, + { "inovaport6", { NULL }, 23005, "tcp" }, + { "inovaport6", { NULL }, 23005, "udp" }, + { "s102", { NULL }, 23272, "udp" }, + { "elxmgmt", { NULL }, 23333, "tcp" }, + { "elxmgmt", { NULL }, 23333, "udp" }, + { "novar-dbase", { NULL }, 23400, "tcp" }, + { "novar-dbase", { NULL }, 23400, "udp" }, + { "novar-alarm", { NULL }, 23401, "tcp" }, + { "novar-alarm", { NULL }, 23401, "udp" }, + { "novar-global", { NULL }, 23402, "tcp" }, + { "novar-global", { NULL }, 23402, "udp" }, + { "aequus", { NULL }, 23456, "tcp" }, + { "aequus-alt", { NULL }, 23457, "tcp" }, + { "med-ltp", { NULL }, 24000, "tcp" }, + { "med-ltp", { NULL }, 24000, "udp" }, + { "med-fsp-rx", { NULL }, 24001, "tcp" }, + { "med-fsp-rx", { NULL }, 24001, "udp" }, + { "med-fsp-tx", { NULL }, 24002, "tcp" }, + { "med-fsp-tx", { NULL }, 24002, "udp" }, + { "med-supp", { NULL }, 24003, "tcp" }, + { "med-supp", { NULL }, 24003, "udp" }, + { "med-ovw", { NULL }, 24004, "tcp" }, + { "med-ovw", { NULL }, 24004, "udp" }, + { "med-ci", { NULL }, 24005, "tcp" }, + { "med-ci", { NULL }, 24005, "udp" }, + { "med-net-svc", { NULL }, 24006, "tcp" }, + { "med-net-svc", { NULL }, 24006, "udp" }, + { "filesphere", { NULL }, 24242, "tcp" }, + { "filesphere", { NULL }, 24242, "udp" }, + { "vista-4gl", { NULL }, 24249, "tcp" }, + { "vista-4gl", { NULL }, 24249, "udp" }, + { "ild", { NULL }, 24321, "tcp" }, + { "ild", { NULL }, 24321, "udp" }, + { "intel_rci", { NULL }, 24386, "tcp" }, + { "intel_rci", { NULL }, 24386, "udp" }, + { "tonidods", { NULL }, 24465, "tcp" }, + { "tonidods", { NULL }, 24465, "udp" }, + { "binkp", { NULL }, 24554, "tcp" }, + { "binkp", { NULL }, 24554, "udp" }, + { "canditv", { NULL }, 24676, "tcp" }, + { "canditv", { NULL }, 24676, "udp" }, + { "flashfiler", { NULL }, 24677, "tcp" }, + { "flashfiler", { NULL }, 24677, "udp" }, + { "proactivate", { NULL }, 24678, "tcp" }, + { "proactivate", { NULL }, 24678, "udp" }, + { "tcc-http", { NULL }, 24680, "tcp" }, + { "tcc-http", { NULL }, 24680, "udp" }, + { "cslg", { NULL }, 24754, "tcp" }, + { "find", { NULL }, 24922, "tcp" }, + { "find", { NULL }, 24922, "udp" }, + { "icl-twobase1", { NULL }, 25000, "tcp" }, + { "icl-twobase1", { NULL }, 25000, "udp" }, + { "icl-twobase2", { NULL }, 25001, "tcp" }, + { "icl-twobase2", { NULL }, 25001, "udp" }, + { "icl-twobase3", { NULL }, 25002, "tcp" }, + { "icl-twobase3", { NULL }, 25002, "udp" }, + { "icl-twobase4", { NULL }, 25003, "tcp" }, + { "icl-twobase4", { NULL }, 25003, "udp" }, + { "icl-twobase5", { NULL }, 25004, "tcp" }, + { "icl-twobase5", { NULL }, 25004, "udp" }, + { "icl-twobase6", { NULL }, 25005, "tcp" }, + { "icl-twobase6", { NULL }, 25005, "udp" }, + { "icl-twobase7", { NULL }, 25006, "tcp" }, + { "icl-twobase7", { NULL }, 25006, "udp" }, + { "icl-twobase8", { NULL }, 25007, "tcp" }, + { "icl-twobase8", { NULL }, 25007, "udp" }, + { "icl-twobase9", { NULL }, 25008, "tcp" }, + { "icl-twobase9", { NULL }, 25008, "udp" }, + { "icl-twobase10", { NULL }, 25009, "tcp" }, + { "icl-twobase10", { NULL }, 25009, "udp" }, + { "rna", { NULL }, 25471, "sctp"}, + { "sauterdongle", { NULL }, 25576, "tcp" }, + { "vocaltec-hos", { NULL }, 25793, "tcp" }, + { "vocaltec-hos", { NULL }, 25793, "udp" }, + { "tasp-net", { NULL }, 25900, "tcp" }, + { "tasp-net", { NULL }, 25900, "udp" }, + { "niobserver", { NULL }, 25901, "tcp" }, + { "niobserver", { NULL }, 25901, "udp" }, + { "nilinkanalyst", { NULL }, 25902, "tcp" }, + { "nilinkanalyst", { NULL }, 25902, "udp" }, + { "niprobe", { NULL }, 25903, "tcp" }, + { "niprobe", { NULL }, 25903, "udp" }, + { "quake", { NULL }, 26000, "tcp" }, + { "quake", { NULL }, 26000, "udp" }, + { "scscp", { NULL }, 26133, "tcp" }, + { "scscp", { NULL }, 26133, "udp" }, + { "wnn6-ds", { NULL }, 26208, "tcp" }, + { "wnn6-ds", { NULL }, 26208, "udp" }, + { "ezproxy", { NULL }, 26260, "tcp" }, + { "ezproxy", { NULL }, 26260, "udp" }, + { "ezmeeting", { NULL }, 26261, "tcp" }, + { "ezmeeting", { NULL }, 26261, "udp" }, + { "k3software-svr", { NULL }, 26262, "tcp" }, + { "k3software-svr", { NULL }, 26262, "udp" }, + { "k3software-cli", { NULL }, 26263, "tcp" }, + { "k3software-cli", { NULL }, 26263, "udp" }, + { "exoline-tcp", { NULL }, 26486, "tcp" }, + { "exoline-udp", { NULL }, 26486, "udp" }, + { "exoconfig", { NULL }, 26487, "tcp" }, + { "exoconfig", { NULL }, 26487, "udp" }, + { "exonet", { NULL }, 26489, "tcp" }, + { "exonet", { NULL }, 26489, "udp" }, + { "imagepump", { NULL }, 27345, "tcp" }, + { "imagepump", { NULL }, 27345, "udp" }, + { "jesmsjc", { NULL }, 27442, "tcp" }, + { "jesmsjc", { NULL }, 27442, "udp" }, + { "kopek-httphead", { NULL }, 27504, "tcp" }, + { "kopek-httphead", { NULL }, 27504, "udp" }, + { "ars-vista", { NULL }, 27782, "tcp" }, + { "ars-vista", { NULL }, 27782, "udp" }, + { "tw-auth-key", { NULL }, 27999, "tcp" }, + { "tw-auth-key", { NULL }, 27999, "udp" }, + { "nxlmd", { NULL }, 28000, "tcp" }, + { "nxlmd", { NULL }, 28000, "udp" }, + { "pqsp", { NULL }, 28001, "tcp" }, + { "siemensgsm", { NULL }, 28240, "tcp" }, + { "siemensgsm", { NULL }, 28240, "udp" }, + { "sgsap", { NULL }, 29118, "sctp"}, + { "otmp", { NULL }, 29167, "tcp" }, + { "otmp", { NULL }, 29167, "udp" }, + { "sbcap", { NULL }, 29168, "sctp"}, + { "iuhsctpassoc", { NULL }, 29169, "sctp"}, + { "pago-services1", { NULL }, 30001, "tcp" }, + { "pago-services1", { NULL }, 30001, "udp" }, + { "pago-services2", { NULL }, 30002, "tcp" }, + { "pago-services2", { NULL }, 30002, "udp" }, + { "kingdomsonline", { NULL }, 30260, "tcp" }, + { "kingdomsonline", { NULL }, 30260, "udp" }, + { "ovobs", { NULL }, 30999, "tcp" }, + { "ovobs", { NULL }, 30999, "udp" }, + { "autotrac-acp", { NULL }, 31020, "tcp" }, + { "yawn", { NULL }, 31029, "udp" }, + { "xqosd", { NULL }, 31416, "tcp" }, + { "xqosd", { NULL }, 31416, "udp" }, + { "tetrinet", { NULL }, 31457, "tcp" }, + { "tetrinet", { NULL }, 31457, "udp" }, + { "lm-mon", { NULL }, 31620, "tcp" }, + { "lm-mon", { NULL }, 31620, "udp" }, + { "dsx_monitor", { NULL }, 31685, "tcp" }, + { "gamesmith-port", { NULL }, 31765, "tcp" }, + { "gamesmith-port", { NULL }, 31765, "udp" }, + { "iceedcp_tx", { NULL }, 31948, "tcp" }, + { "iceedcp_tx", { NULL }, 31948, "udp" }, + { "iceedcp_rx", { NULL }, 31949, "tcp" }, + { "iceedcp_rx", { NULL }, 31949, "udp" }, + { "iracinghelper", { NULL }, 32034, "tcp" }, + { "iracinghelper", { NULL }, 32034, "udp" }, + { "t1distproc60", { NULL }, 32249, "tcp" }, + { "t1distproc60", { NULL }, 32249, "udp" }, + { "apm-link", { NULL }, 32483, "tcp" }, + { "apm-link", { NULL }, 32483, "udp" }, + { "sec-ntb-clnt", { NULL }, 32635, "tcp" }, + { "sec-ntb-clnt", { NULL }, 32635, "udp" }, + { "DMExpress", { NULL }, 32636, "tcp" }, + { "DMExpress", { NULL }, 32636, "udp" }, + { "filenet-powsrm", { NULL }, 32767, "tcp" }, + { "filenet-powsrm", { NULL }, 32767, "udp" }, + { "filenet-tms", { NULL }, 32768, "tcp" }, + { "filenet-tms", { NULL }, 32768, "udp" }, + { "filenet-rpc", { NULL }, 32769, "tcp" }, + { "filenet-rpc", { NULL }, 32769, "udp" }, + { "filenet-nch", { NULL }, 32770, "tcp" }, + { "filenet-nch", { NULL }, 32770, "udp" }, + { "filenet-rmi", { NULL }, 32771, "tcp" }, + { "filenet-rmi", { NULL }, 32771, "udp" }, + { "filenet-pa", { NULL }, 32772, "tcp" }, + { "filenet-pa", { NULL }, 32772, "udp" }, + { "filenet-cm", { NULL }, 32773, "tcp" }, + { "filenet-cm", { NULL }, 32773, "udp" }, + { "filenet-re", { NULL }, 32774, "tcp" }, + { "filenet-re", { NULL }, 32774, "udp" }, + { "filenet-pch", { NULL }, 32775, "tcp" }, + { "filenet-pch", { NULL }, 32775, "udp" }, + { "filenet-peior", { NULL }, 32776, "tcp" }, + { "filenet-peior", { NULL }, 32776, "udp" }, + { "filenet-obrok", { NULL }, 32777, "tcp" }, + { "filenet-obrok", { NULL }, 32777, "udp" }, + { "mlsn", { NULL }, 32801, "tcp" }, + { "mlsn", { NULL }, 32801, "udp" }, + { "retp", { NULL }, 32811, "tcp" }, + { "idmgratm", { NULL }, 32896, "tcp" }, + { "idmgratm", { NULL }, 32896, "udp" }, + { "aurora-balaena", { NULL }, 33123, "tcp" }, + { "aurora-balaena", { NULL }, 33123, "udp" }, + { "diamondport", { NULL }, 33331, "tcp" }, + { "diamondport", { NULL }, 33331, "udp" }, + { "dgi-serv", { NULL }, 33333, "tcp" }, + { "traceroute", { NULL }, 33434, "tcp" }, + { "traceroute", { NULL }, 33434, "udp" }, + { "snip-slave", { NULL }, 33656, "tcp" }, + { "snip-slave", { NULL }, 33656, "udp" }, + { "turbonote-2", { NULL }, 34249, "tcp" }, + { "turbonote-2", { NULL }, 34249, "udp" }, + { "p-net-local", { NULL }, 34378, "tcp" }, + { "p-net-local", { NULL }, 34378, "udp" }, + { "p-net-remote", { NULL }, 34379, "tcp" }, + { "p-net-remote", { NULL }, 34379, "udp" }, + { "dhanalakshmi", { NULL }, 34567, "tcp" }, + { "profinet-rt", { NULL }, 34962, "tcp" }, + { "profinet-rt", { NULL }, 34962, "udp" }, + { "profinet-rtm", { NULL }, 34963, "tcp" }, + { "profinet-rtm", { NULL }, 34963, "udp" }, + { "profinet-cm", { NULL }, 34964, "tcp" }, + { "profinet-cm", { NULL }, 34964, "udp" }, + { "ethercat", { NULL }, 34980, "tcp" }, + { "ethercat", { NULL }, 34980, "udp" }, + { "allpeers", { NULL }, 36001, "tcp" }, + { "allpeers", { NULL }, 36001, "udp" }, + { "s1-control", { NULL }, 36412, "sctp"}, + { "x2-control", { NULL }, 36422, "sctp"}, + { "m2ap", { NULL }, 36443, "sctp"}, + { "m3ap", { NULL }, 36444, "sctp"}, + { "kastenxpipe", { NULL }, 36865, "tcp" }, + { "kastenxpipe", { NULL }, 36865, "udp" }, + { "neckar", { NULL }, 37475, "tcp" }, + { "neckar", { NULL }, 37475, "udp" }, + { "unisys-eportal", { NULL }, 37654, "tcp" }, + { "unisys-eportal", { NULL }, 37654, "udp" }, + { "galaxy7-data", { NULL }, 38201, "tcp" }, + { "galaxy7-data", { NULL }, 38201, "udp" }, + { "fairview", { NULL }, 38202, "tcp" }, + { "fairview", { NULL }, 38202, "udp" }, + { "agpolicy", { NULL }, 38203, "tcp" }, + { "agpolicy", { NULL }, 38203, "udp" }, + { "turbonote-1", { NULL }, 39681, "tcp" }, + { "turbonote-1", { NULL }, 39681, "udp" }, + { "safetynetp", { NULL }, 40000, "tcp" }, + { "safetynetp", { NULL }, 40000, "udp" }, + { "cscp", { NULL }, 40841, "tcp" }, + { "cscp", { NULL }, 40841, "udp" }, + { "csccredir", { NULL }, 40842, "tcp" }, + { "csccredir", { NULL }, 40842, "udp" }, + { "csccfirewall", { NULL }, 40843, "tcp" }, + { "csccfirewall", { NULL }, 40843, "udp" }, + { "ortec-disc", { NULL }, 40853, "udp" }, + { "fs-qos", { NULL }, 41111, "tcp" }, + { "fs-qos", { NULL }, 41111, "udp" }, + { "tentacle", { NULL }, 41121, "tcp" }, + { "crestron-cip", { NULL }, 41794, "tcp" }, + { "crestron-cip", { NULL }, 41794, "udp" }, + { "crestron-ctp", { NULL }, 41795, "tcp" }, + { "crestron-ctp", { NULL }, 41795, "udp" }, + { "candp", { NULL }, 42508, "tcp" }, + { "candp", { NULL }, 42508, "udp" }, + { "candrp", { NULL }, 42509, "tcp" }, + { "candrp", { NULL }, 42509, "udp" }, + { "caerpc", { NULL }, 42510, "tcp" }, + { "caerpc", { NULL }, 42510, "udp" }, + { "reachout", { NULL }, 43188, "tcp" }, + { "reachout", { NULL }, 43188, "udp" }, + { "ndm-agent-port", { NULL }, 43189, "tcp" }, + { "ndm-agent-port", { NULL }, 43189, "udp" }, + { "ip-provision", { NULL }, 43190, "tcp" }, + { "ip-provision", { NULL }, 43190, "udp" }, + { "noit-transport", { NULL }, 43191, "tcp" }, + { "ew-mgmt", { NULL }, 43440, "tcp" }, + { "ew-disc-cmd", { NULL }, 43440, "udp" }, + { "ciscocsdb", { NULL }, 43441, "tcp" }, + { "ciscocsdb", { NULL }, 43441, "udp" }, + { "pmcd", { NULL }, 44321, "tcp" }, + { "pmcd", { NULL }, 44321, "udp" }, + { "pmcdproxy", { NULL }, 44322, "tcp" }, + { "pmcdproxy", { NULL }, 44322, "udp" }, + { "pcp", { NULL }, 44323, "udp" }, + { "rbr-debug", { NULL }, 44553, "tcp" }, + { "rbr-debug", { NULL }, 44553, "udp" }, + { "EtherNet/IP-2", { NULL }, 44818, "tcp" }, + { "EtherNet/IP-2", { NULL }, 44818, "udp" }, + { "invision-ag", { NULL }, 45054, "tcp" }, + { "invision-ag", { NULL }, 45054, "udp" }, + { "eba", { NULL }, 45678, "tcp" }, + { "eba", { NULL }, 45678, "udp" }, + { "qdb2service", { NULL }, 45825, "tcp" }, + { "qdb2service", { NULL }, 45825, "udp" }, + { "ssr-servermgr", { NULL }, 45966, "tcp" }, + { "ssr-servermgr", { NULL }, 45966, "udp" }, + { "mediabox", { NULL }, 46999, "tcp" }, + { "mediabox", { NULL }, 46999, "udp" }, + { "mbus", { NULL }, 47000, "tcp" }, + { "mbus", { NULL }, 47000, "udp" }, + { "winrm", { NULL }, 47001, "tcp" }, + { "dbbrowse", { NULL }, 47557, "tcp" }, + { "dbbrowse", { NULL }, 47557, "udp" }, + { "directplaysrvr", { NULL }, 47624, "tcp" }, + { "directplaysrvr", { NULL }, 47624, "udp" }, + { "ap", { NULL }, 47806, "tcp" }, + { "ap", { NULL }, 47806, "udp" }, + { "bacnet", { NULL }, 47808, "tcp" }, + { "bacnet", { NULL }, 47808, "udp" }, + { "nimcontroller", { NULL }, 48000, "tcp" }, + { "nimcontroller", { NULL }, 48000, "udp" }, + { "nimspooler", { NULL }, 48001, "tcp" }, + { "nimspooler", { NULL }, 48001, "udp" }, + { "nimhub", { NULL }, 48002, "tcp" }, + { "nimhub", { NULL }, 48002, "udp" }, + { "nimgtw", { NULL }, 48003, "tcp" }, + { "nimgtw", { NULL }, 48003, "udp" }, + { "nimbusdb", { NULL }, 48004, "tcp" }, + { "nimbusdbctrl", { NULL }, 48005, "tcp" }, + { "3gpp-cbsp", { NULL }, 48049, "tcp" }, + { "isnetserv", { NULL }, 48128, "tcp" }, + { "isnetserv", { NULL }, 48128, "udp" }, + { "blp5", { NULL }, 48129, "tcp" }, + { "blp5", { NULL }, 48129, "udp" }, + { "com-bardac-dw", { NULL }, 48556, "tcp" }, + { "com-bardac-dw", { NULL }, 48556, "udp" }, + { "iqobject", { NULL }, 48619, "tcp" }, + { "iqobject", { NULL }, 48619, "udp" }, +# endif /* USE_IANA_REGISTERED_PORTS */ + { NULL, { NULL }, 0, NULL } +}; + +struct servent *getservbyport(int port, const char *proto) +{ + unsigned short u_port; + const char *protocol = NULL; + int error = 0; + size_t i; + + u_port = ntohs((unsigned short)port); + + if (proto) { + switch (ares_strlen(proto)) { + case 3: + if (!strncasecmp(proto, "tcp", 3)) { + protocol = "tcp"; + } else if (!strncasecmp(proto, "udp", 3)) { + protocol = "udp"; + } else { + error = WSAEFAULT; + } + break; + case 4: + if (!strncasecmp(proto, "sctp", 4)) { + protocol = "sctp"; + } else if (!strncasecmp(proto, "dccp", 4)) { + protocol = "dccp"; + } else { + error = WSAEFAULT; + } + break; + default: + error = WSAEFAULT; + } + } + + if (!error) { + for (i = 0; i < (sizeof(IANAports) / sizeof(IANAports[0])) - 1; i++) { + if (u_port == IANAports[i].s_port) { + if (!protocol || !strcasecmp(protocol, IANAports[i].s_proto)) { + return (struct servent *)&IANAports[i]; + } + } + } + error = WSANO_DATA; + } + + SET_SOCKERRNO(error); + return NULL; +} + +#endif /* _WIN32_WCE */ diff --git a/lib/c-ares-1.23.0/src/lib/ares_platform.h b/lib/c-ares-1.23.0/src/lib/ares_platform.h new file mode 100644 index 00000000000..44b2c036443 --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares_platform.h @@ -0,0 +1,52 @@ +/* MIT License + * + * Copyright (c) 1998 Massachusetts Institute of Technology + * Copyright (c) 2004 Daniel Stenberg + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ +#ifndef HEADER_CARES_PLATFORM_H +#define HEADER_CARES_PLATFORM_H + +#include "ares_setup.h" + +#if defined(WIN32) && !defined(MSDOS) + +typedef enum { + WIN_UNKNOWN, + WIN_3X, + WIN_9X, + WIN_NT, + WIN_CE +} win_platform; + +win_platform ares__getplatform(void); + +#endif + +#if defined(_WIN32_WCE) + +struct servent *getservbyport(int port, const char *proto); + +#endif + +#endif /* HEADER_CARES_PLATFORM_H */ diff --git a/lib/c-ares-1.23.0/src/lib/ares_private.h b/lib/c-ares-1.23.0/src/lib/ares_private.h new file mode 100644 index 00000000000..c4d705b4108 --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares_private.h @@ -0,0 +1,599 @@ +/* MIT License + * + * Copyright (c) 1998 Massachusetts Institute of Technology + * Copyright (c) 2010 Daniel Stenberg + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ +#ifndef __ARES_PRIVATE_H +#define __ARES_PRIVATE_H + +/* + * Define WIN32 when build target is Win32 API + */ + +#if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32) +# define WIN32 +#endif + +#ifdef HAVE_NETINET_IN_H +# include +#endif + +#ifdef WATT32 +# include +# include +#endif + +#define DEFAULT_TIMEOUT 2000 /* milliseconds */ +#define DEFAULT_TRIES 3 +#ifndef INADDR_NONE +# define INADDR_NONE 0xffffffff +#endif + +#ifdef CARES_EXPOSE_STATICS +/* Make some internal functions visible for testing */ +# define STATIC_TESTABLE +#else +# define STATIC_TESTABLE static +#endif + +/* By using a double cast, we can get rid of the bogus warning of + * warning: cast from 'const struct sockaddr *' to 'const struct sockaddr_in6 *' + * increases required alignment from 1 to 4 [-Wcast-align] + */ +#define CARES_INADDR_CAST(type, var) ((type)((void *)var)) + +#if defined(WIN32) && !defined(WATT32) + +# define WIN_NS_9X "System\\CurrentControlSet\\Services\\VxD\\MSTCP" +# define WIN_NS_NT_KEY "System\\CurrentControlSet\\Services\\Tcpip\\Parameters" +# define WIN_DNSCLIENT "Software\\Policies\\Microsoft\\System\\DNSClient" +# define WIN_NT_DNSCLIENT \ + "Software\\Policies\\Microsoft\\Windows NT\\DNSClient" +# define NAMESERVER "NameServer" +# define DHCPNAMESERVER "DhcpNameServer" +# define DATABASEPATH "DatabasePath" +# define WIN_PATH_HOSTS "\\hosts" +# define SEARCHLIST_KEY "SearchList" +# define PRIMARYDNSSUFFIX_KEY "PrimaryDNSSuffix" +# define INTERFACES_KEY "Interfaces" +# define DOMAIN_KEY "Domain" +# define DHCPDOMAIN_KEY "DhcpDomain" +# define PATH_RESOLV_CONF "" +#elif defined(WATT32) + +# define PATH_RESOLV_CONF "/dev/ENV/etc/resolv.conf" +W32_FUNC const char *_w32_GetHostsFile(void); + +#elif defined(NETWARE) + +# define PATH_RESOLV_CONF "sys:/etc/resolv.cfg" +# define PATH_HOSTS "sys:/etc/hosts" + +#elif defined(__riscos__) + +# define PATH_RESOLV_CONF "" +# define PATH_HOSTS "InetDBase:Hosts" + +#elif defined(__HAIKU__) + +# define PATH_RESOLV_CONF "/system/settings/network/resolv.conf" +# define PATH_HOSTS "/system/settings/network/hosts" + +#else + +# define PATH_RESOLV_CONF "/etc/resolv.conf" +# ifdef ETC_INET +# define PATH_HOSTS "/etc/inet/hosts" +# else +# define PATH_HOSTS "/etc/hosts" +# endif + +#endif + +#include "ares_ipv6.h" + +struct ares_rand_state; +typedef struct ares_rand_state ares_rand_state; + +#include "ares__llist.h" +#include "ares__slist.h" +#include "ares__htable_strvp.h" +#include "ares__htable_szvp.h" +#include "ares__htable_asvp.h" +#include "ares__buf.h" +#include "ares_dns_private.h" + +#ifndef HAVE_GETENV +# include "ares_getenv.h" +# define getenv(ptr) ares_getenv(ptr) +#endif + +#include "ares_str.h" +#include "ares_strsplit.h" + +#ifndef HAVE_STRCASECMP +# include "ares_strcasecmp.h" +# define strcasecmp(p1, p2) ares_strcasecmp(p1, p2) +#endif + +#ifndef HAVE_STRNCASECMP +# include "ares_strcasecmp.h" +# define strncasecmp(p1, p2, n) ares_strncasecmp(p1, p2, n) +#endif + +/********* EDNS defines section ******/ +#define EDNSPACKETSZ \ + 1280 /* Reasonable UDP payload size, as suggested \ + in RFC2671 */ +#define MAXENDSSZ 4096 /* Maximum (local) limit for edns packet size */ +#define EDNSFIXEDSZ 11 /* Size of EDNS header */ + +/********* EDNS defines section ******/ + + +struct query; + +struct server_state; + +struct server_connection { + struct server_state *server; + ares_socket_t fd; + ares_bool_t is_tcp; + /* total number of queries run on this connection since it was established */ + size_t total_queries; + /* list of outstanding queries to this connection */ + ares__llist_t *queries_to_conn; +}; + +struct server_state { + size_t idx; /* index for server in system configuration */ + size_t consec_failures; /* Consecutive query failure count + * can be hard errors or timeouts + */ + struct ares_addr addr; + unsigned short udp_port; /* host byte order */ + unsigned short tcp_port; /* host byte order */ + + ares__llist_t *connections; + struct server_connection *tcp_conn; + + /* TCP buffer since multiple responses can come back in one read, or partial + * in a read */ + ares__buf_t *tcp_parser; + + /* TCP output queue */ + ares__buf_t *tcp_send; + + /* Link back to owning channel */ + ares_channel_t *channel; +}; + +/* State to represent a DNS query */ +struct query { + /* Query ID from qbuf, for faster lookup, and current timeout */ + unsigned short qid; /* host byte order */ + struct timeval timeout; + ares_channel_t *channel; + + /* + * Node object for each list entry the query belongs to in order to + * make removal operations O(1). + */ + ares__slist_node_t *node_queries_by_timeout; + ares__llist_node_t *node_queries_to_conn; + ares__llist_node_t *node_all_queries; + + /* connection handle query is associated with */ + struct server_connection *conn; + + /* Arguments passed to ares_send() */ + unsigned char *qbuf; + size_t qlen; + + ares_callback callback; + void *arg; + + /* Query status */ + size_t try_count; /* Number of times we tried this query already. */ + ares_bool_t using_tcp; + ares_status_t error_status; + size_t timeouts; /* number of timeouts we saw for this request */ + ares_bool_t no_retries; /* do not perform any additional retries, this is set + * when a query is to be canceled */ +}; + +/* An IP address pattern; matches an IP address X if X & mask == addr */ +#define PATTERN_MASK 0x1 +#define PATTERN_CIDR 0x2 + +struct apattern { + union { + struct in_addr addr4; + struct ares_in6_addr addr6; + } addr; + + union { + struct in_addr addr4; + struct ares_in6_addr addr6; + unsigned short bits; + } mask; + + int family; + unsigned short type; +}; + +struct ares__qcache; +typedef struct ares__qcache ares__qcache_t; + +struct ares_hosts_file; +typedef struct ares_hosts_file ares_hosts_file_t; + +struct ares__thread_mutex; +typedef struct ares__thread_mutex ares__thread_mutex_t; + +struct ares_channeldata { + /* Configuration data */ + unsigned int flags; + size_t timeout; /* in milliseconds */ + size_t tries; + size_t ndots; + size_t maxtimeout; /* in milliseconds */ + ares_bool_t rotate; + unsigned short udp_port; /* stored in network order */ + unsigned short tcp_port; /* stored in network order */ + int socket_send_buffer_size; /* setsockopt takes int */ + int socket_receive_buffer_size; /* setsockopt takes int */ + char **domains; + size_t ndomains; + struct apattern *sortlist; + size_t nsort; + char *lookups; + size_t ednspsz; + unsigned int qcache_max_ttl; + unsigned int optmask; + + /* For binding to local devices and/or IP addresses. Leave + * them null/zero for no binding. + */ + char local_dev_name[32]; + unsigned int local_ip4; + unsigned char local_ip6[16]; + + /* Thread safety lock */ + ares__thread_mutex_t *lock; + + /* Server addresses and communications state. Sorted by least consecutive + * failures, followed by the configuration order if failures are equal. */ + ares__slist_t *servers; + + /* random state to use when generating new ids and generating retry penalties + */ + ares_rand_state *rand_state; + + /* All active queries in a single list */ + ares__llist_t *all_queries; + /* Queries bucketed by qid, for quickly dispatching DNS responses: */ + ares__htable_szvp_t *queries_by_qid; + + /* Queries bucketed by timeout, for quickly handling timeouts: */ + ares__slist_t *queries_by_timeout; + + /* Map linked list node member for connection to file descriptor. We use + * the node instead of the connection object itself so we can quickly look + * up a connection and remove it if necessary (as otherwise we'd have to + * scan all connections) */ + ares__htable_asvp_t *connnode_by_socket; + + ares_sock_state_cb sock_state_cb; + void *sock_state_cb_data; + + ares_sock_create_callback sock_create_cb; + void *sock_create_cb_data; + + ares_sock_config_callback sock_config_cb; + void *sock_config_cb_data; + + const struct ares_socket_functions *sock_funcs; + void *sock_func_cb_data; + + /* Path for resolv.conf file, configurable via ares_options */ + char *resolvconf_path; + + /* Path for hosts file, configurable via ares_options */ + char *hosts_path; + + /* Maximum UDP queries per connection allowed */ + size_t udp_max_queries; + + /* Cache of local hosts file */ + ares_hosts_file_t *hf; + + /* Query Cache */ + ares__qcache_t *qcache; +}; + +/* Does the domain end in ".onion" or ".onion."? Case-insensitive. */ +ares_bool_t ares__is_onion_domain(const char *name); + +/* Memory management functions */ +extern void *(*ares_malloc)(size_t size); +extern void *(*ares_realloc)(void *ptr, size_t size); +extern void (*ares_free)(void *ptr); +void *ares_malloc_zero(size_t size); +void *ares_realloc_zero(void *ptr, size_t orig_size, size_t new_size); + +/* return true if now is exactly check time or later */ +ares_bool_t ares__timedout(const struct timeval *now, + const struct timeval *check); + +/* Returns one of the normal ares status codes like ARES_SUCCESS */ +ares_status_t ares__send_query(struct query *query, struct timeval *now); +ares_status_t ares__requeue_query(struct query *query, struct timeval *now); + +/* Identical to ares_query, but returns a normal ares return code like + * ARES_SUCCESS, and can be passed the qid by reference which will be + * filled in on ARES_SUCCESS */ +ares_status_t ares_query_qid(ares_channel_t *channel, const char *name, + int dnsclass, int type, ares_callback callback, + void *arg, unsigned short *qid); +/* Identical to ares_send() except returns normal ares return codes like + * ARES_SUCCESS */ +ares_status_t ares_send_ex(ares_channel_t *channel, const unsigned char *qbuf, + size_t qlen, ares_callback callback, void *arg, + unsigned short *qid); +void ares__close_connection(struct server_connection *conn); +void ares__close_sockets(struct server_state *server); +void ares__check_cleanup_conn(const ares_channel_t *channel, + struct server_connection *conn); +ares_status_t ares__read_line(FILE *fp, char **buf, size_t *bufsize); +void ares__free_query(struct query *query); + +ares_rand_state *ares__init_rand_state(void); +void ares__destroy_rand_state(ares_rand_state *state); +void ares__rand_bytes(ares_rand_state *state, unsigned char *buf, size_t len); + +unsigned short ares__generate_new_id(ares_rand_state *state); +struct timeval ares__tvnow(void); +ares_status_t ares__expand_name_validated(const unsigned char *encoded, + const unsigned char *abuf, + size_t alen, char **s, size_t *enclen, + ares_bool_t is_hostname); +ares_status_t ares__expand_name_for_response(const unsigned char *encoded, + const unsigned char *abuf, + size_t alen, char **s, + size_t *enclen, + ares_bool_t is_hostname); +ares_status_t ares_expand_string_ex(const unsigned char *encoded, + const unsigned char *abuf, size_t alen, + unsigned char **s, size_t *enclen); +ares_status_t ares__init_servers_state(ares_channel_t *channel); +ares_status_t ares__init_by_options(ares_channel_t *channel, + const struct ares_options *options, + int optmask); +ares_status_t ares__init_by_sysconfig(ares_channel_t *channel); + +typedef struct { + ares__llist_t *sconfig; + struct apattern *sortlist; + size_t nsortlist; + char **domains; + size_t ndomains; + char *lookups; + size_t ndots; + size_t tries; + ares_bool_t rotate; + size_t timeout_ms; +} ares_sysconfig_t; + +ares_status_t ares__init_by_environment(ares_sysconfig_t *sysconfig); + +ares_status_t ares__init_sysconfig_files(const ares_channel_t *channel, + ares_sysconfig_t *sysconfig); +ares_status_t ares__parse_sortlist(struct apattern **sortlist, size_t *nsort, + const char *str); + +void ares__destroy_servers_state(ares_channel_t *channel); +ares_status_t ares__single_domain(const ares_channel_t *channel, + const char *name, char **s); +ares_status_t ares__cat_domain(const char *name, const char *domain, char **s); +ares_status_t ares__sortaddrinfo(ares_channel_t *channel, + struct ares_addrinfo_node *ai_node); + +void ares__freeaddrinfo_nodes(struct ares_addrinfo_node *ai_node); +ares_bool_t ares__is_localhost(const char *name); + +struct ares_addrinfo_node * + ares__append_addrinfo_node(struct ares_addrinfo_node **ai_node); +void ares__addrinfo_cat_nodes(struct ares_addrinfo_node **head, + struct ares_addrinfo_node *tail); + +void ares__freeaddrinfo_cnames(struct ares_addrinfo_cname *ai_cname); + +struct ares_addrinfo_cname * + ares__append_addrinfo_cname(struct ares_addrinfo_cname **ai_cname); + +ares_status_t ares_append_ai_node(int aftype, unsigned short port, + unsigned int ttl, const void *adata, + struct ares_addrinfo_node **nodes); + +void ares__addrinfo_cat_cnames(struct ares_addrinfo_cname **head, + struct ares_addrinfo_cname *tail); + +ares_status_t ares__parse_into_addrinfo(const unsigned char *abuf, size_t alen, + ares_bool_t cname_only_is_enodata, + unsigned short port, + struct ares_addrinfo *ai); + +ares_status_t ares__addrinfo2hostent(const struct ares_addrinfo *ai, int family, + struct hostent **host); +ares_status_t ares__addrinfo2addrttl(const struct ares_addrinfo *ai, int family, + size_t req_naddrttls, + struct ares_addrttl *addrttls, + struct ares_addr6ttl *addr6ttls, + size_t *naddrttls); +ares_status_t ares__addrinfo_localhost(const char *name, unsigned short port, + const struct ares_addrinfo_hints *hints, + struct ares_addrinfo *ai); +ares_status_t ares__open_connection(ares_channel_t *channel, + struct server_state *server, + ares_bool_t is_tcp); +ares_socket_t ares__open_socket(ares_channel_t *channel, int af, int type, + int protocol); +ares_ssize_t ares__socket_write(ares_channel_t *channel, ares_socket_t s, + const void *data, size_t len); +ares_ssize_t ares__socket_recvfrom(ares_channel_t *channel, ares_socket_t s, + void *data, size_t data_len, int flags, + struct sockaddr *from, + ares_socklen_t *from_len); +ares_ssize_t ares__socket_recv(ares_channel_t *channel, ares_socket_t s, + void *data, size_t data_len); +void ares__close_socket(ares_channel, ares_socket_t); +int ares__connect_socket(ares_channel_t *channel, ares_socket_t sockfd, + const struct sockaddr *addr, ares_socklen_t addrlen); +ares_bool_t ares__is_hostnamech(int ch); +void ares__destroy_server(struct server_state *server); + +ares_status_t ares__servers_update(ares_channel_t *channel, + ares__llist_t *server_list, + ares_bool_t user_specified); +ares_status_t ares__sconfig_append(ares__llist_t **sconfig, + const struct ares_addr *addr, + unsigned short udp_port, + unsigned short tcp_port); +ares_status_t ares__sconfig_append_fromstr(ares__llist_t **sconfig, + const char *str); +ares_status_t ares_in_addr_to_server_config_llist(const struct in_addr *servers, + size_t nservers, + ares__llist_t **llist); + +struct ares_hosts_entry; +typedef struct ares_hosts_entry ares_hosts_entry_t; + +void ares__hosts_file_destroy(ares_hosts_file_t *hf); +ares_status_t ares__hosts_search_ipaddr(ares_channel_t *channel, + ares_bool_t use_env, const char *ipaddr, + const ares_hosts_entry_t **entry); +ares_status_t ares__hosts_search_host(ares_channel_t *channel, + ares_bool_t use_env, const char *host, + const ares_hosts_entry_t **entry); +ares_status_t ares__hosts_entry_to_hostent(const ares_hosts_entry_t *entry, + int family, + struct hostent **hostent); +ares_status_t ares__hosts_entry_to_addrinfo(const ares_hosts_entry_t *entry, + const char *name, int family, + unsigned short port, + ares_bool_t want_cnames, + struct ares_addrinfo *ai); +ares_bool_t ares__isprint(int ch); + + +/*! Parse a compressed DNS name as defined in RFC1035 starting at the current + * offset within the buffer. + * + * It is assumed that either a const buffer is being used, or before + * the message processing was started that ares__buf_reclaim() was called. + * + * \param[in] buf Initialized buffer object + * \param[out] name Pointer passed by reference to be filled in with + * allocated string of the parsed name that must be + * ares_free()'d by the caller. + * \param[in] is_hostname if ARES_TRUE, will validate the character set for + * a valid hostname or will return error. + * \return ARES_SUCCESS on success + */ +ares_status_t ares__dns_name_parse(ares__buf_t *buf, char **name, + ares_bool_t is_hostname); + +/*! Write the DNS name to the buffer in the DNS domain-name syntax as a + * series of labels. The maximum domain name length is 255 characters with + * each label being a maximum of 63 characters. If the validate_hostname + * flag is set, it will strictly validate the character set. + * + * \param[in,out] buf Initialized buffer object to write name to + * \param[in,out] list Pointer passed by reference to maintain a list of + * domain name to indexes used for name compression. + * Pass NULL (not by reference) if name compression isn't + * desired. Otherwise the list will be automatically + * created upon first entry. + * \param[in] validate_hostname Validate the hostname character set. + * \param[in] name Name to write out, it may have escape + * sequences. + * \return ARES_SUCCESS on success, most likely ARES_EBADNAME if the name is + * bad. + */ +ares_status_t ares__dns_name_write(ares__buf_t *buf, ares__llist_t **list, + ares_bool_t validate_hostname, + const char *name); + +#define ARES_SWAP_BYTE(a, b) \ + do { \ + unsigned char swapByte = *(a); \ + *(a) = *(b); \ + *(b) = swapByte; \ + } while (0) + +#define SOCK_STATE_CALLBACK(c, s, r, w) \ + do { \ + if ((c)->sock_state_cb) { \ + (c)->sock_state_cb((c)->sock_state_cb_data, (s), (r), (w)); \ + } \ + } while (0) + +#define ARES_CONFIG_CHECK(x) \ + (x && x->lookups && ares__slist_len(x->servers) > 0 && x->ndots > 0 && \ + x->timeout > 0 && x->tries > 0) + +size_t ares__round_up_pow2(size_t n); +size_t ares__log2(size_t n); +size_t ares__pow(size_t x, size_t y); +size_t ares__count_digits(size_t n); +size_t ares__count_hexdigits(size_t n); +void ares__qcache_destroy(ares__qcache_t *cache); +ares_status_t ares__qcache_create(ares_rand_state *rand_state, + unsigned int max_ttl, + ares__qcache_t **cache_out); +void ares__qcache_flush(ares__qcache_t *cache); +ares_status_t ares_qcache_insert(ares_channel_t *channel, + const struct timeval *now, + const struct query *query, + ares_dns_record_t *dnsrec); +ares_status_t ares_qcache_fetch(ares_channel_t *channel, + const struct timeval *now, + const unsigned char *qbuf, size_t qlen, + unsigned char **abuf, size_t *alen); + +ares_status_t ares__channel_threading_init(ares_channel_t *channel); +void ares__channel_threading_destroy(ares_channel_t *channel); +void ares__channel_lock(ares_channel_t *channel); +void ares__channel_unlock(ares_channel_t *channel); + +#ifdef _MSC_VER +typedef __int64 ares_int64_t; +typedef unsigned __int64 ares_uint64_t; +#else +typedef long long ares_int64_t; +typedef unsigned long long ares_uint64_t; +#endif + +#endif /* __ARES_PRIVATE_H */ diff --git a/lib/c-ares-1.23.0/src/lib/ares_process.c b/lib/c-ares-1.23.0/src/lib/ares_process.c new file mode 100644 index 00000000000..ca6d9db1509 --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares_process.c @@ -0,0 +1,1148 @@ +/* MIT License + * + * Copyright (c) 1998 Massachusetts Institute of Technology + * Copyright (c) 2010 Daniel Stenberg + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ + +#include "ares_setup.h" + + +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_SYS_IOCTL_H +# include +#endif +#ifdef NETWARE +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif + +#include +#include +#include + +#include "ares.h" +#include "ares_private.h" +#include "ares_nameser.h" +#include "ares_dns.h" + +static ares_bool_t try_again(int errnum); +static void write_tcp_data(ares_channel_t *channel, fd_set *write_fds, + ares_socket_t write_fd); +static void read_packets(ares_channel_t *channel, fd_set *read_fds, + ares_socket_t read_fd, struct timeval *now); +static void process_timeouts(ares_channel_t *channel, struct timeval *now); +static ares_status_t process_answer(ares_channel_t *channel, + const unsigned char *abuf, size_t alen, + struct server_connection *conn, + ares_bool_t tcp, struct timeval *now); +static void handle_conn_error(struct server_connection *conn, + ares_bool_t critical_failure); + +static ares_bool_t same_questions(const ares_dns_record_t *qrec, + const ares_dns_record_t *arec); +static ares_bool_t same_address(const struct sockaddr *sa, + const struct ares_addr *aa); +static void end_query(const ares_channel_t *channel, struct query *query, + ares_status_t status, const unsigned char *abuf, + size_t alen); + +static void server_increment_failures(struct server_state *server) +{ + ares__slist_node_t *node; + const ares_channel_t *channel = server->channel; + + node = ares__slist_node_find(channel->servers, server); + if (node == NULL) { + return; + } + server->consec_failures++; + ares__slist_node_reinsert(node); +} + +static void server_set_good(struct server_state *server) +{ + ares__slist_node_t *node; + const ares_channel_t *channel = server->channel; + + if (!server->consec_failures) { + return; + } + + node = ares__slist_node_find(channel->servers, server); + if (node == NULL) { + return; + } + + server->consec_failures = 0; + ares__slist_node_reinsert(node); +} + +/* return true if now is exactly check time or later */ +ares_bool_t ares__timedout(const struct timeval *now, + const struct timeval *check) +{ + ares_int64_t secs = ((ares_int64_t)now->tv_sec - (ares_int64_t)check->tv_sec); + + if (secs > 0) { + return ARES_TRUE; /* yes, timed out */ + } + if (secs < 0) { + return ARES_FALSE; /* nope, not timed out */ + } + + /* if the full seconds were identical, check the sub second parts */ + return ((ares_int64_t)now->tv_usec - (ares_int64_t)check->tv_usec) >= 0 + ? ARES_TRUE + : ARES_FALSE; +} + +/* add the specific number of milliseconds to the time in the first argument */ +static void timeadd(struct timeval *now, size_t millisecs) +{ + now->tv_sec += (time_t)millisecs / 1000; + now->tv_usec += (time_t)((millisecs % 1000) * 1000); + + if (now->tv_usec >= 1000000) { + ++(now->tv_sec); + now->tv_usec -= 1000000; + } +} + +/* + * generic process function + */ +static void processfds(ares_channel_t *channel, fd_set *read_fds, + ares_socket_t read_fd, fd_set *write_fds, + ares_socket_t write_fd) +{ + struct timeval now; + + if (channel == NULL) { + return; + } + + ares__channel_lock(channel); + + now = ares__tvnow(); + read_packets(channel, read_fds, read_fd, &now); + process_timeouts(channel, &now); + /* Write last as the other 2 operations might have triggered writes */ + write_tcp_data(channel, write_fds, write_fd); + + ares__channel_unlock(channel); +} + +/* Something interesting happened on the wire, or there was a timeout. + * See what's up and respond accordingly. + */ +void ares_process(ares_channel_t *channel, fd_set *read_fds, fd_set *write_fds) +{ + processfds(channel, read_fds, ARES_SOCKET_BAD, write_fds, ARES_SOCKET_BAD); +} + +/* Something interesting happened on the wire, or there was a timeout. + * See what's up and respond accordingly. + */ +void ares_process_fd(ares_channel_t *channel, + ares_socket_t read_fd, /* use ARES_SOCKET_BAD or valid + file descriptors */ + ares_socket_t write_fd) +{ + processfds(channel, NULL, read_fd, NULL, write_fd); +} + +/* Return 1 if the specified error number describes a readiness error, or 0 + * otherwise. This is mostly for HP-UX, which could return EAGAIN or + * EWOULDBLOCK. See this man page + * + * http://devrsrc1.external.hp.com/STKS/cgi-bin/man2html? + * manpage=/usr/share/man/man2.Z/send.2 + */ +static ares_bool_t try_again(int errnum) +{ +#if !defined EWOULDBLOCK && !defined EAGAIN +# error "Neither EWOULDBLOCK nor EAGAIN defined" +#endif + +#ifdef EWOULDBLOCK + if (errnum == EWOULDBLOCK) { + return ARES_TRUE; + } +#endif + +#if defined EAGAIN && EAGAIN != EWOULDBLOCK + if (errnum == EAGAIN) { + return ARES_TRUE; + } +#endif + + return ARES_FALSE; +} + +/* If any TCP sockets select true for writing, write out queued data + * we have for them. + */ +static void write_tcp_data(ares_channel_t *channel, fd_set *write_fds, + ares_socket_t write_fd) +{ + ares__slist_node_t *node; + + if (!write_fds && (write_fd == ARES_SOCKET_BAD)) { + /* no possible action */ + return; + } + + for (node = ares__slist_node_first(channel->servers); node != NULL; + node = ares__slist_node_next(node)) { + struct server_state *server = ares__slist_node_val(node); + const unsigned char *data; + size_t data_len; + ares_ssize_t count; + + /* Make sure server has data to send and is selected in write_fds or + write_fd. */ + if (ares__buf_len(server->tcp_send) == 0 || server->tcp_conn == NULL) { + continue; + } + + if (write_fds) { + if (!FD_ISSET(server->tcp_conn->fd, write_fds)) { + continue; + } + } else { + if (server->tcp_conn->fd != write_fd) { + continue; + } + } + + if (write_fds) { + /* If there's an error and we close this socket, then open + * another with the same fd to talk to another server, then we + * don't want to think that it was the new socket that was + * ready. This is not disastrous, but is likely to result in + * extra system calls and confusion. */ + FD_CLR(server->tcp_conn->fd, write_fds); + } + + data = ares__buf_peek(server->tcp_send, &data_len); + count = ares__socket_write(channel, server->tcp_conn->fd, data, data_len); + if (count <= 0) { + if (!try_again(SOCKERRNO)) { + handle_conn_error(server->tcp_conn, ARES_TRUE); + } + continue; + } + + /* Strip data written from the buffer */ + ares__buf_consume(server->tcp_send, (size_t)count); + + /* Notify state callback all data is written */ + if (ares__buf_len(server->tcp_send) == 0) { + SOCK_STATE_CALLBACK(channel, server->tcp_conn->fd, 1, 0); + } + } +} + +/* If any TCP socket selects true for reading, read some data, + * allocate a buffer if we finish reading the length word, and process + * a packet if we finish reading one. + */ +static void read_tcp_data(ares_channel_t *channel, + struct server_connection *conn, struct timeval *now) +{ + ares_ssize_t count; + struct server_state *server = conn->server; + + /* Fetch buffer to store data we are reading */ + size_t ptr_len = 65535; + unsigned char *ptr; + + ptr = ares__buf_append_start(server->tcp_parser, &ptr_len); + + if (ptr == NULL) { + handle_conn_error(conn, ARES_FALSE /* not critical to connection */); + return; /* bail out on malloc failure. TODO: make this + function return error codes */ + } + + /* Read from socket */ + count = ares__socket_recv(channel, conn->fd, ptr, ptr_len); + if (count <= 0) { + ares__buf_append_finish(server->tcp_parser, 0); + if (!(count == -1 && try_again(SOCKERRNO))) { + handle_conn_error(conn, ARES_TRUE); + } + return; + } + + /* Record amount of data read */ + ares__buf_append_finish(server->tcp_parser, (size_t)count); + + /* Process all queued answers */ + while (1) { + unsigned short dns_len = 0; + const unsigned char *data = NULL; + size_t data_len = 0; + ares_status_t status; + + /* Tag so we can roll back */ + ares__buf_tag(server->tcp_parser); + + /* Read length indicator */ + if (ares__buf_fetch_be16(server->tcp_parser, &dns_len) != ARES_SUCCESS) { + ares__buf_tag_rollback(server->tcp_parser); + break; + } + + /* Not enough data for a full response yet */ + if (ares__buf_consume(server->tcp_parser, dns_len) != ARES_SUCCESS) { + ares__buf_tag_rollback(server->tcp_parser); + break; + } + + /* Can't fail except for misuse */ + data = ares__buf_tag_fetch(server->tcp_parser, &data_len); + if (data == NULL) { + ares__buf_tag_clear(server->tcp_parser); + break; + } + + /* Strip off 2 bytes length */ + data += 2; + data_len -= 2; + + /* We finished reading this answer; process it */ + status = process_answer(channel, data, data_len, conn, ARES_TRUE, now); + if (status != ARES_SUCCESS) { + handle_conn_error(conn, ARES_TRUE); + return; + } + + /* Since we processed the answer, clear the tag so space can be reclaimed */ + ares__buf_tag_clear(server->tcp_parser); + } + + ares__check_cleanup_conn(channel, conn); +} + +static int socket_list_append(ares_socket_t **socketlist, ares_socket_t fd, + size_t *alloc_cnt, size_t *num) +{ + if (*num >= *alloc_cnt) { + /* Grow by powers of 2 */ + size_t new_alloc = (*alloc_cnt) << 1; + ares_socket_t *new_list = + ares_realloc(socketlist, new_alloc * sizeof(*new_list)); + if (new_list == NULL) { + return 0; + } + *alloc_cnt = new_alloc; + *socketlist = new_list; + } + + (*socketlist)[(*num)++] = fd; + return 1; +} + +static ares_socket_t *channel_socket_list(const ares_channel_t *channel, + size_t *num) +{ + size_t alloc_cnt = 1 << 4; + ares_socket_t *out = ares_malloc(alloc_cnt * sizeof(*out)); + ares__slist_node_t *snode; + + *num = 0; + + if (out == NULL) { + return NULL; + } + + for (snode = ares__slist_node_first(channel->servers); snode != NULL; + snode = ares__slist_node_next(snode)) { + struct server_state *server = ares__slist_node_val(snode); + ares__llist_node_t *node; + + for (node = ares__llist_node_first(server->connections); node != NULL; + node = ares__llist_node_next(node)) { + const struct server_connection *conn = ares__llist_node_val(node); + + if (conn->fd == ARES_SOCKET_BAD) { + continue; + } + + if (!socket_list_append(&out, conn->fd, &alloc_cnt, num)) { + goto fail; + } + } + } + + return out; + +fail: + ares_free(out); + *num = 0; + return NULL; +} + +/* If any UDP sockets select true for reading, process them. */ +static void read_udp_packets_fd(ares_channel_t *channel, + struct server_connection *conn, + struct timeval *now) +{ + ares_ssize_t read_len; + unsigned char buf[MAXENDSSZ + 1]; + +#ifdef HAVE_RECVFROM + ares_socklen_t fromlen; + + union { + struct sockaddr sa; + struct sockaddr_in sa4; + struct sockaddr_in6 sa6; + } from; + + memset(&from, 0, sizeof(from)); +#endif + + /* To reduce event loop overhead, read and process as many + * packets as we can. */ + do { + if (conn->fd == ARES_SOCKET_BAD) { + read_len = -1; + } else { + if (conn->server->addr.family == AF_INET) { + fromlen = sizeof(from.sa4); + } else { + fromlen = sizeof(from.sa6); + } + read_len = ares__socket_recvfrom(channel, conn->fd, (void *)buf, + sizeof(buf), 0, &from.sa, &fromlen); + } + + if (read_len == 0) { + /* UDP is connectionless, so result code of 0 is a 0-length UDP + * packet, and not an indication the connection is closed like on + * tcp */ + continue; + } else if (read_len < 0) { + if (try_again(SOCKERRNO)) { + break; + } + + handle_conn_error(conn, ARES_TRUE); + return; +#ifdef HAVE_RECVFROM + } else if (!same_address(&from.sa, &conn->server->addr)) { + /* The address the response comes from does not match the address we + * sent the request to. Someone may be attempting to perform a cache + * poisoning attack. */ + continue; +#endif + + } else { + process_answer(channel, buf, (size_t)read_len, conn, ARES_FALSE, now); + } + + /* Try to read again only if *we* set up the socket, otherwise it may be + * a blocking socket and would cause recvfrom to hang. */ + } while (read_len >= 0 && channel->sock_funcs == NULL); + + ares__check_cleanup_conn(channel, conn); +} + +static void read_packets(ares_channel_t *channel, fd_set *read_fds, + ares_socket_t read_fd, struct timeval *now) +{ + size_t i; + ares_socket_t *socketlist = NULL; + size_t num_sockets = 0; + struct server_connection *conn = NULL; + ares__llist_node_t *node = NULL; + + if (!read_fds && (read_fd == ARES_SOCKET_BAD)) { + /* no possible action */ + return; + } + + /* Single socket specified */ + if (!read_fds) { + node = ares__htable_asvp_get_direct(channel->connnode_by_socket, read_fd); + if (node == NULL) { + return; + } + + conn = ares__llist_node_val(node); + + if (conn->is_tcp) { + read_tcp_data(channel, conn, now); + } else { + read_udp_packets_fd(channel, conn, now); + } + + return; + } + + /* There is no good way to iterate across an fd_set, instead we must pull a + * list of all known fds, and iterate across that checking against the fd_set. + */ + socketlist = channel_socket_list(channel, &num_sockets); + + for (i = 0; i < num_sockets; i++) { + if (!FD_ISSET(socketlist[i], read_fds)) { + continue; + } + + /* If there's an error and we close this socket, then open + * another with the same fd to talk to another server, then we + * don't want to think that it was the new socket that was + * ready. This is not disastrous, but is likely to result in + * extra system calls and confusion. */ + FD_CLR(socketlist[i], read_fds); + + node = + ares__htable_asvp_get_direct(channel->connnode_by_socket, socketlist[i]); + if (node == NULL) { + return; + } + + conn = ares__llist_node_val(node); + + if (conn->is_tcp) { + read_tcp_data(channel, conn, now); + } else { + read_udp_packets_fd(channel, conn, now); + } + } + + ares_free(socketlist); +} + +/* If any queries have timed out, note the timeout and move them on. */ +static void process_timeouts(ares_channel_t *channel, struct timeval *now) +{ + ares__slist_node_t *node = + ares__slist_node_first(channel->queries_by_timeout); + while (node != NULL) { + struct query *query = ares__slist_node_val(node); + /* Node might be removed, cache next */ + ares__slist_node_t *next = ares__slist_node_next(node); + struct server_connection *conn; + /* Since this is sorted, as soon as we hit a query that isn't timed out, + * break */ + if (!ares__timedout(now, &query->timeout)) { + break; + } + + query->error_status = ARES_ETIMEOUT; + query->timeouts++; + + conn = query->conn; + ares__requeue_query(query, now); + ares__check_cleanup_conn(channel, conn); + + node = next; + } +} + +static ares_status_t rewrite_without_edns(ares_dns_record_t *qdnsrec, + struct query *query) +{ + ares_status_t status; + size_t i; + ares_bool_t found_opt_rr = ARES_FALSE; + unsigned char *msg = NULL; + size_t msglen = 0; + + /* Find and remove the OPT RR record */ + for (i = 0; i < ares_dns_record_rr_cnt(qdnsrec, ARES_SECTION_ADDITIONAL); + i++) { + const ares_dns_rr_t *rr; + rr = ares_dns_record_rr_get(qdnsrec, ARES_SECTION_ADDITIONAL, i); + if (ares_dns_rr_get_type(rr) == ARES_REC_TYPE_OPT) { + ares_dns_record_rr_del(qdnsrec, ARES_SECTION_ADDITIONAL, i); + found_opt_rr = ARES_TRUE; + break; + } + } + + if (!found_opt_rr) { + status = ARES_EFORMERR; + goto done; + } + + /* Rewrite the DNS message */ + status = ares_dns_write(qdnsrec, &msg, &msglen); + if (status != ARES_SUCCESS) { + goto done; + } + + ares_free(query->qbuf); + query->qbuf = msg; + query->qlen = msglen; + +done: + return status; +} + +/* Handle an answer from a server. This must NEVER cleanup the + * server connection! Return something other than ARES_SUCCESS to cause + * the connection to be terminated after this call. */ +static ares_status_t process_answer(ares_channel_t *channel, + const unsigned char *abuf, size_t alen, + struct server_connection *conn, + ares_bool_t tcp, struct timeval *now) +{ + struct query *query; + /* Cache these as once ares__send_query() gets called, it may end up + * invalidating the connection all-together */ + struct server_state *server = conn->server; + ares_dns_record_t *rdnsrec = NULL; + ares_dns_record_t *qdnsrec = NULL; + ares_status_t status; + + /* Parse the response */ + status = ares_dns_parse(abuf, alen, 0, &rdnsrec); + if (status != ARES_SUCCESS) { + /* Malformations are never accepted */ + status = ARES_EBADRESP; + goto cleanup; + } + + /* Find the query corresponding to this packet. The queries are + * hashed/bucketed by query id, so this lookup should be quick. + */ + query = ares__htable_szvp_get_direct(channel->queries_by_qid, + ares_dns_record_get_id(rdnsrec)); + if (!query) { + /* We may have stopped listening for this query, that's ok */ + status = ARES_SUCCESS; + goto cleanup; + } + + /* Parse the question we sent as we use it to compare */ + status = ares_dns_parse(query->qbuf, query->qlen, 0, &qdnsrec); + if (status != ARES_SUCCESS) { + end_query(channel, query, status, NULL, 0); + goto cleanup; + } + + /* Both the query id and the questions must be the same. We will drop any + * replies that aren't for the same query as this is considered invalid. */ + if (!same_questions(qdnsrec, rdnsrec)) { + /* Possible qid conflict due to delayed response, that's ok */ + status = ARES_SUCCESS; + goto cleanup; + } + + /* At this point we know we've received an answer for this query, so we should + * remove it from the connection's queue so we can possibly invalidate the + * connection. Delay cleaning up the connection though as we may enqueue + * something new. */ + ares__llist_node_destroy(query->node_queries_to_conn); + query->node_queries_to_conn = NULL; + + /* If we use EDNS and server answers with FORMERR without an OPT RR, the + * protocol extension is not understood by the responder. We must retry the + * query without EDNS enabled. */ + if (ares_dns_record_get_rcode(rdnsrec) == ARES_RCODE_FORMERR && + ares_dns_has_opt_rr(qdnsrec) && !ares_dns_has_opt_rr(rdnsrec)) { + status = rewrite_without_edns(qdnsrec, query); + if (status != ARES_SUCCESS) { + end_query(channel, query, status, NULL, 0); + goto cleanup; + } + + ares__send_query(query, now); + status = ARES_SUCCESS; + goto cleanup; + } + + /* If we got a truncated UDP packet and are not ignoring truncation, + * don't accept the packet, and switch the query to TCP if we hadn't + * done so already. + */ + if (ares_dns_record_get_flags(rdnsrec) & ARES_FLAG_TC && !tcp && + !(channel->flags & ARES_FLAG_IGNTC)) { + query->using_tcp = ARES_TRUE; + ares__send_query(query, now); + status = ARES_SUCCESS; /* Switched to TCP is ok */ + goto cleanup; + } + + /* If we aren't passing through all error packets, discard packets + * with SERVFAIL, NOTIMP, or REFUSED response codes. + */ + if (!(channel->flags & ARES_FLAG_NOCHECKRESP)) { + ares_dns_rcode_t rcode = ares_dns_record_get_rcode(rdnsrec); + if (rcode == ARES_RCODE_SERVFAIL || rcode == ARES_RCODE_NOTIMP || + rcode == ARES_RCODE_REFUSED) { + switch (rcode) { + case ARES_RCODE_SERVFAIL: + query->error_status = ARES_ESERVFAIL; + break; + case ARES_RCODE_NOTIMP: + query->error_status = ARES_ENOTIMP; + break; + case ARES_RCODE_REFUSED: + query->error_status = ARES_EREFUSED; + break; + default: + break; + } + server_increment_failures(server); + ares__requeue_query(query, now); + + /* Should any of these cause a connection termination? + * Maybe SERVER_FAILURE? */ + status = ARES_SUCCESS; + goto cleanup; + } + } + + /* If cache insertion was successful, it took ownership. We ignore + * other cache insertion failures. */ + if (ares_qcache_insert(channel, now, query, rdnsrec) == ARES_SUCCESS) { + rdnsrec = NULL; + } + + server_set_good(server); + end_query(channel, query, ARES_SUCCESS, abuf, alen); + + status = ARES_SUCCESS; + +cleanup: + ares_dns_record_destroy(rdnsrec); + ares_dns_record_destroy(qdnsrec); + return status; +} + +static void handle_conn_error(struct server_connection *conn, + ares_bool_t critical_failure) +{ + struct server_state *server = conn->server; + + /* This will requeue any connections automatically */ + ares__close_connection(conn); + + if (critical_failure) { + server_increment_failures(server); + } +} + +ares_status_t ares__requeue_query(struct query *query, struct timeval *now) +{ + const ares_channel_t *channel = query->channel; + size_t max_tries = ares__slist_len(channel->servers) * channel->tries; + + query->try_count++; + + if (query->try_count < max_tries && !query->no_retries) { + return ares__send_query(query, now); + } + + /* If we are here, all attempts to perform query failed. */ + if (query->error_status == ARES_SUCCESS) { + query->error_status = ARES_ETIMEOUT; + } + + end_query(channel, query, query->error_status, NULL, 0); + return ARES_ETIMEOUT; +} + +/* Pick a random server from the list, we first get a random number in the + * range of the number of servers, then scan until we find that server in + * the list */ +static struct server_state *ares__random_server(ares_channel_t *channel) +{ + unsigned char c; + size_t cnt; + size_t idx; + ares__slist_node_t *node; + size_t num_servers = ares__slist_len(channel->servers); + + /* Silence coverity, not possible */ + if (num_servers == 0) { + return NULL; + } + + ares__rand_bytes(channel->rand_state, &c, 1); + + cnt = c; + idx = cnt % num_servers; + + cnt = 0; + for (node = ares__slist_node_first(channel->servers); node != NULL; + node = ares__slist_node_next(node)) { + if (cnt == idx) { + return ares__slist_node_val(node); + } + + cnt++; + } + + return NULL; +} + +static ares_status_t ares__append_tcpbuf(struct server_state *server, + const struct query *query) +{ + ares_status_t status; + + status = ares__buf_append_be16(server->tcp_send, (unsigned short)query->qlen); + if (status != ARES_SUCCESS) { + return status; + } + return ares__buf_append(server->tcp_send, query->qbuf, query->qlen); +} + +static size_t ares__calc_query_timeout(const struct query *query) +{ + const ares_channel_t *channel = query->channel; + size_t timeplus = channel->timeout; + size_t rounds; + size_t num_servers = ares__slist_len(channel->servers); + + if (num_servers == 0) { + return 0; + } + + /* For each trip through the entire server list, we want to double the + * retry from the last retry */ + rounds = (query->try_count / num_servers); + + if (rounds > 0) { + timeplus <<= rounds; + } + + if (channel->maxtimeout && timeplus > channel->maxtimeout) { + timeplus = channel->maxtimeout; + } + + /* Add some jitter to the retry timeout. + * + * Jitter is needed in situation when resolve requests are performed + * simultaneously from multiple hosts and DNS server throttle these requests. + * Adding randomness allows to avoid synchronisation of retries. + * + * Value of timeplus adjusted randomly to the range [0.5 * timeplus, + * timeplus]. + */ + if (rounds > 0) { + unsigned short r; + float delta_multiplier; + + ares__rand_bytes(channel->rand_state, (unsigned char *)&r, sizeof(r)); + delta_multiplier = ((float)r / USHRT_MAX) * 0.5f; + timeplus -= (size_t)((float)timeplus * delta_multiplier); + } + + /* We want explicitly guarantee that timeplus is greater or equal to timeout + * specified in channel options. */ + if (timeplus < channel->timeout) { + timeplus = channel->timeout; + } + + return timeplus; +} + +ares_status_t ares__send_query(struct query *query, struct timeval *now) +{ + ares_channel_t *channel = query->channel; + struct server_state *server; + struct server_connection *conn; + size_t timeplus; + ares_status_t status; + ares_bool_t new_connection = ARES_FALSE; + + query->conn = NULL; + + /* Choose the server to send the query to */ + if (channel->rotate) { + server = ares__random_server(channel); + } else { + /* Pull first */ + server = ares__slist_first_val(channel->servers); + } + + if (server == NULL) { + end_query(channel, query, ARES_ESERVFAIL /* ? */, NULL, 0); + return ARES_ECONNREFUSED; + } + + if (query->using_tcp) { + size_t prior_len = 0; + /* Make sure the TCP socket for this server is set up and queue + * a send request. + */ + if (server->tcp_conn == NULL) { + new_connection = ARES_TRUE; + status = ares__open_connection(channel, server, ARES_TRUE); + switch (status) { + /* Good result, continue on */ + case ARES_SUCCESS: + break; + + /* These conditions are retryable as they are server-specific + * error codes */ + case ARES_ECONNREFUSED: + case ARES_EBADFAMILY: + server_increment_failures(server); + query->error_status = status; + return ares__requeue_query(query, now); + + /* Anything else is not retryable, likely ENOMEM */ + default: + end_query(channel, query, status, NULL, 0); + return status; + } + } + + conn = server->tcp_conn; + + prior_len = ares__buf_len(server->tcp_send); + + status = ares__append_tcpbuf(server, query); + if (status != ARES_SUCCESS) { + end_query(channel, query, status, NULL, 0); + + /* Only safe to kill connection if it was new, otherwise it should be + * cleaned up by another process later */ + if (new_connection) { + ares__close_connection(conn); + } + return status; + } + + if (prior_len == 0) { + SOCK_STATE_CALLBACK(channel, conn->fd, 1, 1); + } + + } else { + ares__llist_node_t *node = ares__llist_node_first(server->connections); + + /* Don't use the found connection if we've gone over the maximum number + * of queries. Also, skip over the TCP connection if it is the first in + * the list */ + if (node != NULL) { + conn = ares__llist_node_val(node); + if (conn->is_tcp) { + node = NULL; + } else if (channel->udp_max_queries > 0 && + conn->total_queries >= channel->udp_max_queries) { + node = NULL; + } + } + + if (node == NULL) { + new_connection = ARES_TRUE; + status = ares__open_connection(channel, server, ARES_FALSE); + switch (status) { + /* Good result, continue on */ + case ARES_SUCCESS: + break; + + /* These conditions are retryable as they are server-specific + * error codes */ + case ARES_ECONNREFUSED: + case ARES_EBADFAMILY: + server_increment_failures(server); + query->error_status = status; + return ares__requeue_query(query, now); + + /* Anything else is not retryable, likely ENOMEM */ + default: + end_query(channel, query, status, NULL, 0); + return status; + } + node = ares__llist_node_first(server->connections); + } + + conn = ares__llist_node_val(node); + if (ares__socket_write(channel, conn->fd, query->qbuf, query->qlen) == -1) { + /* FIXME: Handle EAGAIN here since it likely can happen. */ + server_increment_failures(server); + status = ares__requeue_query(query, now); + + /* Only safe to kill connection if it was new, otherwise it should be + * cleaned up by another process later */ + if (new_connection) { + ares__close_connection(conn); + } + + return status; + } + } + + timeplus = ares__calc_query_timeout(query); + + /* Keep track of queries bucketed by timeout, so we can process + * timeout events quickly. + */ + ares__slist_node_destroy(query->node_queries_by_timeout); + query->timeout = *now; + timeadd(&query->timeout, timeplus); + query->node_queries_by_timeout = + ares__slist_insert(channel->queries_by_timeout, query); + if (!query->node_queries_by_timeout) { + end_query(channel, query, ARES_ENOMEM, NULL, 0); + /* Only safe to kill connection if it was new, otherwise it should be + * cleaned up by another process later */ + if (new_connection) { + ares__close_connection(conn); + } + return ARES_ENOMEM; + } + + /* Keep track of queries bucketed by connection, so we can process errors + * quickly. */ + ares__llist_node_destroy(query->node_queries_to_conn); + query->node_queries_to_conn = + ares__llist_insert_last(conn->queries_to_conn, query); + + if (query->node_queries_to_conn == NULL) { + end_query(channel, query, ARES_ENOMEM, NULL, 0); + /* Only safe to kill connection if it was new, otherwise it should be + * cleaned up by another process later */ + if (new_connection) { + ares__close_connection(conn); + } + return ARES_ENOMEM; + } + + query->conn = conn; + conn->total_queries++; + return ARES_SUCCESS; +} + +static ares_bool_t same_questions(const ares_dns_record_t *qrec, + const ares_dns_record_t *arec) +{ + size_t i; + ares_bool_t rv = ARES_FALSE; + + + if (ares_dns_record_query_cnt(qrec) != ares_dns_record_query_cnt(arec)) { + goto done; + } + + for (i = 0; i < ares_dns_record_query_cnt(qrec); i++) { + const char *qname = NULL; + const char *aname = NULL; + ares_dns_rec_type_t qtype; + ares_dns_rec_type_t atype; + ares_dns_class_t qclass; + ares_dns_class_t aclass; + + if (ares_dns_record_query_get(qrec, i, &qname, &qtype, &qclass) != + ARES_SUCCESS || + qname == NULL) { + goto done; + } + + if (ares_dns_record_query_get(arec, i, &aname, &atype, &aclass) != + ARES_SUCCESS || + aname == NULL) { + goto done; + } + if (strcasecmp(qname, aname) != 0 || qtype != atype || qclass != aclass) { + goto done; + } + } + + rv = ARES_TRUE; + +done: + return rv; +} + +static ares_bool_t same_address(const struct sockaddr *sa, + const struct ares_addr *aa) +{ + const void *addr1; + const void *addr2; + + if (sa->sa_family == aa->family) { + switch (aa->family) { + case AF_INET: + addr1 = &aa->addr.addr4; + addr2 = &(CARES_INADDR_CAST(struct sockaddr_in *, sa))->sin_addr; + if (memcmp(addr1, addr2, sizeof(aa->addr.addr4)) == 0) { + return ARES_TRUE; /* match */ + } + break; + case AF_INET6: + addr1 = &aa->addr.addr6; + addr2 = &(CARES_INADDR_CAST(struct sockaddr_in6 *, sa))->sin6_addr; + if (memcmp(addr1, addr2, sizeof(aa->addr.addr6)) == 0) { + return ARES_TRUE; /* match */ + } + break; + default: + break; /* LCOV_EXCL_LINE */ + } + } + return ARES_FALSE; /* different */ +} + +static void ares_detach_query(struct query *query) +{ + /* Remove the query from all the lists in which it is linked */ + ares__htable_szvp_remove(query->channel->queries_by_qid, query->qid); + ares__slist_node_destroy(query->node_queries_by_timeout); + ares__llist_node_destroy(query->node_queries_to_conn); + ares__llist_node_destroy(query->node_all_queries); + query->node_queries_by_timeout = NULL; + query->node_queries_to_conn = NULL; + query->node_all_queries = NULL; +} + +static void end_query(const ares_channel_t *channel, struct query *query, + ares_status_t status, const unsigned char *abuf, + size_t alen) +{ + (void)channel; + + /* Invoke the callback. */ + query->callback(query->arg, (int)status, (int)query->timeouts, + /* due to prior design flaws, abuf isn't meant to be modified, + * but bad prototypes, ugh. Lets cast off constfor compat. */ + (unsigned char *)((void *)((size_t)abuf)), (int)alen); + ares__free_query(query); +} + +void ares__free_query(struct query *query) +{ + ares_detach_query(query); + /* Zero out some important stuff, to help catch bugs */ + query->callback = NULL; + query->arg = NULL; + /* Deallocate the memory associated with the query */ + ares_free(query->qbuf); + + ares_free(query); +} diff --git a/lib/c-ares-1.23.0/src/lib/ares_qcache.c b/lib/c-ares-1.23.0/src/lib/ares_qcache.c new file mode 100644 index 00000000000..ce5a19f8841 --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares_qcache.c @@ -0,0 +1,455 @@ +/* MIT License + * + * Copyright (c) 2023 Brad House + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ +#include "ares_setup.h" +#include "ares.h" +#include "ares_private.h" + +struct ares__qcache { + ares__htable_strvp_t *cache; + ares__slist_t *expire; + unsigned int max_ttl; +}; + +typedef struct { + char *key; + ares_dns_record_t *dnsrec; + time_t expire_ts; + time_t insert_ts; +} ares__qcache_entry_t; + +static char *ares__qcache_calc_key(const ares_dns_record_t *dnsrec) +{ + ares__buf_t *buf = ares__buf_create(); + size_t i; + ares_status_t status; + ares_dns_flags_t flags; + + if (dnsrec == NULL || buf == NULL) { + return NULL; + } + + /* Format is OPCODE|FLAGS[|QTYPE1|QCLASS1|QNAME1]... */ + + status = ares__buf_append_str( + buf, ares_dns_opcode_tostr(ares_dns_record_get_opcode(dnsrec))); + if (status != ARES_SUCCESS) { + goto fail; + } + + status = ares__buf_append_byte(buf, '|'); + if (status != ARES_SUCCESS) { + goto fail; + } + + flags = ares_dns_record_get_flags(dnsrec); + /* Only care about RD and CD */ + if (flags & ARES_FLAG_RD) { + status = ares__buf_append_str(buf, "rd"); + if (status != ARES_SUCCESS) { + goto fail; + } + } + if (flags & ARES_FLAG_CD) { + status = ares__buf_append_str(buf, "cd"); + if (status != ARES_SUCCESS) { + goto fail; + } + } + + for (i = 0; i < ares_dns_record_query_cnt(dnsrec); i++) { + const char *name; + ares_dns_rec_type_t qtype; + ares_dns_class_t qclass; + + status = ares_dns_record_query_get(dnsrec, i, &name, &qtype, &qclass); + if (status != ARES_SUCCESS) { + goto fail; + } + + status = ares__buf_append_byte(buf, '|'); + if (status != ARES_SUCCESS) { + goto fail; + } + + status = ares__buf_append_str(buf, ares_dns_rec_type_tostr(qtype)); + if (status != ARES_SUCCESS) { + goto fail; + } + + status = ares__buf_append_byte(buf, '|'); + if (status != ARES_SUCCESS) { + goto fail; + } + + status = ares__buf_append_str(buf, ares_dns_class_tostr(qclass)); + if (status != ARES_SUCCESS) { + goto fail; + } + + status = ares__buf_append_byte(buf, '|'); + if (status != ARES_SUCCESS) { + goto fail; + } + + status = ares__buf_append_str(buf, name); + if (status != ARES_SUCCESS) { + goto fail; + } + } + + return ares__buf_finish_str(buf, NULL); + +fail: + ares__buf_destroy(buf); + return NULL; +} + +static void ares__qcache_expire(ares__qcache_t *cache, + const struct timeval *now) +{ + ares__slist_node_t *node; + + if (cache == NULL) { + return; + } + + while ((node = ares__slist_node_first(cache->expire)) != NULL) { + const ares__qcache_entry_t *entry = ares__slist_node_val(node); + if (entry->expire_ts > now->tv_sec) { + break; + } + + ares__htable_strvp_remove(cache->cache, entry->key); + ares__slist_node_destroy(node); + } +} + +void ares__qcache_flush(ares__qcache_t *cache) +{ + struct timeval now; + memset(&now, 0, sizeof(now)); + ares__qcache_expire(cache, &now); +} + +void ares__qcache_destroy(ares__qcache_t *cache) +{ + if (cache == NULL) { + return; + } + + ares__htable_strvp_destroy(cache->cache); + ares__slist_destroy(cache->expire); + ares_free(cache); +} + +static int ares__qcache_entry_sort_cb(const void *arg1, const void *arg2) +{ + const ares__qcache_entry_t *entry1 = arg1; + const ares__qcache_entry_t *entry2 = arg2; + + if (entry1->expire_ts > entry2->expire_ts) { + return 1; + } + + if (entry1->expire_ts < entry2->expire_ts) { + return -1; + } + + return 0; +} + +static void ares__qcache_entry_destroy_cb(void *arg) +{ + ares__qcache_entry_t *entry = arg; + if (entry == NULL) { + return; + } + + ares_free(entry->key); + ares_dns_record_destroy(entry->dnsrec); + ares_free(entry); +} + +ares_status_t ares__qcache_create(ares_rand_state *rand_state, + unsigned int max_ttl, + ares__qcache_t **cache_out) +{ + ares_status_t status = ARES_SUCCESS; + ares__qcache_t *cache; + + cache = ares_malloc_zero(sizeof(*cache)); + if (cache == NULL) { + status = ARES_ENOMEM; + goto done; + } + + cache->cache = ares__htable_strvp_create(NULL); + if (cache->cache == NULL) { + status = ARES_ENOMEM; + goto done; + } + + cache->expire = ares__slist_create(rand_state, ares__qcache_entry_sort_cb, + ares__qcache_entry_destroy_cb); + if (cache->expire == NULL) { + status = ARES_ENOMEM; + goto done; + } + + cache->max_ttl = max_ttl; + +done: + if (status != ARES_SUCCESS) { + *cache_out = NULL; + ares__qcache_destroy(cache); + return status; + } + + *cache_out = cache; + return status; +} + +static unsigned int ares__qcache_calc_minttl(ares_dns_record_t *dnsrec) +{ + unsigned int minttl = 0xFFFFFFFF; + size_t sect; + + for (sect = ARES_SECTION_ANSWER; sect <= ARES_SECTION_ADDITIONAL; sect++) { + size_t i; + for (i = 0; i < ares_dns_record_rr_cnt(dnsrec, (ares_dns_section_t)sect); + i++) { + const ares_dns_rr_t *rr = + ares_dns_record_rr_get(dnsrec, (ares_dns_section_t)sect, i); + ares_dns_rec_type_t type = ares_dns_rr_get_type(rr); + unsigned int ttl = ares_dns_rr_get_ttl(rr); + if (type == ARES_REC_TYPE_OPT || type == ARES_REC_TYPE_SOA) { + continue; + } + + if (ttl < minttl) { + minttl = ttl; + } + } + } + + return minttl; +} + +static unsigned int ares__qcache_soa_minimum(ares_dns_record_t *dnsrec) +{ + size_t i; + + /* RFC 2308 Section 5 says its the minimum of MINIMUM and the TTL of the + * record. */ + for (i = 0; i < ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_AUTHORITY); i++) { + const ares_dns_rr_t *rr = + ares_dns_record_rr_get(dnsrec, ARES_SECTION_AUTHORITY, i); + ares_dns_rec_type_t type = ares_dns_rr_get_type(rr); + unsigned int ttl; + unsigned int minimum; + + if (type != ARES_REC_TYPE_SOA) { + continue; + } + + minimum = ares_dns_rr_get_u32(rr, ARES_RR_SOA_MINIMUM); + ttl = ares_dns_rr_get_ttl(rr); + + if (ttl > minimum) { + return minimum; + } + return ttl; + } + + return 0; +} + +static char *ares__qcache_calc_key_frombuf(const unsigned char *qbuf, + size_t qlen) +{ + ares_status_t status; + ares_dns_record_t *dnsrec = NULL; + char *key = NULL; + + status = ares_dns_parse(qbuf, qlen, 0, &dnsrec); + if (status != ARES_SUCCESS) { + goto done; + } + + key = ares__qcache_calc_key(dnsrec); + +done: + ares_dns_record_destroy(dnsrec); + return key; +} + +/* On success, takes ownership of dnsrec */ +static ares_status_t ares__qcache_insert(ares__qcache_t *qcache, + ares_dns_record_t *dnsrec, + const unsigned char *qbuf, size_t qlen, + const struct timeval *now) +{ + ares__qcache_entry_t *entry; + unsigned int ttl; + ares_dns_rcode_t rcode = ares_dns_record_get_rcode(dnsrec); + ares_dns_flags_t flags = ares_dns_record_get_flags(dnsrec); + + if (qcache == NULL || dnsrec == NULL) { + return ARES_EFORMERR; + } + + /* Only save NOERROR or NXDOMAIN */ + if (rcode != ARES_RCODE_NOERROR && rcode != ARES_RCODE_NXDOMAIN) { + return ARES_ENOTIMP; + } + + /* Don't save truncated queries */ + if (flags & ARES_FLAG_TC) { + return ARES_ENOTIMP; + } + + /* Look at SOA for NXDOMAIN for minimum */ + if (rcode == ARES_RCODE_NXDOMAIN) { + ttl = ares__qcache_soa_minimum(dnsrec); + } else { + ttl = ares__qcache_calc_minttl(dnsrec); + } + + /* Don't cache something that is already expired */ + if (ttl == 0) { + return ARES_EREFUSED; + } + + if (ttl > qcache->max_ttl) { + ttl = qcache->max_ttl; + } + + entry = ares_malloc_zero(sizeof(*entry)); + if (entry == NULL) { + goto fail; + } + + entry->dnsrec = dnsrec; + entry->expire_ts = now->tv_sec + ttl; + entry->insert_ts = now->tv_sec; + + /* We can't guarantee the server responded with the same flags as the + * request had, so we have to re-parse the request in order to generate the + * key for caching, but we'll only do this once we know for sure we really + * want to cache it */ + entry->key = ares__qcache_calc_key_frombuf(qbuf, qlen); + if (entry->key == NULL) { + goto fail; + } + + if (!ares__htable_strvp_insert(qcache->cache, entry->key, entry)) { + goto fail; + } + + if (ares__slist_insert(qcache->expire, entry) == NULL) { + goto fail; + } + + return ARES_SUCCESS; + +fail: + if (entry != NULL && entry->key != NULL) { + ares__htable_strvp_remove(qcache->cache, entry->key); + ares_free(entry->key); + ares_free(entry); + } + return ARES_ENOMEM; +} + +static ares_status_t ares__qcache_fetch(ares__qcache_t *qcache, + const ares_dns_record_t *dnsrec, + const struct timeval *now, + unsigned char **buf, size_t *buf_len) +{ + char *key = NULL; + ares__qcache_entry_t *entry; + ares_status_t status; + + if (qcache == NULL || dnsrec == NULL) { + return ARES_EFORMERR; + } + + ares__qcache_expire(qcache, now); + + key = ares__qcache_calc_key(dnsrec); + if (key == NULL) { + status = ARES_ENOMEM; + goto done; + } + + entry = ares__htable_strvp_get_direct(qcache->cache, key); + if (entry == NULL) { + status = ARES_ENOTFOUND; + goto done; + } + + ares_dns_record_write_ttl_decrement( + entry->dnsrec, (unsigned int)(now->tv_sec - entry->insert_ts)); + + status = ares_dns_write(entry->dnsrec, buf, buf_len); + +done: + ares_free(key); + return status; +} + +ares_status_t ares_qcache_insert(ares_channel_t *channel, + const struct timeval *now, + const struct query *query, + ares_dns_record_t *dnsrec) +{ + return ares__qcache_insert(channel->qcache, dnsrec, query->qbuf, query->qlen, + now); +} + +ares_status_t ares_qcache_fetch(ares_channel_t *channel, + const struct timeval *now, + const unsigned char *qbuf, size_t qlen, + unsigned char **abuf, size_t *alen) +{ + ares_status_t status; + ares_dns_record_t *dnsrec = NULL; + + if (channel->qcache == NULL) { + return ARES_ENOTFOUND; + } + + status = ares_dns_parse(qbuf, qlen, 0, &dnsrec); + if (status != ARES_SUCCESS) { + goto done; + } + + status = ares__qcache_fetch(channel->qcache, dnsrec, now, abuf, alen); + +done: + ares_dns_record_destroy(dnsrec); + return status; +} diff --git a/lib/c-ares-1.23.0/src/lib/ares_query.c b/lib/c-ares-1.23.0/src/lib/ares_query.c new file mode 100644 index 00000000000..098e6789471 --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares_query.c @@ -0,0 +1,139 @@ +/* MIT License + * + * Copyright (c) 1998 Massachusetts Institute of Technology + * Copyright (c) The c-ares project and its contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ + +#include "ares_setup.h" + +#ifdef HAVE_NETINET_IN_H +# include +#endif + +#include "ares_nameser.h" + +#include "ares.h" +#include "ares_dns.h" +#include "ares_private.h" + +struct qquery { + ares_callback callback; + void *arg; +}; + +static void qcallback(void *arg, int status, int timeouts, unsigned char *abuf, + int alen); + +ares_status_t ares_query_qid(ares_channel_t *channel, const char *name, + int dnsclass, int type, ares_callback callback, + void *arg, unsigned short *qid) +{ + struct qquery *qquery; + unsigned char *qbuf; + int qlen; + int rd; + ares_status_t status; + + /* Compose the query. */ + rd = !(channel->flags & ARES_FLAG_NORECURSE); + status = (ares_status_t)ares_create_query( + name, dnsclass, type, 0, rd, &qbuf, &qlen, + (channel->flags & ARES_FLAG_EDNS) ? (int)channel->ednspsz : 0); + if (status != ARES_SUCCESS) { + if (qbuf != NULL) { + ares_free(qbuf); + } + callback(arg, (int)status, 0, NULL, 0); + return status; + } + + /* Allocate and fill in the query structure. */ + qquery = ares_malloc(sizeof(struct qquery)); + if (!qquery) { + ares_free_string(qbuf); + callback(arg, ARES_ENOMEM, 0, NULL, 0); + return ARES_ENOMEM; + } + qquery->callback = callback; + qquery->arg = arg; + + /* Send it off. qcallback will be called when we get an answer. */ + status = ares_send_ex(channel, qbuf, (size_t)qlen, qcallback, qquery, qid); + ares_free_string(qbuf); + + return status; +} + +void ares_query(ares_channel_t *channel, const char *name, int dnsclass, + int type, ares_callback callback, void *arg) +{ + if (channel == NULL) { + return; + } + ares__channel_lock(channel); + ares_query_qid(channel, name, dnsclass, type, callback, arg, NULL); + ares__channel_unlock(channel); +} + +static void qcallback(void *arg, int status, int timeouts, unsigned char *abuf, + int alen) +{ + struct qquery *qquery = (struct qquery *)arg; + size_t ancount; + int rcode; + + if (status != ARES_SUCCESS) { + qquery->callback(qquery->arg, status, timeouts, abuf, alen); + } else { + /* Pull the response code and answer count from the packet. */ + rcode = DNS_HEADER_RCODE(abuf); + ancount = DNS_HEADER_ANCOUNT(abuf); + + /* Convert errors. */ + switch (rcode) { + case NOERROR: + status = (ancount > 0) ? ARES_SUCCESS : ARES_ENODATA; + break; + case FORMERR: + status = ARES_EFORMERR; + break; + case SERVFAIL: + status = ARES_ESERVFAIL; + break; + case NXDOMAIN: + status = ARES_ENOTFOUND; + break; + case NOTIMP: + status = ARES_ENOTIMP; + break; + case REFUSED: + status = ARES_EREFUSED; + break; + default: + break; + } + qquery->callback(qquery->arg, status, timeouts, abuf, alen); + } + ares_free(qquery); +} diff --git a/lib/c-ares-1.23.0/src/lib/ares_rand.c b/lib/c-ares-1.23.0/src/lib/ares_rand.c new file mode 100644 index 00000000000..86313b2de95 --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares_rand.c @@ -0,0 +1,351 @@ +/* MIT License + * + * Copyright (c) 2023 Brad House + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ + +#include "ares_setup.h" +#include "ares.h" +#include "ares_private.h" +#include + +#if !defined(HAVE_ARC4RANDOM_BUF) && !defined(HAVE_GETRANDOM) && \ + !defined(_WIN32) +# define ARES_NEEDS_RC4 1 +#endif + +typedef enum { + ARES_RAND_OS = 1, /* OS-provided such as RtlGenRandom or arc4random */ + ARES_RAND_FILE = 2, /* OS file-backed random number generator */ +#ifdef ARES_NEEDS_RC4 + ARES_RAND_RC4 = 3 /* Internal RC4 based PRNG */ +#endif +} ares_rand_backend; + +/* Don't build RC4 code if it goes unused as it will generate dead code + * warnings */ +#ifdef ARES_NEEDS_RC4 +# define ARES_RC4_KEY_LEN 32 /* 256 bits */ + +typedef struct ares_rand_rc4 { + unsigned char S[256]; + size_t i; + size_t j; +} ares_rand_rc4; + +static unsigned int ares_u32_from_ptr(void *addr) +{ + if (sizeof(void *) == 8) { + return (unsigned int)((((ares_uint64_t)addr >> 32) & 0xFFFFFFFF) | + ((ares_uint64_t)addr & 0xFFFFFFFF)); + } + return (unsigned int)((size_t)addr & 0xFFFFFFFF); +} + +/* initialize an rc4 key as the last possible fallback. */ +static void ares_rc4_generate_key(ares_rand_rc4 *rc4_state, unsigned char *key, + size_t key_len) +{ + size_t i; + size_t len = 0; + unsigned int data; + struct timeval tv; + + if (key_len != ARES_RC4_KEY_LEN) { + return; + } + + /* Randomness is hard to come by. Maybe the system randomizes heap and stack + * addresses. Maybe the current timestamp give us some randomness. Use + * rc4_state (heap), &i (stack), and ares__tvnow() + */ + data = ares_u32_from_ptr(rc4_state); + memcpy(key + len, &data, sizeof(data)); + len += sizeof(data); + + data = ares_u32_from_ptr(&i); + memcpy(key + len, &data, sizeof(data)); + len += sizeof(data); + + tv = ares__tvnow(); + data = (unsigned int)((tv.tv_sec | tv.tv_usec) & 0xFFFFFFFF); + memcpy(key + len, &data, sizeof(data)); + len += sizeof(data); + + srand(ares_u32_from_ptr(rc4_state) | ares_u32_from_ptr(&i) | + (unsigned int)((tv.tv_sec | tv.tv_usec) & 0xFFFFFFFF)); + + for (i = len; i < key_len; i++) { + key[i] = (unsigned char)(rand() % 256); /* LCOV_EXCL_LINE */ + } +} + +static void ares_rc4_init(ares_rand_rc4 *rc4_state) +{ + unsigned char key[ARES_RC4_KEY_LEN]; + size_t i; + size_t j; + + ares_rc4_generate_key(rc4_state, key, sizeof(key)); + + for (i = 0; i < sizeof(rc4_state->S); i++) { + rc4_state->S[i] = i & 0xFF; + } + + for (i = 0, j = 0; i < 256; i++) { + j = (j + rc4_state->S[i] + key[i % sizeof(key)]) % 256; + ARES_SWAP_BYTE(&rc4_state->S[i], &rc4_state->S[j]); + } + + rc4_state->i = 0; + rc4_state->j = 0; +} + +/* Just outputs the key schedule, no need to XOR with any data since we have + * none */ +static void ares_rc4_prng(ares_rand_rc4 *rc4_state, unsigned char *buf, + size_t len) +{ + unsigned char *S = rc4_state->S; + size_t i = rc4_state->i; + size_t j = rc4_state->j; + size_t cnt; + + for (cnt = 0; cnt < len; cnt++) { + i = (i + 1) % 256; + j = (j + S[i]) % 256; + + ARES_SWAP_BYTE(&S[i], &S[j]); + buf[cnt] = S[(S[i] + S[j]) % 256]; + } + + rc4_state->i = i; + rc4_state->j = j; +} + +#endif /* ARES_NEEDS_RC4 */ + + +struct ares_rand_state { + ares_rand_backend type; + + union { + FILE *rand_file; +#ifdef ARES_NEEDS_RC4 + ares_rand_rc4 rc4; +#endif + } state; + + /* Since except for RC4, random data will likely result in a syscall, lets + * pre-pull 256 bytes at a time. Every query will pull 2 bytes off this so + * that means we should only need a syscall every 128 queries. 256bytes + * appears to be a sweet spot that may be able to be served without + * interruption */ + unsigned char cache[256]; + size_t cache_remaining; +}; + +/* Define RtlGenRandom = SystemFunction036. This is in advapi32.dll. There is + * no need to dynamically load this, other software used widely does not. + * http://blogs.msdn.com/michael_howard/archive/2005/01/14/353379.aspx + * https://docs.microsoft.com/en-us/windows/win32/api/ntsecapi/nf-ntsecapi-rtlgenrandom + */ +#ifdef _WIN32 +BOOLEAN WINAPI SystemFunction036(PVOID RandomBuffer, ULONG RandomBufferLength); +# ifndef RtlGenRandom +# define RtlGenRandom(a, b) SystemFunction036(a, b) +# endif +#endif + + +static ares_bool_t ares__init_rand_engine(ares_rand_state *state) +{ + memset(state, 0, sizeof(*state)); + +#if defined(HAVE_ARC4RANDOM_BUF) || defined(HAVE_GETRANDOM) || defined(_WIN32) + state->type = ARES_RAND_OS; + return ARES_TRUE; +#elif defined(CARES_RANDOM_FILE) + state->type = ARES_RAND_FILE; + state->state.rand_file = fopen(CARES_RANDOM_FILE, "rb"); + if (state->state.rand_file) { + setvbuf(state->state.rand_file, NULL, _IONBF, 0); + return ARES_TRUE; + } + /* Fall-Thru on failure to RC4 */ +#endif + +#ifdef ARES_NEEDS_RC4 + state->type = ARES_RAND_RC4; + ares_rc4_init(&state->state.rc4); + + /* Currently cannot fail */ + return ARES_TRUE; +#endif +} + +ares_rand_state *ares__init_rand_state(void) +{ + ares_rand_state *state = NULL; + + state = ares_malloc(sizeof(*state)); + if (!state) { + return NULL; + } + + if (!ares__init_rand_engine(state)) { + ares_free(state); + return NULL; + } + + return state; +} + +static void ares__clear_rand_state(ares_rand_state *state) +{ + if (!state) { + return; + } + + switch (state->type) { + case ARES_RAND_OS: + break; + case ARES_RAND_FILE: + fclose(state->state.rand_file); + break; +#ifdef ARES_NEEDS_RC4 + case ARES_RAND_RC4: + break; +#endif + } +} + +static void ares__reinit_rand(ares_rand_state *state) +{ + ares__clear_rand_state(state); + ares__init_rand_engine(state); +} + +void ares__destroy_rand_state(ares_rand_state *state) +{ + if (!state) { + return; + } + + ares__clear_rand_state(state); + ares_free(state); +} + +static void ares__rand_bytes_fetch(ares_rand_state *state, unsigned char *buf, + size_t len) +{ + while (1) { + size_t bytes_read = 0; + + switch (state->type) { + case ARES_RAND_OS: +#ifdef _WIN32 + RtlGenRandom(buf, (ULONG)len); + return; +#elif defined(HAVE_ARC4RANDOM_BUF) + arc4random_buf(buf, len); + return; +#elif defined(HAVE_GETRANDOM) + while (1) { + size_t n = len - bytes_read; + /* getrandom() on Linux always succeeds and is never + * interrupted by a signal when requesting <= 256 bytes. + */ + ssize_t rv = getrandom(buf + bytes_read, n > 256 ? 256 : n, 0); + if (rv <= 0) { + continue; /* Just retry. */ + } + + bytes_read += (size_t)rv; + if (bytes_read == len) { + return; + } + } + break; +#else + /* Shouldn't be possible to be here */ + break; +#endif + + case ARES_RAND_FILE: + while (1) { + size_t rv = fread(buf + bytes_read, 1, len - bytes_read, + state->state.rand_file); + if (rv == 0) { + break; /* critical error, will reinit rand state */ + } + + bytes_read += rv; + if (bytes_read == len) { + return; + } + } + break; + +#ifdef ARES_NEEDS_RC4 + case ARES_RAND_RC4: + ares_rc4_prng(&state->state.rc4, buf, len); + return; +#endif + } + + /* If we didn't return before we got here, that means we had a critical rand + * failure and need to reinitialized */ + ares__reinit_rand(state); + } +} + +void ares__rand_bytes(ares_rand_state *state, unsigned char *buf, size_t len) +{ + /* See if we need to refill the cache to serve the request, but if len is + * excessive, we're not going to update our cache or serve from cache */ + if (len > state->cache_remaining && len < sizeof(state->cache)) { + size_t fetch_size = sizeof(state->cache) - state->cache_remaining; + ares__rand_bytes_fetch(state, state->cache, fetch_size); + state->cache_remaining = sizeof(state->cache); + } + + /* Serve from cache */ + if (len <= state->cache_remaining) { + size_t offset = sizeof(state->cache) - state->cache_remaining; + memcpy(buf, state->cache + offset, len); + state->cache_remaining -= len; + return; + } + + /* Serve direct due to excess size of request */ + ares__rand_bytes_fetch(state, buf, len); +} + +unsigned short ares__generate_new_id(ares_rand_state *state) +{ + unsigned short r = 0; + + ares__rand_bytes(state, (unsigned char *)&r, sizeof(r)); + return r; +} diff --git a/lib/c-ares-1.23.0/src/lib/ares_search.c b/lib/c-ares-1.23.0/src/lib/ares_search.c new file mode 100644 index 00000000000..429c7e1db0d --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares_search.c @@ -0,0 +1,348 @@ +/* MIT License + * + * Copyright (c) 1998 Massachusetts Institute of Technology + * Copyright (c) The c-ares project and its contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ + +#include "ares_setup.h" + +#ifdef HAVE_STRINGS_H +# include +#endif + +#include "ares.h" +#include "ares_private.h" + +struct search_query { + /* Arguments passed to ares_search */ + ares_channel_t *channel; + char *name; /* copied into an allocated buffer */ + int dnsclass; + int type; + ares_callback callback; + void *arg; + char **domains; /* duplicate for ares_reinit() safety */ + size_t ndomains; + + int status_as_is; /* error status from trying as-is */ + size_t next_domain; /* next search domain to try */ + ares_bool_t trying_as_is; /* current query is for name as-is */ + size_t timeouts; /* number of timeouts we saw for this request */ + ares_bool_t ever_got_nodata; /* did we ever get ARES_ENODATA along the way? */ +}; + +static void search_callback(void *arg, int status, int timeouts, + unsigned char *abuf, int alen); +static void end_squery(struct search_query *squery, ares_status_t status, + unsigned char *abuf, size_t alen); + +static void ares_search_int(ares_channel_t *channel, const char *name, + int dnsclass, int type, ares_callback callback, + void *arg) +{ + struct search_query *squery; + char *s; + const char *p; + ares_status_t status; + size_t ndots; + + /* Per RFC 7686, reject queries for ".onion" domain names with NXDOMAIN. */ + if (ares__is_onion_domain(name)) { + callback(arg, ARES_ENOTFOUND, 0, NULL, 0); + return; + } + + /* If name only yields one domain to search, then we don't have + * to keep extra state, so just do an ares_query(). + */ + status = ares__single_domain(channel, name, &s); + if (status != ARES_SUCCESS) { + callback(arg, (int)status, 0, NULL, 0); + return; + } + if (s) { + ares_query(channel, s, dnsclass, type, callback, arg); + ares_free(s); + return; + } + + /* Allocate a search_query structure to hold the state necessary for + * doing multiple lookups. + */ + squery = ares_malloc_zero(sizeof(*squery)); + if (!squery) { + callback(arg, ARES_ENOMEM, 0, NULL, 0); + return; + } + squery->channel = channel; + squery->name = ares_strdup(name); + if (!squery->name) { + ares_free(squery); + callback(arg, ARES_ENOMEM, 0, NULL, 0); + return; + } + + /* Duplicate domains for safety during ares_reinit() */ + if (channel->ndomains) { + squery->domains = + ares__strsplit_duplicate(channel->domains, channel->ndomains); + if (squery->domains == NULL) { + ares_free(squery->name); + ares_free(squery); + callback(arg, ARES_ENOMEM, 0, NULL, 0); + return; + } + squery->ndomains = channel->ndomains; + } + + squery->dnsclass = dnsclass; + squery->type = type; + squery->status_as_is = -1; + squery->callback = callback; + squery->arg = arg; + squery->timeouts = 0; + squery->ever_got_nodata = ARES_FALSE; + + /* Count the number of dots in name. */ + ndots = 0; + for (p = name; *p; p++) { + if (*p == '.') { + ndots++; + } + } + + /* If ndots is at least the channel ndots threshold (usually 1), + * then we try the name as-is first. Otherwise, we try the name + * as-is last. + */ + if (ndots >= channel->ndots || squery->ndomains == 0) { + /* Try the name as-is first. */ + squery->next_domain = 0; + squery->trying_as_is = ARES_TRUE; + ares_query(channel, name, dnsclass, type, search_callback, squery); + } else { + /* Try the name as-is last; start with the first search domain. */ + squery->next_domain = 1; + squery->trying_as_is = ARES_FALSE; + status = ares__cat_domain(name, squery->domains[0], &s); + if (status == ARES_SUCCESS) { + ares_query(channel, s, dnsclass, type, search_callback, squery); + ares_free(s); + } else { + /* failed, free the malloc()ed memory */ + ares_free(squery->name); + ares_free(squery); + callback(arg, (int)status, 0, NULL, 0); + } + } +} + +void ares_search(ares_channel_t *channel, const char *name, int dnsclass, + int type, ares_callback callback, void *arg) +{ + if (channel == NULL) { + return; + } + ares__channel_lock(channel); + ares_search_int(channel, name, dnsclass, type, callback, arg); + ares__channel_unlock(channel); +} + +static void search_callback(void *arg, int status, int timeouts, + unsigned char *abuf, int alen) +{ + struct search_query *squery = (struct search_query *)arg; + ares_channel_t *channel = squery->channel; + char *s; + + squery->timeouts += (size_t)timeouts; + + /* Stop searching unless we got a non-fatal error. */ + if (status != ARES_ENODATA && status != ARES_ESERVFAIL && + status != ARES_ENOTFOUND) { + end_squery(squery, (ares_status_t)status, abuf, (size_t)alen); + } else { + /* Save the status if we were trying as-is. */ + if (squery->trying_as_is) { + squery->status_as_is = status; + } + + /* + * If we ever get ARES_ENODATA along the way, record that; if the search + * should run to the very end and we got at least one ARES_ENODATA, + * then callers like ares_gethostbyname() may want to try a T_A search + * even if the last domain we queried for T_AAAA resource records + * returned ARES_ENOTFOUND. + */ + if (status == ARES_ENODATA) { + squery->ever_got_nodata = ARES_TRUE; + } + + if (squery->next_domain < squery->ndomains) { + ares_status_t mystatus; + /* Try the next domain. */ + mystatus = ares__cat_domain(squery->name, + squery->domains[squery->next_domain], &s); + if (mystatus != ARES_SUCCESS) { + end_squery(squery, mystatus, NULL, 0); + } else { + squery->trying_as_is = ARES_FALSE; + squery->next_domain++; + ares_query(channel, s, squery->dnsclass, squery->type, search_callback, + squery); + ares_free(s); + } + } else if (squery->status_as_is == -1) { + /* Try the name as-is at the end. */ + squery->trying_as_is = ARES_TRUE; + ares_query(channel, squery->name, squery->dnsclass, squery->type, + search_callback, squery); + } else { + if (squery->status_as_is == ARES_ENOTFOUND && squery->ever_got_nodata) { + end_squery(squery, ARES_ENODATA, NULL, 0); + } else { + end_squery(squery, (ares_status_t)squery->status_as_is, NULL, 0); + } + } + } +} + +static void end_squery(struct search_query *squery, ares_status_t status, + unsigned char *abuf, size_t alen) +{ + squery->callback(squery->arg, (int)status, (int)squery->timeouts, abuf, + (int)alen); + ares__strsplit_free(squery->domains, squery->ndomains); + ares_free(squery->name); + ares_free(squery); +} + +/* Concatenate two domains. */ +ares_status_t ares__cat_domain(const char *name, const char *domain, char **s) +{ + size_t nlen = ares_strlen(name); + size_t dlen = ares_strlen(domain); + + *s = ares_malloc(nlen + 1 + dlen + 1); + if (!*s) { + return ARES_ENOMEM; + } + memcpy(*s, name, nlen); + (*s)[nlen] = '.'; + if (strcmp(domain, ".") == 0) { + /* Avoid appending the root domain to the separator, which would set *s to + an ill-formed value (ending in two consecutive dots). */ + dlen = 0; + } + memcpy(*s + nlen + 1, domain, dlen); + (*s)[nlen + 1 + dlen] = 0; + return ARES_SUCCESS; +} + +/* Determine if this name only yields one query. If it does, set *s to + * the string we should query, in an allocated buffer. If not, set *s + * to NULL. + */ +ares_status_t ares__single_domain(const ares_channel_t *channel, + const char *name, char **s) +{ + size_t len = ares_strlen(name); + const char *hostaliases; + FILE *fp; + char *line = NULL; + ares_status_t status; + size_t linesize; + const char *p; + const char *q; + int error; + + /* If the name contains a trailing dot, then the single query is the name + * sans the trailing dot. + */ + if ((len > 0) && (name[len - 1] == '.')) { + *s = ares_strdup(name); + return (*s) ? ARES_SUCCESS : ARES_ENOMEM; + } + + if (!(channel->flags & ARES_FLAG_NOALIASES) && !strchr(name, '.')) { + /* The name might be a host alias. */ + hostaliases = getenv("HOSTALIASES"); + if (hostaliases) { + fp = fopen(hostaliases, "r"); + if (fp) { + while ((status = ares__read_line(fp, &line, &linesize)) == + ARES_SUCCESS) { + if (strncasecmp(line, name, len) != 0 || !ISSPACE(line[len])) { + continue; + } + p = line + len; + while (ISSPACE(*p)) { + p++; + } + if (*p) { + q = p + 1; + while (*q && !ISSPACE(*q)) { + q++; + } + *s = ares_malloc((size_t)(q - p + 1)); + if (*s) { + memcpy(*s, p, (size_t)(q - p)); + (*s)[q - p] = 0; + } + ares_free(line); + fclose(fp); + return (*s) ? ARES_SUCCESS : ARES_ENOMEM; + } + } + ares_free(line); + fclose(fp); + if (status != ARES_SUCCESS && status != ARES_EOF) { + return status; + } + } else { + error = ERRNO; + switch (error) { + case ENOENT: + case ESRCH: + break; + default: + DEBUGF(fprintf(stderr, "fopen() failed with error: %d %s\n", error, + strerror(error))); + DEBUGF(fprintf(stderr, "Error opening file: %s\n", hostaliases)); + *s = NULL; + return ARES_EFILE; + } + } + } + } + + if (channel->flags & ARES_FLAG_NOSEARCH || channel->ndomains == 0) { + /* No domain search to do; just try the name as-is. */ + *s = ares_strdup(name); + return (*s) ? ARES_SUCCESS : ARES_ENOMEM; + } + + *s = NULL; + return ARES_SUCCESS; +} diff --git a/lib/c-ares-1.23.0/src/lib/ares_send.c b/lib/c-ares-1.23.0/src/lib/ares_send.c new file mode 100644 index 00000000000..2510b1edd36 --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares_send.c @@ -0,0 +1,165 @@ +/* MIT License + * + * Copyright (c) 1998 Massachusetts Institute of Technology + * Copyright (c) The c-ares project and its contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ + +#include "ares_setup.h" + +#ifdef HAVE_NETINET_IN_H +# include +#endif + +#include "ares_nameser.h" + +#include "ares.h" +#include "ares_dns.h" +#include "ares_private.h" + +static unsigned short generate_unique_qid(ares_channel_t *channel) +{ + unsigned short id; + + do { + id = ares__generate_new_id(channel->rand_state); + } while (ares__htable_szvp_get(channel->queries_by_qid, id, NULL)); + + return id; +} + +ares_status_t ares_send_ex(ares_channel_t *channel, const unsigned char *qbuf, + size_t qlen, ares_callback callback, void *arg, + unsigned short *qid) +{ + struct query *query; + size_t packetsz; + struct timeval now = ares__tvnow(); + ares_status_t status; + unsigned short id = generate_unique_qid(channel); + unsigned char *abuf = NULL; + size_t alen = 0; + + /* Verify that the query is at least long enough to hold the header. */ + if (qlen < HFIXEDSZ || qlen >= (1 << 16)) { + callback(arg, ARES_EBADQUERY, 0, NULL, 0); + return ARES_EBADQUERY; + } + if (ares__slist_len(channel->servers) == 0) { + callback(arg, ARES_ESERVFAIL, 0, NULL, 0); + return ARES_ESERVFAIL; + } + + /* Check query cache */ + status = ares_qcache_fetch(channel, &now, qbuf, qlen, &abuf, &alen); + if (status != ARES_ENOTFOUND) { + /* ARES_SUCCESS means we retrieved the cache, anything else is a critical + * failure, all result in termination */ + callback(arg, (int)status, 0, abuf, (int)alen); + ares_free(abuf); + return status; + } + + /* Allocate space for query and allocated fields. */ + query = ares_malloc(sizeof(struct query)); + if (!query) { + callback(arg, ARES_ENOMEM, 0, NULL, 0); + return ARES_ENOMEM; + } + memset(query, 0, sizeof(*query)); + + query->channel = channel; + query->qbuf = ares_malloc(qlen); + if (!query->qbuf) { + ares_free(query); + callback(arg, ARES_ENOMEM, 0, NULL, 0); + return ARES_ENOMEM; + } + + query->qid = id; + query->timeout.tv_sec = 0; + query->timeout.tv_usec = 0; + + /* Ignore first 2 bytes, assign our own query id */ + query->qbuf[0] = (unsigned char)((id >> 8) & 0xFF); + query->qbuf[1] = (unsigned char)(id & 0xFF); + memcpy(query->qbuf + 2, qbuf + 2, qlen - 2); + query->qlen = qlen; + + /* Fill in query arguments. */ + query->callback = callback; + query->arg = arg; + + /* Initialize query status. */ + query->try_count = 0; + + packetsz = (channel->flags & ARES_FLAG_EDNS) ? channel->ednspsz : PACKETSZ; + query->using_tcp = (channel->flags & ARES_FLAG_USEVC) || qlen > packetsz; + + query->error_status = ARES_SUCCESS; + query->timeouts = 0; + + /* Initialize our list nodes. */ + query->node_queries_by_timeout = NULL; + query->node_queries_to_conn = NULL; + + /* Chain the query into the list of all queries. */ + query->node_all_queries = + ares__llist_insert_last(channel->all_queries, query); + if (query->node_all_queries == NULL) { + callback(arg, ARES_ENOMEM, 0, NULL, 0); + ares__free_query(query); + return ARES_ENOMEM; + } + + /* Keep track of queries bucketed by qid, so we can process DNS + * responses quickly. + */ + if (!ares__htable_szvp_insert(channel->queries_by_qid, query->qid, query)) { + callback(arg, ARES_ENOMEM, 0, NULL, 0); + ares__free_query(query); + return ARES_ENOMEM; + } + + /* Perform the first query action. */ + + status = ares__send_query(query, &now); + if (status == ARES_SUCCESS && qid) { + *qid = id; + } + return status; +} + +void ares_send(ares_channel_t *channel, const unsigned char *qbuf, int qlen, + ares_callback callback, void *arg) +{ + if (channel == NULL) { + return; + } + + ares__channel_lock(channel); + + ares_send_ex(channel, qbuf, (size_t)qlen, callback, arg, NULL); + + ares__channel_unlock(channel); +} diff --git a/lib/c-ares-1.19.1/src/lib/ares_setup.h b/lib/c-ares-1.23.0/src/lib/ares_setup.h similarity index 68% rename from lib/c-ares-1.19.1/src/lib/ares_setup.h rename to lib/c-ares-1.23.0/src/lib/ares_setup.h index 6ad2cee6a8c..0387f3e35f7 100644 --- a/lib/c-ares-1.19.1/src/lib/ares_setup.h +++ b/lib/c-ares-1.23.0/src/lib/ares_setup.h @@ -1,26 +1,37 @@ -#ifndef HEADER_CARES_SETUP_H -#define HEADER_CARES_SETUP_H - - -/* Copyright (C) 2004 - 2012 by Daniel Stenberg et al +/* MIT License + * + * Copyright (c) 2004 Daniel Stenberg + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. * - * 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. + * SPDX-License-Identifier: MIT */ +#ifndef HEADER_CARES_SETUP_H +#define HEADER_CARES_SETUP_H /* * Define WIN32 when build target is Win32 API */ #if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32) -#define WIN32 +# define WIN32 #endif /* @@ -29,12 +40,12 @@ */ #ifdef HAVE_CONFIG_H -#include "ares_config.h" +# include "ares_config.h" #else -#ifdef WIN32 -#include "config-win32.h" -#endif +# ifdef WIN32 +# include "config-win32.h" +# endif #endif /* HAVE_CONFIG_H */ @@ -112,7 +123,7 @@ # ifdef HAVE_WINSOCK2_H # include # ifdef HAVE_WS2TCPIP_H -# include +# include # endif # else # ifdef HAVE_WINSOCK_H @@ -127,8 +138,9 @@ * undefine USE_WINSOCK. */ -#undef USE_WINSOCK - +#ifdef USE_WINSOCK +# undef USE_WINSOCK +#endif #ifdef HAVE_WINSOCK2_H # define USE_WINSOCK 2 #else @@ -143,17 +155,17 @@ #ifndef HAVE_CONFIG_H -#if !defined(HAVE_SYS_TIME_H) && !defined(_MSC_VER) && !defined(__WATCOMC__) -#define HAVE_SYS_TIME_H -#endif +# if !defined(HAVE_SYS_TIME_H) && !defined(_MSC_VER) && !defined(__WATCOMC__) +# define HAVE_SYS_TIME_H +# endif -#if !defined(HAVE_UNISTD_H) && !defined(_MSC_VER) -#define HAVE_UNISTD_H 1 -#endif +# if !defined(HAVE_UNISTD_H) && !defined(_MSC_VER) +# define HAVE_UNISTD_H 1 +# endif -#if !defined(HAVE_SYS_UIO_H) && !defined(WIN32) && !defined(MSDOS) -#define HAVE_SYS_UIO_H -#endif +# if !defined(HAVE_SYS_UIO_H) && !defined(WIN32) && !defined(MSDOS) +# define HAVE_SYS_UIO_H +# endif #endif /* HAVE_CONFIG_H */ @@ -182,7 +194,7 @@ * but it is not fully implemented and missing identifiers, so udefine here. */ #if (defined(ANDROID) || defined(__ANDROID__) || defined(__MVS__)) && \ - defined(HAVE_ARPA_NAMESER_H) + defined(HAVE_ARPA_NAMESER_H) # undef HAVE_ARPA_NAMESER_H #endif @@ -192,21 +204,35 @@ * --enable-debug) so we undef them again here. */ -#undef PACKAGE_STRING -#undef PACKAGE_TARNAME -#undef PACKAGE_VERSION -#undef PACKAGE_BUGREPORT -#undef PACKAGE_NAME -#undef VERSION -#undef PACKAGE +#ifdef PACKAGE_STRING +# undef PACKAGE_STRING +#endif +#ifdef PACKAGE_TARNAME +# undef PACKAGE_TARNAME +#endif +#ifdef PACKAGE_VERSION +# undef PACKAGE_VERSION +#endif +#ifdef PACKAGE_BUGREPORT +# undef PACKAGE_BUGREPORT +#endif +#ifdef PACKAGE_NAME +# undef PACKAGE_NAME +#endif +#ifdef VERSION +# undef VERSION +#endif +#ifdef PACKAGE +# undef PACKAGE +#endif /* IPv6 compatibility */ #if !defined(HAVE_AF_INET6) -#if defined(HAVE_PF_INET6) -#define AF_INET6 PF_INET6 -#else -#define AF_INET6 AF_MAX+1 -#endif +# if defined(HAVE_PF_INET6) +# define AF_INET6 PF_INET6 +# else +# define AF_INET6 AF_MAX + 1 +# endif #endif /* @@ -214,7 +240,7 @@ */ #ifndef __SETUP_ONCE_H -#include "setup_once.h" +# include "setup_once.h" #endif #endif /* HEADER_CARES_SETUP_H */ diff --git a/lib/c-ares-1.23.0/src/lib/ares_str.c b/lib/c-ares-1.23.0/src/lib/ares_str.c new file mode 100644 index 00000000000..11794774e56 --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares_str.c @@ -0,0 +1,95 @@ +/* MIT License + * + * Copyright (c) 1998 Massachusetts Institute of Technology + * Copyright (c) The c-ares project and its contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ + +#include "ares_setup.h" +#include "ares_str.h" +#include "ares.h" +#include "ares_private.h" + +#ifdef HAVE_STDINT_H +# include +#endif + +size_t ares_strlen(const char *str) +{ + if (str == NULL) { + return 0; + } + + return strlen(str); +} + +char *ares_strdup(const char *s1) +{ + size_t len; + char *out; + + if (s1 == NULL) { + return NULL; + } + + len = ares_strlen(s1); + + /* Don't see how this is possible */ + if (len == SIZE_MAX) { + return NULL; + } + + out = ares_malloc(len + 1); + if (out == NULL) { + return NULL; + } + + if (len) { + memcpy(out, s1, len); + } + + out[len] = 0; + return out; +} + +size_t ares_strcpy(char *dest, const char *src, size_t dest_size) +{ + size_t len = 0; + + if (dest == NULL || dest_size == 0) { + return 0; + } + + len = ares_strlen(src); + + if (len >= dest_size) { + len = dest_size - 1; + } + + if (len) { + memcpy(dest, src, len); + } + + dest[len] = 0; + return len; +} diff --git a/lib/c-ares-1.23.0/src/lib/ares_str.h b/lib/c-ares-1.23.0/src/lib/ares_str.h new file mode 100644 index 00000000000..fa5d5509bc0 --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares_str.h @@ -0,0 +1,49 @@ +/* MIT License + * + * Copyright (c) 1998 Massachusetts Institute of Technology + * Copyright (c) The c-ares project and its contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ +#ifndef HEADER_CARES_STRDUP_H +#define HEADER_CARES_STRDUP_H + +#include "ares_setup.h" + +char *ares_strdup(const char *s1); + +size_t ares_strlen(const char *str); + +/*! Copy string from source to destination with destination buffer size + * provided. The destination is guaranteed to be null terminated, if the + * provided buffer isn't large enough, only those bytes from the source that + * will fit will be copied. + * + * \param[out] dest Destination buffer + * \param[in] src Source to copy + * \param[in] dest_size Size of destination buffer + * \return String length. Will be at most dest_size-1 + */ +size_t ares_strcpy(char *dest, const char *src, size_t dest_size); + + +#endif /* HEADER_CARES_STRDUP_H */ diff --git a/lib/c-ares-1.23.0/src/lib/ares_strcasecmp.c b/lib/c-ares-1.23.0/src/lib/ares_strcasecmp.c new file mode 100644 index 00000000000..b91cbbe1544 --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares_strcasecmp.c @@ -0,0 +1,79 @@ +/* MIT License + * + * Copyright (c) 1998 Massachusetts Institute of Technology + * Copyright (c) The c-ares project and its contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ + +#include "ares_setup.h" +#include "ares_strcasecmp.h" + +#ifndef HAVE_STRCASECMP +int ares_strcasecmp(const char *a, const char *b) +{ +# if defined(HAVE_STRCMPI) + return strcmpi(a, b); +# elif defined(HAVE_STRICMP) + return stricmp(a, b); +# else + size_t i; + + for (i = 0; i < (size_t)-1; i++) { + int c1 = ISUPPER(a[i]) ? tolower(a[i]) : a[i]; + int c2 = ISUPPER(b[i]) ? tolower(b[i]) : b[i]; + if (c1 != c2) { + return c1 - c2; + } + if (!c1) { + break; + } + } + return 0; +# endif +} +#endif + +#ifndef HAVE_STRNCASECMP +int ares_strncasecmp(const char *a, const char *b, size_t n) +{ +# if defined(HAVE_STRNCMPI) + return strncmpi(a, b, n); +# elif defined(HAVE_STRNICMP) + return strnicmp(a, b, n); +# else + size_t i; + + for (i = 0; i < n; i++) { + int c1 = ISUPPER(a[i]) ? tolower(a[i]) : a[i]; + int c2 = ISUPPER(b[i]) ? tolower(b[i]) : b[i]; + if (c1 != c2) { + return c1 - c2; + } + if (!c1) { + break; + } + } + return 0; +# endif +} +#endif diff --git a/lib/c-ares-1.23.0/src/lib/ares_strcasecmp.h b/lib/c-ares-1.23.0/src/lib/ares_strcasecmp.h new file mode 100644 index 00000000000..31a66be7179 --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares_strcasecmp.h @@ -0,0 +1,40 @@ +/* MIT License + * + * Copyright (c) 1998 Massachusetts Institute of Technology + * Copyright (c) The c-ares project and its contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ +#ifndef HEADER_CARES_STRCASECMP_H +#define HEADER_CARES_STRCASECMP_H + +#include "ares_setup.h" + +#ifndef HAVE_STRCASECMP +extern int ares_strcasecmp(const char *a, const char *b); +#endif + +#ifndef HAVE_STRNCASECMP +extern int ares_strncasecmp(const char *a, const char *b, size_t n); +#endif + +#endif /* HEADER_CARES_STRCASECMP_H */ diff --git a/lib/c-ares-1.23.0/src/lib/ares_strerror.c b/lib/c-ares-1.23.0/src/lib/ares_strerror.c new file mode 100644 index 00000000000..fd583c5cfbb --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares_strerror.c @@ -0,0 +1,91 @@ +/* MIT License + * + * Copyright (c) 1998 Massachusetts Institute of Technology + * Copyright (c) The c-ares project and its contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ + +#include "ares_setup.h" +#include +#include "ares.h" + +const char *ares_strerror(int code) +{ + ares_status_t status = (ares_status_t)code; + switch (status) { + case ARES_SUCCESS: + return "Successful completion"; + case ARES_ENODATA: + return "DNS server returned answer with no data"; + case ARES_EFORMERR: + return "DNS server claims query was misformatted"; + case ARES_ESERVFAIL: + return "DNS server returned general failure"; + case ARES_ENOTFOUND: + return "Domain name not found"; + case ARES_ENOTIMP: + return "DNS server does not implement requested operation"; + case ARES_EREFUSED: + return "DNS server refused query"; + case ARES_EBADQUERY: + return "Misformatted DNS query"; + case ARES_EBADNAME: + return "Misformatted domain name"; + case ARES_EBADFAMILY: + return "Unsupported address family"; + case ARES_EBADRESP: + return "Misformatted DNS reply"; + case ARES_ECONNREFUSED: + return "Could not contact DNS servers"; + case ARES_ETIMEOUT: + return "Timeout while contacting DNS servers"; + case ARES_EOF: + return "End of file"; + case ARES_EFILE: + return "Error reading file"; + case ARES_ENOMEM: + return "Out of memory"; + case ARES_EDESTRUCTION: + return "Channel is being destroyed"; + case ARES_EBADSTR: + return "Misformatted string"; + case ARES_EBADFLAGS: + return "Illegal flags specified"; + case ARES_ENONAME: + return "Given hostname is not numeric"; + case ARES_EBADHINTS: + return "Illegal hints flags specified"; + case ARES_ENOTINITIALIZED: + return "c-ares library initialization not yet performed"; + case ARES_ELOADIPHLPAPI: + return "Error loading iphlpapi.dll"; + case ARES_EADDRGETNETWORKPARAMS: + return "Could not find GetNetworkParams function"; + case ARES_ECANCELLED: + return "DNS query cancelled"; + case ARES_ESERVICE: + return "Invalid service name or number"; + } + + return "unknown"; +} diff --git a/lib/c-ares-1.23.0/src/lib/ares_strsplit.c b/lib/c-ares-1.23.0/src/lib/ares_strsplit.c new file mode 100644 index 00000000000..dbb79429d4c --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares_strsplit.c @@ -0,0 +1,142 @@ +/* MIT License + * + * Copyright (c) 2018 John Schember + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ + +#if defined(__MVS__) +# include +#endif + +#include "ares_setup.h" +#include "ares.h" +#include "ares_private.h" + +void ares__strsplit_free(char **elms, size_t num_elm) +{ + size_t i; + + if (elms == NULL) { + return; + } + + for (i = 0; i < num_elm; i++) { + ares_free(elms[i]); + } + ares_free(elms); +} + +char **ares__strsplit_duplicate(char **elms, size_t num_elm) +{ + size_t i; + char **out; + + if (elms == NULL || num_elm == 0) { + return NULL; + } + + out = ares_malloc_zero(sizeof(*elms) * num_elm); + if (out == NULL) { + return NULL; + } + + for (i = 0; i < num_elm; i++) { + out[i] = ares_strdup(elms[i]); + if (out[i] == NULL) { + ares__strsplit_free(out, num_elm); + return NULL; + } + } + + return out; +} + +char **ares__strsplit(const char *in, const char *delms, size_t *num_elm) +{ + const char *p; + char **table; + void *tmp; + size_t i; + size_t j; + size_t k; + size_t count; + + if (in == NULL || delms == NULL || num_elm == NULL) { + return NULL; + } + + *num_elm = 0; + + /* count non-empty delimited substrings */ + count = 0; + p = in; + do { + i = strcspn(p, delms); + if (i != 0) { + /* string is non-empty */ + count++; + p += i; + } + } while (*p++ != 0); + + if (count == 0) { + return NULL; + } + table = ares_malloc(count * sizeof(*table)); + if (table == NULL) { + return NULL; + } + + j = 0; /* current table entry */ + /* re-calculate indices and allocate new strings for table */ + for (p = in; j < count; p += i + 1) { + i = strcspn(p, delms); + if (i != 0) { + for (k = 0; k < j; k++) { + if (strncasecmp(table[k], p, i) == 0 && table[k][i] == 0) { + break; + } + } + if (k == j) { + /* copy unique strings only */ + table[j] = ares_malloc(i + 1); + if (table[j] == NULL) { + ares__strsplit_free(table, j); + return NULL; + } + ares_strcpy(table[j], p, i + 1); + j++; + } else { + count--; + } + } + } + + tmp = ares_realloc(table, count * sizeof(*table)); + if (tmp != NULL) { + table = tmp; + } + + *num_elm = count; + return table; +} diff --git a/lib/c-ares-1.23.0/src/lib/ares_strsplit.h b/lib/c-ares-1.23.0/src/lib/ares_strsplit.h new file mode 100644 index 00000000000..c3e61e17538 --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares_strsplit.h @@ -0,0 +1,53 @@ +/* MIT License + * + * Copyright (c) 2018 John Schember + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ +#ifndef HEADER_CARES_STRSPLIT_H +#define HEADER_CARES_STRSPLIT_H + +#include "ares_setup.h" + +/* Split a string on delms skipping empty or duplicate elements. + * + * param in String to split. + * param delms String of characters to treat as a delimiter. + * Each character in the string is a delimiter so + * there can be multiple delimiters to split on. + * E.g. ", " will split on all comma's and spaces. + * Duplicate entries are removed. + * param num_elm Return parameter of the number of elements + * in the result array. + * + * returns an allocated array of allocated string elements. + * + */ +char **ares__strsplit(const char *in, const char *delms, size_t *num_elm); + +/* Frees the result returned from ares__strsplit(). */ +void ares__strsplit_free(char **elms, size_t num_elm); + +/* Duplicate the array */ +char **ares__strsplit_duplicate(char **elms, size_t num_elm); + +#endif /* HEADER_CARES_STRSPLIT_H */ diff --git a/lib/c-ares-1.23.0/src/lib/ares_sysconfig.c b/lib/c-ares-1.23.0/src/lib/ares_sysconfig.c new file mode 100644 index 00000000000..08ab256c661 --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares_sysconfig.c @@ -0,0 +1,1033 @@ +/* MIT License + * + * Copyright (c) 1998 Massachusetts Institute of Technology + * Copyright (c) 2007 Daniel Stenberg + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ + +#include "ares_setup.h" + +#ifdef HAVE_SYS_PARAM_H +# include +#endif + +#ifdef HAVE_NETINET_IN_H +# include +#endif + +#ifdef HAVE_NETDB_H +# include +#endif + +#ifdef HAVE_ARPA_INET_H +# include +#endif + +#include "ares_nameser.h" + +#if defined(ANDROID) || defined(__ANDROID__) +# include +# include "ares_android.h" +/* From the Bionic sources */ +# define DNS_PROP_NAME_PREFIX "net.dns" +# define MAX_DNS_PROPERTIES 8 +#endif + +#if defined(CARES_USE_LIBRESOLV) +# include +#endif + +#if defined(USE_WINSOCK) +# if defined(HAVE_IPHLPAPI_H) +# include +# endif +# if defined(HAVE_NETIOAPI_H) +# include +# endif +#endif + +#include "ares.h" +#include "ares_inet_net_pton.h" +#include "ares_platform.h" +#include "ares_private.h" + +#ifdef WATT32 +# undef WIN32 /* Redefined in MingW/MSVC headers */ +#endif + + +#ifdef WIN32 +/* + * get_REG_SZ() + * + * Given a 'hKey' handle to an open registry key and a 'leafKeyName' pointer + * to the name of the registry leaf key to be queried, fetch it's string + * value and return a pointer in *outptr to a newly allocated memory area + * holding it as a null-terminated string. + * + * Returns 0 and nullifies *outptr upon inability to return a string value. + * + * Returns 1 and sets *outptr when returning a dynamically allocated string. + * + * Supported on Windows NT 3.5 and newer. + */ +static ares_bool_t get_REG_SZ(HKEY hKey, const char *leafKeyName, char **outptr) +{ + DWORD size = 0; + int res; + + *outptr = NULL; + + /* Find out size of string stored in registry */ + res = RegQueryValueExA(hKey, leafKeyName, 0, NULL, NULL, &size); + if ((res != ERROR_SUCCESS && res != ERROR_MORE_DATA) || !size) { + return ARES_FALSE; + } + + /* Allocate buffer of indicated size plus one given that string + might have been stored without null termination */ + *outptr = ares_malloc(size + 1); + if (!*outptr) { + return ARES_FALSE; + } + + /* Get the value for real */ + res = RegQueryValueExA(hKey, leafKeyName, 0, NULL, (unsigned char *)*outptr, + &size); + if ((res != ERROR_SUCCESS) || (size == 1)) { + ares_free(*outptr); + *outptr = NULL; + return ARES_FALSE; + } + + /* Null terminate buffer always */ + *(*outptr + size) = '\0'; + + return ARES_TRUE; +} + +static void commanjoin(char **dst, const char * const src, const size_t len) +{ + char *newbuf; + size_t newsize; + + /* 1 for terminating 0 and 2 for , and terminating 0 */ + newsize = len + (*dst ? (ares_strlen(*dst) + 2) : 1); + newbuf = ares_realloc(*dst, newsize); + if (!newbuf) { + return; + } + if (*dst == NULL) { + *newbuf = '\0'; + } + *dst = newbuf; + if (ares_strlen(*dst) != 0) { + strcat(*dst, ","); + } + strncat(*dst, src, len); +} + +/* + * commajoin() + * + * RTF code. + */ +static void commajoin(char **dst, const char *src) +{ + commanjoin(dst, src, ares_strlen(src)); +} + +/* A structure to hold the string form of IPv4 and IPv6 addresses so we can + * sort them by a metric. + */ +typedef struct { + /* The metric we sort them by. */ + ULONG metric; + + /* Original index of the item, used as a secondary sort parameter to make + * qsort() stable if the metrics are equal */ + size_t orig_idx; + + /* Room enough for the string form of any IPv4 or IPv6 address that + * ares_inet_ntop() will create. Based on the existing c-ares practice. + */ + char text[INET6_ADDRSTRLEN + 8]; /* [%s]:NNNNN */ +} Address; + +/* Sort Address values \a left and \a right by metric, returning the usual + * indicators for qsort(). + */ +static int compareAddresses(const void *arg1, const void *arg2) +{ + const Address * const left = arg1; + const Address * const right = arg2; + /* Lower metric the more preferred */ + if (left->metric < right->metric) { + return -1; + } + if (left->metric > right->metric) { + return 1; + } + /* If metrics are equal, lower original index more preferred */ + if (left->orig_idx < right->orig_idx) { + return -1; + } + if (left->orig_idx > right->orig_idx) { + return 1; + } + return 0; +} + +/* There can be multiple routes to "the Internet". And there can be different + * DNS servers associated with each of the interfaces that offer those routes. + * We have to assume that any DNS server can serve any request. But, some DNS + * servers may only respond if requested over their associated interface. But + * we also want to use "the preferred route to the Internet" whenever possible + * (and not use DNS servers on a non-preferred route even by forcing request + * to go out on the associated non-preferred interface). i.e. We want to use + * the DNS servers associated with the same interface that we would use to + * make a general request to anything else. + * + * But, Windows won't sort the DNS servers by the metrics associated with the + * routes and interfaces _even_ though it obviously sends IP packets based on + * those same routes and metrics. So, we must do it ourselves. + * + * So, we sort the DNS servers by the same metric values used to determine how + * an outgoing IP packet will go, thus effectively using the DNS servers + * associated with the interface that the DNS requests themselves will + * travel. This gives us optimal routing and avoids issues where DNS servers + * won't respond to requests that don't arrive via some specific subnetwork + * (and thus some specific interface). + * + * This function computes the metric we use to sort. On the interface + * identified by \a luid, it determines the best route to \a dest and combines + * that route's metric with \a interfaceMetric to compute a metric for the + * destination address on that interface. This metric can be used as a weight + * to sort the DNS server addresses associated with each interface (lower is + * better). + * + * Note that by restricting the route search to the specific interface with + * which the DNS servers are associated, this function asks the question "What + * is the metric for sending IP packets to this DNS server?" which allows us + * to sort the DNS servers correctly. + */ +static ULONG getBestRouteMetric(IF_LUID * const luid, /* Can't be const :( */ + const SOCKADDR_INET * const dest, + const ULONG interfaceMetric) +{ + /* On this interface, get the best route to that destination. */ +# if defined(__WATCOMC__) + /* OpenWatcom's builtin Windows SDK does not have a definition for + * MIB_IPFORWARD_ROW2, and also does not allow the usage of SOCKADDR_INET + * as a variable. Let's work around this by returning the worst possible + * metric, but only when using the OpenWatcom compiler. + * It may be worth investigating using a different version of the Windows + * SDK with OpenWatcom in the future, though this may be fixed in OpenWatcom + * 2.0. + */ + return (ULONG)-1; +# else + MIB_IPFORWARD_ROW2 row; + SOCKADDR_INET ignored; + if (GetBestRoute2(/* The interface to use. The index is ignored since we are + * passing a LUID. + */ + luid, 0, + /* No specific source address. */ + NULL, + /* Our destination address. */ + dest, + /* No options. */ + 0, + /* The route row. */ + &row, + /* The best source address, which we don't need. */ + &ignored) != NO_ERROR + /* If the metric is "unused" (-1) or too large for us to add the two + * metrics, use the worst possible, thus sorting this last. + */ + || row.Metric == (ULONG)-1 || + row.Metric > ((ULONG)-1) - interfaceMetric) { + /* Return the worst possible metric. */ + return (ULONG)-1; + } + + /* Return the metric value from that row, plus the interface metric. + * + * See + * http://msdn.microsoft.com/en-us/library/windows/desktop/aa814494(v=vs.85).aspx + * which describes the combination as a "sum". + */ + return row.Metric + interfaceMetric; +# endif /* __WATCOMC__ */ +} + +/* + * get_DNS_Windows() + * + * Locates DNS info using GetAdaptersAddresses() function from the Internet + * Protocol Helper (IP Helper) API. When located, this returns a pointer + * in *outptr to a newly allocated memory area holding a null-terminated + * string with a space or comma separated list of DNS IP addresses. + * + * Returns 0 and nullifies *outptr upon inability to return DNSes string. + * + * Returns 1 and sets *outptr when returning a dynamically allocated string. + * + * Implementation supports Windows XP and newer. + */ +# define IPAA_INITIAL_BUF_SZ 15 * 1024 +# define IPAA_MAX_TRIES 3 + +static ares_bool_t get_DNS_Windows(char **outptr) +{ + IP_ADAPTER_DNS_SERVER_ADDRESS *ipaDNSAddr; + IP_ADAPTER_ADDRESSES *ipaa; + IP_ADAPTER_ADDRESSES *newipaa; + IP_ADAPTER_ADDRESSES *ipaaEntry; + ULONG ReqBufsz = IPAA_INITIAL_BUF_SZ; + ULONG Bufsz = IPAA_INITIAL_BUF_SZ; + ULONG AddrFlags = 0; + int trying = IPAA_MAX_TRIES; + int res; + + /* The capacity of addresses, in elements. */ + size_t addressesSize; + /* The number of elements in addresses. */ + size_t addressesIndex = 0; + /* The addresses we will sort. */ + Address *addresses; + + union { + struct sockaddr *sa; + struct sockaddr_in *sa4; + struct sockaddr_in6 *sa6; + } namesrvr; + + *outptr = NULL; + + ipaa = ares_malloc(Bufsz); + if (!ipaa) { + return ARES_FALSE; + } + + /* Start with enough room for a few DNS server addresses and we'll grow it + * as we encounter more. + */ + addressesSize = 4; + addresses = (Address *)ares_malloc(sizeof(Address) * addressesSize); + if (addresses == NULL) { + /* We need room for at least some addresses to function. */ + ares_free(ipaa); + return ARES_FALSE; + } + + /* Usually this call succeeds with initial buffer size */ + res = GetAdaptersAddresses(AF_UNSPEC, AddrFlags, NULL, ipaa, &ReqBufsz); + if ((res != ERROR_BUFFER_OVERFLOW) && (res != ERROR_SUCCESS)) { + goto done; + } + + while ((res == ERROR_BUFFER_OVERFLOW) && (--trying)) { + if (Bufsz < ReqBufsz) { + newipaa = ares_realloc(ipaa, ReqBufsz); + if (!newipaa) { + goto done; + } + Bufsz = ReqBufsz; + ipaa = newipaa; + } + res = GetAdaptersAddresses(AF_UNSPEC, AddrFlags, NULL, ipaa, &ReqBufsz); + if (res == ERROR_SUCCESS) { + break; + } + } + if (res != ERROR_SUCCESS) { + goto done; + } + + for (ipaaEntry = ipaa; ipaaEntry; ipaaEntry = ipaaEntry->Next) { + if (ipaaEntry->OperStatus != IfOperStatusUp) { + continue; + } + + /* For each interface, find any associated DNS servers as IPv4 or IPv6 + * addresses. For each found address, find the best route to that DNS + * server address _on_ _that_ _interface_ (at this moment in time) and + * compute the resulting total metric, just as Windows routing will do. + * Then, sort all the addresses found by the metric. + */ + for (ipaDNSAddr = ipaaEntry->FirstDnsServerAddress; ipaDNSAddr; + ipaDNSAddr = ipaDNSAddr->Next) { + char ipaddr[INET6_ADDRSTRLEN] = ""; + namesrvr.sa = ipaDNSAddr->Address.lpSockaddr; + + if (namesrvr.sa->sa_family == AF_INET) { + if ((namesrvr.sa4->sin_addr.S_un.S_addr == INADDR_ANY) || + (namesrvr.sa4->sin_addr.S_un.S_addr == INADDR_NONE)) { + continue; + } + + /* Allocate room for another address, if necessary, else skip. */ + if (addressesIndex == addressesSize) { + const size_t newSize = addressesSize + 4; + Address * const newMem = + (Address *)ares_realloc(addresses, sizeof(Address) * newSize); + if (newMem == NULL) { + continue; + } + addresses = newMem; + addressesSize = newSize; + } + + addresses[addressesIndex].metric = + getBestRouteMetric(&ipaaEntry->Luid, (SOCKADDR_INET *)(namesrvr.sa), + ipaaEntry->Ipv4Metric); + + /* Record insertion index to make qsort stable */ + addresses[addressesIndex].orig_idx = addressesIndex; + + if (!ares_inet_ntop(AF_INET, &namesrvr.sa4->sin_addr, ipaddr, + sizeof(ipaddr))) { + continue; + } + snprintf(addresses[addressesIndex].text, + sizeof(addresses[addressesIndex].text), "[%s]:%u", ipaddr, + ntohs(namesrvr.sa4->sin_port)); + ++addressesIndex; + } else if (namesrvr.sa->sa_family == AF_INET6) { + if (memcmp(&namesrvr.sa6->sin6_addr, &ares_in6addr_any, + sizeof(namesrvr.sa6->sin6_addr)) == 0) { + continue; + } + + /* Allocate room for another address, if necessary, else skip. */ + if (addressesIndex == addressesSize) { + const size_t newSize = addressesSize + 4; + Address * const newMem = + (Address *)ares_realloc(addresses, sizeof(Address) * newSize); + if (newMem == NULL) { + continue; + } + addresses = newMem; + addressesSize = newSize; + } + + addresses[addressesIndex].metric = + getBestRouteMetric(&ipaaEntry->Luid, (SOCKADDR_INET *)(namesrvr.sa), + ipaaEntry->Ipv6Metric); + + /* Record insertion index to make qsort stable */ + addresses[addressesIndex].orig_idx = addressesIndex; + + if (!ares_inet_ntop(AF_INET6, &namesrvr.sa6->sin6_addr, ipaddr, + sizeof(ipaddr))) { + continue; + } + snprintf(addresses[addressesIndex].text, + sizeof(addresses[addressesIndex].text), "[%s]:%u", ipaddr, + ntohs(namesrvr.sa6->sin6_port)); + ++addressesIndex; + } else { + /* Skip non-IPv4/IPv6 addresses completely. */ + continue; + } + } + } + + /* Sort all of the textual addresses by their metric (and original index if + * metrics are equal). */ + qsort(addresses, addressesIndex, sizeof(*addresses), compareAddresses); + + /* Join them all into a single string, removing duplicates. */ + { + size_t i; + for (i = 0; i < addressesIndex; ++i) { + size_t j; + /* Look for this address text appearing previously in the results. */ + for (j = 0; j < i; ++j) { + if (strcmp(addresses[j].text, addresses[i].text) == 0) { + break; + } + } + /* Iff we didn't emit this address already, emit it now. */ + if (j == i) { + /* Add that to outptr (if we can). */ + commajoin(outptr, addresses[i].text); + } + } + } + +done: + ares_free(addresses); + + if (ipaa) { + ares_free(ipaa); + } + + if (!*outptr) { + return ARES_FALSE; + } + + return ARES_TRUE; +} + +/* + * get_SuffixList_Windows() + * + * Reads the "DNS Suffix Search List" from registry and writes the list items + * whitespace separated to outptr. If the Search List is empty, the + * "Primary Dns Suffix" is written to outptr. + * + * Returns 0 and nullifies *outptr upon inability to return the suffix list. + * + * Returns 1 and sets *outptr when returning a dynamically allocated string. + * + * Implementation supports Windows Server 2003 and newer + */ +static ares_bool_t get_SuffixList_Windows(char **outptr) +{ + HKEY hKey; + HKEY hKeyEnum; + char keyName[256]; + DWORD keyNameBuffSize; + DWORD keyIdx = 0; + char *p = NULL; + + *outptr = NULL; + + if (ares__getplatform() != WIN_NT) { + return ARES_FALSE; + } + + /* 1. Global DNS Suffix Search List */ + if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, WIN_NS_NT_KEY, 0, KEY_READ, &hKey) == + ERROR_SUCCESS) { + get_REG_SZ(hKey, SEARCHLIST_KEY, outptr); + if (get_REG_SZ(hKey, DOMAIN_KEY, &p)) { + commajoin(outptr, p); + ares_free(p); + p = NULL; + } + RegCloseKey(hKey); + } + + if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, WIN_NT_DNSCLIENT, 0, KEY_READ, &hKey) == + ERROR_SUCCESS) { + if (get_REG_SZ(hKey, SEARCHLIST_KEY, &p)) { + commajoin(outptr, p); + ares_free(p); + p = NULL; + } + RegCloseKey(hKey); + } + + /* 2. Connection Specific Search List composed of: + * a. Primary DNS Suffix */ + if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, WIN_DNSCLIENT, 0, KEY_READ, &hKey) == + ERROR_SUCCESS) { + if (get_REG_SZ(hKey, PRIMARYDNSSUFFIX_KEY, &p)) { + commajoin(outptr, p); + ares_free(p); + p = NULL; + } + RegCloseKey(hKey); + } + + /* b. Interface SearchList, Domain, DhcpDomain */ + if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, WIN_NS_NT_KEY "\\" INTERFACES_KEY, 0, + KEY_READ, &hKey) == ERROR_SUCCESS) { + for (;;) { + keyNameBuffSize = sizeof(keyName); + if (RegEnumKeyExA(hKey, keyIdx++, keyName, &keyNameBuffSize, 0, NULL, + NULL, NULL) != ERROR_SUCCESS) { + break; + } + if (RegOpenKeyExA(hKey, keyName, 0, KEY_QUERY_VALUE, &hKeyEnum) != + ERROR_SUCCESS) { + continue; + } + /* p can be comma separated (SearchList) */ + if (get_REG_SZ(hKeyEnum, SEARCHLIST_KEY, &p)) { + commajoin(outptr, p); + ares_free(p); + p = NULL; + } + if (get_REG_SZ(hKeyEnum, DOMAIN_KEY, &p)) { + commajoin(outptr, p); + ares_free(p); + p = NULL; + } + if (get_REG_SZ(hKeyEnum, DHCPDOMAIN_KEY, &p)) { + commajoin(outptr, p); + ares_free(p); + p = NULL; + } + RegCloseKey(hKeyEnum); + } + RegCloseKey(hKey); + } + + return *outptr != NULL ? ARES_TRUE : ARES_FALSE; +} + +static ares_status_t ares__init_sysconfig_windows(ares_sysconfig_t *sysconfig) +{ + char *line = NULL; + ares_status_t status = ARES_SUCCESS; + + if (get_DNS_Windows(&line)) { + status = ares__sconfig_append_fromstr(&sysconfig->sconfig, line); + ares_free(line); + if (status != ARES_SUCCESS) { + goto done; + } + } + + if (get_SuffixList_Windows(&line)) { + sysconfig->domains = ares__strsplit(line, ", ", &sysconfig->ndomains); + if (sysconfig->domains == NULL) { + status = ARES_EFILE; + } + if (status != ARES_SUCCESS) { + goto done; + } + } + +done: + return status; +} +#endif + +#if defined(__MVS__) +static ares_status_t ares__init_sysconfig_mvs(ares_sysconfig_t *sysconfig) +{ + struct __res_state *res = 0; + size_t count4; + size_t count6; + int i; + __STATEEXTIPV6 *v6; + arse__llist_t *sconfig = NULL; + ares_status_t status; + + if (0 == res) { + int rc = res_init(); + while (rc == -1 && h_errno == TRY_AGAIN) { + rc = res_init(); + } + if (rc == -1) { + return ARES_ENOMEM; + } + res = __res(); + } + + v6 = res->__res_extIPv6; + if (res->nscount > 0) { + count4 = (size_t)res->nscount; + } + + if (v6 && v6->__stat_nscount > 0) { + count6 = (size_t)v6->__stat_nscount; + } else { + count6 = 0; + } + + for (i = 0; i < count4; i++) { + struct sockaddr_in *addr_in = &(res->nsaddr_list[i]); + struct ares_addr addr; + + addr.addr.addr4.s_addr = addr_in->sin_addr.s_addr; + addr.family = AF_INET; + + status = + ares__sconfig_append(&sysconfig->sconfig, &addr, htons(addr_in->sin_port), + htons(addr_in->sin_port)); + + if (status != ARES_SUCCESS) { + return status; + } + } + + for (i = 0; i < count6; i++) { + struct sockaddr_in6 *addr_in = &(v6->__stat_nsaddr_list[i]); + struct ares_addr addr; + + addr.family = AF_INET6; + memcpy(&(addr.addr.addr6), &(addr_in->sin6_addr), + sizeof(addr_in->sin6_addr)); + + status = + ares__sconfig_append(&sysconfig->sconfig, &addr, htons(addr_in->sin_port), + htons(addr_in->sin_port)); + + if (status != ARES_SUCCESS) { + return status; + } + } + + return ARES_SUCCESS; +} +#endif + +#if defined(__riscos__) +static ares_status_t ares__init_sysconfig_riscos(ares_sysconfig_t *sysconfig) +{ + char *line; + ares_status_t status = ARES_SUCCESS; + + /* Under RISC OS, name servers are listed in the + system variable Inet$Resolvers, space separated. */ + line = getenv("Inet$Resolvers"); + if (line) { + char *resolvers = ares_strdup(line); + char *pos; + char *space; + + if (!resolvers) { + return ARES_ENOMEM; + } + + pos = resolvers; + do { + space = strchr(pos, ' '); + if (space) { + *space = '\0'; + } + status = ares__sconfig_append_fromstr(&sysconfig->sconfig, pos); + if (status != ARES_SUCCESS) { + break; + } + pos = space + 1; + } while (space); + + ares_free(resolvers); + } + + return status; +} +#endif + +#if defined(WATT32) +static ares_status_t ares__init_sysconfig_watt32(ares_sysconfig_t *sysconfig) +{ + size_t i; + ares_status_t status; + + sock_init(); + + for (i = 0; def_nameservers[i]; i++) { + struct ares_addr addr; + + addr.family = AF_INET; + addr.addr.addr4.s_addr = htonl(def_nameservers[i]); + + status = ares__sconfig_append(&sysconfig->sconfig, &addr, 0, 0); + + if (status != ARES_SUCCESS) { + return status; + } + } + + return ARES_SUCCESS; +} +#endif + +#if defined(ANDROID) || defined(__ANDROID__) +static ares_status_t ares__init_sysconfig_android(ares_sysconfig_t *sysconfig) +{ + size_t i; + char **dns_servers; + char *domains; + size_t num_servers; + ares_status_t status = ARES_EFILE; + + /* Use the Android connectivity manager to get a list + * of DNS servers. As of Android 8 (Oreo) net.dns# + * system properties are no longer available. Google claims this + * improves privacy. Apps now need the ACCESS_NETWORK_STATE + * permission and must use the ConnectivityManager which + * is Java only. */ + dns_servers = ares_get_android_server_list(MAX_DNS_PROPERTIES, &num_servers); + if (dns_servers != NULL) { + for (i = 0; i < num_servers; i++) { + status = + ares__sconfig_append_fromstr(&sysconfig->sconfig, dns_servers[i]); + if (status != ARES_SUCCESS) { + return status; + } + } + for (i = 0; i < num_servers; i++) { + ares_free(dns_servers[i]); + } + ares_free(dns_servers); + } + + domains = ares_get_android_search_domains_list(); + sysconfig->domains = ares__strsplit(domains, ", ", &sysconfig->ndomains); + ares_free(domains); + +# ifdef HAVE___SYSTEM_PROPERTY_GET + /* Old way using the system property still in place as + * a fallback. Older android versions can still use this. + * it's possible for older apps not not have added the new + * permission and we want to try to avoid breaking those. + * + * We'll only run this if we don't have any dns servers + * because this will get the same ones (if it works). */ + if (sysconfig->sconfig == NULL) { + char propname[PROP_NAME_MAX]; + char propvalue[PROP_VALUE_MAX] = ""; + for (i = 1; i <= MAX_DNS_PROPERTIES; i++) { + snprintf(propname, sizeof(propname), "%s%u", DNS_PROP_NAME_PREFIX, i); + if (__system_property_get(propname, propvalue) < 1) { + break; + } + status = ares__sconfig_append_fromstr(&sysconfig->sconfig, propvalue); + if (status != ARES_SUCCESS) { + return status; + } + } + } +# endif /* HAVE___SYSTEM_PROPERTY_GET */ + + return status; +} +#endif + +#if defined(CARES_USE_LIBRESOLV) +static ares_status_t ares__init_sysconfig_libresolv(ares_sysconfig_t *sysconfig) +{ + struct __res_state res; + ares_status_t status = ARES_SUCCESS; + union res_sockaddr_union addr[MAXNS]; + int nscount; + size_t i; + size_t entries = 0; + + memset(&res, 0, sizeof(res)); + + if (res_ninit(&res) != 0 || !(res.options & RES_INIT)) { + return ARES_EFILE; + } + + nscount = res_getservers(&res, addr, MAXNS); + + for (i = 0; i < (size_t)nscount; ++i) { + char ipaddr[INET6_ADDRSTRLEN] = ""; + char ipaddr_port[INET6_ADDRSTRLEN + 8]; /* [%s]:NNNNN */ + unsigned short port = 0; + + sa_family_t family = addr[i].sin.sin_family; + if (family == AF_INET) { + ares_inet_ntop(family, &addr[i].sin.sin_addr, ipaddr, sizeof(ipaddr)); + port = ntohs(addr[i].sin.sin_port); + } else if (family == AF_INET6) { + ares_inet_ntop(family, &addr[i].sin6.sin6_addr, ipaddr, sizeof(ipaddr)); + port = ntohs(addr[i].sin6.sin6_port); + } else { + continue; + } + + if (port) { + snprintf(ipaddr_port, sizeof(ipaddr_port), "[%s]:%u", ipaddr, port); + } else { + snprintf(ipaddr_port, sizeof(ipaddr_port), "%s", ipaddr); + } + + status = ares__sconfig_append_fromstr(&sysconfig->sconfig, ipaddr_port); + if (status != ARES_SUCCESS) { + goto done; + } + } + + while ((entries < MAXDNSRCH) && res.dnsrch[entries]) { + entries++; + } + + if (entries) { + sysconfig->domains = ares_malloc_zero(entries * sizeof(char *)); + if (sysconfig->domains == NULL) { + status = ARES_ENOMEM; + goto done; + } else { + sysconfig->ndomains = entries; + for (i = 0; i < sysconfig->ndomains; i++) { + sysconfig->domains[i] = ares_strdup(res.dnsrch[i]); + if (sysconfig->domains[i] == NULL) { + status = ARES_ENOMEM; + goto done; + } + } + } + } + + if (res.ndots > 0) { + sysconfig->ndots = (size_t)res.ndots; + } + if (res.retry > 0) { + sysconfig->tries = (size_t)res.retry; + } + if (res.options & RES_ROTATE) { + sysconfig->rotate = ARES_TRUE; + } + + if (res.retrans > 0) { + if (res.retrans > 0) { + sysconfig->timeout_ms = (unsigned int)res.retrans * 1000; + } +# ifdef __APPLE__ + if (res.retry >= 0) { + sysconfig->timeout_ms /= + ((unsigned int)res.retry + 1) * + (unsigned int)(res.nscount > 0 ? res.nscount : 1); + } +# endif + } + +done: + res_ndestroy(&res); + return status; +} +#endif + +static void ares_sysconfig_free(ares_sysconfig_t *sysconfig) +{ + ares__llist_destroy(sysconfig->sconfig); + ares__strsplit_free(sysconfig->domains, sysconfig->ndomains); + ares_free(sysconfig->sortlist); + ares_free(sysconfig->lookups); + memset(sysconfig, 0, sizeof(*sysconfig)); +} + +static ares_status_t ares_sysconfig_apply(ares_channel_t *channel, + const ares_sysconfig_t *sysconfig) +{ + ares_status_t status; + + if (sysconfig->sconfig && !(channel->optmask & ARES_OPT_SERVERS)) { + status = ares__servers_update(channel, sysconfig->sconfig, ARES_FALSE); + if (status != ARES_SUCCESS) { + return status; + } + } + + if (sysconfig->domains && !(channel->optmask & ARES_OPT_DOMAINS)) { + /* Make sure we duplicate first then replace so even if there is + * ARES_ENOMEM, the channel stays in a good state */ + char **temp = + ares__strsplit_duplicate(sysconfig->domains, sysconfig->ndomains); + if (temp == NULL) { + return ARES_ENOMEM; + } + + ares__strsplit_free(channel->domains, channel->ndomains); + channel->domains = temp; + channel->ndomains = sysconfig->ndomains; + } + + if (sysconfig->lookups && !(channel->optmask & ARES_OPT_LOOKUPS)) { + char *temp = ares_strdup(sysconfig->lookups); + if (temp == NULL) { + return ARES_ENOMEM; + } + + ares_free(channel->lookups); + channel->lookups = temp; + } + + if (sysconfig->sortlist && !(channel->optmask & ARES_OPT_SORTLIST)) { + struct apattern *temp = + ares_malloc(sizeof(*channel->sortlist) * sysconfig->nsortlist); + if (temp == NULL) { + return ARES_ENOMEM; + } + memcpy(temp, sysconfig->sortlist, + sizeof(*channel->sortlist) * sysconfig->nsortlist); + + ares_free(channel->sortlist); + channel->sortlist = temp; + channel->nsort = sysconfig->nsortlist; + } + + if (sysconfig->ndots && !(channel->optmask & ARES_OPT_NDOTS)) { + channel->ndots = sysconfig->ndots; + } + + if (sysconfig->tries && !(channel->optmask & ARES_OPT_TRIES)) { + channel->tries = sysconfig->tries; + } + + if (sysconfig->timeout_ms && !(channel->optmask & ARES_OPT_TIMEOUTMS)) { + channel->timeout = sysconfig->timeout_ms; + } + + if (!(channel->optmask & (ARES_OPT_ROTATE | ARES_OPT_NOROTATE))) { + channel->rotate = sysconfig->rotate; + } + + return ARES_SUCCESS; +} + +ares_status_t ares__init_by_sysconfig(ares_channel_t *channel) +{ + ares_status_t status; + ares_sysconfig_t sysconfig; + + memset(&sysconfig, 0, sizeof(sysconfig)); + +#ifdef _WIN32 + status = ares__init_sysconfig_windows(&sysconfig); +#elif defined(__MVS__) + status = ares__init_sysconfig_mvs(&sysconfig); +#elif defined(__riscos__) + status = ares__init_sysconfig_riscos(&sysconfig); +#elif defined(WATT32) + status = ares__init_sysconfig_watt32(&sysconfig); +#elif defined(ANDROID) || defined(__ANDROID__) + status = ares__init_sysconfig_android(&sysconfig); +#elif defined(CARES_USE_LIBRESOLV) + status = ares__init_sysconfig_libresolv(&sysconfig); +#else + status = ares__init_sysconfig_files(channel, &sysconfig); +#endif + + if (status != ARES_SUCCESS) { + goto done; + } + + /* Environment is supposed to override sysconfig */ + status = ares__init_by_environment(&sysconfig); + if (status != ARES_SUCCESS) { + goto done; + } + + status = ares_sysconfig_apply(channel, &sysconfig); + if (status != ARES_SUCCESS) { + goto done; + } + +done: + ares_sysconfig_free(&sysconfig); + + return status; +} diff --git a/lib/c-ares-1.23.0/src/lib/ares_sysconfig_files.c b/lib/c-ares-1.23.0/src/lib/ares_sysconfig_files.c new file mode 100644 index 00000000000..ee4f50a21ec --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares_sysconfig_files.c @@ -0,0 +1,647 @@ +/* MIT License + * + * Copyright (c) 1998 Massachusetts Institute of Technology + * Copyright (c) 2007 Daniel Stenberg + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ + +#include "ares_setup.h" + +#ifdef HAVE_SYS_PARAM_H +# include +#endif + +#ifdef HAVE_NETINET_IN_H +# include +#endif + +#ifdef HAVE_NETDB_H +# include +#endif + +#ifdef HAVE_ARPA_INET_H +# include +#endif + +#include "ares_nameser.h" + +#if defined(ANDROID) || defined(__ANDROID__) +# include +# include "ares_android.h" +/* From the Bionic sources */ +# define DNS_PROP_NAME_PREFIX "net.dns" +# define MAX_DNS_PROPERTIES 8 +#endif + +#if defined(CARES_USE_LIBRESOLV) +# include +#endif + +#if defined(USE_WINSOCK) && defined(HAVE_IPHLPAPI_H) +# include +#endif + +#include "ares.h" +#include "ares_inet_net_pton.h" +#include "ares_platform.h" +#include "ares_private.h" + +static int ip_addr(const char *ipbuf, ares_ssize_t len, struct in_addr *addr) +{ + /* Four octets and three periods yields at most 15 characters. */ + if (len > 15) { + return -1; + } + + if (ares_inet_pton(AF_INET, ipbuf, addr) < 1) { + return -1; + } + + return 0; +} + +static void natural_mask(struct apattern *pat) +{ + struct in_addr addr; + + /* Store a host-byte-order copy of pat in a struct in_addr. Icky, + * but portable. + */ + addr.s_addr = ntohl(pat->addr.addr4.s_addr); + + /* This is out of date in the CIDR world, but some people might + * still rely on it. + */ + if (IN_CLASSA(addr.s_addr)) { + pat->mask.addr4.s_addr = htonl(IN_CLASSA_NET); + } else if (IN_CLASSB(addr.s_addr)) { + pat->mask.addr4.s_addr = htonl(IN_CLASSB_NET); + } else { + pat->mask.addr4.s_addr = htonl(IN_CLASSC_NET); + } +} + +static ares_bool_t sortlist_alloc(struct apattern **sortlist, size_t *nsort, + const struct apattern *pat) +{ + struct apattern *newsort; + newsort = ares_realloc(*sortlist, (*nsort + 1) * sizeof(struct apattern)); + if (!newsort) { + return ARES_FALSE; + } + newsort[*nsort] = *pat; + *sortlist = newsort; + (*nsort)++; + return ARES_TRUE; +} + +ares_status_t ares__parse_sortlist(struct apattern **sortlist, size_t *nsort, + const char *str) +{ + struct apattern pat; + const char *q; + + if (*sortlist != NULL) { + ares_free(*sortlist); + } + + *sortlist = NULL; + *nsort = 0; + + /* Add sortlist entries. */ + while (*str && *str != ';') { + int bits; + char ipbuf[17]; + char ipbufpfx[32]; + size_t len; + + /* Find just the IP */ + q = str; + while (*q && *q != '/' && *q != ';' && !ISSPACE(*q)) { + q++; + } + + len = (size_t)(q - str); + if (len >= sizeof(ipbuf) - 1) { + ares_free(*sortlist); + *sortlist = NULL; + return ARES_EBADSTR; + } + memcpy(ipbuf, str, len); + ipbuf[len] = '\0'; + + /* Find the prefix */ + if (*q == '/') { + const char *str2 = q + 1; + while (*q && *q != ';' && !ISSPACE(*q)) { + q++; + } + if (q - str >= 32) { + ares_free(*sortlist); + *sortlist = NULL; + return ARES_EBADSTR; + } + memcpy(ipbufpfx, str, (size_t)(q - str)); + ipbufpfx[q - str] = '\0'; + str = str2; + } else { + ipbufpfx[0] = '\0'; + } + /* Lets see if it is CIDR */ + /* First we'll try IPv6 */ + if ((bits = ares_inet_net_pton(AF_INET6, ipbufpfx[0] ? ipbufpfx : ipbuf, + &pat.addr.addr6, sizeof(pat.addr.addr6))) > + 0) { + pat.type = PATTERN_CIDR; + pat.mask.bits = (unsigned short)bits; + pat.family = AF_INET6; + if (!sortlist_alloc(sortlist, nsort, &pat)) { + ares_free(*sortlist); + *sortlist = NULL; + return ARES_ENOMEM; + } + } else if (ipbufpfx[0] && + (bits = ares_inet_net_pton(AF_INET, ipbufpfx, &pat.addr.addr4, + sizeof(pat.addr.addr4))) > 0) { + pat.type = PATTERN_CIDR; + pat.mask.bits = (unsigned short)bits; + pat.family = AF_INET; + if (!sortlist_alloc(sortlist, nsort, &pat)) { + ares_free(*sortlist); + *sortlist = NULL; + return ARES_ENOMEM; + } + } + /* See if it is just a regular IP */ + else if (ip_addr(ipbuf, q - str, &pat.addr.addr4) == 0) { + if (ipbufpfx[0]) { + len = (size_t)(q - str); + if (len >= sizeof(ipbuf) - 1) { + ares_free(*sortlist); + *sortlist = NULL; + return ARES_EBADSTR; + } + memcpy(ipbuf, str, len); + ipbuf[len] = '\0'; + + if (ip_addr(ipbuf, q - str, &pat.mask.addr4) != 0) { + natural_mask(&pat); + } + } else { + natural_mask(&pat); + } + pat.family = AF_INET; + pat.type = PATTERN_MASK; + if (!sortlist_alloc(sortlist, nsort, &pat)) { + ares_free(*sortlist); + *sortlist = NULL; + return ARES_ENOMEM; + } + } else { + while (*q && *q != ';' && !ISSPACE(*q)) { + q++; + } + } + str = q; + while (ISSPACE(*str)) { + str++; + } + } + + return ARES_SUCCESS; +} + +static ares_status_t config_search(ares_sysconfig_t *sysconfig, const char *str) +{ + if (sysconfig->domains && sysconfig->ndomains > 0) { + /* if we already have some domains present, free them first */ + ares__strsplit_free(sysconfig->domains, sysconfig->ndomains); + sysconfig->domains = NULL; + sysconfig->ndomains = 0; + } + + sysconfig->domains = ares__strsplit(str, ", ", &sysconfig->ndomains); + if (sysconfig->domains == NULL) { + return ARES_ENOMEM; + } + + return ARES_SUCCESS; +} + +static ares_status_t config_domain(ares_sysconfig_t *sysconfig, char *str) +{ + char *q; + + /* Set a single search domain. */ + q = str; + while (*q && !ISSPACE(*q)) { + q++; + } + *q = '\0'; + + return config_search(sysconfig, str); +} + +static ares_status_t config_lookup(ares_sysconfig_t *sysconfig, const char *str, + const char *bindch, const char *altbindch, + const char *filech) +{ + char lookups[3]; + char *l; + const char *p; + ares_bool_t found; + + if (altbindch == NULL) { + altbindch = bindch; + } + + /* Set the lookup order. Only the first letter of each work + * is relevant, and it has to be "b" for DNS or "f" for the + * host file. Ignore everything else. + */ + l = lookups; + p = str; + found = ARES_FALSE; + while (*p) { + if ((*p == *bindch || *p == *altbindch || *p == *filech) && + l < lookups + 2) { + if (*p == *bindch || *p == *altbindch) { + *l++ = 'b'; + } else { + *l++ = 'f'; + } + found = ARES_TRUE; + } + while (*p && !ISSPACE(*p) && (*p != ',')) { + p++; + } + while (*p && (ISSPACE(*p) || (*p == ','))) { + p++; + } + } + if (!found) { + return ARES_ENOTINITIALIZED; + } + *l = '\0'; + + ares_free(sysconfig->lookups); + sysconfig->lookups = ares_strdup(lookups); + if (sysconfig->lookups == NULL) { + return ARES_ENOMEM; + } + return ARES_SUCCESS; +} + +static const char *try_option(const char *p, const char *q, const char *opt) +{ + size_t len = ares_strlen(opt); + return ((size_t)(q - p) >= len && !strncmp(p, opt, len)) ? &p[len] : NULL; +} + +static ares_status_t set_options(ares_sysconfig_t *sysconfig, const char *str) +{ + const char *p; + const char *q; + const char *val; + + if (str == NULL) { + return ARES_SUCCESS; + } + + p = str; + while (*p) { + q = p; + while (*q && !ISSPACE(*q)) { + q++; + } + val = try_option(p, q, "ndots:"); + if (val) { + sysconfig->ndots = strtoul(val, NULL, 10); + } + + // Outdated option. + val = try_option(p, q, "retrans:"); + if (val) { + sysconfig->timeout_ms = strtoul(val, NULL, 10); + } + + val = try_option(p, q, "timeout:"); + if (val) { + sysconfig->timeout_ms = strtoul(val, NULL, 10) * 1000; + } + + // Outdated option. + val = try_option(p, q, "retry:"); + if (val) { + sysconfig->tries = strtoul(val, NULL, 10); + } + + val = try_option(p, q, "attempts:"); + if (val) { + sysconfig->tries = strtoul(val, NULL, 10); + } + + val = try_option(p, q, "rotate"); + if (val) { + sysconfig->rotate = ARES_TRUE; + } + + p = q; + while (ISSPACE(*p)) { + p++; + } + } + + return ARES_SUCCESS; +} + +static char *try_config(char *s, const char *opt, char scc) +{ + size_t len; + char *p; + char *q; + + if (!s || !opt) { + /* no line or no option */ + return NULL; /* LCOV_EXCL_LINE */ + } + + /* Hash '#' character is always used as primary comment char, additionally + a not-NUL secondary comment char will be considered when specified. */ + + /* trim line comment */ + p = s; + if (scc) { + while (*p && (*p != '#') && (*p != scc)) { + p++; + } + } else { + while (*p && (*p != '#')) { + p++; + } + } + *p = '\0'; + + /* trim trailing whitespace */ + q = p - 1; + while ((q >= s) && ISSPACE(*q)) { + q--; + } + *++q = '\0'; + + /* skip leading whitespace */ + p = s; + while (*p && ISSPACE(*p)) { + p++; + } + + if (!*p) { + /* empty line */ + return NULL; + } + + if ((len = ares_strlen(opt)) == 0) { + /* empty option */ + return NULL; /* LCOV_EXCL_LINE */ + } + + if (strncmp(p, opt, len) != 0) { + /* line and option do not match */ + return NULL; + } + + /* skip over given option name */ + p += len; + + if (!*p) { + /* no option value */ + return NULL; /* LCOV_EXCL_LINE */ + } + + if ((opt[len - 1] != ':') && (opt[len - 1] != '=') && !ISSPACE(*p)) { + /* whitespace between option name and value is mandatory + for given option names which do not end with ':' or '=' */ + return NULL; + } + + /* skip over whitespace */ + while (*p && ISSPACE(*p)) { + p++; + } + + if (!*p) { + /* no option value */ + return NULL; + } + + /* return pointer to option value */ + return p; +} + +ares_status_t ares__init_by_environment(ares_sysconfig_t *sysconfig) +{ + const char *localdomain; + const char *res_options; + ares_status_t status; + + localdomain = getenv("LOCALDOMAIN"); + if (localdomain) { + char *temp = ares_strdup(localdomain); + if (temp == NULL) { + return ARES_ENOMEM; + } + status = config_domain(sysconfig, temp); + ares_free(temp); + if (status != ARES_SUCCESS) { + return status; + } + } + + res_options = getenv("RES_OPTIONS"); + if (res_options) { + status = set_options(sysconfig, res_options); + if (status != ARES_SUCCESS) { + return status; + } + } + + return ARES_SUCCESS; +} + +ares_status_t ares__init_sysconfig_files(const ares_channel_t *channel, + ares_sysconfig_t *sysconfig) +{ + char *p; + FILE *fp = NULL; + char *line = NULL; + size_t linesize = 0; + int error; + const char *resolvconf_path; + ares_status_t status = ARES_SUCCESS; + + /* Support path for resolvconf filename set by ares_init_options */ + if (channel->resolvconf_path) { + resolvconf_path = channel->resolvconf_path; + } else { + resolvconf_path = PATH_RESOLV_CONF; + } + + fp = fopen(resolvconf_path, "r"); + if (fp) { + while ((status = ares__read_line(fp, &line, &linesize)) == ARES_SUCCESS) { + if ((p = try_config(line, "domain", ';'))) { + status = config_domain(sysconfig, p); + } else if ((p = try_config(line, "lookup", ';'))) { + status = config_lookup(sysconfig, p, "bind", NULL, "file"); + } else if ((p = try_config(line, "search", ';'))) { + status = config_search(sysconfig, p); + } else if ((p = try_config(line, "nameserver", ';'))) { + status = ares__sconfig_append_fromstr(&sysconfig->sconfig, p); + } else if ((p = try_config(line, "sortlist", ';'))) { + status = + ares__parse_sortlist(&sysconfig->sortlist, &sysconfig->nsortlist, p); + } else if ((p = try_config(line, "options", ';'))) { + status = set_options(sysconfig, p); + } else { + status = ARES_SUCCESS; + } + if (status != ARES_SUCCESS) { + fclose(fp); + goto done; + } + } + fclose(fp); + + if (status != ARES_EOF) { + goto done; + } + } else { + error = ERRNO; + switch (error) { + case ENOENT: + case ESRCH: + break; + default: + DEBUGF(fprintf(stderr, "fopen() failed with error: %d %s\n", error, + strerror(error))); + DEBUGF(fprintf(stderr, "Error opening file: %s\n", PATH_RESOLV_CONF)); + status = ARES_EFILE; + goto done; + } + } + + + /* Many systems (Solaris, Linux, BSD's) use nsswitch.conf */ + fp = fopen("/etc/nsswitch.conf", "r"); + if (fp) { + while ((status = ares__read_line(fp, &line, &linesize)) == ARES_SUCCESS) { + if ((p = try_config(line, "hosts:", '\0'))) { + (void)config_lookup(sysconfig, p, "dns", "resolve", "files"); + } + } + fclose(fp); + if (status != ARES_EOF) { + goto done; + } + } else { + error = ERRNO; + switch (error) { + case ENOENT: + case ESRCH: + break; + default: + DEBUGF(fprintf(stderr, "fopen() failed with error: %d %s\n", error, + strerror(error))); + DEBUGF( + fprintf(stderr, "Error opening file: %s\n", "/etc/nsswitch.conf")); + break; + } + /* ignore error, maybe we will get luck in next if clause */ + } + + + /* Linux / GNU libc 2.x and possibly others have host.conf */ + fp = fopen("/etc/host.conf", "r"); + if (fp) { + while ((status = ares__read_line(fp, &line, &linesize)) == ARES_SUCCESS) { + if ((p = try_config(line, "order", '\0'))) { + /* ignore errors */ + (void)config_lookup(sysconfig, p, "bind", NULL, "hosts"); + } + } + fclose(fp); + if (status != ARES_EOF) { + goto done; + } + } else { + error = ERRNO; + switch (error) { + case ENOENT: + case ESRCH: + break; + default: + DEBUGF(fprintf(stderr, "fopen() failed with error: %d %s\n", error, + strerror(error))); + DEBUGF(fprintf(stderr, "Error opening file: %s\n", "/etc/host.conf")); + break; + } + + /* ignore error, maybe we will get luck in next if clause */ + } + + + /* Tru64 uses /etc/svc.conf */ + fp = fopen("/etc/svc.conf", "r"); + if (fp) { + while ((status = ares__read_line(fp, &line, &linesize)) == ARES_SUCCESS) { + if ((p = try_config(line, "hosts=", '\0'))) { + /* ignore errors */ + (void)config_lookup(sysconfig, p, "bind", NULL, "local"); + } + } + fclose(fp); + if (status != ARES_EOF) { + goto done; + } + } else { + error = ERRNO; + switch (error) { + case ENOENT: + case ESRCH: + break; + default: + DEBUGF(fprintf(stderr, "fopen() failed with error: %d %s\n", error, + strerror(error))); + DEBUGF(fprintf(stderr, "Error opening file: %s\n", "/etc/svc.conf")); + break; + } + /* ignore error */ + } + + status = ARES_SUCCESS; + +done: + ares_free(line); + + return status; +} diff --git a/lib/c-ares-1.23.0/src/lib/ares_timeout.c b/lib/c-ares-1.23.0/src/lib/ares_timeout.c new file mode 100644 index 00000000000..5250b4bb7fe --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares_timeout.c @@ -0,0 +1,96 @@ +/* MIT License + * + * Copyright (c) 1998 Massachusetts Institute of Technology + * Copyright (c) The c-ares project and its contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ + +#include "ares_setup.h" + +#ifdef HAVE_LIMITS_H +# include +#endif + +#include "ares.h" +#include "ares_private.h" + +static void remaining_time(struct timeval *remaining, const struct timeval *now, + const struct timeval *tout) +{ + memset(remaining, 0, sizeof(*remaining)); + + /* Expired! */ + if (tout->tv_sec < now->tv_sec || + (tout->tv_sec == now->tv_sec && tout->tv_usec < now->tv_usec)) { + return; + } + + remaining->tv_sec = tout->tv_sec - now->tv_sec; + if (tout->tv_usec < now->tv_usec) { + remaining->tv_sec -= 1; + remaining->tv_usec = (tout->tv_usec + 1000000) - now->tv_usec; + } else { + remaining->tv_usec = tout->tv_usec - now->tv_usec; + } +} + +struct timeval *ares_timeout(ares_channel_t *channel, struct timeval *maxtv, + struct timeval *tvbuf) +{ + const struct query *query; + ares__slist_node_t *node; + struct timeval now; + + /* The minimum timeout of all queries is always the first entry in + * channel->queries_by_timeout */ + node = ares__slist_node_first(channel->queries_by_timeout); + /* no queries/timeout */ + if (node == NULL) { + return maxtv; /* <-- maxtv can be null though, hrm */ + } + + query = ares__slist_node_val(node); + + now = ares__tvnow(); + + remaining_time(tvbuf, &now, &query->timeout); + + if (maxtv == NULL) { + return tvbuf; + } + + /* Return the minimum time between maxtv and tvbuf */ + + if (tvbuf->tv_sec > maxtv->tv_sec) { + return maxtv; + } + if (tvbuf->tv_sec < maxtv->tv_sec) { + return tvbuf; + } + + if (tvbuf->tv_usec > maxtv->tv_usec) { + return maxtv; + } + + return tvbuf; +} diff --git a/lib/c-ares-1.23.0/src/lib/ares_update_servers.c b/lib/c-ares-1.23.0/src/lib/ares_update_servers.c new file mode 100644 index 00000000000..93c063355b3 --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares_update_servers.c @@ -0,0 +1,1059 @@ +/* MIT License + * + * Copyright (c) 1998 Massachusetts Institute of Technology + * Copyright (c) 2008 Daniel Stenberg + * Copyright (c) 2023 Brad House + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ +#include "ares_setup.h" + +#ifdef HAVE_ARPA_INET_H +# include +#endif + +#include "ares.h" +#include "ares_data.h" +#include "ares_inet_net_pton.h" +#include "ares_private.h" + +typedef struct { + struct ares_addr addr; + unsigned short tcp_port; + unsigned short udp_port; +} ares_sconfig_t; + +static ares_bool_t ares__addr_match(const struct ares_addr *addr1, + const struct ares_addr *addr2) +{ + if (addr1 == NULL && addr2 == NULL) { + return ARES_TRUE; + } + + if (addr1 == NULL || addr2 == NULL) { + return ARES_FALSE; + } + + if (addr1->family != addr2->family) { + return ARES_FALSE; + } + + if (addr1->family == AF_INET && memcmp(&addr1->addr.addr4, &addr2->addr.addr4, + sizeof(addr1->addr.addr4)) == 0) { + return ARES_TRUE; + } + + if (addr1->family == AF_INET6 && + memcmp(&addr1->addr.addr6._S6_un._S6_u8, &addr2->addr.addr6._S6_un._S6_u8, + sizeof(addr1->addr.addr6._S6_un._S6_u8)) == 0) { + return ARES_TRUE; + } + + return ARES_FALSE; +} + +/* Validate that the ip address matches the subnet (network base and network + * mask) specified. Addresses are specified in standard Network Byte Order as + * 16 bytes, and the netmask is 0 to 128 (bits). + */ +static ares_bool_t ares_ipv6_subnet_matches(const unsigned char netbase[16], + unsigned char netmask, + const unsigned char *ipaddr) +{ + unsigned char mask[16] = { 0 }; + unsigned char i; + + /* Misuse */ + if (netmask > 128) { + return ARES_FALSE; + } + + /* Quickly set whole bytes */ + memset(mask, 0xFF, netmask / 8); + + /* Set remaining bits */ + if (netmask % 8 && netmask < 128 /* Silence coverity */) { + mask[netmask / 8] = (unsigned char)(0xff << (8 - (netmask % 8))); + } + + for (i = 0; i < 16; i++) { + if ((netbase[i] & mask[i]) != (ipaddr[i] & mask[i])) { + return ARES_FALSE; + } + } + + return ARES_TRUE; +} + +static ares_bool_t ares_server_blacklisted(const struct ares_addr *addr) +{ + /* A list of blacklisted IPv6 subnets. */ + const struct { + const unsigned char netbase[16]; + unsigned char netmask; + } blacklist_v6[] = { + /* fec0::/10 was deprecated by [RFC3879] in September 2004. Formerly a + * Site-Local scoped address prefix. These are never valid DNS servers, + * but are known to be returned at least sometimes on Windows and Android. + */ + {{ 0xfe, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00 }, + 10} + }; + + size_t i; + + if (addr->family != AF_INET6) { + return ARES_FALSE; + } + + /* See if ipaddr matches any of the entries in the blacklist. */ + for (i = 0; i < sizeof(blacklist_v6) / sizeof(*blacklist_v6); i++) { + if (ares_ipv6_subnet_matches(blacklist_v6[i].netbase, + blacklist_v6[i].netmask, + (const unsigned char *)&addr->addr.addr6)) { + return ARES_TRUE; + } + } + return ARES_FALSE; +} + +/* Parse address and port in these formats, either ipv4 or ipv6 addresses + * are allowed: + * ipaddr + * [ipaddr] + * [ipaddr]:port + * + * If a port is not specified, will set port to 0. + * + * Will fail if an IPv6 nameserver as detected by + * ares_ipv6_server_blacklisted() + * + * Returns an error code on failure, else ARES_SUCCESS + */ +static ares_status_t parse_dnsaddrport(const char *str, size_t len, + struct ares_addr *host, + unsigned short *port) +{ + char ipaddr[INET6_ADDRSTRLEN] = ""; + char ipport[6] = ""; + size_t mylen; + const char *addr_start = NULL; + const char *addr_end = NULL; + const char *port_start = NULL; + const char *port_end = NULL; + + /* Must start with [, hex digit or : */ + if (len == 0 || (*str != '[' && !isxdigit(*str) && *str != ':')) { + return ARES_EBADSTR; + } + + /* If it starts with a bracket, must end with a bracket */ + if (*str == '[') { + const char *ptr; + addr_start = str + 1; + ptr = memchr(addr_start, ']', len - 1); + if (ptr == NULL) { + return ARES_EBADSTR; + } + addr_end = ptr - 1; + + /* Try to pull off port */ + if ((size_t)(ptr - str) < len) { + ptr++; + if (*ptr != ':') { + return ARES_EBADSTR; + } + + /* Missing port number */ + if ((size_t)(ptr - str) == len) { + return ARES_EBADSTR; + } + + port_start = ptr + 1; + port_end = str + (len - 1); + } + } else { + addr_start = str; + addr_end = str + (len - 1); + } + + mylen = (size_t)(addr_end - addr_start) + 1; + /* Larger than buffer with null term */ + if (mylen + 1 > sizeof(ipaddr)) { + return ARES_EBADSTR; + } + + memset(ipaddr, 0, sizeof(ipaddr)); + memcpy(ipaddr, addr_start, mylen); + + if (port_start) { + mylen = (size_t)(port_end - port_start) + 1; + /* Larger than buffer with null term */ + if (mylen + 1 > sizeof(ipport)) { + return ARES_EBADSTR; + } + memset(ipport, 0, sizeof(ipport)); + memcpy(ipport, port_start, mylen); + } else { + snprintf(ipport, sizeof(ipport), "0"); + } + + /* Convert textual address to binary format. */ + if (ares_inet_pton(AF_INET, ipaddr, &host->addr.addr4) == 1) { + host->family = AF_INET; + } else if (ares_inet_pton(AF_INET6, ipaddr, &host->addr.addr6) == 1) { + host->family = AF_INET6; + } else { + return ARES_EBADSTR; + } + + *port = (unsigned short)atoi(ipport); + return ARES_SUCCESS; +} + +ares_status_t ares__sconfig_append(ares__llist_t **sconfig, + const struct ares_addr *addr, + unsigned short udp_port, + unsigned short tcp_port) +{ + ares_sconfig_t *s; + ares_status_t status; + + if (sconfig == NULL || addr == NULL) { + return ARES_EFORMERR; + } + + /* Silently skip blacklisted IPv6 servers. */ + if (ares_server_blacklisted(addr)) { + return ARES_SUCCESS; + } + + s = ares_malloc_zero(sizeof(*s)); + if (s == NULL) { + return ARES_ENOMEM; + } + + if (*sconfig == NULL) { + *sconfig = ares__llist_create(ares_free); + if (*sconfig == NULL) { + status = ARES_ENOMEM; + goto fail; + } + } + + memcpy(&s->addr, addr, sizeof(s->addr)); + s->udp_port = udp_port; + s->tcp_port = tcp_port; + + if (ares__llist_insert_last(*sconfig, s) == NULL) { + status = ARES_ENOMEM; + goto fail; + } + + return ARES_SUCCESS; + +fail: + ares_free(s); + + return status; +} + +/* Add the IPv4 or IPv6 nameservers in str (separated by commas or spaces) to + * the servers list, updating servers and nservers as required. + * + * If a nameserver is encapsulated in [ ] it may optionally include a port + * suffix, e.g.: + * [127.0.0.1]:59591 + * + * The extended format is required to support OpenBSD's resolv.conf format: + * https://man.openbsd.org/OpenBSD-5.1/resolv.conf.5 + * As well as MacOS libresolv that may include a non-default port number. + * + * This will silently ignore blacklisted IPv6 nameservers as detected by + * ares_ipv6_server_blacklisted(). + * + * Returns an error code on failure, else ARES_SUCCESS. + */ +ares_status_t ares__sconfig_append_fromstr(ares__llist_t **sconfig, + const char *str) +{ + struct ares_addr host; + const char *p; + const char *txtaddr; + ares_status_t status; + + /* On Windows, there may be more than one nameserver specified in the same + * registry key, so we parse input as a space or comma separated list. + */ + for (p = str; p;) { + unsigned short port; + + /* Skip whitespace and commas. */ + while (*p && (ISSPACE(*p) || (*p == ','))) { + p++; + } + if (!*p) { + /* No more input, done. */ + break; + } + + /* Pointer to start of IPv4 or IPv6 address part. */ + txtaddr = p; + + /* Advance past this address. */ + while (*p && !ISSPACE(*p) && (*p != ',')) { + p++; + } + + if (parse_dnsaddrport(txtaddr, (size_t)(p - txtaddr), &host, &port) != + ARES_SUCCESS) { + continue; + } + + status = ares__sconfig_append(sconfig, &host, port, port); + if (status != ARES_SUCCESS) { + return status; + } + } + + return ARES_SUCCESS; +} + +static unsigned short ares__sconfig_get_port(const ares_channel_t *channel, + const ares_sconfig_t *s, + ares_bool_t is_tcp) +{ + unsigned short port = is_tcp ? s->tcp_port : s->udp_port; + + if (port == 0) { + port = is_tcp ? channel->tcp_port : channel->udp_port; + } + + if (port == 0) { + port = 53; + } + + return port; +} + +static ares__slist_node_t *ares__server_find(ares_channel_t *channel, + const ares_sconfig_t *s) +{ + ares__slist_node_t *node; + + for (node = ares__slist_node_first(channel->servers); node != NULL; + node = ares__slist_node_next(node)) { + const struct server_state *server = ares__slist_node_val(node); + + if (!ares__addr_match(&server->addr, &s->addr)) { + continue; + } + + if (server->tcp_port != ares__sconfig_get_port(channel, s, ARES_TRUE)) { + continue; + } + + if (server->udp_port != ares__sconfig_get_port(channel, s, ARES_FALSE)) { + continue; + } + + return node; + } + return NULL; +} + +static ares_bool_t ares__server_isdup(const ares_channel_t *channel, + ares__llist_node_t *s) +{ + /* Scan backwards to see if this is a duplicate */ + ares__llist_node_t *prev; + const ares_sconfig_t *server = ares__llist_node_val(s); + + for (prev = ares__llist_node_prev(s); prev != NULL; + prev = ares__llist_node_prev(prev)) { + const ares_sconfig_t *p = ares__llist_node_val(prev); + + if (!ares__addr_match(&server->addr, &p->addr)) { + continue; + } + + if (ares__sconfig_get_port(channel, server, ARES_TRUE) != + ares__sconfig_get_port(channel, p, ARES_TRUE)) { + continue; + } + + if (ares__sconfig_get_port(channel, server, ARES_FALSE) != + ares__sconfig_get_port(channel, p, ARES_FALSE)) { + continue; + } + + return ARES_TRUE; + } + + return ARES_FALSE; +} + +static ares_status_t ares__server_create(ares_channel_t *channel, + const ares_sconfig_t *sconfig, + size_t idx) +{ + ares_status_t status; + struct server_state *server = ares_malloc_zero(sizeof(*server)); + + if (server == NULL) { + return ARES_ENOMEM; + } + + server->idx = idx; + server->channel = channel; + server->udp_port = ares__sconfig_get_port(channel, sconfig, ARES_FALSE); + server->tcp_port = ares__sconfig_get_port(channel, sconfig, ARES_TRUE); + server->addr.family = sconfig->addr.family; + + if (sconfig->addr.family == AF_INET) { + memcpy(&server->addr.addr.addr4, &sconfig->addr.addr.addr4, + sizeof(server->addr.addr.addr4)); + } else if (sconfig->addr.family == AF_INET6) { + memcpy(&server->addr.addr.addr6, &sconfig->addr.addr.addr6, + sizeof(server->addr.addr.addr6)); + } + + server->tcp_parser = ares__buf_create(); + if (server->tcp_parser == NULL) { + status = ARES_ENOMEM; + goto done; + } + + server->tcp_send = ares__buf_create(); + if (server->tcp_send == NULL) { + status = ARES_ENOMEM; + goto done; + } + + server->connections = ares__llist_create(NULL); + if (server->connections == NULL) { + status = ARES_ENOMEM; + goto done; + } + + if (ares__slist_insert(channel->servers, server) == NULL) { + status = ARES_ENOMEM; + goto done; + } + + status = ARES_SUCCESS; + +done: + if (status != ARES_SUCCESS) { + ares__destroy_server(server); + } + + return status; +} + +static ares_bool_t ares__server_in_newconfig(const struct server_state *server, + ares__llist_t *srvlist) +{ + ares__llist_node_t *node; + const ares_channel_t *channel = server->channel; + + for (node = ares__llist_node_first(srvlist); node != NULL; + node = ares__llist_node_next(node)) { + const ares_sconfig_t *s = ares__llist_node_val(node); + + if (!ares__addr_match(&server->addr, &s->addr)) { + continue; + } + + if (server->tcp_port != ares__sconfig_get_port(channel, s, ARES_TRUE)) { + continue; + } + + if (server->udp_port != ares__sconfig_get_port(channel, s, ARES_FALSE)) { + continue; + } + + return ARES_TRUE; + } + + return ARES_FALSE; +} + +static void ares__servers_remove_stale(ares_channel_t *channel, + ares__llist_t *srvlist) +{ + ares__slist_node_t *snode = ares__slist_node_first(channel->servers); + + while (snode != NULL) { + ares__slist_node_t *snext = ares__slist_node_next(snode); + const struct server_state *server = ares__slist_node_val(snode); + if (!ares__server_in_newconfig(server, srvlist)) { + /* This will clean up all server state via the destruction callback and + * move any queries to new servers */ + ares__slist_node_destroy(snode); + } + snode = snext; + } +} + +static void ares__servers_trim_single(ares_channel_t *channel) +{ + while (ares__slist_len(channel->servers) > 1) { + ares__slist_node_destroy(ares__slist_node_last(channel->servers)); + } +} + +ares_status_t ares__servers_update(ares_channel_t *channel, + ares__llist_t *server_list, + ares_bool_t user_specified) +{ + ares__llist_node_t *node; + size_t idx = 0; + ares_status_t status; + + if (channel == NULL) { + return ARES_EFORMERR; + } + + ares__channel_lock(channel); + + /* NOTE: a NULL or zero entry server list is considered valid due to + * real-world people needing support for this for their test harnesses + */ + + /* Add new entries */ + for (node = ares__llist_node_first(server_list); node != NULL; + node = ares__llist_node_next(node)) { + const ares_sconfig_t *sconfig = ares__llist_node_val(node); + ares__slist_node_t *snode; + + /* Don't add duplicate servers! */ + if (ares__server_isdup(channel, node)) { + continue; + } + + snode = ares__server_find(channel, sconfig); + if (snode != NULL) { + struct server_state *server = ares__slist_node_val(snode); + + if (server->idx != idx) { + server->idx = idx; + /* Index changed, reinsert node, doesn't require any memory + * allocations so can't fail. */ + ares__slist_node_reinsert(snode); + } + } else { + status = ares__server_create(channel, sconfig, idx); + if (status != ARES_SUCCESS) { + goto done; + } + } + + idx++; + } + + /* Remove any servers that don't exist in the current configuration */ + ares__servers_remove_stale(channel, server_list); + + /* Trim to one server if ARES_FLAG_PRIMARY is set. */ + if (channel->flags & ARES_FLAG_PRIMARY) { + ares__servers_trim_single(channel); + } + + if (user_specified) { + /* Save servers as if they were passed in as an option */ + channel->optmask |= ARES_OPT_SERVERS; + } + + /* Clear any cached query results */ + ares__qcache_flush(channel->qcache); + + status = ARES_SUCCESS; + +done: + ares__channel_unlock(channel); + return status; +} + +static ares_status_t + ares_addr_node_to_server_config_llist(const struct ares_addr_node *servers, + ares__llist_t **llist) +{ + const struct ares_addr_node *node; + ares__llist_t *s; + + *llist = NULL; + + s = ares__llist_create(ares_free); + if (s == NULL) { + goto fail; + } + + for (node = servers; node != NULL; node = node->next) { + ares_sconfig_t *sconfig; + + /* Invalid entry */ + if (node->family != AF_INET && node->family != AF_INET6) { + continue; + } + + sconfig = ares_malloc_zero(sizeof(*sconfig)); + if (sconfig == NULL) { + goto fail; + } + + sconfig->addr.family = node->family; + if (node->family == AF_INET) { + memcpy(&sconfig->addr.addr.addr4, &node->addr.addr4, + sizeof(sconfig->addr.addr.addr4)); + } else if (sconfig->addr.family == AF_INET6) { + memcpy(&sconfig->addr.addr.addr6, &node->addr.addr6, + sizeof(sconfig->addr.addr.addr6)); + } + + if (ares__llist_insert_last(s, sconfig) == NULL) { + ares_free(sconfig); + goto fail; + } + } + + *llist = s; + return ARES_SUCCESS; + +fail: + ares__llist_destroy(s); + return ARES_ENOMEM; +} + +static ares_status_t ares_addr_port_node_to_server_config_llist( + const struct ares_addr_port_node *servers, ares__llist_t **llist) +{ + const struct ares_addr_port_node *node; + ares__llist_t *s; + + *llist = NULL; + + s = ares__llist_create(ares_free); + if (s == NULL) { + goto fail; + } + + for (node = servers; node != NULL; node = node->next) { + ares_sconfig_t *sconfig; + + /* Invalid entry */ + if (node->family != AF_INET && node->family != AF_INET6) { + continue; + } + + sconfig = ares_malloc_zero(sizeof(*sconfig)); + if (sconfig == NULL) { + goto fail; + } + + sconfig->addr.family = node->family; + if (node->family == AF_INET) { + memcpy(&sconfig->addr.addr.addr4, &node->addr.addr4, + sizeof(sconfig->addr.addr.addr4)); + } else if (sconfig->addr.family == AF_INET6) { + memcpy(&sconfig->addr.addr.addr6, &node->addr.addr6, + sizeof(sconfig->addr.addr.addr6)); + } + + sconfig->tcp_port = (unsigned short)node->tcp_port; + sconfig->udp_port = (unsigned short)node->udp_port; + + if (ares__llist_insert_last(s, sconfig) == NULL) { + ares_free(sconfig); + goto fail; + } + } + + *llist = s; + return ARES_SUCCESS; + +fail: + ares__llist_destroy(s); + return ARES_ENOMEM; +} + +ares_status_t ares_in_addr_to_server_config_llist(const struct in_addr *servers, + size_t nservers, + ares__llist_t **llist) +{ + size_t i; + ares__llist_t *s; + + *llist = NULL; + + s = ares__llist_create(ares_free); + if (s == NULL) { + goto fail; + } + + for (i = 0; servers != NULL && i < nservers; i++) { + ares_sconfig_t *sconfig; + + sconfig = ares_malloc_zero(sizeof(*sconfig)); + if (sconfig == NULL) { + goto fail; + } + + sconfig->addr.family = AF_INET; + memcpy(&sconfig->addr.addr.addr4, &servers[i], + sizeof(sconfig->addr.addr.addr4)); + + if (ares__llist_insert_last(s, sconfig) == NULL) { + goto fail; + } + } + + *llist = s; + return ARES_SUCCESS; + +fail: + ares__llist_destroy(s); + return ARES_ENOMEM; +} + +int ares_get_servers(ares_channel_t *channel, struct ares_addr_node **servers) +{ + struct ares_addr_node *srvr_head = NULL; + struct ares_addr_node *srvr_last = NULL; + struct ares_addr_node *srvr_curr; + ares_status_t status = ARES_SUCCESS; + ares__slist_node_t *node; + + if (channel == NULL) { + return ARES_ENODATA; + } + + ares__channel_lock(channel); + + for (node = ares__slist_node_first(channel->servers); node != NULL; + node = ares__slist_node_next(node)) { + const struct server_state *server = ares__slist_node_val(node); + + /* Allocate storage for this server node appending it to the list */ + srvr_curr = ares_malloc_data(ARES_DATATYPE_ADDR_NODE); + if (!srvr_curr) { + status = ARES_ENOMEM; + break; + } + if (srvr_last) { + srvr_last->next = srvr_curr; + } else { + srvr_head = srvr_curr; + } + srvr_last = srvr_curr; + + /* Fill this server node data */ + srvr_curr->family = server->addr.family; + if (srvr_curr->family == AF_INET) { + memcpy(&srvr_curr->addr.addr4, &server->addr.addr.addr4, + sizeof(srvr_curr->addr.addr4)); + } else { + memcpy(&srvr_curr->addr.addr6, &server->addr.addr.addr6, + sizeof(srvr_curr->addr.addr6)); + } + } + + if (status != ARES_SUCCESS) { + ares_free_data(srvr_head); + srvr_head = NULL; + } + + *servers = srvr_head; + + ares__channel_unlock(channel); + + return (int)status; +} + +int ares_get_servers_ports(ares_channel_t *channel, + struct ares_addr_port_node **servers) +{ + struct ares_addr_port_node *srvr_head = NULL; + struct ares_addr_port_node *srvr_last = NULL; + struct ares_addr_port_node *srvr_curr; + ares_status_t status = ARES_SUCCESS; + ares__slist_node_t *node; + + if (channel == NULL) { + return ARES_ENODATA; + } + + ares__channel_lock(channel); + + for (node = ares__slist_node_first(channel->servers); node != NULL; + node = ares__slist_node_next(node)) { + const struct server_state *server = ares__slist_node_val(node); + + /* Allocate storage for this server node appending it to the list */ + srvr_curr = ares_malloc_data(ARES_DATATYPE_ADDR_PORT_NODE); + if (!srvr_curr) { + status = ARES_ENOMEM; + break; + } + if (srvr_last) { + srvr_last->next = srvr_curr; + } else { + srvr_head = srvr_curr; + } + srvr_last = srvr_curr; + + /* Fill this server node data */ + srvr_curr->family = server->addr.family; + srvr_curr->udp_port = server->udp_port; + srvr_curr->tcp_port = server->tcp_port; + + if (srvr_curr->family == AF_INET) { + memcpy(&srvr_curr->addr.addr4, &server->addr.addr.addr4, + sizeof(srvr_curr->addr.addr4)); + } else { + memcpy(&srvr_curr->addr.addr6, &server->addr.addr.addr6, + sizeof(srvr_curr->addr.addr6)); + } + } + + if (status != ARES_SUCCESS) { + ares_free_data(srvr_head); + srvr_head = NULL; + } + + *servers = srvr_head; + + ares__channel_unlock(channel); + return (int)status; +} + +int ares_set_servers(ares_channel_t *channel, + const struct ares_addr_node *servers) +{ + ares__llist_t *slist; + ares_status_t status; + + if (channel == NULL) { + return ARES_ENODATA; + } + + status = ares_addr_node_to_server_config_llist(servers, &slist); + if (status != ARES_SUCCESS) { + return (int)status; + } + + /* NOTE: lock is in ares__servers_update() */ + status = ares__servers_update(channel, slist, ARES_TRUE); + + ares__llist_destroy(slist); + + return (int)status; +} + +int ares_set_servers_ports(ares_channel_t *channel, + const struct ares_addr_port_node *servers) +{ + ares__llist_t *slist; + ares_status_t status; + + if (channel == NULL) { + return ARES_ENODATA; + } + + status = ares_addr_port_node_to_server_config_llist(servers, &slist); + if (status != ARES_SUCCESS) { + return (int)status; + } + + /* NOTE: lock is in ares__servers_update() */ + status = ares__servers_update(channel, slist, ARES_TRUE); + + ares__llist_destroy(slist); + + return (int)status; +} + +/* Incoming string format: host[:port][,host[:port]]... */ +/* IPv6 addresses with ports require square brackets [fe80::1]:53 */ +static ares_status_t set_servers_csv(ares_channel_t *channel, const char *_csv, + int use_port) +{ + size_t i; + char *csv = NULL; + char *ptr; + const char *start_host; + int cc = 0; + ares_status_t status = ARES_SUCCESS; + struct ares_addr_port_node *servers = NULL; + struct ares_addr_port_node *last = NULL; + + if (ares_library_initialized() != ARES_SUCCESS) { + return ARES_ENOTINITIALIZED; /* LCOV_EXCL_LINE: n/a on non-WinSock */ + } + + if (!channel) { + return ARES_ENODATA; + } + + /* NOTE: lock is in ares__servers_update() */ + + i = ares_strlen(_csv); + if (i == 0) { + /* blank all servers */ + return (ares_status_t)ares_set_servers_ports(channel, NULL); + } + + csv = ares_malloc(i + 2); + if (!csv) { + return ARES_ENOMEM; + } + + ares_strcpy(csv, _csv, i + 2); + if (csv[i - 1] != ',') { /* make parsing easier by ensuring ending ',' */ + csv[i] = ','; + csv[i + 1] = 0; + } + + start_host = csv; + for (ptr = csv; *ptr; ptr++) { + if (*ptr == ':') { + /* count colons to determine if we have an IPv6 number or IPv4 with + port */ + cc++; + } else if (*ptr == '[') { + /* move start_host if an open square bracket is found wrapping an IPv6 + address */ + start_host = ptr + 1; + } else if (*ptr == ',') { + char *pp = ptr - 1; + char *p = ptr; + int port = 0; + struct in_addr in4; + struct ares_in6_addr in6; + struct ares_addr_port_node *s = NULL; + + *ptr = 0; /* null terminate host:port string */ + /* Got an entry..see if the port was specified. */ + if (cc > 0) { + while (pp > start_host) { + /* a single close square bracket followed by a colon, ']:' indicates + an IPv6 address with port */ + if ((*pp == ']') && (*p == ':')) { + break; /* found port */ + } + /* a single colon, ':' indicates an IPv4 address with port */ + if ((*pp == ':') && (cc == 1)) { + break; /* found port */ + } + if (!(ISDIGIT(*pp) || (*pp == ':'))) { + /* Found end of digits before we found :, so wasn't a port */ + /* must allow ':' for IPv6 case of ']:' indicates we found a port */ + pp = p = ptr; + break; + } + pp--; + p--; + } + if ((pp != start_host) && ((pp + 1) < ptr)) { + /* Found it. Parse over the port number */ + /* when an IPv6 address is wrapped with square brackets the port + starts at pp + 2 */ + if (*pp == ']') { + p++; /* move p before ':' */ + } + /* p will point to the start of the port */ + port = (int)strtol(p, NULL, 10); + *pp = 0; /* null terminate host */ + } + } + /* resolve host, try ipv4 first, rslt is in network byte order */ + if (!ares_inet_pton(AF_INET, start_host, &in4)) { + /* Ok, try IPv6 then */ + if (!ares_inet_pton(AF_INET6, start_host, &in6)) { + status = ARES_EBADSTR; + goto out; + } + /* was ipv6, add new server */ + s = ares_malloc(sizeof(*s)); + if (!s) { + status = ARES_ENOMEM; + goto out; + } + s->family = AF_INET6; + memcpy(&s->addr, &in6, sizeof(struct ares_in6_addr)); + } else { + /* was ipv4, add new server */ + s = ares_malloc(sizeof(*s)); + if (!s) { + status = ARES_ENOMEM; + goto out; + } + s->family = AF_INET; + memcpy(&s->addr, &in4, sizeof(struct in_addr)); + } + if (s) { + s->udp_port = use_port ? port : 0; + s->tcp_port = s->udp_port; + s->next = NULL; + if (last) { + last->next = s; + /* need to move last to maintain the linked list */ + last = last->next; + } else { + servers = s; + last = s; + } + } + + /* Set up for next one */ + start_host = ptr + 1; + cc = 0; + } + } + + status = (ares_status_t)ares_set_servers_ports(channel, servers); + +out: + if (csv) { + ares_free(csv); + } + while (servers) { + struct ares_addr_port_node *s = servers; + servers = servers->next; + ares_free(s); + } + + return status; +} + +int ares_set_servers_csv(ares_channel_t *channel, const char *_csv) +{ + /* NOTE: lock is in ares__servers_update() */ + return (int)set_servers_csv(channel, _csv, ARES_FALSE); +} + +int ares_set_servers_ports_csv(ares_channel_t *channel, const char *_csv) +{ + /* NOTE: lock is in ares__servers_update() */ + return (int)set_servers_csv(channel, _csv, ARES_TRUE); +} diff --git a/lib/c-ares-1.23.0/src/lib/ares_version.c b/lib/c-ares-1.23.0/src/lib/ares_version.c new file mode 100644 index 00000000000..ca15fa77dcf --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/ares_version.c @@ -0,0 +1,37 @@ +/* MIT License + * + * Copyright (c) 1998 Massachusetts Institute of Technology + * Copyright (c) The c-ares project and its contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ +#include "ares_setup.h" +#include "ares.h" + +const char *ares_version(int *version) +{ + if (version) { + *version = ARES_VERSION; + } + + return ARES_VERSION_STR; +} diff --git a/lib/c-ares-1.19.1/src/lib/bitncmp.c b/lib/c-ares-1.23.0/src/lib/bitncmp.c similarity index 82% rename from lib/c-ares-1.19.1/src/lib/bitncmp.c rename to lib/c-ares-1.23.0/src/lib/bitncmp.c index 1468d4923a5..0296316d244 100644 --- a/lib/c-ares-1.19.1/src/lib/bitncmp.c +++ b/lib/c-ares-1.23.0/src/lib/bitncmp.c @@ -1,4 +1,3 @@ - /* * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") * Copyright (c) 1996,1999 by Internet Software Consortium. @@ -14,12 +13,14 @@ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * SPDX-License-Identifier: MIT */ #ifndef HAVE_BITNCMP -#include "ares_setup.h" -#include "bitncmp.h" +# include "ares_setup.h" +# include "bitncmp.h" /* * int @@ -33,22 +34,26 @@ * author: * Paul Vixie (ISC), June 1996 */ -int ares__bitncmp(const void *l, const void *r, int n) +int ares__bitncmp(const void *l, const void *r, size_t n) { - unsigned int lb, rb; - int x, b; + size_t lb; + size_t rb; + ares_ssize_t x; + size_t b; b = n / 8; x = memcmp(l, r, b); - if (x || (n % 8) == 0) - return (x); + if (x || (n % 8) == 0) { + return (int)x; + } lb = ((const unsigned char *)l)[b]; rb = ((const unsigned char *)r)[b]; for (b = n % 8; b > 0; b--) { if ((lb & 0x80) != (rb & 0x80)) { - if (lb & 0x80) + if (lb & 0x80) { return (1); + } return (-1); } lb <<= 1; diff --git a/lib/c-ares-1.23.0/src/lib/bitncmp.h b/lib/c-ares-1.23.0/src/lib/bitncmp.h new file mode 100644 index 00000000000..0c4b9c39a8f --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/bitncmp.h @@ -0,0 +1,35 @@ +/* MIT License + * + * Copyright (c) 2005 Dominick Meglio + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ +#ifndef __ARES_BITNCMP_H +#define __ARES_BITNCMP_H + +#ifndef HAVE_BITNCMP +int ares__bitncmp(const void *l, const void *r, size_t n); +#else +# define ares__bitncmp(x, y, z) bitncmp(x, y, z) +#endif + +#endif /* __ARES_BITNCMP_H */ diff --git a/lib/c-ares-1.19.1/src/lib/cares.rc b/lib/c-ares-1.23.0/src/lib/cares.rc similarity index 53% rename from lib/c-ares-1.19.1/src/lib/cares.rc rename to lib/c-ares-1.23.0/src/lib/cares.rc index 6360834deaf..9275b0796bf 100644 --- a/lib/c-ares-1.19.1/src/lib/cares.rc +++ b/lib/c-ares-1.23.0/src/lib/cares.rc @@ -1,17 +1,27 @@ - -/* Copyright (C) 2009-2021 by Daniel Stenberg +/* MIT License + * + * Copyright (c) 2009 Daniel Stenberg + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. * - * 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. + * SPDX-License-Identifier: MIT */ #include diff --git a/lib/c-ares-1.23.0/src/lib/config-dos.h b/lib/c-ares-1.23.0/src/lib/config-dos.h new file mode 100644 index 00000000000..301fee4cf33 --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/config-dos.h @@ -0,0 +1,117 @@ +#ifndef HEADER_CONFIG_DOS_H +#define HEADER_CONFIG_DOS_H + + +/* ================================================================ + * ares/config-dos.h - Hand crafted config file for DOS + * + * Copyright (C) The c-ares project and its contributors + * SPDX-License-Identifier: MIT + * ================================================================ */ + +#define PACKAGE "c-ares" + +#define HAVE_ERRNO_H 1 +#define HAVE_GETENV 1 +#define HAVE_GETTIMEOFDAY 1 +#define HAVE_IOCTLSOCKET 1 +#define HAVE_IOCTLSOCKET_FIONBIO 1 +#define HAVE_LIMITS_H 1 +#define HAVE_NET_IF_H 1 +#define HAVE_RECV 1 +#define HAVE_RECVFROM 1 +#define HAVE_SEND 1 +#define HAVE_STRDUP 1 +#define HAVE_STRICMP 1 +#define HAVE_STRUCT_IN6_ADDR 1 +#define HAVE_STRUCT_TIMEVAL 1 +#define HAVE_SYS_IOCTL_H 1 +#define HAVE_SYS_SOCKET_H 1 +#define HAVE_SYS_STAT_H 1 +#define HAVE_SYS_TYPES_H 1 +#define HAVE_TIME_H 1 +#define HAVE_UNISTD_H 1 +#define HAVE_WRITEV 1 + +#define NEED_MALLOC_H 1 + +#define RETSIGTYPE void +#define TIME_WITH_SYS_TIME 1 + +/* Qualifiers for send(), recv(), recvfrom() and getnameinfo(). */ + +#define SEND_TYPE_ARG1 int +#define SEND_QUAL_ARG2 const +#define SEND_TYPE_ARG2 void * +#define SEND_TYPE_ARG3 int +#define SEND_TYPE_ARG4 int +#define SEND_TYPE_RETV int + +#define RECV_TYPE_ARG1 int +#define RECV_TYPE_ARG2 void * +#define RECV_TYPE_ARG3 int +#define RECV_TYPE_ARG4 int +#define RECV_TYPE_RETV int + +#define RECVFROM_TYPE_ARG1 int +#define RECVFROM_TYPE_ARG2 void +#define RECVFROM_TYPE_ARG3 int +#define RECVFROM_TYPE_ARG4 int +#define RECVFROM_TYPE_ARG5 struct sockaddr +#define RECVFROM_TYPE_ARG6 int +#define RECVFROM_TYPE_RETV int +#define RECVFROM_TYPE_ARG2_IS_VOID 1 + +#define BSD + +/* Target HAVE_x section */ + +#if defined(DJGPP) +# undef _SSIZE_T +# include /* For 'ssize_t' */ + +# define HAVE_STRCASECMP 1 +# define HAVE_STRNCASECMP 1 +# define HAVE_SYS_TIME_H 1 +# define HAVE_VARIADIC_MACROS_GCC 1 + +/* Because djgpp <= 2.03 doesn't have snprintf() etc. */ +# if (DJGPP_MINOR < 4) +# define _MPRINTF_REPLACE +# endif + +#elif defined(__WATCOMC__) +# define HAVE_STRCASECMP 1 + +#elif defined(__HIGHC__) +# define HAVE_SYS_TIME_H 1 +# define strerror(e) strerror_s_((e)) +#endif + +#ifdef WATT32 +# define HAVE_AF_INET6 1 +# define HAVE_ARPA_INET_H 1 +# define HAVE_ARPA_NAMESER_H 1 +# define HAVE_CLOSE_S 1 +# define HAVE_GETHOSTNAME 1 +# define HAVE_NETDB_H 1 +# define HAVE_NETINET_IN_H 1 +# define HAVE_NETINET_TCP_H 1 +# define HAVE_PF_INET6 1 +# define HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID 1 +# define HAVE_STRUCT_ADDRINFO 1 +# define HAVE_STRUCT_IN6_ADDR 1 +# define HAVE_STRUCT_SOCKADDR_IN6 1 +# define HAVE_SYS_SOCKET_H 1 +# define HAVE_SYS_UIO_H 1 +# define NS_INADDRSZ 4 +# define HAVE_STRUCT_SOCKADDR_IN6 1 + +# define HAVE_GETSERVBYPORT_R 1 +# define GETSERVBYPORT_R_ARGS 5 +#endif + +#undef word +#undef byte + +#endif /* HEADER_CONFIG_DOS_H */ diff --git a/lib/c-ares-1.19.1/src/lib/config-win32.h b/lib/c-ares-1.23.0/src/lib/config-win32.h similarity index 76% rename from lib/c-ares-1.19.1/src/lib/config-win32.h rename to lib/c-ares-1.23.0/src/lib/config-win32.h index cc8e4430a49..2701f173035 100644 --- a/lib/c-ares-1.19.1/src/lib/config-win32.h +++ b/lib/c-ares-1.23.0/src/lib/config-win32.h @@ -1,18 +1,30 @@ -#ifndef HEADER_CARES_CONFIG_WIN32_H -#define HEADER_CARES_CONFIG_WIN32_H - -/* Copyright (C) 2004 - 2011 by Daniel Stenberg et al +/* MIT License + * + * Copyright (c) 2004 Daniel Stenberg * - * 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. + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT */ +#ifndef HEADER_CARES_CONFIG_WIN32_H +#define HEADER_CARES_CONFIG_WIN32_H /* ================================================================ */ /* c-ares/config-win32.h - Hand crafted config file for Windows */ @@ -30,7 +42,7 @@ /* Define if you have the header file. */ #if defined(__MINGW32__) || defined(__POCC__) -#define HAVE_GETOPT_H 1 +# define HAVE_GETOPT_H 1 #endif /* Define if you have the header file. */ @@ -38,7 +50,7 @@ /* Define if you have the header file. */ #ifndef __SALFORDC__ -#define HAVE_PROCESS_H 1 +# define HAVE_PROCESS_H 1 #endif /* Define if you have the header file. */ @@ -52,8 +64,8 @@ /* Define if you have the header file. */ #if defined(__MINGW32__) || defined(__WATCOMC__) || defined(__LCC__) || \ - defined(__POCC__) -#define HAVE_UNISTD_H 1 + defined(__POCC__) +# define HAVE_UNISTD_H 1 #endif /* Define if you have the header file. */ @@ -64,12 +76,29 @@ /* Define if you have the header file. */ #ifndef __SALFORDC__ -#define HAVE_WINSOCK2_H 1 +# define HAVE_WINSOCK2_H 1 #endif /* Define if you have the header file. */ #ifndef __SALFORDC__ -#define HAVE_WS2TCPIP_H 1 +# define HAVE_WS2TCPIP_H 1 +#endif + +/* Define if you have header file */ +#define HAVE_IPHLPAPI_H 1 + +/* Define if you have header file */ +#ifndef __WATCOMC__ +# define HAVE_NETIOAPI_H 1 +#endif + +#define HAVE_SYS_TYPES_H 1 +#define HAVE_SYS_STAT_H 1 + +/* If we are building with OpenWatcom, we need to specify that we have + * . */ +#if defined(__WATCOMC__) +# define HAVE_STDINT_H #endif /* ---------------------------------------------------------------- */ @@ -184,23 +213,26 @@ /* Specifics for the Watt-32 tcp/ip stack. */ #ifdef WATT32 - #define SOCKET int - #define NS_INADDRSZ 4 - #define HAVE_ARPA_NAMESER_H 1 - #define HAVE_ARPA_INET_H 1 - #define HAVE_NETDB_H 1 - #define HAVE_NETINET_IN_H 1 - #define HAVE_SYS_SOCKET_H 1 - #define HAVE_NETINET_TCP_H 1 - #define HAVE_AF_INET6 1 - #define HAVE_PF_INET6 1 - #define HAVE_STRUCT_IN6_ADDR 1 - #define HAVE_STRUCT_SOCKADDR_IN6 1 - #undef HAVE_WINSOCK_H - #undef HAVE_WINSOCK2_H - #undef HAVE_WS2TCPIP_H +# define SOCKET int +# define NS_INADDRSZ 4 +# define HAVE_ARPA_NAMESER_H 1 +# define HAVE_ARPA_INET_H 1 +# define HAVE_NETDB_H 1 +# define HAVE_NETINET_IN_H 1 +# define HAVE_SYS_SOCKET_H 1 +# define HAVE_NETINET_TCP_H 1 +# define HAVE_AF_INET6 1 +# define HAVE_PF_INET6 1 +# define HAVE_STRUCT_IN6_ADDR 1 +# define HAVE_STRUCT_SOCKADDR_IN6 1 +# undef HAVE_WINSOCK_H +# undef HAVE_WINSOCK2_H +# undef HAVE_WS2TCPIP_H #endif +/* Threading support enabled */ +#define CARES_THREADS 1 + /* ---------------------------------------------------------------- */ /* TYPEDEF REPLACEMENTS */ /* ---------------------------------------------------------------- */ @@ -213,7 +245,7 @@ #ifdef __cplusplus /* Compiling headers in C++ mode means bool is available */ -#define HAVE_BOOL_T +# define HAVE_BOOL_T #endif /* ---------------------------------------------------------------- */ @@ -229,7 +261,7 @@ /* Define if you have struct sockaddr_storage. */ #if !defined(__SALFORDC__) && !defined(__BORLANDC__) -#define HAVE_STRUCT_SOCKADDR_STORAGE 1 +# define HAVE_STRUCT_SOCKADDR_STORAGE 1 #endif /* Define if you have struct timeval. */ @@ -241,7 +273,7 @@ /* Define to avoid VS2005 complaining about portable C functions. */ #if defined(_MSC_VER) && (_MSC_VER >= 1400) -# define _CRT_SECURE_NO_DEPRECATE 1 +# define _CRT_SECURE_NO_DEPRECATE 1 # define _CRT_NONSTDC_NO_DEPRECATE 1 #endif @@ -308,27 +340,27 @@ /* Define if you have address family AF_INET6. */ #ifdef HAVE_WINSOCK2_H -#define HAVE_AF_INET6 1 +# define HAVE_AF_INET6 1 #endif /* Define if you have protocol family PF_INET6. */ #ifdef HAVE_WINSOCK2_H -#define HAVE_PF_INET6 1 +# define HAVE_PF_INET6 1 #endif /* Define if you have struct in6_addr. */ #ifdef HAVE_WS2TCPIP_H -#define HAVE_STRUCT_IN6_ADDR 1 +# define HAVE_STRUCT_IN6_ADDR 1 #endif /* Define if you have struct sockaddr_in6. */ #ifdef HAVE_WS2TCPIP_H -#define HAVE_STRUCT_SOCKADDR_IN6 1 +# define HAVE_STRUCT_SOCKADDR_IN6 1 #endif /* Define if you have sockaddr_in6 with scopeid. */ #ifdef HAVE_WS2TCPIP_H -#define HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID 1 +# define HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID 1 #endif /* ---------------------------------------------------------------- */ @@ -342,10 +374,10 @@ */ #if defined(_WIN32_WCE) && !defined(HAVE_ERRNO_H) -# define ENOENT ERROR_FILE_NOT_FOUND -# define ESRCH ERROR_PATH_NOT_FOUND -# define ENOMEM ERROR_NOT_ENOUGH_MEMORY -# define ENOSPC ERROR_INVALID_PARAMETER +# define ENOENT ERROR_FILE_NOT_FOUND +# define ESRCH ERROR_PATH_NOT_FOUND +# define ENOMEM ERROR_NOT_ENOUGH_MEMORY +# define ENOSPC ERROR_INVALID_PARAMETER #endif #endif /* HEADER_CARES_CONFIG_WIN32_H */ diff --git a/lib/c-ares-1.19.1/src/lib/inet_net_pton.c b/lib/c-ares-1.23.0/src/lib/inet_net_pton.c similarity index 56% rename from lib/c-ares-1.19.1/src/lib/inet_net_pton.c rename to lib/c-ares-1.23.0/src/lib/inet_net_pton.c index 7130f0f1e22..19429f205d8 100644 --- a/lib/c-ares-1.19.1/src/lib/inet_net_pton.c +++ b/lib/c-ares-1.23.0/src/lib/inet_net_pton.c @@ -1,4 +1,3 @@ - /* * Copyright (c) 2012 by Gilles Chehade * Copyright (c) 1996,1999 by Internet Software Consortium. @@ -15,6 +14,8 @@ * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. + * + * SPDX-License-Identifier: MIT */ #include "ares_setup.h" @@ -30,11 +31,12 @@ #include "ares.h" #include "ares_ipv6.h" -#include "ares_nowarn.h" #include "ares_inet_net_pton.h" +#include "ares_private.h" -const struct ares_in6_addr ares_in6addr_any = { { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } } }; +const struct ares_in6_addr ares_in6addr_any = { { { 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0 } } }; /* * static int @@ -51,202 +53,233 @@ const struct ares_in6_addr ares_in6addr_any = { { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0, * 0b11110000 in its fourth octet. * note: * On Windows we store the error in the thread errno, not - * in the winsock error code. This is to avoid loosing the + * in the winsock error code. This is to avoid losing the * actual last winsock error. So use macro ERRNO to fetch the - * errno this funtion sets when returning (-1), not SOCKERRNO. + * errno this function sets when returning (-1), not SOCKERRNO. * author: * Paul Vixie (ISC), June 1996 */ -static int -ares_inet_net_pton_ipv4(const char *src, unsigned char *dst, size_t size) +static int ares_inet_net_pton_ipv4(const char *src, unsigned char *dst, + size_t size) { - static const char xdigits[] = "0123456789abcdef"; - static const char digits[] = "0123456789"; - int n, ch, tmp = 0, dirty, bits; + static const char xdigits[] = "0123456789abcdef"; + static const char digits[] = "0123456789"; + int n; + int ch; + int tmp = 0; + int dirty; + int bits; const unsigned char *odst = dst; ch = *src++; - if (ch == '0' && (src[0] == 'x' || src[0] == 'X') - && ISASCII(src[1]) - && ISXDIGIT(src[1])) { + if (ch == '0' && (src[0] == 'x' || src[0] == 'X') && ISASCII(src[1]) && + ISXDIGIT(src[1])) { /* Hexadecimal: Eat nybble string. */ - if (!size) + if (!size) { goto emsgsize; + } dirty = 0; - src++; /* skip x or X. */ + src++; /* skip x or X. */ while ((ch = *src++) != '\0' && ISASCII(ch) && ISXDIGIT(ch)) { - if (ISUPPER(ch)) + if (ISUPPER(ch)) { ch = tolower(ch); - n = aresx_sztosi(strchr(xdigits, ch) - xdigits); - if (dirty == 0) + } + n = (int)(strchr(xdigits, ch) - xdigits); + if (dirty == 0) { tmp = n; - else + } else { tmp = (tmp << 4) | n; + } if (++dirty == 2) { - if (!size--) + if (!size--) { goto emsgsize; - *dst++ = (unsigned char) tmp; - dirty = 0; + } + *dst++ = (unsigned char)tmp; + dirty = 0; } } - if (dirty) { /* Odd trailing nybble? */ - if (!size--) + if (dirty) { /* Odd trailing nybble? */ + if (!size--) { goto emsgsize; - *dst++ = (unsigned char) (tmp << 4); + } + *dst++ = (unsigned char)(tmp << 4); } } else if (ISASCII(ch) && ISDIGIT(ch)) { /* Decimal: eat dotted digit string. */ for (;;) { tmp = 0; do { - n = aresx_sztosi(strchr(digits, ch) - digits); + n = (int)(strchr(digits, ch) - digits); tmp *= 10; tmp += n; - if (tmp > 255) + if (tmp > 255) { goto enoent; - } while ((ch = *src++) != '\0' && - ISASCII(ch) && ISDIGIT(ch)); - if (!size--) + } + } while ((ch = *src++) != '\0' && ISASCII(ch) && ISDIGIT(ch)); + if (!size--) { goto emsgsize; - *dst++ = (unsigned char) tmp; - if (ch == '\0' || ch == '/') + } + *dst++ = (unsigned char)tmp; + if (ch == '\0' || ch == '/') { break; - if (ch != '.') + } + if (ch != '.') { goto enoent; + } ch = *src++; - if (!ISASCII(ch) || !ISDIGIT(ch)) + if (!ISASCII(ch) || !ISDIGIT(ch)) { goto enoent; + } } - } else + } else { goto enoent; + } bits = -1; - if (ch == '/' && ISASCII(src[0]) && - ISDIGIT(src[0]) && dst > odst) { + if (ch == '/' && ISASCII(src[0]) && ISDIGIT(src[0]) && dst > odst) { /* CIDR width specifier. Nothing can follow it. */ - ch = *src++; /* Skip over the /. */ + ch = *src++; /* Skip over the /. */ bits = 0; do { - n = aresx_sztosi(strchr(digits, ch) - digits); + n = (int)(strchr(digits, ch) - digits); bits *= 10; bits += n; - if (bits > 32) + if (bits > 32) { goto enoent; + } } while ((ch = *src++) != '\0' && ISASCII(ch) && ISDIGIT(ch)); - if (ch != '\0') + if (ch != '\0') { goto enoent; + } } /* Firey death and destruction unless we prefetched EOS. */ - if (ch != '\0') + if (ch != '\0') { goto enoent; + } /* If nothing was written to the destination, we found no address. */ - if (dst == odst) - goto enoent; /* LCOV_EXCL_LINE: all valid paths above increment dst */ + if (dst == odst) { + goto enoent; /* LCOV_EXCL_LINE: all valid paths above increment dst */ + } /* If no CIDR spec was given, infer width from net class. */ if (bits == -1) { - if (*odst >= 240) /* Class E */ + if (*odst >= 240) { /* Class E */ bits = 32; - else if (*odst >= 224) /* Class D */ + } else if (*odst >= 224) { /* Class D */ bits = 8; - else if (*odst >= 192) /* Class C */ + } else if (*odst >= 192) { /* Class C */ bits = 24; - else if (*odst >= 128) /* Class B */ + } else if (*odst >= 128) { /* Class B */ bits = 16; - else /* Class A */ + } else { /* Class A */ bits = 8; + } /* If imputed mask is narrower than specified octets, widen. */ - if (bits < ((dst - odst) * 8)) - bits = aresx_sztosi(dst - odst) * 8; + if (bits < ((dst - odst) * 8)) { + bits = (int)(dst - odst) * 8; + } /* * If there are no additional bits specified for a class D * address adjust bits to 4. */ - if (bits == 8 && *odst == 224) + if (bits == 8 && *odst == 224) { bits = 4; + } } /* Extend network to cover the actual mask. */ while (bits > ((dst - odst) * 8)) { - if (!size--) + if (!size--) { goto emsgsize; + } *dst++ = '\0'; } - return (bits); + return bits; - enoent: +enoent: SET_ERRNO(ENOENT); - return (-1); + return -1; - emsgsize: +emsgsize: SET_ERRNO(EMSGSIZE); - return (-1); + return -1; } -static int -getbits(const char *src, int *bitsp) +static int getbits(const char *src, size_t *bitsp) { static const char digits[] = "0123456789"; - int n; - int val; - char ch; + size_t n; + size_t val; + char ch; val = 0; - n = 0; + n = 0; while ((ch = *src++) != '\0') { const char *pch; pch = strchr(digits, ch); if (pch != NULL) { - if (n++ != 0 && val == 0) /* no leading zeros */ - return (0); + if (n++ != 0 && val == 0) { /* no leading zeros */ + return 0; + } val *= 10; - val += aresx_sztosi(pch - digits); - if (val > 128) /* range */ - return (0); + val += (size_t)(pch - digits); + if (val > 128) { /* range */ + return 0; + } continue; } - return (0); + return 0; + } + if (n == 0) { + return 0; } - if (n == 0) - return (0); *bitsp = val; - return (1); + return 1; } - -static int -ares_inet_pton6(const char *src, unsigned char *dst) +static int ares_inet_pton6(const char *src, unsigned char *dst) { - static const char xdigits_l[] = "0123456789abcdef", - xdigits_u[] = "0123456789ABCDEF"; - unsigned char tmp[NS_IN6ADDRSZ], *tp, *endp, *colonp; - const char *xdigits, *curtok; - int ch, saw_xdigit, count_xdigit; - unsigned int val; + static const char xdigits_l[] = "0123456789abcdef"; + static const char xdigits_u[] = "0123456789ABCDEF"; + unsigned char tmp[NS_IN6ADDRSZ]; + unsigned char *tp; + unsigned char *endp; + unsigned char *colonp; + const char *xdigits; + const char *curtok; + int ch; + int saw_xdigit; + int count_xdigit; + unsigned int val; memset((tp = tmp), '\0', NS_IN6ADDRSZ); - endp = tp + NS_IN6ADDRSZ; + endp = tp + NS_IN6ADDRSZ; colonp = NULL; /* Leading :: requires some special handling. */ - if (*src == ':') - if (*++src != ':') + if (*src == ':') { + if (*++src != ':') { goto enoent; - curtok = src; + } + } + curtok = src; saw_xdigit = count_xdigit = 0; - val = 0; + val = 0; while ((ch = *src++) != '\0') { const char *pch; - if ((pch = strchr((xdigits = xdigits_l), ch)) == NULL) + if ((pch = strchr((xdigits = xdigits_l), ch)) == NULL) { pch = strchr((xdigits = xdigits_u), ch); + } if (pch != NULL) { - if (count_xdigit >= 4) + if (count_xdigit >= 4) { goto enoent; + } val <<= 4; - val |= (unsigned int)(pch - xdigits); - if (val > 0xffff) + val |= (unsigned int)(pch - xdigits); + if (val > 0xffff) { goto enoent; + } saw_xdigit = 1; count_xdigit++; continue; @@ -254,35 +287,38 @@ ares_inet_pton6(const char *src, unsigned char *dst) if (ch == ':') { curtok = src; if (!saw_xdigit) { - if (colonp) + if (colonp) { goto enoent; + } colonp = tp; continue; } else if (*src == '\0') { goto enoent; } - if (tp + NS_INT16SZ > endp) + if (tp + NS_INT16SZ > endp) { goto enoent; - *tp++ = (unsigned char) (val >> 8) & 0xff; - *tp++ = (unsigned char) val & 0xff; - saw_xdigit = 0; + } + *tp++ = (unsigned char)(val >> 8) & 0xff; + *tp++ = (unsigned char)val & 0xff; + saw_xdigit = 0; count_xdigit = 0; - val = 0; + val = 0; continue; } if (ch == '.' && ((tp + NS_INADDRSZ) <= endp) && ares_inet_net_pton_ipv4(curtok, tp, NS_INADDRSZ) > 0) { - tp += NS_INADDRSZ; - saw_xdigit = 0; - break; /* '\0' was seen by inet_pton4(). */ + tp += NS_INADDRSZ; + saw_xdigit = 0; + break; /* '\0' was seen by inet_pton4(). */ } goto enoent; } if (saw_xdigit) { - if (tp + NS_INT16SZ > endp) + if (tp + NS_INT16SZ > endp) { goto enoent; - *tp++ = (unsigned char) (val >> 8) & 0xff; - *tp++ = (unsigned char) val & 0xff; + } + *tp++ = (unsigned char)(val >> 8) & 0xff; + *tp++ = (unsigned char)val & 0xff; } if (colonp != NULL) { /* @@ -290,67 +326,71 @@ ares_inet_pton6(const char *src, unsigned char *dst) * overlapping regions, we'll do the shift by hand. */ const int n = (int)(tp - colonp); - int i; + int i; - if (tp == endp) + if (tp == endp) { goto enoent; + } for (i = 1; i <= n; i++) { - endp[- i] = colonp[n - i]; + endp[-i] = colonp[n - i]; colonp[n - i] = 0; } tp = endp; } - if (tp != endp) + if (tp != endp) { goto enoent; + } memcpy(dst, tmp, NS_IN6ADDRSZ); - return (1); + return 1; enoent: SET_ERRNO(ENOENT); - return (-1); + return -1; } -static int -ares_inet_net_pton_ipv6(const char *src, unsigned char *dst, size_t size) +static int ares_inet_net_pton_ipv6(const char *src, unsigned char *dst, + size_t size) { struct ares_in6_addr in6; int ret; - int bits; + size_t bits; size_t bytes; char buf[INET6_ADDRSTRLEN + sizeof("/128")]; char *sep; - if (strlen(src) >= sizeof buf) { + if (ares_strlen(src) >= sizeof buf) { SET_ERRNO(EMSGSIZE); - return (-1); + return -1; } - strncpy(buf, src, sizeof buf); + ares_strcpy(buf, src, sizeof buf); sep = strchr(buf, '/'); - if (sep != NULL) + if (sep != NULL) { *sep++ = '\0'; + } ret = ares_inet_pton6(buf, (unsigned char *)&in6); - if (ret != 1) - return (-1); + if (ret != 1) { + return -1; + } - if (sep == NULL) + if (sep == NULL) { bits = 128; - else { + } else { if (!getbits(sep, &bits)) { SET_ERRNO(ENOENT); - return (-1); + return -1; } } bytes = (bits + 7) / 8; if (bytes > size) { SET_ERRNO(EMSGSIZE); - return (-1); + return -1; } memcpy(dst, &in6, bytes); - return (bits); + return (int)bits; } /* @@ -365,42 +405,41 @@ ares_inet_net_pton_ipv6(const char *src, unsigned char *dst, size_t size) * not a valid network specification. * note: * On Windows we store the error in the thread errno, not - * in the winsock error code. This is to avoid loosing the + * in the winsock error code. This is to avoid losing the * actual last winsock error. So use macro ERRNO to fetch the - * errno this funtion sets when returning (-1), not SOCKERRNO. + * errno this function sets when returning (-1), not SOCKERRNO. * author: * Paul Vixie (ISC), June 1996 */ -int -ares_inet_net_pton(int af, const char *src, void *dst, size_t size) +int ares_inet_net_pton(int af, const char *src, void *dst, size_t size) { switch (af) { - case AF_INET: - return (ares_inet_net_pton_ipv4(src, dst, size)); - case AF_INET6: - return (ares_inet_net_pton_ipv6(src, dst, size)); - default: - SET_ERRNO(EAFNOSUPPORT); - return (-1); + case AF_INET: + return ares_inet_net_pton_ipv4(src, dst, size); + case AF_INET6: + return ares_inet_net_pton_ipv6(src, dst, size); + default: + SET_ERRNO(EAFNOSUPPORT); + return -1; } } int ares_inet_pton(int af, const char *src, void *dst) { - int result; + int result; size_t size; - if (af == AF_INET) + if (af == AF_INET) { size = sizeof(struct in_addr); - else if (af == AF_INET6) + } else if (af == AF_INET6) { size = sizeof(struct ares_in6_addr); - else - { + } else { SET_ERRNO(EAFNOSUPPORT); return -1; } result = ares_inet_net_pton(af, src, dst, size); - if (result == -1 && ERRNO == ENOENT) + if (result == -1 && ERRNO == ENOENT) { return 0; - return (result > -1 ? 1 : -1); + } + return (result > -1) ? 1 : -1; } diff --git a/lib/c-ares-1.19.1/src/lib/inet_ntop.c b/lib/c-ares-1.23.0/src/lib/inet_ntop.c similarity index 67% rename from lib/c-ares-1.19.1/src/lib/inet_ntop.c rename to lib/c-ares-1.23.0/src/lib/inet_ntop.c index 6645c0a4679..8ed49da2a9b 100644 --- a/lib/c-ares-1.19.1/src/lib/inet_ntop.c +++ b/lib/c-ares-1.23.0/src/lib/inet_ntop.c @@ -13,6 +13,8 @@ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * SPDX-License-Identifier: MIT */ #include "ares_setup.h" @@ -28,6 +30,7 @@ #include "ares.h" #include "ares_ipv6.h" +#include "ares_private.h" #ifndef HAVE_INET_NTOP @@ -46,23 +49,23 @@ static const char *inet_ntop6(const unsigned char *src, char *dst, size_t size); * pointer to presentation format address (`dst'), or NULL (see errno). * note: * On Windows we store the error in the thread errno, not - * in the winsock error code. This is to avoid loosing the + * in the winsock error code. This is to avoid losing the * actual last winsock error. So use macro ERRNO to fetch the * errno this function sets when returning NULL, not SOCKERRNO. * author: * Paul Vixie, 1996. */ -const char * -ares_inet_ntop(int af, const void *src, char *dst, ares_socklen_t size) +const char *ares_inet_ntop(int af, const void *src, char *dst, + ares_socklen_t size) { switch (af) { - case AF_INET: - return (inet_ntop4(src, dst, (size_t)size)); - case AF_INET6: - return (inet_ntop6(src, dst, (size_t)size)); - default: - SET_ERRNO(EAFNOSUPPORT); - return (NULL); + case AF_INET: + return (inet_ntop4(src, dst, (size_t)size)); + case AF_INET6: + return (inet_ntop6(src, dst, (size_t)size)); + default: + SET_ERRNO(EAFNOSUPPORT); + return (NULL); } /* NOTREACHED */ } @@ -78,17 +81,17 @@ ares_inet_ntop(int af, const void *src, char *dst, ares_socklen_t size) * author: * Paul Vixie, 1996. */ -static const char * -inet_ntop4(const unsigned char *src, char *dst, size_t size) +static const char *inet_ntop4(const unsigned char *src, char *dst, size_t size) { static const char fmt[] = "%u.%u.%u.%u"; - char tmp[sizeof("255.255.255.255")]; + char tmp[sizeof("255.255.255.255")]; - if ((size_t)sprintf(tmp, fmt, src[0], src[1], src[2], src[3]) >= size) { + if ((size_t)snprintf(tmp, sizeof(tmp), fmt, src[0], src[1], src[2], src[3]) >= + size) { SET_ERRNO(ENOSPC); return (NULL); } - strcpy(dst, tmp); + ares_strcpy(dst, tmp, size); return (dst); } @@ -98,8 +101,7 @@ inet_ntop4(const unsigned char *src, char *dst, size_t size) * author: * Paul Vixie, 1996. */ -static const char * -inet_ntop6(const unsigned char *src, char *dst, size_t size) +static const char *inet_ntop6(const unsigned char *src, char *dst, size_t size) { /* * Note that int32_t and int16_t need only be "at least" large enough @@ -108,11 +110,15 @@ inet_ntop6(const unsigned char *src, char *dst, size_t size) * Keep this in mind if you think this function should have been coded * to use pointer overlays. All the world's not a VAX. */ - char tmp[sizeof("ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255")]; + char tmp[sizeof("ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255")]; char *tp; - struct { int base, len; } best, cur; + + struct { + int base, len; + } best, cur; + unsigned int words[NS_IN6ADDRSZ / NS_INT16SZ]; - int i; + int i; /* * Preprocess: @@ -120,32 +126,37 @@ inet_ntop6(const unsigned char *src, char *dst, size_t size) * Find the longest run of 0x00's in src[] for :: shorthanding. */ memset(words, '\0', sizeof(words)); - for (i = 0; i < NS_IN6ADDRSZ; i++) + for (i = 0; i < NS_IN6ADDRSZ; i++) { words[i / 2] |= (src[i] << ((1 - (i % 2)) << 3)); + } best.base = -1; - best.len = 0; - cur.base = -1; - cur.len = 0; + best.len = 0; + cur.base = -1; + cur.len = 0; for (i = 0; i < (NS_IN6ADDRSZ / NS_INT16SZ); i++) { if (words[i] == 0) { - if (cur.base == -1) + if (cur.base == -1) { cur.base = i, cur.len = 1; - else + } else { cur.len++; + } } else { if (cur.base != -1) { - if (best.base == -1 || cur.len > best.len) + if (best.base == -1 || cur.len > best.len) { best = cur; + } cur.base = -1; } } } if (cur.base != -1) { - if (best.base == -1 || cur.len > best.len) + if (best.base == -1 || cur.len > best.len) { best = cur; + } } - if (best.base != -1 && best.len < 2) + if (best.base != -1 && best.len < 2) { best.base = -1; + } /* * Format the result. @@ -153,29 +164,33 @@ inet_ntop6(const unsigned char *src, char *dst, size_t size) tp = tmp; for (i = 0; i < (NS_IN6ADDRSZ / NS_INT16SZ); i++) { /* Are we inside the best run of 0x00's? */ - if (best.base != -1 && i >= best.base && - i < (best.base + best.len)) { - if (i == best.base) + if (best.base != -1 && i >= best.base && i < (best.base + best.len)) { + if (i == best.base) { *tp++ = ':'; + } continue; } /* Are we following an initial run of 0x00s or any real hex? */ - if (i != 0) + if (i != 0) { *tp++ = ':'; + } /* Is this address an encapsulated IPv4? */ - if (i == 6 && best.base == 0 && (best.len == 6 || - (best.len == 7 && words[7] != 0x0001) || - (best.len == 5 && words[5] == 0xffff))) { - if (!inet_ntop4(src+12, tp, sizeof(tmp) - (tp - tmp))) + if (i == 6 && best.base == 0 && + (best.len == 6 || (best.len == 7 && words[7] != 0x0001) || + (best.len == 5 && words[5] == 0xffff))) { + if (!inet_ntop4(src + 12, tp, sizeof(tmp) - (size_t)(tp - tmp))) { return (NULL); - tp += strlen(tp); + } + tp += ares_strlen(tp); break; } - tp += sprintf(tp, "%x", words[i]); + tp += snprintf(tp, sizeof(tmp) - (size_t)(tp - tmp), "%x", words[i]); } /* Was it a trailing run of 0x00's? */ - if (best.base != -1 && (best.base + best.len) == (NS_IN6ADDRSZ / NS_INT16SZ)) + if (best.base != -1 && + (best.base + best.len) == (NS_IN6ADDRSZ / NS_INT16SZ)) { *tp++ = ':'; + } *tp++ = '\0'; /* @@ -185,14 +200,14 @@ inet_ntop6(const unsigned char *src, char *dst, size_t size) SET_ERRNO(ENOSPC); return (NULL); } - strcpy(dst, tmp); + ares_strcpy(dst, tmp, size); return (dst); } -#else /* HAVE_INET_NTOP */ +#else /* HAVE_INET_NTOP */ -const char * -ares_inet_ntop(int af, const void *src, char *dst, ares_socklen_t size) +const char *ares_inet_ntop(int af, const void *src, char *dst, + ares_socklen_t size) { /* just relay this to the underlying function */ return inet_ntop(af, src, dst, size); diff --git a/lib/c-ares-1.23.0/src/lib/setup_once.h b/lib/c-ares-1.23.0/src/lib/setup_once.h new file mode 100644 index 00000000000..4fbf5ba157e --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/setup_once.h @@ -0,0 +1,562 @@ +/* MIT License + * + * Copyright (c) 2004 Daniel Stenberg + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ +#ifndef __SETUP_ONCE_H +#define __SETUP_ONCE_H + + +/******************************************************************** + * NOTICE * + * ======== * + * * + * Content of header files lib/setup_once.h and ares/setup_once.h * + * must be kept in sync. Modify the other one if you change this. * + * * + ********************************************************************/ + + +/* + * Inclusion of common header files. + */ + +#include +#include +#include +#include +#include + +#ifdef HAVE_ERRNO_H +# include +#endif + +#ifdef HAVE_SYS_TYPES_H +# include +#endif + +#ifdef NEED_MALLOC_H +# include +#endif + +#ifdef NEED_MEMORY_H +# include +#endif + +#ifdef HAVE_SYS_STAT_H +# include +#endif + +#ifdef HAVE_SYS_TIME_H +# include +# ifdef TIME_WITH_SYS_TIME +# include +# endif +#else +# ifdef HAVE_TIME_H +# include +# endif +#endif + +#ifdef WIN32 +# include +# include +#endif + +#if defined(HAVE_STDBOOL_H) && defined(HAVE_BOOL_T) +# include +#endif + +#ifdef HAVE_UNISTD_H +# include +#endif + +#ifdef __hpux +# if !defined(_XOPEN_SOURCE_EXTENDED) || defined(_KERNEL) +# ifdef _APP32_64BIT_OFF_T +# define OLD_APP32_64BIT_OFF_T _APP32_64BIT_OFF_T +# undef _APP32_64BIT_OFF_T +# else +# undef OLD_APP32_64BIT_OFF_T +# endif +# endif +#endif + +#ifdef HAVE_SYS_RANDOM_H +# include +#endif + +#ifdef HAVE_SYS_SOCKET_H +# include +#endif + +#ifdef __hpux +# if !defined(_XOPEN_SOURCE_EXTENDED) || defined(_KERNEL) +# ifdef OLD_APP32_64BIT_OFF_T +# define _APP32_64BIT_OFF_T OLD_APP32_64BIT_OFF_T +# undef OLD_APP32_64BIT_OFF_T +# endif +# endif +#endif + + +/* + * Definition of timeval struct for platforms that don't have it. + */ + +#ifndef HAVE_STRUCT_TIMEVAL +struct timeval { + long tv_sec; + long tv_usec; +}; +#endif + + +/* + * If we have the MSG_NOSIGNAL define, make sure we use + * it as the fourth argument of function send() + */ + +#ifdef HAVE_MSG_NOSIGNAL +# define SEND_4TH_ARG MSG_NOSIGNAL +#else +# define SEND_4TH_ARG 0 +#endif + + +#if defined(__minix) +/* Minix doesn't support recv on TCP sockets */ +# define sread(x, y, z) \ + (ares_ssize_t) \ + read((RECV_TYPE_ARG1)(x), (RECV_TYPE_ARG2)(y), (RECV_TYPE_ARG3)(z)) + +#elif defined(HAVE_RECV) +/* + * The definitions for the return type and arguments types + * of functions recv() and send() belong and come from the + * configuration file. Do not define them in any other place. + * + * HAVE_RECV is defined if you have a function named recv() + * which is used to read incoming data from sockets. If your + * function has another name then don't define HAVE_RECV. + * + * If HAVE_RECV is defined then RECV_TYPE_ARG1, RECV_TYPE_ARG2, + * RECV_TYPE_ARG3, RECV_TYPE_ARG4 and RECV_TYPE_RETV must also + * be defined. + * + * HAVE_SEND is defined if you have a function named send() + * which is used to write outgoing data on a connected socket. + * If yours has another name then don't define HAVE_SEND. + * + * If HAVE_SEND is defined then SEND_TYPE_ARG1, SEND_QUAL_ARG2, + * SEND_TYPE_ARG2, SEND_TYPE_ARG3, SEND_TYPE_ARG4 and + * SEND_TYPE_RETV must also be defined. + */ + +# if !defined(RECV_TYPE_ARG1) || !defined(RECV_TYPE_ARG2) || \ + !defined(RECV_TYPE_ARG3) || !defined(RECV_TYPE_ARG4) || \ + !defined(RECV_TYPE_RETV) +/* */ +Error Missing_definition_of_return_and_arguments_types_of_recv +/* */ +# else +# define sread(x, y, z) \ + (ares_ssize_t) recv((RECV_TYPE_ARG1)(x), (RECV_TYPE_ARG2)(y), \ + (RECV_TYPE_ARG3)(z), (RECV_TYPE_ARG4)(0)) +# endif +#else /* HAVE_RECV */ +# ifndef sread +/* */ +Error Missing_definition_of_macro_sread +/* */ +# endif +#endif /* HAVE_RECV */ + + +#if defined(__minix) +/* Minix doesn't support send on TCP sockets */ +# define swrite(x, y, z) \ + (ares_ssize_t) \ + write((SEND_TYPE_ARG1)(x), (SEND_TYPE_ARG2)(y), (SEND_TYPE_ARG3)(z)) + +#elif defined(HAVE_SEND) +# if !defined(SEND_TYPE_ARG1) || !defined(SEND_QUAL_ARG2) || \ + !defined(SEND_TYPE_ARG2) || !defined(SEND_TYPE_ARG3) || \ + !defined(SEND_TYPE_ARG4) || !defined(SEND_TYPE_RETV) + /* */ + Error Missing_definition_of_return_and_arguments_types_of_send +/* */ +# else +# define swrite(x, y, z) \ + (ares_ssize_t) send((SEND_TYPE_ARG1)(x), (SEND_TYPE_ARG2)(y), \ + (SEND_TYPE_ARG3)(z), (SEND_TYPE_ARG4)(SEND_4TH_ARG)) +# endif +#else /* HAVE_SEND */ +# ifndef swrite + /* */ + Error Missing_definition_of_macro_swrite +/* */ +# endif +#endif /* HAVE_SEND */ + + +#if 0 +# if defined(HAVE_RECVFROM) +/* + * Currently recvfrom is only used on udp sockets. + */ +# if !defined(RECVFROM_TYPE_ARG1) || !defined(RECVFROM_TYPE_ARG2) || \ + !defined(RECVFROM_TYPE_ARG3) || !defined(RECVFROM_TYPE_ARG4) || \ + !defined(RECVFROM_TYPE_ARG5) || !defined(RECVFROM_TYPE_ARG6) || \ + !defined(RECVFROM_TYPE_RETV) + /* */ + Error Missing_definition_of_return_and_arguments_types_of_recvfrom + /* */ +# else +# define sreadfrom(s, b, bl, f, fl) \ + (ares_ssize_t) \ + recvfrom((RECVFROM_TYPE_ARG1)(s), (RECVFROM_TYPE_ARG2 *)(b), \ + (RECVFROM_TYPE_ARG3)(bl), (RECVFROM_TYPE_ARG4)(0), \ + (RECVFROM_TYPE_ARG5 *)(f), (RECVFROM_TYPE_ARG6 *)(fl)) +# endif +# else /* HAVE_RECVFROM */ +# ifndef sreadfrom + /* */ + Error Missing_definition_of_macro_sreadfrom + /* */ +# endif +# endif /* HAVE_RECVFROM */ + + +# ifdef RECVFROM_TYPE_ARG6_IS_VOID +# define RECVFROM_ARG6_T int +# else +# define RECVFROM_ARG6_T RECVFROM_TYPE_ARG6 +# endif +#endif /* if 0 */ + + +/* + * Function-like macro definition used to close a socket. + */ + +#if defined(HAVE_CLOSESOCKET) +# define sclose(x) closesocket((x)) +#elif defined(HAVE_CLOSESOCKET_CAMEL) +# define sclose(x) CloseSocket((x)) +#elif defined(HAVE_CLOSE_S) +# define sclose(x) close_s((x)) +#else +# define sclose(x) close((x)) +#endif + + +/* + * Uppercase macro versions of ANSI/ISO is*() functions/macros which + * avoid negative number inputs with argument byte codes > 127. + */ + +#define ISSPACE(x) (isspace((int)((unsigned char)x))) +#define ISDIGIT(x) (isdigit((int)((unsigned char)x))) +#define ISALNUM(x) (isalnum((int)((unsigned char)x))) +#define ISXDIGIT(x) (isxdigit((int)((unsigned char)x))) +#define ISGRAPH(x) (isgraph((int)((unsigned char)x))) +#define ISALPHA(x) (isalpha((int)((unsigned char)x))) +#define ISPRINT(x) (isprint((int)((unsigned char)x))) +#define ISUPPER(x) (isupper((int)((unsigned char)x))) +#define ISLOWER(x) (islower((int)((unsigned char)x))) +#define ISASCII(x) (isascii((int)((unsigned char)x))) + +#define ISBLANK(x) \ + (int)((((unsigned char)x) == ' ') || (((unsigned char)x) == '\t')) + +#define TOLOWER(x) (tolower((int)((unsigned char)x))) + + +/* + * 'bool' stuff compatible with HP-UX headers. + */ + +#if defined(__hpux) && !defined(HAVE_BOOL_T) +typedef int bool; +# define false 0 +# define true 1 +# define HAVE_BOOL_T +#endif + + +/* + * 'bool' exists on platforms with , i.e. C99 platforms. + * On non-C99 platforms there's no bool, so define an enum for that. + * On C99 platforms 'false' and 'true' also exist. Enum uses a + * global namespace though, so use bool_false and bool_true. + */ + +#ifndef HAVE_BOOL_T +typedef enum { + bool_false = 0, + bool_true = 1 +} bool; + +/* + * Use a define to let 'true' and 'false' use those enums. There + * are currently no use of true and false in libcurl proper, but + * there are some in the examples. This will cater for any later + * code happening to use true and false. + */ +# define false bool_false +# define true bool_true +# define HAVE_BOOL_T +#endif + + +/* + * Redefine TRUE and FALSE too, to catch current use. With this + * change, 'bool found = 1' will give a warning on MIPSPro, but + * 'bool found = TRUE' will not. Change tested on IRIX/MIPSPro, + * AIX 5.1/Xlc, Tru64 5.1/cc, w/make test too. + */ + +#ifndef TRUE +# define TRUE true +#endif +#ifndef FALSE +# define FALSE false +#endif + + +/* + * Macro WHILE_FALSE may be used to build single-iteration do-while loops, + * avoiding compiler warnings. Mostly intended for other macro definitions. + */ + +#define WHILE_FALSE while (0) + +#if defined(_MSC_VER) && !defined(__POCC__) +# undef WHILE_FALSE +# if (_MSC_VER < 1500) +# define WHILE_FALSE while (1, 0) +# else +# define WHILE_FALSE \ + __pragma(warning(push)) __pragma(warning(disable : 4127)) while (0) \ + __pragma(warning(pop)) +# endif +#endif + + +/* + * Typedef to 'int' if sig_atomic_t is not an available 'typedefed' type. + */ + +#ifndef HAVE_SIG_ATOMIC_T +typedef int sig_atomic_t; +# define HAVE_SIG_ATOMIC_T +#endif + + +/* + * Convenience SIG_ATOMIC_T definition + */ + +#ifdef HAVE_SIG_ATOMIC_T_VOLATILE +# define SIG_ATOMIC_T static sig_atomic_t +#else +# define SIG_ATOMIC_T static volatile sig_atomic_t +#endif + + +/* + * Default return type for signal handlers. + */ + +#ifndef RETSIGTYPE +# define RETSIGTYPE void +#endif + + +/* + * Macro used to include code only in debug builds. + */ + +#ifdef DEBUGBUILD +# define DEBUGF(x) x +#else +# define DEBUGF(x) \ + do { \ + } \ + WHILE_FALSE +#endif + + +/* + * Macro used to include assertion code only in debug builds. + */ + +#if defined(DEBUGBUILD) && defined(HAVE_ASSERT_H) +# define DEBUGASSERT(x) assert(x) +#else +# define DEBUGASSERT(x) \ + do { \ + } \ + WHILE_FALSE +#endif + + +/* + * Macro SOCKERRNO / SET_SOCKERRNO() returns / sets the *socket-related* errno + * (or equivalent) on this platform to hide platform details to code using it. + */ + +#ifdef USE_WINSOCK +# define SOCKERRNO ((int)WSAGetLastError()) +# define SET_SOCKERRNO(x) (WSASetLastError((int)(x))) +#else +# define SOCKERRNO (errno) +# define SET_SOCKERRNO(x) (errno = (x)) +#endif + + +/* + * Macro ERRNO / SET_ERRNO() returns / sets the NOT *socket-related* errno + * (or equivalent) on this platform to hide platform details to code using it. + */ + +#if defined(WIN32) && !defined(WATT32) +# define ERRNO ((int)GetLastError()) +# define SET_ERRNO(x) (SetLastError((DWORD)(x))) +#else +# define ERRNO (errno) +# define SET_ERRNO(x) (errno = (x)) +#endif + + +/* + * Portable error number symbolic names defined to Winsock error codes. + */ + +#ifdef USE_WINSOCK +# undef EBADF /* override definition in errno.h */ +# define EBADF WSAEBADF +# undef EINTR /* override definition in errno.h */ +# define EINTR WSAEINTR +# undef EINVAL /* override definition in errno.h */ +# define EINVAL WSAEINVAL +# undef EWOULDBLOCK /* override definition in errno.h */ +# define EWOULDBLOCK WSAEWOULDBLOCK +# undef EINPROGRESS /* override definition in errno.h */ +# define EINPROGRESS WSAEINPROGRESS +# undef EALREADY /* override definition in errno.h */ +# define EALREADY WSAEALREADY +# undef ENOTSOCK /* override definition in errno.h */ +# define ENOTSOCK WSAENOTSOCK +# undef EDESTADDRREQ /* override definition in errno.h */ +# define EDESTADDRREQ WSAEDESTADDRREQ +# undef EMSGSIZE /* override definition in errno.h */ +# define EMSGSIZE WSAEMSGSIZE +# undef EPROTOTYPE /* override definition in errno.h */ +# define EPROTOTYPE WSAEPROTOTYPE +# undef ENOPROTOOPT /* override definition in errno.h */ +# define ENOPROTOOPT WSAENOPROTOOPT +# undef EPROTONOSUPPORT /* override definition in errno.h */ +# define EPROTONOSUPPORT WSAEPROTONOSUPPORT +# define ESOCKTNOSUPPORT WSAESOCKTNOSUPPORT +# undef EOPNOTSUPP /* override definition in errno.h */ +# define EOPNOTSUPP WSAEOPNOTSUPP +# define EPFNOSUPPORT WSAEPFNOSUPPORT +# undef EAFNOSUPPORT /* override definition in errno.h */ +# define EAFNOSUPPORT WSAEAFNOSUPPORT +# undef EADDRINUSE /* override definition in errno.h */ +# define EADDRINUSE WSAEADDRINUSE +# undef EADDRNOTAVAIL /* override definition in errno.h */ +# define EADDRNOTAVAIL WSAEADDRNOTAVAIL +# undef ENETDOWN /* override definition in errno.h */ +# define ENETDOWN WSAENETDOWN +# undef ENETUNREACH /* override definition in errno.h */ +# define ENETUNREACH WSAENETUNREACH +# undef ENETRESET /* override definition in errno.h */ +# define ENETRESET WSAENETRESET +# undef ECONNABORTED /* override definition in errno.h */ +# define ECONNABORTED WSAECONNABORTED +# undef ECONNRESET /* override definition in errno.h */ +# define ECONNRESET WSAECONNRESET +# undef ENOBUFS /* override definition in errno.h */ +# define ENOBUFS WSAENOBUFS +# undef EISCONN /* override definition in errno.h */ +# define EISCONN WSAEISCONN +# undef ENOTCONN /* override definition in errno.h */ +# define ENOTCONN WSAENOTCONN +# define ESHUTDOWN WSAESHUTDOWN +# define ETOOMANYREFS WSAETOOMANYREFS +# undef ETIMEDOUT /* override definition in errno.h */ +# define ETIMEDOUT WSAETIMEDOUT +# undef ECONNREFUSED /* override definition in errno.h */ +# define ECONNREFUSED WSAECONNREFUSED +# undef ELOOP /* override definition in errno.h */ +# define ELOOP WSAELOOP +# ifndef ENAMETOOLONG /* possible previous definition in errno.h */ +# define ENAMETOOLONG WSAENAMETOOLONG +# endif +# define EHOSTDOWN WSAEHOSTDOWN +# undef EHOSTUNREACH /* override definition in errno.h */ +# define EHOSTUNREACH WSAEHOSTUNREACH +# ifndef ENOTEMPTY /* possible previous definition in errno.h */ +# define ENOTEMPTY WSAENOTEMPTY +# endif +# define EPROCLIM WSAEPROCLIM +# define EUSERS WSAEUSERS +# define EDQUOT WSAEDQUOT +# define ESTALE WSAESTALE +# define EREMOTE WSAEREMOTE +#endif + + +/* + * Actually use __32_getpwuid() on 64-bit VMS builds for getpwuid() + */ + +#if defined(__VMS) && defined(__INITIAL_POINTER_SIZE) && \ + (__INITIAL_POINTER_SIZE == 64) +# define getpwuid __32_getpwuid +#endif + + +/* + * Macro argv_item_t hides platform details to code using it. + */ + +#ifdef __VMS +# define argv_item_t __char_ptr32 +#else +# define argv_item_t char * +#endif + + +/* + * We use this ZERO_NULL to avoid picky compiler warnings, + * when assigning a NULL pointer to a function pointer var. + */ + +#define ZERO_NULL 0 + + +#endif /* __SETUP_ONCE_H */ diff --git a/lib/c-ares-1.23.0/src/lib/windows_port.c b/lib/c-ares-1.23.0/src/lib/windows_port.c new file mode 100644 index 00000000000..d5f0ad3abf6 --- /dev/null +++ b/lib/c-ares-1.23.0/src/lib/windows_port.c @@ -0,0 +1,29 @@ +/********************************************************************** + * + * Copyright (c) 1998 Massachusetts Institute of Technology + * Copyright (C) Daniel Stenberg + * + * SPDX-License-Identifier: MIT + * + */ +#include "ares_setup.h" + + +/* only do the following on windows + */ +#if (defined(WIN32) || defined(WATT32)) && !defined(MSDOS) + +# ifdef __WATCOMC__ +/* + * Watcom needs a DllMain() in order to initialise the clib startup code. + */ +BOOL WINAPI DllMain(HINSTANCE hnd, DWORD reason, LPVOID reserved) +{ + (void)hnd; + (void)reason; + (void)reserved; + return (TRUE); +} +# endif + +#endif /* WIN32 builds only */ diff --git a/lib/c-ares-1.19.1/src/tools/CMakeLists.txt b/lib/c-ares-1.23.0/src/tools/CMakeLists.txt similarity index 69% rename from lib/c-ares-1.19.1/src/tools/CMakeLists.txt rename to lib/c-ares-1.23.0/src/tools/CMakeLists.txt index 0c44216fcc4..ed5a7d7233b 100644 --- a/lib/c-ares-1.19.1/src/tools/CMakeLists.txt +++ b/lib/c-ares-1.23.0/src/tools/CMakeLists.txt @@ -1,3 +1,5 @@ +# Copyright (C) The c-ares project and its contributors +# SPDX-License-Identifier: MIT IF (CARES_BUILD_TOOLS) # Transform Makefile.inc transform_makefile_inc("Makefile.inc" "${PROJECT_BINARY_DIR}/src/tools/Makefile.inc.cmake") @@ -13,6 +15,10 @@ IF (CARES_BUILD_TOOLS) "$" PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}" ) + SET_TARGET_PROPERTIES (ahost PROPERTIES + C_STANDARD 90 + ) + TARGET_COMPILE_DEFINITIONS (ahost PRIVATE HAVE_CONFIG_H=1) TARGET_LINK_LIBRARIES (ahost PRIVATE ${PROJECT_NAME}) IF (CARES_INSTALL) @@ -30,26 +36,13 @@ IF (CARES_BUILD_TOOLS) "$" PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}" ) + SET_TARGET_PROPERTIES (adig PROPERTIES + C_STANDARD 90 + ) + TARGET_COMPILE_DEFINITIONS (adig PRIVATE HAVE_CONFIG_H=1) TARGET_LINK_LIBRARIES (adig PRIVATE ${PROJECT_NAME}) IF (CARES_INSTALL) INSTALL (TARGETS adig COMPONENT Tools ${TARGETS_INST_DEST}) ENDIF () - - - # Build acountry - ADD_EXECUTABLE (acountry acountry.c ${SAMPLESOURCES}) - TARGET_INCLUDE_DIRECTORIES (acountry - PUBLIC "$" - "$" - "$" - "$" - "$" - PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}" - ) - TARGET_COMPILE_DEFINITIONS (acountry PRIVATE HAVE_CONFIG_H=1) - TARGET_LINK_LIBRARIES (acountry PRIVATE ${PROJECT_NAME}) - IF (CARES_INSTALL) - INSTALL (TARGETS acountry COMPONENT Tools ${TARGETS_INST_DEST}) - ENDIF () ENDIF () diff --git a/lib/c-ares-1.19.1/src/tools/Makefile.am b/lib/c-ares-1.23.0/src/tools/Makefile.am similarity index 87% rename from lib/c-ares-1.19.1/src/tools/Makefile.am rename to lib/c-ares-1.23.0/src/tools/Makefile.am index 2ea6376f6a5..8ca33a93e01 100644 --- a/lib/c-ares-1.19.1/src/tools/Makefile.am +++ b/lib/c-ares-1.23.0/src/tools/Makefile.am @@ -1,5 +1,7 @@ +# Copyright (C) The c-ares project and its contributors +# SPDX-License-Identifier: MIT AUTOMAKE_OPTIONS = foreign subdir-objects nostdinc 1.9.6 -PROGS = ahost adig acountry +PROGS = ahost adig EXTRA_DIST = CMakeLists.txt Makefile.inc @@ -32,7 +34,3 @@ ahost_CPPFLAGS = $(AM_CPPFLAGS) adig_SOURCES = adig.c $(SAMPLESOURCES) $(SAMPLEHEADERS) adig_CFLAGS = $(AM_CFLAGS) adig_CPPFLAGS = $(AM_CPPFLAGS) - -acountry_SOURCES = acountry.c $(SAMPLESOURCES) $(SAMPLEHEADERS) -acountry_CFLAGS = $(AM_CFLAGS) -acountry_CPPFLAGS = $(AM_CPPFLAGS) diff --git a/lib/c-ares-1.19.1/src/tools/Makefile.in b/lib/c-ares-1.23.0/src/tools/Makefile.in similarity index 68% rename from lib/c-ares-1.19.1/src/tools/Makefile.in rename to lib/c-ares-1.23.0/src/tools/Makefile.in index 9e64462d591..661aa366cae 100644 --- a/lib/c-ares-1.19.1/src/tools/Makefile.in +++ b/lib/c-ares-1.23.0/src/tools/Makefile.in @@ -96,11 +96,15 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_ac_append_to_file.m4 \ $(top_srcdir)/m4/ax_ac_print_to_file.m4 \ $(top_srcdir)/m4/ax_add_am_macro_static.m4 \ $(top_srcdir)/m4/ax_am_macros_static.m4 \ + $(top_srcdir)/m4/ax_append_compile_flags.m4 \ + $(top_srcdir)/m4/ax_append_flag.m4 \ + $(top_srcdir)/m4/ax_check_compile_flag.m4 \ $(top_srcdir)/m4/ax_check_gnu_make.m4 \ $(top_srcdir)/m4/ax_code_coverage.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx_11.m4 \ $(top_srcdir)/m4/ax_file_escapes.m4 \ + $(top_srcdir)/m4/ax_pthread.m4 \ $(top_srcdir)/m4/ax_require_defined.m4 \ $(top_srcdir)/m4/cares-compilers.m4 \ $(top_srcdir)/m4/cares-confopts.m4 \ @@ -124,43 +128,29 @@ CONFIG_HEADER = $(top_builddir)/src/lib/ares_config.h \ $(top_builddir)/include/ares_build.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = -am__EXEEXT_1 = ahost$(EXEEXT) adig$(EXEEXT) acountry$(EXEEXT) +am__EXEEXT_1 = ahost$(EXEEXT) adig$(EXEEXT) PROGRAMS = $(noinst_PROGRAMS) am__dirstamp = $(am__leading_dot)dirstamp -am__objects_1 = acountry-ares_getopt.$(OBJEXT) \ - ../lib/acountry-ares_nowarn.$(OBJEXT) \ - ../lib/acountry-ares_strcasecmp.$(OBJEXT) +am__objects_1 = adig-ares_getopt.$(OBJEXT) \ + ../lib/adig-ares_strcasecmp.$(OBJEXT) am__objects_2 = -am_acountry_OBJECTS = acountry-acountry.$(OBJEXT) $(am__objects_1) \ +am_adig_OBJECTS = adig-adig.$(OBJEXT) $(am__objects_1) \ $(am__objects_2) -acountry_OBJECTS = $(am_acountry_OBJECTS) -acountry_LDADD = $(LDADD) +adig_OBJECTS = $(am_adig_OBJECTS) +adig_LDADD = $(LDADD) am__DEPENDENCIES_1 = -acountry_DEPENDENCIES = $(top_builddir)/src/lib/libcares.la \ +adig_DEPENDENCIES = $(top_builddir)/src/lib/libcares.la \ $(am__DEPENDENCIES_1) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = -acountry_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=link $(CCLD) $(acountry_CFLAGS) \ - $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ -am__objects_3 = adig-ares_getopt.$(OBJEXT) \ - ../lib/adig-ares_nowarn.$(OBJEXT) \ - ../lib/adig-ares_strcasecmp.$(OBJEXT) -am_adig_OBJECTS = adig-adig.$(OBJEXT) $(am__objects_3) \ - $(am__objects_2) -adig_OBJECTS = $(am_adig_OBJECTS) -adig_LDADD = $(LDADD) -adig_DEPENDENCIES = $(top_builddir)/src/lib/libcares.la \ - $(am__DEPENDENCIES_1) adig_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(adig_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ -am__objects_4 = ahost-ares_getopt.$(OBJEXT) \ - ../lib/ahost-ares_nowarn.$(OBJEXT) \ +am__objects_3 = ahost-ares_getopt.$(OBJEXT) \ ../lib/ahost-ares_strcasecmp.$(OBJEXT) -am_ahost_OBJECTS = ahost-ahost.$(OBJEXT) $(am__objects_4) \ +am_ahost_OBJECTS = ahost-ahost.$(OBJEXT) $(am__objects_3) \ $(am__objects_2) ahost_OBJECTS = $(am_ahost_OBJECTS) ahost_LDADD = $(LDADD) @@ -184,16 +174,10 @@ am__v_at_1 = DEFAULT_INCLUDES = depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles -am__depfiles_remade = ../lib/$(DEPDIR)/acountry-ares_nowarn.Po \ - ../lib/$(DEPDIR)/acountry-ares_strcasecmp.Po \ - ../lib/$(DEPDIR)/adig-ares_nowarn.Po \ - ../lib/$(DEPDIR)/adig-ares_strcasecmp.Po \ - ../lib/$(DEPDIR)/ahost-ares_nowarn.Po \ +am__depfiles_remade = ../lib/$(DEPDIR)/adig-ares_strcasecmp.Po \ ../lib/$(DEPDIR)/ahost-ares_strcasecmp.Po \ - ./$(DEPDIR)/acountry-acountry.Po \ - ./$(DEPDIR)/acountry-ares_getopt.Po ./$(DEPDIR)/adig-adig.Po \ - ./$(DEPDIR)/adig-ares_getopt.Po ./$(DEPDIR)/ahost-ahost.Po \ - ./$(DEPDIR)/ahost-ares_getopt.Po + ./$(DEPDIR)/adig-adig.Po ./$(DEPDIR)/adig-ares_getopt.Po \ + ./$(DEPDIR)/ahost-ahost.Po ./$(DEPDIR)/ahost-ares_getopt.Po am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) @@ -213,8 +197,8 @@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = -SOURCES = $(acountry_SOURCES) $(adig_SOURCES) $(ahost_SOURCES) -DIST_SOURCES = $(acountry_SOURCES) $(adig_SOURCES) $(ahost_SOURCES) +SOURCES = $(adig_SOURCES) $(ahost_SOURCES) +DIST_SOURCES = $(adig_SOURCES) $(ahost_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ @@ -323,6 +307,10 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_CXX = @PTHREAD_CXX@ +PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ @@ -342,6 +330,7 @@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ +ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ @@ -386,8 +375,11 @@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ + +# Copyright (C) The c-ares project and its contributors +# SPDX-License-Identifier: MIT AUTOMAKE_OPTIONS = foreign subdir-objects nostdinc 1.9.6 -PROGS = ahost adig acountry +PROGS = ahost adig EXTRA_DIST = CMakeLists.txt Makefile.inc # Specify our include paths here, and do it relative to $(top_srcdir) and @@ -397,12 +389,13 @@ EXTRA_DIST = CMakeLists.txt Makefile.inc AM_CPPFLAGS = -I$(top_builddir)/include -I$(top_builddir)/src/lib \ -I$(top_srcdir)/include -I$(top_srcdir)/src/lib \ $(am__append_1) + +# Copyright (C) The c-ares project and its contributors +# SPDX-License-Identifier: MIT SAMPLESOURCES = ares_getopt.c \ - ../lib/ares_nowarn.c \ ../lib/ares_strcasecmp.c SAMPLEHEADERS = ares_getopt.h \ - ../lib/ares_nowarn.h \ ../lib/ares_strcasecmp.h @@ -415,9 +408,6 @@ ahost_CPPFLAGS = $(AM_CPPFLAGS) adig_SOURCES = adig.c $(SAMPLESOURCES) $(SAMPLEHEADERS) adig_CFLAGS = $(AM_CFLAGS) adig_CPPFLAGS = $(AM_CPPFLAGS) -acountry_SOURCES = acountry.c $(SAMPLESOURCES) $(SAMPLEHEADERS) -acountry_CFLAGS = $(AM_CFLAGS) -acountry_CPPFLAGS = $(AM_CPPFLAGS) all: all-am .SUFFIXES: @@ -467,24 +457,12 @@ clean-noinstPROGRAMS: ../lib/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) ../lib/$(DEPDIR) @: > ../lib/$(DEPDIR)/$(am__dirstamp) -../lib/acountry-ares_nowarn.$(OBJEXT): ../lib/$(am__dirstamp) \ - ../lib/$(DEPDIR)/$(am__dirstamp) -../lib/acountry-ares_strcasecmp.$(OBJEXT): ../lib/$(am__dirstamp) \ - ../lib/$(DEPDIR)/$(am__dirstamp) - -acountry$(EXEEXT): $(acountry_OBJECTS) $(acountry_DEPENDENCIES) $(EXTRA_acountry_DEPENDENCIES) - @rm -f acountry$(EXEEXT) - $(AM_V_CCLD)$(acountry_LINK) $(acountry_OBJECTS) $(acountry_LDADD) $(LIBS) -../lib/adig-ares_nowarn.$(OBJEXT): ../lib/$(am__dirstamp) \ - ../lib/$(DEPDIR)/$(am__dirstamp) ../lib/adig-ares_strcasecmp.$(OBJEXT): ../lib/$(am__dirstamp) \ ../lib/$(DEPDIR)/$(am__dirstamp) adig$(EXEEXT): $(adig_OBJECTS) $(adig_DEPENDENCIES) $(EXTRA_adig_DEPENDENCIES) @rm -f adig$(EXEEXT) $(AM_V_CCLD)$(adig_LINK) $(adig_OBJECTS) $(adig_LDADD) $(LIBS) -../lib/ahost-ares_nowarn.$(OBJEXT): ../lib/$(am__dirstamp) \ - ../lib/$(DEPDIR)/$(am__dirstamp) ../lib/ahost-ares_strcasecmp.$(OBJEXT): ../lib/$(am__dirstamp) \ ../lib/$(DEPDIR)/$(am__dirstamp) @@ -499,14 +477,8 @@ mostlyclean-compile: distclean-compile: -rm -f *.tab.c -@AMDEP_TRUE@@am__include@ @am__quote@../lib/$(DEPDIR)/acountry-ares_nowarn.Po@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@../lib/$(DEPDIR)/acountry-ares_strcasecmp.Po@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@../lib/$(DEPDIR)/adig-ares_nowarn.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@../lib/$(DEPDIR)/adig-ares_strcasecmp.Po@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@../lib/$(DEPDIR)/ahost-ares_nowarn.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@../lib/$(DEPDIR)/ahost-ares_strcasecmp.Po@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/acountry-acountry.Po@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/acountry-ares_getopt.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/adig-adig.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/adig-ares_getopt.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ahost-ahost.Po@am__quote@ # am--include-marker @@ -542,62 +514,6 @@ am--depfiles: $(am__depfiles_remade) @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< -acountry-acountry.o: acountry.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(acountry_CPPFLAGS) $(CPPFLAGS) $(acountry_CFLAGS) $(CFLAGS) -MT acountry-acountry.o -MD -MP -MF $(DEPDIR)/acountry-acountry.Tpo -c -o acountry-acountry.o `test -f 'acountry.c' || echo '$(srcdir)/'`acountry.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/acountry-acountry.Tpo $(DEPDIR)/acountry-acountry.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='acountry.c' object='acountry-acountry.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(acountry_CPPFLAGS) $(CPPFLAGS) $(acountry_CFLAGS) $(CFLAGS) -c -o acountry-acountry.o `test -f 'acountry.c' || echo '$(srcdir)/'`acountry.c - -acountry-acountry.obj: acountry.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(acountry_CPPFLAGS) $(CPPFLAGS) $(acountry_CFLAGS) $(CFLAGS) -MT acountry-acountry.obj -MD -MP -MF $(DEPDIR)/acountry-acountry.Tpo -c -o acountry-acountry.obj `if test -f 'acountry.c'; then $(CYGPATH_W) 'acountry.c'; else $(CYGPATH_W) '$(srcdir)/acountry.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/acountry-acountry.Tpo $(DEPDIR)/acountry-acountry.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='acountry.c' object='acountry-acountry.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(acountry_CPPFLAGS) $(CPPFLAGS) $(acountry_CFLAGS) $(CFLAGS) -c -o acountry-acountry.obj `if test -f 'acountry.c'; then $(CYGPATH_W) 'acountry.c'; else $(CYGPATH_W) '$(srcdir)/acountry.c'; fi` - -acountry-ares_getopt.o: ares_getopt.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(acountry_CPPFLAGS) $(CPPFLAGS) $(acountry_CFLAGS) $(CFLAGS) -MT acountry-ares_getopt.o -MD -MP -MF $(DEPDIR)/acountry-ares_getopt.Tpo -c -o acountry-ares_getopt.o `test -f 'ares_getopt.c' || echo '$(srcdir)/'`ares_getopt.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/acountry-ares_getopt.Tpo $(DEPDIR)/acountry-ares_getopt.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_getopt.c' object='acountry-ares_getopt.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(acountry_CPPFLAGS) $(CPPFLAGS) $(acountry_CFLAGS) $(CFLAGS) -c -o acountry-ares_getopt.o `test -f 'ares_getopt.c' || echo '$(srcdir)/'`ares_getopt.c - -acountry-ares_getopt.obj: ares_getopt.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(acountry_CPPFLAGS) $(CPPFLAGS) $(acountry_CFLAGS) $(CFLAGS) -MT acountry-ares_getopt.obj -MD -MP -MF $(DEPDIR)/acountry-ares_getopt.Tpo -c -o acountry-ares_getopt.obj `if test -f 'ares_getopt.c'; then $(CYGPATH_W) 'ares_getopt.c'; else $(CYGPATH_W) '$(srcdir)/ares_getopt.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/acountry-ares_getopt.Tpo $(DEPDIR)/acountry-ares_getopt.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_getopt.c' object='acountry-ares_getopt.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(acountry_CPPFLAGS) $(CPPFLAGS) $(acountry_CFLAGS) $(CFLAGS) -c -o acountry-ares_getopt.obj `if test -f 'ares_getopt.c'; then $(CYGPATH_W) 'ares_getopt.c'; else $(CYGPATH_W) '$(srcdir)/ares_getopt.c'; fi` - -../lib/acountry-ares_nowarn.o: ../lib/ares_nowarn.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(acountry_CPPFLAGS) $(CPPFLAGS) $(acountry_CFLAGS) $(CFLAGS) -MT ../lib/acountry-ares_nowarn.o -MD -MP -MF ../lib/$(DEPDIR)/acountry-ares_nowarn.Tpo -c -o ../lib/acountry-ares_nowarn.o `test -f '../lib/ares_nowarn.c' || echo '$(srcdir)/'`../lib/ares_nowarn.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../lib/$(DEPDIR)/acountry-ares_nowarn.Tpo ../lib/$(DEPDIR)/acountry-ares_nowarn.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../lib/ares_nowarn.c' object='../lib/acountry-ares_nowarn.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(acountry_CPPFLAGS) $(CPPFLAGS) $(acountry_CFLAGS) $(CFLAGS) -c -o ../lib/acountry-ares_nowarn.o `test -f '../lib/ares_nowarn.c' || echo '$(srcdir)/'`../lib/ares_nowarn.c - -../lib/acountry-ares_nowarn.obj: ../lib/ares_nowarn.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(acountry_CPPFLAGS) $(CPPFLAGS) $(acountry_CFLAGS) $(CFLAGS) -MT ../lib/acountry-ares_nowarn.obj -MD -MP -MF ../lib/$(DEPDIR)/acountry-ares_nowarn.Tpo -c -o ../lib/acountry-ares_nowarn.obj `if test -f '../lib/ares_nowarn.c'; then $(CYGPATH_W) '../lib/ares_nowarn.c'; else $(CYGPATH_W) '$(srcdir)/../lib/ares_nowarn.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../lib/$(DEPDIR)/acountry-ares_nowarn.Tpo ../lib/$(DEPDIR)/acountry-ares_nowarn.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../lib/ares_nowarn.c' object='../lib/acountry-ares_nowarn.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(acountry_CPPFLAGS) $(CPPFLAGS) $(acountry_CFLAGS) $(CFLAGS) -c -o ../lib/acountry-ares_nowarn.obj `if test -f '../lib/ares_nowarn.c'; then $(CYGPATH_W) '../lib/ares_nowarn.c'; else $(CYGPATH_W) '$(srcdir)/../lib/ares_nowarn.c'; fi` - -../lib/acountry-ares_strcasecmp.o: ../lib/ares_strcasecmp.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(acountry_CPPFLAGS) $(CPPFLAGS) $(acountry_CFLAGS) $(CFLAGS) -MT ../lib/acountry-ares_strcasecmp.o -MD -MP -MF ../lib/$(DEPDIR)/acountry-ares_strcasecmp.Tpo -c -o ../lib/acountry-ares_strcasecmp.o `test -f '../lib/ares_strcasecmp.c' || echo '$(srcdir)/'`../lib/ares_strcasecmp.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../lib/$(DEPDIR)/acountry-ares_strcasecmp.Tpo ../lib/$(DEPDIR)/acountry-ares_strcasecmp.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../lib/ares_strcasecmp.c' object='../lib/acountry-ares_strcasecmp.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(acountry_CPPFLAGS) $(CPPFLAGS) $(acountry_CFLAGS) $(CFLAGS) -c -o ../lib/acountry-ares_strcasecmp.o `test -f '../lib/ares_strcasecmp.c' || echo '$(srcdir)/'`../lib/ares_strcasecmp.c - -../lib/acountry-ares_strcasecmp.obj: ../lib/ares_strcasecmp.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(acountry_CPPFLAGS) $(CPPFLAGS) $(acountry_CFLAGS) $(CFLAGS) -MT ../lib/acountry-ares_strcasecmp.obj -MD -MP -MF ../lib/$(DEPDIR)/acountry-ares_strcasecmp.Tpo -c -o ../lib/acountry-ares_strcasecmp.obj `if test -f '../lib/ares_strcasecmp.c'; then $(CYGPATH_W) '../lib/ares_strcasecmp.c'; else $(CYGPATH_W) '$(srcdir)/../lib/ares_strcasecmp.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../lib/$(DEPDIR)/acountry-ares_strcasecmp.Tpo ../lib/$(DEPDIR)/acountry-ares_strcasecmp.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../lib/ares_strcasecmp.c' object='../lib/acountry-ares_strcasecmp.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(acountry_CPPFLAGS) $(CPPFLAGS) $(acountry_CFLAGS) $(CFLAGS) -c -o ../lib/acountry-ares_strcasecmp.obj `if test -f '../lib/ares_strcasecmp.c'; then $(CYGPATH_W) '../lib/ares_strcasecmp.c'; else $(CYGPATH_W) '$(srcdir)/../lib/ares_strcasecmp.c'; fi` - adig-adig.o: adig.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(adig_CPPFLAGS) $(CPPFLAGS) $(adig_CFLAGS) $(CFLAGS) -MT adig-adig.o -MD -MP -MF $(DEPDIR)/adig-adig.Tpo -c -o adig-adig.o `test -f 'adig.c' || echo '$(srcdir)/'`adig.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/adig-adig.Tpo $(DEPDIR)/adig-adig.Po @@ -626,20 +542,6 @@ adig-ares_getopt.obj: ares_getopt.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(adig_CPPFLAGS) $(CPPFLAGS) $(adig_CFLAGS) $(CFLAGS) -c -o adig-ares_getopt.obj `if test -f 'ares_getopt.c'; then $(CYGPATH_W) 'ares_getopt.c'; else $(CYGPATH_W) '$(srcdir)/ares_getopt.c'; fi` -../lib/adig-ares_nowarn.o: ../lib/ares_nowarn.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(adig_CPPFLAGS) $(CPPFLAGS) $(adig_CFLAGS) $(CFLAGS) -MT ../lib/adig-ares_nowarn.o -MD -MP -MF ../lib/$(DEPDIR)/adig-ares_nowarn.Tpo -c -o ../lib/adig-ares_nowarn.o `test -f '../lib/ares_nowarn.c' || echo '$(srcdir)/'`../lib/ares_nowarn.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../lib/$(DEPDIR)/adig-ares_nowarn.Tpo ../lib/$(DEPDIR)/adig-ares_nowarn.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../lib/ares_nowarn.c' object='../lib/adig-ares_nowarn.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(adig_CPPFLAGS) $(CPPFLAGS) $(adig_CFLAGS) $(CFLAGS) -c -o ../lib/adig-ares_nowarn.o `test -f '../lib/ares_nowarn.c' || echo '$(srcdir)/'`../lib/ares_nowarn.c - -../lib/adig-ares_nowarn.obj: ../lib/ares_nowarn.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(adig_CPPFLAGS) $(CPPFLAGS) $(adig_CFLAGS) $(CFLAGS) -MT ../lib/adig-ares_nowarn.obj -MD -MP -MF ../lib/$(DEPDIR)/adig-ares_nowarn.Tpo -c -o ../lib/adig-ares_nowarn.obj `if test -f '../lib/ares_nowarn.c'; then $(CYGPATH_W) '../lib/ares_nowarn.c'; else $(CYGPATH_W) '$(srcdir)/../lib/ares_nowarn.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../lib/$(DEPDIR)/adig-ares_nowarn.Tpo ../lib/$(DEPDIR)/adig-ares_nowarn.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../lib/ares_nowarn.c' object='../lib/adig-ares_nowarn.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(adig_CPPFLAGS) $(CPPFLAGS) $(adig_CFLAGS) $(CFLAGS) -c -o ../lib/adig-ares_nowarn.obj `if test -f '../lib/ares_nowarn.c'; then $(CYGPATH_W) '../lib/ares_nowarn.c'; else $(CYGPATH_W) '$(srcdir)/../lib/ares_nowarn.c'; fi` - ../lib/adig-ares_strcasecmp.o: ../lib/ares_strcasecmp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(adig_CPPFLAGS) $(CPPFLAGS) $(adig_CFLAGS) $(CFLAGS) -MT ../lib/adig-ares_strcasecmp.o -MD -MP -MF ../lib/$(DEPDIR)/adig-ares_strcasecmp.Tpo -c -o ../lib/adig-ares_strcasecmp.o `test -f '../lib/ares_strcasecmp.c' || echo '$(srcdir)/'`../lib/ares_strcasecmp.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../lib/$(DEPDIR)/adig-ares_strcasecmp.Tpo ../lib/$(DEPDIR)/adig-ares_strcasecmp.Po @@ -682,20 +584,6 @@ ahost-ares_getopt.obj: ares_getopt.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ahost_CPPFLAGS) $(CPPFLAGS) $(ahost_CFLAGS) $(CFLAGS) -c -o ahost-ares_getopt.obj `if test -f 'ares_getopt.c'; then $(CYGPATH_W) 'ares_getopt.c'; else $(CYGPATH_W) '$(srcdir)/ares_getopt.c'; fi` -../lib/ahost-ares_nowarn.o: ../lib/ares_nowarn.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ahost_CPPFLAGS) $(CPPFLAGS) $(ahost_CFLAGS) $(CFLAGS) -MT ../lib/ahost-ares_nowarn.o -MD -MP -MF ../lib/$(DEPDIR)/ahost-ares_nowarn.Tpo -c -o ../lib/ahost-ares_nowarn.o `test -f '../lib/ares_nowarn.c' || echo '$(srcdir)/'`../lib/ares_nowarn.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../lib/$(DEPDIR)/ahost-ares_nowarn.Tpo ../lib/$(DEPDIR)/ahost-ares_nowarn.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../lib/ares_nowarn.c' object='../lib/ahost-ares_nowarn.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ahost_CPPFLAGS) $(CPPFLAGS) $(ahost_CFLAGS) $(CFLAGS) -c -o ../lib/ahost-ares_nowarn.o `test -f '../lib/ares_nowarn.c' || echo '$(srcdir)/'`../lib/ares_nowarn.c - -../lib/ahost-ares_nowarn.obj: ../lib/ares_nowarn.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ahost_CPPFLAGS) $(CPPFLAGS) $(ahost_CFLAGS) $(CFLAGS) -MT ../lib/ahost-ares_nowarn.obj -MD -MP -MF ../lib/$(DEPDIR)/ahost-ares_nowarn.Tpo -c -o ../lib/ahost-ares_nowarn.obj `if test -f '../lib/ares_nowarn.c'; then $(CYGPATH_W) '../lib/ares_nowarn.c'; else $(CYGPATH_W) '$(srcdir)/../lib/ares_nowarn.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../lib/$(DEPDIR)/ahost-ares_nowarn.Tpo ../lib/$(DEPDIR)/ahost-ares_nowarn.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../lib/ares_nowarn.c' object='../lib/ahost-ares_nowarn.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ahost_CPPFLAGS) $(CPPFLAGS) $(ahost_CFLAGS) $(CFLAGS) -c -o ../lib/ahost-ares_nowarn.obj `if test -f '../lib/ares_nowarn.c'; then $(CYGPATH_W) '../lib/ares_nowarn.c'; else $(CYGPATH_W) '$(srcdir)/../lib/ares_nowarn.c'; fi` - ../lib/ahost-ares_strcasecmp.o: ../lib/ares_strcasecmp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ahost_CPPFLAGS) $(CPPFLAGS) $(ahost_CFLAGS) $(CFLAGS) -MT ../lib/ahost-ares_strcasecmp.o -MD -MP -MF ../lib/$(DEPDIR)/ahost-ares_strcasecmp.Tpo -c -o ../lib/ahost-ares_strcasecmp.o `test -f '../lib/ares_strcasecmp.c' || echo '$(srcdir)/'`../lib/ares_strcasecmp.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../lib/$(DEPDIR)/ahost-ares_strcasecmp.Tpo ../lib/$(DEPDIR)/ahost-ares_strcasecmp.Po @@ -842,14 +730,8 @@ clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ mostlyclean-am distclean: distclean-am - -rm -f ../lib/$(DEPDIR)/acountry-ares_nowarn.Po - -rm -f ../lib/$(DEPDIR)/acountry-ares_strcasecmp.Po - -rm -f ../lib/$(DEPDIR)/adig-ares_nowarn.Po - -rm -f ../lib/$(DEPDIR)/adig-ares_strcasecmp.Po - -rm -f ../lib/$(DEPDIR)/ahost-ares_nowarn.Po + -rm -f ../lib/$(DEPDIR)/adig-ares_strcasecmp.Po -rm -f ../lib/$(DEPDIR)/ahost-ares_strcasecmp.Po - -rm -f ./$(DEPDIR)/acountry-acountry.Po - -rm -f ./$(DEPDIR)/acountry-ares_getopt.Po -rm -f ./$(DEPDIR)/adig-adig.Po -rm -f ./$(DEPDIR)/adig-ares_getopt.Po -rm -f ./$(DEPDIR)/ahost-ahost.Po @@ -899,14 +781,8 @@ install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am - -rm -f ../lib/$(DEPDIR)/acountry-ares_nowarn.Po - -rm -f ../lib/$(DEPDIR)/acountry-ares_strcasecmp.Po - -rm -f ../lib/$(DEPDIR)/adig-ares_nowarn.Po - -rm -f ../lib/$(DEPDIR)/adig-ares_strcasecmp.Po - -rm -f ../lib/$(DEPDIR)/ahost-ares_nowarn.Po + -rm -f ../lib/$(DEPDIR)/adig-ares_strcasecmp.Po -rm -f ../lib/$(DEPDIR)/ahost-ares_strcasecmp.Po - -rm -f ./$(DEPDIR)/acountry-acountry.Po - -rm -f ./$(DEPDIR)/acountry-ares_getopt.Po -rm -f ./$(DEPDIR)/adig-adig.Po -rm -f ./$(DEPDIR)/adig-ares_getopt.Po -rm -f ./$(DEPDIR)/ahost-ahost.Po diff --git a/lib/c-ares-1.19.1/src/tools/Makefile.inc b/lib/c-ares-1.23.0/src/tools/Makefile.inc similarity index 58% rename from lib/c-ares-1.19.1/src/tools/Makefile.inc rename to lib/c-ares-1.23.0/src/tools/Makefile.inc index 7aea8e5f259..dd081b3005d 100644 --- a/lib/c-ares-1.19.1/src/tools/Makefile.inc +++ b/lib/c-ares-1.23.0/src/tools/Makefile.inc @@ -1,7 +1,7 @@ +# Copyright (C) The c-ares project and its contributors +# SPDX-License-Identifier: MIT SAMPLESOURCES = ares_getopt.c \ - ../lib/ares_nowarn.c \ ../lib/ares_strcasecmp.c SAMPLEHEADERS = ares_getopt.h \ - ../lib/ares_nowarn.h \ ../lib/ares_strcasecmp.h diff --git a/lib/c-ares-1.23.0/src/tools/adig.c b/lib/c-ares-1.23.0/src/tools/adig.c new file mode 100644 index 00000000000..35f4b224f61 --- /dev/null +++ b/lib/c-ares-1.23.0/src/tools/adig.c @@ -0,0 +1,959 @@ +/* MIT License + * + * Copyright (c) 1998 Massachusetts Institute of Technology + * Copyright (c) The c-ares project and its contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ +#include "ares_setup.h" + +#ifdef HAVE_NETINET_IN_H +# include +#endif +#ifdef HAVE_ARPA_INET_H +# include +#endif +#ifdef HAVE_NETDB_H +# include +#endif + +#include "ares_nameser.h" + +#ifdef HAVE_STRINGS_H +# include +#endif + +#include "ares.h" +#include "ares_dns.h" + +#ifndef HAVE_STRDUP +# include "ares_strdup.h" +# define strdup(ptr) ares_strdup(ptr) +#endif + +#ifndef HAVE_STRCASECMP +# include "ares_strcasecmp.h" +# define strcasecmp(p1, p2) ares_strcasecmp(p1, p2) +#endif + +#ifndef HAVE_STRNCASECMP +# include "ares_strcasecmp.h" +# define strncasecmp(p1, p2, n) ares_strncasecmp(p1, p2, n) +#endif + +#include "ares_getopt.h" + +#ifdef WATT32 +# undef WIN32 /* Redefined in MingW headers */ +#endif + + +typedef struct { + ares_bool_t is_help; + struct ares_options options; + int optmask; + ares_dns_class_t qclass; + ares_dns_rec_type_t qtype; + int args_processed; + char *servers; + char error[256]; +} adig_config_t; + +typedef struct { + const char *name; + int value; +} nv_t; + +static const nv_t configflags[] = { + {"usevc", ARES_FLAG_USEVC }, + { "primary", ARES_FLAG_PRIMARY }, + { "igntc", ARES_FLAG_IGNTC }, + { "norecurse", ARES_FLAG_NORECURSE}, + { "stayopen", ARES_FLAG_STAYOPEN }, + { "noaliases", ARES_FLAG_NOALIASES} +}; +static const size_t nconfigflags = sizeof(configflags) / sizeof(*configflags); + +static int lookup_flag(const nv_t *nv, size_t num_nv, const char *name) +{ + size_t i; + + if (name == NULL) { + return 0; + } + + for (i = 0; i < num_nv; i++) { + if (strcasecmp(nv[i].name, name) == 0) { + return nv[i].value; + } + } + + return 0; +} + +static void free_config(adig_config_t *config) +{ + free(config->servers); + memset(config, 0, sizeof(*config)); +} + +static void print_help(void) +{ + printf("adig version %s\n\n", ares_version(NULL)); + printf( + "usage: adig [-h] [-d] [-f flag] [[-s server] ...] [-T|U port] [-c class]\n" + " [-t type] name ...\n\n" + " -h : Display this help and exit.\n" + " -d : Print some extra debugging output.\n" + " -f flag : Add a behavior control flag. Possible values are\n" + " igntc - do not retry a truncated query as TCP, just\n" + " return the truncated answer\n" + " noaliases - don't honor the HOSTALIASES environment\n" + " variable\n" + " norecurse - don't query upstream servers recursively\n" + " primary - use the first server\n" + " stayopen - don't close the communication sockets\n" + " usevc - use TCP only\n" + " -s server : Connect to the specified DNS server, instead of the\n" + " system's default one(s). Servers are tried in round-robin,\n" + " if the previous one failed.\n" + " -T port : Connect to the specified TCP port of DNS server.\n" + " -U port : Connect to the specified UDP port of DNS server.\n" + " -c class : Set the query class. Possible values for class are:\n" + " ANY, CHAOS, HS and IN (default)\n" + " -t type : Query records of the specified type. Possible values for\n" + " type are:\n" + " A (default), AAAA, ANY, CNAME, HINFO, MX, NAPTR, NS, PTR,\n" + " SOA, SRV, TXT, TLSA, URI, CAA, SVCB, HTTPS\n\n"); +} + +static ares_bool_t read_cmdline(int argc, const char **argv, + adig_config_t *config) +{ + ares_getopt_state_t state; + int c; + + ares_getopt_init(&state, argc, argv); + state.opterr = 0; + + while ((c = ares_getopt(&state, "dh?f:s:c:t:T:U:")) != -1) { + int f; + + switch (c) { + case 'd': +#ifdef WATT32 + dbug_init(); +#endif + break; + + case 'h': + config->is_help = ARES_TRUE; + return ARES_TRUE; + + case 'f': + f = lookup_flag(configflags, nconfigflags, state.optarg); + if (f == 0) { + snprintf(config->error, sizeof(config->error), "flag %s unknown", + state.optarg); + } + + config->options.flags |= f; + config->optmask |= ARES_OPT_FLAGS; + break; + + case 's': + if (state.optarg == NULL) { + snprintf(config->error, sizeof(config->error), "%s", + "missing servers"); + return ARES_FALSE; + } + if (config->servers) { + free(config->servers); + } + config->servers = strdup(state.optarg); + break; + + case 'c': + if (!ares_dns_class_fromstr(&config->qclass, state.optarg)) { + snprintf(config->error, sizeof(config->error), + "unrecognized class %s", state.optarg); + return ARES_FALSE; + } + break; + + case 't': + if (!ares_dns_rec_type_fromstr(&config->qtype, state.optarg)) { + snprintf(config->error, sizeof(config->error), "unrecognized type %s", + state.optarg); + return ARES_FALSE; + } + break; + + case 'T': + /* Set the TCP port number. */ + if (!isdigit(*state.optarg)) { + snprintf(config->error, sizeof(config->error), "invalid port number"); + return ARES_FALSE; + } + config->options.tcp_port = + (unsigned short)strtol(state.optarg, NULL, 0); + config->options.flags |= ARES_FLAG_USEVC; + config->optmask |= ARES_OPT_TCP_PORT; + break; + + case 'U': + /* Set the UDP port number. */ + if (!isdigit(*state.optarg)) { + snprintf(config->error, sizeof(config->error), "invalid port number"); + return ARES_FALSE; + } + config->options.udp_port = + (unsigned short)strtol(state.optarg, NULL, 0); + config->optmask |= ARES_OPT_UDP_PORT; + break; + + case ':': + snprintf(config->error, sizeof(config->error), + "%c requires an argument", state.optopt); + return ARES_FALSE; + + default: + snprintf(config->error, sizeof(config->error), + "unrecognized option: %c", state.optopt); + return ARES_FALSE; + } + } + + config->args_processed = state.optind; + if (config->args_processed >= argc) { + snprintf(config->error, sizeof(config->error), "missing query name"); + return ARES_FALSE; + } + return ARES_TRUE; +} + +static void print_flags(ares_dns_flags_t flags) +{ + if (flags & ARES_FLAG_QR) { + printf(" qr"); + } + if (flags & ARES_FLAG_AA) { + printf(" aa"); + } + if (flags & ARES_FLAG_TC) { + printf(" tc"); + } + if (flags & ARES_FLAG_RD) { + printf(" rd"); + } + if (flags & ARES_FLAG_RA) { + printf(" ra"); + } + if (flags & ARES_FLAG_AD) { + printf(" ad"); + } + if (flags & ARES_FLAG_CD) { + printf(" cd"); + } +} + +static void print_header(const ares_dns_record_t *dnsrec) +{ + printf(";; ->>HEADER<<- opcode: %s, status: %s, id: %u\n", + ares_dns_opcode_tostr(ares_dns_record_get_opcode(dnsrec)), + ares_dns_rcode_tostr(ares_dns_record_get_rcode(dnsrec)), + ares_dns_record_get_id(dnsrec)); + printf(";; flags:"); + print_flags(ares_dns_record_get_flags(dnsrec)); + printf("; QUERY: %u, ANSWER: %u, AUTHORITY: %u, ADDITIONAL: %u\n\n", + (unsigned int)ares_dns_record_query_cnt(dnsrec), + (unsigned int)ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_ANSWER), + (unsigned int)ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_AUTHORITY), + (unsigned int)ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_ADDITIONAL)); +} + +static void print_question(const ares_dns_record_t *dnsrec) +{ + size_t i; + printf(";; QUESTION SECTION:\n"); + for (i = 0; i < ares_dns_record_query_cnt(dnsrec); i++) { + const char *name; + ares_dns_rec_type_t qtype; + ares_dns_class_t qclass; + size_t len; + if (ares_dns_record_query_get(dnsrec, i, &name, &qtype, &qclass) != + ARES_SUCCESS) { + return; + } + if (name == NULL) { + return; + } + len = strlen(name); + printf(";%s.\t", name); + if (len + 1 < 24) { + printf("\t"); + } + if (len + 1 < 16) { + printf("\t"); + } + printf("%s\t%s\n", ares_dns_class_tostr(qclass), + ares_dns_rec_type_tostr(qtype)); + } + printf("\n"); +} + +static void print_opt_none(const unsigned char *val, size_t val_len) +{ + (void)val; + if (val_len != 0) { + printf("INVALID!"); + } +} + +static void print_opt_addr_list(const unsigned char *val, size_t val_len) +{ + size_t i; + if (val_len % 4 != 0) { + printf("INVALID!"); + return; + } + for (i = 0; i < val_len; i += 4) { + char buf[256] = ""; + ares_inet_ntop(AF_INET, val + i, buf, sizeof(buf)); + if (i != 0) { + printf(","); + } + printf("%s", buf); + } +} + +static void print_opt_addr6_list(const unsigned char *val, size_t val_len) +{ + size_t i; + if (val_len % 16 != 0) { + printf("INVALID!"); + return; + } + for (i = 0; i < val_len; i += 16) { + char buf[256] = ""; + + ares_inet_ntop(AF_INET6, val + i, buf, sizeof(buf)); + if (i != 0) { + printf(","); + } + printf("%s", buf); + } +} + +static void print_opt_u8_list(const unsigned char *val, size_t val_len) +{ + size_t i; + + for (i = 0; i < val_len; i++) { + if (i != 0) { + printf(","); + } + printf("%u", (unsigned int)val[i]); + } +} + +static void print_opt_u16_list(const unsigned char *val, size_t val_len) +{ + size_t i; + if (val_len < 2 || val_len % 2 != 0) { + printf("INVALID!"); + return; + } + for (i = 0; i < val_len; i += 2) { + unsigned short u16 = 0; + unsigned short c; + /* Jumping over backwards to try to avoid odd compiler warnings */ + c = (unsigned short)val[i]; + u16 |= (unsigned short)((c << 8) & 0xFFFF); + c = (unsigned short)val[i + 1]; + u16 |= c; + if (i != 0) { + printf(","); + } + printf("%u", (unsigned int)u16); + } +} + +static void print_opt_u32_list(const unsigned char *val, size_t val_len) +{ + size_t i; + if (val_len < 4 || val_len % 4 != 0) { + printf("INVALID!"); + return; + } + for (i = 0; i < val_len; i += 4) { + unsigned int u32 = 0; + + u32 |= (unsigned int)(val[i] << 24); + u32 |= (unsigned int)(val[i + 1] << 16); + u32 |= (unsigned int)(val[i + 2] << 8); + u32 |= (unsigned int)(val[i + 3]); + if (i != 0) { + printf(","); + } + printf("%u", u32); + } +} + +static void print_opt_str_list(const unsigned char *val, size_t val_len) +{ + size_t cnt = 0; + + printf("\""); + while (val_len) { + long read_len = 0; + unsigned char *str = NULL; + ares_status_t status; + + if (cnt) { + printf(","); + } + + status = (ares_status_t)ares_expand_string(val, val, (int)val_len, &str, + &read_len); + if (status != ARES_SUCCESS) { + printf("INVALID"); + break; + } + printf("%s", str); + ares_free_string(str); + val_len -= (size_t)read_len; + val += read_len; + cnt++; + } + printf("\""); +} + +static void print_opt_name(const unsigned char *val, size_t val_len) +{ + char *str = NULL; + long read_len = 0; + + if (ares_expand_name(val, val, (int)val_len, &str, &read_len) != + ARES_SUCCESS) { + printf("INVALID!"); + return; + } + + printf("%s.", str); + ares_free_string(str); +} + +static void print_opt_bin(const unsigned char *val, size_t val_len) +{ + size_t i; + + for (i = 0; i < val_len; i++) { + printf("%02x", (unsigned int)val[i]); + } +} + +static ares_bool_t adig_isprint(int ch) +{ + if (ch >= 0x20 && ch <= 0x7E) { + return ARES_TRUE; + } + return ARES_FALSE; +} + +static void print_opt_binp(const unsigned char *val, size_t val_len) +{ + size_t i; + printf("\""); + for (i = 0; i < val_len; i++) { + if (adig_isprint(val[i])) { + printf("%c", val[i]); + } else { + printf("\\%03d", val[i]); + } + } + printf("\""); +} + +static void print_opts(const ares_dns_rr_t *rr, ares_dns_rr_key_t key) +{ + size_t i; + + for (i = 0; i < ares_dns_rr_get_opt_cnt(rr, key); i++) { + size_t val_len = 0; + const unsigned char *val = NULL; + unsigned short opt; + const char *name; + + if (i != 0) { + printf(" "); + } + + opt = ares_dns_rr_get_opt(rr, key, i, &val, &val_len); + name = ares_dns_opt_get_name(key, opt); + if (name == NULL) { + printf("key%u", (unsigned int)opt); + } else { + printf("%s", name); + } + if (val_len == 0) { + return; + } + + printf("="); + + switch (ares_dns_opt_get_datatype(key, opt)) { + case ARES_OPT_DATATYPE_NONE: + print_opt_none(val, val_len); + break; + case ARES_OPT_DATATYPE_U8_LIST: + print_opt_u8_list(val, val_len); + break; + case ARES_OPT_DATATYPE_INADDR4_LIST: + print_opt_addr_list(val, val_len); + break; + case ARES_OPT_DATATYPE_INADDR6_LIST: + print_opt_addr6_list(val, val_len); + break; + case ARES_OPT_DATATYPE_U16: + case ARES_OPT_DATATYPE_U16_LIST: + print_opt_u16_list(val, val_len); + break; + case ARES_OPT_DATATYPE_U32: + case ARES_OPT_DATATYPE_U32_LIST: + print_opt_u32_list(val, val_len); + break; + case ARES_OPT_DATATYPE_STR_LIST: + print_opt_str_list(val, val_len); + break; + case ARES_OPT_DATATYPE_BIN: + print_opt_bin(val, val_len); + break; + case ARES_OPT_DATATYPE_NAME: + print_opt_name(val, val_len); + break; + } + } +} + +static void print_addr(const ares_dns_rr_t *rr, ares_dns_rr_key_t key) +{ + const struct in_addr *addr = ares_dns_rr_get_addr(rr, key); + char buf[256] = ""; + + ares_inet_ntop(AF_INET, addr, buf, sizeof(buf)); + printf("%s", buf); +} + +static void print_addr6(const ares_dns_rr_t *rr, ares_dns_rr_key_t key) +{ + const struct ares_in6_addr *addr = ares_dns_rr_get_addr6(rr, key); + char buf[256] = ""; + + ares_inet_ntop(AF_INET6, addr, buf, sizeof(buf)); + printf("%s", buf); +} + +static void print_u8(const ares_dns_rr_t *rr, ares_dns_rr_key_t key) +{ + unsigned char u8 = ares_dns_rr_get_u8(rr, key); + printf("%u", (unsigned int)u8); +} + +static void print_u16(const ares_dns_rr_t *rr, ares_dns_rr_key_t key) +{ + unsigned short u16 = ares_dns_rr_get_u16(rr, key); + printf("%u", (unsigned int)u16); +} + +static void print_u32(const ares_dns_rr_t *rr, ares_dns_rr_key_t key) +{ + unsigned int u32 = ares_dns_rr_get_u32(rr, key); + printf("%u", u32); +} + +static void print_name(const ares_dns_rr_t *rr, ares_dns_rr_key_t key) +{ + const char *str = ares_dns_rr_get_str(rr, key); + printf("%s.", str); +} + +static void print_str(const ares_dns_rr_t *rr, ares_dns_rr_key_t key) +{ + const char *str = ares_dns_rr_get_str(rr, key); + printf("\"%s\"", str); +} + +static void print_bin(const ares_dns_rr_t *rr, ares_dns_rr_key_t key) +{ + size_t len = 0; + const unsigned char *binp = ares_dns_rr_get_bin(rr, key, &len); + print_opt_bin(binp, len); +} + +static void print_binp(const ares_dns_rr_t *rr, ares_dns_rr_key_t key) +{ + size_t len; + const unsigned char *binp = ares_dns_rr_get_bin(rr, key, &len); + + print_opt_binp(binp, len); +} + +static void print_rr(const ares_dns_rr_t *rr) +{ + const char *name = ares_dns_rr_get_name(rr); + size_t len = 0; + size_t keys_cnt = 0; + ares_dns_rec_type_t rtype = ares_dns_rr_get_type(rr); + const ares_dns_rr_key_t *keys = ares_dns_rr_get_keys(rtype, &keys_cnt); + size_t i; + + if (name == NULL) { + return; + } + + len = strlen(name); + + printf("%s.\t", name); + if (len < 24) { + printf("\t"); + } + + printf("%u\t%s\t%s\t", ares_dns_rr_get_ttl(rr), + ares_dns_class_tostr(ares_dns_rr_get_class(rr)), + ares_dns_rec_type_tostr(rtype)); + + /* Output params here */ + for (i = 0; i < keys_cnt; i++) { + ares_dns_datatype_t datatype = ares_dns_rr_key_datatype(keys[i]); + if (i != 0) { + printf(" "); + } + + switch (datatype) { + case ARES_DATATYPE_INADDR: + print_addr(rr, keys[i]); + break; + case ARES_DATATYPE_INADDR6: + print_addr6(rr, keys[i]); + break; + case ARES_DATATYPE_U8: + print_u8(rr, keys[i]); + break; + case ARES_DATATYPE_U16: + print_u16(rr, keys[i]); + break; + case ARES_DATATYPE_U32: + print_u32(rr, keys[i]); + break; + case ARES_DATATYPE_NAME: + print_name(rr, keys[i]); + break; + case ARES_DATATYPE_STR: + print_str(rr, keys[i]); + break; + case ARES_DATATYPE_BIN: + print_bin(rr, keys[i]); + break; + case ARES_DATATYPE_BINP: + print_binp(rr, keys[i]); + break; + case ARES_DATATYPE_OPT: + print_opts(rr, keys[i]); + break; + } + } + + printf("\n"); +} + +static const ares_dns_rr_t *has_opt(ares_dns_record_t *dnsrec, + ares_dns_section_t section) +{ + size_t i; + for (i = 0; i < ares_dns_record_rr_cnt(dnsrec, section); i++) { + const ares_dns_rr_t *rr = ares_dns_record_rr_get(dnsrec, section, i); + if (ares_dns_rr_get_type(rr) == ARES_REC_TYPE_OPT) { + return rr; + } + } + return NULL; +} + +static void print_section(ares_dns_record_t *dnsrec, ares_dns_section_t section) +{ + size_t i; + + if (ares_dns_record_rr_cnt(dnsrec, section) == 0 || + (ares_dns_record_rr_cnt(dnsrec, section) == 1 && + has_opt(dnsrec, section) != NULL)) { + return; + } + + printf(";; %s SECTION:\n", ares_dns_section_tostr(section)); + for (i = 0; i < ares_dns_record_rr_cnt(dnsrec, section); i++) { + const ares_dns_rr_t *rr = ares_dns_record_rr_get(dnsrec, section, i); + if (ares_dns_rr_get_type(rr) == ARES_REC_TYPE_OPT) { + continue; + } + print_rr(rr); + } + printf("\n"); +} + +static void print_opt_psuedosection(ares_dns_record_t *dnsrec) +{ + const ares_dns_rr_t *rr = has_opt(dnsrec, ARES_SECTION_ADDITIONAL); + if (rr == NULL) { + return; + } + + printf(";; OPT PSEUDOSECTION:\n"); + printf("; EDNS: version: %u, flags: %u; udp: %u\t", + (unsigned int)ares_dns_rr_get_u8(rr, ARES_RR_OPT_VERSION), + (unsigned int)ares_dns_rr_get_u16(rr, ARES_RR_OPT_FLAGS), + (unsigned int)ares_dns_rr_get_u16(rr, ARES_RR_OPT_UDP_SIZE)); + + printf("\n"); +} + +static void callback(void *arg, int status, int timeouts, unsigned char *abuf, + int alen) +{ + ares_dns_record_t *dnsrec = NULL; + (void)arg; + (void)timeouts; + + printf(";; Got answer:"); + if (status != ARES_SUCCESS) { + printf(" %s", ares_strerror(status)); + } + printf("\n"); + + if (abuf == NULL || alen == 0) { + return; + } + + status = (int)ares_dns_parse(abuf, (size_t)alen, 0, &dnsrec); + if (status != ARES_SUCCESS) { + fprintf(stderr, ";; FAILED TO PARSE DNS PACKET: %s\n", + ares_strerror(status)); + return; + } + + print_header(dnsrec); + print_opt_psuedosection(dnsrec); + print_question(dnsrec); + print_section(dnsrec, ARES_SECTION_ANSWER); + print_section(dnsrec, ARES_SECTION_ADDITIONAL); + print_section(dnsrec, ARES_SECTION_AUTHORITY); + + printf(";; MSG SIZE rcvd: %d\n\n", alen); + ares_dns_record_destroy(dnsrec); +} + +static ares_status_t enqueue_query(ares_channel_t *channel, + const adig_config_t *config, + const char *name) +{ + ares_dns_record_t *dnsrec = NULL; + ares_dns_rr_t *rr = NULL; + ares_status_t status; + unsigned char *buf = NULL; + size_t buf_len = 0; + unsigned short flags = 0; + char *nametemp = NULL; + + if (!(config->options.flags & ARES_FLAG_NORECURSE)) { + flags |= ARES_FLAG_RD; + } + + status = ares_dns_record_create(&dnsrec, 0, flags, ARES_OPCODE_QUERY, + ARES_RCODE_NOERROR); + if (status != ARES_SUCCESS) { + goto done; + } + + /* If it is a PTR record, convert from ip address into in-arpa form + * automatically */ + if (config->qtype == ARES_REC_TYPE_PTR) { + struct ares_addr addr; + size_t len; + addr.family = AF_UNSPEC; + + if (ares_dns_pton(name, &addr, &len) != NULL) { + nametemp = ares_dns_addr_to_ptr(&addr); + name = nametemp; + } + } + + status = + ares_dns_record_query_add(dnsrec, name, config->qtype, config->qclass); + if (status != ARES_SUCCESS) { + goto done; + } + + status = ares_dns_record_rr_add(&rr, dnsrec, ARES_SECTION_ADDITIONAL, "", + ARES_REC_TYPE_OPT, ARES_CLASS_IN, 0); + if (status != ARES_SUCCESS) { + goto done; + } + ares_dns_rr_set_u16(rr, ARES_RR_OPT_UDP_SIZE, 1280); + ares_dns_rr_set_u8(rr, ARES_RR_OPT_VERSION, 0); + + status = ares_dns_write(dnsrec, &buf, &buf_len); + if (status != ARES_SUCCESS) { + goto done; + } + + ares_send(channel, buf, (int)buf_len, callback, NULL); + ares_free_string(buf); + +done: + ares_free_string(nametemp); + ares_dns_record_destroy(dnsrec); + return status; +} + +static int event_loop(ares_channel_t *channel) +{ + while (1) { + fd_set read_fds; + fd_set write_fds; + int nfds; + struct timeval tv; + struct timeval *tvp; + int count; + + FD_ZERO(&read_fds); + FD_ZERO(&write_fds); + memset(&tv, 0, sizeof(tv)); + + nfds = ares_fds(channel, &read_fds, &write_fds); + if (nfds == 0) { + break; + } + tvp = ares_timeout(channel, NULL, &tv); + if (tvp == NULL) { + break; + } + count = select(nfds, &read_fds, &write_fds, NULL, tvp); + if (count < 0) { +#ifdef USE_WINSOCK + int err = WSAGetLastError(); +#else + int err = errno; +#endif + if (err != EAGAIN && err != EINTR) { + fprintf(stderr, "select fail: %d", err); + return 1; + } + } + ares_process(channel, &read_fds, &write_fds); + } + return 0; +} + +int main(int argc, char **argv) +{ + ares_channel_t *channel = NULL; + ares_status_t status; + adig_config_t config; + int i; + int rv = 0; + +#ifdef USE_WINSOCK + WORD wVersionRequested = MAKEWORD(USE_WINSOCK, USE_WINSOCK); + WSADATA wsaData; + WSAStartup(wVersionRequested, &wsaData); +#endif + + status = (ares_status_t)ares_library_init(ARES_LIB_INIT_ALL); + if (status != ARES_SUCCESS) { + fprintf(stderr, "ares_library_init: %s\n", ares_strerror((int)status)); + return 1; + } + + memset(&config, 0, sizeof(config)); + config.qclass = ARES_CLASS_IN; + config.qtype = ARES_REC_TYPE_A; + if (!read_cmdline(argc, (const char **)argv, &config)) { + printf("\n** ERROR: %s\n\n", config.error); + print_help(); + rv = 1; + goto done; + } + + if (config.is_help) { + print_help(); + goto done; + } + + status = + (ares_status_t)ares_init_options(&channel, &config.options, config.optmask); + if (status != ARES_SUCCESS) { + fprintf(stderr, "ares_init_options: %s\n", ares_strerror((int)status)); + rv = 1; + goto done; + } + + if (config.servers) { + status = (ares_status_t)ares_set_servers_ports_csv(channel, config.servers); + if (status != ARES_SUCCESS) { + fprintf(stderr, "ares_set_servers_ports_csv: %s\n", + ares_strerror((int)status)); + rv = 1; + goto done; + } + } + + /* Enqueue a query for each separate name */ + for (i = config.args_processed; i < argc; i++) { + status = enqueue_query(channel, &config, argv[i]); + if (status != ARES_SUCCESS) { + fprintf(stderr, "Failed to create query for %s: %s\n", argv[i], + ares_strerror((int)status)); + rv = 1; + goto done; + } + } + + /* Debug */ + printf("\n; <<>> c-ares DiG %s <<>>", ares_version(NULL)); + for (i = config.args_processed; i < argc; i++) { + printf(" %s", argv[i]); + } + printf("\n"); + + /* Process events */ + rv = event_loop(channel); + +done: + free_config(&config); + ares_destroy(channel); + ares_library_cleanup(); + +#ifdef USE_WINSOCK + WSACleanup(); +#endif + return rv; +} diff --git a/lib/c-ares-1.23.0/src/tools/ahost.c b/lib/c-ares-1.23.0/src/tools/ahost.c new file mode 100644 index 00000000000..1f293fc6beb --- /dev/null +++ b/lib/c-ares-1.23.0/src/tools/ahost.c @@ -0,0 +1,247 @@ +/* MIT License + * + * Copyright (c) 1998 Massachusetts Institute of Technology + * Copyright (c) The c-ares project and its contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ + +#include "ares_setup.h" + +#if !defined(WIN32) || defined(WATT32) +# include +# include +# include +#endif + +#ifdef HAVE_STRINGS_H +# include +#endif + +#include "ares.h" +#include "ares_dns.h" +#include "ares_getopt.h" +#include "ares_ipv6.h" + +#ifndef HAVE_STRDUP +# include "ares_strdup.h" +# define strdup(ptr) ares_strdup(ptr) +#endif + +#ifndef HAVE_STRCASECMP +# include "ares_strcasecmp.h" +# define strcasecmp(p1, p2) ares_strcasecmp(p1, p2) +#endif + +#ifndef HAVE_STRNCASECMP +# include "ares_strcasecmp.h" +# define strncasecmp(p1, p2, n) ares_strncasecmp(p1, p2, n) +#endif + +static void callback(void *arg, int status, int timeouts, struct hostent *host); +static void usage(void); +static void print_help_info_ahost(void); + +int main(int argc, char **argv) +{ + struct ares_options options; + int optmask = 0; + ares_channel_t *channel; + int status; + int nfds; + int c; + int addr_family = AF_INET; + fd_set read_fds; + fd_set write_fds; + struct timeval *tvp; + struct timeval tv; + struct in_addr addr4; + struct ares_in6_addr addr6; + ares_getopt_state_t state; + +#ifdef USE_WINSOCK + WORD wVersionRequested = MAKEWORD(USE_WINSOCK, USE_WINSOCK); + WSADATA wsaData; + WSAStartup(wVersionRequested, &wsaData); +#endif + + memset(&options, 0, sizeof(options)); + + status = ares_library_init(ARES_LIB_INIT_ALL); + if (status != ARES_SUCCESS) { + fprintf(stderr, "ares_library_init: %s\n", ares_strerror(status)); + return 1; + } + + ares_getopt_init(&state, argc, (const char **)argv); + while ((c = ares_getopt(&state, "dt:h?s:")) != -1) { + switch (c) { + case 'd': +#ifdef WATT32 + dbug_init(); +#endif + break; + case 's': + optmask |= ARES_OPT_DOMAINS; + options.ndomains++; + options.domains = (char **)realloc( + options.domains, (size_t)options.ndomains * sizeof(char *)); + options.domains[options.ndomains - 1] = strdup(state.optarg); + break; + case 't': + if (!strcasecmp(state.optarg, "a")) { + addr_family = AF_INET; + } else if (!strcasecmp(state.optarg, "aaaa")) { + addr_family = AF_INET6; + } else if (!strcasecmp(state.optarg, "u")) { + addr_family = AF_UNSPEC; + } else { + usage(); + } + break; + case 'h': + print_help_info_ahost(); + break; + case '?': + print_help_info_ahost(); + break; + default: + usage(); + break; + } + } + + argc -= state.optind; + argv += state.optind; + if (argc < 1) { + usage(); + } + + status = ares_init_options(&channel, &options, optmask); + if (status != ARES_SUCCESS) { + fprintf(stderr, "ares_init: %s\n", ares_strerror(status)); + return 1; + } + + /* Initiate the queries, one per command-line argument. */ + for (; *argv; argv++) { + if (ares_inet_pton(AF_INET, *argv, &addr4) == 1) { + ares_gethostbyaddr(channel, &addr4, sizeof(addr4), AF_INET, callback, + *argv); + } else if (ares_inet_pton(AF_INET6, *argv, &addr6) == 1) { + ares_gethostbyaddr(channel, &addr6, sizeof(addr6), AF_INET6, callback, + *argv); + } else { + ares_gethostbyname(channel, *argv, addr_family, callback, *argv); + } + } + + /* Wait for all queries to complete. */ + for (;;) { + int res; + FD_ZERO(&read_fds); + FD_ZERO(&write_fds); + nfds = ares_fds(channel, &read_fds, &write_fds); + if (nfds == 0) { + break; + } + tvp = ares_timeout(channel, NULL, &tv); + if (tvp == NULL) { + break; + } + res = select(nfds, &read_fds, &write_fds, NULL, tvp); + if (-1 == res) { + break; + } + ares_process(channel, &read_fds, &write_fds); + } + + ares_destroy(channel); + + ares_library_cleanup(); + +#ifdef USE_WINSOCK + WSACleanup(); +#endif + + return 0; +} + +static void callback(void *arg, int status, int timeouts, struct hostent *host) +{ + char **p; + + (void)timeouts; + + if (status != ARES_SUCCESS) { + fprintf(stderr, "%s: %s\n", (char *)arg, ares_strerror(status)); + return; + } + + for (p = host->h_addr_list; *p; p++) { + char addr_buf[46] = "??"; + + ares_inet_ntop(host->h_addrtype, *p, addr_buf, sizeof(addr_buf)); + printf("%-32s\t%s", host->h_name, addr_buf); +#if 0 + if (host->h_aliases[0]) + { + int i; + + printf (", Aliases: "); + for (i = 0; host->h_aliases[i]; i++) + printf("%s ", host->h_aliases[i]); + } +#endif + puts(""); + } +} + +static void usage(void) +{ + fprintf( + stderr, + "usage: ahost [-h] [-d] [-s {domain}] [-t {a|aaaa|u}] {host|addr} ...\n"); + exit(1); +} + +/* Information from the man page. Formatting taken from man -h */ +static void print_help_info_ahost(void) +{ + printf("ahost, version %s\n\n", ARES_VERSION_STR); + printf( + "usage: ahost [-h] [-d] [[-s domain] ...] [-t a|aaaa|u] host|addr ...\n\n" + " h : Display this help and exit.\n" + " d : Print some extra debugging output.\n\n" + " s domain : Specify the domain to search instead of using the default " + "values\n" + " from /etc/resolv.conf. This option only has an effect on\n" + " platforms that use /etc/resolv.conf for DNS " + "configuration;\n" + " it has no effect on other platforms (such as Win32 or " + "Android).\n\n" + " t type : If type is \"a\", print the A record (default).\n" + " If type is \"aaaa\", print the AAAA record.\n" + " If type is \"u\", look for either AAAA or A record (in " + "that order).\n\n"); + exit(0); +} diff --git a/lib/c-ares-1.23.0/src/tools/ares_getopt.c b/lib/c-ares-1.23.0/src/tools/ares_getopt.c new file mode 100644 index 00000000000..ad0b8ae8826 --- /dev/null +++ b/lib/c-ares-1.23.0/src/tools/ares_getopt.c @@ -0,0 +1,137 @@ +/* + * Original file name getopt.c Initial import into the c-ares source tree + * on 2007-04-11. Lifted from version 5.2 of the 'Open Mash' project with + * the modified BSD license, BSD license without the advertising clause. + * + */ + +/* + * getopt.c -- + * + * Standard UNIX getopt function. Code is from BSD. + * + * Copyright (c) 1987-2001 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * A. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * B. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * C. Neither the names of the copyright holders nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS + * IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include +#include +#include "ares_getopt.h" + +#define BADCH (int)'?' +#define BADARG (int)':' +#define EMSG (char *)"" + +void ares_getopt_init(ares_getopt_state_t *state, int nargc, const char **nargv) +{ + memset(state, 0, sizeof(*state)); + state->opterr = 1; + state->optind = 1; + state->place = EMSG; + state->argc = nargc; + state->argv = nargv; +} + +/* + * ares_getopt -- + * Parse argc/argv argument vector. + */ +int ares_getopt(ares_getopt_state_t *state, const char *ostr) +{ + const char *oli; /* option letter list index */ + + /* update scanning pointer */ + if (!*state->place) { + if (state->optind >= state->argc) { + return -1; + } + state->place = state->argv[state->optind]; + if (*(state->place) != '-') { + return -1; + } + state->place++; + + /* found "--" */ + if (*(state->place) == '-') { + state->optind++; + return -1; + } + + /* Found just - */ + if (!*(state->place)) { + state->optopt = 0; + return BADCH; + } + } + + /* option letter okay? */ + state->optopt = *(state->place); + state->place++; + oli = strchr(ostr, state->optopt); + + if (oli == NULL) { + if (!(*state->place)) { + ++state->optind; + } + if (state->opterr) { + (void)fprintf(stderr, "%s: illegal option -- %c\n", __FILE__, + state->optopt); + } + return BADCH; + } + + /* don't need argument */ + if (*++oli != ':') { + state->optarg = NULL; + if (!*state->place) { + ++state->optind; + } + } else { + /* need an argument */ + if (*state->place) { /* no white space */ + state->optarg = state->place; + } else if (state->argc <= ++state->optind) { /* no arg */ + state->place = EMSG; + if (*ostr == ':') { + return BADARG; + } + if (state->opterr) { + (void)fprintf(stderr, "%s: option requires an argument -- %c\n", + __FILE__, state->optopt); + } + return BADARG; + } else { /* white space */ + state->optarg = state->argv[state->optind]; + } + state->place = EMSG; + ++state->optind; + } + return state->optopt; /* dump back option letter */ +} diff --git a/lib/c-ares-1.19.1/src/tools/ares_getopt.h b/lib/c-ares-1.23.0/src/tools/ares_getopt.h similarity index 75% rename from lib/c-ares-1.19.1/src/tools/ares_getopt.h rename to lib/c-ares-1.23.0/src/tools/ares_getopt.h index 63acb3b4232..a14f7ab42d4 100644 --- a/lib/c-ares-1.19.1/src/tools/ares_getopt.h +++ b/lib/c-ares-1.23.0/src/tools/ares_getopt.h @@ -28,26 +28,22 @@ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. + * + * SPDX-License-Identifier: BSD-3-Clause */ -int ares_getopt(int nargc, char * const nargv[], const char *ostr); - -#undef optarg -#undef optind -#undef opterr -#undef optopt -#undef optreset - -#define optarg ares_optarg -#define optind ares_optind -#define opterr ares_opterr -#define optopt ares_optopt -#define optreset ares_optreset +typedef struct { + const char *optarg; /* argument associated with option */ + int optind; /* index into parent argv vector */ + int opterr; /* if error message should be printed */ + int optopt; /* character checked for validity */ + const char *place; + int argc; + const char **argv; +} ares_getopt_state_t; -extern char *optarg; -extern int optind; -extern int opterr; -extern int optopt; +void ares_getopt_init(ares_getopt_state_t *state, int argc, const char **argv); +int ares_getopt(ares_getopt_state_t *state, const char *ostr); #endif /* ARES_GETOPT_H */ diff --git a/lib/c-ares-1.19.1/test/CMakeLists.txt b/lib/c-ares-1.23.0/test/CMakeLists.txt similarity index 89% rename from lib/c-ares-1.19.1/test/CMakeLists.txt rename to lib/c-ares-1.23.0/test/CMakeLists.txt index 6f87cd5c687..6b8c4db7252 100644 --- a/lib/c-ares-1.19.1/test/CMakeLists.txt +++ b/lib/c-ares-1.23.0/test/CMakeLists.txt @@ -1,8 +1,10 @@ -set(CMAKE_CXX_STANDARD 11) -set(CMAKE_CXX_STANDARD_REQUIRED TRUE) -set(CMAKE_CXX_EXTENSIONS FALSE) +# Copyright (C) The c-ares project and its contributors +# SPDX-License-Identifier: MIT -enable_language(CXX) +# Get rid of: warning C4530: C++ exception handler used, but unwind semantics are not enabled. Specify /EHsc +IF (MSVC) + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /EHsc") +ENDIF () find_package(Threads) @@ -33,7 +35,6 @@ add_library(gmock STATIC ) target_include_directories(gmock PUBLIC SYSTEM ${GMOCK_DIR}) target_link_libraries(gmock PRIVATE ${CMAKE_THREAD_LIBS_INIT}) - # test targets transform_makefile_inc("Makefile.inc" "${CMAKE_CURRENT_BINARY_DIR}/Makefile.inc.cmake") diff --git a/lib/c-ares-1.19.1/test/Makefile.am b/lib/c-ares-1.23.0/test/Makefile.am similarity index 56% rename from lib/c-ares-1.19.1/test/Makefile.am rename to lib/c-ares-1.23.0/test/Makefile.am index 504e65e468a..01a2fd85df4 100644 --- a/lib/c-ares-1.19.1/test/Makefile.am +++ b/lib/c-ares-1.23.0/test/Makefile.am @@ -1,3 +1,24 @@ +############################################################# +# +# Copyright (C) the Massachusetts Institute of Technology. +# Copyright (C) Daniel Stenberg +# +# 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. +# +# SPDX-License-Identifier: MIT +# +############################################################# + ARES_BLD_DIR = $(top_builddir)/.. ARES_SRC_DIR = $(top_srcdir)/.. @@ -38,12 +59,12 @@ arestest_LDADD = libgmock.la $(ARES_BLD_DIR)/src/lib/libcares.la $(PTHREAD_LIBS) include $(top_srcdir)/aminclude_static.am aresfuzz_SOURCES = $(FUZZSOURCES) -aresfuzz_LDADD = $(ARES_BLD_DIR)/src/lib/libcares.la $(CODE_COVERAGE_LIBS) +aresfuzz_LDADD = $(ARES_BLD_DIR)/src/lib/libcares.la $(PTHREAD_LIBS) $(CODE_COVERAGE_LIBS) aresfuzzname_SOURCES = $(FUZZNAMESOURCES) -aresfuzzname_LDADD = $(ARES_BLD_DIR)/src/lib/libcares.la $(CODE_COVERAGE_LIBS) +aresfuzzname_LDADD = $(ARES_BLD_DIR)/src/lib/libcares.la $(PTHREAD_LIBS) $(CODE_COVERAGE_LIBS) dnsdump_SOURCES = $(DUMPSOURCES) -dnsdump_LDADD = $(ARES_BLD_DIR)/src/lib/libcares.la $(CODE_COVERAGE_LIBS) +dnsdump_LDADD = $(ARES_BLD_DIR)/src/lib/libcares.la $(PTHREAD_LIBS) $(CODE_COVERAGE_LIBS) test: check diff --git a/lib/c-ares-1.19.1/test/Makefile.in b/lib/c-ares-1.23.0/test/Makefile.in similarity index 97% rename from lib/c-ares-1.19.1/test/Makefile.in rename to lib/c-ares-1.23.0/test/Makefile.in index b4c9d24faba..764c68de619 100644 --- a/lib/c-ares-1.19.1/test/Makefile.in +++ b/lib/c-ares-1.23.0/test/Makefile.in @@ -14,8 +14,29 @@ @SET_MAKE@ +############################################################# +# +# Copyright (C) the Massachusetts Institute of Technology. +# Copyright (C) Daniel Stenberg +# +# 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. +# +# SPDX-License-Identifier: MIT +# +############################################################# + # aminclude_static.am generated automatically by Autoconf -# from AX_AM_MACROS_STATIC on Mon May 22 13:36:05 CEST 2023 +# from AX_AM_MACROS_STATIC on Thu Nov 30 13:40:38 CET 2023 VPATH = @srcdir@ @@ -140,12 +161,12 @@ am_aresfuzz_OBJECTS = $(am__objects_1) aresfuzz_OBJECTS = $(am_aresfuzz_OBJECTS) am__DEPENDENCIES_1 = aresfuzz_DEPENDENCIES = $(ARES_BLD_DIR)/src/lib/libcares.la \ - $(am__DEPENDENCIES_1) + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am__objects_2 = ares-test-fuzz-name.$(OBJEXT) ares-fuzz.$(OBJEXT) am_aresfuzzname_OBJECTS = $(am__objects_2) aresfuzzname_OBJECTS = $(am_aresfuzzname_OBJECTS) aresfuzzname_DEPENDENCIES = $(ARES_BLD_DIR)/src/lib/libcares.la \ - $(am__DEPENDENCIES_1) + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am__objects_3 = ares-test-main.$(OBJEXT) ares-test-init.$(OBJEXT) \ ares-test.$(OBJEXT) ares-test-ns.$(OBJEXT) \ ares-test-parse.$(OBJEXT) ares-test-parse-a.$(OBJEXT) \ @@ -169,7 +190,7 @@ am__objects_5 = dns-proto.$(OBJEXT) dns-dump.$(OBJEXT) am_dnsdump_OBJECTS = $(am__objects_5) dnsdump_OBJECTS = $(am_dnsdump_OBJECTS) dnsdump_DEPENDENCIES = $(ARES_BLD_DIR)/src/lib/libcares.la \ - $(am__DEPENDENCIES_1) + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false @@ -651,6 +672,9 @@ ARES_BLD_DIR = $(top_builddir)/.. ARES_SRC_DIR = $(top_srcdir)/.. AUTOMAKE_OPTIONS = foreign subdir-objects nostdinc 1.9.6 ACLOCAL_AMFLAGS = -I ../m4 --install + +# Copyright (C) The c-ares project and its contributors +# SPDX-License-Identifier: MIT TESTSOURCES = ares-test-main.cc \ ares-test-init.cc \ ares-test.cc \ @@ -719,11 +743,11 @@ arestest_LDADD = libgmock.la $(ARES_BLD_DIR)/src/lib/libcares.la $(PTHREAD_LIBS) @CODE_COVERAGE_ENABLED_TRUE@code_coverage_sanitize = $(subst -,_,$(subst .,_,$(1))) @CODE_COVERAGE_ENABLED_TRUE@AM_DISTCHECK_CONFIGURE_FLAGS := $(AM_DISTCHECK_CONFIGURE_FLAGS) --disable-code-coverage aresfuzz_SOURCES = $(FUZZSOURCES) -aresfuzz_LDADD = $(ARES_BLD_DIR)/src/lib/libcares.la $(CODE_COVERAGE_LIBS) +aresfuzz_LDADD = $(ARES_BLD_DIR)/src/lib/libcares.la $(PTHREAD_LIBS) $(CODE_COVERAGE_LIBS) aresfuzzname_SOURCES = $(FUZZNAMESOURCES) -aresfuzzname_LDADD = $(ARES_BLD_DIR)/src/lib/libcares.la $(CODE_COVERAGE_LIBS) +aresfuzzname_LDADD = $(ARES_BLD_DIR)/src/lib/libcares.la $(PTHREAD_LIBS) $(CODE_COVERAGE_LIBS) dnsdump_SOURCES = $(DUMPSOURCES) -dnsdump_LDADD = $(ARES_BLD_DIR)/src/lib/libcares.la $(CODE_COVERAGE_LIBS) +dnsdump_LDADD = $(ARES_BLD_DIR)/src/lib/libcares.la $(PTHREAD_LIBS) $(CODE_COVERAGE_LIBS) all: config.h $(MAKE) $(AM_MAKEFLAGS) all-am diff --git a/lib/c-ares-1.19.1/test/Makefile.inc b/lib/c-ares-1.23.0/test/Makefile.inc similarity index 90% rename from lib/c-ares-1.19.1/test/Makefile.inc rename to lib/c-ares-1.23.0/test/Makefile.inc index 820afdb2934..8ef4f8e3097 100644 --- a/lib/c-ares-1.19.1/test/Makefile.inc +++ b/lib/c-ares-1.23.0/test/Makefile.inc @@ -1,3 +1,5 @@ +# Copyright (C) The c-ares project and its contributors +# SPDX-License-Identifier: MIT TESTSOURCES = ares-test-main.cc \ ares-test-init.cc \ ares-test.cc \ diff --git a/lib/c-ares-1.19.1/test/Makefile.m32 b/lib/c-ares-1.23.0/test/Makefile.m32 similarity index 91% rename from lib/c-ares-1.19.1/test/Makefile.m32 rename to lib/c-ares-1.23.0/test/Makefile.m32 index 8300dfa1533..9a2de589761 100644 --- a/lib/c-ares-1.19.1/test/Makefile.m32 +++ b/lib/c-ares-1.23.0/test/Makefile.m32 @@ -1,7 +1,9 @@ ############################################################# +# Copyright (C) The c-ares project and its contributors +# SPDX-License-Identifier: MIT # -## Makefile for building arestest.exe with MingW32 (GCC-3.2) -## Use: make -f Makefile.m32 +# Makefile for building arestest.exe with MingW32 (GCC-3.2) +# Use: make -f Makefile.m32 # ######################################################## CXX = g++ diff --git a/lib/c-ares-1.19.1/test/Makefile.msvc b/lib/c-ares-1.23.0/test/Makefile.msvc similarity index 97% rename from lib/c-ares-1.19.1/test/Makefile.msvc rename to lib/c-ares-1.23.0/test/Makefile.msvc index 39939c8dcd1..1e0accd3d6b 100644 --- a/lib/c-ares-1.19.1/test/Makefile.msvc +++ b/lib/c-ares-1.23.0/test/Makefile.msvc @@ -1,3 +1,6 @@ +# Copyright (C) The c-ares project and its contributors +# SPDX-License-Identifier: MIT +# # 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 @@ -302,9 +305,9 @@ ALL: arestest aresfuzz aresfuzzname dnsdump @ test: arestest - $(PROG_OUTDIR)\arestest + $(PROG_OUTDIR)\arestest -4 --gtest_filter=-*LiveSearchTXT*:*LiveSearchANY*:*LiveGetLocalhostByAddr* vtest: arestest - $(PROG_OUTDIR)\arestest -v + $(PROG_OUTDIR)\arestest -4 -v --gtest_filter=-*LiveSearchTXT*:*LiveSearchANY*:*LiveGetLocalhostByAddr* arestest: $(TESTSOURCES) $(PROG_OUTDIR) $(PROG_OBJDIR) $(PROG_OBJS) $(GMOCK_GTEST_OBJ) $(SPROG_LINK) $(SPROG_LFLAGS) /out:$(PROG_OUTDIR)\arestest.exe $(PROG_OBJS) $(GMOCK_GTEST_OBJ) diff --git a/lib/c-ares-1.19.1/test/README.md b/lib/c-ares-1.23.0/test/README.md similarity index 99% rename from lib/c-ares-1.19.1/test/README.md rename to lib/c-ares-1.23.0/test/README.md index 98814467842..6a864767c39 100644 --- a/lib/c-ares-1.19.1/test/README.md +++ b/lib/c-ares-1.23.0/test/README.md @@ -1,7 +1,6 @@ c-ares Unit Test Suite ====================== - This directory holds unit tests for the c-ares library. To build the tests: - Build the main c-ares library first, in the directory above this. To diff --git a/lib/c-ares-1.19.1/test/aclocal.m4 b/lib/c-ares-1.23.0/test/aclocal.m4 similarity index 100% rename from lib/c-ares-1.19.1/test/aclocal.m4 rename to lib/c-ares-1.23.0/test/aclocal.m4 diff --git a/lib/c-ares-1.19.1/aminclude_static.am b/lib/c-ares-1.23.0/test/aminclude_static.am similarity index 99% rename from lib/c-ares-1.19.1/aminclude_static.am rename to lib/c-ares-1.23.0/test/aminclude_static.am index 94db7e3a8c6..129be1dcc6b 100644 --- a/lib/c-ares-1.19.1/aminclude_static.am +++ b/lib/c-ares-1.23.0/test/aminclude_static.am @@ -1,6 +1,6 @@ # aminclude_static.am generated automatically by Autoconf -# from AX_AM_MACROS_STATIC on Mon May 22 14:23:05 CEST 2023 +# from AX_AM_MACROS_STATIC on Thu Nov 30 13:40:38 CET 2023 # Code coverage diff --git a/lib/c-ares-1.23.0/test/ares-fuzz.c b/lib/c-ares-1.23.0/test/ares-fuzz.c new file mode 100644 index 00000000000..66d63007da9 --- /dev/null +++ b/lib/c-ares-1.23.0/test/ares-fuzz.c @@ -0,0 +1,86 @@ +/* + * Copyright (C) The c-ares project + * + * 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. + * + * SPDX-License-Identifier: MIT + */ +/* + * General driver to allow command-line fuzzer (i.e. afl) to + * exercise the libFuzzer entrypoint. + */ + +#include +#include +#include +#include +#include +#ifdef WIN32 +# include +#else +# include +#endif + +#include "ares.h" + +#define kMaxAflInputSize (1 << 20) +static unsigned char afl_buffer[kMaxAflInputSize]; + +#ifdef __AFL_LOOP +/* If we are built with afl-clang-fast, use persistent mode */ +# define KEEP_FUZZING(count) __AFL_LOOP(1000) +#else +/* If we are built with afl-clang, execute each input once */ +# define KEEP_FUZZING(count) ((count) < 1) +#endif + +/* In ares-test-fuzz.c and ares-test-fuzz-name.c: */ +int LLVMFuzzerTestOneInput(const unsigned char *data, unsigned long size); + +static void ProcessFile(int fd) +{ + ares_ssize_t count = read(fd, afl_buffer, kMaxAflInputSize); + /* + * Make a copy of the data so that it's not part of a larger + * buffer (where buffer overflows would go unnoticed). + */ + if (count > 0) { + unsigned char *copied_data = (unsigned char *)malloc((size_t)count); + memcpy(copied_data, afl_buffer, (size_t)count); + LLVMFuzzerTestOneInput(copied_data, (size_t)count); + free(copied_data); + } +} + +int main(int argc, char *argv[]) +{ + if (argc == 1) { + int count = 0; + while (KEEP_FUZZING(count)) { + ProcessFile(fileno(stdin)); + count++; + } + } else { + int ii; + for (ii = 1; ii < argc; ++ii) { + int fd = open(argv[ii], O_RDONLY); + if (fd < 0) { + fprintf(stderr, "Failed to open '%s'\n", argv[ii]); + continue; + } + ProcessFile(fd); + close(fd); + } + } + return 0; +} diff --git a/lib/c-ares-1.23.0/test/ares-test-ai.h b/lib/c-ares-1.23.0/test/ares-test-ai.h new file mode 100644 index 00000000000..b6955cbdfc1 --- /dev/null +++ b/lib/c-ares-1.23.0/test/ares-test-ai.h @@ -0,0 +1,80 @@ +/* + * Copyright (C) The c-ares project + * + * 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. + * + * SPDX-License-Identifier: MIT + */ +#ifndef ARES_TEST_AI_H +#define ARES_TEST_AI_H + +#include +#include "gtest/gtest.h" +#include "gmock/gmock.h" +#include "ares-test.h" + +namespace ares { +namespace test { + +class MockChannelTestAI + : public MockChannelOptsTest, + public ::testing::WithParamInterface> { +public: + MockChannelTestAI() + : MockChannelOptsTest(1, GetParam().first, GetParam().second, nullptr, 0) + { + } +}; + +class MockUDPChannelTestAI : public MockChannelOptsTest, + public ::testing::WithParamInterface { +public: + MockUDPChannelTestAI() : MockChannelOptsTest(1, GetParam(), false, nullptr, 0) + { + } +}; + +class MockTCPChannelTestAI : public MockChannelOptsTest, + public ::testing::WithParamInterface { +public: + MockTCPChannelTestAI() : MockChannelOptsTest(1, GetParam(), true, nullptr, 0) + { + } +}; + +// Test fixture that uses a default channel. +class DefaultChannelTestAI : public LibraryTest { +public: + DefaultChannelTestAI() : channel_(nullptr) + { + EXPECT_EQ(ARES_SUCCESS, ares_init(&channel_)); + EXPECT_NE(nullptr, channel_); + } + + ~DefaultChannelTestAI() + { + ares_destroy(channel_); + channel_ = nullptr; + } + + // Process all pending work on ares-owned file descriptors. + void Process(); + +protected: + ares_channel_t *channel_; +}; + +} // namespace test +} // namespace ares + +#endif diff --git a/lib/c-ares-1.23.0/test/ares-test-fuzz-name.c b/lib/c-ares-1.23.0/test/ares-test-fuzz-name.c new file mode 100644 index 00000000000..cc7763fb656 --- /dev/null +++ b/lib/c-ares-1.23.0/test/ares-test-fuzz-name.c @@ -0,0 +1,42 @@ +/* + * Copyright (C) The c-ares project + * + * 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. + * + * SPDX-License-Identifier: MIT + */ +#include +#include +#include + +#include "ares.h" +// Include ares internal file for DNS protocol constants +#include "ares_nameser.h" + +int LLVMFuzzerTestOneInput(const unsigned char *data, unsigned long size); + +// Entrypoint for Clang's libfuzzer, exercising query creation. +int LLVMFuzzerTestOneInput(const unsigned char *data, unsigned long size) +{ + // Null terminate the data. + char *name = malloc(size + 1); + unsigned char *buf = NULL; + int buflen = 0; + name[size] = '\0'; + memcpy(name, data, size); + + ares_create_query(name, C_IN, T_AAAA, 1234, 0, &buf, &buflen, 1024); + free(buf); + free(name); + return 0; +} diff --git a/lib/c-ares-1.23.0/test/ares-test-fuzz.c b/lib/c-ares-1.23.0/test/ares-test-fuzz.c new file mode 100644 index 00000000000..f104e34d32d --- /dev/null +++ b/lib/c-ares-1.23.0/test/ares-test-fuzz.c @@ -0,0 +1,100 @@ +/* + * Copyright (C) The c-ares project + * + * 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. + * + * SPDX-License-Identifier: MIT + */ +#include + +#include "ares.h" + +int LLVMFuzzerTestOneInput(const unsigned char *data, unsigned long size); + +// Entrypoint for Clang's libfuzzer +int LLVMFuzzerTestOneInput(const unsigned char *data, unsigned long size) +{ + // Feed the data into each of the ares_parse_*_reply functions. + struct hostent *host = NULL; + struct ares_addrttl info[5]; + struct ares_addr6ttl info6[5]; + unsigned char addrv4[4] = { 0x10, 0x20, 0x30, 0x40 }; + struct ares_srv_reply *srv = NULL; + struct ares_mx_reply *mx = NULL; + struct ares_txt_reply *txt = NULL; + struct ares_soa_reply *soa = NULL; + struct ares_naptr_reply *naptr = NULL; + struct ares_caa_reply *caa = NULL; + struct ares_uri_reply *uri = NULL; + int count = 5; + ares_parse_a_reply(data, (int)size, &host, info, &count); + if (host) { + ares_free_hostent(host); + } + + host = NULL; + count = 5; + ares_parse_aaaa_reply(data, (int)size, &host, info6, &count); + if (host) { + ares_free_hostent(host); + } + + host = NULL; + ares_parse_ptr_reply(data, (int)size, addrv4, sizeof(addrv4), AF_INET, &host); + if (host) { + ares_free_hostent(host); + } + + host = NULL; + ares_parse_ns_reply(data, (int)size, &host); + if (host) { + ares_free_hostent(host); + } + + ares_parse_srv_reply(data, (int)size, &srv); + if (srv) { + ares_free_data(srv); + } + + ares_parse_mx_reply(data, (int)size, &mx); + if (mx) { + ares_free_data(mx); + } + + ares_parse_txt_reply(data, (int)size, &txt); + if (txt) { + ares_free_data(txt); + } + + ares_parse_soa_reply(data, (int)size, &soa); + if (soa) { + ares_free_data(soa); + } + + ares_parse_naptr_reply(data, (int)size, &naptr); + if (naptr) { + ares_free_data(naptr); + } + + ares_parse_caa_reply(data, (int)size, &caa); + if (caa) { + ares_free_data(caa); + } + + ares_parse_uri_reply(data, (int)size, &uri); + if (uri) { + ares_free_data(uri); + } + + return 0; +} diff --git a/lib/c-ares-1.19.1/test/ares-test-init.cc b/lib/c-ares-1.23.0/test/ares-test-init.cc similarity index 81% rename from lib/c-ares-1.19.1/test/ares-test-init.cc rename to lib/c-ares-1.23.0/test/ares-test-init.cc index ee845181459..46baff95105 100644 --- a/lib/c-ares-1.19.1/test/ares-test-init.cc +++ b/lib/c-ares-1.23.0/test/ares-test-init.cc @@ -1,5 +1,26 @@ +/* + * Copyright (C) The c-ares project + * + * 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. + * + * SPDX-License-Identifier: MIT + */ #include "ares-test.h" +extern "C" { + #include "ares_private.h" +} + // library initialization is only needed for windows builds #ifdef WIN32 #define EXPECTED_NONINIT ARES_ENOTINITIALIZED @@ -45,7 +66,7 @@ TEST(LibraryInit, Nested) { TEST(LibraryInit, BasicChannelInit) { EXPECT_EQ(ARES_SUCCESS, ares_library_init(ARES_LIB_INIT_ALL)); - ares_channel channel = nullptr; + ares_channel_t *channel = nullptr; EXPECT_EQ(ARES_SUCCESS, ares_init(&channel)); EXPECT_NE(nullptr, channel); ares_destroy(channel); @@ -53,8 +74,9 @@ TEST(LibraryInit, BasicChannelInit) { } TEST_F(LibraryTest, OptionsChannelInit) { - struct ares_options opts = {0}; + struct ares_options opts; int optmask = 0; + memset(&opts, 0, sizeof(opts)); opts.flags = ARES_FLAG_USEVC | ARES_FLAG_PRIMARY; optmask |= ARES_OPT_FLAGS; opts.timeout = 2000; @@ -64,6 +86,8 @@ TEST_F(LibraryTest, OptionsChannelInit) { opts.ndots = 4; optmask |= ARES_OPT_NDOTS; opts.udp_port = 54; + optmask |= ARES_OPT_MAXTIMEOUTMS; + opts.maxtimeout = 10000; optmask |= ARES_OPT_UDP_PORT; opts.tcp_port = 54; optmask |= ARES_OPT_TCP_PORT; @@ -74,12 +98,12 @@ TEST_F(LibraryTest, OptionsChannelInit) { opts.ednspsz = 1280; optmask |= ARES_OPT_EDNSPSZ; opts.nservers = 2; - opts.servers = (struct in_addr *)malloc(opts.nservers * sizeof(struct in_addr)); + opts.servers = (struct in_addr *)malloc((size_t)opts.nservers * sizeof(struct in_addr)); opts.servers[0].s_addr = htonl(0x01020304); opts.servers[1].s_addr = htonl(0x02030405); optmask |= ARES_OPT_SERVERS; opts.ndomains = 2; - opts.domains = (char **)malloc(opts.ndomains * sizeof(char *)); + opts.domains = (char **)malloc((size_t)opts.ndomains * sizeof(char *)); opts.domains[0] = strdup("example.com"); opts.domains[1] = strdup("example2.com"); optmask |= ARES_OPT_DOMAINS; @@ -91,15 +115,17 @@ TEST_F(LibraryTest, OptionsChannelInit) { opts.hosts_path = strdup("/etc/hosts"); optmask |= ARES_OPT_HOSTS_FILE; - ares_channel channel = nullptr; + ares_channel_t *channel = nullptr; EXPECT_EQ(ARES_SUCCESS, ares_init_options(&channel, &opts, optmask)); EXPECT_NE(nullptr, channel); - ares_channel channel2 = nullptr; + ares_channel_t *channel2 = nullptr; EXPECT_EQ(ARES_SUCCESS, ares_dup(&channel2, channel)); + EXPECT_NE(nullptr, channel2); - struct ares_options opts2 = {0}; + struct ares_options opts2; int optmask2 = 0; + memset(&opts2, 0, sizeof(opts2)); EXPECT_EQ(ARES_SUCCESS, ares_save_options(channel2, &opts2, &optmask2)); // Note that not all opts-settable fields are saved (e.g. @@ -108,6 +134,7 @@ TEST_F(LibraryTest, OptionsChannelInit) { EXPECT_EQ(opts.timeout, opts2.timeout); EXPECT_EQ(opts.tries, opts2.tries); EXPECT_EQ(opts.ndots, opts2.ndots); + EXPECT_EQ(opts.maxtimeout, opts2.maxtimeout); EXPECT_EQ(opts.udp_port, opts2.udp_port); EXPECT_EQ(opts.tcp_port, opts2.tcp_port); EXPECT_EQ(1, opts2.nservers); // Truncated by ARES_FLAG_PRIMARY @@ -126,7 +153,7 @@ TEST_F(LibraryTest, OptionsChannelInit) { } TEST_F(LibraryTest, ChannelAllocFail) { - ares_channel channel; + ares_channel_t *channel; for (int ii = 1; ii <= 25; ii++) { ClearFails(); SetAllocFail(ii); @@ -142,8 +169,9 @@ TEST_F(LibraryTest, ChannelAllocFail) { } TEST_F(LibraryTest, OptionsChannelAllocFail) { - struct ares_options opts = {0}; + struct ares_options opts; int optmask = 0; + memset(&opts, 0, sizeof(opts)); opts.flags = ARES_FLAG_USEVC; optmask |= ARES_OPT_FLAGS; opts.timeout = 2; @@ -163,12 +191,12 @@ TEST_F(LibraryTest, OptionsChannelAllocFail) { opts.ednspsz = 1280; optmask |= ARES_OPT_EDNSPSZ; opts.nservers = 2; - opts.servers = (struct in_addr *)malloc(opts.nservers * sizeof(struct in_addr)); + opts.servers = (struct in_addr *)malloc((size_t)opts.nservers * sizeof(struct in_addr)); opts.servers[0].s_addr = htonl(0x01020304); opts.servers[1].s_addr = htonl(0x02030405); optmask |= ARES_OPT_SERVERS; opts.ndomains = 2; - opts.domains = (char **)malloc(opts.ndomains * sizeof(char *)); + opts.domains = (char **)malloc((size_t)opts.ndomains * sizeof(char *)); opts.domains[0] = strdup("example.com"); opts.domains[1] = strdup("example2.com"); optmask |= ARES_OPT_DOMAINS; @@ -180,7 +208,7 @@ TEST_F(LibraryTest, OptionsChannelAllocFail) { opts.hosts_path = strdup("/etc/hosts"); optmask |= ARES_OPT_HOSTS_FILE; - ares_channel channel = nullptr; + ares_channel_t *channel = nullptr; for (int ii = 1; ii <= 8; ii++) { ClearFails(); SetAllocFail(ii); @@ -203,7 +231,7 @@ TEST_F(LibraryTest, OptionsChannelAllocFail) { ares_set_servers_csv(channel, "1.2.3.4,0102:0304:0506:0708:0910:1112:1314:1516,2.3.4.5")); EXPECT_EQ(ARES_SUCCESS, ares_set_sortlist(channel, "1.2.3.4 2.3.4.5")); - ares_channel channel2 = nullptr; + ares_channel_t *channel2 = nullptr; for (int ii = 1; ii <= 18; ii++) { ClearFails(); SetAllocFail(ii); @@ -232,7 +260,7 @@ TEST_F(LibraryTest, FailChannelInit) { &LibraryTest::afree, &LibraryTest::arealloc)); SetAllocFail(1); - ares_channel channel = nullptr; + ares_channel_t *channel = nullptr; EXPECT_EQ(ARES_ENOMEM, ares_init(&channel)); EXPECT_EQ(nullptr, channel); ares_library_cleanup(); @@ -240,15 +268,34 @@ TEST_F(LibraryTest, FailChannelInit) { #ifndef WIN32 TEST_F(LibraryTest, EnvInit) { - ares_channel channel = nullptr; + ares_channel_t *channel = nullptr; EnvValue v1("LOCALDOMAIN", "this.is.local"); EnvValue v2("RES_OPTIONS", "options debug ndots:3 retry:3 rotate retrans:2"); EXPECT_EQ(ARES_SUCCESS, ares_init(&channel)); ares_destroy(channel); } +TEST_F(LibraryTest, EnvInitModernOptions) { + ares_channel_t *channel = nullptr; + EnvValue v1("LOCALDOMAIN", "this.is.local"); + EnvValue v2("RES_OPTIONS", "options debug retrans:2 ndots:3 attempts:4 timeout:5 rotate"); + EXPECT_EQ(ARES_SUCCESS, ares_init(&channel)); + + channel->optmask |= ARES_OPT_TRIES; + channel->optmask |= ARES_OPT_TIMEOUTMS; + + struct ares_options opts; + memset(&opts, 0, sizeof(opts)); + int optmask = 0; + EXPECT_EQ(ARES_SUCCESS, ares_save_options(channel, &opts, &optmask)); + EXPECT_EQ(5000, opts.timeout); + EXPECT_EQ(4, opts.tries); + + ares_destroy(channel); +} + TEST_F(LibraryTest, EnvInitAllocFail) { - ares_channel channel; + ares_channel_t *channel; EnvValue v1("LOCALDOMAIN", "this.is.local"); EnvValue v2("RES_OPTIONS", "options debug ndots:3 retry:3 rotate retrans:2"); for (int ii = 1; ii <= 10; ii++) { @@ -277,6 +324,8 @@ TEST_F(DefaultChannelTest, SetSortlistFailures) { EXPECT_EQ(ARES_ENODATA, ares_set_sortlist(nullptr, "1.2.3.4")); EXPECT_EQ(ARES_EBADSTR, ares_set_sortlist(channel_, "111.111.111.111*/16")); EXPECT_EQ(ARES_EBADSTR, ares_set_sortlist(channel_, "111.111.111.111/255.255.255.240*")); + EXPECT_EQ(ARES_EBADSTR, ares_set_sortlist(channel_, "1 0123456789012345")); + EXPECT_EQ(ARES_EBADSTR, ares_set_sortlist(channel_, "1 /01234567890123456789012345678901")); EXPECT_EQ(ARES_SUCCESS, ares_set_sortlist(channel_, "xyzzy ; lwk")); EXPECT_EQ(ARES_SUCCESS, ares_set_sortlist(channel_, "xyzzy ; 0x123")); } @@ -300,7 +349,7 @@ TEST_F(DefaultChannelTest, SetSortlistAllocFail) { #ifdef USE_WINSOCK TEST(Init, NoLibraryInit) { - ares_channel channel = nullptr; + ares_channel_t *channel = nullptr; EXPECT_EQ(ARES_ENOTINITIALIZED, ares_init(&channel)); } #endif @@ -340,19 +389,14 @@ NameContentList filelist = { {"/etc/nsswitch.conf", "hosts: files\n"}}; CONTAINED_TEST_F(LibraryTest, ContainerChannelInit, "myhostname", "mydomainname.org", filelist) { - ares_channel channel = nullptr; + ares_channel_t *channel = nullptr; EXPECT_EQ(ARES_SUCCESS, ares_init(&channel)); std::vector actual = GetNameServers(channel); - std::vector expected = {"1.2.3.4"}; + std::vector expected = {"1.2.3.4:53"}; EXPECT_EQ(expected, actual); - - struct ares_options opts; - int optmask = 0; - ares_save_options(channel, &opts, &optmask); - EXPECT_EQ(2, opts.ndomains); - EXPECT_EQ(std::string("first.com"), std::string(opts.domains[0])); - EXPECT_EQ(std::string("second.com"), std::string(opts.domains[1])); - ares_destroy_options(&opts); + EXPECT_EQ(2, channel->ndomains); + EXPECT_EQ(std::string("first.com"), std::string(channel->domains[0])); + EXPECT_EQ(std::string("second.com"), std::string(channel->domains[1])); HostResult result; ares_gethostbyname(channel, "ahostname.com", AF_INET, HostCallback, &result); @@ -360,6 +404,7 @@ CONTAINED_TEST_F(LibraryTest, ContainerChannelInit, EXPECT_TRUE(result.done_); std::stringstream ss; ss << result.host_; + EXPECT_EQ("{'ahostname.com' aliases=[] addrs=[3.4.5.6]}", ss.str()); ares_destroy(channel); @@ -368,7 +413,7 @@ CONTAINED_TEST_F(LibraryTest, ContainerChannelInit, CONTAINED_TEST_F(LibraryTest, ContainerSortlistOptionInit, "myhostname", "mydomainname.org", filelist) { - ares_channel channel = nullptr; + ares_channel_t *channel = nullptr; struct ares_options opts = {0}; int optmask = 0; optmask |= ARES_OPT_SORTLIST; @@ -376,11 +421,9 @@ CONTAINED_TEST_F(LibraryTest, ContainerSortlistOptionInit, // Explicitly specifying an empty sortlist in the options should override the // environment. EXPECT_EQ(ARES_SUCCESS, ares_init_options(&channel, &opts, optmask)); - ares_save_options(channel, &opts, &optmask); - EXPECT_EQ(0, opts.nsort); - EXPECT_EQ(nullptr, opts.sortlist); - EXPECT_EQ(ARES_OPT_SORTLIST, (optmask & ARES_OPT_SORTLIST)); - ares_destroy_options(&opts); + EXPECT_EQ(0, channel->nsort); + EXPECT_EQ(nullptr, channel->sortlist); + EXPECT_EQ(ARES_OPT_SORTLIST, (channel->optmask & ARES_OPT_SORTLIST)); ares_destroy(channel); return HasFailure(); @@ -394,15 +437,11 @@ NameContentList fullresolv = { "sortlist 1.2.3.4/16 2.3.4.5\n"}}; CONTAINED_TEST_F(LibraryTest, ContainerFullResolvInit, "myhostname", "mydomainname.org", fullresolv) { - ares_channel channel = nullptr; + ares_channel_t *channel = nullptr; EXPECT_EQ(ARES_SUCCESS, ares_init(&channel)); - struct ares_options opts; - int optmask = 0; - ares_save_options(channel, &opts, &optmask); - EXPECT_EQ(std::string("b"), std::string(opts.lookups)); - EXPECT_EQ(5, opts.ndots); - ares_destroy_options(&opts); + EXPECT_EQ(std::string("b"), std::string(channel->lookups)); + EXPECT_EQ(5, channel->ndots); ares_destroy(channel); return HasFailure(); @@ -418,7 +457,7 @@ NameContentList myresolvconf = { CONTAINED_TEST_F(LibraryTest, ContainerMyResolvConfInit, "myhostname", "mydomain.org", myresolvconf) { char filename[] = "/tmp/myresolv.cnf"; - ares_channel channel = nullptr; + ares_channel_t *channel = nullptr; struct ares_options options = {0}; options.resolvconf_path = strdup(filename); int optmask = ARES_OPT_RESOLVCONF; @@ -444,7 +483,7 @@ NameContentList myhosts = { CONTAINED_TEST_F(LibraryTest, ContainerMyHostsInit, "myhostname", "mydomain.org", myhosts) { char filename[] = "/tmp/hosts"; - ares_channel channel = nullptr; + ares_channel_t *channel = nullptr; struct ares_options options = {0}; options.hosts_path = strdup(filename); int optmask = ARES_OPT_HOSTS_FILE; @@ -470,14 +509,10 @@ NameContentList hostconf = { {"/etc/host.conf", "order bind hosts\n"}}; CONTAINED_TEST_F(LibraryTest, ContainerHostConfInit, "myhostname", "mydomainname.org", hostconf) { - ares_channel channel = nullptr; + ares_channel_t *channel = nullptr; EXPECT_EQ(ARES_SUCCESS, ares_init(&channel)); - struct ares_options opts; - int optmask = 0; - ares_save_options(channel, &opts, &optmask); - EXPECT_EQ(std::string("bf"), std::string(opts.lookups)); - ares_destroy_options(&opts); + EXPECT_EQ(std::string("bf"), std::string(channel->lookups)); ares_destroy(channel); return HasFailure(); @@ -489,14 +524,10 @@ NameContentList svcconf = { {"/etc/svc.conf", "hosts= bind\n"}}; CONTAINED_TEST_F(LibraryTest, ContainerSvcConfInit, "myhostname", "mydomainname.org", svcconf) { - ares_channel channel = nullptr; + ares_channel_t *channel = nullptr; EXPECT_EQ(ARES_SUCCESS, ares_init(&channel)); - struct ares_options opts; - int optmask = 0; - ares_save_options(channel, &opts, &optmask); - EXPECT_EQ(std::string("b"), std::string(opts.lookups)); - ares_destroy_options(&opts); + EXPECT_EQ(std::string("b"), std::string(channel->lookups)); ares_destroy(channel); return HasFailure(); @@ -507,14 +538,10 @@ NameContentList malformedresolvconflookup = { "lookup garbage\n"}}; // malformed line CONTAINED_TEST_F(LibraryTest, ContainerMalformedResolvConfLookup, "myhostname", "mydomainname.org", malformedresolvconflookup) { - ares_channel channel = nullptr; + ares_channel_t *channel = nullptr; EXPECT_EQ(ARES_SUCCESS, ares_init(&channel)); - struct ares_options opts; - int optmask = 0; - ares_save_options(channel, &opts, &optmask); - EXPECT_EQ(std::string("fb"), std::string(opts.lookups)); - ares_destroy_options(&opts); + EXPECT_EQ(std::string("fb"), std::string(channel->lookups)); ares_destroy(channel); return HasFailure(); @@ -534,7 +561,7 @@ class MakeUnreadable { CONTAINED_TEST_F(LibraryTest, ContainerResolvConfNotReadable, "myhostname", "mydomainname.org", filelist) { - ares_channel channel = nullptr; + ares_channel_t *channel = nullptr; MakeUnreadable hide("/etc/resolv.conf"); // Unavailable /etc/resolv.conf falls back to defaults EXPECT_EQ(ARES_SUCCESS, ares_init(&channel)); @@ -542,23 +569,19 @@ CONTAINED_TEST_F(LibraryTest, ContainerResolvConfNotReadable, } CONTAINED_TEST_F(LibraryTest, ContainerNsswitchConfNotReadable, "myhostname", "mydomainname.org", filelist) { - ares_channel channel = nullptr; + ares_channel_t *channel = nullptr; // Unavailable /etc/nsswitch.conf falls back to defaults. MakeUnreadable hide("/etc/nsswitch.conf"); EXPECT_EQ(ARES_SUCCESS, ares_init(&channel)); - struct ares_options opts; - int optmask = 0; - ares_save_options(channel, &opts, &optmask); - EXPECT_EQ(std::string("fb"), std::string(opts.lookups)); - ares_destroy_options(&opts); + EXPECT_EQ(std::string("fb"), std::string(channel->lookups)); ares_destroy(channel); return HasFailure(); } CONTAINED_TEST_F(LibraryTest, ContainerHostConfNotReadable, "myhostname", "mydomainname.org", hostconf) { - ares_channel channel = nullptr; + ares_channel_t *channel = nullptr; // Unavailable /etc/host.conf falls back to defaults. MakeUnreadable hide("/etc/host.conf"); EXPECT_EQ(ARES_SUCCESS, ares_init(&channel)); @@ -567,7 +590,7 @@ CONTAINED_TEST_F(LibraryTest, ContainerHostConfNotReadable, } CONTAINED_TEST_F(LibraryTest, ContainerSvcConfNotReadable, "myhostname", "mydomainname.org", svcconf) { - ares_channel channel = nullptr; + ares_channel_t *channel = nullptr; // Unavailable /etc/svc.conf falls back to defaults. MakeUnreadable hide("/etc/svc.conf"); EXPECT_EQ(ARES_SUCCESS, ares_init(&channel)); @@ -581,14 +604,10 @@ NameContentList rotateenv = { "options rotate\n"}}; CONTAINED_TEST_F(LibraryTest, ContainerRotateInit, "myhostname", "mydomainname.org", rotateenv) { - ares_channel channel = nullptr; + ares_channel_t *channel = nullptr; EXPECT_EQ(ARES_SUCCESS, ares_init(&channel)); - struct ares_options opts; - int optmask = 0; - ares_save_options(channel, &opts, &optmask); - EXPECT_EQ(ARES_OPT_ROTATE, (optmask & ARES_OPT_ROTATE)); - ares_destroy_options(&opts); + EXPECT_EQ(ARES_TRUE, channel->rotate); ares_destroy(channel); return HasFailure(); @@ -596,11 +615,10 @@ CONTAINED_TEST_F(LibraryTest, ContainerRotateInit, CONTAINED_TEST_F(LibraryTest, ContainerRotateOverride, "myhostname", "mydomainname.org", rotateenv) { - ares_channel channel = nullptr; + ares_channel_t *channel = nullptr; struct ares_options opts = {0}; int optmask = ARES_OPT_NOROTATE; EXPECT_EQ(ARES_SUCCESS, ares_init_options(&channel, &opts, optmask)); - optmask = 0; ares_save_options(channel, &opts, &optmask); EXPECT_EQ(ARES_OPT_NOROTATE, (optmask & ARES_OPT_NOROTATE)); @@ -620,21 +638,17 @@ NameContentList blacklistedIpv6 = { {"/etc/nsswitch.conf", "hosts: files\n"}}; CONTAINED_TEST_F(LibraryTest, ContainerBlacklistedIpv6, "myhostname", "mydomainname.org", blacklistedIpv6) { - ares_channel channel = nullptr; + ares_channel_t *channel = nullptr; EXPECT_EQ(ARES_SUCCESS, ares_init(&channel)); std::vector actual = GetNameServers(channel); std::vector expected = { - "254.192.1.1", - "ffc0:0000:0000:0000:0000:0000:0000:c001" + "254.192.1.1:53", + "[ffc0:0000:0000:0000:0000:0000:0000:c001]:53" }; EXPECT_EQ(expected, actual); - struct ares_options opts; - int optmask = 0; - ares_save_options(channel, &opts, &optmask); - EXPECT_EQ(1, opts.ndomains); - EXPECT_EQ(std::string("first.com"), std::string(opts.domains[0])); - ares_destroy_options(&opts); + EXPECT_EQ(1, channel->ndomains); + EXPECT_EQ(std::string("first.com"), std::string(channel->domains[0])); ares_destroy(channel); return HasFailure(); @@ -646,18 +660,14 @@ NameContentList multiresolv = { {"/etc/nsswitch.conf", "hosts: files\n"}}; CONTAINED_TEST_F(LibraryTest, ContainerMultiResolvInit, "myhostname", "mydomainname.org", multiresolv) { - ares_channel channel = nullptr; + ares_channel_t *channel = nullptr; EXPECT_EQ(ARES_SUCCESS, ares_init(&channel)); std::vector actual = GetNameServers(channel); - std::vector expected = {"0001:0000:0000:0000:0000:0000:0000:0002"}; + std::vector expected = {"[0001:0000:0000:0000:0000:0000:0000:0002]:53"}; EXPECT_EQ(expected, actual); - struct ares_options opts; - int optmask = 0; - ares_save_options(channel, &opts, &optmask); - EXPECT_EQ(1, opts.ndomains); - EXPECT_EQ(std::string("first.com"), std::string(opts.domains[0])); - ares_destroy_options(&opts); + EXPECT_EQ(1, channel->ndomains); + EXPECT_EQ(std::string("first.com"), std::string(channel->domains[0])); ares_destroy(channel); return HasFailure(); @@ -669,14 +679,10 @@ NameContentList systemdresolv = { {"/etc/nsswitch.conf", "hosts: junk resolve files\n"}}; CONTAINED_TEST_F(LibraryTest, ContainerSystemdResolvInit, "myhostname", "mydomainname.org", systemdresolv) { - ares_channel channel = nullptr; + ares_channel_t *channel = nullptr; EXPECT_EQ(ARES_SUCCESS, ares_init(&channel)); - struct ares_options opts; - int optmask = 0; - ares_save_options(channel, &opts, &optmask); - EXPECT_EQ(std::string("bf"), std::string(opts.lookups)); - ares_destroy_options(&opts); + EXPECT_EQ(std::string("bf"), std::string(channel->lookups)); ares_destroy(channel); return HasFailure(); @@ -685,20 +691,15 @@ CONTAINED_TEST_F(LibraryTest, ContainerSystemdResolvInit, NameContentList empty = {}; // no files CONTAINED_TEST_F(LibraryTest, ContainerEmptyInit, "host.domain.org", "domain.org", empty) { - ares_channel channel = nullptr; + ares_channel_t *channel = nullptr; EXPECT_EQ(ARES_SUCCESS, ares_init(&channel)); std::vector actual = GetNameServers(channel); - std::vector expected = {"127.0.0.1"}; + std::vector expected = {"127.0.0.1:53"}; EXPECT_EQ(expected, actual); - struct ares_options opts; - int optmask = 0; - ares_save_options(channel, &opts, &optmask); - EXPECT_EQ(1, opts.ndomains); - EXPECT_EQ(std::string("domain.org"), std::string(opts.domains[0])); - EXPECT_EQ(std::string("fb"), std::string(opts.lookups)); - ares_destroy_options(&opts); - + EXPECT_EQ(1, channel->ndomains); + EXPECT_EQ(std::string("domain.org"), std::string(channel->domains[0])); + EXPECT_EQ(std::string("fb"), std::string(channel->lookups)); ares_destroy(channel); return HasFailure(); diff --git a/lib/c-ares-1.23.0/test/ares-test-internal.cc b/lib/c-ares-1.23.0/test/ares-test-internal.cc new file mode 100644 index 00000000000..0fd97ea63d4 --- /dev/null +++ b/lib/c-ares-1.23.0/test/ares-test-internal.cc @@ -0,0 +1,1042 @@ +/* + * Copyright (C) The c-ares project + * + * 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. + * + * SPDX-License-Identifier: MIT + */ +#include "ares-test.h" +#include "dns-proto.h" + +#include + +#ifdef HAVE_UNISTD_H +#include +#endif +#include + +extern "C" { +// Remove command-line defines of package variables for the test project... +#undef PACKAGE_NAME +#undef PACKAGE_BUGREPORT +#undef PACKAGE_STRING +#undef PACKAGE_TARNAME +// ... so we can include the library's config without symbol redefinitions. +#include "ares_setup.h" +#include "ares_inet_net_pton.h" +#include "ares_data.h" +#include "ares_strsplit.h" +#include "ares_private.h" +#include "ares__htable.h" +#include "bitncmp.h" + +#ifdef HAVE_ARPA_INET_H +#include +#endif +#ifdef HAVE_SYS_UIO_H +# include +#endif +} + +#include +#include + +namespace ares { +namespace test { + +#ifndef CARES_SYMBOL_HIDING +void CheckPtoN4(int size, unsigned int value, const char *input) { + struct in_addr a4; + a4.s_addr = 0; + uint32_t expected = htonl(value); + EXPECT_EQ(size, ares_inet_net_pton(AF_INET, input, &a4, sizeof(a4))) + << " for input " << input; + EXPECT_EQ(expected, a4.s_addr) << " for input " << input; +} +#endif + +#ifndef CARES_SYMBOL_HIDING +TEST_F(LibraryTest, Strsplit) { + using std::vector; + using std::string; + size_t n; + struct { + vector inputs; + vector delimiters; + vector> expected; + } data = { + { + "", + " ", + " ", + "example.com, example.co", + " a, b, A,c, d, e,,,D,e,e,E", + }, + { ", ", ", ", ", ", ", ", ", " }, + { + {}, {}, {}, + { "example.com", "example.co" }, + { "a", "b", "c", "d", "e" }, + }, + }; + for(size_t i = 0; i < data.inputs.size(); i++) { + char **out = ares__strsplit(data.inputs.at(i).c_str(), + data.delimiters.at(i).c_str(), &n); + if(data.expected.at(i).size() == 0) { + EXPECT_EQ(out, nullptr); + } + else { + EXPECT_EQ(n, data.expected.at(i).size()); + for(size_t j = 0; j < n && j < data.expected.at(i).size(); j++) { + EXPECT_STREQ(out[j], data.expected.at(i).at(j).c_str()); + } + } + ares__strsplit_free(out, n); + } +} +#endif + +TEST_F(LibraryTest, InetPtoN) { + struct in_addr a4; + struct in6_addr a6; + +#ifndef CARES_SYMBOL_HIDING + uint32_t expected; + + CheckPtoN4(4 * 8, 0x01020304, "1.2.3.4"); + CheckPtoN4(4 * 8, 0x81010101, "129.1.1.1"); + CheckPtoN4(4 * 8, 0xC0010101, "192.1.1.1"); + CheckPtoN4(4 * 8, 0xE0010101, "224.1.1.1"); + CheckPtoN4(4 * 8, 0xE1010101, "225.1.1.1"); + CheckPtoN4(4, 0xE0000000, "224"); + CheckPtoN4(4 * 8, 0xFD000000, "253"); + CheckPtoN4(4 * 8, 0xF0010101, "240.1.1.1"); + CheckPtoN4(4 * 8, 0x02030405, "02.3.4.5"); + CheckPtoN4(3 * 8, 0x01020304, "1.2.3.4/24"); + CheckPtoN4(3 * 8, 0x01020300, "1.2.3/24"); + CheckPtoN4(2 * 8, 0xa0000000, "0xa"); + CheckPtoN4(0, 0x02030405, "2.3.4.5/000"); + CheckPtoN4(1 * 8, 0x01020000, "1.2/8"); + CheckPtoN4(2 * 8, 0x01020000, "0x0102/16"); + CheckPtoN4(4 * 8, 0x02030405, "02.3.4.5"); + + EXPECT_EQ(16 * 8, ares_inet_net_pton(AF_INET6, "::", &a6, sizeof(a6))); + EXPECT_EQ(16 * 8, ares_inet_net_pton(AF_INET6, "::1", &a6, sizeof(a6))); + EXPECT_EQ(16 * 8, ares_inet_net_pton(AF_INET6, "1234:5678::", &a6, sizeof(a6))); + EXPECT_EQ(16 * 8, ares_inet_net_pton(AF_INET6, "12:34::ff", &a6, sizeof(a6))); + EXPECT_EQ(16 * 8, ares_inet_net_pton(AF_INET6, "12:34::ffff:1.2.3.4", &a6, sizeof(a6))); + EXPECT_EQ(23, ares_inet_net_pton(AF_INET6, "12:34::ffff:1.2.3.4/23", &a6, sizeof(a6))); + EXPECT_EQ(3 * 8, ares_inet_net_pton(AF_INET6, "12:34::ff/24", &a6, sizeof(a6))); + EXPECT_EQ(0, ares_inet_net_pton(AF_INET6, "12:34::ff/0", &a6, sizeof(a6))); + EXPECT_EQ(16 * 8, ares_inet_net_pton(AF_INET6, "12:34::ffff:0.2", &a6, sizeof(a6))); + EXPECT_EQ(16 * 8, ares_inet_net_pton(AF_INET6, "1234:1234:1234:1234:1234:1234:1234:1234", &a6, sizeof(a6))); + EXPECT_EQ(2, ares_inet_net_pton(AF_INET6, "0::00:00:00/2", &a6, sizeof(a6))); + + // Various malformed versions + EXPECT_EQ(-1, ares_inet_net_pton(AF_INET, "", &a4, sizeof(a4))); + EXPECT_EQ(-1, ares_inet_net_pton(AF_INET, " ", &a4, sizeof(a4))); + EXPECT_EQ(-1, ares_inet_net_pton(AF_INET, "0x", &a4, sizeof(a4))); + EXPECT_EQ(-1, ares_inet_net_pton(AF_INET, "0x ", &a4, sizeof(a4))); + EXPECT_EQ(-1, ares_inet_net_pton(AF_INET, "x0", &a4, sizeof(a4))); + EXPECT_EQ(-1, ares_inet_net_pton(AF_INET, "0xXYZZY", &a4, sizeof(a4))); + EXPECT_EQ(-1, ares_inet_net_pton(AF_INET, "xyzzy", &a4, sizeof(a4))); + EXPECT_EQ(-1, ares_inet_net_pton(AF_INET+AF_INET6, "1.2.3.4", &a4, sizeof(a4))); + EXPECT_EQ(-1, ares_inet_net_pton(AF_INET, "257.2.3.4", &a4, sizeof(a4))); + EXPECT_EQ(-1, ares_inet_net_pton(AF_INET, "002.3.4.x", &a4, sizeof(a4))); + EXPECT_EQ(-1, ares_inet_net_pton(AF_INET, "00.3.4.x", &a4, sizeof(a4))); + EXPECT_EQ(-1, ares_inet_net_pton(AF_INET, "2.3.4.x", &a4, sizeof(a4))); + EXPECT_EQ(-1, ares_inet_net_pton(AF_INET, "2.3.4.5.6", &a4, sizeof(a4))); + EXPECT_EQ(-1, ares_inet_net_pton(AF_INET, "2.3.4.5.6/12", &a4, sizeof(a4))); + EXPECT_EQ(-1, ares_inet_net_pton(AF_INET, "2.3.4:5", &a4, sizeof(a4))); + EXPECT_EQ(-1, ares_inet_net_pton(AF_INET, "2.3.4.5/120", &a4, sizeof(a4))); + EXPECT_EQ(-1, ares_inet_net_pton(AF_INET, "2.3.4.5/1x", &a4, sizeof(a4))); + EXPECT_EQ(-1, ares_inet_net_pton(AF_INET, "2.3.4.5/x", &a4, sizeof(a4))); + EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, "12:34::ff/240", &a6, sizeof(a6))); + EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, "12:34::ff/02", &a6, sizeof(a6))); + EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, "12:34::ff/2y", &a6, sizeof(a6))); + EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, "12:34::ff/y", &a6, sizeof(a6))); + EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, "12:34::ff/", &a6, sizeof(a6))); + EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, "", &a6, sizeof(a6))); + EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, ":x", &a6, sizeof(a6))); + EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, ":", &a6, sizeof(a6))); + EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, ": :1234", &a6, sizeof(a6))); + EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, "::12345", &a6, sizeof(a6))); + EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, "1234::2345:3456::0011", &a6, sizeof(a6))); + EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, "1234:1234:1234:1234:1234:1234:1234:1234:", &a6, sizeof(a6))); + EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, "1234:1234:1234:1234:1234:1234:1234:1234::", &a6, sizeof(a6))); + EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, "1234:1234:1234:1234:1234:1234:1234:1.2.3.4", &a6, sizeof(a6))); + EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, ":1234:1234:1234:1234:1234:1234:1234:1234", &a6, sizeof(a6))); + EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, ":1234:1234:1234:1234:1234:1234:1234:1234:", &a6, sizeof(a6))); + EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, "1234:1234:1234:1234:1234:1234:1234:1234:5678", &a6, sizeof(a6))); + EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, "1234:1234:1234:1234:1234:1234:1234:1234:5678:5678", &a6, sizeof(a6))); + EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, "1234:1234:1234:1234:1234:1234:1234:1234:5678:5678:5678", &a6, sizeof(a6))); + EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, "12:34::ffff:257.2.3.4", &a6, sizeof(a6))); + EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, "12:34::ffff:1.2.3.4.5.6", &a6, sizeof(a6))); + EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, "12:34::ffff:1.2.3.4.5", &a6, sizeof(a6))); + EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, "12:34::ffff:1.2.3.z", &a6, sizeof(a6))); + EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, "12:34::ffff:1.2.3001.4", &a6, sizeof(a6))); + EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, "12:34::ffff:1.2.3..4", &a6, sizeof(a6))); + EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, "12:34::ffff:1.2.3.", &a6, sizeof(a6))); + + // Hex constants are allowed. + EXPECT_EQ(4 * 8, ares_inet_net_pton(AF_INET, "0x01020304", &a4, sizeof(a4))); + expected = htonl(0x01020304); + EXPECT_EQ(expected, a4.s_addr); + EXPECT_EQ(4 * 8, ares_inet_net_pton(AF_INET, "0x0a0b0c0d", &a4, sizeof(a4))); + expected = htonl(0x0a0b0c0d); + EXPECT_EQ(expected, a4.s_addr); + EXPECT_EQ(4 * 8, ares_inet_net_pton(AF_INET, "0x0A0B0C0D", &a4, sizeof(a4))); + expected = htonl(0x0a0b0c0d); + EXPECT_EQ(expected, a4.s_addr); + EXPECT_EQ(-1, ares_inet_net_pton(AF_INET, "0x0xyz", &a4, sizeof(a4))); + EXPECT_EQ(4 * 8, ares_inet_net_pton(AF_INET, "0x1122334", &a4, sizeof(a4))); + expected = htonl(0x11223340); + EXPECT_EQ(expected, a4.s_addr); // huh? + + // No room, no room. + EXPECT_EQ(-1, ares_inet_net_pton(AF_INET, "1.2.3.4", &a4, sizeof(a4) - 1)); + EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, "12:34::ff", &a6, sizeof(a6) - 1)); + EXPECT_EQ(-1, ares_inet_net_pton(AF_INET, "0x01020304", &a4, 2)); + EXPECT_EQ(-1, ares_inet_net_pton(AF_INET, "0x01020304", &a4, 0)); + EXPECT_EQ(-1, ares_inet_net_pton(AF_INET, "0x0a0b0c0d", &a4, 0)); + EXPECT_EQ(-1, ares_inet_net_pton(AF_INET, "0x0xyz", &a4, 0)); + EXPECT_EQ(-1, ares_inet_net_pton(AF_INET, "0x1122334", &a4, sizeof(a4) - 1)); + EXPECT_EQ(-1, ares_inet_net_pton(AF_INET, "253", &a4, sizeof(a4) - 1)); +#endif + + EXPECT_EQ(1, ares_inet_pton(AF_INET, "1.2.3.4", &a4)); + EXPECT_EQ(1, ares_inet_pton(AF_INET6, "12:34::ff", &a6)); + EXPECT_EQ(1, ares_inet_pton(AF_INET6, "12:34::ffff:1.2.3.4", &a6)); + EXPECT_EQ(0, ares_inet_pton(AF_INET, "xyzzy", &a4)); + EXPECT_EQ(-1, ares_inet_pton(AF_INET+AF_INET6, "1.2.3.4", &a4)); +} + +TEST_F(LibraryTest, FreeCorruptData) { + // ares_free_data(p) expects that there is a type field and a marker + // field in the memory before p. Feed it incorrect versions of each. + struct ares_data *data = (struct ares_data *)malloc(sizeof(struct ares_data)); + void* p = &(data->data); + + // Invalid type + data->type = (ares_datatype)99; + data->mark = ARES_DATATYPE_MARK; + ares_free_data(p); + + // Invalid marker + data->type = (ares_datatype)ARES_DATATYPE_MX_REPLY; + data->mark = ARES_DATATYPE_MARK + 1; + ares_free_data(p); + + // Null pointer + ares_free_data(nullptr); + + free(data); +} + +#ifndef CARES_SYMBOL_HIDING +TEST_F(LibraryTest, FreeLongChain) { + struct ares_addr_node *data = nullptr; + for (int ii = 0; ii < 100000; ii++) { + struct ares_addr_node *prev = (struct ares_addr_node*)ares_malloc_data(ARES_DATATYPE_ADDR_NODE); + prev->next = data; + data = prev; + } + + ares_free_data(data); +} + +TEST(LibraryInit, StrdupFailures) { + EXPECT_EQ(ARES_SUCCESS, ares_library_init(ARES_LIB_INIT_ALL)); + char* copy = ares_strdup("string"); + EXPECT_NE(nullptr, copy); + ares_free(copy); + ares_library_cleanup(); +} + +TEST_F(LibraryTest, StrdupFailures) { + SetAllocFail(1); + char* copy = ares_strdup("string"); + EXPECT_EQ(nullptr, copy); +} + +TEST_F(LibraryTest, MallocDataFail) { + EXPECT_EQ(nullptr, ares_malloc_data((ares_datatype)99)); + SetAllocSizeFail(sizeof(struct ares_data)); + EXPECT_EQ(nullptr, ares_malloc_data(ARES_DATATYPE_MX_REPLY)); +} + +TEST(Misc, Bitncmp) { + byte a[4] = {0x80, 0x01, 0x02, 0x03}; + byte b[4] = {0x80, 0x01, 0x02, 0x04}; + byte c[4] = {0x01, 0xFF, 0x80, 0x02}; + EXPECT_GT(0, ares__bitncmp(a, b, sizeof(a)*8)); + EXPECT_LT(0, ares__bitncmp(b, a, sizeof(a)*8)); + EXPECT_EQ(0, ares__bitncmp(a, a, sizeof(a)*8)); + + for (size_t ii = 1; ii < (3*8+5); ii++) { + EXPECT_EQ(0, ares__bitncmp(a, b, ii)); + EXPECT_EQ(0, ares__bitncmp(b, a, ii)); + EXPECT_LT(0, ares__bitncmp(a, c, ii)); + EXPECT_GT(0, ares__bitncmp(c, a, ii)); + } + + // Last byte differs at 5th bit + EXPECT_EQ(0, ares__bitncmp(a, b, 3*8 + 3)); + EXPECT_EQ(0, ares__bitncmp(a, b, 3*8 + 4)); + EXPECT_EQ(0, ares__bitncmp(a, b, 3*8 + 5)); + EXPECT_GT(0, ares__bitncmp(a, b, 3*8 + 6)); + EXPECT_GT(0, ares__bitncmp(a, b, 3*8 + 7)); +} + + +TEST_F(LibraryTest, ReadLine) { + TempFile temp("abcde\n0123456789\nXYZ\n012345678901234567890\n\n"); + FILE *fp = fopen(temp.filename(), "r"); + size_t bufsize = 4; + char *buf = (char *)ares_malloc(bufsize); + + EXPECT_EQ(ARES_SUCCESS, ares__read_line(fp, &buf, &bufsize)); + EXPECT_EQ("abcde", std::string(buf)); + EXPECT_EQ(ARES_SUCCESS, ares__read_line(fp, &buf, &bufsize)); + EXPECT_EQ("0123456789", std::string(buf)); + EXPECT_EQ(ARES_SUCCESS, ares__read_line(fp, &buf, &bufsize)); + EXPECT_EQ("XYZ", std::string(buf)); + SetAllocFail(1); + EXPECT_EQ(ARES_ENOMEM, ares__read_line(fp, &buf, &bufsize)); + EXPECT_EQ(nullptr, buf); + + fclose(fp); + ares_free(buf); +} + +TEST_F(LibraryTest, ReadLineNoBuf) { + TempFile temp("abcde\n0123456789\nXYZ\n012345678901234567890"); + FILE *fp = fopen(temp.filename(), "r"); + size_t bufsize = 0; + char *buf = nullptr; + + SetAllocFail(1); + EXPECT_EQ(ARES_ENOMEM, ares__read_line(fp, &buf, &bufsize)); + + EXPECT_EQ(ARES_SUCCESS, ares__read_line(fp, &buf, &bufsize)); + EXPECT_EQ("abcde", std::string(buf)); + EXPECT_EQ(ARES_SUCCESS, ares__read_line(fp, &buf, &bufsize)); + EXPECT_EQ("0123456789", std::string(buf)); + EXPECT_EQ(ARES_SUCCESS, ares__read_line(fp, &buf, &bufsize)); + EXPECT_EQ("XYZ", std::string(buf)); + EXPECT_EQ(ARES_SUCCESS, ares__read_line(fp, &buf, &bufsize)); + EXPECT_EQ("012345678901234567890", std::string(buf)); + + fclose(fp); + ares_free(buf); +} + + +TEST_F(FileChannelTest, GetAddrInfoHostsPositive) { + TempFile hostsfile("1.2.3.4 example.com \n" + " 2.3.4.5\tgoogle.com www.google.com\twww2.google.com\n" + "#comment\n" + "4.5.6.7\n" + "1.3.5.7 \n" + "::1 ipv6.com"); + EnvValue with_env("CARES_HOSTS", hostsfile.filename()); + struct ares_addrinfo_hints hints = {}; + AddrInfoResult result = {}; + hints.ai_family = AF_INET; + hints.ai_flags = ARES_AI_CANONNAME | ARES_AI_ENVHOSTS | ARES_AI_NOSORT; + ares_getaddrinfo(channel_, "example.com", NULL, &hints, AddrInfoCallback, &result); + Process(); + EXPECT_TRUE(result.done_); + std::stringstream ss; + ss << result.ai_; + EXPECT_EQ("{example.com addr=[1.2.3.4]}", ss.str()); +} + +TEST_F(FileChannelTest, GetAddrInfoHostsSpaces) { + TempFile hostsfile("1.2.3.4 example.com \n" + " 2.3.4.5\tgoogle.com www.google.com\twww2.google.com\n" + "#comment\n" + "4.5.6.7\n" + "1.3.5.7 \n" + "::1 ipv6.com"); + EnvValue with_env("CARES_HOSTS", hostsfile.filename()); + struct ares_addrinfo_hints hints = {}; + AddrInfoResult result = {}; + hints.ai_family = AF_INET; + hints.ai_flags = ARES_AI_CANONNAME | ARES_AI_ENVHOSTS | ARES_AI_NOSORT; + ares_getaddrinfo(channel_, "google.com", NULL, &hints, AddrInfoCallback, &result); + Process(); + EXPECT_TRUE(result.done_); + std::stringstream ss; + ss << result.ai_; + EXPECT_EQ("{www.google.com->google.com, www2.google.com->google.com addr=[2.3.4.5]}", ss.str()); +} + +TEST_F(FileChannelTest, GetAddrInfoHostsByALias) { + TempFile hostsfile("1.2.3.4 example.com \n" + " 2.3.4.5\tgoogle.com www.google.com\twww2.google.com\n" + "#comment\n" + "4.5.6.7\n" + "1.3.5.7 \n" + "::1 ipv6.com"); + EnvValue with_env("CARES_HOSTS", hostsfile.filename()); + struct ares_addrinfo_hints hints = {}; + AddrInfoResult result = {}; + hints.ai_family = AF_INET; + hints.ai_flags = ARES_AI_CANONNAME | ARES_AI_ENVHOSTS | ARES_AI_NOSORT; + ares_getaddrinfo(channel_, "www2.google.com", NULL, &hints, AddrInfoCallback, &result); + Process(); + EXPECT_TRUE(result.done_); + std::stringstream ss; + ss << result.ai_; + EXPECT_EQ("{www.google.com->google.com, www2.google.com->google.com addr=[2.3.4.5]}", ss.str()); +} + +TEST_F(FileChannelTest, GetAddrInfoHostsIPV6) { + TempFile hostsfile("1.2.3.4 example.com \n" + " 2.3.4.5\tgoogle.com www.google.com\twww2.google.com\n" + "#comment\n" + "4.5.6.7\n" + "1.3.5.7 \n" + "::1 ipv6.com"); + EnvValue with_env("CARES_HOSTS", hostsfile.filename()); + struct ares_addrinfo_hints hints = {}; + AddrInfoResult result = {}; + hints.ai_family = AF_INET6; + hints.ai_flags = ARES_AI_CANONNAME | ARES_AI_ENVHOSTS | ARES_AI_NOSORT; + ares_getaddrinfo(channel_, "ipv6.com", NULL, &hints, AddrInfoCallback, &result); + Process(); + EXPECT_TRUE(result.done_); + std::stringstream ss; + ss << result.ai_; + EXPECT_EQ("{ipv6.com addr=[[0000:0000:0000:0000:0000:0000:0000:0001]]}", ss.str()); +} + + +TEST_F(FileChannelTest, GetAddrInfoAllocFail) { + TempFile hostsfile("1.2.3.4 example.com alias1 alias2\n"); + EnvValue with_env("CARES_HOSTS", hostsfile.filename()); + struct ares_addrinfo_hints hints; + + memset(&hints, 0, sizeof(hints)); + hints.ai_family = AF_INET; + + // Fail a variety of different memory allocations, and confirm + // that the operation either fails with ENOMEM or succeeds + // with the expected result. + const int kCount = 34; + AddrInfoResult results[kCount]; + for (int ii = 1; ii <= kCount; ii++) { + AddrInfoResult* result = &(results[ii - 1]); + ClearFails(); + SetAllocFail(ii); + ares_getaddrinfo(channel_, "example.com", NULL, &hints, AddrInfoCallback, result); + Process(); + EXPECT_TRUE(result->done_); + if (result->status_ == ARES_SUCCESS) { + std::stringstream ss; + ss << result->ai_; + EXPECT_EQ("{alias1->example.com, alias2->example.com addr=[1.2.3.4]}", ss.str()) << " failed alloc #" << ii; + if (verbose) std::cerr << "Succeeded despite failure of alloc #" << ii << std::endl; + } + } +} + +TEST(Misc, OnionDomain) { + EXPECT_EQ(0, ares__is_onion_domain("onion.no")); + EXPECT_EQ(0, ares__is_onion_domain(".onion.no")); + EXPECT_EQ(1, ares__is_onion_domain(".onion")); + EXPECT_EQ(1, ares__is_onion_domain(".onion.")); + EXPECT_EQ(1, ares__is_onion_domain("yes.onion")); + EXPECT_EQ(1, ares__is_onion_domain("yes.onion.")); + EXPECT_EQ(1, ares__is_onion_domain("YES.ONION")); + EXPECT_EQ(1, ares__is_onion_domain("YES.ONION.")); +} + +TEST_F(LibraryTest, DNSRecord) { + ares_dns_record_t *dnsrec = NULL; + ares_dns_rr_t *rr = NULL; + struct in_addr addr; + struct ares_in6_addr addr6; + unsigned char *msg = NULL; + size_t msglen = 0; + size_t qdcount = 0; + size_t ancount = 0; + size_t nscount = 0; + size_t arcount = 0; + + EXPECT_EQ(ARES_SUCCESS, + ares_dns_record_create(&dnsrec, 0x1234, + ARES_FLAG_QR|ARES_FLAG_AA|ARES_FLAG_RD|ARES_FLAG_RA, + ARES_OPCODE_QUERY, ARES_RCODE_NOERROR)); + + /* == Question == */ + EXPECT_EQ(ARES_SUCCESS, + ares_dns_record_query_add(dnsrec, "example.com", + ARES_REC_TYPE_ANY, + ARES_CLASS_IN)); + + /* == Answer == */ + /* A */ + EXPECT_EQ(ARES_SUCCESS, + ares_dns_record_rr_add(&rr, dnsrec, ARES_SECTION_ANSWER, "example.com", + ARES_REC_TYPE_A, ARES_CLASS_IN, 300)); + EXPECT_LT(0, ares_inet_net_pton(AF_INET, "1.1.1.1", &addr, sizeof(addr))); + EXPECT_EQ(ARES_SUCCESS, + ares_dns_rr_set_addr(rr, ARES_RR_A_ADDR, &addr)); + /* AAAA */ + EXPECT_EQ(ARES_SUCCESS, + ares_dns_record_rr_add(&rr, dnsrec, ARES_SECTION_ANSWER, "example.com", + ARES_REC_TYPE_AAAA, ARES_CLASS_IN, 300)); + EXPECT_LT(0, ares_inet_net_pton(AF_INET6, "2600::4", &addr6, sizeof(addr6))); + EXPECT_EQ(ARES_SUCCESS, + ares_dns_rr_set_addr6(rr, ARES_RR_AAAA_ADDR, &addr6)); + /* MX */ + EXPECT_EQ(ARES_SUCCESS, + ares_dns_record_rr_add(&rr, dnsrec, ARES_SECTION_ANSWER, "example.com", + ARES_REC_TYPE_MX, ARES_CLASS_IN, 3600)); + EXPECT_EQ(ARES_SUCCESS, + ares_dns_rr_set_u16(rr, ARES_RR_MX_PREFERENCE, 10)); + EXPECT_EQ(ARES_SUCCESS, + ares_dns_rr_set_str(rr, ARES_RR_MX_EXCHANGE, "mail.example.com")); + /* CNAME */ + EXPECT_EQ(ARES_SUCCESS, + ares_dns_record_rr_add(&rr, dnsrec, ARES_SECTION_ANSWER, "example.com", + ARES_REC_TYPE_CNAME, ARES_CLASS_IN, 3600)); + EXPECT_EQ(ARES_SUCCESS, + ares_dns_rr_set_str(rr, ARES_RR_CNAME_CNAME, "b.example.com")); + /* TXT */ + EXPECT_EQ(ARES_SUCCESS, + ares_dns_record_rr_add(&rr, dnsrec, ARES_SECTION_ANSWER, "example.com", + ARES_REC_TYPE_TXT, ARES_CLASS_IN, 3600)); + const char txt[] = "blah=here blah=there anywhere"; + EXPECT_EQ(ARES_SUCCESS, + ares_dns_rr_set_bin(rr, ARES_RR_TXT_DATA, (unsigned char *)txt, + sizeof(txt))); + + /* == Authority == */ + /* NS */ + EXPECT_EQ(ARES_SUCCESS, + ares_dns_record_rr_add(&rr, dnsrec, ARES_SECTION_AUTHORITY, "example.com", + ARES_REC_TYPE_NS, ARES_CLASS_IN, 38400)); + EXPECT_EQ(ARES_SUCCESS, + ares_dns_rr_set_str(rr, ARES_RR_NS_NSDNAME, "ns1.example.com")); + EXPECT_EQ(ARES_SUCCESS, + ares_dns_record_rr_add(&rr, dnsrec, ARES_SECTION_AUTHORITY, "example.com", + ARES_REC_TYPE_NS, ARES_CLASS_IN, 38400)); + EXPECT_EQ(ARES_SUCCESS, + ares_dns_rr_set_str(rr, ARES_RR_NS_NSDNAME, "ns2.example.com")); + /* SOA */ + EXPECT_EQ(ARES_SUCCESS, + ares_dns_record_rr_add(&rr, dnsrec, ARES_SECTION_AUTHORITY, "example.com", + ARES_REC_TYPE_SOA, ARES_CLASS_IN, 86400)); + EXPECT_EQ(ARES_SUCCESS, + ares_dns_rr_set_str(rr, ARES_RR_SOA_MNAME, "ns1.example.com")); + EXPECT_EQ(ARES_SUCCESS, + ares_dns_rr_set_str(rr, ARES_RR_SOA_RNAME, "tech\\.support.example.com")); + EXPECT_EQ(ARES_SUCCESS, + ares_dns_rr_set_u32(rr, ARES_RR_SOA_SERIAL, 2023110701)); + EXPECT_EQ(ARES_SUCCESS, + ares_dns_rr_set_u32(rr, ARES_RR_SOA_REFRESH, 28800)); + EXPECT_EQ(ARES_SUCCESS, + ares_dns_rr_set_u32(rr, ARES_RR_SOA_RETRY, 7200)); + EXPECT_EQ(ARES_SUCCESS, + ares_dns_rr_set_u32(rr, ARES_RR_SOA_EXPIRE, 604800)); + EXPECT_EQ(ARES_SUCCESS, + ares_dns_rr_set_u32(rr, ARES_RR_SOA_MINIMUM, 86400)); + + /* == Additional */ + /* OPT */ + EXPECT_EQ(ARES_SUCCESS, + ares_dns_record_rr_add(&rr, dnsrec, ARES_SECTION_ADDITIONAL, "", + ARES_REC_TYPE_OPT, ARES_CLASS_IN, 0)); + EXPECT_EQ(ARES_SUCCESS, + ares_dns_rr_set_u16(rr, ARES_RR_OPT_UDP_SIZE, 1280)); + EXPECT_EQ(ARES_SUCCESS, + ares_dns_rr_set_u8(rr, ARES_RR_OPT_VERSION, 0)); + EXPECT_EQ(ARES_SUCCESS, + ares_dns_rr_set_u16(rr, ARES_RR_OPT_FLAGS, 0)); + unsigned char optval[] = { 'c', '-', 'a', 'r', 'e', 's' }; + EXPECT_EQ(ARES_SUCCESS, + ares_dns_rr_set_opt(rr, ARES_RR_OPT_OPTIONS, 3 /* NSID */, optval, sizeof(optval))); + /* PTR -- doesn't make sense, but ok */ + EXPECT_EQ(ARES_SUCCESS, + ares_dns_record_rr_add(&rr, dnsrec, ARES_SECTION_ADDITIONAL, "example.com", + ARES_REC_TYPE_PTR, ARES_CLASS_IN, 300)); + EXPECT_EQ(ARES_SUCCESS, + ares_dns_rr_set_str(rr, ARES_RR_PTR_DNAME, "b.example.com")); + /* HINFO */ + EXPECT_EQ(ARES_SUCCESS, + ares_dns_record_rr_add(&rr, dnsrec, ARES_SECTION_ADDITIONAL, "example.com", + ARES_REC_TYPE_HINFO, ARES_CLASS_IN, 300)); + EXPECT_EQ(ARES_SUCCESS, + ares_dns_rr_set_str(rr, ARES_RR_HINFO_CPU, "Virtual")); + EXPECT_EQ(ARES_SUCCESS, + ares_dns_rr_set_str(rr, ARES_RR_HINFO_OS, "Linux")); + /* SRV */ + EXPECT_EQ(ARES_SUCCESS, + ares_dns_record_rr_add(&rr, dnsrec, ARES_SECTION_ADDITIONAL, + "_ldap.example.com", ARES_REC_TYPE_SRV, ARES_CLASS_IN, 300)); + EXPECT_EQ(ARES_SUCCESS, + ares_dns_rr_set_u16(rr, ARES_RR_SRV_PRIORITY, 100)); + EXPECT_EQ(ARES_SUCCESS, + ares_dns_rr_set_u16(rr, ARES_RR_SRV_WEIGHT, 1)); + EXPECT_EQ(ARES_SUCCESS, + ares_dns_rr_set_u16(rr, ARES_RR_SRV_PORT, 389)); + EXPECT_EQ(ARES_SUCCESS, + ares_dns_rr_set_str(rr, ARES_RR_SRV_TARGET, "ldap.example.com")); + /* TLSA */ + EXPECT_EQ(ARES_SUCCESS, + ares_dns_record_rr_add(&rr, dnsrec, ARES_SECTION_ADDITIONAL, + "_443._tcp.example.com", ARES_REC_TYPE_TLSA, ARES_CLASS_IN, 86400)); + EXPECT_EQ(ARES_SUCCESS, + ares_dns_rr_set_u8(rr, ARES_RR_TLSA_CERT_USAGE, ARES_TLSA_USAGE_CA)); + EXPECT_EQ(ARES_SUCCESS, + ares_dns_rr_set_u8(rr, ARES_RR_TLSA_SELECTOR, ARES_TLSA_SELECTOR_FULL)); + EXPECT_EQ(ARES_SUCCESS, + ares_dns_rr_set_u8(rr, ARES_RR_TLSA_MATCH, ARES_TLSA_MATCH_SHA256)); + const unsigned char tlsa[] = { + 0xd2, 0xab, 0xde, 0x24, 0x0d, 0x7c, 0xd3, 0xee, 0x6b, 0x4b, 0x28, 0xc5, + 0x4d, 0xf0, 0x34, 0xb9, 0x79, 0x83, 0xa1, 0xd1, 0x6e, 0x8a, 0x41, 0x0e, + 0x45, 0x61, 0xcb, 0x10, 0x66, 0x18, 0xe9, 0x71 }; + EXPECT_EQ(ARES_SUCCESS, + ares_dns_rr_set_bin(rr, ARES_RR_TLSA_DATA, tlsa, sizeof(tlsa))); + /* SVCB */ + EXPECT_EQ(ARES_SUCCESS, + ares_dns_record_rr_add(&rr, dnsrec, ARES_SECTION_ADDITIONAL, + "_1234._bar.example.com", ARES_REC_TYPE_SVCB, ARES_CLASS_IN, 300)); + EXPECT_EQ(ARES_SUCCESS, + ares_dns_rr_set_u16(rr, ARES_RR_SVCB_PRIORITY, 1)); + EXPECT_EQ(ARES_SUCCESS, + ares_dns_rr_set_str(rr, ARES_RR_SVCB_TARGET, "svc1.example.net")); + /* IPV6 hint is a list of IPV6 addresses in network byte order, concatenated */ + struct ares_addr svcb_addr; + svcb_addr.family = AF_UNSPEC; + size_t svcb_ipv6hint_len = 0; + const unsigned char *svcb_ipv6hint = (const unsigned char *)ares_dns_pton("2001:db8::1", &svcb_addr, &svcb_ipv6hint_len); + EXPECT_EQ(ARES_SUCCESS, + ares_dns_rr_set_opt(rr, ARES_RR_SVCB_PARAMS, ARES_SVCB_PARAM_IPV6HINT, + svcb_ipv6hint, svcb_ipv6hint_len)); + /* Port is 16bit big endian format */ + unsigned short svcb_port = htons(1234); + EXPECT_EQ(ARES_SUCCESS, + ares_dns_rr_set_opt(rr, ARES_RR_SVCB_PARAMS, ARES_SVCB_PARAM_PORT, + (const unsigned char *)&svcb_port, sizeof(svcb_port))); + /* HTTPS */ + EXPECT_EQ(ARES_SUCCESS, + ares_dns_record_rr_add(&rr, dnsrec, ARES_SECTION_ADDITIONAL, + "example.com", ARES_REC_TYPE_HTTPS, ARES_CLASS_IN, 300)); + EXPECT_EQ(ARES_SUCCESS, + ares_dns_rr_set_u16(rr, ARES_RR_HTTPS_PRIORITY, 1)); + EXPECT_EQ(ARES_SUCCESS, + ares_dns_rr_set_str(rr, ARES_RR_HTTPS_TARGET, "")); + + /* In DNS string format which is 1 octet length indicator followed by string */ + const unsigned char https_alpn[] = { 0x02, 'h', '3' }; + EXPECT_EQ(ARES_SUCCESS, + ares_dns_rr_set_opt(rr, ARES_RR_HTTPS_PARAMS, ARES_SVCB_PARAM_ALPN, + https_alpn, sizeof(https_alpn))); + /* URI */ + EXPECT_EQ(ARES_SUCCESS, + ares_dns_record_rr_add(&rr, dnsrec, ARES_SECTION_ADDITIONAL, + "_ftp._tcp.example.com", ARES_REC_TYPE_URI, ARES_CLASS_IN, 3600)); + EXPECT_EQ(ARES_SUCCESS, + ares_dns_rr_set_u16(rr, ARES_RR_URI_PRIORITY, 10)); + EXPECT_EQ(ARES_SUCCESS, + ares_dns_rr_set_u16(rr, ARES_RR_URI_WEIGHT, 1)); + EXPECT_EQ(ARES_SUCCESS, + ares_dns_rr_set_str(rr, ARES_RR_URI_TARGET, "ftp://ftp.example.com/public")); + /* CAA */ + EXPECT_EQ(ARES_SUCCESS, + ares_dns_record_rr_add(&rr, dnsrec, ARES_SECTION_ADDITIONAL, + "example.com", ARES_REC_TYPE_CAA, ARES_CLASS_IN, 86400)); + EXPECT_EQ(ARES_SUCCESS, + ares_dns_rr_set_u8(rr, ARES_RR_CAA_CRITICAL, 0)); + EXPECT_EQ(ARES_SUCCESS, + ares_dns_rr_set_str(rr, ARES_RR_CAA_TAG, "issue")); + unsigned char caa[] = "letsencrypt.org"; + EXPECT_EQ(ARES_SUCCESS, + ares_dns_rr_set_bin(rr, ARES_RR_CAA_VALUE, caa, sizeof(caa))); + /* NAPTR */ + EXPECT_EQ(ARES_SUCCESS, + ares_dns_record_rr_add(&rr, dnsrec, ARES_SECTION_ADDITIONAL, + "example.com", ARES_REC_TYPE_NAPTR, ARES_CLASS_IN, 86400)); + EXPECT_EQ(ARES_SUCCESS, + ares_dns_rr_set_u16(rr, ARES_RR_NAPTR_ORDER, 100)); + EXPECT_EQ(ARES_SUCCESS, + ares_dns_rr_set_u16(rr, ARES_RR_NAPTR_PREFERENCE, 10)); + EXPECT_EQ(ARES_SUCCESS, + ares_dns_rr_set_str(rr, ARES_RR_NAPTR_FLAGS, "S")); + EXPECT_EQ(ARES_SUCCESS, + ares_dns_rr_set_str(rr, ARES_RR_NAPTR_SERVICES, "SIP+D2U")); + EXPECT_EQ(ARES_SUCCESS, + ares_dns_rr_set_str(rr, ARES_RR_NAPTR_REGEXP, + "!^.*$!sip:customer-service@example.com!")); + EXPECT_EQ(ARES_SUCCESS, + ares_dns_rr_set_str(rr, ARES_RR_NAPTR_REPLACEMENT, + "_sip._udp.example.com.")); + /* RAW_RR */ + EXPECT_EQ(ARES_SUCCESS, + ares_dns_record_rr_add(&rr, dnsrec, ARES_SECTION_ADDITIONAL, "", + ARES_REC_TYPE_RAW_RR, ARES_CLASS_IN, 0)); + EXPECT_EQ(ARES_SUCCESS, + ares_dns_rr_set_u16(rr, ARES_RR_RAW_RR_TYPE, 65432)); + unsigned char data[] = { 0x00 }; + EXPECT_EQ(ARES_SUCCESS, + ares_dns_rr_set_bin(rr, ARES_RR_RAW_RR_DATA, data, sizeof(data))); + + qdcount = ares_dns_record_query_cnt(dnsrec); + ancount = ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_ANSWER); + nscount = ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_AUTHORITY); + arcount = ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_ADDITIONAL); + + /* Write */ + EXPECT_EQ(ARES_SUCCESS, ares_dns_write(dnsrec, &msg, &msglen)); + + ares__buf_t *hexdump = ares__buf_create(); + EXPECT_EQ(ARES_SUCCESS, ares__buf_hexdump(hexdump, msg, msglen)); + char *hexdata = ares__buf_finish_str(hexdump, NULL); + //printf("HEXDUMP\n%s", hexdata); + ares_free(hexdata); + ares_dns_record_destroy(dnsrec); dnsrec = NULL; + + /* Parse */ + EXPECT_EQ(ARES_SUCCESS, ares_dns_parse(msg, msglen, 0, &dnsrec)); + ares_free(msg); msg = NULL; + + /* Re-write */ + EXPECT_EQ(ARES_SUCCESS, ares_dns_write(dnsrec, &msg, &msglen)); + + EXPECT_EQ(qdcount, ares_dns_record_query_cnt(dnsrec)); + EXPECT_EQ(ancount, ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_ANSWER)); + EXPECT_EQ(nscount, ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_AUTHORITY)); + EXPECT_EQ(arcount, ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_ADDITIONAL)); + + /* Iterate and print */ + ares__buf_t *printmsg = ares__buf_create(); + ares__buf_append_str(printmsg, ";; ->>HEADER<<- opcode: "); + ares__buf_append_str(printmsg, ares_dns_opcode_tostr(ares_dns_record_get_opcode(dnsrec))); + ares__buf_append_str(printmsg, ", status: "); + ares__buf_append_str(printmsg, ares_dns_rcode_tostr(ares_dns_record_get_rcode(dnsrec))); + ares__buf_append_str(printmsg, ", id: "); + ares__buf_append_num_dec(printmsg, (size_t)ares_dns_record_get_id(dnsrec), 0); + ares__buf_append_str(printmsg, "\n;; flags: "); + ares__buf_append_num_hex(printmsg, (size_t)ares_dns_record_get_flags(dnsrec), 0); + ares__buf_append_str(printmsg, "; QUERY: "); + ares__buf_append_num_dec(printmsg, ares_dns_record_query_cnt(dnsrec), 0); + ares__buf_append_str(printmsg, ", ANSWER: "); + ares__buf_append_num_dec(printmsg, ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_ANSWER), 0); + ares__buf_append_str(printmsg, ", AUTHORITY: "); + ares__buf_append_num_dec(printmsg, ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_AUTHORITY), 0); + ares__buf_append_str(printmsg, ", ADDITIONAL: "); + ares__buf_append_num_dec(printmsg, ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_ADDITIONAL), 0); + ares__buf_append_str(printmsg, "\n\n"); + ares__buf_append_str(printmsg, ";; QUESTION SECTION:\n"); + for (size_t i = 0; i < ares_dns_record_query_cnt(dnsrec); i++) { + const char *name; + ares_dns_rec_type_t qtype; + ares_dns_class_t qclass; + ares_dns_record_query_get(dnsrec, i, &name, &qtype, &qclass); + ares__buf_append_str(printmsg, ";"); + ares__buf_append_str(printmsg, name); + ares__buf_append_str(printmsg, ".\t\t\t"); + ares__buf_append_str(printmsg, ares_dns_class_tostr(qclass)); + ares__buf_append_str(printmsg, "\t"); + ares__buf_append_str(printmsg, ares_dns_rec_type_tostr(qtype)); + ares__buf_append_str(printmsg, "\n"); + } + ares__buf_append_str(printmsg, "\n"); + for (size_t i = ARES_SECTION_ANSWER; i < ARES_SECTION_ADDITIONAL + 1; i++) { + ares__buf_append_str(printmsg, ";; "); + ares__buf_append_str(printmsg, ares_dns_section_tostr((ares_dns_section_t)i)); + ares__buf_append_str(printmsg, " SECTION:\n"); + for (size_t j = 0; j < ares_dns_record_rr_cnt(dnsrec, (ares_dns_section_t)i); j++) { + const ares_dns_rr_t *rr = ares_dns_record_rr_get(dnsrec, (ares_dns_section_t)i, j); + ares__buf_append_str(printmsg, ares_dns_rr_get_name(rr)); + ares__buf_append_str(printmsg, ".\t\t\t"); + ares__buf_append_str(printmsg, ares_dns_class_tostr(ares_dns_rr_get_class(rr))); + ares__buf_append_str(printmsg, "\t"); + ares__buf_append_str(printmsg, ares_dns_rec_type_tostr(ares_dns_rr_get_type(rr))); + ares__buf_append_str(printmsg, "\t"); + ares__buf_append_num_dec(printmsg, ares_dns_rr_get_ttl(rr), 0); + ares__buf_append_str(printmsg, "\t"); + + size_t keys_cnt; + const ares_dns_rr_key_t *keys = ares_dns_rr_get_keys(ares_dns_rr_get_type(rr), &keys_cnt); + for (size_t k = 0; kflags |= ARES_FLAG_NOSEARCH|ARES_FLAG_NOALIASES; + EXPECT_EQ(ARES_SUCCESS, ares__single_domain(channel_, "www", &ptr)); + EXPECT_EQ("www", std::string(ptr)); + ares_free(ptr); + ptr = nullptr; + + SetAllocFail(1); + EXPECT_EQ(ARES_ENOMEM, ares__single_domain(channel_, "www", &ptr)); + EXPECT_EQ(nullptr, ptr); +} +#endif + +TEST_F(DefaultChannelTest, SaveInvalidChannel) { + ares__slist_t *saved = channel_->servers; + channel_->servers = NULL; + struct ares_options opts; + int optmask = 0; + EXPECT_EQ(ARES_ENODATA, ares_save_options(channel_, &opts, &optmask)); + channel_->servers = saved; +} + +// Need to put this in own function due to nested lambda bug +// in VS2013. (C2888) +static int configure_socket(ares_socket_t s) { + // transposed from ares-process, simplified non-block setter. +#if defined(USE_BLOCKING_SOCKETS) + return 0; /* returns success */ +#elif defined(HAVE_FCNTL_O_NONBLOCK) + /* most recent unix versions */ + int flags; + flags = fcntl(s, F_GETFL, 0); + return fcntl(s, F_SETFL, flags | O_NONBLOCK); +#elif defined(HAVE_IOCTL_FIONBIO) + /* older unix versions */ + int flags = 1; + return ioctl(s, FIONBIO, &flags); +#elif defined(HAVE_IOCTLSOCKET_FIONBIO) +#ifdef WATT32 + char flags = 1; +#else + /* Windows */ + unsigned long flags = 1UL; +#endif + return ioctlsocket(s, FIONBIO, &flags); +#elif defined(HAVE_IOCTLSOCKET_CAMEL_FIONBIO) + /* Amiga */ + long flags = 1L; + return IoctlSocket(s, FIONBIO, flags); +#elif defined(HAVE_SETSOCKOPT_SO_NONBLOCK) + /* BeOS */ + long b = 1L; + return setsockopt(s, SOL_SOCKET, SO_NONBLOCK, &b, sizeof(b)); +#else +# error "no non-blocking method was found/used/set" +#endif +} + +// TODO: This should not really be in this file, but we need ares config +// flags, and here they are available. +const struct ares_socket_functions VirtualizeIO::default_functions = { + [](int af, int type, int protocol, void *) -> ares_socket_t { + auto s = ::socket(af, type, protocol); + if (s == ARES_SOCKET_BAD) { + return s; + } + if (configure_socket(s) != 0) { + sclose(s); + return ares_socket_t(-1); + } + return s; + }, + NULL, + NULL, + NULL, + NULL +}; + + +} // namespace test +} // namespace ares diff --git a/lib/c-ares-1.19.1/test/ares-test-live.cc b/lib/c-ares-1.23.0/test/ares-test-live.cc similarity index 93% rename from lib/c-ares-1.19.1/test/ares-test-live.cc rename to lib/c-ares-1.23.0/test/ares-test-live.cc index 4e5680df4f3..28124daf8fd 100644 --- a/lib/c-ares-1.19.1/test/ares-test-live.cc +++ b/lib/c-ares-1.23.0/test/ares-test-live.cc @@ -1,3 +1,20 @@ +/* + * Copyright (C) The c-ares project + * + * 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. + * + * SPDX-License-Identifier: MIT + */ // This file includes tests that attempt to do real lookups // of DNS names using the local machine's live infrastructure. // As a result, we don't check the results very closely, to allow @@ -511,7 +528,7 @@ VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetNameInfoV4NotFound) { memset(&sockaddr, 0, sizeof(sockaddr)); sockaddr.sin_family = AF_INET; sockaddr.sin_port = htons(4); // Port 4 unassigned at IANA - // RFC5737 says 192.0.2.0 should not be used publically. + // RFC5737 says 192.0.2.0 should not be used publicly. sockaddr.sin_addr.s_addr = htonl(0xC0000200); ares_getnameinfo(channel_, (const struct sockaddr*)&sockaddr, sizeof(sockaddr), ARES_NI_LOOKUPHOST|ARES_NI_LOOKUPSERVICE|ARES_NI_UDP, @@ -529,7 +546,7 @@ VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetNameInfoV4NotFoundFail) { memset(&sockaddr, 0, sizeof(sockaddr)); sockaddr.sin_family = AF_INET; sockaddr.sin_port = htons(53); - // RFC5737 says 192.0.2.0 should not be used publically. + // RFC5737 says 192.0.2.0 should not be used publicly. sockaddr.sin_addr.s_addr = htonl(0xC0000200); ares_getnameinfo(channel_, (const struct sockaddr*)&sockaddr, sizeof(sockaddr), ARES_NI_LOOKUPHOST|ARES_NI_LOOKUPSERVICE|ARES_NI_UDP|ARES_NI_NAMEREQD, @@ -653,6 +670,17 @@ VIRT_NONVIRT_TEST_F(DefaultChannelTest, GetSock) { ares_gethostbyname(channel_, "www.google.com.", AF_INET, HostCallback, &result); bitmask = ares_getsock(channel_, socks, 3); EXPECT_NE(0, bitmask); + + size_t sock_cnt = 0; + for (size_t i=0; i<3; i++) { + if (ARES_GETSOCK_READABLE(bitmask, i) || ARES_GETSOCK_WRITABLE(bitmask, i)) { + EXPECT_NE(ARES_SOCKET_BAD, socks[i]); + if (socks[i] != ARES_SOCKET_BAD) + sock_cnt++; + } + } + EXPECT_NE((size_t)0, sock_cnt); + bitmask = ares_getsock(channel_, nullptr, 0); EXPECT_EQ(0, bitmask); @@ -660,8 +688,9 @@ VIRT_NONVIRT_TEST_F(DefaultChannelTest, GetSock) { } TEST_F(LibraryTest, GetTCPSock) { - ares_channel channel; - struct ares_options opts = {0}; + ares_channel_t *channel; + struct ares_options opts; + memset(&opts, 0, sizeof(opts)); opts.tcp_port = 53; opts.flags = ARES_FLAG_USEVC; int optmask = ARES_OPT_TCP_PORT | ARES_OPT_FLAGS; @@ -679,6 +708,17 @@ TEST_F(LibraryTest, GetTCPSock) { ares_gethostbyname(channel, "www.google.com.", AF_INET, HostCallback, &result); bitmask = ares_getsock(channel, socks, 3); EXPECT_NE(0, bitmask); + + size_t sock_cnt = 0; + for (size_t i=0; i<3; i++) { + if (ARES_GETSOCK_READABLE(bitmask, i) || ARES_GETSOCK_WRITABLE(bitmask, i)) { + EXPECT_NE(ARES_SOCKET_BAD, socks[i]); + if (socks[i] != ARES_SOCKET_BAD) + sock_cnt++; + } + } + EXPECT_NE((size_t)0, sock_cnt); + bitmask = ares_getsock(channel, nullptr, 0); EXPECT_EQ(0, bitmask); @@ -706,21 +746,24 @@ TEST_F(DefaultChannelTest, VerifySocketFunctionCallback) { HostResult result; ares_gethostbyname(channel_, "www.google.com.", AF_INET, HostCallback, &result); Process(); + EXPECT_TRUE(result.done_); - EXPECT_NE(0, count); + EXPECT_NE((size_t)0, count); } { count = 0; - ares_channel copy; + ares_channel_t *copy; EXPECT_EQ(ARES_SUCCESS, ares_dup(©, channel_)); HostResult result; ares_gethostbyname(copy, "www.google.com.", AF_INET, HostCallback, &result); + ProcessWork(copy, NoExtraFDs, nullptr); + EXPECT_TRUE(result.done_); ares_destroy(copy); - EXPECT_NE(0, count); + EXPECT_NE((size_t)0, count); } } @@ -735,10 +778,9 @@ TEST_F(DefaultChannelTest, LiveSetServers) { server2.family = AF_INET; server2.addr.addr4.s_addr = htonl(0x02030405); - // Change not allowed while request is pending HostResult result; ares_gethostbyname(channel_, "www.google.com.", AF_INET, HostCallback, &result); - EXPECT_EQ(ARES_ENOTIMP, ares_set_servers(channel_, &server1)); + EXPECT_EQ(ARES_SUCCESS, ares_set_servers(channel_, &server1)); ares_cancel(channel_); } @@ -757,19 +799,19 @@ TEST_F(DefaultChannelTest, LiveSetServersPorts) { server2.tcp_port = 0;; EXPECT_EQ(ARES_ENODATA, ares_set_servers_ports(nullptr, &server1)); - // Change not allowed while request is pending + // Change while pending will requeue any requests to new servers HostResult result; ares_gethostbyname(channel_, "www.google.com.", AF_INET, HostCallback, &result); - EXPECT_EQ(ARES_ENOTIMP, ares_set_servers_ports(channel_, &server1)); + EXPECT_EQ(ARES_SUCCESS, ares_set_servers_ports(channel_, &server1)); ares_cancel(channel_); } TEST_F(DefaultChannelTest, LiveSetServersCSV) { - // Change not allowed while request is pending HostResult result; ares_gethostbyname(channel_, "www.google.com.", AF_INET, HostCallback, &result); - EXPECT_EQ(ARES_ENOTIMP, ares_set_servers_csv(channel_, "1.2.3.4,2.3.4.5")); - EXPECT_EQ(ARES_ENOTIMP, ares_set_servers_ports_csv(channel_, "1.2.3.4:56,2.3.4.5:67")); + // Change while pending will requeue any requests to new servers + EXPECT_EQ(ARES_SUCCESS, ares_set_servers_csv(channel_, "1.2.3.4,2.3.4.5")); + EXPECT_EQ(ARES_SUCCESS, ares_set_servers_ports_csv(channel_, "1.2.3.4:56,2.3.4.5:67")); ares_cancel(channel_); } diff --git a/lib/c-ares-1.19.1/test/ares-test-main.cc b/lib/c-ares-1.23.0/test/ares-test-main.cc similarity index 56% rename from lib/c-ares-1.19.1/test/ares-test-main.cc rename to lib/c-ares-1.23.0/test/ares-test-main.cc index 86ac96a495c..92d52a5434f 100644 --- a/lib/c-ares-1.19.1/test/ares-test-main.cc +++ b/lib/c-ares-1.23.0/test/ares-test-main.cc @@ -1,3 +1,20 @@ +/* + * Copyright (C) The c-ares project + * + * 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. + * + * SPDX-License-Identifier: MIT + */ #include #include @@ -10,7 +27,7 @@ int main(int argc, char* argv[]) { ares::test::verbose = true; } else if ((strcmp(argv[ii], "-p") == 0) && (ii + 1 < argc)) { ii++; - ares::test::mock_port = atoi(argv[ii]); + ares::test::mock_port = (unsigned short)atoi(argv[ii]); } else if (strcmp(argv[ii], "-4") == 0) { ares::test::families = ares::test::ipv4_family; ares::test::families_modes = ares::test::ipv4_family_both_modes; @@ -21,7 +38,7 @@ int main(int argc, char* argv[]) { gtest_argv.push_back(argv[ii]); } } - int gtest_argc = gtest_argv.size(); + int gtest_argc = (int)gtest_argv.size(); gtest_argv.push_back(nullptr); ::testing::InitGoogleTest(>est_argc, gtest_argv.data()); diff --git a/lib/c-ares-1.19.1/test/ares-test-misc.cc b/lib/c-ares-1.23.0/test/ares-test-misc.cc similarity index 78% rename from lib/c-ares-1.19.1/test/ares-test-misc.cc rename to lib/c-ares-1.23.0/test/ares-test-misc.cc index f85a3bf604a..d5804f992a1 100644 --- a/lib/c-ares-1.19.1/test/ares-test-misc.cc +++ b/lib/c-ares-1.23.0/test/ares-test-misc.cc @@ -1,3 +1,20 @@ +/* + * Copyright (C) The c-ares project + * + * 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. + * + * SPDX-License-Identifier: MIT + */ #include "ares-test.h" #include "dns-proto.h" @@ -28,9 +45,21 @@ TEST_F(DefaultChannelTest, GetServersFailures) { } TEST_F(DefaultChannelTest, SetServers) { + /* NOTE: This test is because we have actual external users doing test case + * simulation and removing all servers to generate various error + * conditions in their own code. It would make more sense to return + * ARES_ENODATA, but due to historical users, we can't break them. + * See: https://github.com/nodejs/node/pull/50800 + */ EXPECT_EQ(ARES_SUCCESS, ares_set_servers(channel_, nullptr)); - std::vector empty; - EXPECT_EQ(empty, GetNameServers(channel_)); + std::vector expected_empty = { }; + EXPECT_EQ(expected_empty, GetNameServers(channel_)); + HostResult result; + ares_gethostbyname(channel_, "www.google.com.", AF_INET, HostCallback, &result); + Process(); + EXPECT_TRUE(result.done_); + EXPECT_EQ(ARES_ESERVFAIL, result.status_); + struct ares_addr_node server1; struct ares_addr_node server2; @@ -43,14 +72,20 @@ TEST_F(DefaultChannelTest, SetServers) { EXPECT_EQ(ARES_ENODATA, ares_set_servers(nullptr, &server1)); EXPECT_EQ(ARES_SUCCESS, ares_set_servers(channel_, &server1)); - std::vector expected = {"1.2.3.4", "2.3.4.5"}; + std::vector expected = {"1.2.3.4:53", "2.3.4.5:53"}; EXPECT_EQ(expected, GetNameServers(channel_)); } TEST_F(DefaultChannelTest, SetServersPorts) { + /* NOTE: This test is because we have actual external users doing test case + * simulation and removing all servers to generate various error + * conditions in their own code. It would make more sense to return + * ARES_ENODATA, but due to historical users, we can't break them. + * See: https://github.com/nodejs/node/pull/50800 + */ EXPECT_EQ(ARES_SUCCESS, ares_set_servers_ports(channel_, nullptr)); - std::vector empty; - EXPECT_EQ(empty, GetNameServers(channel_)); + std::vector expected_empty = { }; + EXPECT_EQ(expected_empty, GetNameServers(channel_)); struct ares_addr_port_node server1; struct ares_addr_port_node server2; @@ -67,7 +102,7 @@ TEST_F(DefaultChannelTest, SetServersPorts) { EXPECT_EQ(ARES_ENODATA, ares_set_servers_ports(nullptr, &server1)); EXPECT_EQ(ARES_SUCCESS, ares_set_servers_ports(channel_, &server1)); - std::vector expected = {"1.2.3.4:111", "2.3.4.5"}; + std::vector expected = {"1.2.3.4:111", "2.3.4.5:53"}; EXPECT_EQ(expected, GetNameServers(channel_)); } @@ -78,14 +113,29 @@ TEST_F(DefaultChannelTest, SetServersCSV) { EXPECT_EQ(ARES_ENODATA, ares_set_servers_csv(nullptr, "1.2.3.4.5")); EXPECT_EQ(ARES_ENODATA, ares_set_servers_csv(nullptr, "1:2:3:4:5")); + /* NOTE: This test is because we have actual external users doing test case + * simulation and removing all servers to generate various error + * conditions in their own code. It would make more sense to return + * ARES_ENODATA, but due to historical users, we can't break them. + * See: https://github.com/nodejs/node/pull/50800 + */ + EXPECT_EQ(ARES_SUCCESS, ares_set_servers_csv(channel_, NULL)); + std::vector expected_empty = { }; + EXPECT_EQ(expected_empty, GetNameServers(channel_)); + EXPECT_EQ(ARES_SUCCESS, ares_set_servers_csv(channel_, "")); + EXPECT_EQ(expected_empty, GetNameServers(channel_)); + + + + EXPECT_EQ(ARES_SUCCESS, ares_set_servers_csv(channel_, "1.2.3.4,0102:0304:0506:0708:0910:1112:1314:1516,2.3.4.5")); - std::vector expected = {"1.2.3.4", "0102:0304:0506:0708:0910:1112:1314:1516", "2.3.4.5"}; + std::vector expected = {"1.2.3.4:53", "[0102:0304:0506:0708:0910:1112:1314:1516]:53", "2.3.4.5:53"}; EXPECT_EQ(expected, GetNameServers(channel_)); // Same, with spaces EXPECT_EQ(ARES_EBADSTR, - ares_set_servers_csv(channel_, "1.2.3.4 , 0102:0304:0506:0708:0910:1112:1314:1516, 2.3.4.5")); + ares_set_servers_csv(channel_, "1.2.3.4 , [0102:0304:0506:0708:0910:1112:1314:1516]:53, 2.3.4.5")); // Same, with ports EXPECT_EQ(ARES_SUCCESS, @@ -97,7 +147,7 @@ TEST_F(DefaultChannelTest, SetServersCSV) { EXPECT_EQ(expected2, GetNameServers(channel_)); // Should survive duplication - ares_channel channel2; + ares_channel_t *channel2; EXPECT_EQ(ARES_SUCCESS, ares_dup(&channel2, channel_)); EXPECT_EQ(expected2, GetNameServers(channel2)); ares_destroy(channel2); @@ -109,11 +159,6 @@ TEST_F(DefaultChannelTest, SetServersCSV) { ares_set_servers_csv(channel_, "1.2.3.4,0102:0304:0506:0708:0910:1112:1314:1516,2.3.4.5")); } - // Blank servers - EXPECT_EQ(ARES_SUCCESS, ares_set_servers_csv(channel_, "")); - std::vector none; - EXPECT_EQ(none, GetNameServers(channel_)); - EXPECT_EQ(ARES_EBADSTR, ares_set_servers_csv(channel_, "2.3.4.5,1.2.3.4:,3.4.5.6")); EXPECT_EQ(ARES_EBADSTR, ares_set_servers_csv(channel_, "2.3.4.5,1.2.3.4:Z,3.4.5.6")); } @@ -180,15 +225,17 @@ TEST_F(LibraryTest, Mkquery) { TEST_F(LibraryTest, CreateQuery) { byte* p; int len; + // This is hard to really test with escaping since DNS names don't allow + // bad characters. So we'll escape good characters. EXPECT_EQ(ARES_SUCCESS, - ares_create_query("exam\\@le.com", C_IN, T_A, 0x1234, 0, + ares_create_query("ex\\097m\\ple.com", C_IN, T_A, 0x1234, 0, &p, &len, 0)); std::vector data(p, p + len); ares_free_string(p); std::string actual = PacketToString(data); DNSPacket pkt; - pkt.set_qid(0x1234).add_question(new DNSQuestion("exam@le.com", T_A)); + pkt.set_qid(0x1234).add_question(new DNSQuestion("example.com", T_A)); std::string expected = PacketToString(pkt.data()); EXPECT_EQ(expected, actual); } @@ -308,7 +355,7 @@ TEST_F(DefaultChannelTest, SendFailure) { std::string ExpandName(const std::vector& data, int offset, long *enclen) { char *name = nullptr; - int rc = ares_expand_name(data.data() + offset, data.data(), data.size(), + int rc = ares_expand_name(data.data() + offset, data.data(), (int)data.size(), &name, enclen); EXPECT_EQ(ARES_SUCCESS, rc); std::string result; @@ -325,7 +372,7 @@ TEST_F(LibraryTest, ExpandName) { long enclen; std::vector data1 = {1, 'a', 2, 'b', 'c', 3, 'd', 'e', 'f', 0}; EXPECT_EQ("a.bc.def", ExpandName(data1, 0, &enclen)); - EXPECT_EQ(data1.size(), enclen); + EXPECT_EQ(data1.size(), (size_t)enclen); std::vector data2 = {0}; EXPECT_EQ("", ExpandName(data2, 0, &enclen)); @@ -374,7 +421,7 @@ TEST_F(LibraryTest, ExpandNameFailure) { long enclen; SetAllocFail(1); EXPECT_EQ(ARES_ENOMEM, - ares_expand_name(data1.data(), data1.data(), data1.size(), + ares_expand_name(data1.data(), data1.data(), (int)data1.size(), &name, &enclen)); // Empty packet @@ -383,37 +430,37 @@ TEST_F(LibraryTest, ExpandNameFailure) { // Start beyond enclosing data EXPECT_EQ(ARES_EBADNAME, - ares_expand_name(data1.data() + data1.size(), data1.data(), data1.size(), + ares_expand_name(data1.data() + data1.size(), data1.data(), (int)data1.size(), &name, &enclen)); // Length beyond size of enclosing data std::vector data2a = {0x13, 'c', 'o', 'm', 0x00}; EXPECT_EQ(ARES_EBADNAME, - ares_expand_name(data2a.data(), data2a.data(), data2a.size(), + ares_expand_name(data2a.data(), data2a.data(), (int)data2a.size(), &name, &enclen)); std::vector data2b = {0x1}; EXPECT_EQ(ARES_EBADNAME, - ares_expand_name(data2b.data(), data2b.data(), data2b.size(), + ares_expand_name(data2b.data(), data2b.data(), (int)data2b.size(), &name, &enclen)); std::vector data2c = {0xC0}; EXPECT_EQ(ARES_EBADNAME, - ares_expand_name(data2c.data(), data2c.data(), data2c.size(), + ares_expand_name(data2c.data(), data2c.data(), (int)data2c.size(), &name, &enclen)); // Indirection beyond enclosing data std::vector data3a = {0xC0, 0x02}; EXPECT_EQ(ARES_EBADNAME, - ares_expand_name(data3a.data(), data3a.data(), data3a.size(), + ares_expand_name(data3a.data(), data3a.data(), (int)data3a.size(), &name, &enclen)); std::vector data3b = {0xC0, 0x0A, 'c', 'o', 'm', 0x00}; EXPECT_EQ(ARES_EBADNAME, - ares_expand_name(data3b.data(), data3b.data(), data3b.size(), + ares_expand_name(data3b.data(), data3b.data(), (int)data3b.size(), &name, &enclen)); // Invalid top bits in label length std::vector data4 = {0x03, 'c', 'o', 'm', 0x00, 0x80, 0x00}; EXPECT_EQ(ARES_EBADNAME, - ares_expand_name(data4.data() + 5, data4.data(), data4.size(), + ares_expand_name(data4.data() + 5, data4.data(), (int)data4.size(), &name, &enclen)); // Label too long: 64-byte label, with invalid top 2 bits of length (01). @@ -424,29 +471,29 @@ TEST_F(LibraryTest, ExpandNameFailure) { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 0x00}; EXPECT_EQ(ARES_EBADNAME, - ares_expand_name(data5.data(), data5.data(), data5.size(), + ares_expand_name(data5.data(), data5.data(), (int)data5.size(), &name, &enclen)) << name; // Incomplete indirect length std::vector data6 = {0x03, 'c', 'o', 'm', 0x00, 0xC0}; EXPECT_EQ(ARES_EBADNAME, - ares_expand_name(data6.data() + 5, data6.data(), data6.size(), + ares_expand_name(data6.data() + 5, data6.data(), (int)data6.size(), &name, &enclen)); // Indirection loops std::vector data7 = {0xC0, 0x02, 0xC0, 0x00}; EXPECT_EQ(ARES_EBADNAME, - ares_expand_name(data7.data(), data7.data(), data7.size(), + ares_expand_name(data7.data(), data7.data(), (int)data7.size(), &name, &enclen)); std::vector data8 = {3, 'd', 'e', 'f', 0xC0, 0x08, 0x00, 0x00, 3, 'a', 'b', 'c', 0xC0, 0x00}; EXPECT_EQ(ARES_EBADNAME, - ares_expand_name(data8.data(), data8.data(), data8.size(), + ares_expand_name(data8.data(), data8.data(), (int)data8.size(), &name, &enclen)); std::vector data9 = {0x12, 0x23, // start 2 bytes in 3, 'd', 'e', 'f', 0xC0, 0x02}; EXPECT_EQ(ARES_EBADNAME, - ares_expand_name(data9.data() + 2, data9.data(), data9.size(), + ares_expand_name(data9.data() + 2, data9.data(), (int)data9.size(), &name, &enclen)); } @@ -504,21 +551,21 @@ TEST_F(LibraryTest, ExpandString) { char* result = nullptr; long len; EXPECT_EQ(ARES_SUCCESS, - ares_expand_string(s1.data(), s1.data(), s1.size(), + ares_expand_string(s1.data(), s1.data(), (int)s1.size(), (unsigned char**)&result, &len)); EXPECT_EQ("abc", std::string(result)); EXPECT_EQ(1 + 3, len); // amount of data consumed includes 1 byte len ares_free_string(result); result = nullptr; EXPECT_EQ(ARES_EBADSTR, - ares_expand_string(s1.data() + 1, s1.data(), s1.size(), + ares_expand_string(s1.data() + 1, s1.data(), (int)s1.size(), (unsigned char**)&result, &len)); EXPECT_EQ(ARES_EBADSTR, - ares_expand_string(s1.data() + 4, s1.data(), s1.size(), + ares_expand_string(s1.data() + 4, s1.data(), (int)s1.size(), (unsigned char**)&result, &len)); - SetAllocSizeFail(3 + 1); + SetAllocFail(1); EXPECT_EQ(ARES_ENOMEM, - ares_expand_string(s1.data(), s1.data(), s1.size(), + ares_expand_string(s1.data(), s1.data(), (int)s1.size(), (unsigned char**)&result, &len)); } diff --git a/lib/c-ares-1.19.1/test/ares-test-mock-ai.cc b/lib/c-ares-1.23.0/test/ares-test-mock-ai.cc similarity index 89% rename from lib/c-ares-1.19.1/test/ares-test-mock-ai.cc rename to lib/c-ares-1.23.0/test/ares-test-mock-ai.cc index afbec30ce11..7115b514194 100644 --- a/lib/c-ares-1.19.1/test/ares-test-mock-ai.cc +++ b/lib/c-ares-1.23.0/test/ares-test-mock-ai.cc @@ -1,3 +1,20 @@ +/* + * Copyright (C) The c-ares project + * + * 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. + * + * SPDX-License-Identifier: MIT + */ #include "ares-test-ai.h" #include "dns-proto.h" @@ -128,11 +145,10 @@ TEST_P(MockUDPChannelTestAI, TruncationRetry) { EXPECT_THAT(result.ai_, IncludesV4Address("1.2.3.4")); } -// TCP only to prevent retries TEST_P(MockTCPChannelTestAI, MalformedResponse) { std::vector one = {0x01}; - EXPECT_CALL(server_, OnRequest("www.google.com", T_A)) - .WillOnce(SetReplyData(&server_, one)); + ON_CALL(server_, OnRequest("www.google.com", T_A)) + .WillByDefault(SetReplyData(&server_, one)); AddrInfoResult result; struct ares_addrinfo_hints hints = {}; @@ -167,8 +183,8 @@ TEST_P(MockTCPChannelTestAI, ServFailResponse) { rsp.set_response().set_aa() .add_question(new DNSQuestion("www.google.com", T_A)); rsp.set_rcode(SERVFAIL); - EXPECT_CALL(server_, OnRequest("www.google.com", T_A)) - .WillOnce(SetReply(&server_, &rsp)); + ON_CALL(server_, OnRequest("www.google.com", T_A)) + .WillByDefault(SetReply(&server_, &rsp)); AddrInfoResult result; struct ares_addrinfo_hints hints = {}; @@ -177,8 +193,7 @@ TEST_P(MockTCPChannelTestAI, ServFailResponse) { ares_getaddrinfo(channel_, "www.google.com.", NULL, &hints, AddrInfoCallback, &result); Process(); EXPECT_TRUE(result.done_); - // ARES_FLAG_NOCHECKRESP not set, so SERVFAIL consumed - EXPECT_EQ(ARES_ECONNREFUSED, result.status_); + EXPECT_EQ(ARES_ESERVFAIL, result.status_); } TEST_P(MockTCPChannelTestAI, NotImplResponse) { @@ -186,8 +201,8 @@ TEST_P(MockTCPChannelTestAI, NotImplResponse) { rsp.set_response().set_aa() .add_question(new DNSQuestion("www.google.com", T_A)); rsp.set_rcode(NOTIMP); - EXPECT_CALL(server_, OnRequest("www.google.com", T_A)) - .WillOnce(SetReply(&server_, &rsp)); + ON_CALL(server_, OnRequest("www.google.com", T_A)) + .WillByDefault(SetReply(&server_, &rsp)); AddrInfoResult result; struct ares_addrinfo_hints hints = {}; @@ -196,8 +211,7 @@ TEST_P(MockTCPChannelTestAI, NotImplResponse) { ares_getaddrinfo(channel_, "www.google.com.", NULL, &hints, AddrInfoCallback, &result); Process(); EXPECT_TRUE(result.done_); - // ARES_FLAG_NOCHECKRESP not set, so NOTIMP consumed - EXPECT_EQ(ARES_ECONNREFUSED, result.status_); + EXPECT_EQ(ARES_ENOTIMP, result.status_); } TEST_P(MockTCPChannelTestAI, RefusedResponse) { @@ -205,8 +219,8 @@ TEST_P(MockTCPChannelTestAI, RefusedResponse) { rsp.set_response().set_aa() .add_question(new DNSQuestion("www.google.com", T_A)); rsp.set_rcode(REFUSED); - EXPECT_CALL(server_, OnRequest("www.google.com", T_A)) - .WillOnce(SetReply(&server_, &rsp)); + ON_CALL(server_, OnRequest("www.google.com", T_A)) + .WillByDefault(SetReply(&server_, &rsp)); AddrInfoResult result; struct ares_addrinfo_hints hints = {}; @@ -215,8 +229,7 @@ TEST_P(MockTCPChannelTestAI, RefusedResponse) { ares_getaddrinfo(channel_, "www.google.com.", NULL, &hints, AddrInfoCallback, &result); Process(); EXPECT_TRUE(result.done_); - // ARES_FLAG_NOCHECKRESP not set, so REFUSED consumed - EXPECT_EQ(ARES_ECONNREFUSED, result.status_); + EXPECT_EQ(ARES_EREFUSED, result.status_); } TEST_P(MockTCPChannelTestAI, YXDomainResponse) { @@ -620,22 +633,17 @@ class MockMultiServerChannelTestAI } }; -class RotateMultiMockTestAI : public MockMultiServerChannelTestAI { - public: - RotateMultiMockTestAI() : MockMultiServerChannelTestAI(true) {} -}; - class NoRotateMultiMockTestAI : public MockMultiServerChannelTestAI { public: NoRotateMultiMockTestAI() : MockMultiServerChannelTestAI(false) {} }; - -TEST_P(RotateMultiMockTestAI, ThirdServer) { - struct ares_options opts = {0}; +TEST_P(NoRotateMultiMockTestAI, ThirdServer) { + struct ares_options opts; int optmask = 0; + memset(&opts, 0, sizeof(opts)); EXPECT_EQ(ARES_SUCCESS, ares_save_options(channel_, &opts, &optmask)); - EXPECT_EQ(0, (optmask & ARES_OPT_NOROTATE)); + EXPECT_EQ(ARES_OPT_NOROTATE, (optmask & ARES_OPT_NOROTATE)); ares_destroy_options(&opts); DNSPacket servfailrsp; @@ -649,7 +657,7 @@ TEST_P(RotateMultiMockTestAI, ThirdServer) { .add_question(new DNSQuestion("www.example.com", T_A)) .add_answer(new DNSARR("www.example.com", 100, {2,3,4,5})); - EXPECT_CALL(*servers_[0], OnRequest("www.example.com", T_A)) + EXPECT_CALL(*servers_[0], OnRequest("www.example.com", T_A)) .WillOnce(SetReply(servers_[0].get(), &servfailrsp)); EXPECT_CALL(*servers_[1], OnRequest("www.example.com", T_A)) .WillOnce(SetReply(servers_[1].get(), ¬implrsp)); @@ -657,16 +665,8 @@ TEST_P(RotateMultiMockTestAI, ThirdServer) { .WillOnce(SetReply(servers_[2].get(), &okrsp)); CheckExample(); - // Second time around, starts from server [1]. - EXPECT_CALL(*servers_[1], OnRequest("www.example.com", T_A)) - .WillOnce(SetReply(servers_[1].get(), &servfailrsp)); - EXPECT_CALL(*servers_[2], OnRequest("www.example.com", T_A)) - .WillOnce(SetReply(servers_[2].get(), ¬implrsp)); - EXPECT_CALL(*servers_[0], OnRequest("www.example.com", T_A)) - .WillOnce(SetReply(servers_[0].get(), &okrsp)); - CheckExample(); - - // Third time around, starts from server [2]. + // Second time around, still starts from server [2], as [0] and [1] both + // recorded failures EXPECT_CALL(*servers_[2], OnRequest("www.example.com", T_A)) .WillOnce(SetReply(servers_[2].get(), &servfailrsp)); EXPECT_CALL(*servers_[0], OnRequest("www.example.com", T_A)) @@ -674,50 +674,18 @@ TEST_P(RotateMultiMockTestAI, ThirdServer) { EXPECT_CALL(*servers_[1], OnRequest("www.example.com", T_A)) .WillOnce(SetReply(servers_[1].get(), &okrsp)); CheckExample(); -} -TEST_P(NoRotateMultiMockTestAI, ThirdServer) { - struct ares_options opts = {0}; - int optmask = 0; - EXPECT_EQ(ARES_SUCCESS, ares_save_options(channel_, &opts, &optmask)); - EXPECT_EQ(ARES_OPT_NOROTATE, (optmask & ARES_OPT_NOROTATE)); - ares_destroy_options(&opts); - - DNSPacket servfailrsp; - servfailrsp.set_response().set_aa().set_rcode(SERVFAIL) - .add_question(new DNSQuestion("www.example.com", T_A)); - DNSPacket notimplrsp; - notimplrsp.set_response().set_aa().set_rcode(NOTIMP) - .add_question(new DNSQuestion("www.example.com", T_A)); - DNSPacket okrsp; - okrsp.set_response().set_aa() - .add_question(new DNSQuestion("www.example.com", T_A)) - .add_answer(new DNSARR("www.example.com", 100, {2,3,4,5})); - - EXPECT_CALL(*servers_[0], OnRequest("www.example.com", T_A)) - .WillOnce(SetReply(servers_[0].get(), &servfailrsp)); + // Third time around, server order is [1] (f0), [2] (f1), [0] (f2), which + // means [1] will get called twice in a row as after the first call + // order will be [1] (f1), [2] (f1), [0] (f2) since sort order is + // (failure count, index) EXPECT_CALL(*servers_[1], OnRequest("www.example.com", T_A)) + .WillOnce(SetReply(servers_[1].get(), &servfailrsp)) .WillOnce(SetReply(servers_[1].get(), ¬implrsp)); EXPECT_CALL(*servers_[2], OnRequest("www.example.com", T_A)) - .WillOnce(SetReply(servers_[2].get(), &okrsp)); - CheckExample(); - - // Second time around, still starts from server [0]. - EXPECT_CALL(*servers_[0], OnRequest("www.example.com", T_A)) - .WillOnce(SetReply(servers_[0].get(), &servfailrsp)); - EXPECT_CALL(*servers_[1], OnRequest("www.example.com", T_A)) - .WillOnce(SetReply(servers_[1].get(), ¬implrsp)); - EXPECT_CALL(*servers_[2], OnRequest("www.example.com", T_A)) - .WillOnce(SetReply(servers_[2].get(), &okrsp)); - CheckExample(); - - // Third time around, still starts from server [0]. + .WillOnce(SetReply(servers_[2].get(), ¬implrsp)); EXPECT_CALL(*servers_[0], OnRequest("www.example.com", T_A)) - .WillOnce(SetReply(servers_[0].get(), &servfailrsp)); - EXPECT_CALL(*servers_[1], OnRequest("www.example.com", T_A)) - .WillOnce(SetReply(servers_[1].get(), ¬implrsp)); - EXPECT_CALL(*servers_[2], OnRequest("www.example.com", T_A)) - .WillOnce(SetReply(servers_[2].get(), &okrsp)); + .WillOnce(SetReply(servers_[0].get(), &okrsp)); CheckExample(); } @@ -762,9 +730,6 @@ INSTANTIATE_TEST_SUITE_P(AddressFamiliesAI, MockNoCheckRespChannelTestAI, INSTANTIATE_TEST_SUITE_P(AddressFamiliesAI, MockEDNSChannelTestAI, ::testing::ValuesIn(ares::test::families_modes)); -INSTANTIATE_TEST_SUITE_P(TransportModesAI, RotateMultiMockTestAI, - ::testing::ValuesIn(ares::test::families_modes)); - INSTANTIATE_TEST_SUITE_P(TransportModesAI, NoRotateMultiMockTestAI, ::testing::ValuesIn(ares::test::families_modes)); diff --git a/lib/c-ares-1.19.1/test/ares-test-mock.cc b/lib/c-ares-1.23.0/test/ares-test-mock.cc similarity index 83% rename from lib/c-ares-1.19.1/test/ares-test-mock.cc rename to lib/c-ares-1.23.0/test/ares-test-mock.cc index e29c050f397..6c490d3268d 100644 --- a/lib/c-ares-1.19.1/test/ares-test-mock.cc +++ b/lib/c-ares-1.23.0/test/ares-test-mock.cc @@ -1,3 +1,20 @@ +/* + * Copyright (C) The c-ares project + * + * 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. + * + * SPDX-License-Identifier: MIT + */ #include "ares-test.h" #include "dns-proto.h" @@ -202,11 +219,161 @@ TEST_P(MockChannelTest, SockConfigureFailCallback) { EXPECT_EQ(ARES_ECONNREFUSED, result.status_); } -// TCP only to prevent retries -TEST_P(MockTCPChannelTest, MalformedResponse) { - std::vector one = {0x01}; +TEST_P(MockChannelTest, ReInit) { + DNSPacket rsp; + rsp.set_response().set_aa() + .add_question(new DNSQuestion("www.google.com", T_A)) + .add_answer(new DNSARR("www.google.com", 100, {2, 3, 4, 5})); EXPECT_CALL(server_, OnRequest("www.google.com", T_A)) - .WillOnce(SetReplyData(&server_, one)); + .WillOnce(SetReply(&server_, &rsp)); + + HostResult result; + ares_gethostbyname(channel_, "www.google.com.", AF_INET, HostCallback, &result); + EXPECT_EQ(ARES_SUCCESS, ares_reinit(channel_)); + Process(); + EXPECT_TRUE(result.done_); + std::stringstream ss; + ss << result.host_; + EXPECT_EQ("{'www.google.com' aliases=[] addrs=[2.3.4.5]}", ss.str()); +} + +#define MAXUDPQUERIES_TOTAL 32 +#define MAXUDPQUERIES_LIMIT 8 + +class MockUDPMaxQueriesTest + : public MockChannelOptsTest, + public ::testing::WithParamInterface { + public: + MockUDPMaxQueriesTest() + : MockChannelOptsTest(1, GetParam(), false, + FillOptions(&opts_), + ARES_OPT_UDP_MAX_QUERIES) {} + static struct ares_options* FillOptions(struct ares_options * opts) { + memset(opts, 0, sizeof(struct ares_options)); + opts->udp_max_queries = MAXUDPQUERIES_LIMIT; + return opts; + } + private: + struct ares_options opts_; +}; + +TEST_P(MockUDPMaxQueriesTest, GetHostByNameParallelLookups) { + DNSPacket rsp; + rsp.set_response().set_aa() + .add_question(new DNSQuestion("www.google.com", T_A)) + .add_answer(new DNSARR("www.google.com", 100, {2, 3, 4, 5})); + ON_CALL(server_, OnRequest("www.google.com", T_A)) + .WillByDefault(SetReply(&server_, &rsp)); + + // Get notified of new sockets so we can validate how many are created + int rc = ARES_SUCCESS; + ares_set_socket_callback(channel_, SocketConnectCallback, &rc); + sock_cb_count = 0; + + HostResult result[MAXUDPQUERIES_TOTAL]; + for (size_t i=0; i { + public: + CacheQueriesTest() + : MockChannelOptsTest(1, GetParam(), false, + FillOptions(&opts_), + ARES_OPT_QUERY_CACHE) {} + static struct ares_options* FillOptions(struct ares_options * opts) { + memset(opts, 0, sizeof(struct ares_options)); + opts->qcache_max_ttl = 3600; + return opts; + } + private: + struct ares_options opts_; +}; + +TEST_P(CacheQueriesTest, GetHostByNameCache) { + DNSPacket rsp; + rsp.set_response().set_aa() + .add_question(new DNSQuestion("www.google.com", T_A)) + .add_answer(new DNSARR("www.google.com", 100, {2, 3, 4, 5})); + ON_CALL(server_, OnRequest("www.google.com", T_A)) + .WillByDefault(SetReply(&server_, &rsp)); + + // Get notified of new sockets so we can validate how many are created + int rc = ARES_SUCCESS; + ares_set_socket_callback(channel_, SocketConnectCallback, &rc); + sock_cb_count = 0; + + HostResult result1; + ares_gethostbyname(channel_, "www.google.com.", AF_INET, HostCallback, &result1); + Process(); + + std::stringstream ss1; + EXPECT_TRUE(result1.done_); + ss1 << result1.host_; + EXPECT_EQ("{'www.google.com' aliases=[] addrs=[2.3.4.5]}", ss1.str()); + + /* Run again, should return cached result */ + HostResult result2; + ares_gethostbyname(channel_, "www.google.com.", AF_INET, HostCallback, &result2); + Process(); + + std::stringstream ss2; + EXPECT_TRUE(result2.done_); + ss2 << result2.host_; + EXPECT_EQ("{'www.google.com' aliases=[] addrs=[2.3.4.5]}", ss2.str()); + + EXPECT_EQ(1, sock_cb_count); +} + +#define TCPPARALLELLOOKUPS 32 +TEST_P(MockTCPChannelTest, GetHostByNameParallelLookups) { + DNSPacket rsp; + rsp.set_response().set_aa() + .add_question(new DNSQuestion("www.google.com", T_A)) + .add_answer(new DNSARR("www.google.com", 100, {2, 3, 4, 5})); + ON_CALL(server_, OnRequest("www.google.com", T_A)) + .WillByDefault(SetReply(&server_, &rsp)); + + // Get notified of new sockets so we can validate how many are created + int rc = ARES_SUCCESS; + ares_set_socket_callback(channel_, SocketConnectCallback, &rc); + sock_cb_count = 0; + + HostResult result[TCPPARALLELLOOKUPS]; + for (size_t i=0; i one = {0x00}; + ON_CALL(server_, OnRequest("www.google.com", T_A)) + .WillByDefault(SetReplyData(&server_, one)); HostResult result; ares_gethostbyname(channel_, "www.google.com.", AF_INET, HostCallback, &result); @@ -234,14 +401,13 @@ TEST_P(MockTCPChannelTest, ServFailResponse) { rsp.set_response().set_aa() .add_question(new DNSQuestion("www.google.com", T_A)); rsp.set_rcode(SERVFAIL); - EXPECT_CALL(server_, OnRequest("www.google.com", T_A)) - .WillOnce(SetReply(&server_, &rsp)); + ON_CALL(server_, OnRequest("www.google.com", T_A)) + .WillByDefault(SetReply(&server_, &rsp)); HostResult result; ares_gethostbyname(channel_, "www.google.com.", AF_INET, HostCallback, &result); Process(); EXPECT_TRUE(result.done_); - // ARES_FLAG_NOCHECKRESP not set, so SERVFAIL consumed - EXPECT_EQ(ARES_ECONNREFUSED, result.status_); + EXPECT_EQ(ARES_ESERVFAIL, result.status_); } TEST_P(MockTCPChannelTest, NotImplResponse) { @@ -249,14 +415,13 @@ TEST_P(MockTCPChannelTest, NotImplResponse) { rsp.set_response().set_aa() .add_question(new DNSQuestion("www.google.com", T_A)); rsp.set_rcode(NOTIMP); - EXPECT_CALL(server_, OnRequest("www.google.com", T_A)) - .WillOnce(SetReply(&server_, &rsp)); + ON_CALL(server_, OnRequest("www.google.com", T_A)) + .WillByDefault(SetReply(&server_, &rsp)); HostResult result; ares_gethostbyname(channel_, "www.google.com.", AF_INET, HostCallback, &result); Process(); EXPECT_TRUE(result.done_); - // ARES_FLAG_NOCHECKRESP not set, so NOTIMP consumed - EXPECT_EQ(ARES_ECONNREFUSED, result.status_); + EXPECT_EQ(ARES_ENOTIMP, result.status_); } TEST_P(MockTCPChannelTest, RefusedResponse) { @@ -264,14 +429,13 @@ TEST_P(MockTCPChannelTest, RefusedResponse) { rsp.set_response().set_aa() .add_question(new DNSQuestion("www.google.com", T_A)); rsp.set_rcode(REFUSED); - EXPECT_CALL(server_, OnRequest("www.google.com", T_A)) - .WillOnce(SetReply(&server_, &rsp)); + ON_CALL(server_, OnRequest("www.google.com", T_A)) + .WillByDefault(SetReply(&server_, &rsp)); HostResult result; ares_gethostbyname(channel_, "www.google.com.", AF_INET, HostCallback, &result); Process(); EXPECT_TRUE(result.done_); - // ARES_FLAG_NOCHECKRESP not set, so REFUSED consumed - EXPECT_EQ(ARES_ECONNREFUSED, result.status_); + EXPECT_EQ(ARES_EREFUSED, result.status_); } TEST_P(MockTCPChannelTest, YXDomainResponse) { @@ -631,6 +795,29 @@ TEST_P(MockChannelTest, SearchHighNdots) { ss.str()); } +TEST_P(MockUDPChannelTest, V4WorksV6Timeout) { + std::vector nothing; + DNSPacket reply; + reply.set_response().set_aa() + .add_question(new DNSQuestion("www.google.com", T_A)) + .add_answer(new DNSARR("www.google.com", 0x0100, {0x01, 0x02, 0x03, 0x04})); + + ON_CALL(server_, OnRequest("www.google.com", T_A)) + .WillByDefault(SetReply(&server_, &reply)); + + ON_CALL(server_, OnRequest("www.google.com", T_AAAA)) + .WillByDefault(SetReplyData(&server_, nothing)); + + HostResult result; + ares_gethostbyname(channel_, "www.google.com.", AF_UNSPEC, HostCallback, &result); + Process(); + EXPECT_TRUE(result.done_); + EXPECT_EQ(1, result.timeouts_); + std::stringstream ss; + ss << result.host_; + EXPECT_EQ("{'www.google.com' aliases=[] addrs=[1.2.3.4]}", ss.str()); +} + TEST_P(MockChannelTest, UnspecifiedFamilyV6) { DNSPacket rsp6; rsp6.set_response().set_aa() @@ -923,6 +1110,26 @@ TEST_P(MockUDPChannelTest, CancelLater) { EXPECT_EQ(0, result.timeouts_); } +TEST_P(MockChannelTest, DisconnectFirstAttempt) { + DNSPacket reply; + reply.set_response().set_aa() + .add_question(new DNSQuestion("www.google.com", T_A)) + .add_answer(new DNSARR("www.google.com", 0x0100, {0x01, 0x02, 0x03, 0x04})); + + // On second request, cancel the channel. + EXPECT_CALL(server_, OnRequest("www.google.com", T_A)) + .WillOnce(Disconnect(&server_)) + .WillOnce(SetReply(&server_, &reply)); + + HostResult result; + ares_gethostbyname(channel_, "www.google.com.", AF_INET, HostCallback, &result); + Process(); + EXPECT_TRUE(result.done_); + std::stringstream ss; + ss << result.host_; + EXPECT_EQ("{'www.google.com' aliases=[] addrs=[1.2.3.4]}", ss.str()); +} + TEST_P(MockChannelTest, GetHostByNameDestroyAbsolute) { HostResult result; ares_gethostbyname(channel_, "www.google.com.", AF_INET, HostCallback, &result); @@ -1078,22 +1285,17 @@ class MockMultiServerChannelTest } }; -class RotateMultiMockTest : public MockMultiServerChannelTest { - public: - RotateMultiMockTest() : MockMultiServerChannelTest(true) {} -}; - class NoRotateMultiMockTest : public MockMultiServerChannelTest { public: NoRotateMultiMockTest() : MockMultiServerChannelTest(false) {} }; - -TEST_P(RotateMultiMockTest, ThirdServer) { - struct ares_options opts = {0}; +TEST_P(NoRotateMultiMockTest, ThirdServer) { + struct ares_options opts; int optmask = 0; + memset(&opts, 0, sizeof(opts)); EXPECT_EQ(ARES_SUCCESS, ares_save_options(channel_, &opts, &optmask)); - EXPECT_EQ(0, (optmask & ARES_OPT_NOROTATE)); + EXPECT_EQ(ARES_OPT_NOROTATE, (optmask & ARES_OPT_NOROTATE)); ares_destroy_options(&opts); DNSPacket servfailrsp; @@ -1115,16 +1317,8 @@ TEST_P(RotateMultiMockTest, ThirdServer) { .WillOnce(SetReply(servers_[2].get(), &okrsp)); CheckExample(); - // Second time around, starts from server [1]. - EXPECT_CALL(*servers_[1], OnRequest("www.example.com", T_A)) - .WillOnce(SetReply(servers_[1].get(), &servfailrsp)); - EXPECT_CALL(*servers_[2], OnRequest("www.example.com", T_A)) - .WillOnce(SetReply(servers_[2].get(), ¬implrsp)); - EXPECT_CALL(*servers_[0], OnRequest("www.example.com", T_A)) - .WillOnce(SetReply(servers_[0].get(), &okrsp)); - CheckExample(); - - // Third time around, starts from server [2]. + // Second time around, still starts from server [2], as [0] and [1] both + // recorded failures EXPECT_CALL(*servers_[2], OnRequest("www.example.com", T_A)) .WillOnce(SetReply(servers_[2].get(), &servfailrsp)); EXPECT_CALL(*servers_[0], OnRequest("www.example.com", T_A)) @@ -1132,50 +1326,18 @@ TEST_P(RotateMultiMockTest, ThirdServer) { EXPECT_CALL(*servers_[1], OnRequest("www.example.com", T_A)) .WillOnce(SetReply(servers_[1].get(), &okrsp)); CheckExample(); -} - -TEST_P(NoRotateMultiMockTest, ThirdServer) { - struct ares_options opts = {0}; - int optmask = 0; - EXPECT_EQ(ARES_SUCCESS, ares_save_options(channel_, &opts, &optmask)); - EXPECT_EQ(ARES_OPT_NOROTATE, (optmask & ARES_OPT_NOROTATE)); - ares_destroy_options(&opts); - DNSPacket servfailrsp; - servfailrsp.set_response().set_aa().set_rcode(SERVFAIL) - .add_question(new DNSQuestion("www.example.com", T_A)); - DNSPacket notimplrsp; - notimplrsp.set_response().set_aa().set_rcode(NOTIMP) - .add_question(new DNSQuestion("www.example.com", T_A)); - DNSPacket okrsp; - okrsp.set_response().set_aa() - .add_question(new DNSQuestion("www.example.com", T_A)) - .add_answer(new DNSARR("www.example.com", 100, {2,3,4,5})); - - EXPECT_CALL(*servers_[0], OnRequest("www.example.com", T_A)) - .WillOnce(SetReply(servers_[0].get(), &servfailrsp)); - EXPECT_CALL(*servers_[1], OnRequest("www.example.com", T_A)) - .WillOnce(SetReply(servers_[1].get(), ¬implrsp)); - EXPECT_CALL(*servers_[2], OnRequest("www.example.com", T_A)) - .WillOnce(SetReply(servers_[2].get(), &okrsp)); - CheckExample(); - - // Second time around, still starts from server [0]. - EXPECT_CALL(*servers_[0], OnRequest("www.example.com", T_A)) - .WillOnce(SetReply(servers_[0].get(), &servfailrsp)); + // Third time around, server order is [1] (f0), [2] (f1), [0] (f2), which + // means [1] will get called twice in a row as after the first call + // order will be [1] (f1), [2] (f1), [0] (f2) since sort order is + // (failure count, index) EXPECT_CALL(*servers_[1], OnRequest("www.example.com", T_A)) + .WillOnce(SetReply(servers_[1].get(), &servfailrsp)) .WillOnce(SetReply(servers_[1].get(), ¬implrsp)); EXPECT_CALL(*servers_[2], OnRequest("www.example.com", T_A)) - .WillOnce(SetReply(servers_[2].get(), &okrsp)); - CheckExample(); - - // Third time around, still starts from server [0]. + .WillOnce(SetReply(servers_[2].get(), ¬implrsp)); EXPECT_CALL(*servers_[0], OnRequest("www.example.com", T_A)) - .WillOnce(SetReply(servers_[0].get(), &servfailrsp)); - EXPECT_CALL(*servers_[1], OnRequest("www.example.com", T_A)) - .WillOnce(SetReply(servers_[1].get(), ¬implrsp)); - EXPECT_CALL(*servers_[2], OnRequest("www.example.com", T_A)) - .WillOnce(SetReply(servers_[2].get(), &okrsp)); + .WillOnce(SetReply(servers_[0].get(), &okrsp)); CheckExample(); } @@ -1183,6 +1345,10 @@ INSTANTIATE_TEST_SUITE_P(AddressFamilies, MockChannelTest, ::testing::ValuesIn(a INSTANTIATE_TEST_SUITE_P(AddressFamilies, MockUDPChannelTest, ::testing::ValuesIn(ares::test::families)); +INSTANTIATE_TEST_SUITE_P(AddressFamilies, MockUDPMaxQueriesTest, ::testing::ValuesIn(ares::test::families)); + +INSTANTIATE_TEST_SUITE_P(AddressFamilies, CacheQueriesTest, ::testing::ValuesIn(ares::test::families)); + INSTANTIATE_TEST_SUITE_P(AddressFamilies, MockTCPChannelTest, ::testing::ValuesIn(ares::test::families)); INSTANTIATE_TEST_SUITE_P(AddressFamilies, MockExtraOptsTest, ::testing::ValuesIn(ares::test::families_modes)); @@ -1191,8 +1357,6 @@ INSTANTIATE_TEST_SUITE_P(AddressFamilies, MockNoCheckRespChannelTest, ::testing: INSTANTIATE_TEST_SUITE_P(AddressFamilies, MockEDNSChannelTest, ::testing::ValuesIn(ares::test::families_modes)); -INSTANTIATE_TEST_SUITE_P(TransportModes, RotateMultiMockTest, ::testing::ValuesIn(ares::test::families_modes)); - INSTANTIATE_TEST_SUITE_P(TransportModes, NoRotateMultiMockTest, ::testing::ValuesIn(ares::test::families_modes)); } // namespace test diff --git a/lib/c-ares-1.19.1/test/ares-test-ns.cc b/lib/c-ares-1.23.0/test/ares-test-ns.cc similarity index 89% rename from lib/c-ares-1.19.1/test/ares-test-ns.cc rename to lib/c-ares-1.23.0/test/ares-test-ns.cc index c3c455214db..a97d7e586f7 100644 --- a/lib/c-ares-1.19.1/test/ares-test-ns.cc +++ b/lib/c-ares-1.23.0/test/ares-test-ns.cc @@ -1,3 +1,20 @@ +/* + * Copyright (C) The c-ares project + * + * 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. + * + * SPDX-License-Identifier: MIT + */ #include "ares-test.h" #ifdef HAVE_CONTAINER diff --git a/lib/c-ares-1.19.1/test/ares-test-parse-a.cc b/lib/c-ares-1.23.0/test/ares-test-parse-a.cc similarity index 85% rename from lib/c-ares-1.19.1/test/ares-test-parse-a.cc rename to lib/c-ares-1.23.0/test/ares-test-parse-a.cc index f8050ac7080..b85a1723271 100644 --- a/lib/c-ares-1.19.1/test/ares-test-parse-a.cc +++ b/lib/c-ares-1.23.0/test/ares-test-parse-a.cc @@ -1,3 +1,20 @@ +/* + * Copyright (C) The c-ares project + * + * 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. + * + * SPDX-License-Identifier: MIT + */ #include "ares-test.h" #include "dns-proto.h" @@ -50,7 +67,7 @@ TEST_F(LibraryTest, ParseAReplyOK) { struct hostent *host = nullptr; struct ares_addrttl info[5]; int count = 5; - EXPECT_EQ(ARES_SUCCESS, ares_parse_a_reply(data.data(), data.size(), + EXPECT_EQ(ARES_SUCCESS, ares_parse_a_reply(data.data(), (int)data.size(), &host, info, &count)); EXPECT_EQ(1, count); EXPECT_EQ(0x01020304, info[0].ttl); @@ -64,7 +81,7 @@ TEST_F(LibraryTest, ParseAReplyOK) { ares_free_hostent(host); // Repeat without providing a hostent - EXPECT_EQ(ARES_SUCCESS, ares_parse_a_reply(data.data(), data.size(), + EXPECT_EQ(ARES_SUCCESS, ares_parse_a_reply(data.data(), (int)data.size(), nullptr, info, &count)); EXPECT_EQ(1, count); EXPECT_EQ(0x01020304, info[0].ttl); @@ -104,7 +121,7 @@ TEST_F(LibraryTest, ParseMalformedAReply) { // Invalid RR-len. std::vector invalid_rrlen(data); invalid_rrlen[51] = 180; - EXPECT_EQ(ARES_EBADRESP, ares_parse_a_reply(invalid_rrlen.data(), invalid_rrlen.size(), + EXPECT_EQ(ARES_EBADRESP, ares_parse_a_reply(invalid_rrlen.data(), (int)invalid_rrlen.size(), &host, info, &count)); // Truncate mid-question. @@ -124,7 +141,7 @@ TEST_F(LibraryTest, ParseAReplyNoData) { struct hostent *host = nullptr; struct ares_addrttl info[2]; int count = 2; - EXPECT_EQ(ARES_ENODATA, ares_parse_a_reply(data.data(), data.size(), + EXPECT_EQ(ARES_ENODATA, ares_parse_a_reply(data.data(), (int)data.size(), &host, info, &count)); EXPECT_EQ(0, count); EXPECT_EQ(nullptr, host); @@ -133,7 +150,7 @@ TEST_F(LibraryTest, ParseAReplyNoData) { pkt.add_answer(new DNSCnameRR("example.com", 200, "c.example.com")); data = pkt.data(); // Expect success as per https://github.com/c-ares/c-ares/commit/2c63440127feed70ccefb148b8f938a2df6c15f8 - EXPECT_EQ(ARES_SUCCESS, ares_parse_a_reply(data.data(), data.size(), + EXPECT_EQ(ARES_SUCCESS, ares_parse_a_reply(data.data(), (int)data.size(), &host, info, &count)); EXPECT_EQ(0, count); EXPECT_NE(nullptr, host); @@ -156,7 +173,7 @@ TEST_F(LibraryTest, ParseAReplyVariantA) { struct ares_addrttl info[2]; int count = 2; std::vector data = pkt.data(); - EXPECT_EQ(ARES_SUCCESS, ares_parse_a_reply(data.data(), data.size(), + EXPECT_EQ(ARES_SUCCESS, ares_parse_a_reply(data.data(), (int)data.size(), &host, info, &count)); EXPECT_EQ(1, count); EXPECT_EQ("18.7.22.69", AddressToString(&(info[0].ipaddr), 4)); @@ -173,7 +190,7 @@ TEST_F(LibraryTest, ParseAReplyJustCname) { struct ares_addrttl info[2]; int count = 2; std::vector data = pkt.data(); - EXPECT_EQ(ARES_SUCCESS, ares_parse_a_reply(data.data(), data.size(), + EXPECT_EQ(ARES_SUCCESS, ares_parse_a_reply(data.data(), (int)data.size(), &host, info, &count)); EXPECT_EQ(0, count); ASSERT_NE(nullptr, host); @@ -201,7 +218,7 @@ TEST_F(LibraryTest, ParseAReplyVariantCname) { struct ares_addrttl info[2]; int count = 2; std::vector data = pkt.data(); - EXPECT_EQ(ARES_SUCCESS, ares_parse_a_reply(data.data(), data.size(), + EXPECT_EQ(ARES_SUCCESS, ares_parse_a_reply(data.data(), (int)data.size(), &host, info, &count)); EXPECT_EQ(1, count); EXPECT_EQ("129.97.123.22", AddressToString(&(info[0].ipaddr), 4)); @@ -211,7 +228,7 @@ TEST_F(LibraryTest, ParseAReplyVariantCname) { // Repeat parsing without places to put the results. count = 0; - EXPECT_EQ(ARES_SUCCESS, ares_parse_a_reply(data.data(), data.size(), + EXPECT_EQ(ARES_SUCCESS, ares_parse_a_reply(data.data(), (int)data.size(), nullptr, info, &count)); } @@ -232,7 +249,7 @@ TEST_F(LibraryTest, ParseAReplyVariantCnameChain) { struct ares_addrttl info[2]; int count = 2; std::vector data = pkt.data(); - EXPECT_EQ(ARES_SUCCESS, ares_parse_a_reply(data.data(), data.size(), + EXPECT_EQ(ARES_SUCCESS, ares_parse_a_reply(data.data(), (int)data.size(), &host, info, &count)); EXPECT_EQ(1, count); EXPECT_EQ("8.8.8.8", AddressToString(&(info[0].ipaddr), 4)); @@ -254,7 +271,7 @@ TEST_F(LibraryTest, DISABLED_ParseAReplyVariantCnameLast) { struct ares_addrttl info[8]; int count = 8; std::vector data = pkt.data(); - EXPECT_EQ(ARES_SUCCESS, ares_parse_a_reply(data.data(), data.size(), + EXPECT_EQ(ARES_SUCCESS, ares_parse_a_reply(data.data(), (int)data.size(), &host, info, &count)); EXPECT_EQ(4, count); EXPECT_EQ("129.97.123.221", AddressToString(&(info[0].ipaddr), 4)); @@ -282,7 +299,7 @@ TEST_F(LibraryTest, ParseAReplyErrors) { // No question. pkt.questions_.clear(); data = pkt.data(); - EXPECT_EQ(ARES_EBADRESP, ares_parse_a_reply(data.data(), data.size(), + EXPECT_EQ(ARES_EBADRESP, ares_parse_a_reply(data.data(), (int)data.size(), &host, info, &count)); EXPECT_EQ(nullptr, host); pkt.add_question(new DNSQuestion("example.com", T_A)); @@ -291,7 +308,7 @@ TEST_F(LibraryTest, ParseAReplyErrors) { pkt.questions_.clear(); pkt.add_question(new DNSQuestion("Axample.com", T_A)); data = pkt.data(); - EXPECT_EQ(ARES_ENODATA, ares_parse_a_reply(data.data(), data.size(), + EXPECT_EQ(ARES_ENODATA, ares_parse_a_reply(data.data(), (int)data.size(), &host, info, &count)); EXPECT_EQ(nullptr, host); pkt.questions_.clear(); @@ -301,7 +318,7 @@ TEST_F(LibraryTest, ParseAReplyErrors) { // Not a response. pkt.set_response(false); data = pkt.data(); - EXPECT_EQ(ARES_EBADRESP, ares_parse_a_reply(data.data(), data.size(), + EXPECT_EQ(ARES_EBADRESP, ares_parse_a_reply(data.data(), (int)data.size(), &host, info, &count)); EXPECT_EQ(nullptr, host); pkt.set_response(true); @@ -309,7 +326,7 @@ TEST_F(LibraryTest, ParseAReplyErrors) { // Bad return code. pkt.set_rcode(FORMERR); data = pkt.data(); - EXPECT_EQ(ARES_ENODATA, ares_parse_a_reply(data.data(), data.size(), + EXPECT_EQ(ARES_ENODATA, ares_parse_a_reply(data.data(), (int)data.size(), &host, info, &count)); EXPECT_EQ(nullptr, host); pkt.set_rcode(NOERROR); @@ -318,7 +335,7 @@ TEST_F(LibraryTest, ParseAReplyErrors) { // Two questions pkt.add_question(new DNSQuestion("example.com", T_A)); data = pkt.data(); - EXPECT_EQ(ARES_EBADRESP, ares_parse_a_reply(data.data(), data.size(), + EXPECT_EQ(ARES_EBADRESP, ares_parse_a_reply(data.data(), (int)data.size(), &host, info, &count)); EXPECT_EQ(nullptr, host); pkt.questions_.clear(); @@ -328,7 +345,7 @@ TEST_F(LibraryTest, ParseAReplyErrors) { pkt.answers_.clear(); pkt.add_answer(new DNSMxRR("example.com", 100, 100, "mx1.example.com")); data = pkt.data(); - EXPECT_EQ(ARES_ENODATA, ares_parse_a_reply(data.data(), data.size(), + EXPECT_EQ(ARES_ENODATA, ares_parse_a_reply(data.data(), (int)data.size(), &host, info, &count)); EXPECT_EQ(nullptr, host); pkt.answers_.clear(); @@ -337,7 +354,7 @@ TEST_F(LibraryTest, ParseAReplyErrors) { // No answer. pkt.answers_.clear(); data = pkt.data(); - EXPECT_EQ(ARES_ENODATA, ares_parse_a_reply(data.data(), data.size(), + EXPECT_EQ(ARES_ENODATA, ares_parse_a_reply(data.data(), (int)data.size(), &host, info, &count)); EXPECT_EQ(nullptr, host); pkt.add_answer(new DNSARR("example.com", 100, {0x02, 0x03, 0x04, 0x05})); @@ -345,10 +362,10 @@ TEST_F(LibraryTest, ParseAReplyErrors) { // Truncated packets. data = pkt.data(); for (size_t len = 1; len < data.size(); len++) { - EXPECT_EQ(ARES_EBADRESP, ares_parse_a_reply(data.data(), len, + EXPECT_EQ(ARES_EBADRESP, ares_parse_a_reply(data.data(), (int)len, &host, info, &count)); EXPECT_EQ(nullptr, host); - EXPECT_EQ(ARES_EBADRESP, ares_parse_a_reply(data.data(), len, + EXPECT_EQ(ARES_EBADRESP, ares_parse_a_reply(data.data(), (int)len, nullptr, info, &count)); } } @@ -368,7 +385,7 @@ TEST_F(LibraryTest, ParseAReplyAllocFail) { for (int ii = 1; ii <= 8; ii++) { ClearFails(); SetAllocFail(ii); - EXPECT_EQ(ARES_ENOMEM, ares_parse_a_reply(data.data(), data.size(), + EXPECT_EQ(ARES_ENOMEM, ares_parse_a_reply(data.data(), (int)data.size(), &host, info, &count)) << ii; EXPECT_EQ(nullptr, host); } diff --git a/lib/c-ares-1.19.1/test/ares-test-parse-aaaa.cc b/lib/c-ares-1.23.0/test/ares-test-parse-aaaa.cc similarity index 79% rename from lib/c-ares-1.19.1/test/ares-test-parse-aaaa.cc rename to lib/c-ares-1.23.0/test/ares-test-parse-aaaa.cc index df565296805..154db986865 100644 --- a/lib/c-ares-1.19.1/test/ares-test-parse-aaaa.cc +++ b/lib/c-ares-1.23.0/test/ares-test-parse-aaaa.cc @@ -1,3 +1,20 @@ +/* + * Copyright (C) The c-ares project + * + * 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. + * + * SPDX-License-Identifier: MIT + */ #include "ares-test.h" #include "dns-proto.h" @@ -19,7 +36,7 @@ TEST_F(LibraryTest, ParseAaaaReplyOK) { struct hostent *host = nullptr; struct ares_addr6ttl info[5]; int count = 5; - EXPECT_EQ(ARES_SUCCESS, ares_parse_aaaa_reply(data.data(), data.size(), + EXPECT_EQ(ARES_SUCCESS, ares_parse_aaaa_reply(data.data(), (int)data.size(), &host, info, &count)); EXPECT_EQ(1, count); EXPECT_EQ(100, info[0].ttl); @@ -33,7 +50,7 @@ TEST_F(LibraryTest, ParseAaaaReplyOK) { // Repeat without providing places to put the results count = 0; - EXPECT_EQ(ARES_SUCCESS, ares_parse_aaaa_reply(data.data(), data.size(), + EXPECT_EQ(ARES_SUCCESS, ares_parse_aaaa_reply(data.data(), (int)data.size(), nullptr, info, &count)); } @@ -49,7 +66,7 @@ TEST_F(LibraryTest, ParseAaaaReplyCname) { struct hostent *host = nullptr; struct ares_addr6ttl info[5]; int count = 5; - EXPECT_EQ(ARES_SUCCESS, ares_parse_aaaa_reply(data.data(), data.size(), + EXPECT_EQ(ARES_SUCCESS, ares_parse_aaaa_reply(data.data(), (int)data.size(), &host, info, &count)); EXPECT_EQ(1, count); // CNAME TTL overrides AAAA TTL. @@ -64,7 +81,7 @@ TEST_F(LibraryTest, ParseAaaaReplyCname) { // Repeat without providing a hostent count = 5; - EXPECT_EQ(ARES_SUCCESS, ares_parse_aaaa_reply(data.data(), data.size(), + EXPECT_EQ(ARES_SUCCESS, ares_parse_aaaa_reply(data.data(), (int)data.size(), nullptr, info, &count)); EXPECT_EQ(1, count); EXPECT_EQ(50, info[0].ttl); @@ -80,14 +97,14 @@ TEST_F(LibraryTest, ParseAaaaReplyNoData) { struct hostent *host = nullptr; struct ares_addr6ttl info[2]; int count = 2; - EXPECT_EQ(ARES_ENODATA, ares_parse_aaaa_reply(data.data(), data.size(), + EXPECT_EQ(ARES_ENODATA, ares_parse_aaaa_reply(data.data(), (int)data.size(), &host, info, &count)); EXPECT_EQ(0, count); EXPECT_EQ(nullptr, host); // Again but with a CNAME. pkt.add_answer(new DNSCnameRR("example.com", 200, "c.example.com")); - EXPECT_EQ(ARES_ENODATA, ares_parse_aaaa_reply(data.data(), data.size(), + EXPECT_EQ(ARES_ENODATA, ares_parse_aaaa_reply(data.data(), (int)data.size(), &host, info, &count)); EXPECT_EQ(0, count); EXPECT_EQ(nullptr, host); @@ -109,7 +126,7 @@ TEST_F(LibraryTest, ParseAaaaReplyErrors) { // No question. pkt.questions_.clear(); data = pkt.data(); - EXPECT_EQ(ARES_EBADRESP, ares_parse_aaaa_reply(data.data(), data.size(), + EXPECT_EQ(ARES_EBADRESP, ares_parse_aaaa_reply(data.data(), (int)data.size(), &host, info, &count)); EXPECT_EQ(nullptr, host); pkt.add_question(new DNSQuestion("example.com", T_AAAA)); @@ -118,7 +135,7 @@ TEST_F(LibraryTest, ParseAaaaReplyErrors) { pkt.questions_.clear(); pkt.add_question(new DNSQuestion("Axample.com", T_AAAA)); data = pkt.data(); - EXPECT_EQ(ARES_ENODATA, ares_parse_aaaa_reply(data.data(), data.size(), + EXPECT_EQ(ARES_ENODATA, ares_parse_aaaa_reply(data.data(), (int)data.size(), &host, info, &count)); EXPECT_EQ(nullptr, host); pkt.questions_.clear(); @@ -127,7 +144,7 @@ TEST_F(LibraryTest, ParseAaaaReplyErrors) { // Two questions. pkt.add_question(new DNSQuestion("example.com", T_AAAA)); data = pkt.data(); - EXPECT_EQ(ARES_EBADRESP, ares_parse_aaaa_reply(data.data(), data.size(), + EXPECT_EQ(ARES_EBADRESP, ares_parse_aaaa_reply(data.data(), (int)data.size(), &host, info, &count)); EXPECT_EQ(nullptr, host); pkt.questions_.clear(); @@ -137,7 +154,7 @@ TEST_F(LibraryTest, ParseAaaaReplyErrors) { pkt.answers_.clear(); pkt.add_answer(new DNSMxRR("example.com", 100, 100, "mx1.example.com")); data = pkt.data(); - EXPECT_EQ(ARES_ENODATA, ares_parse_aaaa_reply(data.data(), data.size(), + EXPECT_EQ(ARES_ENODATA, ares_parse_aaaa_reply(data.data(), (int)data.size(), &host, info, &count)); EXPECT_EQ(nullptr, host); pkt.answers_.clear(); @@ -148,7 +165,7 @@ TEST_F(LibraryTest, ParseAaaaReplyErrors) { // No answer. pkt.answers_.clear(); data = pkt.data(); - EXPECT_EQ(ARES_ENODATA, ares_parse_aaaa_reply(data.data(), data.size(), + EXPECT_EQ(ARES_ENODATA, ares_parse_aaaa_reply(data.data(), (int)data.size(), &host, info, &count)); EXPECT_EQ(nullptr, host); pkt.add_answer(new DNSAaaaRR("example.com", 100, @@ -158,10 +175,10 @@ TEST_F(LibraryTest, ParseAaaaReplyErrors) { // Truncated packets. data = pkt.data(); for (size_t len = 1; len < data.size(); len++) { - EXPECT_EQ(ARES_EBADRESP, ares_parse_aaaa_reply(data.data(), len, + EXPECT_EQ(ARES_EBADRESP, ares_parse_aaaa_reply(data.data(), (int)len, &host, info, &count)); EXPECT_EQ(nullptr, host); - EXPECT_EQ(ARES_EBADRESP, ares_parse_aaaa_reply(data.data(), len, + EXPECT_EQ(ARES_EBADRESP, ares_parse_aaaa_reply(data.data(), (int)len, nullptr, info, &count)); } } @@ -182,7 +199,7 @@ TEST_F(LibraryTest, ParseAaaaReplyAllocFail) { for (int ii = 1; ii <= 8; ii++) { ClearFails(); SetAllocFail(ii); - EXPECT_EQ(ARES_ENOMEM, ares_parse_aaaa_reply(data.data(), data.size(), + EXPECT_EQ(ARES_ENOMEM, ares_parse_aaaa_reply(data.data(), (int)data.size(), &host, info, &count)) << ii; EXPECT_EQ(nullptr, host); } diff --git a/lib/c-ares-1.19.1/test/ares-test-parse-caa.cc b/lib/c-ares-1.23.0/test/ares-test-parse-caa.cc similarity index 80% rename from lib/c-ares-1.19.1/test/ares-test-parse-caa.cc rename to lib/c-ares-1.23.0/test/ares-test-parse-caa.cc index 99903edf715..e5cfc56421b 100644 --- a/lib/c-ares-1.19.1/test/ares-test-parse-caa.cc +++ b/lib/c-ares-1.23.0/test/ares-test-parse-caa.cc @@ -1,3 +1,20 @@ +/* + * Copyright (C) The c-ares project + * + * 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. + * + * SPDX-License-Identifier: MIT + */ #include "ares-test.h" #include "dns-proto.h" @@ -24,7 +41,7 @@ TEST_F(LibraryTest, ParseCaaReplyMultipleOK) { }; struct ares_caa_reply* caa = nullptr; - EXPECT_EQ(ARES_SUCCESS, ares_parse_caa_reply(data.data(), data.size(), &caa)); + EXPECT_EQ(ARES_SUCCESS, ares_parse_caa_reply(data.data(), (int)data.size(), &caa)); ASSERT_NE(nullptr, caa); ASSERT_NE(nullptr, caa->next); ASSERT_NE(nullptr, caa->next->next); @@ -42,13 +59,13 @@ TEST_F(LibraryTest, ParseCaaReplySingleOK) { }; struct ares_caa_reply* caa = nullptr; - EXPECT_EQ(ARES_SUCCESS, ares_parse_caa_reply(data.data(), data.size(), &caa)); + EXPECT_EQ(ARES_SUCCESS, ares_parse_caa_reply(data.data(), (int)data.size(), &caa)); ASSERT_NE(nullptr, caa); - EXPECT_EQ(caa->critical, 0); - EXPECT_EQ(caa->plength, 5); + EXPECT_EQ(caa->critical, (int)0); + EXPECT_EQ(caa->plength, (size_t)5); EXPECT_STREQ((char *)caa->property, "issue"); - EXPECT_EQ(caa->length, 8); + EXPECT_EQ(caa->length, (size_t)8); EXPECT_STREQ((char *)caa->value, "pki.goog"); ares_free_data(caa); @@ -63,7 +80,7 @@ TEST_F(LibraryTest, ParseCaaBogusReply1) { }; struct ares_caa_reply* caa = nullptr; - EXPECT_EQ(ARES_EBADRESP, ares_parse_caa_reply(data.data(), data.size(), &caa)); + EXPECT_EQ(ARES_EBADRESP, ares_parse_caa_reply(data.data(), (int)data.size(), &caa)); ASSERT_EQ(nullptr, caa); } @@ -76,7 +93,7 @@ TEST_F(LibraryTest, ParseCaaBogusReply2) { }; struct ares_caa_reply* caa = nullptr; - EXPECT_EQ(ARES_EBADRESP, ares_parse_caa_reply(data.data(), data.size(), &caa)); + EXPECT_EQ(ARES_EBADRESP, ares_parse_caa_reply(data.data(), (int)data.size(), &caa)); ASSERT_EQ(nullptr, caa); } @@ -89,7 +106,7 @@ TEST_F(LibraryTest, ParseCaaBogusReply3) { }; struct ares_caa_reply* caa = nullptr; - EXPECT_EQ(ARES_EBADRESP, ares_parse_caa_reply(data.data(), data.size(), &caa)); + EXPECT_EQ(ARES_EBADRESP, ares_parse_caa_reply(data.data(), (int)data.size(), &caa)); ASSERT_EQ(nullptr, caa); } @@ -105,7 +122,7 @@ TEST_F(LibraryTest, ParseCaaEmptyReply) { }; struct ares_caa_reply* caa = nullptr; - EXPECT_EQ(ARES_ENODATA, ares_parse_caa_reply(data.data(), data.size(), &caa)); + EXPECT_EQ(ARES_ENODATA, ares_parse_caa_reply(data.data(), (int)data.size(), &caa)); ASSERT_EQ(nullptr, caa); } diff --git a/lib/c-ares-1.19.1/test/ares-test-parse-mx.cc b/lib/c-ares-1.23.0/test/ares-test-parse-mx.cc similarity index 72% rename from lib/c-ares-1.19.1/test/ares-test-parse-mx.cc rename to lib/c-ares-1.23.0/test/ares-test-parse-mx.cc index db8fa89404a..93c1047104d 100644 --- a/lib/c-ares-1.19.1/test/ares-test-parse-mx.cc +++ b/lib/c-ares-1.23.0/test/ares-test-parse-mx.cc @@ -1,3 +1,20 @@ +/* + * Copyright (C) The c-ares project + * + * 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. + * + * SPDX-License-Identifier: MIT + */ #include "ares-test.h" #include "dns-proto.h" @@ -16,7 +33,7 @@ TEST_F(LibraryTest, ParseMxReplyOK) { std::vector data = pkt.data(); struct ares_mx_reply* mx = nullptr; - EXPECT_EQ(ARES_SUCCESS, ares_parse_mx_reply(data.data(), data.size(), &mx)); + EXPECT_EQ(ARES_SUCCESS, ares_parse_mx_reply(data.data(), (int)data.size(), &mx)); ASSERT_NE(nullptr, mx); EXPECT_EQ("mx1.example.com", std::string(mx->host)); EXPECT_EQ(100, mx->priority); @@ -57,7 +74,7 @@ TEST_F(LibraryTest, ParseMxReplyMalformed) { }; struct ares_mx_reply* mx = nullptr; - EXPECT_EQ(ARES_EBADRESP, ares_parse_mx_reply(data.data(), data.size(), &mx)); + EXPECT_EQ(ARES_EBADRESP, ares_parse_mx_reply(data.data(), (int)data.size(), &mx)); ASSERT_EQ(nullptr, mx); } @@ -73,7 +90,7 @@ TEST_F(LibraryTest, ParseMxReplyErrors) { // No question. pkt.questions_.clear(); data = pkt.data(); - EXPECT_EQ(ARES_EBADRESP, ares_parse_mx_reply(data.data(), data.size(), &mx)); + EXPECT_EQ(ARES_EBADRESP, ares_parse_mx_reply(data.data(), (int)data.size(), &mx)); EXPECT_EQ(nullptr, mx); pkt.add_question(new DNSQuestion("example.com", T_MX)); @@ -82,7 +99,7 @@ TEST_F(LibraryTest, ParseMxReplyErrors) { pkt.questions_.clear(); pkt.add_question(new DNSQuestion("Axample.com", T_MX)); data = pkt.data(); - EXPECT_EQ(ARES_EBADRESP, ares_parse_mx_reply(data.data(), data.size(), &mx)); + EXPECT_EQ(ARES_EBADRESP, ares_parse_mx_reply(data.data(), (int)data.size(), &mx)); pkt.questions_.clear(); pkt.add_question(new DNSQuestion("example.com", T_MX)); #endif @@ -90,7 +107,7 @@ TEST_F(LibraryTest, ParseMxReplyErrors) { // Two questions. pkt.add_question(new DNSQuestion("example.com", T_MX)); data = pkt.data(); - EXPECT_EQ(ARES_EBADRESP, ares_parse_mx_reply(data.data(), data.size(), &mx)); + EXPECT_EQ(ARES_EBADRESP, ares_parse_mx_reply(data.data(), (int)data.size(), &mx)); EXPECT_EQ(nullptr, mx); pkt.questions_.clear(); pkt.add_question(new DNSQuestion("example.com", T_MX)); @@ -100,7 +117,7 @@ TEST_F(LibraryTest, ParseMxReplyErrors) { pkt.answers_.clear(); pkt.add_answer(new DNSSrvRR("example.abc.def.com", 180, 0, 10, 8160, "example.abc.def.com")); data = pkt.data(); - EXPECT_EQ(ARES_SUCCESS, ares_parse_mx_reply(data.data(), data.size(), &mx)); + EXPECT_EQ(ARES_SUCCESS, ares_parse_mx_reply(data.data(), (int)data.size(), &mx)); EXPECT_EQ(nullptr, mx); pkt.answers_.clear(); pkt.add_answer(new DNSMxRR("example.com", 100, 100, "mx1.example.com")); @@ -108,14 +125,14 @@ TEST_F(LibraryTest, ParseMxReplyErrors) { // No answer. pkt.answers_.clear(); data = pkt.data(); - EXPECT_EQ(ARES_ENODATA, ares_parse_mx_reply(data.data(), data.size(), &mx)); + EXPECT_EQ(ARES_ENODATA, ares_parse_mx_reply(data.data(), (int)data.size(), &mx)); EXPECT_EQ(nullptr, mx); pkt.add_answer(new DNSMxRR("example.com", 100, 100, "mx1.example.com")); // Truncated packets. data = pkt.data(); for (size_t len = 1; len < data.size(); len++) { - int rc = ares_parse_mx_reply(data.data(), len, &mx); + int rc = ares_parse_mx_reply(data.data(), (int)len, &mx); EXPECT_EQ(nullptr, mx); EXPECT_TRUE(rc == ARES_EBADRESP || rc == ARES_EBADNAME); } @@ -133,7 +150,7 @@ TEST_F(LibraryTest, ParseMxReplyAllocFail) { for (int ii = 1; ii <= 5; ii++) { ClearFails(); SetAllocFail(ii); - EXPECT_EQ(ARES_ENOMEM, ares_parse_mx_reply(data.data(), data.size(), &mx)) << ii; + EXPECT_EQ(ARES_ENOMEM, ares_parse_mx_reply(data.data(), (int)data.size(), &mx)) << ii; } } diff --git a/lib/c-ares-1.19.1/test/ares-test-parse-naptr.cc b/lib/c-ares-1.23.0/test/ares-test-parse-naptr.cc similarity index 75% rename from lib/c-ares-1.19.1/test/ares-test-parse-naptr.cc rename to lib/c-ares-1.23.0/test/ares-test-parse-naptr.cc index aa1a2a5029a..12ba6ad53c7 100644 --- a/lib/c-ares-1.19.1/test/ares-test-parse-naptr.cc +++ b/lib/c-ares-1.23.0/test/ares-test-parse-naptr.cc @@ -1,3 +1,20 @@ +/* + * Copyright (C) The c-ares project + * + * 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. + * + * SPDX-License-Identifier: MIT + */ #include "ares-test.h" #include "dns-proto.h" @@ -18,7 +35,7 @@ TEST_F(LibraryTest, ParseNaptrReplyOK) { std::vector data = pkt.data(); struct ares_naptr_reply* naptr = nullptr; - EXPECT_EQ(ARES_SUCCESS, ares_parse_naptr_reply(data.data(), data.size(), &naptr)); + EXPECT_EQ(ARES_SUCCESS, ares_parse_naptr_reply(data.data(), (int)data.size(), &naptr)); ASSERT_NE(nullptr, naptr); EXPECT_EQ("SP", std::string((char*)naptr->flags)); EXPECT_EQ("service", std::string((char*)naptr->service)); @@ -52,7 +69,7 @@ TEST_F(LibraryTest, ParseNaptrReplyErrors) { // No question. pkt.questions_.clear(); data = pkt.data(); - EXPECT_EQ(ARES_EBADRESP, ares_parse_naptr_reply(data.data(), data.size(), &naptr)); + EXPECT_EQ(ARES_EBADRESP, ares_parse_naptr_reply(data.data(), (int)data.size(), &naptr)); pkt.add_question(new DNSQuestion("example.com", T_NAPTR)); #ifdef DISABLED @@ -60,7 +77,7 @@ TEST_F(LibraryTest, ParseNaptrReplyErrors) { pkt.questions_.clear(); pkt.add_question(new DNSQuestion("Axample.com", T_NAPTR)); data = pkt.data(); - EXPECT_EQ(ARES_ENODATA, ares_parse_naptr_reply(data.data(), data.size(), &naptr)); + EXPECT_EQ(ARES_ENODATA, ares_parse_naptr_reply(data.data(), (int)data.size(), &naptr)); pkt.questions_.clear(); pkt.add_question(new DNSQuestion("example.com", T_NAPTR)); #endif @@ -68,7 +85,7 @@ TEST_F(LibraryTest, ParseNaptrReplyErrors) { // Two questions pkt.add_question(new DNSQuestion("example.com", T_NAPTR)); data = pkt.data(); - EXPECT_EQ(ARES_EBADRESP, ares_parse_naptr_reply(data.data(), data.size(), &naptr)); + EXPECT_EQ(ARES_EBADRESP, ares_parse_naptr_reply(data.data(), (int)data.size(), &naptr)); pkt.questions_.clear(); pkt.add_question(new DNSQuestion("example.com", T_NAPTR)); @@ -76,7 +93,7 @@ TEST_F(LibraryTest, ParseNaptrReplyErrors) { pkt.answers_.clear(); pkt.add_answer(new DNSMxRR("example.com", 100, 100, "mx1.example.com")); data = pkt.data(); - EXPECT_EQ(ARES_SUCCESS, ares_parse_naptr_reply(data.data(), data.size(), &naptr)); + EXPECT_EQ(ARES_SUCCESS, ares_parse_naptr_reply(data.data(), (int)data.size(), &naptr)); EXPECT_EQ(nullptr, naptr); pkt.answers_.clear(); pkt.add_answer(new DNSNaptrRR("example.com", 100, @@ -85,14 +102,14 @@ TEST_F(LibraryTest, ParseNaptrReplyErrors) { // No answer. pkt.answers_.clear(); data = pkt.data(); - EXPECT_EQ(ARES_ENODATA, ares_parse_naptr_reply(data.data(), data.size(), &naptr)); + EXPECT_EQ(ARES_ENODATA, ares_parse_naptr_reply(data.data(), (int)data.size(), &naptr)); pkt.add_answer(new DNSNaptrRR("example.com", 100, 10, 20, "SP", "service", "regexp", "replace")); // Truncated packets. data = pkt.data(); for (size_t len = 1; len < data.size(); len++) { - int rc = ares_parse_naptr_reply(data.data(), len, &naptr); + int rc = ares_parse_naptr_reply(data.data(), (int)len, &naptr); EXPECT_TRUE(rc == ARES_EBADRESP || rc == ARES_EBADNAME); } } @@ -123,7 +140,7 @@ TEST_F(LibraryTest, ParseNaptrReplyTooShort) { 0x00, // Too short: expect 2 x int16 and 3 x name (min 1 byte each) }; struct ares_naptr_reply* naptr = nullptr; - EXPECT_EQ(ARES_EBADRESP, ares_parse_naptr_reply(data.data(), data.size(), &naptr)); + EXPECT_EQ(ARES_EBADRESP, ares_parse_naptr_reply(data.data(), (int)data.size(), &naptr)); } TEST_F(LibraryTest, ParseNaptrReplyAllocFail) { @@ -140,7 +157,7 @@ TEST_F(LibraryTest, ParseNaptrReplyAllocFail) { for (int ii = 1; ii <= 13; ii++) { ClearFails(); SetAllocFail(ii); - EXPECT_EQ(ARES_ENOMEM, ares_parse_naptr_reply(data.data(), data.size(), &naptr)); + EXPECT_EQ(ARES_ENOMEM, ares_parse_naptr_reply(data.data(), (int)data.size(), &naptr)); } } diff --git a/lib/c-ares-1.19.1/test/ares-test-parse-ns.cc b/lib/c-ares-1.23.0/test/ares-test-parse-ns.cc similarity index 69% rename from lib/c-ares-1.19.1/test/ares-test-parse-ns.cc rename to lib/c-ares-1.23.0/test/ares-test-parse-ns.cc index 316492174cd..8680624f2bf 100644 --- a/lib/c-ares-1.19.1/test/ares-test-parse-ns.cc +++ b/lib/c-ares-1.23.0/test/ares-test-parse-ns.cc @@ -1,3 +1,20 @@ +/* + * Copyright (C) The c-ares project + * + * 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. + * + * SPDX-License-Identifier: MIT + */ #include "ares-test.h" #include "dns-proto.h" @@ -15,7 +32,7 @@ TEST_F(LibraryTest, ParseNsReplyOK) { std::vector data = pkt.data(); struct hostent *host = nullptr; - EXPECT_EQ(ARES_SUCCESS, ares_parse_ns_reply(data.data(), data.size(), &host)); + EXPECT_EQ(ARES_SUCCESS, ares_parse_ns_reply(data.data(), (int)data.size(), &host)); ASSERT_NE(nullptr, host); std::stringstream ss; ss << HostEnt(host); @@ -38,7 +55,7 @@ TEST_F(LibraryTest, ParseNsReplyMultiple) { std::vector data = pkt.data(); struct hostent *host = nullptr; - EXPECT_EQ(ARES_SUCCESS, ares_parse_ns_reply(data.data(), data.size(), &host)); + EXPECT_EQ(ARES_SUCCESS, ares_parse_ns_reply(data.data(), (int)data.size(), &host)); ASSERT_NE(nullptr, host); std::stringstream ss; ss << HostEnt(host); @@ -57,7 +74,7 @@ TEST_F(LibraryTest, ParseNsReplyErrors) { // No question. pkt.questions_.clear(); data = pkt.data(); - EXPECT_EQ(ARES_EBADRESP, ares_parse_ns_reply(data.data(), data.size(), &host)); + EXPECT_EQ(ARES_EBADRESP, ares_parse_ns_reply(data.data(), (int)data.size(), &host)); pkt.add_question(new DNSQuestion("example.com", T_NS)); #ifdef DISABLED @@ -65,7 +82,7 @@ TEST_F(LibraryTest, ParseNsReplyErrors) { pkt.questions_.clear(); pkt.add_question(new DNSQuestion("Axample.com", T_NS)); data = pkt.data(); - EXPECT_EQ(ARES_ENODATA, ares_parse_ns_reply(data.data(), data.size(), &host)); + EXPECT_EQ(ARES_ENODATA, ares_parse_ns_reply(data.data(), (int)data.size(), &host)); pkt.questions_.clear(); pkt.add_question(new DNSQuestion("example.com", T_NS)); #endif @@ -73,7 +90,7 @@ TEST_F(LibraryTest, ParseNsReplyErrors) { // Two questions. pkt.add_question(new DNSQuestion("example.com", T_NS)); data = pkt.data(); - EXPECT_EQ(ARES_EBADRESP, ares_parse_ns_reply(data.data(), data.size(), &host)); + EXPECT_EQ(ARES_EBADRESP, ares_parse_ns_reply(data.data(), (int)data.size(), &host)); pkt.questions_.clear(); pkt.add_question(new DNSQuestion("example.com", T_NS)); @@ -81,20 +98,20 @@ TEST_F(LibraryTest, ParseNsReplyErrors) { pkt.answers_.clear(); pkt.add_answer(new DNSMxRR("example.com", 100, 100, "mx1.example.com")); data = pkt.data(); - EXPECT_EQ(ARES_ENODATA, ares_parse_ns_reply(data.data(), data.size(), &host)); + EXPECT_EQ(ARES_ENODATA, ares_parse_ns_reply(data.data(), (int)data.size(), &host)); pkt.answers_.clear(); pkt.add_answer(new DNSNsRR("example.com", 100, "ns.example.com")); // No answer. pkt.answers_.clear(); data = pkt.data(); - EXPECT_EQ(ARES_ENODATA, ares_parse_ns_reply(data.data(), data.size(), &host)); + EXPECT_EQ(ARES_ENODATA, ares_parse_ns_reply(data.data(), (int)data.size(), &host)); pkt.add_answer(new DNSNsRR("example.com", 100, "ns.example.com")); // Truncated packets. data = pkt.data(); for (size_t len = 1; len < data.size(); len++) { - EXPECT_EQ(ARES_EBADRESP, ares_parse_ns_reply(data.data(), len, &host)); + EXPECT_EQ(ARES_EBADRESP, ares_parse_ns_reply(data.data(), (int)len, &host)); } } @@ -110,7 +127,7 @@ TEST_F(LibraryTest, ParseNsReplyAllocFail) { for (int ii = 1; ii <= 8; ii++) { ClearFails(); SetAllocFail(ii); - EXPECT_EQ(ARES_ENOMEM, ares_parse_ns_reply(data.data(), data.size(), &host)) << ii; + EXPECT_EQ(ARES_ENOMEM, ares_parse_ns_reply(data.data(), (int)data.size(), &host)) << ii; } } diff --git a/lib/c-ares-1.19.1/test/ares-test-parse-ptr.cc b/lib/c-ares-1.23.0/test/ares-test-parse-ptr.cc similarity index 83% rename from lib/c-ares-1.19.1/test/ares-test-parse-ptr.cc rename to lib/c-ares-1.23.0/test/ares-test-parse-ptr.cc index 6fdaf3ea5db..e6fc96cd799 100644 --- a/lib/c-ares-1.19.1/test/ares-test-parse-ptr.cc +++ b/lib/c-ares-1.23.0/test/ares-test-parse-ptr.cc @@ -1,3 +1,20 @@ +/* + * Copyright (C) The c-ares project + * + * 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. + * + * SPDX-License-Identifier: MIT + */ #include "ares-test.h" #include "dns-proto.h" @@ -16,7 +33,7 @@ TEST_F(LibraryTest, ParsePtrReplyOK) { std::vector data = pkt.data(); struct hostent *host = nullptr; - EXPECT_EQ(ARES_SUCCESS, ares_parse_ptr_reply(data.data(), data.size(), + EXPECT_EQ(ARES_SUCCESS, ares_parse_ptr_reply(data.data(), (int)data.size(), addrv4, sizeof(addrv4), AF_INET, &host)); ASSERT_NE(nullptr, host); std::stringstream ss; @@ -35,7 +52,7 @@ TEST_F(LibraryTest, ParsePtrReplyCname) { std::vector data = pkt.data(); struct hostent *host = nullptr; - EXPECT_EQ(ARES_SUCCESS, ares_parse_ptr_reply(data.data(), data.size(), + EXPECT_EQ(ARES_SUCCESS, ares_parse_ptr_reply(data.data(), (int)data.size(), addrv4, sizeof(addrv4), AF_INET, &host)); ASSERT_NE(nullptr, host); std::stringstream ss; @@ -52,7 +69,7 @@ struct DNSMalformedCnameRR : public DNSCnameRR { std::vector data = DNSRR::data(); std::vector encname = EncodeString(other_); encname[0] = encname[0] + 63; // invalid label length - int len = encname.size(); + int len = (int)encname.size(); PushInt16(&data, len); data.insert(data.end(), encname.begin(), encname.end()); return data; @@ -69,7 +86,7 @@ TEST_F(LibraryTest, ParsePtrReplyMalformedCname) { std::vector data = pkt.data(); struct hostent *host = nullptr; - EXPECT_EQ(ARES_EBADRESP, ares_parse_ptr_reply(data.data(), data.size(), + EXPECT_EQ(ARES_EBADRESP, ares_parse_ptr_reply(data.data(), (int)data.size(), addrv4, sizeof(addrv4), AF_INET, &host)); ASSERT_EQ(nullptr, host); } @@ -92,7 +109,7 @@ TEST_F(LibraryTest, ParseManyPtrReply) { std::vector data = pkt.data(); struct hostent *host = nullptr; - EXPECT_EQ(ARES_SUCCESS, ares_parse_ptr_reply(data.data(), data.size(), + EXPECT_EQ(ARES_SUCCESS, ares_parse_ptr_reply(data.data(), (int)data.size(), addrv4, sizeof(addrv4), AF_INET, &host)); ASSERT_NE(nullptr, host); ares_free_hostent(host); @@ -113,7 +130,7 @@ TEST_F(LibraryTest, ParsePtrReplyAdditional) { std::vector data = pkt.data(); struct hostent *host = nullptr; - EXPECT_EQ(ARES_SUCCESS, ares_parse_ptr_reply(data.data(), data.size(), + EXPECT_EQ(ARES_SUCCESS, ares_parse_ptr_reply(data.data(), (int)data.size(), addrv4, sizeof(addrv4), AF_INET, &host)); ASSERT_NE(nullptr, host); std::stringstream ss; @@ -134,7 +151,7 @@ TEST_F(LibraryTest, ParsePtrReplyErrors) { // No question. pkt.questions_.clear(); data = pkt.data(); - EXPECT_EQ(ARES_EBADRESP, ares_parse_ptr_reply(data.data(), data.size(), + EXPECT_EQ(ARES_EBADRESP, ares_parse_ptr_reply(data.data(), (int)data.size(), addrv4, sizeof(addrv4), AF_INET, &host)); pkt.add_question(new DNSQuestion("64.48.32.16.in-addr.arpa", T_PTR)); @@ -142,7 +159,7 @@ TEST_F(LibraryTest, ParsePtrReplyErrors) { pkt.questions_.clear(); pkt.add_question(new DNSQuestion("99.48.32.16.in-addr.arpa", T_PTR)); data = pkt.data(); - EXPECT_EQ(ARES_ENODATA, ares_parse_ptr_reply(data.data(), data.size(), + EXPECT_EQ(ARES_ENODATA, ares_parse_ptr_reply(data.data(), (int)data.size(), addrv4, sizeof(addrv4), AF_INET, &host)); EXPECT_EQ(nullptr, host); pkt.questions_.clear(); @@ -151,7 +168,7 @@ TEST_F(LibraryTest, ParsePtrReplyErrors) { // Two questions. pkt.add_question(new DNSQuestion("64.48.32.16.in-addr.arpa", T_PTR)); data = pkt.data(); - EXPECT_EQ(ARES_EBADRESP, ares_parse_ptr_reply(data.data(), data.size(), + EXPECT_EQ(ARES_EBADRESP, ares_parse_ptr_reply(data.data(), (int)data.size(), addrv4, sizeof(addrv4), AF_INET, &host)); EXPECT_EQ(nullptr, host); pkt.questions_.clear(); @@ -161,7 +178,7 @@ TEST_F(LibraryTest, ParsePtrReplyErrors) { pkt.answers_.clear(); pkt.add_answer(new DNSMxRR("example.com", 100, 100, "mx1.example.com")); data = pkt.data(); - EXPECT_EQ(ARES_ENODATA, ares_parse_ptr_reply(data.data(), data.size(), + EXPECT_EQ(ARES_ENODATA, ares_parse_ptr_reply(data.data(), (int)data.size(), addrv4, sizeof(addrv4), AF_INET, &host)); EXPECT_EQ(nullptr, host); pkt.answers_.clear(); @@ -170,7 +187,7 @@ TEST_F(LibraryTest, ParsePtrReplyErrors) { // No answer. pkt.answers_.clear(); data = pkt.data(); - EXPECT_EQ(ARES_ENODATA, ares_parse_ptr_reply(data.data(), data.size(), + EXPECT_EQ(ARES_ENODATA, ares_parse_ptr_reply(data.data(), (int)data.size(), addrv4, sizeof(addrv4), AF_INET, &host)); EXPECT_EQ(nullptr, host); pkt.add_answer(new DNSPtrRR("64.48.32.16.in-addr.arpa", 100, "other.com")); @@ -178,7 +195,7 @@ TEST_F(LibraryTest, ParsePtrReplyErrors) { // Truncated packets. data = pkt.data(); for (size_t len = 1; len < data.size(); len++) { - EXPECT_EQ(ARES_EBADRESP, ares_parse_ptr_reply(data.data(), len, + EXPECT_EQ(ARES_EBADRESP, ares_parse_ptr_reply(data.data(), (int)len, addrv4, sizeof(addrv4), AF_INET, &host)); EXPECT_EQ(nullptr, host); } @@ -187,7 +204,7 @@ TEST_F(LibraryTest, ParsePtrReplyErrors) { pkt.add_answer(new DNSCnameRR("64.48.32.16.in-addr.arpa", 50, "64.48.32.8.in-addr.arpa")); data = pkt.data(); for (size_t len = 1; len < data.size(); len++) { - EXPECT_EQ(ARES_EBADRESP, ares_parse_ptr_reply(data.data(), len, + EXPECT_EQ(ARES_EBADRESP, ares_parse_ptr_reply(data.data(), (int)len, addrv4, sizeof(addrv4), AF_INET, &host)); EXPECT_EQ(nullptr, host); } @@ -208,7 +225,7 @@ TEST_F(LibraryTest, ParsePtrReplyAllocFailSome) { for (int ii = 1; ii <= 18; ii++) { ClearFails(); SetAllocFail(ii); - EXPECT_EQ(ARES_ENOMEM, ares_parse_ptr_reply(data.data(), data.size(), + EXPECT_EQ(ARES_ENOMEM, ares_parse_ptr_reply(data.data(), (int)data.size(), addrv4, sizeof(addrv4), AF_INET, &host)) << ii; } } @@ -234,7 +251,7 @@ TEST_F(LibraryTest, ParsePtrReplyAllocFailMany) { for (int ii = 1; ii <= 63; ii++) { ClearFails(); SetAllocFail(ii); - int rc = ares_parse_ptr_reply(data.data(), data.size(), + int rc = ares_parse_ptr_reply(data.data(), (int)data.size(), addrv4, sizeof(addrv4), AF_INET, &host); if (rc != ARES_ENOMEM) { EXPECT_EQ(ARES_SUCCESS, rc); diff --git a/lib/c-ares-1.19.1/test/ares-test-parse-soa-any.cc b/lib/c-ares-1.23.0/test/ares-test-parse-soa-any.cc similarity index 65% rename from lib/c-ares-1.19.1/test/ares-test-parse-soa-any.cc rename to lib/c-ares-1.23.0/test/ares-test-parse-soa-any.cc index 700073c5c82..c356a90b7ef 100644 --- a/lib/c-ares-1.19.1/test/ares-test-parse-soa-any.cc +++ b/lib/c-ares-1.23.0/test/ares-test-parse-soa-any.cc @@ -1,3 +1,20 @@ +/* + * Copyright (C) The c-ares project + * + * 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. + * + * SPDX-License-Identifier: MIT + */ #include "ares-test.h" #include "dns-proto.h" @@ -20,15 +37,15 @@ TEST_F(LibraryTest, ParseSoaAnyReplyOK) { std::vector data = pkt.data(); struct ares_soa_reply* soa = nullptr; - EXPECT_EQ(ARES_SUCCESS, ares_parse_soa_reply(data.data(), data.size(), &soa)); + EXPECT_EQ(ARES_SUCCESS, ares_parse_soa_reply(data.data(), (int)data.size(), &soa)); ASSERT_NE(nullptr, soa); EXPECT_EQ("soa1.example.com", std::string(soa->nsname)); EXPECT_EQ("fred.example.com", std::string(soa->hostmaster)); - EXPECT_EQ(1, soa->serial); - EXPECT_EQ(2, soa->refresh); - EXPECT_EQ(3, soa->retry); - EXPECT_EQ(4, soa->expire); - EXPECT_EQ(5, soa->minttl); + EXPECT_EQ((unsigned int)1, soa->serial); + EXPECT_EQ((unsigned int)2, soa->refresh); + EXPECT_EQ((unsigned int)3, soa->retry); + EXPECT_EQ((unsigned int)4, soa->expire); + EXPECT_EQ((unsigned int)5, soa->minttl); ares_free_data(soa); } @@ -45,7 +62,7 @@ TEST_F(LibraryTest, ParseSoaAnyReplyErrors) { // No question. pkt.questions_.clear(); data = pkt.data(); - EXPECT_EQ(ARES_EBADRESP, ares_parse_soa_reply(data.data(), data.size(), &soa)); + EXPECT_EQ(ARES_EBADRESP, ares_parse_soa_reply(data.data(), (int)data.size(), &soa)); pkt.add_question(new DNSQuestion("example.com", T_ANY)); #ifdef DISABLED @@ -53,7 +70,7 @@ TEST_F(LibraryTest, ParseSoaAnyReplyErrors) { pkt.questions_.clear(); pkt.add_question(new DNSQuestion("Axample.com", T_ANY)); data = pkt.data(); - EXPECT_EQ(ARES_EBADRESP, ares_parse_soa_reply(data.data(), data.size(), &soa)); + EXPECT_EQ(ARES_EBADRESP, ares_parse_soa_reply(data.data(), (int)data.size(), &soa)); pkt.questions_.clear(); pkt.add_question(new DNSQuestion("example.com", T_ANY)); #endif @@ -61,7 +78,7 @@ TEST_F(LibraryTest, ParseSoaAnyReplyErrors) { // Two questions pkt.add_question(new DNSQuestion("example.com", T_ANY)); data = pkt.data(); - EXPECT_EQ(ARES_EBADRESP, ares_parse_soa_reply(data.data(), data.size(), &soa)); + EXPECT_EQ(ARES_EBADRESP, ares_parse_soa_reply(data.data(), (int)data.size(), &soa)); pkt.questions_.clear(); pkt.add_question(new DNSQuestion("example.com", T_ANY)); @@ -69,7 +86,7 @@ TEST_F(LibraryTest, ParseSoaAnyReplyErrors) { pkt.answers_.clear(); pkt.add_answer(new DNSMxRR("example.com", 100, 100, "mx1.example.com")); data = pkt.data(); - EXPECT_EQ(ARES_EBADRESP, ares_parse_soa_reply(data.data(), data.size(), &soa)); + EXPECT_EQ(ARES_EBADRESP, ares_parse_soa_reply(data.data(), (int)data.size(), &soa)); pkt.answers_.clear(); pkt.add_answer(new DNSSoaRR("example.com", 100, "soa1.example.com", "fred.example.com", @@ -78,7 +95,7 @@ TEST_F(LibraryTest, ParseSoaAnyReplyErrors) { // No answer. pkt.answers_.clear(); data = pkt.data(); - EXPECT_EQ(ARES_EBADRESP, ares_parse_soa_reply(data.data(), data.size(), &soa)); + EXPECT_EQ(ARES_EBADRESP, ares_parse_soa_reply(data.data(), (int)data.size(), &soa)); pkt.add_answer(new DNSSoaRR("example.com", 100, "soa1.example.com", "fred.example.com", 1, 2, 3, 4, 5)); @@ -86,7 +103,7 @@ TEST_F(LibraryTest, ParseSoaAnyReplyErrors) { // Truncated packets. data = pkt.data(); for (size_t len = 1; len < data.size(); len++) { - EXPECT_EQ(ARES_EBADRESP, ares_parse_soa_reply(data.data(), len, &soa)); + EXPECT_EQ(ARES_EBADRESP, ares_parse_soa_reply(data.data(), (int)len, &soa)); } } @@ -103,7 +120,7 @@ TEST_F(LibraryTest, ParseSoaAnyReplyAllocFail) { for (int ii = 1; ii <= 5; ii++) { ClearFails(); SetAllocFail(ii); - EXPECT_EQ(ARES_ENOMEM, ares_parse_soa_reply(data.data(), data.size(), &soa)) << ii; + EXPECT_EQ(ARES_ENOMEM, ares_parse_soa_reply(data.data(), (int)data.size(), &soa)) << ii; } } diff --git a/lib/c-ares-1.19.1/test/ares-test-parse-soa.cc b/lib/c-ares-1.23.0/test/ares-test-parse-soa.cc similarity index 63% rename from lib/c-ares-1.19.1/test/ares-test-parse-soa.cc rename to lib/c-ares-1.23.0/test/ares-test-parse-soa.cc index 22a78e5f46d..7bb7d6592df 100644 --- a/lib/c-ares-1.19.1/test/ares-test-parse-soa.cc +++ b/lib/c-ares-1.23.0/test/ares-test-parse-soa.cc @@ -1,3 +1,20 @@ +/* + * Copyright (C) The c-ares project + * + * 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. + * + * SPDX-License-Identifier: MIT + */ #include "ares-test.h" #include "dns-proto.h" @@ -17,15 +34,15 @@ TEST_F(LibraryTest, ParseSoaReplyOK) { std::vector data = pkt.data(); struct ares_soa_reply* soa = nullptr; - EXPECT_EQ(ARES_SUCCESS, ares_parse_soa_reply(data.data(), data.size(), &soa)); + EXPECT_EQ(ARES_SUCCESS, ares_parse_soa_reply(data.data(), (int)data.size(), &soa)); ASSERT_NE(nullptr, soa); EXPECT_EQ("soa1.example.com", std::string(soa->nsname)); EXPECT_EQ("fred.example.com", std::string(soa->hostmaster)); - EXPECT_EQ(1, soa->serial); - EXPECT_EQ(2, soa->refresh); - EXPECT_EQ(3, soa->retry); - EXPECT_EQ(4, soa->expire); - EXPECT_EQ(5, soa->minttl); + EXPECT_EQ((unsigned int)1, soa->serial); + EXPECT_EQ((unsigned int)2, soa->refresh); + EXPECT_EQ((unsigned int)3, soa->retry); + EXPECT_EQ((unsigned int)4, soa->expire); + EXPECT_EQ((unsigned int)5, soa->minttl); ares_free_data(soa); } @@ -42,7 +59,7 @@ TEST_F(LibraryTest, ParseSoaReplyErrors) { // No question. pkt.questions_.clear(); data = pkt.data(); - EXPECT_EQ(ARES_EBADRESP, ares_parse_soa_reply(data.data(), data.size(), &soa)); + EXPECT_EQ(ARES_EBADRESP, ares_parse_soa_reply(data.data(), (int)data.size(), &soa)); pkt.add_question(new DNSQuestion("example.com", T_SOA)); #ifdef DISABLED @@ -50,7 +67,7 @@ TEST_F(LibraryTest, ParseSoaReplyErrors) { pkt.questions_.clear(); pkt.add_question(new DNSQuestion("Axample.com", T_SOA)); data = pkt.data(); - EXPECT_EQ(ARES_EBADRESP, ares_parse_soa_reply(data.data(), data.size(), &soa)); + EXPECT_EQ(ARES_EBADRESP, ares_parse_soa_reply(data.data(), (int)data.size(), &soa)); pkt.questions_.clear(); pkt.add_question(new DNSQuestion("example.com", T_SOA)); #endif @@ -58,7 +75,7 @@ TEST_F(LibraryTest, ParseSoaReplyErrors) { // Two questions pkt.add_question(new DNSQuestion("example.com", T_SOA)); data = pkt.data(); - EXPECT_EQ(ARES_EBADRESP, ares_parse_soa_reply(data.data(), data.size(), &soa)); + EXPECT_EQ(ARES_EBADRESP, ares_parse_soa_reply(data.data(), (int)data.size(), &soa)); pkt.questions_.clear(); pkt.add_question(new DNSQuestion("example.com", T_SOA)); @@ -66,7 +83,7 @@ TEST_F(LibraryTest, ParseSoaReplyErrors) { pkt.answers_.clear(); pkt.add_answer(new DNSMxRR("example.com", 100, 100, "mx1.example.com")); data = pkt.data(); - EXPECT_EQ(ARES_EBADRESP, ares_parse_soa_reply(data.data(), data.size(), &soa)); + EXPECT_EQ(ARES_EBADRESP, ares_parse_soa_reply(data.data(), (int)data.size(), &soa)); pkt.answers_.clear(); pkt.add_answer(new DNSSoaRR("example.com", 100, "soa1.example.com", "fred.example.com", @@ -75,7 +92,7 @@ TEST_F(LibraryTest, ParseSoaReplyErrors) { // No answer. pkt.answers_.clear(); data = pkt.data(); - EXPECT_EQ(ARES_EBADRESP, ares_parse_soa_reply(data.data(), data.size(), &soa)); + EXPECT_EQ(ARES_EBADRESP, ares_parse_soa_reply(data.data(), (int)data.size(), &soa)); pkt.add_answer(new DNSSoaRR("example.com", 100, "soa1.example.com", "fred.example.com", 1, 2, 3, 4, 5)); @@ -83,7 +100,7 @@ TEST_F(LibraryTest, ParseSoaReplyErrors) { // Truncated packets. data = pkt.data(); for (size_t len = 1; len < data.size(); len++) { - EXPECT_EQ(ARES_EBADRESP, ares_parse_soa_reply(data.data(), len, &soa)); + EXPECT_EQ(ARES_EBADRESP, ares_parse_soa_reply(data.data(), (int)len, &soa)); } } @@ -100,7 +117,7 @@ TEST_F(LibraryTest, ParseSoaReplyAllocFail) { for (int ii = 1; ii <= 5; ii++) { ClearFails(); SetAllocFail(ii); - EXPECT_EQ(ARES_ENOMEM, ares_parse_soa_reply(data.data(), data.size(), &soa)) << ii; + EXPECT_EQ(ARES_ENOMEM, ares_parse_soa_reply(data.data(), (int)data.size(), &soa)) << ii; } } diff --git a/lib/c-ares-1.19.1/test/ares-test-parse-srv.cc b/lib/c-ares-1.23.0/test/ares-test-parse-srv.cc similarity index 84% rename from lib/c-ares-1.19.1/test/ares-test-parse-srv.cc rename to lib/c-ares-1.23.0/test/ares-test-parse-srv.cc index b004759801a..678ecaa427c 100644 --- a/lib/c-ares-1.19.1/test/ares-test-parse-srv.cc +++ b/lib/c-ares-1.23.0/test/ares-test-parse-srv.cc @@ -1,3 +1,20 @@ +/* + * Copyright (C) The c-ares project + * + * 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. + * + * SPDX-License-Identifier: MIT + */ #include "ares-test.h" #include "dns-proto.h" @@ -16,7 +33,7 @@ TEST_F(LibraryTest, ParseSrvReplyOK) { std::vector data = pkt.data(); struct ares_srv_reply* srv = nullptr; - EXPECT_EQ(ARES_SUCCESS, ares_parse_srv_reply(data.data(), data.size(), &srv)); + EXPECT_EQ(ARES_SUCCESS, ares_parse_srv_reply(data.data(), (int)data.size(), &srv)); ASSERT_NE(nullptr, srv); EXPECT_EQ("srv.example.com", std::string(srv->host)); @@ -50,7 +67,7 @@ TEST_F(LibraryTest, ParseSrvReplySingle) { std::vector data = pkt.data(); struct ares_srv_reply* srv = nullptr; - EXPECT_EQ(ARES_SUCCESS, ares_parse_srv_reply(data.data(), data.size(), &srv)); + EXPECT_EQ(ARES_SUCCESS, ares_parse_srv_reply(data.data(), (int)data.size(), &srv)); ASSERT_NE(nullptr, srv); EXPECT_EQ("example.abc.def.com", std::string(srv->host)); @@ -89,7 +106,7 @@ TEST_F(LibraryTest, ParseSrvReplyMalformed) { }; struct ares_srv_reply* srv = nullptr; - EXPECT_EQ(ARES_EBADRESP, ares_parse_srv_reply(data.data(), data.size(), &srv)); + EXPECT_EQ(ARES_EBADRESP, ares_parse_srv_reply(data.data(), (int)data.size(), &srv)); ASSERT_EQ(nullptr, srv); } @@ -112,7 +129,7 @@ TEST_F(LibraryTest, ParseSrvReplyMultiple) { std::vector data = pkt.data(); struct ares_srv_reply* srv0 = nullptr; - EXPECT_EQ(ARES_SUCCESS, ares_parse_srv_reply(data.data(), data.size(), &srv0)); + EXPECT_EQ(ARES_SUCCESS, ares_parse_srv_reply(data.data(), (int)data.size(), &srv0)); ASSERT_NE(nullptr, srv0); struct ares_srv_reply* srv = srv0; @@ -155,7 +172,7 @@ TEST_F(LibraryTest, ParseSrvReplyCname) { std::vector data = pkt.data(); struct ares_srv_reply* srv = nullptr; - EXPECT_EQ(ARES_SUCCESS, ares_parse_srv_reply(data.data(), data.size(), &srv)); + EXPECT_EQ(ARES_SUCCESS, ares_parse_srv_reply(data.data(), (int)data.size(), &srv)); ASSERT_NE(nullptr, srv); EXPECT_EQ("srv.abc.def.com", std::string(srv->host)); @@ -187,7 +204,7 @@ TEST_F(LibraryTest, ParseSrvReplyCnameMultiple) { std::vector data = pkt.data(); struct ares_srv_reply* srv0 = nullptr; - EXPECT_EQ(ARES_SUCCESS, ares_parse_srv_reply(data.data(), data.size(), &srv0)); + EXPECT_EQ(ARES_SUCCESS, ares_parse_srv_reply(data.data(), (int)data.size(), &srv0)); ASSERT_NE(nullptr, srv0); struct ares_srv_reply* srv = srv0; @@ -225,7 +242,7 @@ TEST_F(LibraryTest, ParseSrvReplyErrors) { // No question. pkt.questions_.clear(); data = pkt.data(); - EXPECT_EQ(ARES_EBADRESP, ares_parse_srv_reply(data.data(), data.size(), &srv)); + EXPECT_EQ(ARES_EBADRESP, ares_parse_srv_reply(data.data(), (int)data.size(), &srv)); pkt.add_question(new DNSQuestion("example.abc.def.com", T_SRV)); #ifdef DISABLED @@ -233,7 +250,7 @@ TEST_F(LibraryTest, ParseSrvReplyErrors) { pkt.questions_.clear(); pkt.add_question(new DNSQuestion("Axample.com", T_SRV)); data = pkt.data(); - EXPECT_EQ(ARES_ENODATA, ares_parse_srv_reply(data.data(), data.size(), &srv)); + EXPECT_EQ(ARES_ENODATA, ares_parse_srv_reply(data.data(), (int)data.size(), &srv)); pkt.questions_.clear(); pkt.add_question(new DNSQuestion("example.com", T_SRV)); #endif @@ -241,7 +258,7 @@ TEST_F(LibraryTest, ParseSrvReplyErrors) { // Two questions. pkt.add_question(new DNSQuestion("example.abc.def.com", T_SRV)); data = pkt.data(); - EXPECT_EQ(ARES_EBADRESP, ares_parse_srv_reply(data.data(), data.size(), &srv)); + EXPECT_EQ(ARES_EBADRESP, ares_parse_srv_reply(data.data(), (int)data.size(), &srv)); pkt.questions_.clear(); pkt.add_question(new DNSQuestion("64.48.32.16.in-addr.arpa", T_PTR)); @@ -249,7 +266,7 @@ TEST_F(LibraryTest, ParseSrvReplyErrors) { pkt.answers_.clear(); pkt.add_answer(new DNSMxRR("example.com", 100, 100, "mx1.example.com")); data = pkt.data(); - EXPECT_EQ(ARES_SUCCESS, ares_parse_srv_reply(data.data(), data.size(), &srv)); + EXPECT_EQ(ARES_SUCCESS, ares_parse_srv_reply(data.data(), (int)data.size(), &srv)); EXPECT_EQ(nullptr, srv); pkt.answers_.clear(); pkt.add_answer(new DNSSrvRR("example.abc.def.com", 180, 0, 10, 8160, "example.abc.def.com")); @@ -257,13 +274,13 @@ TEST_F(LibraryTest, ParseSrvReplyErrors) { // No answer. pkt.answers_.clear(); data = pkt.data(); - EXPECT_EQ(ARES_ENODATA, ares_parse_srv_reply(data.data(), data.size(), &srv)); + EXPECT_EQ(ARES_ENODATA, ares_parse_srv_reply(data.data(), (int)data.size(), &srv)); pkt.add_answer(new DNSSrvRR("example.abc.def.com", 180, 0, 10, 8160, "example.abc.def.com")); // Truncated packets. data = pkt.data(); for (size_t len = 1; len < data.size(); len++) { - int rc = ares_parse_srv_reply(data.data(), len, &srv); + int rc = ares_parse_srv_reply(data.data(), (int)len, &srv); EXPECT_TRUE(rc == ARES_EBADRESP || rc == ARES_EBADNAME); } } @@ -280,7 +297,7 @@ TEST_F(LibraryTest, ParseSrvReplyAllocFail) { for (int ii = 1; ii <= 5; ii++) { ClearFails(); SetAllocFail(ii); - EXPECT_EQ(ARES_ENOMEM, ares_parse_srv_reply(data.data(), data.size(), &srv)) << ii; + EXPECT_EQ(ARES_ENOMEM, ares_parse_srv_reply(data.data(), (int)data.size(), &srv)) << ii; } } diff --git a/lib/c-ares-1.19.1/test/ares-test-parse-txt.cc b/lib/c-ares-1.23.0/test/ares-test-parse-txt.cc similarity index 77% rename from lib/c-ares-1.19.1/test/ares-test-parse-txt.cc rename to lib/c-ares-1.23.0/test/ares-test-parse-txt.cc index b33fb2de0c9..c81c43e516b 100644 --- a/lib/c-ares-1.19.1/test/ares-test-parse-txt.cc +++ b/lib/c-ares-1.23.0/test/ares-test-parse-txt.cc @@ -1,3 +1,20 @@ +/* + * Copyright (C) The c-ares project + * + * 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. + * + * SPDX-License-Identifier: MIT + */ #include "ares-test.h" #include "dns-proto.h" @@ -19,22 +36,18 @@ TEST_F(LibraryTest, ParseTxtReplyOK) { std::vector data = pkt.data(); struct ares_txt_reply* txt = nullptr; - EXPECT_EQ(ARES_SUCCESS, ares_parse_txt_reply(data.data(), data.size(), &txt)); + EXPECT_EQ(ARES_SUCCESS, ares_parse_txt_reply(data.data(), (int)data.size(), &txt)); ASSERT_NE(nullptr, txt); EXPECT_EQ(std::vector(expected1.data(), expected1.data() + expected1.size()), std::vector(txt->txt, txt->txt + txt->length)); struct ares_txt_reply* txt2 = txt->next; ASSERT_NE(nullptr, txt2); - EXPECT_EQ(std::vector(expected2a.data(), expected2a.data() + expected2a.size()), + std::vector rsp = std::vector(expected2a.data(), expected2a.data() + expected2a.size()); + rsp.insert(rsp.end(), expected2b.data(), expected2b.data() + expected2b.size()); + EXPECT_EQ(rsp, std::vector(txt2->txt, txt2->txt + txt2->length)); - struct ares_txt_reply* txt3 = txt2->next; - ASSERT_NE(nullptr, txt3); - EXPECT_EQ(std::vector(expected2b.data(), expected2b.data() + expected2b.size()), - std::vector(txt3->txt, txt3->txt + txt3->length)); - EXPECT_EQ(nullptr, txt3->next); - ares_free_data(txt); } @@ -50,7 +63,7 @@ TEST_F(LibraryTest, ParseTxtExtReplyOK) { std::vector data = pkt.data(); struct ares_txt_ext* txt = nullptr; - EXPECT_EQ(ARES_SUCCESS, ares_parse_txt_reply_ext(data.data(), data.size(), &txt)); + EXPECT_EQ(ARES_SUCCESS, ares_parse_txt_reply_ext(data.data(), (int)data.size(), &txt)); ASSERT_NE(nullptr, txt); EXPECT_EQ(std::vector(expected1.data(), expected1.data() + expected1.size()), std::vector(txt->txt, txt->txt + txt->length)); @@ -58,17 +71,12 @@ TEST_F(LibraryTest, ParseTxtExtReplyOK) { struct ares_txt_ext* txt2 = txt->next; ASSERT_NE(nullptr, txt2); - EXPECT_EQ(std::vector(expected2a.data(), expected2a.data() + expected2a.size()), + std::vector rsp = std::vector(expected2a.data(), expected2a.data() + expected2a.size()); + rsp.insert(rsp.end(), expected2b.data(), expected2b.data() + expected2b.size()); + EXPECT_EQ(rsp, std::vector(txt2->txt, txt2->txt + txt2->length)); EXPECT_EQ(1, txt2->record_start); - struct ares_txt_ext* txt3 = txt2->next; - ASSERT_NE(nullptr, txt3); - EXPECT_EQ(std::vector(expected2b.data(), expected2b.data() + expected2b.size()), - std::vector(txt3->txt, txt3->txt + txt3->length)); - EXPECT_EQ(nullptr, txt3->next); - EXPECT_EQ(0, txt3->record_start); - ares_free_data(txt); } @@ -99,7 +107,7 @@ TEST_F(LibraryTest, ParseTxtMalformedReply1) { }; struct ares_txt_reply* txt = nullptr; - EXPECT_EQ(ARES_EBADRESP, ares_parse_txt_reply(data.data(), data.size(), &txt)); + EXPECT_EQ(ARES_EBADRESP, ares_parse_txt_reply(data.data(), (int)data.size(), &txt)); ASSERT_EQ(nullptr, txt); } @@ -127,7 +135,7 @@ TEST_F(LibraryTest, ParseTxtMalformedReply2) { }; struct ares_txt_reply* txt = nullptr; - EXPECT_EQ(ARES_EBADRESP, ares_parse_txt_reply(data.data(), data.size(), &txt)); + EXPECT_EQ(ARES_EBADRESP, ares_parse_txt_reply(data.data(), (int)data.size(), &txt)); ASSERT_EQ(nullptr, txt); } @@ -158,7 +166,7 @@ TEST_F(LibraryTest, ParseTxtMalformedReply3) { }; struct ares_txt_reply* txt = nullptr; - EXPECT_EQ(ARES_EBADRESP, ares_parse_txt_reply(data.data(), data.size(), &txt)); + EXPECT_EQ(ARES_EBADRESP, ares_parse_txt_reply(data.data(), (int)data.size(), &txt)); ASSERT_EQ(nullptr, txt); } @@ -180,7 +188,7 @@ TEST_F(LibraryTest, ParseTxtMalformedReply4) { }; struct ares_txt_reply* txt = nullptr; - EXPECT_EQ(ARES_EBADRESP, ares_parse_txt_reply(data.data(), data.size(), &txt)); + EXPECT_EQ(ARES_EBADRESP, ares_parse_txt_reply(data.data(), (int)data.size(), &txt)); ASSERT_EQ(nullptr, txt); } @@ -201,7 +209,7 @@ TEST_F(LibraryTest, ParseTxtReplyErrors) { pkt.questions_.clear(); data = pkt.data(); txt = nullptr; - EXPECT_EQ(ARES_EBADRESP, ares_parse_txt_reply(data.data(), data.size(), &txt)); + EXPECT_EQ(ARES_EBADRESP, ares_parse_txt_reply(data.data(), (int)data.size(), &txt)); EXPECT_EQ(nullptr, txt); pkt.add_question(new DNSQuestion("example.com", T_MX)); @@ -210,7 +218,7 @@ TEST_F(LibraryTest, ParseTxtReplyErrors) { pkt.questions_.clear(); pkt.add_question(new DNSQuestion("Axample.com", T_TXT)); data = pkt.data(); - EXPECT_EQ(ARES_ENODATA, ares_parse_txt_reply(data.data(), data.size(), &txt)); + EXPECT_EQ(ARES_ENODATA, ares_parse_txt_reply(data.data(), (int)data.size(), &txt)); pkt.questions_.clear(); pkt.add_question(new DNSQuestion("example.com", T_TXT)); #endif @@ -219,7 +227,7 @@ TEST_F(LibraryTest, ParseTxtReplyErrors) { pkt.add_question(new DNSQuestion("example.com", T_MX)); data = pkt.data(); txt = nullptr; - EXPECT_EQ(ARES_EBADRESP, ares_parse_txt_reply(data.data(), data.size(), &txt)); + EXPECT_EQ(ARES_EBADRESP, ares_parse_txt_reply(data.data(), (int)data.size(), &txt)); EXPECT_EQ(nullptr, txt); pkt.questions_.clear(); pkt.add_question(new DNSQuestion("example.com", T_MX)); @@ -228,14 +236,14 @@ TEST_F(LibraryTest, ParseTxtReplyErrors) { pkt.answers_.clear(); data = pkt.data(); txt = nullptr; - EXPECT_EQ(ARES_ENODATA, ares_parse_txt_reply(data.data(), data.size(), &txt)); + EXPECT_EQ(ARES_ENODATA, ares_parse_txt_reply(data.data(), (int)data.size(), &txt)); EXPECT_EQ(nullptr, txt); pkt.add_answer(new DNSTxtRR("example.com", 100, {expected1})); // Truncated packets. for (size_t len = 1; len < data.size(); len++) { txt = nullptr; - EXPECT_NE(ARES_SUCCESS, ares_parse_txt_reply(data.data(), len, &txt)); + EXPECT_NE(ARES_SUCCESS, ares_parse_txt_reply(data.data(), (int)len, &txt)); EXPECT_EQ(nullptr, txt); } } @@ -257,7 +265,7 @@ TEST_F(LibraryTest, ParseTxtReplyAllocFail) { for (int ii = 1; ii <= 13; ii++) { ClearFails(); SetAllocFail(ii); - EXPECT_EQ(ARES_ENOMEM, ares_parse_txt_reply(data.data(), data.size(), &txt)) << ii; + EXPECT_EQ(ARES_ENOMEM, ares_parse_txt_reply(data.data(), (int)data.size(), &txt)) << ii; } } diff --git a/lib/c-ares-1.19.1/test/ares-test-parse-uri.cc b/lib/c-ares-1.23.0/test/ares-test-parse-uri.cc similarity index 84% rename from lib/c-ares-1.19.1/test/ares-test-parse-uri.cc rename to lib/c-ares-1.23.0/test/ares-test-parse-uri.cc index 4fbffd0afd9..7d06871633f 100644 --- a/lib/c-ares-1.19.1/test/ares-test-parse-uri.cc +++ b/lib/c-ares-1.23.0/test/ares-test-parse-uri.cc @@ -1,3 +1,20 @@ +/* + * Copyright (C) The c-ares project + * + * 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. + * + * SPDX-License-Identifier: MIT + */ #include "ares-test.h" #include "dns-proto.h" @@ -16,7 +33,7 @@ TEST_F(LibraryTest, ParseUriReplyOK) { std::vector data = pkt.data(); struct ares_uri_reply* uri = nullptr; - EXPECT_EQ(ARES_SUCCESS, ares_parse_uri_reply(data.data(), data.size(), &uri)); + EXPECT_EQ(ARES_SUCCESS, ares_parse_uri_reply(data.data(), (int)data.size(), &uri)); ASSERT_NE(nullptr, uri); EXPECT_EQ("uri.example.com", std::string(uri->uri)); @@ -50,7 +67,7 @@ TEST_F(LibraryTest, ParseUriReplySingle) { std::vector data = pkt.data(); struct ares_uri_reply* uri = nullptr; - EXPECT_EQ(ARES_SUCCESS, ares_parse_uri_reply(data.data(), data.size(), &uri)); + EXPECT_EQ(ARES_SUCCESS, ares_parse_uri_reply(data.data(), (int)data.size(), &uri)); ASSERT_NE(nullptr, uri); EXPECT_EQ("example.abc.def.com", std::string(uri->uri)); @@ -89,7 +106,7 @@ TEST_F(LibraryTest, ParseUriReplyMalformed) { }; struct ares_uri_reply* uri = nullptr; - EXPECT_EQ(ARES_EBADRESP, ares_parse_uri_reply(data.data(), data.size(), &uri)); + EXPECT_EQ(ARES_EBADRESP, ares_parse_uri_reply(data.data(), (int)data.size(), &uri)); ASSERT_EQ(nullptr, uri); } @@ -112,7 +129,7 @@ TEST_F(LibraryTest, ParseUriReplyMultiple) { std::vector data = pkt.data(); struct ares_uri_reply* uri0 = nullptr; - EXPECT_EQ(ARES_SUCCESS, ares_parse_uri_reply(data.data(), data.size(), &uri0)); + EXPECT_EQ(ARES_SUCCESS, ares_parse_uri_reply(data.data(), (int)data.size(), &uri0)); ASSERT_NE(nullptr, uri0); struct ares_uri_reply* uri = uri0; @@ -155,7 +172,7 @@ TEST_F(LibraryTest, ParseUriReplyCname) { std::vector data = pkt.data(); struct ares_uri_reply* uri = nullptr; - EXPECT_EQ(ARES_SUCCESS, ares_parse_uri_reply(data.data(), data.size(), &uri)); + EXPECT_EQ(ARES_SUCCESS, ares_parse_uri_reply(data.data(), (int)data.size(), &uri)); ASSERT_NE(nullptr, uri); EXPECT_EQ("uri.abc.def.com", std::string(uri->uri)); @@ -187,7 +204,7 @@ TEST_F(LibraryTest, ParseUriReplyCnameMultiple) { std::vector data = pkt.data(); struct ares_uri_reply* uri0 = nullptr; - EXPECT_EQ(ARES_SUCCESS, ares_parse_uri_reply(data.data(), data.size(), &uri0)); + EXPECT_EQ(ARES_SUCCESS, ares_parse_uri_reply(data.data(), (int)data.size(), &uri0)); ASSERT_NE(nullptr, uri0); struct ares_uri_reply* uri = uri0; @@ -225,7 +242,7 @@ TEST_F(LibraryTest, ParseUriReplyErrors) { // No question. pkt.questions_.clear(); data = pkt.data(); - EXPECT_EQ(ARES_EBADRESP, ares_parse_uri_reply(data.data(), data.size(), &uri)); + EXPECT_EQ(ARES_EBADRESP, ares_parse_uri_reply(data.data(), (int)data.size(), &uri)); pkt.add_question(new DNSQuestion("example.abc.def.com", T_URI)); #ifdef DISABLED @@ -233,7 +250,7 @@ TEST_F(LibraryTest, ParseUriReplyErrors) { pkt.questions_.clear(); pkt.add_question(new DNSQuestion("Axample.com", T_URI)); data = pkt.data(); - EXPECT_EQ(ARES_ENODATA, ares_parse_uri_reply(data.data(), data.size(), &uri)); + EXPECT_EQ(ARES_ENODATA, ares_parse_uri_reply(data.data(), (int)data.size(), &uri)); pkt.questions_.clear(); pkt.add_question(new DNSQuestion("example.com", T_URI)); #endif @@ -241,7 +258,7 @@ TEST_F(LibraryTest, ParseUriReplyErrors) { // Two questions. pkt.add_question(new DNSQuestion("example.abc.def.com", T_URI)); data = pkt.data(); - EXPECT_EQ(ARES_EBADRESP, ares_parse_uri_reply(data.data(), data.size(), &uri)); + EXPECT_EQ(ARES_EBADRESP, ares_parse_uri_reply(data.data(), (int)data.size(), &uri)); pkt.questions_.clear(); pkt.add_question(new DNSQuestion("64.48.32.16.in-addr.arpa", T_PTR)); @@ -249,7 +266,7 @@ TEST_F(LibraryTest, ParseUriReplyErrors) { pkt.answers_.clear(); pkt.add_answer(new DNSMxRR("example.com", 100, 100, "mx1.example.com")); data = pkt.data(); - EXPECT_EQ(ARES_SUCCESS, ares_parse_uri_reply(data.data(), data.size(), &uri)); + EXPECT_EQ(ARES_SUCCESS, ares_parse_uri_reply(data.data(), (int)data.size(), &uri)); EXPECT_EQ(nullptr, uri); pkt.answers_.clear(); pkt.add_answer(new DNSUriRR("example.abc.def.com", 180, 0, 10, "example.abc.def.com")); @@ -257,13 +274,13 @@ TEST_F(LibraryTest, ParseUriReplyErrors) { // No answer. pkt.answers_.clear(); data = pkt.data(); - EXPECT_EQ(ARES_ENODATA, ares_parse_uri_reply(data.data(), data.size(), &uri)); + EXPECT_EQ(ARES_ENODATA, ares_parse_uri_reply(data.data(), (int)data.size(), &uri)); pkt.add_answer(new DNSUriRR("example.abc.def.com", 180, 0, 10, "example.abc.def.com")); // Truncated packets. data = pkt.data(); for (size_t len = 1; len < data.size(); len++) { - int rc = ares_parse_uri_reply(data.data(), len, &uri); + int rc = ares_parse_uri_reply(data.data(), (int)len, &uri); EXPECT_TRUE(rc == ARES_EBADRESP || rc == ARES_EBADNAME); } } @@ -280,7 +297,7 @@ TEST_F(LibraryTest, ParseUriReplyAllocFail) { for (int ii = 1; ii <= 5; ii++) { ClearFails(); SetAllocFail(ii); - EXPECT_EQ(ARES_ENOMEM, ares_parse_uri_reply(data.data(), data.size(), &uri)) << ii; + EXPECT_EQ(ARES_ENOMEM, ares_parse_uri_reply(data.data(), (int)data.size(), &uri)) << ii; } } diff --git a/lib/c-ares-1.19.1/test/ares-test-parse.cc b/lib/c-ares-1.23.0/test/ares-test-parse.cc similarity index 78% rename from lib/c-ares-1.19.1/test/ares-test-parse.cc rename to lib/c-ares-1.23.0/test/ares-test-parse.cc index 87ab0bd25f0..ac3a71605b6 100644 --- a/lib/c-ares-1.19.1/test/ares-test-parse.cc +++ b/lib/c-ares-1.23.0/test/ares-test-parse.cc @@ -1,3 +1,20 @@ +/* + * Copyright (C) The c-ares project + * + * 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. + * + * SPDX-License-Identifier: MIT + */ #include "ares-test.h" #include "dns-proto.h" @@ -17,7 +34,7 @@ TEST_F(LibraryTest, ParseRootName) { struct hostent *host = nullptr; struct ares_addrttl info[2]; int count = 2; - EXPECT_EQ(ARES_SUCCESS, ares_parse_a_reply(data.data(), data.size(), + EXPECT_EQ(ARES_SUCCESS, ares_parse_a_reply(data.data(), (int)data.size(), &host, info, &count)); EXPECT_EQ(1, count); std::stringstream ss; @@ -51,7 +68,7 @@ TEST_F(LibraryTest, ParseIndirectRootName) { struct hostent *host = nullptr; struct ares_addrttl info[2]; int count = 2; - EXPECT_EQ(ARES_SUCCESS, ares_parse_a_reply(data.data(), data.size(), + EXPECT_EQ(ARES_SUCCESS, ares_parse_a_reply(data.data(), (int)data.size(), &host, info, &count)); EXPECT_EQ(1, count); std::stringstream ss; @@ -137,7 +154,7 @@ TEST_F(LibraryTest, ParsePartialCompressedName) { struct hostent *host = nullptr; struct ares_addrttl info[2]; int count = 2; - EXPECT_EQ(ARES_SUCCESS, ares_parse_a_reply(data.data(), data.size(), + EXPECT_EQ(ARES_SUCCESS, ares_parse_a_reply(data.data(), (int)data.size(), &host, info, &count)); ASSERT_NE(nullptr, host); std::stringstream ss; @@ -173,7 +190,7 @@ TEST_F(LibraryTest, ParseFullyCompressedName) { struct hostent *host = nullptr; struct ares_addrttl info[2]; int count = 2; - EXPECT_EQ(ARES_SUCCESS, ares_parse_a_reply(data.data(), data.size(), + EXPECT_EQ(ARES_SUCCESS, ares_parse_a_reply(data.data(), (int)data.size(), &host, info, &count)); ASSERT_NE(nullptr, host); std::stringstream ss; @@ -182,41 +199,6 @@ TEST_F(LibraryTest, ParseFullyCompressedName) { ares_free_hostent(host); } -TEST_F(LibraryTest, ParseFullyCompressedName2) { - std::vector data = { - 0x12, 0x34, // qid - 0x84, // response + query + AA + not-TC + not-RD - 0x00, // not-RA + not-Z + not-AD + not-CD + rc=NoError - 0x00, 0x01, // num questions - 0x00, 0x01, // num answer RRs - 0x00, 0x00, // num authority RRs - 0x00, 0x00, // num additional RRs - // Question - 0xC0, 0x12, // pointer to later in message - 0x00, 0x01, // type A - 0x00, 0x01, // class IN - // Answer 1 - 0x03, 'w', 'w', 'w', - 0x07, 'e', 'x', 'a', 'm', 'p', 'l', 'e', - 0x03, 'c', 'o', 'm', - 0x00, - 0x00, 0x01, // RR type - 0x00, 0x01, // class IN - 0x01, 0x02, 0x03, 0x04, // TTL - 0x00, 0x04, // rdata length - 0x02, 0x03, 0x04, 0x05, - }; - struct hostent *host = nullptr; - struct ares_addrttl info[2]; - int count = 2; - EXPECT_EQ(ARES_SUCCESS, ares_parse_a_reply(data.data(), data.size(), - &host, info, &count)); - ASSERT_NE(nullptr, host); - std::stringstream ss; - ss << HostEnt(host); - EXPECT_EQ("{'www.example.com' aliases=[] addrs=[2.3.4.5]}", ss.str()); - ares_free_hostent(host); -} } // namespace test } // namespace ares diff --git a/lib/c-ares-1.19.1/test/ares-test.cc b/lib/c-ares-1.23.0/test/ares-test.cc similarity index 86% rename from lib/c-ares-1.19.1/test/ares-test.cc rename to lib/c-ares-1.23.0/test/ares-test.cc index 7e8793d031d..5e383961d66 100644 --- a/lib/c-ares-1.19.1/test/ares-test.cc +++ b/lib/c-ares-1.23.0/test/ares-test.cc @@ -1,3 +1,20 @@ +/* + * Copyright (C) Brad House + * + * 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. + * + * SPDX-License-Identifier: MIT + */ #include "ares_setup.h" #include "ares.h" #include "ares_nameser.h" @@ -32,8 +49,8 @@ namespace ares { namespace test { bool verbose = false; -static constexpr int dynamic_port = 0; -int mock_port = dynamic_port; +static constexpr unsigned short dynamic_port = 0; +unsigned short mock_port = dynamic_port; const std::vector both_families = {AF_INET, AF_INET6}; const std::vector ipv4_family = {AF_INET}; @@ -61,9 +78,9 @@ std::vector> families_modes = both_families_both_modes; unsigned long long LibraryTest::fails_ = 0; std::map LibraryTest::size_fails_; -void ProcessWork(ares_channel channel, - std::function()> get_extrafds, - std::function process_extra) { +void ProcessWork(ares_channel_t *channel, + std::function()> get_extrafds, + std::function process_extra) { int nfds, count; fd_set readers, writers; struct timeval tv; @@ -76,17 +93,19 @@ void ProcessWork(ares_channel channel, return; // Add in the extra FDs if present. - std::set extrafds = get_extrafds(); - for (int extrafd : extrafds) { + std::set extrafds = get_extrafds(); + for (ares_socket_t extrafd : extrafds) { FD_SET(extrafd, &readers); if (extrafd >= nfds) { - nfds = extrafd + 1; + nfds = (int)extrafd + 1; } } - // Wait for activity or timeout. - tv.tv_sec = 0; - tv.tv_usec = 100000; // 100ms + /* If ares_timeout returns NULL, it means there are no requests in queue, + * so we can break out */ + if (ares_timeout(channel, NULL, &tv) == NULL) + return; + count = select(nfds, &readers, &writers, nullptr, &tv); if (count < 0) { fprintf(stderr, "select() failed, errno %d\n", errno); @@ -97,7 +116,7 @@ void ProcessWork(ares_channel channel, ares_process(channel, &readers, &writers); // Let the provided callback process any activity on the extra FD. - for (int extrafd : extrafds) { + for (ares_socket_t extrafd : extrafds) { if (FD_ISSET(extrafd, &readers)) { process_extra(extrafd); } @@ -160,23 +179,29 @@ void LibraryTest::afree(void *ptr) { free(ptr); } -std::set NoExtraFDs() { - return std::set(); +std::set NoExtraFDs() { + return std::set(); } void DefaultChannelTest::Process() { ProcessWork(channel_, NoExtraFDs, nullptr); } +void FileChannelTest::Process() { + ProcessWork(channel_, NoExtraFDs, nullptr); +} + void DefaultChannelModeTest::Process() { ProcessWork(channel_, NoExtraFDs, nullptr); } -MockServer::MockServer(int family, int port) +MockServer::MockServer(int family, unsigned short port) : udpport_(port), tcpport_(port), qid_(-1) { // Create a TCP socket to receive data on. + tcp_data_ = NULL; + tcp_data_len_ = 0; tcpfd_ = socket(family, SOCK_STREAM, 0); - EXPECT_NE(-1, tcpfd_); + EXPECT_NE(ARES_SOCKET_BAD, tcpfd_); int optval = 1; setsockopt(tcpfd_, SOL_SOCKET, SO_REUSEADDR, BYTE_CAST &optval , sizeof(int)); @@ -186,7 +211,7 @@ MockServer::MockServer(int family, int port) // Create a UDP socket to receive data on. udpfd_ = socket(family, SOCK_DGRAM, 0); - EXPECT_NE(-1, udpfd_); + EXPECT_NE(ARES_SOCKET_BAD, udpfd_); // Bind the sockets to the given port. if (family == AF_INET) { @@ -255,14 +280,15 @@ MockServer::MockServer(int family, int port) } MockServer::~MockServer() { - for (int fd : connfds_) { + for (ares_socket_t fd : connfds_) { sclose(fd); } sclose(tcpfd_); sclose(udpfd_); + free(tcp_data_); } -void MockServer::ProcessPacket(int fd, struct sockaddr_storage *addr, socklen_t addrlen, +void MockServer::ProcessPacket(ares_socket_t fd, struct sockaddr_storage *addr, ares_socklen_t addrlen, byte *data, int len) { // Assume the packet is a well-formed DNS request and extract the request @@ -324,13 +350,13 @@ void MockServer::ProcessPacket(int fd, struct sockaddr_storage *addr, socklen_t } -void MockServer::ProcessFD(int fd) { +void MockServer::ProcessFD(ares_socket_t fd) { if (fd != tcpfd_ && fd != udpfd_ && connfds_.find(fd) == connfds_.end()) { // Not one of our FDs. return; } if (fd == tcpfd_) { - int connfd = accept(tcpfd_, NULL, NULL); + ares_socket_t connfd = accept(tcpfd_, NULL, NULL); if (connfd < 0) { std::cerr << "Error accepting connection on fd " << fd << std::endl; } else { @@ -345,48 +371,50 @@ void MockServer::ProcessFD(int fd) { byte buffer[2048]; int len = recvfrom(fd, BYTE_CAST buffer, sizeof(buffer), 0, (struct sockaddr *)&addr, &addrlen); - byte* data = buffer; if (fd != udpfd_) { if (len == 0) { connfds_.erase(std::find(connfds_.begin(), connfds_.end(), fd)); sclose(fd); + free(tcp_data_); + tcp_data_ = NULL; + tcp_data_len_ = 0; return; } - if (len < 2) { - std::cerr << "Packet too short (" << len << ")" << std::endl; - return; - } + tcp_data_ = (unsigned char *)realloc(tcp_data_, tcp_data_len_ + (size_t)len); + memcpy(tcp_data_ + tcp_data_len_, buffer, (size_t)len); + tcp_data_len_ += (size_t)len; + /* TCP might aggregate the various requests into a single packet, so we * need to split */ - while (len) { - int tcplen = (data[0] << 8) + data[1]; - data += 2; - len -= 2; - if (tcplen > len) { - std::cerr << "Warning: TCP length " << tcplen - << " doesn't match remaining data length " << len << std::endl; + while (tcp_data_len_ > 2) { + size_t tcplen = ((size_t)tcp_data_[0] << 8) + (size_t)tcp_data_[1]; + if (tcp_data_len_ - 2 < tcplen) + break; + + ProcessPacket(fd, &addr, addrlen, tcp_data_ + 2, (int)tcplen); + + /* strip off processed data if connection not terminated */ + if (tcp_data_ != NULL) { + memmove(tcp_data_, tcp_data_ + tcplen + 2, tcp_data_len_ - 2 - tcplen); + tcp_data_len_ -= 2 + tcplen; } - int process_len = (tcplen > len)?len:tcplen; - ProcessPacket(fd, &addr, addrlen, data, process_len); - len -= process_len; - data += process_len; } } else { /* UDP is always a single packet */ - ProcessPacket(fd, &addr, addrlen, data, len); + ProcessPacket(fd, &addr, addrlen, buffer, len); } } -std::set MockServer::fds() const { - std::set result = connfds_; +std::set MockServer::fds() const { + std::set result = connfds_; result.insert(tcpfd_); result.insert(udpfd_); return result; } -void MockServer::ProcessRequest(int fd, struct sockaddr_storage* addr, int addrlen, +void MockServer::ProcessRequest(ares_socket_t fd, struct sockaddr_storage* addr, ares_socklen_t addrlen, int qid, const std::string& name, int rrtype) { // Before processing, let gMock know the request is happening. OnRequest(name, rrtype); @@ -412,7 +440,7 @@ void MockServer::ProcessRequest(int fd, struct sockaddr_storage* addr, int addrl // Prefix with 2-byte length if TCP. if (fd != udpfd_) { - int len = reply.size(); + int len = (int)reply.size(); std::vector vlen = {(byte)((len & 0xFF00) >> 8), (byte)(len & 0xFF)}; reply.insert(reply.begin(), vlen.begin(), vlen.end()); // Also, don't bother with the destination address. @@ -428,11 +456,11 @@ void MockServer::ProcessRequest(int fd, struct sockaddr_storage* addr, int addrl } // static -MockChannelOptsTest::NiceMockServers MockChannelOptsTest::BuildServers(int count, int family, int base_port) { +MockChannelOptsTest::NiceMockServers MockChannelOptsTest::BuildServers(int count, int family, unsigned short base_port) { NiceMockServers servers; assert(count > 0); - for (int ii = 0; ii < count; ii++) { - int port = base_port == dynamic_port ? dynamic_port : base_port + ii; + for (unsigned short ii = 0; ii < count; ii++) { + unsigned short port = base_port == dynamic_port ? dynamic_port : base_port + ii; std::unique_ptr server(new NiceMockServer(family, port)); servers.push_back(std::move(server)); } @@ -531,16 +559,16 @@ MockChannelOptsTest::~MockChannelOptsTest() { channel_ = nullptr; } -std::set MockChannelOptsTest::fds() const { - std::set fds; +std::set MockChannelOptsTest::fds() const { + std::set fds; for (const auto& server : servers_) { - std::set serverfds = server->fds(); + std::set serverfds = server->fds(); fds.insert(serverfds.begin(), serverfds.end()); } return fds; } -void MockChannelOptsTest::ProcessFD(int fd) { +void MockChannelOptsTest::ProcessFD(ares_socket_t fd) { for (auto& server : servers_) { server->ProcessFD(fd); } @@ -701,7 +729,8 @@ void AddrInfoCallback(void *data, int status, int timeouts, result->done_ = true; result->status_ = status; result->timeouts_= timeouts; - result->ai_ = AddrInfo(ai); + if (ai) + result->ai_ = AddrInfo(ai); if (verbose) std::cerr << "AddrInfoCallback(" << *result << ")" << std::endl; } @@ -750,7 +779,7 @@ void NameInfoCallback(void *data, int status, int timeouts, if (verbose) std::cerr << "NameInfoCallback(" << *result << ")" << std::endl; } -std::vector GetNameServers(ares_channel channel) { +std::vector GetNameServers(ares_channel_t *channel) { struct ares_addr_port_node* servers = nullptr; EXPECT_EQ(ARES_SUCCESS, ares_get_servers_ports(channel, &servers)); struct ares_addr_port_node* server = servers; @@ -825,7 +854,7 @@ TempFile::TempFile(const std::string& contents) } -VirtualizeIO::VirtualizeIO(ares_channel c) +VirtualizeIO::VirtualizeIO(ares_channel_t *c) : channel_(c) { ares_set_socket_functions(channel_, &default_functions, 0); diff --git a/lib/c-ares-1.23.0/test/ares-test.h b/lib/c-ares-1.23.0/test/ares-test.h new file mode 100644 index 00000000000..9bd26202f95 --- /dev/null +++ b/lib/c-ares-1.23.0/test/ares-test.h @@ -0,0 +1,647 @@ +/* + * Copyright (C) The c-ares project + * + * 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. + * + * SPDX-License-Identifier: MIT + */ +// -*- mode: c++ -*- +#ifndef ARES_TEST_H +#define ARES_TEST_H + +#include "ares_setup.h" +#include "ares.h" + +#include "dns-proto.h" +// Include ares internal file for DNS protocol constants +#include "ares_nameser.h" + +#include "gtest/gtest.h" +#include "gmock/gmock.h" + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif +#if defined(HAVE_USER_NAMESPACE) && defined(HAVE_UTS_NAMESPACE) +# define HAVE_CONTAINER +#endif + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace ares { + +typedef unsigned char byte; + +namespace test { + +extern bool verbose; +extern unsigned short mock_port; +extern const std::vector both_families; +extern const std::vector ipv4_family; +extern const std::vector ipv6_family; + +extern const std::vector> both_families_both_modes; +extern const std::vector> ipv4_family_both_modes; +extern const std::vector> ipv6_family_both_modes; + +// Which parameters to use in tests +extern std::vector families; +extern std::vector> families_modes; + +// Process all pending work on ares-owned file descriptors, plus +// optionally the given set-of-FDs + work function. +void ProcessWork(ares_channel_t *channel, + std::function()> get_extrafds, + std::function process_extra); +std::set NoExtraFDs(); + +// Test fixture that ensures library initialization, and allows +// memory allocations to be failed. +class LibraryTest : public ::testing::Test { +public: + LibraryTest() + { + EXPECT_EQ(ARES_SUCCESS, ares_library_init_mem( + ARES_LIB_INIT_ALL, &LibraryTest::amalloc, + &LibraryTest::afree, &LibraryTest::arealloc)); + } + + ~LibraryTest() + { + ares_library_cleanup(); + ClearFails(); + } + + // Set the n-th malloc call (of any size) from the library to fail. + // (nth == 1 means the next call) + static void SetAllocFail(int nth); + // Set the next malloc call for the given size to fail. + static void SetAllocSizeFail(size_t size); + // Remove any pending alloc failures. + static void ClearFails(); + + static void *amalloc(size_t size); + static void *arealloc(void *ptr, size_t size); + static void afree(void *ptr); + +private: + static bool ShouldAllocFail(size_t size); + static unsigned long long fails_; + static std::map size_fails_; +}; + +// Test fixture that uses a default channel. +class DefaultChannelTest : public LibraryTest { +public: + DefaultChannelTest() : channel_(nullptr) + { + /* Enable query cache for live tests */ + struct ares_options opts; + memset(&opts, 0, sizeof(opts)); + opts.qcache_max_ttl = 300; + int optmask = ARES_OPT_QUERY_CACHE; + EXPECT_EQ(ARES_SUCCESS, ares_init_options(&channel_, &opts, optmask)); + EXPECT_NE(nullptr, channel_); + } + + ~DefaultChannelTest() + { + ares_destroy(channel_); + channel_ = nullptr; + } + + // Process all pending work on ares-owned file descriptors. + void Process(); + +protected: + ares_channel_t *channel_; +}; + +// Test fixture that uses a file-only channel. +class FileChannelTest : public LibraryTest { +public: + FileChannelTest() : channel_(nullptr) + { + struct ares_options opts; + memset(&opts, 0, sizeof(opts)); + opts.lookups = strdup("f"); + int optmask = ARES_OPT_LOOKUPS; + EXPECT_EQ(ARES_SUCCESS, ares_init_options(&channel_, &opts, optmask)); + EXPECT_NE(nullptr, channel_); + free(opts.lookups); + } + + ~FileChannelTest() + { + ares_destroy(channel_); + channel_ = nullptr; + } + + // Process all pending work on ares-owned file descriptors. + void Process(); + +protected: + ares_channel_t *channel_; +}; + +// Test fixture that uses a default channel with the specified lookup mode. +class DefaultChannelModeTest + : public LibraryTest, + public ::testing::WithParamInterface { +public: + DefaultChannelModeTest() : channel_(nullptr) + { + struct ares_options opts; + memset(&opts, 0, sizeof(opts)); + opts.lookups = strdup(GetParam().c_str()); + int optmask = ARES_OPT_LOOKUPS; + EXPECT_EQ(ARES_SUCCESS, ares_init_options(&channel_, &opts, optmask)); + EXPECT_NE(nullptr, channel_); + free(opts.lookups); + } + + ~DefaultChannelModeTest() + { + ares_destroy(channel_); + channel_ = nullptr; + } + + // Process all pending work on ares-owned file descriptors. + void Process(); + +protected: + ares_channel_t *channel_; +}; + +// Mock DNS server to allow responses to be scripted by tests. +class MockServer { +public: + MockServer(int family, unsigned short port); + ~MockServer(); + + // Mock method indicating the processing of a particular + // request. + MOCK_METHOD2(OnRequest, void(const std::string &name, int rrtype)); + + // Set the reply to be sent next; the query ID field will be overwritten + // with the value from the request. + void SetReplyData(const std::vector &reply) + { + reply_ = reply; + } + + void SetReply(const DNSPacket *reply) + { + SetReplyData(reply->data()); + } + + void SetReplyQID(int qid) + { + qid_ = qid; + } + + void Disconnect() + { + for (ares_socket_t fd : connfds_) { + sclose(fd); + } + connfds_.clear(); + free(tcp_data_); + tcp_data_ = NULL; + tcp_data_len_ = 0; + } + + // The set of file descriptors that the server handles. + std::set fds() const; + + // Process activity on a file descriptor. + void ProcessFD(ares_socket_t fd); + + // Ports the server is responding to + unsigned short udpport() const + { + return udpport_; + } + + unsigned short tcpport() const + { + return tcpport_; + } + +private: + void ProcessRequest(ares_socket_t fd, struct sockaddr_storage *addr, + ares_socklen_t addrlen, int qid, const std::string &name, + int rrtype); + void ProcessPacket(ares_socket_t fd, struct sockaddr_storage *addr, + ares_socklen_t addrlen, byte *data, int len); + unsigned short udpport_; + unsigned short tcpport_; + ares_socket_t udpfd_; + ares_socket_t tcpfd_; + std::set connfds_; + std::vector reply_; + int qid_; + unsigned char *tcp_data_; + size_t tcp_data_len_; +}; + +// Test fixture that uses a mock DNS server. +class MockChannelOptsTest : public LibraryTest { +public: + MockChannelOptsTest(int count, int family, bool force_tcp, + struct ares_options *givenopts, int optmask); + ~MockChannelOptsTest(); + + // Process all pending work on ares-owned and mock-server-owned file + // descriptors. + void Process(); + +protected: + // NiceMockServer doesn't complain about uninteresting calls. + typedef testing::NiceMock NiceMockServer; + typedef std::vector> NiceMockServers; + + std::set fds() const; + void ProcessFD(ares_socket_t fd); + + static NiceMockServers BuildServers(int count, int family, + unsigned short base_port); + + NiceMockServers servers_; + // Convenience reference to first server. + NiceMockServer &server_; + ares_channel_t *channel_; +}; + +class MockChannelTest + : public MockChannelOptsTest, + public ::testing::WithParamInterface> { +public: + MockChannelTest() + : MockChannelOptsTest(1, GetParam().first, GetParam().second, nullptr, 0) + { + } +}; + +class MockUDPChannelTest : public MockChannelOptsTest, + public ::testing::WithParamInterface { +public: + MockUDPChannelTest() : MockChannelOptsTest(1, GetParam(), false, nullptr, 0) + { + } +}; + +class MockTCPChannelTest : public MockChannelOptsTest, + public ::testing::WithParamInterface { +public: + MockTCPChannelTest() : MockChannelOptsTest(1, GetParam(), true, nullptr, 0) + { + } +}; + +// gMock action to set the reply for a mock server. +ACTION_P2(SetReplyData, mockserver, data) +{ + mockserver->SetReplyData(data); +} + +ACTION_P2(SetReply, mockserver, reply) +{ + mockserver->SetReply(reply); +} + +ACTION_P2(SetReplyQID, mockserver, qid) +{ + mockserver->SetReplyQID(qid); +} + +// gMock action to cancel a channel. +ACTION_P2(CancelChannel, mockserver, channel) +{ + ares_cancel(channel); +} + +// gMock action to disconnect all connections. +ACTION_P2(Disconnect, mockserver) +{ + mockserver->Disconnect(); +} + +// C++ wrapper for struct hostent. +struct HostEnt { + HostEnt() : addrtype_(-1) + { + } + + HostEnt(const struct hostent *hostent); + std::string name_; + std::vector aliases_; + int addrtype_; // AF_INET or AF_INET6 + std::vector addrs_; +}; + +std::ostream &operator<<(std::ostream &os, const HostEnt &result); + +// Structure that describes the result of an ares_host_callback invocation. +struct HostResult { + HostResult() : done_(false), status_(0), timeouts_(0) + { + } + + // Whether the callback has been invoked. + bool done_; + // Explicitly provided result information. + int status_; + int timeouts_; + // Contents of the hostent structure, if provided. + HostEnt host_; +}; + +std::ostream &operator<<(std::ostream &os, const HostResult &result); + +// Structure that describes the result of an ares_callback invocation. +struct SearchResult { + // Whether the callback has been invoked. + bool done_; + // Explicitly provided result information. + int status_; + int timeouts_; + std::vector data_; +}; + +std::ostream &operator<<(std::ostream &os, const SearchResult &result); + +// Structure that describes the result of an ares_nameinfo_callback invocation. +struct NameInfoResult { + // Whether the callback has been invoked. + bool done_; + // Explicitly provided result information. + int status_; + int timeouts_; + std::string node_; + std::string service_; +}; + +std::ostream &operator<<(std::ostream &os, const NameInfoResult &result); + +struct AddrInfoDeleter { + void operator()(ares_addrinfo *ptr) + { + if (ptr) { + ares_freeaddrinfo(ptr); + } + } +}; + +// C++ wrapper for struct ares_addrinfo. +using AddrInfo = std::unique_ptr; + +std::ostream &operator<<(std::ostream &os, const AddrInfo &result); + +// Structure that describes the result of an ares_addrinfo_callback invocation. +struct AddrInfoResult { + AddrInfoResult() : done_(false), status_(-1), timeouts_(0) + { + } + + // Whether the callback has been invoked. + bool done_; + // Explicitly provided result information. + int status_; + int timeouts_; + // Contents of the ares_addrinfo structure, if provided. + AddrInfo ai_; +}; + +std::ostream &operator<<(std::ostream &os, const AddrInfoResult &result); + +// Standard implementation of ares callbacks that fill out the corresponding +// structures. +void HostCallback(void *data, int status, int timeouts, + struct hostent *hostent); +void SearchCallback(void *data, int status, int timeouts, unsigned char *abuf, + int alen); +void NameInfoCallback(void *data, int status, int timeouts, char *node, + char *service); +void AddrInfoCallback(void *data, int status, int timeouts, + struct ares_addrinfo *res); + +// Retrieve the name servers used by a channel. +std::vector GetNameServers(ares_channel_t *channel); + +// RAII class to temporarily create a directory of a given name. +class TransientDir { +public: + TransientDir(const std::string &dirname); + ~TransientDir(); + +private: + std::string dirname_; +}; + +// C++ wrapper around tempnam() +std::string TempNam(const char *dir, const char *prefix); + +// RAII class to temporarily create file of a given name and contents. +class TransientFile { +public: + TransientFile(const std::string &filename, const std::string &contents); + ~TransientFile(); + +protected: + std::string filename_; +}; + +// RAII class for a temporary file with the given contents. +class TempFile : public TransientFile { +public: + TempFile(const std::string &contents); + + const char *filename() const + { + return filename_.c_str(); + } +}; + +#ifdef _WIN32 +extern "C" { + +static int setenv(const char *name, const char *value, int overwrite) +{ + char *buffer; + size_t buf_size; + + if (name == NULL) { + return -1; + } + + if (value == NULL) { + value = ""; /* For unset */ + } + + if (!overwrite && getenv(name) != NULL) { + return -1; + } + + buf_size = strlen(name) + strlen(value) + 1 /* = */ + 1 /* NULL */; + buffer = (char *)malloc(buf_size); + _snprintf(buffer, buf_size, "%s=%s", name, value); + _putenv(buffer); + free(buffer); + return 0; +} + +static int unsetenv(const char *name) +{ + return setenv(name, NULL, 1); +} + +} /* extern "C" */ +#endif + +// RAII class for a temporary environment variable value. +class EnvValue { +public: + EnvValue(const char *name, const char *value) : name_(name), restore_(false) + { + char *original = getenv(name); + if (original) { + restore_ = true; + original_ = original; + } + setenv(name_.c_str(), value, 1); + } + + ~EnvValue() + { + if (restore_) { + setenv(name_.c_str(), original_.c_str(), 1); + } else { + unsetenv(name_.c_str()); + } + } + +private: + std::string name_; + bool restore_; + std::string original_; +}; + + +#ifdef HAVE_CONTAINER +// Linux-specific functionality for running code in a container, implemented +// in ares-test-ns.cc +typedef std::function VoidToIntFn; +typedef std::vector> NameContentList; + +class ContainerFilesystem { +public: + ContainerFilesystem(NameContentList files, const std::string &mountpt); + ~ContainerFilesystem(); + + std::string root() const + { + return rootdir_; + } + + std::string mountpt() const + { + return mountpt_; + } + +private: + void EnsureDirExists(const std::string &dir); + std::string rootdir_; + std::string mountpt_; + std::list dirs_; + std::vector> files_; +}; + +int RunInContainer(ContainerFilesystem *fs, const std::string &hostname, + const std::string &domainname, VoidToIntFn fn); + +# define ICLASS_NAME(casename, testname) Contained##casename##_##testname +# define CONTAINED_TEST_F(casename, testname, hostname, domainname, files) \ + class ICLASS_NAME(casename, testname) : public casename { \ + public: \ + ICLASS_NAME(casename, testname)() \ + { \ + } \ + static int InnerTestBody(); \ + }; \ + TEST_F(ICLASS_NAME(casename, testname), _) \ + { \ + ContainerFilesystem chroot(files, ".."); \ + VoidToIntFn fn(ICLASS_NAME(casename, testname)::InnerTestBody); \ + EXPECT_EQ(0, RunInContainer(&chroot, hostname, domainname, fn)); \ + } \ + int ICLASS_NAME(casename, testname)::InnerTestBody() + +#endif + +/* Assigns virtual IO functions to a channel. These functions simply call + * the actual system functions. + */ +class VirtualizeIO { +public: + VirtualizeIO(ares_channel); + ~VirtualizeIO(); + + static const ares_socket_functions default_functions; + +private: + ares_channel_t *channel_; +}; + +/* + * Slightly white-box macro to generate two runs for a given test case: + * One with no modifications, and one with all IO functions set to use + * the virtual io structure. + * Since no magic socket setup or anything is done in the latter case + * this should probably only be used for test with very vanilla IO + * requirements. + */ +#define VCLASS_NAME(casename, testname) Virt##casename##_##testname +#define VIRT_NONVIRT_TEST_F(casename, testname) \ + class VCLASS_NAME(casename, testname) : public casename { \ + public: \ + VCLASS_NAME(casename, testname)() \ + { \ + } \ + void InnerTestBody(); \ + }; \ + GTEST_TEST_(casename, testname, VCLASS_NAME(casename, testname), \ + ::testing::internal::GetTypeId()) \ + { \ + InnerTestBody(); \ + } \ + GTEST_TEST_(casename, testname##_virtualized, \ + VCLASS_NAME(casename, testname), \ + ::testing::internal::GetTypeId()) \ + { \ + VirtualizeIO vio(channel_); \ + InnerTestBody(); \ + } \ + void VCLASS_NAME(casename, testname)::InnerTestBody() + +} // namespace test +} // namespace ares + +#endif diff --git a/lib/c-ares-1.23.0/test/buildconf b/lib/c-ares-1.23.0/test/buildconf new file mode 100755 index 00000000000..91109ca17bf --- /dev/null +++ b/lib/c-ares-1.23.0/test/buildconf @@ -0,0 +1,4 @@ +#!/bin/sh +# Copyright (C) The c-ares project and its contributors +# SPDX-License-Identifier: MIT +autoreconf -iv diff --git a/lib/c-ares-1.19.1/test/compile b/lib/c-ares-1.23.0/test/compile similarity index 100% rename from lib/c-ares-1.19.1/test/compile rename to lib/c-ares-1.23.0/test/compile diff --git a/lib/c-ares-1.19.1/test/config.guess b/lib/c-ares-1.23.0/test/config.guess similarity index 100% rename from lib/c-ares-1.19.1/test/config.guess rename to lib/c-ares-1.23.0/test/config.guess diff --git a/lib/c-ares-1.19.1/test/config.h.in b/lib/c-ares-1.23.0/test/config.h.in similarity index 96% rename from lib/c-ares-1.19.1/test/config.h.in rename to lib/c-ares-1.23.0/test/config.h.in index 9b543b5a375..5015215d1db 100644 --- a/lib/c-ares-1.19.1/test/config.h.in +++ b/lib/c-ares-1.23.0/test/config.h.in @@ -15,9 +15,6 @@ /* Define to 1 if you have the header file. */ #undef HAVE_NETINET_TCP_H -/* Define if you have POSIX threads libraries and header files. */ -#undef HAVE_PTHREAD - /* Have PTHREAD_PRIO_INHERIT. */ #undef HAVE_PTHREAD_PRIO_INHERIT diff --git a/lib/c-ares-1.19.1/test/config.sub b/lib/c-ares-1.23.0/test/config.sub similarity index 100% rename from lib/c-ares-1.19.1/test/config.sub rename to lib/c-ares-1.23.0/test/config.sub diff --git a/lib/c-ares-1.19.1/test/configure b/lib/c-ares-1.23.0/test/configure similarity index 99% rename from lib/c-ares-1.19.1/test/configure rename to lib/c-ares-1.23.0/test/configure index b268a43efd9..84f4f00d90f 100755 --- a/lib/c-ares-1.19.1/test/configure +++ b/lib/c-ares-1.23.0/test/configure @@ -18158,13 +18158,11 @@ test -n "$PTHREAD_CXX" || PTHREAD_CXX="$CXX" # Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: if test "x$ax_pthread_ok" = "xyes"; then - -printf "%s\n" "#define HAVE_PTHREAD 1" >>confdefs.h - + CARES_THREADS=yes : else ax_pthread_ok=no - + CARES_THREADS=no fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' @@ -18174,6 +18172,15 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test "${CARES_THREADS}" = "yes" ; then + LIBS="$PTHREAD_LIBS $LIBS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + CXXFLAGS="$CXXFLAGS $PTHREAD_CFLAGS" + CC="$PTHREAD_CC" + CXX="$PTHREAD_CXX" +fi + + @@ -18596,9 +18603,9 @@ int main() { pid_t child = clone(userfn, userst + 1024*1024, CLONE_NEWUSER|SIGCHLD, 0); if (child < 0) return 1; - sprintf(buffer, "/proc/%d/uid_map", child); + snprintf(buffer, sizeof(buffer), "/proc/%d/uid_map", child); fd = open(buffer, O_CREAT|O_WRONLY|O_TRUNC, 0755); - sprintf(buffer, "0 %d 1\n", getuid()); + snprintf(buffer, sizeof(buffer), "0 %d 1\n", getuid()); write(fd, buffer, strlen(buffer)); close(fd); @@ -18694,9 +18701,9 @@ int main() { pid_t child = clone(fn, st + 1024*1024, CLONE_NEWUSER|SIGCHLD, 0); if (child < 0) return 1; - sprintf(buffer, "/proc/%d/uid_map", child); + snprintf(buffer, sizeof(buffer), "/proc/%d/uid_map", child); fd = open(buffer, O_CREAT|O_WRONLY|O_TRUNC, 0755); - sprintf(buffer, "0 %d 1\n", getuid()); + snprintf(buffer, sizeof(buffer), "0 %d 1\n", getuid()); write(fd, buffer, strlen(buffer)); close(fd); diff --git a/lib/c-ares-1.23.0/test/configure.ac b/lib/c-ares-1.23.0/test/configure.ac new file mode 100644 index 00000000000..daf773b6dbe --- /dev/null +++ b/lib/c-ares-1.23.0/test/configure.ac @@ -0,0 +1,54 @@ +############################################################# +# +# Copyright (C) the Massachusetts Institute of Technology. +# Copyright (C) Daniel Stenberg +# +# 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. +# +# SPDX-License-Identifier: MIT +# +############################################################# +AC_PREREQ(2.57) +AC_INIT([c-ares-test],[-],[-]) +AC_CONFIG_SRCDIR([ares-test.cc]) +AC_CONFIG_MACRO_DIR([../m4]) + +AM_INIT_AUTOMAKE([no-define]) +m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) + +AX_REQUIRE_DEFINED([AX_CXX_COMPILE_STDCXX_11]) +AX_REQUIRE_DEFINED([AX_PTHREAD]) + +dnl Checks for programs. +AC_PROG_CXX +AX_CXX_COMPILE_STDCXX_11([noext],[mandatory]) +LT_INIT +AC_SUBST(LIBTOOL_DEPS) +AX_PTHREAD([ CARES_THREADS=yes ], [ CARES_THREADS=no ]) + +if test "${CARES_THREADS}" = "yes" ; then + LIBS="$PTHREAD_LIBS $LIBS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + CXXFLAGS="$CXXFLAGS $PTHREAD_CFLAGS" + CC="$PTHREAD_CC" + CXX="$PTHREAD_CXX" +fi + +AX_CODE_COVERAGE +AX_CHECK_USER_NAMESPACE +AX_CHECK_UTS_NAMESPACE + +AC_CHECK_HEADERS(netdb.h netinet/tcp.h) +AC_CONFIG_HEADERS([config.h]) +AC_CONFIG_FILES([Makefile]) +AC_OUTPUT diff --git a/lib/c-ares-1.19.1/test/depcomp b/lib/c-ares-1.23.0/test/depcomp similarity index 100% rename from lib/c-ares-1.19.1/test/depcomp rename to lib/c-ares-1.23.0/test/depcomp diff --git a/lib/c-ares-1.23.0/test/dns-dump.cc b/lib/c-ares-1.23.0/test/dns-dump.cc new file mode 100644 index 00000000000..cfce8195742 --- /dev/null +++ b/lib/c-ares-1.23.0/test/dns-dump.cc @@ -0,0 +1,57 @@ +/* + * Copyright (C) The c-ares project + * + * 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. + * + * SPDX-License-Identifier: MIT + */ +#include +#include +#ifdef _MSC_VER +# include +#else +# include +#endif + +#include +#include + +#include "dns-proto.h" + +namespace ares { + +static void ShowFile(const char* filename) { + int fd = open(filename, O_RDONLY); + if (fd < 0) { + std::cerr << "Failed to open '" << filename << "'" << std::endl; + return; + } + std::vector contents; + while (true) { + unsigned char buffer[1024]; + ares_ssize_t len = read(fd, buffer, sizeof(buffer)); + if (len <= 0) break; + contents.insert(contents.end(), buffer, buffer + len); + } + std::cout << PacketToString(contents) << std::endl; +} + +} // namespace ares + +int main(int argc, char* argv[]) { + for (int ii = 1; ii < argc; ++ii) { + ares::ShowFile(argv[ii]); + } + return 0; +} + diff --git a/lib/c-ares-1.19.1/test/dns-proto-test.cc b/lib/c-ares-1.23.0/test/dns-proto-test.cc similarity index 84% rename from lib/c-ares-1.19.1/test/dns-proto-test.cc rename to lib/c-ares-1.23.0/test/dns-proto-test.cc index 3dadeeee1c7..6fa3093ea16 100644 --- a/lib/c-ares-1.19.1/test/dns-proto-test.cc +++ b/lib/c-ares-1.23.0/test/dns-proto-test.cc @@ -1,3 +1,20 @@ +/* + * Copyright (C) The c-ares project + * + * 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. + * + * SPDX-License-Identifier: MIT + */ #include "ares-test.h" #include "dns-proto.h" diff --git a/lib/c-ares-1.19.1/test/dns-proto.cc b/lib/c-ares-1.23.0/test/dns-proto.cc similarity index 84% rename from lib/c-ares-1.19.1/test/dns-proto.cc rename to lib/c-ares-1.23.0/test/dns-proto.cc index e827810df91..edecba8c7ea 100644 --- a/lib/c-ares-1.19.1/test/dns-proto.cc +++ b/lib/c-ares-1.23.0/test/dns-proto.cc @@ -1,3 +1,20 @@ +/* + * Copyright (C) The c-ares project + * + * 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. + * + * SPDX-License-Identifier: MIT + */ // Include ares internal file for DNS protocol details #include "ares_setup.h" @@ -16,7 +33,7 @@ std::string HexDump(std::vector data) { std::stringstream ss; for (size_t ii = 0; ii < data.size(); ii++) { char buffer[2 + 1]; - sprintf(buffer, "%02x", data[ii]); + snprintf(buffer, sizeof(buffer), "%02x", data[ii]); ss << buffer; } return ss.str(); @@ -159,17 +176,17 @@ std::string AddressToString(const void* vaddr, int len) { std::stringstream ss; if (len == 4) { char buffer[4*4 + 3 + 1]; - sprintf(buffer, "%u.%u.%u.%u", - (unsigned char)addr[0], - (unsigned char)addr[1], - (unsigned char)addr[2], - (unsigned char)addr[3]); + snprintf(buffer, sizeof(buffer), "%u.%u.%u.%u", + (unsigned char)addr[0], + (unsigned char)addr[1], + (unsigned char)addr[2], + (unsigned char)addr[3]); ss << buffer; } else if (len == 16) { for (int ii = 0; ii < 16; ii+=2) { if (ii > 0) ss << ':'; char buffer[4 + 1]; - sprintf(buffer, "%02x%02x", (unsigned char)addr[ii], (unsigned char)addr[ii+1]); + snprintf(buffer, sizeof(buffer), "%02x%02x", (unsigned char)addr[ii], (unsigned char)addr[ii+1]); ss << buffer; } } else { @@ -180,7 +197,7 @@ std::string AddressToString(const void* vaddr, int len) { std::string PacketToString(const std::vector& packet) { const byte* data = packet.data(); - int len = packet.size(); + int len = (int)packet.size(); std::stringstream ss; if (len < NS_HFIXEDSZ) { ss << "(too short, len " << len << ")"; @@ -236,7 +253,7 @@ std::string QuestionToString(const std::vector& packet, char *name = nullptr; long enclen; - int rc = ares_expand_name(*data, packet.data(), packet.size(), &name, &enclen); + int rc = ares_expand_name(*data, packet.data(), (int)packet.size(), &name, &enclen); if (rc != ARES_SUCCESS) { ss << "(error from ares_expand_name)"; return ss.str(); @@ -272,7 +289,7 @@ std::string RRToString(const std::vector& packet, char *name = nullptr; long enclen; - int rc = ares_expand_name(*data, packet.data(), packet.size(), &name, &enclen); + int rc = ares_expand_name(*data, packet.data(), (int)packet.size(), &name, &enclen); if (rc != ARES_SUCCESS) { ss << "(error from ares_expand_name)"; return ss.str(); @@ -330,7 +347,7 @@ std::string RRToString(const std::vector& packet, case T_CNAME: case T_NS: case T_PTR: { - int rc = ares_expand_name(*data, packet.data(), packet.size(), &name, &enclen); + int rc = ares_expand_name(*data, packet.data(), (int)packet.size(), &name, &enclen); if (rc != ARES_SUCCESS) { ss << "(error from ares_expand_name)"; break; @@ -341,7 +358,7 @@ std::string RRToString(const std::vector& packet, } case T_MX: if (rdatalen > 2) { - int rc = ares_expand_name(*data + 2, packet.data(), packet.size(), &name, &enclen); + int rc = ares_expand_name(*data + 2, packet.data(), (int)packet.size(), &name, &enclen); if (rc != ARES_SUCCESS) { ss << "(error from ares_expand_name)"; break; @@ -359,7 +376,7 @@ std::string RRToString(const std::vector& packet, unsigned long weight = DNS__16BIT(p + 2); unsigned long port = DNS__16BIT(p + 4); p += 6; - int rc = ares_expand_name(p, packet.data(), packet.size(), &name, &enclen); + int rc = ares_expand_name(p, packet.data(), (int)packet.size(), &name, &enclen); if (rc != ARES_SUCCESS) { ss << "(error from ares_expand_name)"; break; @@ -386,7 +403,7 @@ std::string RRToString(const std::vector& packet, } case T_SOA: { const byte* p = *data; - int rc = ares_expand_name(p, packet.data(), packet.size(), &name, &enclen); + int rc = ares_expand_name(p, packet.data(), (int)packet.size(), &name, &enclen); if (rc != ARES_SUCCESS) { ss << "(error from ares_expand_name)"; break; @@ -394,7 +411,7 @@ std::string RRToString(const std::vector& packet, ss << " '" << name << "'"; ares_free_string(name); p += enclen; - rc = ares_expand_name(p, packet.data(), packet.size(), &name, &enclen); + rc = ares_expand_name(p, packet.data(), (int)packet.size(), &name, &enclen); if (rc != ARES_SUCCESS) { ss << "(error from ares_expand_name)"; break; @@ -437,7 +454,7 @@ std::string RRToString(const std::vector& packet, ss << " '" << regexp << "'"; p += len; - int rc = ares_expand_name(p, packet.data(), packet.size(), &name, &enclen); + int rc = ares_expand_name(p, packet.data(), (int)packet.size(), &name, &enclen); if (rc != ARES_SUCCESS) { ss << "(error from ares_expand_name)"; break; @@ -462,15 +479,15 @@ std::string RRToString(const std::vector& packet, } void PushInt32(std::vector* data, int value) { - data->push_back((value & 0xff000000) >> 24); - data->push_back((value & 0x00ff0000) >> 16); - data->push_back((value & 0x0000ff00) >> 8); - data->push_back(value & 0x000000ff); + data->push_back((byte)(((unsigned int)value & 0xff000000) >> 24)); + data->push_back((byte)(((unsigned int)value & 0x00ff0000) >> 16)); + data->push_back((byte)(((unsigned int)value & 0x0000ff00) >> 8)); + data->push_back((byte)(value & 0x000000ff)); } void PushInt16(std::vector* data, int value) { - data->push_back((value & 0xff00) >> 8); - data->push_back(value & 0x00ff); + data->push_back((byte)((value & 0xff00) >> 8)); + data->push_back((byte)value & 0x00ff); } std::vector EncodeString(const std::string& name) { @@ -479,7 +496,11 @@ std::vector EncodeString(const std::string& name) { std::string label; // TODO: cope with escapes while (std::getline(ss, label, '.')) { - data.push_back(label.length()); + /* Label length of 0 indicates the end, and we always push an end + * terminator, so don't do it twice */ + if (label.length() == 0) + break; + data.push_back((byte)label.length()); data.insert(data.end(), label.begin(), label.end()); } data.push_back(0); @@ -504,7 +525,7 @@ std::vector DNSRR::data() const { std::vector DNSSingleNameRR::data() const { std::vector data = DNSRR::data(); std::vector encname = EncodeString(other_); - int len = encname.size(); + int len = (int)encname.size(); PushInt16(&data, len); data.insert(data.end(), encname.begin(), encname.end()); return data; @@ -514,11 +535,11 @@ std::vector DNSTxtRR::data() const { std::vector data = DNSRR::data(); int len = 0; for (const std::string& txt : txt_) { - len += (1 + txt.size()); + len += (1 + (int)txt.size()); } PushInt16(&data, len); for (const std::string& txt : txt_) { - data.push_back(txt.size()); + data.push_back((byte)txt.size()); data.insert(data.end(), txt.begin(), txt.end()); } return data; @@ -527,7 +548,7 @@ std::vector DNSTxtRR::data() const { std::vector DNSMxRR::data() const { std::vector data = DNSRR::data(); std::vector encname = EncodeString(other_); - int len = 2 + encname.size(); + int len = 2 + (int)encname.size(); PushInt16(&data, len); PushInt16(&data, pref_); data.insert(data.end(), encname.begin(), encname.end()); @@ -537,7 +558,7 @@ std::vector DNSMxRR::data() const { std::vector DNSSrvRR::data() const { std::vector data = DNSRR::data(); std::vector encname = EncodeString(target_); - int len = 6 + encname.size(); + int len = 6 + (int)encname.size(); PushInt16(&data, len); PushInt16(&data, prio_); PushInt16(&data, weight_); @@ -548,7 +569,7 @@ std::vector DNSSrvRR::data() const { std::vector DNSUriRR::data() const { std::vector data = DNSRR::data(); - int len = 4 + target_.size(); + int len = 4 + (int)target_.size(); PushInt16(&data, len); PushInt16(&data, prio_); PushInt16(&data, weight_); @@ -558,7 +579,7 @@ std::vector DNSUriRR::data() const { std::vector DNSAddressRR::data() const { std::vector data = DNSRR::data(); - int len = addr_.size(); + int len = (int)addr_.size(); PushInt16(&data, len); data.insert(data.end(), addr_.begin(), addr_.end()); return data; @@ -568,7 +589,7 @@ std::vector DNSSoaRR::data() const { std::vector data = DNSRR::data(); std::vector encname1 = EncodeString(nsname_); std::vector encname2 = EncodeString(rname_); - int len = encname1.size() + encname2.size() + 5*4; + int len = (int)encname1.size() + (int)encname2.size() + 5*4; PushInt16(&data, len); data.insert(data.end(), encname1.begin(), encname1.end()); data.insert(data.end(), encname2.begin(), encname2.end()); @@ -584,12 +605,12 @@ std::vector DNSOptRR::data() const { std::vector data = DNSRR::data(); int len = 0; for (const DNSOption& opt : opts_) { - len += (4 + opt.data_.size()); + len += (4 + (int)opt.data_.size()); } PushInt16(&data, len); for (const DNSOption& opt : opts_) { PushInt16(&data, opt.code_); - PushInt16(&data, opt.data_.size()); + PushInt16(&data, (int)opt.data_.size()); data.insert(data.end(), opt.data_.begin(), opt.data_.end()); } return data; @@ -598,15 +619,15 @@ std::vector DNSOptRR::data() const { std::vector DNSNaptrRR::data() const { std::vector data = DNSRR::data(); std::vector encname = EncodeString(replacement_); - int len = (4 + 1 + flags_.size() + 1 + service_.size() + 1 + regexp_.size() + encname.size()); + int len = (4 + 1 + (int)flags_.size() + 1 + (int)service_.size() + 1 + (int)regexp_.size() + (int)encname.size()); PushInt16(&data, len); PushInt16(&data, order_); PushInt16(&data, pref_); - data.push_back(flags_.size()); + data.push_back((byte)flags_.size()); data.insert(data.end(), flags_.begin(), flags_.end()); - data.push_back(service_.size()); + data.push_back((byte)service_.size()); data.insert(data.end(), service_.begin(), service_.end()); - data.push_back(regexp_.size()); + data.push_back((byte)regexp_.size()); data.insert(data.end(), regexp_.begin(), regexp_.end()); data.insert(data.end(), encname.begin(), encname.end()); return data; @@ -630,13 +651,13 @@ std::vector DNSPacket::data() const { b |= (rcode_ & 0x0f); data.push_back(b); - int count = questions_.size(); + int count = (int)questions_.size(); PushInt16(&data, count); - count = answers_.size(); + count = (int)answers_.size(); PushInt16(&data, count); - count = auths_.size(); + count = (int)auths_.size(); PushInt16(&data, count); - count = adds_.size(); + count = (int)adds_.size(); PushInt16(&data, count); for (const std::unique_ptr& question : questions_) { diff --git a/lib/c-ares-1.23.0/test/dns-proto.h b/lib/c-ares-1.23.0/test/dns-proto.h new file mode 100644 index 00000000000..2a9527325f4 --- /dev/null +++ b/lib/c-ares-1.23.0/test/dns-proto.h @@ -0,0 +1,392 @@ +// -*- mode: c++ -*- +/* + * Copyright (C) The c-ares project + * + * 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. + * + * SPDX-License-Identifier: MIT + */ +#ifndef DNS_PROTO_H +#define DNS_PROTO_H +// Utilities for processing DNS packet contents + +#include "ares_setup.h" +#include "ares.h" +// Include ares internal file for DNS protocol constants +#include "ares_nameser.h" + +#include +#include +#include + +namespace ares { + +typedef unsigned char byte; + +std::string HexDump(std::vector data); +std::string HexDump(const byte *data, int len); +std::string HexDump(const char *data, int len); + +std::string StatusToString(int status); +std::string RcodeToString(int rcode); +std::string RRTypeToString(int rrtype); +std::string ClassToString(int qclass); +std::string AddressToString(const void *addr, int len); + +// Convert DNS protocol data to strings. +// Note that these functions are not defensive; they assume +// a validly formatted input, and so should not be used on +// externally-determined inputs. +std::string PacketToString(const std::vector &packet); +std::string QuestionToString(const std::vector &packet, const byte **data, + int *len); +std::string RRToString(const std::vector &packet, const byte **data, + int *len); + + +// Manipulate DNS protocol data. +void PushInt32(std::vector *data, int value); +void PushInt16(std::vector *data, int value); +std::vector EncodeString(const std::string &name); + +struct DNSQuestion { + DNSQuestion(const std::string &name, int rrtype, int qclass) + : name_(name), rrtype_(rrtype), qclass_(qclass) + { + } + + DNSQuestion(const std::string &name, int rrtype) + : name_(name), rrtype_(rrtype), qclass_(C_IN) + { + } + + virtual ~DNSQuestion() + { + } + + virtual std::vector data() const; + std::string name_; + int rrtype_; + int qclass_; +}; + +struct DNSRR : public DNSQuestion { + DNSRR(const std::string &name, int rrtype, int qclass, int ttl) + : DNSQuestion(name, rrtype, qclass), ttl_(ttl) + { + } + + DNSRR(const std::string &name, int rrtype, int ttl) + : DNSQuestion(name, rrtype), ttl_(ttl) + { + } + + virtual ~DNSRR() + { + } + + virtual std::vector data() const = 0; + int ttl_; +}; + +struct DNSAddressRR : public DNSRR { + DNSAddressRR(const std::string &name, int rrtype, int ttl, const byte *addr, + int addrlen) + : DNSRR(name, rrtype, ttl), addr_(addr, addr + addrlen) + { + } + + DNSAddressRR(const std::string &name, int rrtype, int ttl, + const std::vector &addr) + : DNSRR(name, rrtype, ttl), addr_(addr) + { + } + + virtual std::vector data() const; + std::vector addr_; +}; + +struct DNSARR : public DNSAddressRR { + DNSARR(const std::string &name, int ttl, const byte *addr, int addrlen) + : DNSAddressRR(name, T_A, ttl, addr, addrlen) + { + } + + DNSARR(const std::string &name, int ttl, const std::vector &addr) + : DNSAddressRR(name, T_A, ttl, addr) + { + } +}; + +struct DNSAaaaRR : public DNSAddressRR { + DNSAaaaRR(const std::string &name, int ttl, const byte *addr, int addrlen) + : DNSAddressRR(name, T_AAAA, ttl, addr, addrlen) + { + } + + DNSAaaaRR(const std::string &name, int ttl, const std::vector &addr) + : DNSAddressRR(name, T_AAAA, ttl, addr) + { + } +}; + +struct DNSSingleNameRR : public DNSRR { + DNSSingleNameRR(const std::string &name, int rrtype, int ttl, + const std::string &other) + : DNSRR(name, rrtype, ttl), other_(other) + { + } + + virtual std::vector data() const; + std::string other_; +}; + +struct DNSCnameRR : public DNSSingleNameRR { + DNSCnameRR(const std::string &name, int ttl, const std::string &other) + : DNSSingleNameRR(name, T_CNAME, ttl, other) + { + } +}; + +struct DNSNsRR : public DNSSingleNameRR { + DNSNsRR(const std::string &name, int ttl, const std::string &other) + : DNSSingleNameRR(name, T_NS, ttl, other) + { + } +}; + +struct DNSPtrRR : public DNSSingleNameRR { + DNSPtrRR(const std::string &name, int ttl, const std::string &other) + : DNSSingleNameRR(name, T_PTR, ttl, other) + { + } +}; + +struct DNSTxtRR : public DNSRR { + DNSTxtRR(const std::string &name, int ttl, + const std::vector &txt) + : DNSRR(name, T_TXT, ttl), txt_(txt) + { + } + + virtual std::vector data() const; + std::vector txt_; +}; + +struct DNSMxRR : public DNSRR { + DNSMxRR(const std::string &name, int ttl, int pref, const std::string &other) + : DNSRR(name, T_MX, ttl), pref_(pref), other_(other) + { + } + + virtual std::vector data() const; + int pref_; + std::string other_; +}; + +struct DNSSrvRR : public DNSRR { + DNSSrvRR(const std::string &name, int ttl, int prio, int weight, int port, + const std::string &target) + : DNSRR(name, T_SRV, ttl), prio_(prio), weight_(weight), port_(port), + target_(target) + { + } + + virtual std::vector data() const; + int prio_; + int weight_; + int port_; + std::string target_; +}; + +struct DNSUriRR : public DNSRR { + DNSUriRR(const std::string &name, int ttl, int prio, int weight, + const std::string &target) + : DNSRR(name, T_URI, ttl), prio_(prio), weight_(weight), target_(target) + { + } + + virtual std::vector data() const; + int prio_; + int weight_; + std::string target_; +}; + +struct DNSSoaRR : public DNSRR { + DNSSoaRR(const std::string &name, int ttl, const std::string &nsname, + const std::string &rname, int serial, int refresh, int retry, + int expire, int minimum) + : DNSRR(name, T_SOA, ttl), nsname_(nsname), rname_(rname), serial_(serial), + refresh_(refresh), retry_(retry), expire_(expire), minimum_(minimum) + { + } + + virtual std::vector data() const; + std::string nsname_; + std::string rname_; + int serial_; + int refresh_; + int retry_; + int expire_; + int minimum_; +}; + +struct DNSNaptrRR : public DNSRR { + DNSNaptrRR(const std::string &name, int ttl, int order, int pref, + const std::string &flags, const std::string &service, + const std::string ®exp, const std::string &replacement) + : DNSRR(name, T_NAPTR, ttl), order_(order), pref_(pref), flags_(flags), + service_(service), regexp_(regexp), replacement_(replacement) + { + } + + virtual std::vector data() const; + int order_; + int pref_; + std::string flags_; + std::string service_; + std::string regexp_; + std::string replacement_; +}; + +struct DNSOption { + int code_; + std::vector data_; +}; + +struct DNSOptRR : public DNSRR { + DNSOptRR(int extrcode, int udpsize) + : DNSRR("", T_OPT, static_cast(udpsize), extrcode) + { + } + + virtual std::vector data() const; + std::vector opts_; +}; + +struct DNSPacket { + DNSPacket() + : qid_(0), response_(false), opcode_(O_QUERY), aa_(false), tc_(false), + rd_(false), ra_(false), z_(false), ad_(false), cd_(false), rcode_(NOERROR) + { + } + + // Convenience functions that take ownership of given pointers. + DNSPacket &add_question(DNSQuestion *q) + { + questions_.push_back(std::unique_ptr(q)); + return *this; + } + + DNSPacket &add_answer(DNSRR *q) + { + answers_.push_back(std::unique_ptr(q)); + return *this; + } + + DNSPacket &add_auth(DNSRR *q) + { + auths_.push_back(std::unique_ptr(q)); + return *this; + } + + DNSPacket &add_additional(DNSRR *q) + { + adds_.push_back(std::unique_ptr(q)); + return *this; + } + + // Chainable setters. + DNSPacket &set_qid(int qid) + { + qid_ = qid; + return *this; + } + + DNSPacket &set_response(bool v = true) + { + response_ = v; + return *this; + } + + DNSPacket &set_aa(bool v = true) + { + aa_ = v; + return *this; + } + + DNSPacket &set_tc(bool v = true) + { + tc_ = v; + return *this; + } + + DNSPacket &set_rd(bool v = true) + { + rd_ = v; + return *this; + } + + DNSPacket &set_ra(bool v = true) + { + ra_ = v; + return *this; + } + + DNSPacket &set_z(bool v = true) + { + z_ = v; + return *this; + } + + DNSPacket &set_ad(bool v = true) + { + ad_ = v; + return *this; + } + + DNSPacket &set_cd(bool v = true) + { + cd_ = v; + return *this; + } + + DNSPacket &set_rcode(int rcode) + { + rcode_ = rcode; + return *this; + } + + // Return the encoded packet. + std::vector data() const; + + int qid_; + bool response_; + int opcode_; + bool aa_; + bool tc_; + bool rd_; + bool ra_; + bool z_; + bool ad_; + bool cd_; + int rcode_; + std::vector> questions_; + std::vector> answers_; + std::vector> auths_; + std::vector> adds_; +}; + +} // namespace ares + +#endif diff --git a/lib/c-ares-1.19.1/test/fuzzcheck.sh b/lib/c-ares-1.23.0/test/fuzzcheck.sh similarity index 60% rename from lib/c-ares-1.19.1/test/fuzzcheck.sh rename to lib/c-ares-1.23.0/test/fuzzcheck.sh index 3a137661e2c..1d098022a55 100755 --- a/lib/c-ares-1.19.1/test/fuzzcheck.sh +++ b/lib/c-ares-1.23.0/test/fuzzcheck.sh @@ -1,4 +1,6 @@ #!/bin/sh +# Copyright (C) The c-ares project and its contributors +# SPDX-License-Identifier: MIT set -e # Check that all of the base fuzzing corpus parse without errors ./aresfuzz fuzzinput/* diff --git a/lib/c-ares-1.19.1/test/fuzzinput/004a216d3cff18b0c5c6b68b807f1529 b/lib/c-ares-1.23.0/test/fuzzinput/004a216d3cff18b0c5c6b68b807f1529 similarity index 100% rename from lib/c-ares-1.19.1/test/fuzzinput/004a216d3cff18b0c5c6b68b807f1529 rename to lib/c-ares-1.23.0/test/fuzzinput/004a216d3cff18b0c5c6b68b807f1529 diff --git a/lib/c-ares-1.19.1/test/fuzzinput/00539467ca159b36aea95e61f9729115 b/lib/c-ares-1.23.0/test/fuzzinput/00539467ca159b36aea95e61f9729115 similarity index 100% rename from lib/c-ares-1.19.1/test/fuzzinput/00539467ca159b36aea95e61f9729115 rename to lib/c-ares-1.23.0/test/fuzzinput/00539467ca159b36aea95e61f9729115 diff --git a/lib/c-ares-1.19.1/test/fuzzinput/00e846db8f43f2f507cd1666ed5a753e b/lib/c-ares-1.23.0/test/fuzzinput/00e846db8f43f2f507cd1666ed5a753e similarity index 100% rename from lib/c-ares-1.19.1/test/fuzzinput/00e846db8f43f2f507cd1666ed5a753e rename to lib/c-ares-1.23.0/test/fuzzinput/00e846db8f43f2f507cd1666ed5a753e diff --git a/lib/c-ares-1.19.1/test/fuzzinput/0177b7566f08c013699eaea9a77abeb3 b/lib/c-ares-1.23.0/test/fuzzinput/0177b7566f08c013699eaea9a77abeb3 similarity index 100% rename from lib/c-ares-1.19.1/test/fuzzinput/0177b7566f08c013699eaea9a77abeb3 rename to lib/c-ares-1.23.0/test/fuzzinput/0177b7566f08c013699eaea9a77abeb3 diff --git a/lib/c-ares-1.19.1/test/fuzzinput/020a4fa317715bfdb236ed13751e6b65 b/lib/c-ares-1.23.0/test/fuzzinput/020a4fa317715bfdb236ed13751e6b65 similarity index 100% rename from lib/c-ares-1.19.1/test/fuzzinput/020a4fa317715bfdb236ed13751e6b65 rename to lib/c-ares-1.23.0/test/fuzzinput/020a4fa317715bfdb236ed13751e6b65 diff --git a/lib/c-ares-1.19.1/test/fuzzinput/0310f2e81bea31f4fe3f330872a877dd b/lib/c-ares-1.23.0/test/fuzzinput/0310f2e81bea31f4fe3f330872a877dd similarity index 100% rename from lib/c-ares-1.19.1/test/fuzzinput/0310f2e81bea31f4fe3f330872a877dd rename to lib/c-ares-1.23.0/test/fuzzinput/0310f2e81bea31f4fe3f330872a877dd diff --git a/lib/c-ares-1.19.1/test/fuzzinput/0449be67df1730b2d0887d412a9b7cc4 b/lib/c-ares-1.23.0/test/fuzzinput/0449be67df1730b2d0887d412a9b7cc4 similarity index 100% rename from lib/c-ares-1.19.1/test/fuzzinput/0449be67df1730b2d0887d412a9b7cc4 rename to lib/c-ares-1.23.0/test/fuzzinput/0449be67df1730b2d0887d412a9b7cc4 diff --git a/lib/c-ares-1.19.1/test/fuzzinput/0449dd14f7aa94bf0d716bfe09b287a8 b/lib/c-ares-1.23.0/test/fuzzinput/0449dd14f7aa94bf0d716bfe09b287a8 similarity index 100% rename from lib/c-ares-1.19.1/test/fuzzinput/0449dd14f7aa94bf0d716bfe09b287a8 rename to lib/c-ares-1.23.0/test/fuzzinput/0449dd14f7aa94bf0d716bfe09b287a8 diff --git a/lib/c-ares-1.19.1/test/fuzzinput/04c93cdf7208979aa4df80a3a0d5a2d8 b/lib/c-ares-1.23.0/test/fuzzinput/04c93cdf7208979aa4df80a3a0d5a2d8 similarity index 100% rename from lib/c-ares-1.19.1/test/fuzzinput/04c93cdf7208979aa4df80a3a0d5a2d8 rename to lib/c-ares-1.23.0/test/fuzzinput/04c93cdf7208979aa4df80a3a0d5a2d8 diff --git a/lib/c-ares-1.19.1/test/fuzzinput/0567e7171e08e75f3f91c4ca74c17adc b/lib/c-ares-1.23.0/test/fuzzinput/0567e7171e08e75f3f91c4ca74c17adc similarity index 100% rename from lib/c-ares-1.19.1/test/fuzzinput/0567e7171e08e75f3f91c4ca74c17adc rename to lib/c-ares-1.23.0/test/fuzzinput/0567e7171e08e75f3f91c4ca74c17adc diff --git a/lib/c-ares-1.19.1/test/fuzzinput/05ba948578a397e9cbc6a7b3e78622fa b/lib/c-ares-1.23.0/test/fuzzinput/05ba948578a397e9cbc6a7b3e78622fa similarity index 100% rename from lib/c-ares-1.19.1/test/fuzzinput/05ba948578a397e9cbc6a7b3e78622fa rename to lib/c-ares-1.23.0/test/fuzzinput/05ba948578a397e9cbc6a7b3e78622fa diff --git a/lib/c-ares-1.19.1/test/fuzzinput/060afe5ed25f3e2e86167e545f27edca b/lib/c-ares-1.23.0/test/fuzzinput/060afe5ed25f3e2e86167e545f27edca similarity index 100% rename from lib/c-ares-1.19.1/test/fuzzinput/060afe5ed25f3e2e86167e545f27edca rename to lib/c-ares-1.23.0/test/fuzzinput/060afe5ed25f3e2e86167e545f27edca diff --git a/lib/c-ares-1.19.1/test/fuzzinput/06d47d3681493f1b1d41236f460d896f b/lib/c-ares-1.23.0/test/fuzzinput/06d47d3681493f1b1d41236f460d896f similarity index 100% rename from lib/c-ares-1.19.1/test/fuzzinput/06d47d3681493f1b1d41236f460d896f rename to lib/c-ares-1.23.0/test/fuzzinput/06d47d3681493f1b1d41236f460d896f diff --git a/lib/c-ares-1.19.1/test/fuzzinput/0724a810b0e131c2fddb6de9003b9064 b/lib/c-ares-1.23.0/test/fuzzinput/0724a810b0e131c2fddb6de9003b9064 similarity index 100% rename from lib/c-ares-1.19.1/test/fuzzinput/0724a810b0e131c2fddb6de9003b9064 rename to lib/c-ares-1.23.0/test/fuzzinput/0724a810b0e131c2fddb6de9003b9064 diff --git a/lib/c-ares-1.19.1/test/fuzzinput/0b5279148826f5b962bcf1896bdb4ede b/lib/c-ares-1.23.0/test/fuzzinput/0b5279148826f5b962bcf1896bdb4ede similarity index 100% rename from lib/c-ares-1.19.1/test/fuzzinput/0b5279148826f5b962bcf1896bdb4ede rename to lib/c-ares-1.23.0/test/fuzzinput/0b5279148826f5b962bcf1896bdb4ede diff --git a/lib/c-ares-1.19.1/test/fuzzinput/114048c0f6b10bdc67ce9166405d195e b/lib/c-ares-1.23.0/test/fuzzinput/114048c0f6b10bdc67ce9166405d195e similarity index 100% rename from lib/c-ares-1.19.1/test/fuzzinput/114048c0f6b10bdc67ce9166405d195e rename to lib/c-ares-1.23.0/test/fuzzinput/114048c0f6b10bdc67ce9166405d195e diff --git a/lib/c-ares-1.19.1/test/fuzzinput/11b8464a0ef8735d202955c34c36b0c7 b/lib/c-ares-1.23.0/test/fuzzinput/11b8464a0ef8735d202955c34c36b0c7 similarity index 100% rename from lib/c-ares-1.19.1/test/fuzzinput/11b8464a0ef8735d202955c34c36b0c7 rename to lib/c-ares-1.23.0/test/fuzzinput/11b8464a0ef8735d202955c34c36b0c7 diff --git a/lib/c-ares-1.19.1/test/fuzzinput/11cb626f1668c7b41954ce7d768fe528 b/lib/c-ares-1.23.0/test/fuzzinput/11cb626f1668c7b41954ce7d768fe528 similarity index 100% rename from lib/c-ares-1.19.1/test/fuzzinput/11cb626f1668c7b41954ce7d768fe528 rename to lib/c-ares-1.23.0/test/fuzzinput/11cb626f1668c7b41954ce7d768fe528 diff --git a/lib/c-ares-1.19.1/test/fuzzinput/14b133bf18125b75a1976fa63a1df6b7 b/lib/c-ares-1.23.0/test/fuzzinput/14b133bf18125b75a1976fa63a1df6b7 similarity index 100% rename from lib/c-ares-1.19.1/test/fuzzinput/14b133bf18125b75a1976fa63a1df6b7 rename to lib/c-ares-1.23.0/test/fuzzinput/14b133bf18125b75a1976fa63a1df6b7 diff --git a/lib/c-ares-1.19.1/test/fuzzinput/153c6b3afa8faa03c8bc28f936a6d4cf b/lib/c-ares-1.23.0/test/fuzzinput/153c6b3afa8faa03c8bc28f936a6d4cf similarity index 100% rename from lib/c-ares-1.19.1/test/fuzzinput/153c6b3afa8faa03c8bc28f936a6d4cf rename to lib/c-ares-1.23.0/test/fuzzinput/153c6b3afa8faa03c8bc28f936a6d4cf diff --git a/lib/c-ares-1.19.1/test/fuzzinput/182cad2a342ed7317b7c21a5d17020d1 b/lib/c-ares-1.23.0/test/fuzzinput/182cad2a342ed7317b7c21a5d17020d1 similarity index 100% rename from lib/c-ares-1.19.1/test/fuzzinput/182cad2a342ed7317b7c21a5d17020d1 rename to lib/c-ares-1.23.0/test/fuzzinput/182cad2a342ed7317b7c21a5d17020d1 diff --git a/lib/c-ares-1.19.1/test/fuzzinput/1c61a61bb7057b52c5b15188345a5238 b/lib/c-ares-1.23.0/test/fuzzinput/1c61a61bb7057b52c5b15188345a5238 similarity index 100% rename from lib/c-ares-1.19.1/test/fuzzinput/1c61a61bb7057b52c5b15188345a5238 rename to lib/c-ares-1.23.0/test/fuzzinput/1c61a61bb7057b52c5b15188345a5238 diff --git a/lib/c-ares-1.19.1/test/fuzzinput/1dbe2cf62ed2e4fa1c3cb473f08710b5 b/lib/c-ares-1.23.0/test/fuzzinput/1dbe2cf62ed2e4fa1c3cb473f08710b5 similarity index 100% rename from lib/c-ares-1.19.1/test/fuzzinput/1dbe2cf62ed2e4fa1c3cb473f08710b5 rename to lib/c-ares-1.23.0/test/fuzzinput/1dbe2cf62ed2e4fa1c3cb473f08710b5 diff --git a/lib/c-ares-1.19.1/test/fuzzinput/21199be504fcfece5c7096ee0dbba507 b/lib/c-ares-1.23.0/test/fuzzinput/21199be504fcfece5c7096ee0dbba507 similarity index 100% rename from lib/c-ares-1.19.1/test/fuzzinput/21199be504fcfece5c7096ee0dbba507 rename to lib/c-ares-1.23.0/test/fuzzinput/21199be504fcfece5c7096ee0dbba507 diff --git a/lib/c-ares-1.19.1/test/fuzzinput/21891480074b5635dbbe7137bdcabccd b/lib/c-ares-1.23.0/test/fuzzinput/21891480074b5635dbbe7137bdcabccd similarity index 100% rename from lib/c-ares-1.19.1/test/fuzzinput/21891480074b5635dbbe7137bdcabccd rename to lib/c-ares-1.23.0/test/fuzzinput/21891480074b5635dbbe7137bdcabccd diff --git a/lib/c-ares-1.19.1/test/fuzzinput/233aea42e15aa73e131eefabf16088c9 b/lib/c-ares-1.23.0/test/fuzzinput/233aea42e15aa73e131eefabf16088c9 similarity index 100% rename from lib/c-ares-1.19.1/test/fuzzinput/233aea42e15aa73e131eefabf16088c9 rename to lib/c-ares-1.23.0/test/fuzzinput/233aea42e15aa73e131eefabf16088c9 diff --git a/lib/c-ares-1.19.1/test/fuzzinput/24660d4e7ac7aa21d600ea7a3d198bbb b/lib/c-ares-1.23.0/test/fuzzinput/24660d4e7ac7aa21d600ea7a3d198bbb similarity index 100% rename from lib/c-ares-1.19.1/test/fuzzinput/24660d4e7ac7aa21d600ea7a3d198bbb rename to lib/c-ares-1.23.0/test/fuzzinput/24660d4e7ac7aa21d600ea7a3d198bbb diff --git a/lib/c-ares-1.19.1/test/fuzzinput/25589deb55c08429345f289d1c9b0254 b/lib/c-ares-1.23.0/test/fuzzinput/25589deb55c08429345f289d1c9b0254 similarity index 100% rename from lib/c-ares-1.19.1/test/fuzzinput/25589deb55c08429345f289d1c9b0254 rename to lib/c-ares-1.23.0/test/fuzzinput/25589deb55c08429345f289d1c9b0254 diff --git a/lib/c-ares-1.19.1/test/fuzzinput/2573bd823e4da11f727a17f8e1f35c26 b/lib/c-ares-1.23.0/test/fuzzinput/2573bd823e4da11f727a17f8e1f35c26 similarity index 100% rename from lib/c-ares-1.19.1/test/fuzzinput/2573bd823e4da11f727a17f8e1f35c26 rename to lib/c-ares-1.23.0/test/fuzzinput/2573bd823e4da11f727a17f8e1f35c26 diff --git a/lib/c-ares-1.19.1/test/fuzzinput/276f12da56866273e76059ad0e7be97e b/lib/c-ares-1.23.0/test/fuzzinput/276f12da56866273e76059ad0e7be97e similarity index 100% rename from lib/c-ares-1.19.1/test/fuzzinput/276f12da56866273e76059ad0e7be97e rename to lib/c-ares-1.23.0/test/fuzzinput/276f12da56866273e76059ad0e7be97e diff --git a/lib/c-ares-1.19.1/test/fuzzinput/29198a2e380cb19babec9e02116d213e b/lib/c-ares-1.23.0/test/fuzzinput/29198a2e380cb19babec9e02116d213e similarity index 100% rename from lib/c-ares-1.19.1/test/fuzzinput/29198a2e380cb19babec9e02116d213e rename to lib/c-ares-1.23.0/test/fuzzinput/29198a2e380cb19babec9e02116d213e diff --git a/lib/c-ares-1.19.1/test/fuzzinput/2c94ba9434b1a1b9396fc5364f101363 b/lib/c-ares-1.23.0/test/fuzzinput/2c94ba9434b1a1b9396fc5364f101363 similarity index 100% rename from lib/c-ares-1.19.1/test/fuzzinput/2c94ba9434b1a1b9396fc5364f101363 rename to lib/c-ares-1.23.0/test/fuzzinput/2c94ba9434b1a1b9396fc5364f101363 diff --git a/lib/c-ares-1.19.1/test/fuzzinput/2d578c357dc2f5e02dc55cddb30641d1 b/lib/c-ares-1.23.0/test/fuzzinput/2d578c357dc2f5e02dc55cddb30641d1 similarity index 100% rename from lib/c-ares-1.19.1/test/fuzzinput/2d578c357dc2f5e02dc55cddb30641d1 rename to lib/c-ares-1.23.0/test/fuzzinput/2d578c357dc2f5e02dc55cddb30641d1 diff --git a/lib/c-ares-1.19.1/test/fuzzinput/2dff6cc5a223e67fde9e5e79af456992 b/lib/c-ares-1.23.0/test/fuzzinput/2dff6cc5a223e67fde9e5e79af456992 similarity index 100% rename from lib/c-ares-1.19.1/test/fuzzinput/2dff6cc5a223e67fde9e5e79af456992 rename to lib/c-ares-1.23.0/test/fuzzinput/2dff6cc5a223e67fde9e5e79af456992 diff --git a/lib/c-ares-1.19.1/test/fuzzinput/2f103b1f9477f2d8934bd84328d51c75 b/lib/c-ares-1.23.0/test/fuzzinput/2f103b1f9477f2d8934bd84328d51c75 similarity index 100% rename from lib/c-ares-1.19.1/test/fuzzinput/2f103b1f9477f2d8934bd84328d51c75 rename to lib/c-ares-1.23.0/test/fuzzinput/2f103b1f9477f2d8934bd84328d51c75 diff --git a/lib/c-ares-1.19.1/test/fuzzinput/31cd3a8413de13d9624adbb1613784bf b/lib/c-ares-1.23.0/test/fuzzinput/31cd3a8413de13d9624adbb1613784bf similarity index 100% rename from lib/c-ares-1.19.1/test/fuzzinput/31cd3a8413de13d9624adbb1613784bf rename to lib/c-ares-1.23.0/test/fuzzinput/31cd3a8413de13d9624adbb1613784bf diff --git a/lib/c-ares-1.19.1/test/fuzzinput/36415bdf1d180098fe6234b4186e69f3 b/lib/c-ares-1.23.0/test/fuzzinput/36415bdf1d180098fe6234b4186e69f3 similarity index 100% rename from lib/c-ares-1.19.1/test/fuzzinput/36415bdf1d180098fe6234b4186e69f3 rename to lib/c-ares-1.23.0/test/fuzzinput/36415bdf1d180098fe6234b4186e69f3 diff --git a/lib/c-ares-1.19.1/test/fuzzinput/3a04a80f0242e8dff0cd732e7c4767da b/lib/c-ares-1.23.0/test/fuzzinput/3a04a80f0242e8dff0cd732e7c4767da similarity index 100% rename from lib/c-ares-1.19.1/test/fuzzinput/3a04a80f0242e8dff0cd732e7c4767da rename to lib/c-ares-1.23.0/test/fuzzinput/3a04a80f0242e8dff0cd732e7c4767da diff --git a/lib/c-ares-1.19.1/test/fuzzinput/44d0f973b7b0fb3e4a07770c943dcd5a b/lib/c-ares-1.23.0/test/fuzzinput/44d0f973b7b0fb3e4a07770c943dcd5a similarity index 100% rename from lib/c-ares-1.19.1/test/fuzzinput/44d0f973b7b0fb3e4a07770c943dcd5a rename to lib/c-ares-1.23.0/test/fuzzinput/44d0f973b7b0fb3e4a07770c943dcd5a diff --git a/lib/c-ares-1.19.1/test/fuzzinput/50bc00daa0ddcd6cfb2b5d9f62c81f47 b/lib/c-ares-1.23.0/test/fuzzinput/50bc00daa0ddcd6cfb2b5d9f62c81f47 similarity index 100% rename from lib/c-ares-1.19.1/test/fuzzinput/50bc00daa0ddcd6cfb2b5d9f62c81f47 rename to lib/c-ares-1.23.0/test/fuzzinput/50bc00daa0ddcd6cfb2b5d9f62c81f47 diff --git a/lib/c-ares-1.19.1/test/fuzzinput/51ed2d1fb77b3078b54e94e85606b7df b/lib/c-ares-1.23.0/test/fuzzinput/51ed2d1fb77b3078b54e94e85606b7df similarity index 100% rename from lib/c-ares-1.19.1/test/fuzzinput/51ed2d1fb77b3078b54e94e85606b7df rename to lib/c-ares-1.23.0/test/fuzzinput/51ed2d1fb77b3078b54e94e85606b7df diff --git a/lib/c-ares-1.19.1/test/fuzzinput/5c5e0e899cf2e7d053a9e45fb76f6e5a b/lib/c-ares-1.23.0/test/fuzzinput/5c5e0e899cf2e7d053a9e45fb76f6e5a similarity index 100% rename from lib/c-ares-1.19.1/test/fuzzinput/5c5e0e899cf2e7d053a9e45fb76f6e5a rename to lib/c-ares-1.23.0/test/fuzzinput/5c5e0e899cf2e7d053a9e45fb76f6e5a diff --git a/lib/c-ares-1.19.1/test/fuzzinput/70152ed033f139443fbfb1b858bb3b1b b/lib/c-ares-1.23.0/test/fuzzinput/70152ed033f139443fbfb1b858bb3b1b similarity index 100% rename from lib/c-ares-1.19.1/test/fuzzinput/70152ed033f139443fbfb1b858bb3b1b rename to lib/c-ares-1.23.0/test/fuzzinput/70152ed033f139443fbfb1b858bb3b1b diff --git a/lib/c-ares-1.19.1/test/fuzzinput/7030ca2b24e5a7f9dd8f62096a48eb33 b/lib/c-ares-1.23.0/test/fuzzinput/7030ca2b24e5a7f9dd8f62096a48eb33 similarity index 100% rename from lib/c-ares-1.19.1/test/fuzzinput/7030ca2b24e5a7f9dd8f62096a48eb33 rename to lib/c-ares-1.23.0/test/fuzzinput/7030ca2b24e5a7f9dd8f62096a48eb33 diff --git a/lib/c-ares-1.19.1/test/fuzzinput/71eec1a0ef2d25bb9e2ef17f23be7e9e b/lib/c-ares-1.23.0/test/fuzzinput/71eec1a0ef2d25bb9e2ef17f23be7e9e similarity index 100% rename from lib/c-ares-1.19.1/test/fuzzinput/71eec1a0ef2d25bb9e2ef17f23be7e9e rename to lib/c-ares-1.23.0/test/fuzzinput/71eec1a0ef2d25bb9e2ef17f23be7e9e diff --git a/lib/c-ares-1.19.1/test/fuzzinput/7a6b0177210ea4ef40b254daf99393c5 b/lib/c-ares-1.23.0/test/fuzzinput/7a6b0177210ea4ef40b254daf99393c5 similarity index 100% rename from lib/c-ares-1.19.1/test/fuzzinput/7a6b0177210ea4ef40b254daf99393c5 rename to lib/c-ares-1.23.0/test/fuzzinput/7a6b0177210ea4ef40b254daf99393c5 diff --git a/lib/c-ares-1.19.1/test/fuzzinput/7f1567733711ffb61839621af0cbfa33 b/lib/c-ares-1.23.0/test/fuzzinput/7f1567733711ffb61839621af0cbfa33 similarity index 100% rename from lib/c-ares-1.19.1/test/fuzzinput/7f1567733711ffb61839621af0cbfa33 rename to lib/c-ares-1.23.0/test/fuzzinput/7f1567733711ffb61839621af0cbfa33 diff --git a/lib/c-ares-1.19.1/test/fuzzinput/850c6d57c5bb7be8205fc2438d14d7e5 b/lib/c-ares-1.23.0/test/fuzzinput/850c6d57c5bb7be8205fc2438d14d7e5 similarity index 100% rename from lib/c-ares-1.19.1/test/fuzzinput/850c6d57c5bb7be8205fc2438d14d7e5 rename to lib/c-ares-1.23.0/test/fuzzinput/850c6d57c5bb7be8205fc2438d14d7e5 diff --git a/lib/c-ares-1.19.1/test/fuzzinput/a5c8cd2784a5792b9e91c2d7895b3b34 b/lib/c-ares-1.23.0/test/fuzzinput/a5c8cd2784a5792b9e91c2d7895b3b34 similarity index 100% rename from lib/c-ares-1.19.1/test/fuzzinput/a5c8cd2784a5792b9e91c2d7895b3b34 rename to lib/c-ares-1.23.0/test/fuzzinput/a5c8cd2784a5792b9e91c2d7895b3b34 diff --git a/lib/c-ares-1.19.1/test/fuzzinput/a9135cdc7151d023300ff194bad90af9 b/lib/c-ares-1.23.0/test/fuzzinput/a9135cdc7151d023300ff194bad90af9 similarity index 100% rename from lib/c-ares-1.19.1/test/fuzzinput/a9135cdc7151d023300ff194bad90af9 rename to lib/c-ares-1.23.0/test/fuzzinput/a9135cdc7151d023300ff194bad90af9 diff --git a/lib/c-ares-1.19.1/test/fuzzinput/af2597e8ac7dec1e8b4a47518312912a b/lib/c-ares-1.23.0/test/fuzzinput/af2597e8ac7dec1e8b4a47518312912a similarity index 100% rename from lib/c-ares-1.19.1/test/fuzzinput/af2597e8ac7dec1e8b4a47518312912a rename to lib/c-ares-1.23.0/test/fuzzinput/af2597e8ac7dec1e8b4a47518312912a diff --git a/lib/c-ares-1.19.1/test/fuzzinput/answer_a b/lib/c-ares-1.23.0/test/fuzzinput/answer_a similarity index 100% rename from lib/c-ares-1.19.1/test/fuzzinput/answer_a rename to lib/c-ares-1.23.0/test/fuzzinput/answer_a diff --git a/lib/c-ares-1.19.1/test/fuzzinput/answer_aaaa b/lib/c-ares-1.23.0/test/fuzzinput/answer_aaaa similarity index 100% rename from lib/c-ares-1.19.1/test/fuzzinput/answer_aaaa rename to lib/c-ares-1.23.0/test/fuzzinput/answer_aaaa diff --git a/lib/c-ares-1.19.1/test/fuzzinput/b3f53ef826b831bb09dd25c7f5960249 b/lib/c-ares-1.23.0/test/fuzzinput/b3f53ef826b831bb09dd25c7f5960249 similarity index 100% rename from lib/c-ares-1.19.1/test/fuzzinput/b3f53ef826b831bb09dd25c7f5960249 rename to lib/c-ares-1.23.0/test/fuzzinput/b3f53ef826b831bb09dd25c7f5960249 diff --git a/lib/c-ares-1.19.1/test/fuzzinput/cda0f8751f5c4993974c2b549d29bcc8 b/lib/c-ares-1.23.0/test/fuzzinput/cda0f8751f5c4993974c2b549d29bcc8 similarity index 100% rename from lib/c-ares-1.19.1/test/fuzzinput/cda0f8751f5c4993974c2b549d29bcc8 rename to lib/c-ares-1.23.0/test/fuzzinput/cda0f8751f5c4993974c2b549d29bcc8 diff --git a/lib/c-ares-1.19.1/test/fuzzinput/ce6c26c0e469339873d0e7f616ab0945 b/lib/c-ares-1.23.0/test/fuzzinput/ce6c26c0e469339873d0e7f616ab0945 similarity index 100% rename from lib/c-ares-1.19.1/test/fuzzinput/ce6c26c0e469339873d0e7f616ab0945 rename to lib/c-ares-1.23.0/test/fuzzinput/ce6c26c0e469339873d0e7f616ab0945 diff --git a/lib/c-ares-1.19.1/test/fuzzinput/clusterfuzz-5637790584012800 b/lib/c-ares-1.23.0/test/fuzzinput/clusterfuzz-5637790584012800 similarity index 100% rename from lib/c-ares-1.19.1/test/fuzzinput/clusterfuzz-5637790584012800 rename to lib/c-ares-1.23.0/test/fuzzinput/clusterfuzz-5637790584012800 diff --git a/lib/c-ares-1.19.1/test/fuzzinput/clusterfuzz-5650695891451904 b/lib/c-ares-1.23.0/test/fuzzinput/clusterfuzz-5650695891451904 similarity index 100% rename from lib/c-ares-1.19.1/test/fuzzinput/clusterfuzz-5650695891451904 rename to lib/c-ares-1.23.0/test/fuzzinput/clusterfuzz-5650695891451904 diff --git a/lib/c-ares-1.19.1/test/fuzzinput/clusterfuzz-5651369832218624 b/lib/c-ares-1.23.0/test/fuzzinput/clusterfuzz-5651369832218624 similarity index 100% rename from lib/c-ares-1.19.1/test/fuzzinput/clusterfuzz-5651369832218624 rename to lib/c-ares-1.23.0/test/fuzzinput/clusterfuzz-5651369832218624 diff --git a/lib/c-ares-1.19.1/test/fuzzinput/clusterfuzz-5674462260756480 b/lib/c-ares-1.23.0/test/fuzzinput/clusterfuzz-5674462260756480 similarity index 100% rename from lib/c-ares-1.19.1/test/fuzzinput/clusterfuzz-5674462260756480 rename to lib/c-ares-1.23.0/test/fuzzinput/clusterfuzz-5674462260756480 diff --git a/lib/c-ares-1.19.1/test/fuzzinput/clusterfuzz-5680630672654336 b/lib/c-ares-1.23.0/test/fuzzinput/clusterfuzz-5680630672654336 similarity index 100% rename from lib/c-ares-1.19.1/test/fuzzinput/clusterfuzz-5680630672654336 rename to lib/c-ares-1.23.0/test/fuzzinput/clusterfuzz-5680630672654336 diff --git a/lib/c-ares-1.19.1/test/fuzzinput/clusterfuzz-5683497160671232 b/lib/c-ares-1.23.0/test/fuzzinput/clusterfuzz-5683497160671232 similarity index 100% rename from lib/c-ares-1.19.1/test/fuzzinput/clusterfuzz-5683497160671232 rename to lib/c-ares-1.23.0/test/fuzzinput/clusterfuzz-5683497160671232 diff --git a/lib/c-ares-1.19.1/test/fuzzinput/clusterfuzz-5687310655422464 b/lib/c-ares-1.23.0/test/fuzzinput/clusterfuzz-5687310655422464 similarity index 100% rename from lib/c-ares-1.19.1/test/fuzzinput/clusterfuzz-5687310655422464 rename to lib/c-ares-1.23.0/test/fuzzinput/clusterfuzz-5687310655422464 diff --git a/lib/c-ares-1.19.1/test/fuzzinput/clusterfuzz-5695341573177344 b/lib/c-ares-1.23.0/test/fuzzinput/clusterfuzz-5695341573177344 similarity index 100% rename from lib/c-ares-1.19.1/test/fuzzinput/clusterfuzz-5695341573177344 rename to lib/c-ares-1.23.0/test/fuzzinput/clusterfuzz-5695341573177344 diff --git a/lib/c-ares-1.19.1/test/fuzzinput/clusterfuzz-5697835103682560 b/lib/c-ares-1.23.0/test/fuzzinput/clusterfuzz-5697835103682560 similarity index 100% rename from lib/c-ares-1.19.1/test/fuzzinput/clusterfuzz-5697835103682560 rename to lib/c-ares-1.23.0/test/fuzzinput/clusterfuzz-5697835103682560 diff --git a/lib/c-ares-1.19.1/test/fuzzinput/clusterfuzz-5728518081609728 b/lib/c-ares-1.23.0/test/fuzzinput/clusterfuzz-5728518081609728 similarity index 100% rename from lib/c-ares-1.19.1/test/fuzzinput/clusterfuzz-5728518081609728 rename to lib/c-ares-1.23.0/test/fuzzinput/clusterfuzz-5728518081609728 diff --git a/lib/c-ares-1.19.1/test/fuzzinput/clusterfuzz-5732960017317888 b/lib/c-ares-1.23.0/test/fuzzinput/clusterfuzz-5732960017317888 similarity index 100% rename from lib/c-ares-1.19.1/test/fuzzinput/clusterfuzz-5732960017317888 rename to lib/c-ares-1.23.0/test/fuzzinput/clusterfuzz-5732960017317888 diff --git a/lib/c-ares-1.19.1/test/fuzzinput/e4dd7e7c2dd4ed7c2e17a6af5d04f9c9 b/lib/c-ares-1.23.0/test/fuzzinput/e4dd7e7c2dd4ed7c2e17a6af5d04f9c9 similarity index 100% rename from lib/c-ares-1.19.1/test/fuzzinput/e4dd7e7c2dd4ed7c2e17a6af5d04f9c9 rename to lib/c-ares-1.23.0/test/fuzzinput/e4dd7e7c2dd4ed7c2e17a6af5d04f9c9 diff --git a/lib/c-ares-1.19.1/test/fuzzinput/ed50ed8ee36230a5a69746ad830437e5 b/lib/c-ares-1.23.0/test/fuzzinput/ed50ed8ee36230a5a69746ad830437e5 similarity index 100% rename from lib/c-ares-1.19.1/test/fuzzinput/ed50ed8ee36230a5a69746ad830437e5 rename to lib/c-ares-1.23.0/test/fuzzinput/ed50ed8ee36230a5a69746ad830437e5 diff --git a/lib/c-ares-1.19.1/test/fuzzinput/f1b900d50806021953321c3b604ee497 b/lib/c-ares-1.23.0/test/fuzzinput/f1b900d50806021953321c3b604ee497 similarity index 100% rename from lib/c-ares-1.19.1/test/fuzzinput/f1b900d50806021953321c3b604ee497 rename to lib/c-ares-1.23.0/test/fuzzinput/f1b900d50806021953321c3b604ee497 diff --git a/lib/c-ares-1.19.1/test/fuzzinput/f6606f624be8c628328cea01d2cd07a9 b/lib/c-ares-1.23.0/test/fuzzinput/f6606f624be8c628328cea01d2cd07a9 similarity index 100% rename from lib/c-ares-1.19.1/test/fuzzinput/f6606f624be8c628328cea01d2cd07a9 rename to lib/c-ares-1.23.0/test/fuzzinput/f6606f624be8c628328cea01d2cd07a9 diff --git a/lib/c-ares-1.19.1/test/fuzzinput/f89f6c8176b564a7dd646f14305573ce b/lib/c-ares-1.23.0/test/fuzzinput/f89f6c8176b564a7dd646f14305573ce similarity index 100% rename from lib/c-ares-1.19.1/test/fuzzinput/f89f6c8176b564a7dd646f14305573ce rename to lib/c-ares-1.23.0/test/fuzzinput/f89f6c8176b564a7dd646f14305573ce diff --git a/lib/c-ares-1.19.1/test/fuzzinput/f9ad508d2dbd08d3aaaabc7d1174677d b/lib/c-ares-1.23.0/test/fuzzinput/f9ad508d2dbd08d3aaaabc7d1174677d similarity index 100% rename from lib/c-ares-1.19.1/test/fuzzinput/f9ad508d2dbd08d3aaaabc7d1174677d rename to lib/c-ares-1.23.0/test/fuzzinput/f9ad508d2dbd08d3aaaabc7d1174677d diff --git a/lib/c-ares-1.19.1/test/fuzzinput/multi-indir b/lib/c-ares-1.23.0/test/fuzzinput/multi-indir similarity index 100% rename from lib/c-ares-1.19.1/test/fuzzinput/multi-indir rename to lib/c-ares-1.23.0/test/fuzzinput/multi-indir diff --git a/lib/c-ares-1.19.1/test/fuzznames/name01 b/lib/c-ares-1.23.0/test/fuzznames/name01 similarity index 100% rename from lib/c-ares-1.19.1/test/fuzznames/name01 rename to lib/c-ares-1.23.0/test/fuzznames/name01 diff --git a/lib/c-ares-1.19.1/test/fuzznames/name02 b/lib/c-ares-1.23.0/test/fuzznames/name02 similarity index 100% rename from lib/c-ares-1.19.1/test/fuzznames/name02 rename to lib/c-ares-1.23.0/test/fuzznames/name02 diff --git a/lib/c-ares-1.19.1/test/fuzznames/name03 b/lib/c-ares-1.23.0/test/fuzznames/name03 similarity index 100% rename from lib/c-ares-1.19.1/test/fuzznames/name03 rename to lib/c-ares-1.23.0/test/fuzznames/name03 diff --git a/lib/c-ares-1.19.1/test/fuzznames/name04 b/lib/c-ares-1.23.0/test/fuzznames/name04 similarity index 100% rename from lib/c-ares-1.19.1/test/fuzznames/name04 rename to lib/c-ares-1.23.0/test/fuzznames/name04 diff --git a/lib/c-ares-1.19.1/test/fuzznames/name05 b/lib/c-ares-1.23.0/test/fuzznames/name05 similarity index 100% rename from lib/c-ares-1.19.1/test/fuzznames/name05 rename to lib/c-ares-1.23.0/test/fuzznames/name05 diff --git a/lib/c-ares-1.19.1/test/fuzznames/name06 b/lib/c-ares-1.23.0/test/fuzznames/name06 similarity index 100% rename from lib/c-ares-1.19.1/test/fuzznames/name06 rename to lib/c-ares-1.23.0/test/fuzznames/name06 diff --git a/lib/c-ares-1.19.1/test/fuzznames/name07 b/lib/c-ares-1.23.0/test/fuzznames/name07 similarity index 100% rename from lib/c-ares-1.19.1/test/fuzznames/name07 rename to lib/c-ares-1.23.0/test/fuzznames/name07 diff --git a/lib/c-ares-1.19.1/test/fuzznames/name08 b/lib/c-ares-1.23.0/test/fuzznames/name08 similarity index 100% rename from lib/c-ares-1.19.1/test/fuzznames/name08 rename to lib/c-ares-1.23.0/test/fuzznames/name08 diff --git a/lib/c-ares-1.19.1/test/fuzznames/name09 b/lib/c-ares-1.23.0/test/fuzznames/name09 similarity index 100% rename from lib/c-ares-1.19.1/test/fuzznames/name09 rename to lib/c-ares-1.23.0/test/fuzznames/name09 diff --git a/lib/c-ares-1.19.1/test/gmock-1.11.0/gmock-gtest-all.cc b/lib/c-ares-1.23.0/test/gmock-1.11.0/gmock-gtest-all.cc similarity index 99% rename from lib/c-ares-1.19.1/test/gmock-1.11.0/gmock-gtest-all.cc rename to lib/c-ares-1.23.0/test/gmock-1.11.0/gmock-gtest-all.cc index 6d86e6ee085..5b9d04c540f 100644 --- a/lib/c-ares-1.19.1/test/gmock-1.11.0/gmock-gtest-all.cc +++ b/lib/c-ares-1.23.0/test/gmock-1.11.0/gmock-gtest-all.cc @@ -26,6 +26,8 @@ // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// SPDX-License-Identifier: BSD-3-Clause // // Google C++ Testing and Mocking Framework (Google Test) diff --git a/lib/c-ares-1.19.1/test/gmock-1.11.0/gmock/gmock.h b/lib/c-ares-1.23.0/test/gmock-1.11.0/gmock/gmock.h similarity index 99% rename from lib/c-ares-1.19.1/test/gmock-1.11.0/gmock/gmock.h rename to lib/c-ares-1.23.0/test/gmock-1.11.0/gmock/gmock.h index 9bb49d08069..3deab271dc6 100644 --- a/lib/c-ares-1.19.1/test/gmock-1.11.0/gmock/gmock.h +++ b/lib/c-ares-1.23.0/test/gmock-1.11.0/gmock/gmock.h @@ -26,6 +26,8 @@ // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// SPDX-License-Identifier: BSD-3-Clause // Google Mock - a framework for writing C++ mock classes. diff --git a/lib/c-ares-1.19.1/test/gmock-1.11.0/gtest/gtest.h b/lib/c-ares-1.23.0/test/gmock-1.11.0/gtest/gtest.h similarity index 99% rename from lib/c-ares-1.19.1/test/gmock-1.11.0/gtest/gtest.h rename to lib/c-ares-1.23.0/test/gmock-1.11.0/gtest/gtest.h index e7490573ac5..64ac6f38ac2 100644 --- a/lib/c-ares-1.19.1/test/gmock-1.11.0/gtest/gtest.h +++ b/lib/c-ares-1.23.0/test/gmock-1.11.0/gtest/gtest.h @@ -26,6 +26,8 @@ // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// SPDX-License-Identifier: BSD-3-Clause // // The Google C++ Testing and Mocking Framework (Google Test) diff --git a/lib/c-ares-1.19.1/test/install-sh b/lib/c-ares-1.23.0/test/install-sh similarity index 100% rename from lib/c-ares-1.19.1/test/install-sh rename to lib/c-ares-1.23.0/test/install-sh diff --git a/lib/c-ares-1.19.1/test/ltmain.sh b/lib/c-ares-1.23.0/test/ltmain.sh similarity index 99% rename from lib/c-ares-1.19.1/test/ltmain.sh rename to lib/c-ares-1.23.0/test/ltmain.sh index 8fb8700eef3..1dea62ab78d 100755 --- a/lib/c-ares-1.19.1/test/ltmain.sh +++ b/lib/c-ares-1.23.0/test/ltmain.sh @@ -31,7 +31,7 @@ PROGRAM=libtool PACKAGE=libtool -VERSION="2.4.7 Debian-2.4.7-4" +VERSION="2.4.7 Debian-2.4.7-7" package_revision=2.4.7 @@ -572,27 +572,15 @@ func_require_term_colors () # --------------------- # Append VALUE onto the existing contents of VAR. - # We should try to minimise forks, especially on Windows where they are - # unreasonably slow, so skip the feature probes when bash or zsh are - # being used: - if test set = "${BASH_VERSION+set}${ZSH_VERSION+set}"; then - : ${_G_HAVE_ARITH_OP="yes"} - : ${_G_HAVE_XSI_OPS="yes"} - # The += operator was introduced in bash 3.1 - case $BASH_VERSION in - [12].* | 3.0 | 3.0*) ;; - *) - : ${_G_HAVE_PLUSEQ_OP="yes"} - ;; - esac - fi - # _G_HAVE_PLUSEQ_OP # Can be empty, in which case the shell is probed, "yes" if += is # useable or anything else if it does not work. - test -z "$_G_HAVE_PLUSEQ_OP" \ - && (eval 'x=a; x+=" b"; test "a b" = "$x"') 2>/dev/null \ - && _G_HAVE_PLUSEQ_OP=yes + if test -z "$_G_HAVE_PLUSEQ_OP" && \ + __PLUSEQ_TEST="a" && \ + __PLUSEQ_TEST+=" b" 2>/dev/null && \ + test "a b" = "$__PLUSEQ_TEST"; then + _G_HAVE_PLUSEQ_OP=yes + fi if test yes = "$_G_HAVE_PLUSEQ_OP" then @@ -2308,7 +2296,7 @@ include the following information: compiler: $LTCC compiler flags: $LTCFLAGS linker: $LD (gnu? $with_gnu_ld) - version: $progname $scriptversion Debian-2.4.7-4 + version: $progname $scriptversion Debian-2.4.7-7 automake: `($AUTOMAKE --version) 2>/dev/null |$SED 1q` autoconf: `($AUTOCONF --version) 2>/dev/null |$SED 1q` diff --git a/lib/c-ares-1.19.1/test/missing b/lib/c-ares-1.23.0/test/missing similarity index 100% rename from lib/c-ares-1.19.1/test/missing rename to lib/c-ares-1.23.0/test/missing diff --git a/lib/c-ares-1.19.1/test/test-driver b/lib/c-ares-1.23.0/test/test-driver similarity index 100% rename from lib/c-ares-1.19.1/test/test-driver rename to lib/c-ares-1.23.0/test/test-driver