aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/libs/c-ares
diff options
context:
space:
mode:
authorDevtools Arcadia <arcadia-devtools@yandex-team.ru>2022-02-07 18:08:42 +0300
committerDevtools Arcadia <arcadia-devtools@mous.vla.yp-c.yandex.net>2022-02-07 18:08:42 +0300
commit1110808a9d39d4b808aef724c861a2e1a38d2a69 (patch)
treee26c9fed0de5d9873cce7e00bc214573dc2195b7 /contrib/libs/c-ares
downloadydb-1110808a9d39d4b808aef724c861a2e1a38d2a69.tar.gz
intermediate changes
ref:cde9a383711a11544ce7e107a78147fb96cc4029
Diffstat (limited to 'contrib/libs/c-ares')
-rw-r--r--contrib/libs/c-ares/.yandex_meta/devtools.copyrights.report567
-rw-r--r--contrib/libs/c-ares/.yandex_meta/devtools.licenses.report241
-rw-r--r--contrib/libs/c-ares/.yandex_meta/licenses.list.txt373
-rw-r--r--contrib/libs/c-ares/AUTHORS84
-rw-r--r--contrib/libs/c-ares/CHANGES4723
-rw-r--r--contrib/libs/c-ares/INSTALL.md415
-rw-r--r--contrib/libs/c-ares/LICENSE.md15
-rw-r--r--contrib/libs/c-ares/NEWS21
-rw-r--r--contrib/libs/c-ares/README.cares15
-rw-r--r--contrib/libs/c-ares/README.md67
-rw-r--r--contrib/libs/c-ares/README.msvc142
-rw-r--r--contrib/libs/c-ares/RELEASE-NOTES30
-rw-r--r--contrib/libs/c-ares/RELEASE-PROCEDURE.md53
-rw-r--r--contrib/libs/c-ares/TODO23
-rw-r--r--contrib/libs/c-ares/acountry.c626
-rw-r--r--contrib/libs/c-ares/acountry/ya.make35
-rw-r--r--contrib/libs/c-ares/adig.c827
-rw-r--r--contrib/libs/c-ares/adig/ya.make35
-rw-r--r--contrib/libs/c-ares/ahost.c206
-rw-r--r--contrib/libs/c-ares/ahost/ya.make35
-rw-r--r--contrib/libs/c-ares/ares.h741
-rw-r--r--contrib/libs/c-ares/ares__close_sockets.c61
-rw-r--r--contrib/libs/c-ares/ares__get_hostent.c260
-rw-r--r--contrib/libs/c-ares/ares__parse_into_addrinfo.c266
-rw-r--r--contrib/libs/c-ares/ares__read_line.c73
-rw-r--r--contrib/libs/c-ares/ares__readaddrinfo.c260
-rw-r--r--contrib/libs/c-ares/ares__sortaddrinfo.c495
-rw-r--r--contrib/libs/c-ares/ares__timeval.c111
-rw-r--r--contrib/libs/c-ares/ares_android.c444
-rw-r--r--contrib/libs/c-ares/ares_android.h27
-rw-r--r--contrib/libs/c-ares/ares_build.h211
-rw-r--r--contrib/libs/c-ares/ares_cancel.c63
-rw-r--r--contrib/libs/c-ares/ares_config.h537
-rw-r--r--contrib/libs/c-ares/ares_create_query.c206
-rw-r--r--contrib/libs/c-ares/ares_data.c222
-rw-r--r--contrib/libs/c-ares/ares_data.h73
-rw-r--r--contrib/libs/c-ares/ares_destroy.c113
-rw-r--r--contrib/libs/c-ares/ares_dns.h103
-rw-r--r--contrib/libs/c-ares/ares_expand_name.c209
-rw-r--r--contrib/libs/c-ares/ares_expand_string.c70
-rw-r--r--contrib/libs/c-ares/ares_fds.c59
-rw-r--r--contrib/libs/c-ares/ares_free_hostent.c41
-rw-r--r--contrib/libs/c-ares/ares_free_string.c25
-rw-r--r--contrib/libs/c-ares/ares_freeaddrinfo.c57
-rw-r--r--contrib/libs/c-ares/ares_getaddrinfo.c765
-rw-r--r--contrib/libs/c-ares/ares_getenv.c28
-rw-r--r--contrib/libs/c-ares/ares_getenv.h26
-rw-r--r--contrib/libs/c-ares/ares_gethostbyaddr.c301
-rw-r--r--contrib/libs/c-ares/ares_gethostbyname.c537
-rw-r--r--contrib/libs/c-ares/ares_getnameinfo.c453
-rw-r--r--contrib/libs/c-ares/ares_getopt.c122
-rw-r--r--contrib/libs/c-ares/ares_getopt.h53
-rw-r--r--contrib/libs/c-ares/ares_getsock.c66
-rw-r--r--contrib/libs/c-ares/ares_inet_net_pton.h25
-rw-r--r--contrib/libs/c-ares/ares_init.c2646
-rw-r--r--contrib/libs/c-ares/ares_iphlpapi.h221
-rw-r--r--contrib/libs/c-ares/ares_ipv6.h85
-rw-r--r--contrib/libs/c-ares/ares_library_init.c201
-rw-r--r--contrib/libs/c-ares/ares_library_init.h43
-rw-r--r--contrib/libs/c-ares/ares_llist.c63
-rw-r--r--contrib/libs/c-ares/ares_llist.h39
-rw-r--r--contrib/libs/c-ares/ares_mkquery.c24
-rw-r--r--contrib/libs/c-ares/ares_nowarn.c260
-rw-r--r--contrib/libs/c-ares/ares_nowarn.h61
-rw-r--r--contrib/libs/c-ares/ares_options.c406
-rw-r--r--contrib/libs/c-ares/ares_parse_a_reply.c214
-rw-r--r--contrib/libs/c-ares/ares_parse_aaaa_reply.c217
-rw-r--r--contrib/libs/c-ares/ares_parse_mx_reply.c172
-rw-r--r--contrib/libs/c-ares/ares_parse_naptr_reply.c196
-rw-r--r--contrib/libs/c-ares/ares_parse_ns_reply.c183
-rw-r--r--contrib/libs/c-ares/ares_parse_ptr_reply.c236
-rw-r--r--contrib/libs/c-ares/ares_parse_soa_reply.c185
-rw-r--r--contrib/libs/c-ares/ares_parse_srv_reply.c181
-rw-r--r--contrib/libs/c-ares/ares_parse_txt_reply.c222
-rw-r--r--contrib/libs/c-ares/ares_platform.c11042
-rw-r--r--contrib/libs/c-ares/ares_platform.h43
-rw-r--r--contrib/libs/c-ares/ares_private.h430
-rw-r--r--contrib/libs/c-ares/ares_process.c1496
-rw-r--r--contrib/libs/c-ares/ares_query.c186
-rw-r--r--contrib/libs/c-ares/ares_rules.h125
-rw-r--r--contrib/libs/c-ares/ares_search.c321
-rw-r--r--contrib/libs/c-ares/ares_send.c137
-rw-r--r--contrib/libs/c-ares/ares_setup.h217
-rw-r--r--contrib/libs/c-ares/ares_strcasecmp.c66
-rw-r--r--contrib/libs/c-ares/ares_strcasecmp.h30
-rw-r--r--contrib/libs/c-ares/ares_strdup.c49
-rw-r--r--contrib/libs/c-ares/ares_strdup.h24
-rw-r--r--contrib/libs/c-ares/ares_strerror.c56
-rw-r--r--contrib/libs/c-ares/ares_strsplit.c174
-rw-r--r--contrib/libs/c-ares/ares_strsplit.h43
-rw-r--r--contrib/libs/c-ares/ares_timeout.c88
-rw-r--r--contrib/libs/c-ares/ares_version.c11
-rw-r--r--contrib/libs/c-ares/ares_version.h24
-rw-r--r--contrib/libs/c-ares/ares_writev.c79
-rw-r--r--contrib/libs/c-ares/ares_writev.h36
-rw-r--r--contrib/libs/c-ares/atomic.cpp13
-rw-r--r--contrib/libs/c-ares/atomic.h15
-rw-r--r--contrib/libs/c-ares/bitncmp.c59
-rw-r--r--contrib/libs/c-ares/bitncmp.h26
-rw-r--r--contrib/libs/c-ares/config-dos.h108
-rw-r--r--contrib/libs/c-ares/config-win32.h357
-rw-r--r--contrib/libs/c-ares/inet_net_pton.c450
-rw-r--r--contrib/libs/c-ares/inet_ntop.c207
-rw-r--r--contrib/libs/c-ares/nameser.h211
-rw-r--r--contrib/libs/c-ares/setup_once.h554
-rw-r--r--contrib/libs/c-ares/test/ares-test-ai.h57
-rw-r--r--contrib/libs/c-ares/test/ares-test-init.cc703
-rw-r--r--contrib/libs/c-ares/test/ares-test-internal.cc591
-rw-r--r--contrib/libs/c-ares/test/ares-test-live.cc749
-rw-r--r--contrib/libs/c-ares/test/ares-test-misc.cc526
-rw-r--r--contrib/libs/c-ares/test/ares-test-mock-ai.cc723
-rw-r--r--contrib/libs/c-ares/test/ares-test-mock.cc1173
-rw-r--r--contrib/libs/c-ares/test/ares-test-ns.cc199
-rw-r--r--contrib/libs/c-ares/test/ares-test-parse-a.cc378
-rw-r--r--contrib/libs/c-ares/test/ares-test-parse-aaaa.cc192
-rw-r--r--contrib/libs/c-ares/test/ares-test-parse-mx.cc141
-rw-r--r--contrib/libs/c-ares/test/ares-test-parse-naptr.cc148
-rw-r--r--contrib/libs/c-ares/test/ares-test-parse-ns.cc119
-rw-r--r--contrib/libs/c-ares/test/ares-test-parse-ptr.cc249
-rw-r--r--contrib/libs/c-ares/test/ares-test-parse-soa-any.cc111
-rw-r--r--contrib/libs/c-ares/test/ares-test-parse-soa.cc108
-rw-r--r--contrib/libs/c-ares/test/ares-test-parse-srv.cc288
-rw-r--r--contrib/libs/c-ares/test/ares-test-parse-txt.cc266
-rw-r--r--contrib/libs/c-ares/test/ares-test-parse.cc219
-rw-r--r--contrib/libs/c-ares/test/ares-test.cc772
-rw-r--r--contrib/libs/c-ares/test/ares-test.h489
-rw-r--r--contrib/libs/c-ares/test/config.h81
-rw-r--r--contrib/libs/c-ares/test/dns-proto-test.cc131
-rw-r--r--contrib/libs/c-ares/test/dns-proto.cc638
-rw-r--r--contrib/libs/c-ares/test/dns-proto.h242
-rw-r--r--contrib/libs/c-ares/test/ya.make60
-rw-r--r--contrib/libs/c-ares/windows_port.c22
-rw-r--r--contrib/libs/c-ares/ya.make120
133 files changed, 47663 insertions, 0 deletions
diff --git a/contrib/libs/c-ares/.yandex_meta/devtools.copyrights.report b/contrib/libs/c-ares/.yandex_meta/devtools.copyrights.report
new file mode 100644
index 0000000000..6bdabafb4e
--- /dev/null
+++ b/contrib/libs/c-ares/.yandex_meta/devtools.copyrights.report
@@ -0,0 +1,567 @@
+# File format ($ symbol means the beginning of a line):
+#
+# $ # this message
+# $ # =======================
+# $ # comments (all commentaries should starts with some number of spaces and # symbol)
+# ${action} {license id} {license text hash}
+# $BELONGS ./ya/make/file/relative/path/1/ya.make ./ya/make/2/ya.make
+# ${all_file_action} filename
+# $ # user commentaries (many lines)
+# $ generated description - files with this license, license text... (some number of lines that starts with some number of spaces, do not modify)
+# ${action} {license spdx} {license text hash}
+# $BELONGS ./ya/make/file/relative/path/3/ya.make
+# ${all_file_action} filename
+# $ # user commentaries
+# $ generated description
+# $ ...
+#
+# You can modify action, all_file_action and add commentaries
+# Available actions:
+# keep - keep license in contrib and use in credits
+# skip - skip license
+# remove - remove all files with this license
+# rename - save license text/links into licenses texts file, but not store SPDX into LINCENSE macro. You should store correct license id into devtools.license.spdx.txt file
+#
+# {all file action} records will be generated when license text contains filename that exists on filesystem (in contrib directory)
+# We suppose that that files can contain some license info
+# Available all file actions:
+# FILE_IGNORE - ignore file (do nothing)
+# FILE_INCLUDE - include all file data into licenses text file
+# =======================
+
+KEEP COPYRIGHT_SERVICE_LABEL 0c8a1cf68858d1e962f504ab83eccd7b
+BELONGS ya.make
+ License text:
+ /* Copyright (C) 2008 by Daniel Stenberg et al
+ Scancode info:
+ Original SPDX id: COPYRIGHT_SERVICE_LABEL
+ Score : 100.00
+ Match type : COPYRIGHT
+ Files with this license:
+ ares__timeval.c [2:2]
+
+KEEP COPYRIGHT_SERVICE_LABEL 10b55a7cc97df49af59c0048d4bde011
+BELONGS ya.make
+ License text:
+ /* Copyright (C) 2004 - 2013 by Daniel Stenberg et al
+ Scancode info:
+ Original SPDX id: COPYRIGHT_SERVICE_LABEL
+ Score : 100.00
+ Match type : COPYRIGHT
+ Files with this license:
+ setup_once.h [5:5]
+
+KEEP COPYRIGHT_SERVICE_LABEL 11cb9c51a7d25a6cf94b8ab8e8b0ebca
+BELONGS ya.make
+ License text:
+ /* Copyright (C) 2004 by Daniel Stenberg et al
+ Scancode info:
+ Original SPDX id: COPYRIGHT_SERVICE_LABEL
+ Score : 100.00
+ Match type : COPYRIGHT
+ Files with this license:
+ ares_cancel.c [2:2]
+
+KEEP COPYRIGHT_SERVICE_LABEL 169a51bc2a181587c3cadfcf8c1d7365
+BELONGS ya.make
+ License text:
+ * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (c) 1996,1999 by Internet Software Consortium.
+ Scancode info:
+ Original SPDX id: COPYRIGHT_SERVICE_LABEL
+ Score : 100.00
+ Match type : COPYRIGHT
+ Files with this license:
+ bitncmp.c [3:4]
+ inet_net_pton.c [3:4]
+
+KEEP COPYRIGHT_SERVICE_LABEL 197bc139b0875c9ed5c9a13d6b10277d
+BELONGS ya.make
+ License text:
+ /* Copyright 1998 by the Massachusetts Institute of Technology.
+ * Copyright (C) 2012 Marko Kreen <markokr@gmail.com>
+ Scancode info:
+ Original SPDX id: COPYRIGHT_SERVICE_LABEL
+ Score : 100.00
+ Match type : COPYRIGHT
+ Files with this license:
+ ares_parse_soa_reply.c [2:3]
+
+KEEP COPYRIGHT_SERVICE_LABEL 1df92f5df82e664143819a7cb7c5f4f9
+BELONGS ya.make
+ License text:
+ /* Copyright (C) 2018 by John Schember <john@nachtimwald.com>
+ Scancode info:
+ Original SPDX id: COPYRIGHT_SERVICE_LABEL
+ Score : 100.00
+ Match type : COPYRIGHT
+ Files with this license:
+ ares_strsplit.c [1:1]
+ ares_strsplit.h [4:4]
+
+KEEP COPYRIGHT_SERVICE_LABEL 2137ea611b92d236da2a5d451d33b93c
+BELONGS ya.make
+ License text:
+ /* Copyright 1998 by the Massachusetts Institute of Technology.
+ * Copyright (C) 2007-2013 by Daniel Stenberg
+ Scancode info:
+ Original SPDX id: COPYRIGHT_SERVICE_LABEL
+ Score : 100.00
+ Match type : COPYRIGHT
+ Files with this license:
+ ares.h [2:3]
+ ares_init.c [2:3]
+
+KEEP COPYRIGHT_SERVICE_LABEL 262113e46b31087a933d5d22436ca7d9
+BELONGS ya.make
+ License text:
+ /* Copyright (C) 2010-2013 by Daniel Stenberg
+ Scancode info:
+ Original SPDX id: COPYRIGHT_SERVICE_LABEL
+ Score : 100.00
+ Match type : COPYRIGHT
+ Files with this license:
+ ares_nowarn.c [2:2]
+
+KEEP COPYRIGHT_SERVICE_LABEL 273212e34b861a3a897a3b3d79010d78
+BELONGS ya.make
+ License text:
+ /* Copyright 1998 by the Massachusetts Institute of Technology.
+ Scancode info:
+ Original SPDX id: COPYRIGHT_SERVICE_LABEL
+ Score : 100.00
+ Match type : COPYRIGHT
+ Files with this license:
+ LICENSE.md [6:6]
+ adig.c [1:1]
+ ahost.c [1:1]
+ ares.h [2:3]
+ ares__close_sockets.c [2:2]
+ ares__read_line.c [2:2]
+ ares_create_query.c [2:2]
+ ares_destroy.c [2:3]
+ ares_expand_string.c [2:2]
+ ares_fds.c [2:2]
+ ares_free_hostent.c [2:2]
+ ares_freeaddrinfo.c [2:3]
+ ares_getenv.c [3:3]
+ ares_getenv.h [5:5]
+ ares_gethostbyaddr.c [2:2]
+ ares_init.c [2:3]
+ ares_iphlpapi.h [4:5]
+ ares_library_init.c [2:3]
+ ares_library_init.h [5:6]
+ ares_llist.c [2:2]
+ ares_llist.h [5:5]
+ ares_mkquery.c [2:2]
+ ares_options.c [2:3]
+ ares_parse_a_reply.c [2:3]
+ ares_parse_aaaa_reply.c [2:4]
+ ares_parse_mx_reply.c [2:3]
+ ares_parse_naptr_reply.c [2:3]
+ ares_parse_ns_reply.c [1:1]
+ ares_parse_ptr_reply.c [2:2]
+ ares_parse_soa_reply.c [2:3]
+ ares_parse_srv_reply.c [2:3]
+ ares_parse_txt_reply.c [2:3]
+ ares_platform.c [3:4]
+ ares_platform.h [5:6]
+ ares_private.h [5:6]
+ ares_process.c [2:3]
+ ares_query.c [2:2]
+ ares_search.c [2:2]
+ ares_send.c [2:2]
+ ares_strcasecmp.c [3:3]
+ ares_strcasecmp.h [5:5]
+ ares_strdup.c [3:3]
+ ares_strdup.h [5:5]
+ ares_strerror.c [2:2]
+ ares_timeout.c [2:2]
+ ares_writev.c [3:3]
+ ares_writev.h [5:5]
+
+KEEP COPYRIGHT_SERVICE_LABEL 3509a10f633c37ef3ea5b58e8e1f63cd
+BELONGS ya.make
+ License text:
+ /* Copyright (C) 2017 by John Schember <john@nachtimwald.com>
+ Scancode info:
+ Original SPDX id: COPYRIGHT_SERVICE_LABEL
+ Score : 100.00
+ Match type : COPYRIGHT
+ Files with this license:
+ ares_android.c [1:1]
+ ares_android.h [1:1]
+
+KEEP COPYRIGHT_SERVICE_LABEL 36e0c20612ef44672b8c101f54c9621f
+BELONGS ya.make
+ License text:
+ /* Copyright (C) 2009 - 2013 by Daniel Stenberg et al
+ Scancode info:
+ Original SPDX id: COPYRIGHT_SERVICE_LABEL
+ Score : 100.00
+ Match type : COPYRIGHT
+ Files with this license:
+ ares_build.h [5:5]
+
+KEEP COPYRIGHT_SERVICE_LABEL 5004d990e89284bd48e9ce9bb40b3a5b
+BELONGS ya.make
+FILE_INCLUDE AUTHORS found in files: LICENSE.md at line 3
+ License text:
+ Copyright (c) 2007 - 2018, Daniel Stenberg with many contributors, see AUTHORS
+ file.
+ Scancode info:
+ Original SPDX id: COPYRIGHT_SERVICE_LABEL
+ Score : 100.00
+ Match type : COPYRIGHT
+ Files with this license:
+ LICENSE.md [3:4]
+
+KEEP COPYRIGHT_SERVICE_LABEL 52a25da2e78d5a5a08ea50965ea267de
+BELONGS ya.make
+ License text:
+ /* Copyright 1998 by the Massachusetts Institute of Technology.
+ * Copyright (C) 2008-2013 by Daniel Stenberg
+ Scancode info:
+ Original SPDX id: COPYRIGHT_SERVICE_LABEL
+ Score : 100.00
+ Match type : COPYRIGHT
+ Files with this license:
+ ares_options.c [2:3]
+
+KEEP COPYRIGHT_SERVICE_LABEL 53434b80510655ef693d399872a7c5bd
+BELONGS ya.make
+ License text:
+ /* Copyright (C) 2004 - 2012 by Daniel Stenberg et al
+ Scancode info:
+ Original SPDX id: COPYRIGHT_SERVICE_LABEL
+ Score : 100.00
+ Match type : COPYRIGHT
+ Files with this license:
+ ares_setup.h [5:5]
+
+KEEP COPYRIGHT_SERVICE_LABEL 5f067d54fe1e500a2cb713d2e2287b9b
+BELONGS ya.make
+ License text:
+ /* Copyright (C) 2005 by Dominick Meglio
+ Scancode info:
+ Original SPDX id: COPYRIGHT_SERVICE_LABEL
+ Score : 100.00
+ Match type : COPYRIGHT
+ Files with this license:
+ ares_ipv6.h [2:2]
+
+KEEP COPYRIGHT_SERVICE_LABEL 5f90192afbbac5ac79d2247d1086821d
+BELONGS ya.make
+ License text:
+ /* Copyright (C) 2005 - 2010, Daniel Stenberg
+ Scancode info:
+ Original SPDX id: COPYRIGHT_SERVICE_LABEL
+ Score : 100.00
+ Match type : COPYRIGHT
+ Files with this license:
+ ares_getsock.c [2:2]
+
+KEEP COPYRIGHT_SERVICE_LABEL 6cfebc210ef2316327cd15d9ca411fb8
+BELONGS ya.make
+ License text:
+ /* Copyright 2000 by the Massachusetts Institute of Technology.
+ Scancode info:
+ Original SPDX id: COPYRIGHT_SERVICE_LABEL
+ Score : 100.00
+ Match type : COPYRIGHT
+ Files with this license:
+ ares_free_string.c [2:2]
+
+KEEP COPYRIGHT_SERVICE_LABEL 6f8dc4ed13eb3fa6c0c49d4470aa3de0
+BELONGS ya.make
+ License text:
+ /* Copyright (C) 2009-2013 by Daniel Stenberg
+ Scancode info:
+ Original SPDX id: COPYRIGHT_SERVICE_LABEL
+ Score : 100.00
+ Match type : COPYRIGHT
+ Files with this license:
+ ares_data.c [2:2]
+ ares_data.h [3:3]
+
+KEEP COPYRIGHT_SERVICE_LABEL 772d70e950c69b1a32c0a0047f47ee2d
+BELONGS ya.make
+ License text:
+ * 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.
+ Scancode info:
+ Original SPDX id: COPYRIGHT_SERVICE_LABEL
+ Score : 100.00
+ Match type : COPYRIGHT
+ Files with this license:
+ ares__sortaddrinfo.c [7:10]
+
+KEEP COPYRIGHT_SERVICE_LABEL 78db66be56803e72faf0c0319b5841bb
+BELONGS ya.make
+ License text:
+ * 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.
+ Scancode info:
+ Original SPDX id: COPYRIGHT_SERVICE_LABEL
+ Score : 100.00
+ Match type : COPYRIGHT
+ Files with this license:
+ ares__sortaddrinfo.c [7:10]
+
+KEEP COPYRIGHT_SERVICE_LABEL 818af009e3d88bab8f05d07b4c25e8cf
+BELONGS ya.make
+ License text:
+ /* Copyright (C) 2019 by Andrew Selivanov
+ Scancode info:
+ Original SPDX id: COPYRIGHT_SERVICE_LABEL
+ Score : 100.00
+ Match type : COPYRIGHT
+ Files with this license:
+ ares__parse_into_addrinfo.c [1:1]
+ ares__readaddrinfo.c [1:1]
+ ares__sortaddrinfo.c [7:10]
+ ares_freeaddrinfo.c [2:3]
+ ares_getaddrinfo.c [2:4]
+ ares_parse_a_reply.c [2:3]
+ ares_parse_aaaa_reply.c [2:4]
+
+KEEP COPYRIGHT_SERVICE_LABEL 858a33312b71a39ee1b37595088bfefd
+BELONGS ya.make
+ License text:
+ * Copyright (c) 1987-2001 The Regents of the University of California.
+ * All rights reserved.
+ Scancode info:
+ Original SPDX id: COPYRIGHT_SERVICE_LABEL
+ Score : 100.00
+ Match type : COPYRIGHT
+ Files with this license:
+ ares_getopt.c [13:14]
+ ares_getopt.h [5:6]
+
+KEEP COPYRIGHT_SERVICE_LABEL 8ae1c43ff019af5b271d587918d91bbf
+BELONGS ya.make
+ License text:
+ /* Copyright 2005 by Dominick Meglio
+ Scancode info:
+ Original SPDX id: COPYRIGHT_SERVICE_LABEL
+ Score : 100.00
+ Match type : COPYRIGHT
+ Files with this license:
+ ares_getnameinfo.c [2:2]
+
+KEEP COPYRIGHT_SERVICE_LABEL 9a9a1a42112fccd2a848bb7f21bef0d9
+BELONGS ya.make
+ License text:
+ /* Copyright (C) 2005-2013 by Daniel Stenberg et al
+ Scancode info:
+ Original SPDX id: COPYRIGHT_SERVICE_LABEL
+ Score : 100.00
+ Match type : COPYRIGHT
+ Files with this license:
+ ares_inet_net_pton.h [4:4]
+
+KEEP COPYRIGHT_SERVICE_LABEL a3b944a0c944a5828d7421d9404d38f7
+BELONGS ya.make
+ License text:
+ /* Copyright (C) 2010-2012 by Daniel Stenberg
+ Scancode info:
+ Original SPDX id: COPYRIGHT_SERVICE_LABEL
+ Score : 100.00
+ Match type : COPYRIGHT
+ Files with this license:
+ ares_nowarn.h [5:5]
+
+KEEP COPYRIGHT_SERVICE_LABEL a568c02a238334a6de16619a72ac7ff7
+BELONGS ya.make
+ License text:
+ /* Copyright 1998 by the Massachusetts Institute of Technology.
+ * Copyright (C) 2004-2010 by Daniel Stenberg
+ Scancode info:
+ Original SPDX id: COPYRIGHT_SERVICE_LABEL
+ Score : 100.00
+ Match type : COPYRIGHT
+ Files with this license:
+ ares_private.h [5:6]
+
+KEEP COPYRIGHT_SERVICE_LABEL afb0570805cf884116abf4b791a0efe7
+BELONGS ya.make
+ License text:
+ /* Copyright 1998 by the Massachusetts Institute of Technology.
+ * Copyright (C) 2004-2009 by Daniel Stenberg
+ Scancode info:
+ Original SPDX id: COPYRIGHT_SERVICE_LABEL
+ Score : 100.00
+ Match type : COPYRIGHT
+ Files with this license:
+ ares_library_init.c [2:3]
+
+KEEP COPYRIGHT_SERVICE_LABEL b0401879c04c8b03acc6e1099d200e3f
+BELONGS ya.make
+ License text:
+ /* Copyright 1998 by the Massachusetts Institute of Technology.
+ * Copyright (C) 2004 - 2011 by Daniel Stenberg et al
+ Scancode info:
+ Original SPDX id: COPYRIGHT_SERVICE_LABEL
+ Score : 100.00
+ Match type : COPYRIGHT
+ Files with this license:
+ ares_iphlpapi.h [4:5]
+ ares_platform.c [3:4]
+ ares_platform.h [5:6]
+ config-win32.h [4:4]
+
+KEEP COPYRIGHT_SERVICE_LABEL b0ba0e82ac2b1e74adc884bf65ffb51a
+BELONGS ya.make
+ License text:
+ * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (c) 1996-1999 by Internet Software Consortium.
+ Scancode info:
+ Original SPDX id: COPYRIGHT_SERVICE_LABEL
+ Score : 100.00
+ Match type : COPYRIGHT
+ Files with this license:
+ inet_ntop.c [2:3]
+
+KEEP COPYRIGHT_SERVICE_LABEL b6e3440218c70084f1def8f904dffe48
+BELONGS ya.make
+ License text:
+ /* Copyright 1998, 2011, 2013 by the Massachusetts Institute of Technology.
+ * Copyright (C) 2017 - 2018 by Christian Ammer
+ * Copyright (C) 2019 by Andrew Selivanov
+ Scancode info:
+ Original SPDX id: COPYRIGHT_SERVICE_LABEL
+ Score : 100.00
+ Match type : COPYRIGHT
+ Files with this license:
+ ares_getaddrinfo.c [2:4]
+
+KEEP COPYRIGHT_SERVICE_LABEL b9d942504b76ee4af145da2bda5c940a
+BELONGS ya.make
+ License text:
+ /* Copyright 1998 by the Massachusetts Institute of Technology.
+ * Copyright (C) 2009 by Jakub Hrozek <jhrozek@redhat.com>
+ Scancode info:
+ Original SPDX id: COPYRIGHT_SERVICE_LABEL
+ Score : 100.00
+ Match type : COPYRIGHT
+ Files with this license:
+ ares_parse_naptr_reply.c [2:3]
+ ares_parse_srv_reply.c [2:3]
+ ares_parse_txt_reply.c [2:3]
+
+KEEP COPYRIGHT_SERVICE_LABEL bcc03fa52028dbfcb64258cda21f5729
+BELONGS ya.make
+ License text:
+ /* Copyright 1998, 2011, 2013 by the Massachusetts Institute of Technology.
+ * Copyright (C) 2017 - 2018 by Christian Ammer
+ * Copyright (C) 2019 by Andrew Selivanov
+ Scancode info:
+ Original SPDX id: COPYRIGHT_SERVICE_LABEL
+ Score : 100.00
+ Match type : COPYRIGHT
+ Files with this license:
+ ares_getaddrinfo.c [2:4]
+ ares_gethostbyname.c [2:2]
+
+KEEP COPYRIGHT_SERVICE_LABEL c77c02a30f970451b71b72c5c8d97a70
+BELONGS ya.make
+ License text:
+ * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (c) 1996,1999 by Internet Software Consortium.
+ Scancode info:
+ Original SPDX id: COPYRIGHT_SERVICE_LABEL
+ Score : 100.00
+ Match type : COPYRIGHT
+ Files with this license:
+ bitncmp.c [3:4]
+ inet_net_pton.c [3:4]
+ inet_ntop.c [2:3]
+
+KEEP COPYRIGHT_SERVICE_LABEL d7e79df2fb60fa6a9086795cf0689476
+BELONGS ya.make
+ License text:
+ /* Copyright 1998 by the Massachusetts Institute of Technology.
+ * Copyright (C) 2004-2017 by Daniel Stenberg
+ Scancode info:
+ Original SPDX id: COPYRIGHT_SERVICE_LABEL
+ Score : 100.00
+ Match type : COPYRIGHT
+ Files with this license:
+ ares_process.c [2:3]
+
+KEEP COPYRIGHT_SERVICE_LABEL dc76a81a0c03b8441f73046ca98ec618
+BELONGS ya.make
+ License text:
+ /* Copyright 1998, 2011 by the Massachusetts Institute of Technology.
+ Scancode info:
+ Original SPDX id: COPYRIGHT_SERVICE_LABEL
+ Score : 100.00
+ Match type : COPYRIGHT
+ Files with this license:
+ ares__get_hostent.c [2:2]
+ ares_dns.h [4:4]
+ ares_expand_name.c [2:2]
+
+KEEP COPYRIGHT_SERVICE_LABEL e19b1fdec502261b9ee3ba3c783dff6a
+BELONGS ya.make
+ License text:
+ /* Copyright (C) 2005, 2013 by Dominick Meglio
+ Scancode info:
+ Original SPDX id: COPYRIGHT_SERVICE_LABEL
+ Score : 100.00
+ Match type : COPYRIGHT
+ Files with this license:
+ bitncmp.h [5:5]
+
+KEEP COPYRIGHT_SERVICE_LABEL e59ec63e75bc26555dd9975fa20bc106
+BELONGS ya.make
+ License text:
+ /* Copyright 1998 by the Massachusetts Institute of Technology.
+ * Copyright (C) 2004-2011 by Daniel Stenberg
+ Scancode info:
+ Original SPDX id: COPYRIGHT_SERVICE_LABEL
+ Score : 100.00
+ Match type : COPYRIGHT
+ Files with this license:
+ ares_destroy.c [2:3]
+ ares_library_init.h [5:6]
+
+KEEP COPYRIGHT_SERVICE_LABEL f45f5e8d185e83841a63b09b70acd62e
+BELONGS ya.make
+ License text:
+ /* Copyright 1998 by the Massachusetts Institute of Technology.
+ * Copyright 2005 Dominick Meglio
+ * Copyright (C) 2019 by Andrew Selivanov
+ Scancode info:
+ Original SPDX id: COPYRIGHT_SERVICE_LABEL
+ Score : 100.00
+ Match type : COPYRIGHT
+ Files with this license:
+ ares_parse_aaaa_reply.c [2:4]
+
+KEEP COPYRIGHT_SERVICE_LABEL fa370f4b5a3cba203c6d792417971cd0
+BELONGS ya.make
+ License text:
+ /* Copyright (C) 2009 by Daniel Stenberg et al
+ Scancode info:
+ Original SPDX id: COPYRIGHT_SERVICE_LABEL
+ Score : 100.00
+ Match type : COPYRIGHT
+ Files with this license:
+ ares_rules.h [5:5]
+
+KEEP COPYRIGHT_SERVICE_LABEL ff854425f10eb762ddab3947b08deada
+BELONGS ya.make
+ License text:
+ /* Copyright 1998 by the Massachusetts Institute of Technology.
+ * Copyright (C) 2010 Jeremy Lal <kapouer@melix.org>
+ Scancode info:
+ Original SPDX id: COPYRIGHT_SERVICE_LABEL
+ Score : 100.00
+ Match type : COPYRIGHT
+ Files with this license:
+ ares_parse_mx_reply.c [2:3]
diff --git a/contrib/libs/c-ares/.yandex_meta/devtools.licenses.report b/contrib/libs/c-ares/.yandex_meta/devtools.licenses.report
new file mode 100644
index 0000000000..4d51de6f86
--- /dev/null
+++ b/contrib/libs/c-ares/.yandex_meta/devtools.licenses.report
@@ -0,0 +1,241 @@
+# File format ($ symbol means the beginning of a line):
+#
+# $ # this message
+# $ # =======================
+# $ # comments (all commentaries should starts with some number of spaces and # symbol)
+# ${action} {license spdx} {license text hash}
+# $BELONGS ./ya/make/file/relative/path/1/ya.make ./ya/make/2/ya.make
+# ${all_file_action} filename
+# $ # user commentaries (many lines)
+# $ generated description - files with this license, license text... (some number of lines that starts with some number of spaces, do not modify)
+# ${action} {license spdx} {license text hash}
+# $BELONGS ./ya/make/file/relative/path/3/ya.make
+# ${all_file_action} filename
+# $ # user commentaries
+# $ generated description
+# $ ...
+#
+# You can modify action, all_file_action and add commentaries
+# Available actions:
+# keep - keep license in contrib and use in credits
+# skip - skip license
+# remove - remove all files with this license
+# rename - save license text/links into licenses texts file, but not store SPDX into LINCENSE macro. You should store correct license id into devtools.license.spdx.txt file
+#
+# {all file action} records will be generated when license text contains filename that exists on filesystem (in contrib directory)
+# We suppose that that files can contain some license info
+# Available all file actions:
+# FILE_IGNORE - ignore file (do nothing)
+# FILE_INCLUDE - include all file data into licenses text file
+# =======================
+
+KEEP ISC 496ba8557c8105b63a14ddbb272cca56
+BELONGS ya.make
+ Note: matched license text is too long. Read it in the source files.
+ Scancode info:
+ Original SPDX id: ISC
+ Score : 100.00
+ Match type : TEXT
+ Links : http://fedoraproject.org/wiki/Licensing:MIT#Old_Style_with_legal_disclaimer_2, https://spdx.org/licenses/ISC, https://www.isc.org/software/license
+ Files with this license:
+ bitncmp.c [6:16]
+ inet_net_pton.c [6:16]
+ inet_ntop.c [5:15]
+
+KEEP NTP 53568816d1ddf46f15453c6991d855a9
+BELONGS ya.make
+ Note: matched license text is too long. Read it in the source files.
+ Scancode info:
+ Original SPDX id: NTP
+ Score : 100.00
+ Match type : TEXT
+ Links : http://fedoraproject.org/wiki/Licensing:MIT#Old_Style_.28no_advertising_without_permission.29, https://spdx.org/licenses/NTP
+ Files with this license:
+ acountry.c [22:32]
+ adig.c [4:14]
+ ahost.c [4:14]
+ ares.h [5:15]
+ ares__close_sockets.c [4:14]
+ ares__get_hostent.c [4:14]
+ ares__parse_into_addrinfo.c [3:13]
+ ares__read_line.c [4:14]
+ ares__readaddrinfo.c [3:13]
+ ares_android.c [3:13]
+ ares_android.h [3:13]
+ ares_create_query.c [4:14]
+ ares_data.c [4:14]
+ ares_data.h [5:15]
+ ares_destroy.c [5:15]
+ ares_dns.h [6:16]
+ ares_expand_name.c [4:14]
+ ares_expand_string.c [4:14]
+ ares_fds.c [4:14]
+ ares_free_hostent.c [4:14]
+ ares_free_string.c [4:14]
+ ares_freeaddrinfo.c [5:15]
+ ares_getaddrinfo.c [6:16]
+ ares_getenv.c [5:15]
+ ares_getenv.h [7:17]
+ ares_gethostbyaddr.c [4:14]
+ ares_gethostbyname.c [4:14]
+ ares_getnameinfo.c [4:14]
+ ares_inet_net_pton.h [6:16]
+ ares_init.c [5:15]
+ ares_iphlpapi.h [7:17]
+ ares_ipv6.h [4:14]
+ ares_library_init.c [5:15]
+ ares_library_init.h [8:18]
+ ares_llist.c [4:14]
+ ares_llist.h [7:17]
+ ares_mkquery.c [4:14]
+ ares_nowarn.c [4:14]
+ ares_nowarn.h [7:17]
+ ares_options.c [5:15]
+ ares_parse_a_reply.c [5:15]
+ ares_parse_aaaa_reply.c [6:16]
+ ares_parse_mx_reply.c [5:15]
+ ares_parse_naptr_reply.c [5:15]
+ ares_parse_ns_reply.c [3:13]
+ ares_parse_ptr_reply.c [4:14]
+ ares_parse_soa_reply.c [5:15]
+ ares_parse_srv_reply.c [5:15]
+ ares_parse_txt_reply.c [5:15]
+ ares_platform.c [6:16]
+ ares_platform.h [8:18]
+ ares_private.h [8:18]
+ ares_process.c [5:15]
+ ares_query.c [4:14]
+ ares_search.c [4:14]
+ ares_send.c [4:14]
+ ares_strcasecmp.c [5:15]
+ ares_strcasecmp.h [7:17]
+ ares_strdup.c [5:15]
+ ares_strdup.h [7:17]
+ ares_strerror.c [4:14]
+ ares_strsplit.c [3:13]
+ ares_strsplit.h [6:16]
+ ares_timeout.c [4:14]
+ ares_writev.c [5:15]
+ ares_writev.h [7:17]
+ bitncmp.h [7:17]
+
+KEEP BSD-3-Clause 6899d7bb10667745c38e41e3f295c45d
+BELONGS ya.make
+ License text:
+ * the modified BSD license, BSD license without the advertising clause.
+ Scancode info:
+ Original SPDX id: BSD-3-Clause
+ Score : 100.00
+ Match type : REFERENCE
+ Links : http://www.opensource.org/licenses/BSD-3-Clause, https://spdx.org/licenses/BSD-3-Clause
+ Files with this license:
+ ares_getopt.c [4:4]
+ Scancode info:
+ Original SPDX id: BSD-3-Clause
+ Score : 99.00
+ Match type : REFERENCE
+ Links : http://www.opensource.org/licenses/BSD-3-Clause, https://spdx.org/licenses/BSD-3-Clause
+ Files with this license:
+ ares_getopt.c [4:4]
+ Scancode info:
+ Original SPDX id: LicenseRef-scancode-unknown
+ Score : 11.00
+ Match type : REFERENCE
+ Links : https://github.com/nexB/scancode-toolkit/tree/develop/src/licensedcode/data/licenses/unknown.LICENSE
+ Files with this license:
+ ares_getopt.c [4:4]
+
+KEEP NTP 8fab855584c6999b237d25f7252d2d73
+BELONGS ya.make
+ Note: matched license text is too long. Read it in the source files.
+ Scancode info:
+ Original SPDX id: NTP
+ Score : 100.00
+ Match type : TEXT
+ Links : http://fedoraproject.org/wiki/Licensing:MIT#Old_Style_.28no_advertising_without_permission.29, https://spdx.org/licenses/NTP
+ Files with this license:
+ ares__timeval.c [4:12]
+ ares_build.h [7:15]
+ ares_cancel.c [4:12]
+ ares_getsock.c [4:12]
+ ares_rules.h [7:15]
+ ares_setup.h [7:15]
+ config-win32.h [6:14]
+ setup_once.h [7:15]
+
+KEEP MIT 94890220f883df92236a2e64421f8224
+BELONGS ya.make
+ License text:
+ Just the MIT license used in the top the source files moved out to a
+ Scancode info:
+ Original SPDX id: MIT
+ Score : 100.00
+ Match type : REFERENCE
+ Links : http://opensource.org/licenses/mit-license.php, https://spdx.org/licenses/MIT
+ Files with this license:
+ CHANGES [1622:1622]
+
+KEEP BSD-3-Clause 9d018aaf6e89baa34c9bc9407e762114
+BELONGS ya.make
+ License text:
+ * Lifted from the 'Android Bionic' project with the BSD license.
+ Scancode info:
+ Original SPDX id: BSD-3-Clause
+ Score : 99.00
+ Match type : REFERENCE
+ Links : http://www.opensource.org/licenses/BSD-3-Clause, https://spdx.org/licenses/BSD-3-Clause
+ Files with this license:
+ ares__sortaddrinfo.c [3:3]
+
+KEEP BSD-3-Clause 9f9f74951499b982d601e33ab0c03bed
+BELONGS ya.make
+ Note: matched license text is too long. Read it in the source files.
+ Scancode info:
+ Original SPDX id: BSD-3-Clause
+ Score : 100.00
+ Match type : TEXT
+ Links : http://www.opensource.org/licenses/BSD-3-Clause, https://spdx.org/licenses/BSD-3-Clause
+ Files with this license:
+ ares__sortaddrinfo.c [12:34]
+
+KEEP BSD-3-Clause cd98e0ba1ce0a730d60166f40b0e63b5
+BELONGS ya.make
+ Note: matched license text is too long. Read it in the source files.
+ Scancode info:
+ Original SPDX id: BSD-3-Clause
+ Score : 99.07
+ Match type : TEXT
+ Links : http://www.opensource.org/licenses/BSD-3-Clause, https://spdx.org/licenses/BSD-3-Clause
+ Files with this license:
+ ares_getopt.c [16:38]
+ ares_getopt.h [8:30]
+
+KEEP MIT e8dcd3bdf4ebf29fb653dc583ef61bee
+BELONGS ya.make
+ License text:
+ c-ares is of course distributed under the same MIT-style license as the
+ Scancode info:
+ Original SPDX id: LicenseRef-scancode-unknown-license-reference
+ Score : 11.00
+ Match type : INTRO
+ Links : https://github.com/nexB/scancode-toolkit/tree/develop/src/licensedcode/data/licenses/unknown-license-reference.LICENSE
+ Files with this license:
+ README.md [25:25]
+ Scancode info:
+ Original SPDX id: MIT
+ Score : 99.00
+ Match type : REFERENCE
+ Links : http://opensource.org/licenses/mit-license.php, https://spdx.org/licenses/MIT
+ Files with this license:
+ README.md [25:25]
+
+KEEP NTP f38773a6c7891fe26d04523312f44f88
+BELONGS ya.make
+ Note: matched license text is too long. Read it in the source files.
+ Scancode info:
+ Original SPDX id: NTP
+ Score : 100.00
+ Match type : TEXT
+ Links : http://fedoraproject.org/wiki/Licensing:MIT#Old_Style_.28no_advertising_without_permission.29, https://spdx.org/licenses/NTP
+ Files with this license:
+ LICENSE.md [8:15]
diff --git a/contrib/libs/c-ares/.yandex_meta/licenses.list.txt b/contrib/libs/c-ares/.yandex_meta/licenses.list.txt
new file mode 100644
index 0000000000..6868726612
--- /dev/null
+++ b/contrib/libs/c-ares/.yandex_meta/licenses.list.txt
@@ -0,0 +1,373 @@
+====================BSD-3-Clause====================
+ * Lifted from the 'Android Bionic' project with the BSD license.
+
+
+====================BSD-3-Clause====================
+ * 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.
+
+
+====================BSD-3-Clause====================
+ * 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.
+
+
+====================BSD-3-Clause====================
+ * the modified BSD license, BSD license without the advertising clause.
+
+
+====================COPYRIGHT====================
+ * 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.
+
+
+====================COPYRIGHT====================
+ * Copyright (c) 1987-2001 The Regents of the University of California.
+ * All rights reserved.
+
+
+====================COPYRIGHT====================
+ * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (c) 1996,1999 by Internet Software Consortium.
+
+
+====================COPYRIGHT====================
+ * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (c) 1996-1999 by Internet Software Consortium.
+
+
+====================COPYRIGHT====================
+/* Copyright (C) 2004 - 2012 by Daniel Stenberg et al
+
+
+====================COPYRIGHT====================
+/* Copyright (C) 2004 - 2013 by Daniel Stenberg et al
+
+
+====================COPYRIGHT====================
+/* Copyright (C) 2004 by Daniel Stenberg et al
+
+
+====================COPYRIGHT====================
+/* Copyright (C) 2005 - 2010, Daniel Stenberg
+
+
+====================COPYRIGHT====================
+/* Copyright (C) 2005 by Dominick Meglio
+
+
+====================COPYRIGHT====================
+/* Copyright (C) 2005, 2013 by Dominick Meglio
+
+
+====================COPYRIGHT====================
+/* Copyright (C) 2005-2013 by Daniel Stenberg et al
+
+
+====================COPYRIGHT====================
+/* Copyright (C) 2008 by Daniel Stenberg et al
+
+
+====================COPYRIGHT====================
+/* Copyright (C) 2009 - 2013 by Daniel Stenberg et al
+
+
+====================COPYRIGHT====================
+/* Copyright (C) 2009 by Daniel Stenberg et al
+
+
+====================COPYRIGHT====================
+/* Copyright (C) 2009-2013 by Daniel Stenberg
+
+
+====================COPYRIGHT====================
+/* Copyright (C) 2010-2012 by Daniel Stenberg
+
+
+====================COPYRIGHT====================
+/* Copyright (C) 2010-2013 by Daniel Stenberg
+
+
+====================COPYRIGHT====================
+/* Copyright (C) 2017 by John Schember <john@nachtimwald.com>
+
+
+====================COPYRIGHT====================
+/* Copyright (C) 2018 by John Schember <john@nachtimwald.com>
+
+
+====================COPYRIGHT====================
+/* Copyright (C) 2019 by Andrew Selivanov
+
+
+====================COPYRIGHT====================
+/* Copyright 1998 by the Massachusetts Institute of Technology.
+
+
+====================COPYRIGHT====================
+/* Copyright 1998 by the Massachusetts Institute of Technology.
+ * Copyright (C) 2004 - 2011 by Daniel Stenberg et al
+
+
+====================COPYRIGHT====================
+/* Copyright 1998 by the Massachusetts Institute of Technology.
+ * Copyright (C) 2004-2009 by Daniel Stenberg
+
+
+====================COPYRIGHT====================
+/* Copyright 1998 by the Massachusetts Institute of Technology.
+ * Copyright (C) 2004-2010 by Daniel Stenberg
+
+
+====================COPYRIGHT====================
+/* Copyright 1998 by the Massachusetts Institute of Technology.
+ * Copyright (C) 2004-2011 by Daniel Stenberg
+
+
+====================COPYRIGHT====================
+/* Copyright 1998 by the Massachusetts Institute of Technology.
+ * Copyright (C) 2004-2017 by Daniel Stenberg
+
+
+====================COPYRIGHT====================
+/* Copyright 1998 by the Massachusetts Institute of Technology.
+ * Copyright (C) 2007-2013 by Daniel Stenberg
+
+
+====================COPYRIGHT====================
+/* Copyright 1998 by the Massachusetts Institute of Technology.
+ * Copyright (C) 2008-2013 by Daniel Stenberg
+
+
+====================COPYRIGHT====================
+/* Copyright 1998 by the Massachusetts Institute of Technology.
+ * Copyright (C) 2009 by Jakub Hrozek <jhrozek@redhat.com>
+
+
+====================COPYRIGHT====================
+/* Copyright 1998 by the Massachusetts Institute of Technology.
+ * Copyright (C) 2010 Jeremy Lal <kapouer@melix.org>
+
+
+====================COPYRIGHT====================
+/* Copyright 1998 by the Massachusetts Institute of Technology.
+ * Copyright (C) 2012 Marko Kreen <markokr@gmail.com>
+
+
+====================COPYRIGHT====================
+/* Copyright 1998 by the Massachusetts Institute of Technology.
+ * Copyright 2005 Dominick Meglio
+ * Copyright (C) 2019 by Andrew Selivanov
+
+
+====================COPYRIGHT====================
+/* Copyright 1998, 2011 by the Massachusetts Institute of Technology.
+
+
+====================COPYRIGHT====================
+/* Copyright 1998, 2011, 2013 by the Massachusetts Institute of Technology.
+ * Copyright (C) 2017 - 2018 by Christian Ammer
+ * Copyright (C) 2019 by Andrew Selivanov
+
+
+====================COPYRIGHT====================
+/* Copyright 2000 by the Massachusetts Institute of Technology.
+
+
+====================COPYRIGHT====================
+/* Copyright 2005 by Dominick Meglio
+
+
+====================COPYRIGHT====================
+Copyright (c) 2007 - 2018, Daniel Stenberg with many contributors, see AUTHORS
+file.
+
+
+====================File: AUTHORS====================
+c-ares is based on ares, and these are the people that have worked on it since
+the fork was made:
+
+Albert Chin
+Alex Loukissas
+Alexander Klauer
+Alexander Lazic
+Alexey Simak
+Andreas Rieke
+Andrew Andkjar
+Andrew Ayer
+Andrew C. Morrow
+Ashish Sharma
+Ben Greear
+Ben Noordhuis
+BogDan Vatra
+Brad House
+Brad Spencer
+Bram Matthys
+Chris Araman
+Dan Fandrich
+Daniel Johnson
+Daniel Stenberg
+David Drysdale
+David Stuart
+Denis Bilenko
+Dima Tisnek
+Dirk Manske
+Dominick Meglio
+Doug Goldstein
+Doug Kwan
+Duncan Wilcox
+Eino Tuominen
+Erik Kline
+Fedor Indutny
+Frederic Germain
+Geert Uytterhoeven
+George Neill
+Gisle Vanem
+Google LLC
+Gregor Jasny
+Guenter Knauf
+Guilherme Balena Versiani
+Gunter Knauf
+Henrik Stoerner
+Jakub Hrozek
+James Bursa
+Jérémy Lal
+John Schember
+Keith Shaw
+Lei Shi
+Marko Kreen
+Michael Wallner
+Mike Crowe
+Nick Alcock
+Nick Mathewson
+Nicolas "Pixel" Noble
+Ning Dong
+Oleg Pudeyev
+Patrick Valsecchi
+Patrik Thunstrom
+Paul Saab
+Peter Pentchev
+Phil Blundell
+Poul Thomas Lomholt
+Ravi Pratap
+Robin Cornelius
+Saúl Ibarra Corretgé
+Sebastian at basti79.de
+Shmulik Regev
+Stefan Bühler
+Steinar H. Gunderson
+Svante Karlsson
+Tofu Linden
+Tom Hughes
+Tor Arntsen
+Viktor Szakats
+Vlad Dinulescu
+William Ahern
+Yang Tse
+hpopescu at ixiacom.com
+liren at vivisimo.com
+nordsturm
+saghul
+
+
+====================ISC====================
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * 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.
+
+
+====================MIT====================
+ Just the MIT license used in the top the source files moved out to a
+
+
+====================MIT====================
+c-ares is of course distributed under the same MIT-style license as the
+
+
+====================NTP====================
+ * 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.
+
+
+====================NTP====================
+ * 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.
+
+
+====================NTP====================
+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. \ No newline at end of file
diff --git a/contrib/libs/c-ares/AUTHORS b/contrib/libs/c-ares/AUTHORS
new file mode 100644
index 0000000000..7db6584c91
--- /dev/null
+++ b/contrib/libs/c-ares/AUTHORS
@@ -0,0 +1,84 @@
+c-ares is based on ares, and these are the people that have worked on it since
+the fork was made:
+
+Albert Chin
+Alex Loukissas
+Alexander Klauer
+Alexander Lazic
+Alexey Simak
+Andreas Rieke
+Andrew Andkjar
+Andrew Ayer
+Andrew C. Morrow
+Ashish Sharma
+Ben Greear
+Ben Noordhuis
+BogDan Vatra
+Brad House
+Brad Spencer
+Bram Matthys
+Chris Araman
+Dan Fandrich
+Daniel Johnson
+Daniel Stenberg
+David Drysdale
+David Stuart
+Denis Bilenko
+Dima Tisnek
+Dirk Manske
+Dominick Meglio
+Doug Goldstein
+Doug Kwan
+Duncan Wilcox
+Eino Tuominen
+Erik Kline
+Fedor Indutny
+Frederic Germain
+Geert Uytterhoeven
+George Neill
+Gisle Vanem
+Google LLC
+Gregor Jasny
+Guenter Knauf
+Guilherme Balena Versiani
+Gunter Knauf
+Henrik Stoerner
+Jakub Hrozek
+James Bursa
+Jérémy Lal
+John Schember
+Keith Shaw
+Lei Shi
+Marko Kreen
+Michael Wallner
+Mike Crowe
+Nick Alcock
+Nick Mathewson
+Nicolas "Pixel" Noble
+Ning Dong
+Oleg Pudeyev
+Patrick Valsecchi
+Patrik Thunstrom
+Paul Saab
+Peter Pentchev
+Phil Blundell
+Poul Thomas Lomholt
+Ravi Pratap
+Robin Cornelius
+Saúl Ibarra Corretgé
+Sebastian at basti79.de
+Shmulik Regev
+Stefan Bühler
+Steinar H. Gunderson
+Svante Karlsson
+Tofu Linden
+Tom Hughes
+Tor Arntsen
+Viktor Szakats
+Vlad Dinulescu
+William Ahern
+Yang Tse
+hpopescu at ixiacom.com
+liren at vivisimo.com
+nordsturm
+saghul
diff --git a/contrib/libs/c-ares/CHANGES b/contrib/libs/c-ares/CHANGES
new file mode 100644
index 0000000000..f6652caaa0
--- /dev/null
+++ b/contrib/libs/c-ares/CHANGES
@@ -0,0 +1,4723 @@
+ Changelog for the c-ares project. Generated with git2changes.pl
+
+Version 1.16.1 (11 May 2020)
+
+Brad House (11 May 2020)
+- c-ares 1.16.1 release prep
+
+- update travis to use xcode11.4
+
+- 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
+
+GitHub (30 Apr 2020)
+- [shelley vohr brought this change]
+
+ 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
+
+Brad House (13 Apr 2020)
+- travis: CloudFlare does not allow T_ANY requests, so live tests that use it fail. Disable.
+
+- travis: bump macos image to the latest
+
+- 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)
+
+- MacOS: Enable libresolv support for retrieving DNS servers like iOS does.
+
+GitHub (10 Apr 2020)
+- [Dmitry Igrishin brought this change]
+
+ CMake: Populate the INCLUDE_DIRECTORIES property of installed targets (#323)
+
+ Populate the INCLUDE_DIRECTORIES property of installed targets
+
+ Fix By: Dmitry Igrishin (@dmitigr)
+
+Brad House (10 Apr 2020)
+- travis: make valgrind use cmake for tests
+
+- dont try to use libtool to run valgrind
+
+- valgrind requires libtool installed to wrap tests
+
+- scan build 7
+
+- fix travis live test
+
+- add debug for travis
+
+- try without sudo
+
+- attempt to modernize travis build environment
+
+GitHub (6 Apr 2020)
+- [Teemu R brought this change]
+
+ Allow TXT records on CHAOS qclass (#321)
+
+ 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`.
+
+ C-ares was not allowing such use cases.
+
+ Fix By: Teemu R. (@rytilahti)
+
+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)
+
+- 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
+
+GitHub (12 Mar 2020)
+- [David Drysdale brought this change]
+
+ test: fuzzer input triggering double free (#315)
+
+ 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)")
+
+- [Brad House brought this change]
+
+ CMake: Install Manpages (#314)
+
+ CMake wasn't installing manpages.
+
+ Fixes #297
+ Fix By: Brad House (@bradh352)
+
+- [Brad House brought this change]
+
+ 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)
+
+Brad House (11 Mar 2020)
+- Add AppVeyor badge
+
+- bump c-ares version to 1.16.0. test AppVeyor integration.
+
+GitHub (11 Mar 2020)
+- [Brad House brought this change]
+
+ replace all usages of inet_addr() with ares_inet_pton() which is more proper (#312)
+
+ 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)
+
+- [Brad House brought this change]
+
+ 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)
+
+- [Brad House 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)
+
+- [Dron Rathore brought this change]
+
+ 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)
+
+- [Stephen Bryant brought this change]
+
+ 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)
+
+- [tjwalton brought this change]
+
+ 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
+
+- [Michal Rostecki brought this change]
+
+ 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)
+
+- [Adam Majer brought this change]
+
+ 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.
+
+ This is a regression since 1.15.
+
+ Issue: https://github.com/c-ares/c-ares/issues/300
+ Fix By: Adam Majer (@AdamMajer)
+
+Brad House (24 Dec 2019)
+- [Kyle Edwards brought this change]
+
+ CMake: Provide c-ares version in package export file (#296)
+
+ The CMake package export file should provide version information.
+
+ Fix By: Kyle Edwards (@KyleFromKitware)
+
+- [Ben Noordhuis brought this change]
+
+ 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
+
+ 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)
+
+- [Christian Ammer brought this change]
+
+ Parallel A and AAAA lookups in `ares_getaddrinfo` (#290)
+
+ A and AAAA lookups for ares_getaddrinfo() are now performed in parallel.
+
+ For this change `ares_search` was removed from `ares_getaddrinfo`.
+ Instead `ares_query` in combination with `next_dns_lookup` are
+ doing the suffix search.
+
+ Adding support for `.onion` addresses which are tested by
+ `TEST_F(DefaultChannelTest, GetAddrinfoOnionDomain)`
+
+ Fix By: Christian Ammer (@ChristianAmmer)
+
+- [Vy Nguyen brought this change]
+
+ Move variables into the block where it is used to avoid unused-vars (#281)
+
+ Warning uncovered with [-Werror, -Wunused-variables]
+
+ Fix By: Vy Nguyen (@oontvoo)
+
+- [Vy Nguyen brought this change]
+
+ 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)
+
+- [Egor Pugin brought this change]
+
+ [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)
+
+- [Abhishek Arya brought this change]
+
+ Add OSS-Fuzz fuzzing badge (#278)
+
+ Adds based on instructions at
+ https://google.github.io/oss-fuzz/getting-started/new-project-guide/#status-badge
+
+ Patch By: Abhishek Arya (@inferno-chromium)
+
+- [Peter Eisentraut brought this change]
+
+ ares_init_options.3: Fix layout (#275)
+
+ 7e6af8e inserted the documentation of resolvconf_path in the middle of
+ the item for ednspsz, leading to broken layout. Fix that.
+
+ Fix By: Peter Eisentraut (@petere)
+
+- [Gregor Jasny brought this change]
+
+ manpages: Fix typos detected by lintian (#269)
+
+
+ Fix By: Gregor Jasny (@gjasny)
+
+- [lifenjoiner brought this change]
+
+ keep command line usage up to date (#256)
+
+ adig and ahost built-in help did not match args taken.
+
+ Fix-By: @lifenjoiner
+
+- [Dan Noé brought this change]
+
+ ares-test.cc: Handle nullptr in AddrInfo ostream. (#268)
+
+ 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é <dpn@google.com>
+
+- [Dan Noé brought this change]
+
+ Add missing limits.h include from ares_getaddrinfo.c (#267)
+
+ 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é <dpn@google.com>
+
+- [Andrew Selivanov brought this change]
+
+ fix fuzzer docs and add missing getaddrinfo docs (#265)
+
+ There is a fix for a bit outdated clang fuzzer docs and ares_getaddrinfo docs.
+
+ Fix By: Andrew Selivanov (@ki11roy)
+
+- [Andrew Selivanov brought this change]
+
+ Fix leak and crash in ares_parse_a/aaaa_reply (#264)
+
+ * 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)
+
+ Reported-By: David Drysdale (@daviddrysdale)
+ Fix-By: Andrew Selivanov (@ki11roy)
+
+- [Andrew Selivanov brought this change]
+
+ fix segfault when parsing wrong type of record (#262)
+
+ Fixes segfault when trying to ares_parse_aaaa with AF_INET and vise versa.
+
+ Fix By: Andrew Selivanov (@ki11roy)
+
+- work around mingw compile failure
+
+- c++ requires explicit casts
+
+- support EnvValue on Windows by implementing setenv/unsetenv
+
+- [Andrew Selivanov brought this change]
+
+ 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
+
+- [Andrew Selivanov brought this change]
+
+ 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)
+
+- Fix c89 compilation support broken by .onion rejection changes
+
+ Move .onion check lower after all variables have been declared.
+
+ Bug: #246
+
+- [kedixa brought this change]
+
+ getaddrinfo: callback must be called on bad domain (#249)
+
+ 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
+
+- [Darrin W. Cullop brought this change]
+
+ Windows ARM/ARM64 requires AdvApi32 (#252)
+
+ 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)
+
+- [kedixa 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 fix for ares__sortaddrinfo()
+
+ replace uint32_t with unsigned int and socklen_t with ares_socklen_t
+
+ By: Brad House
+
+- [Khaidi Chu brought this change]
+
+ fix: init bufp before reject .onion to make it can be free correctly (#241)
+
+ 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)
+
+- [Andrew Selivanov brought this change]
+
+ 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:
+
+ Rule 3 (Avoid deprecated addresses)
+ Rule 4 (Prefer home addresses)
+ Rule 7 (Prefer native transport)
+
+ Submitted By: Andrew Selivanov (@ki11roy)
+
+- [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)
+
+- [Fabrice Fontaine brought this change]
+
+ m4/xc-cc-check.m4: use XC_CHECK_BUILD_FLAGS (#236)
+
+ 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 <gustavo@zacarias.com.ar>
+ Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com>
+ Submitted by: Fabrice Fontaine
+
+- [Christian Ammer brought this change]
+
+ 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)
+
+- [Christian Ammer brought this change]
+
+ 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)
+
+- [Christian Ammer brought this change]
+
+ 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.
+
+ Features not supported include sorted addresses and honoring of service and hints
+ parameters.
+
+ Implementation by: Christian Ammer (@ChristianAmmer)
+
+- [Ben Noordhuis brought this change]
+
+ test: fix bad expectation in ipv6 localhost test (#227)
+
+ 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
+
+- [Ben Noordhuis brought this change]
+
+ ares_version.h: bump version (#230)
+
+ Version change not committed from maketgz.sh
+
+ 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
+
+- [Ben Noordhuis 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
+
+- prepare for c-ares 1.15.0 release
+
+- 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)
+
+- 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)
+
+- [Sarat Addepalli 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
+
+- remove stale variables
+
+- fix prototype name for ares_strsplit_free()
+
+- add missing prototype
+
+- simplify ares_strsplit() and create ares_strsplit_free() helper function
+
+- missing ares_strsplit.h from HHEADERS for inclusion in distribution
+
+- [Ruslan Baratov brought this change]
+
+ Add CARES_BUILD_TOOLS CMake option (#214)
+
+ Add ability to exclude building of tools (adig, ahost, acountry) in CMake. This should also close #200.
+
+ Fix By: Ruslan Baratov (@ruslo)
+ Bug: #200
+
+- [flyingdutchman23 brought this change]
+
+ Style. Whitespace cleanup. (#213)
+
+ Small whitespace cleanups.
+
+ Fix By: @flyingdutchman23
+
+- [John Schember brought this change]
+
+ Android: Support for domain search suffix (#211)
+
+ 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.
+
+ Submitter: John Schember (@user-none)
+ Fixes: #207
+ Approved-by: Brad House (@bradh352)
+
+- [afalin brought this change]
+
+ 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
+
+- 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
+
+- [flyingdutchman23 brought this change]
+
+ 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
+
+- [Andi Schnebinger brought this change]
+
+ 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
+
+GitHub (18 May 2018)
+- [David Drysdale brought this change]
+
+ travis: do coverage in "coverage" build (#195)
+
+ Fixes #194, a mistake from commit a255081f2c3c ("travis: Only do
+ coverage/distcheck on normal build")
+
+Brad House (17 May 2018)
+- [Brad Spencer brought this change]
+
+ 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.
+
+ 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
+
+- [Brad Spencer brought this change]
+
+ 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.
+
+ 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
+
+- [David Hotham brought this change]
+
+ 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
+
+David Drysdale (15 May 2018)
+- [Tobias Nießen brought this change]
+
+ Fix comment in ares_rules.h (#189)
+
+Brad House (6 May 2018)
+- [Brad Spencer brought this change]
+
+ 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
+
+- 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
+
+- 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
+
+- 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.
+
+Version 1.14.0 (16 Feb 2018)
+
+Daniel Stenberg (16 Feb 2018)
+- ares_android.c: fix warning: ISO C forbids an empty translation unit
+
+- RELEASE-NOTES: some more work we did and people who helped
+
+Brad House (16 Feb 2018)
+- travis: skip Autotools style testing for cmake
+
+ Fix cmake test build by skipping autotools portion of test script.
+
+- travis: standardize CMake test off of Autotools tests
+
+ Instead of running 'make test', run the tests directly like autotools
+ does. It provides more verbose output.
+
+- travis: Enable building tests for CMake
+
+ Travis should auto-build and run tests for cmake builds now that
+ PR #168 is merged.
+
+- fix version in pkgconfig
+
+- Add version update to CMakeLists in maketgz
+
+- Release prep. Add support for pkgconfig in cmake, set versions appropriately
+
+Gregor Jasny (15 Feb 2018)
+- CMake: Add tests
+
+Brad House (14 Feb 2018)
+- [Gregor Jasny brought this change]
+
+ Use cmake3 package provided by Ubuntu (#182)
+
+- Cmake 3.1 instead of 3.2.1 should be the minimum
+
+- Update RELEASE-NOTES and RELEASE-PROCEDURE.md to prepare for next release
+
+- get rid of c++ style comments
+
+- Use trusty for all builds, precise is EOL. Update clang and cmake versions.
+
+- Current CMakeLists.txt doesn't support 2.8.12 anymore, we need to bump the version to 3.2.1 minimum
+
+- Re-organize sections in INSTALL.md and add CMake section
+
+- [Sergey Kolomenkin brought this change]
+
+ remove compilation warnings in MSVC (#47)
+
+- document handling of timeouts for ares_process and ares_process_fd to close PR #57
+
+- 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
+
+GitHub (7 Feb 2018)
+- [David Drysdale brought this change]
+
+ Document WSAStartup requirement (#180)
+
+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]
+
+ 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.
+
+Brad House (3 Feb 2018)
+- [acthompson-google-com brought this change]
+
+ Android JNI code leaks local references in some cases (#175)
+
+ * Add Google LLC to AUTHORS.
+
+ * android: Explicitly delete all JNI local references, and cache JNI method IDs at initialization.
+
+ * android: Only return ARES_ENOTINITIALIZED on failures in initialization code.
+
+Gregor Jasny (2 Jan 2018)
+- Embed fused Google Test 1.8.0
+
+Brad House (21 Dec 2017)
+- [John Schember brought this change]
+
+ android: Check returns for obj and classes are not NULL. Document API levels for various Android functions and objects used. (#166)
+
+- CARES_CHECK_TYPE should reference variable so a warning is not produced for -Werror compatibility
+
+- [Brad Spencer brought this change]
+
+ Fix computation of IPv6 blacklist mask for values of netmask > 8. (#164)
+
+David Drysdale (14 Dec 2017)
+- travis: Only do coverage/distcheck on normal build
+
+- travis: only do pip install on Linux
+
+- travis: only test in IPv4 mode
+
+ Travis' Trusty environment does not support IPv6.
+
+- test: allow restriction to one IP address family
+
+- [Roman Teterin brought this change]
+
+ Fix a typo in init_by_resolv_conf (#160)
+
+Brad House (11 Dec 2017)
+- @gvanem says MSVC -RTCc option fails, looks erroneous to me, but the additional mask is harmless
+
+- Fix some other mingw warnings
+
+- Issue #143, get rid of windows build warning due to passing 'char **' to argument expecting 'const char **'
+
+- [Gregor Jasny brought this change]
+
+ Distribute CMake files (#130)
+
+- Android variants may not have __system_property_get
+
+ 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]
+
+ Wrong function name throughout man page (#154)
+
+- ares_data.c: iterate through substructs when freeing
+
+ Previous code recursed into substructures, which makes it more likely
+ that large/heavily-nested responses could use up lots of stack.
+
+- test: test ares_free_data on long chain of structs
+
+- [Felix Yan brought this change]
+
+ Fix a typo in inet_ntop.c (#151)
+
+Daniel Stenberg (29 Sep 2017)
+- ares_gethostbyname.3: fix callback status values
+
+ - 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
+
+Brad House (28 Sep 2017)
+- [John Schember brought this change]
+
+ Fix DNS server lookup breaking with Android O due to Android removing access to net.dns# system properties. (#148)
+
+ 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.
+
+ 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.
+
+ 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.
+
+ 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.
+
+- [Konstantinos Sofokleous brought this change]
+
+ allow linking against the static msvc runtime library (#133)
+
+ allow linking against the static msvc runtime library
+
+- [Gergely Nagy brought this change]
+
+ Force using the ANSI versions of WinAPI functions (#142)
+
+ 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
+
+GitHub (11 Sep 2017)
+- [Brad House brought this change]
+
+ Win32 exclude legacy ipv6 subnets (#144)
+
+ win32 ipv6: add infrastructure to exclude ipv6 subnets that are known to cause issues
+
+- [David Drysdale brought this change]
+
+ windows: only look for ancient compilers (#146)
+
+ Also drop the use of a versioned output directory; just use
+ .\msvc
+
+- [David Drysdale brought this change]
+
+ ares_init_options.3: match up sock_state_cb args (#141)
+
+ Fixes #140
+
+Daniel Stenberg (25 Aug 2017)
+- [Anna Henningsen brought this change]
+
+ gethostbyaddr: fail with `ECANCELLED` for `ares_cancel()`
+
+ When `ares_cancel()` was invoked, `ares_gethostbyaddr()`
+ queries would fail with `ENOTFOUND` instead of `ECANCELLED`.
+
+ 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
+
+David Drysdale (18 Aug 2017)
+- [David Hotham brought this change]
+
+ support most recent Visual Studio 2017
+
+Brad House (26 Jul 2017)
+- Preserve original DNS server order on Windows for equal metrics.
+
+ 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.
+
+David Drysdale (15 Jul 2017)
+- [Anna Henningsen brought this change]
+
+ ares_parse_naptr_reply: make buffer length check more accurate
+
+ 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 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
+
+- test: use ares_free_string() throughout
+
+ As pointed out by Gisle Vanem in #125.
+
+Daniel Stenberg (3 Jul 2017)
+- RELEASE-PROCEDURE.md: how to release
+
+ Fixes #115
+ Closes #116
+
+David Drysdale (2 Jul 2017)
+- test: Build dnsdump on Windows too
+
+ 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 statement like #define - ares ssize_t define had a trailing semicolon (#120)
+
+David Drysdale (21 Jun 2017)
+- test: distribute the fuzzcheck.sh script
+
+ The TESTS target runs fuzzcheck.sh so make sure it is included
+ in the distributed tarball.
+
+ (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.)
+
+- test: run the name-parsing corpus check too
+
+Daniel Stenberg (21 Jun 2017)
+- dist: don't build/ship PDF versions in release archives
+
+ ... 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
+
+ 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
+
+- test: Add fuzz input with short NAPTR
+
+- test: add ares_parse_naptr_reply to fuzzer
+
+- [noiz brought this change]
+
+ Update ares.h to support compiling with QNX
+
+- [Dionna Glaze brought this change]
+
+ Simple changes to appease stricter compilers.
+
+ ares_process.c uses htonl, which needs <arpa/inet.h> 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.
+
+GitHub (16 Jun 2017)
+- [Gregor Jasny brought this change]
+
+ CMake: Emulate interface library on import (#108)
+
+ Closes: #104
+ Signed-off-by: Gregor Jasny <gjasny@googlemail.com>
+
+Brad House (6 Jun 2017)
+- [ChristianAmmer brought this change]
+
+ Added support for Windows DNS Suffix Search List (#93)
+
+ This change solves issue #53.
+
+ 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:
+
+ The global DNS suffix search list.
+ The primary and connection specific DNS suffixes if the global is not available.
+
+ Contributed by @ChristianAmmer
+
+Daniel Stenberg (25 May 2017)
+- [Thomas Köckerbauer brought this change]
+
+ configure: do not heck for ar if specified manually
+
+ Closes #62
+
+David Drysdale (23 May 2017)
+- ares_expand_name: limit number of indirections
+
+- test: fuzz input file that takes a while to process
+
+- test: copy data in fuzz regression driver
+
+ Oops.
+
+GitHub (23 May 2017)
+- [David Drysdale brought this change]
+
+ Convert char from ISO-8859-1 to UTF-8 (#99)
+
+ Fixes #97
+
+- [Gregor Jasny brought this change]
+
+ travis: Use trusty for cmake builds (#109)
+
+ kubuntu-backports dropped the CMake package for Precise
+
+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
+
+ 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
+
+ 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
+
+- tests should not use ssize_t, use ares_ssize_t
+
+GitHub (16 Mar 2017)
+- [Brad House brought this change]
+
+ 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.
+
+David Drysdale (14 Mar 2017)
+- [Michael Osei brought this change]
+
+ Update msvc_ver.inc (#91)
+
+ For Visual Studio 2017 builds
+
+Daniel Stenberg (13 Mar 2017)
+- [Brad House brought this change]
+
+ Windows DNS server sorting (#81)
+
+ 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 <bspencer@blackberry.com>
+ 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 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.
+
+David Drysdale (22 Feb 2017)
+- [Sergii Pylypenko brought this change]
+
+ docs: fixed references to ares_set_local_ip4 and ares_set_local_ip6
+
+- [Calle Wilund brought this change]
+
+ ares test: fix win32 build errors with virtual socket function tests
+
+ 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.
+
+- [Calle Wilund brought this change]
+
+ ares_process: fix return type of socket_create function (win32 warning)
+
+Daniel Stenberg (31 Jan 2017)
+- [Calle Wilund brought this change]
+
+ ares_set_socket_functions: Add man page
+
+ Providing some rudimentary documentation for the added functionality
+
+ Closes #72
+
+- [Calle Wilund brought this change]
+
+ ares-test: Add test helpers and cases for virtual socket IO
+
+ * 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
+
+- [elcallio brought this change]
+
+ 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.
+
+- [elcallio brought this change]
+
+ Add virtual function set for socket IO
+
+ Defines a structure of basic create, close, read/write
+ functions as virtual function calls, settable for individual
+ c-ares channels.
+
+David Drysdale (30 Jan 2017)
+- test: ignore aresfuzzname binary
+
+Gregor Jasny (14 Jan 2017)
+- [Stephen Sorley brought this change]
+
+ Always use check_symbol_exists instead of check_function_exists.
+
+- Also add includes to TARGETS_INST_DEST
+
+- [Stephen Sorley brought this change]
+
+ Windows build fixes
+
+- CMake: Export targets
+
+- CMake: Use GNUInstallDirs for install location defaults
+
+David Drysdale (11 Jan 2017)
+- Update Makefile.am for renamed INSTALL.md
+
+GitHub (11 Jan 2017)
+- [David Drysdale brought this change]
+
+ docs: convert INSTALL to MarkDown & tweak (#83)
+
+- [Gregor Jasny brought this change]
+
+ Merge pull request #77 from stephen-sorley/cmake_modernize
+
+ Updated CMake minimum version to 2.8.12.
+
+Stephen Sorley (4 Jan 2017)
+- Changed executables to depend directly on internal libcares target, instead of against
+ the external-facing alias targets.
+
+- Updated Travis to pull CMake 2.8.12 from kubuntu-backports ppa.
+
+- Updated CMake minimum version to 2.8.12.
+
+ 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.
+
+ Updated chain-building support to imitate new-style Find modules (import libs), instead of old-style Find modules (cache variables).
+
+David Drysdale (26 Dec 2016)
+- [Chris Araman brought this change]
+
+ configure: clock_gettime workaround (#75)
+
+ Commits 7518c26, c41726b, and bc14ee7 brought this workaround to the CMake build system. This expands it to the autoconf build system.
+
+ Fixes #71
+
+- test: add fuzz entrypoint for ares_create_query()
+
+- test: Add gTest/gMock files to SOURCES
+
+ Built tarballs are not including all of the files needed
+ to build the test suite because they are missing from the
+ <target>_SOURCES variable in Makefile.am.
+
+- travis: Move build scripts under travis/
+
+ 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
+
+ Reported-by: Bruce Stephens
+
+ Fixes #69
+
+- [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
+
+ 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"
+
+ This reverts commit a24a10a348fc00b8cfd684d91894a1df14880ea9.
+
+- travis: work around bug in PyCParser
+
+ 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
+
+ ... when the name ends with an escaped dot.
+
+ CVE-2016-5180
+
+ 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.
+
+ 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.
+
+Daniel Stenberg (27 Sep 2016)
+- README.md: remove space from link
+
+- README: link to the correct c-ares badge!
+
+ Reported-by: David Hotham
+
+ Fixes #63
+
+- docs: minor formatting edits
+
+- ares_destroy.3: formatting polish
+
+- 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
+
+ Tried to make the man page more readable.
+
+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
+
+Daniel Stenberg (26 Sep 2016)
+- [Brad House 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.
+
+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.
+
+- ares_init_options: only propagate init failures from options
+
+ 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().
+
+ 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.
+
+ So only preserve failures from the init_by_options() stage, not
+ from all initialization stages.
+
+ Fixes issue 60.
+
+- test: Force reinstall of libtool on OSX
+
+ Travis build environment appears to have changed.
+
+- 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.
+
+ 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++.
+
+- 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++
+
+- 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.
+
+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.
+
+- web: http => https
+
+GitHub (20 Jul 2016)
+- [David Drysdale brought this change]
+
+ Merge pull request #59 from fuze/master
+
+ Update msvc_ver.inc for VS2015 Update 3
+
+- [Chris Araman brought this change]
+
+ Update msvc_ver.inc
+
+ support Visual Studio 2015 Update 3
+
+David Drysdale (2 May 2016)
+- Fix trailing comment for #endif
+
+Daniel Stenberg (30 Apr 2016)
+- email: use Gisle's "new" address
+
+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.
+
+svante karlsson (15 Apr 2016)
+- Update msvc_ver.inc
+
+ support Visual Studio 2015 Update 2
+
+David Drysdale (31 Mar 2016)
+- test: Run fuzzcheck.sh in Travis build
+
+- test: add fuzzing check script to tests
+
+ 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
+
+ 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
+
+ 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.
+
+ 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
+
+ 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
+
+- test: Check setting nsort=0 option is respected
+
+- test: Update fuzzing function prototype
+
+ libFuzzer changed expected return type from void to int
+ in LLVM 3.8.
+
+- 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.
+
+- 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.
+
+- [Chris Araman brought this change]
+
+ msvc_ver.inc: support Visual Studio 2015 Update 1
+
+- build: commonize MSVC version detection
+
+ Remove the need to copy/paste version number mapping between
+ Makefile.msvc and test/Makefile.msvc.
+
+- test: Use different name in live test
+
+- test: Only pass unused args to GoogleTest
+
+- ahost.c: add cast to fix C++ compile
+
+ If ahost.c is force-compiled as C++ the missing cast from
+ (void *) to (char **) is problematic.
+
+- ares_library_cleanup: reset ares_realloc too
+
+ Otherwise a subsequent use of the library might use a previous
+ incarnation's realloc() implementation.
+
+Daniel Stenberg (9 Mar 2016)
+- [Brad House brought this change]
+
+ configure: check if tests can get built before enabled
+
+ 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.
+
+ 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]
+
+ Makefile.m32: add support for CROSSPREFIX
+
+- [Viktor Szakats brought this change]
+
+ Makefile.m32: add support for extra flags
+
+ Allow specification of CARES_{LD,C}FLAG_EXTRAS envvars
+ for mingw
+
+- test: Build with MinGW on AppVeyor
+
+- test: avoid in6addr_* constants
+
+ 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
+
+ Fixes #44
+
+- AUTHORS: added contributors from the 1.11.0 release
+
+- bump: start working on the next version
+
+Version 1.11.0 (19 Feb 2016)
+
+Daniel Stenberg (19 Feb 2016)
+- RELEASE-NOTES: final edits for 1.11.0
+
+David Drysdale (15 Feb 2016)
+- ares_dup.3: remove mention of nonexistent function
+
+ ares_dup_options() doesn't exist, so don't document it.
+
+- test: skip repeated build steps
+
+ Top-level buildconf/configure now triggers for the
+ test/ subdir too, so don't need to do explicitly.
+
+- test: namespaces unavailable when cross-compiling
+
+Daniel Stenberg (13 Feb 2016)
+- configure: only run configure in test when NOT cross-compiling
+
+ ... as the tests won't run cross-compiled anyway
+
+David Drysdale (13 Feb 2016)
+- test: prefer ON_CALL to EXPECT_CALL to reduce flakes
+
+ 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.
+
+ 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 (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
+
+- [Gregor Jasny brought this change]
+
+ dist: Distribute README.md
+
+ Closes #42
+
+Version 1.11.0 (11 Feb 2016)
+
+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
+
+ Closes #17
+
+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
+
+- 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.
+
+- Merge pull request #36 from AGWA-forks/master
+
+ Add ares_set_socket_configure_callback()
+
+- test: Update init tests to match behaviour
+
+ Unreadable config files are now treated the same way
+ as absent config files.
+
+- [Fedor Indutny brought this change]
+
+ Ignore `fopen` errors to use default values
+
+ 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.
+
+ 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`.
+
+ 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.
+
+Andrew Ayer (9 Feb 2016)
+- Document callback type in man page for ares_set_socket_callback
+
+- Add ares_set_socket_configure_callback()
+
+ 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
+
+- test: Check ares_parse_txt_reply_ext() entrypoint
+
+- [Fedor Indutny brought this change]
+
+ txt: introduce `ares_parse_txt_reply_ext`
+
+ 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.
+
+- doc: Update missed repo references
+
+- doc: Update docs on contributing
+
+- 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.
+
+- acountry: drop inert test
+
+ If ver_1 is true, then z0 and z1 must both be 'z', and so
+ (z0 != 'z' && z1 != 'z') can never be true.
+
+ CID 56879, pointed out by Coverity.
+
+- doc: update badge locations to master repo
+
+- test: Enable maintainer mode + debug in Travis
+
+- test: Add an iOS build target
+
+- test: Ignore SIGPIPE in tests
+
+- test: More initialization tests
+
+- test: Improve containerized test mechanism
+
+ 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.
+
+- test: Make contained tests easier to write
+
+- 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.
+
+- test: Use a longer timeout for less flakiness
+
+ 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
+
+ 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.
+
+ Also cope with ECONNREFUSED as well as ENOTFOUND.
+
+- test: Get test code building under Windows
+
+ - 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
+
+- test: Disable tests that manipulate env on Windows
+
+- test: Move file lists into Makefile.inc
+
+ In preparation for a Win32 build of the test suite.
+
+- test: Add a simple multi-server test
+
+ Check rotate option does something
+
+- test: Allow for multiple mock servers
+
+ - 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.
+
+- test: Update test for set/get_servers variants
+
+ Ports are significant in the _ports_ variant functions, so update test to cope.
+
+- test: Make GetNameServers() utility function port-aware
+
+ Also make it generally available.
+
+- test: more testing, including of internal static functions
+
+- test: more tests, especially fallback processing
+
+ - 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
+
+- test: more tests, particularly of initialization
+
+- 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.
+
+- test: Run mock tests over both IPv4 and IPv6
+
+- test: Add more tests for edge cases
+
+- test: more nooks and crannies of pton functions
+
+- test: More tests for PTR parsing
+
+- test: Use of HOSTALIAS environment variable
+
+- test: Add RAII utility classes for testing
+
+ - TempFile holds specific contents
+ - EnvValue sets an environment variable
+
+- test: More search domain scenarios
+
+- test: Remove duplicate flags from Makefile.am
+
+- test: Make test code leak-free
+
+- test: More tests
+
+ - test use of sortlist
+ - test gethostbyname(AF_UNSPEC)
+
+- test: Test ares_gethostbyname_file()
+
+- test: Add more tests of ares_getnameinfo()
+
+- test: Tweak tests, add alloc failure test
+
+- test: Test init with options
+
+- test: More tests
+
+ - ares_inet_net_pton() variants
+ - ares_getsock() variants
+
+- test: Expose ProcessWork() function
+
+- 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.
+
+- test: Add various additional tests
+
+- test: More tests
+
+ 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.
+
+- test: Allow command line override of mock server port
+
+- test: Add README.md documentation
+
+- test: Temporarily avoid latest Python requests package
+
+ Currently get error from Travis on this install step, and downgrading one
+ version appears to fix the problem.
+
+ "Could not find any downloads that satisfy the requirement pyOpenSSL>=0.13
+ (from requests[security])"
+
+- test: Add AppVeyor config file for Windows build
+
+- 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
+
+ test: invoke ASAN and coverage in Travis build
+
+ Also shift to use explicit build matrix
+
+ test: Use coveralls.io for coverage tracking
+
+ 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
+
+- 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:
+
+ - 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.
+
+ - 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.
+
+ - To make this generation/injection easier, the dns-proto.h file
+ includes C++ helper classes for building DNS packets.
+
+ - Other library entrypoints that don't require network activity
+ (e.g. ares_parse_*_reply) are tested directly.
+
+ - There are few tests of library-internal functions that are not
+ normally visible to API users (in ares-test-internal.cc).
+
+ - 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.
+
+ - 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.
+
+- 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.
+
+- 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.
+
+- doc: Convert README to README.md
+
+ Gives better display on GitHub
+
+- doc: Update in preparation for next release
+
+ Assume 1.11.0 is next (as there are various API additions).
+ Also add myself to AUTHORS.
+
+- build: Allow header compilation by Windows C++ compiler
+
+- build: Expose whether symbol hiding is on
+
+ Adding the CARES_SYMBOL_HIDING definition allows the test suite to
+ detect whether internal symbols are available or not.
+
+- build: Add autoconf macros for C++11 code using pthreads
+
+ 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).
+
+ 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
+
+ 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.
+
+- api: Add entrypoints to allow use of per-server ports
+
+ 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.
+
+ 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
+
+- api: Add ares_set_sortlist(3) entrypoint
+
+ Allow explicit configuration of the channel's sortlist, by
+ specifying a string in the same format as the equivalent
+ /etc/resolv.conf option.
+
+ This allows library users to perform the same configuration
+ that is available via /etc/resolv.conf, but without needing
+ to change that file.
+
+- api: Allow injection of user-specified malloc/free functions
+
+ 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.
+
+ Store these function pointers in library-wide global variables,
+ defaulting to libc's malloc(), realloc() and free().
+
+ 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.
+
+ Convert calls to calloc() to use ares_malloc() + memset
+
+- 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.
+
+- api: Expose the ares_library_initialized() function
+
+- ahost: Allow repeated -s <domain> options
+
+ This also removes a potential leak where later -s options would
+ replace earlier ones without freeing the relevant string.
+
+- Mark unhittable lines
+
+ 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
+
+- bitncmp: update comment to match code behaviour
+
+- ares_striendstr: fix so non-NULL return can happen
+
+ This looks to have been broken since it was first introduced in 2005 in
+ commit aba0b775ea30 ("Added ares_getnameinfo which mimics the
+ getnameinfo API")
+
+- 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.
+
+- ares_dup: clear new channel on failure
+
+ 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.
+
+- 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
+
+- 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).
+
+- ares_parse_txt_reply: propagate errors from per-substring loop
+
+ 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.
+
+- process_answer: fix things up correctly when removing EDNS option
+
+ 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)
+
+- ares__read_line: clear buf pointer on realloc failure
+
+- ares_expand_name: check for valid bits in label length
+
+ 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.
+
+Daniel Stenberg (23 Jan 2016)
+- [Gregor Jasny brought this change]
+
+ Fix typos detected by lintian
+
+ Closes #32
+
+- [Gregor Jasny brought this change]
+
+ Distribute all man pages
+
+- README.cares: s/I/Daniel
+
+ ... and add a pointer to an existing version of the original area 1.1.1
+ package.a
+
+- 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.
+
+- 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.
+
+- ahost: check the select() return code
+
+ Fixes CID 137189, pointed out by Coverity
+
+David Drysdale (18 Jan 2016)
+- Fix buildconf on platforms using glibtoolize
+
+ Commit c49a87eea538 changed buildconf to only check for
+ libtoolize, but missed a line
+
+- Don't exit loop early leaving uninitialized entries
+
+ 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.
+
+Daniel Stenberg (18 Jan 2016)
+- buildconf: remove check for libtool, it only requires libtoolize
+
+David Drysdale (17 Jan 2016)
+- [Gregor Jasny brought this change]
+
+ 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.
+
+ Instead the resolver library is queried for configuration
+ values.
+
+ CC: Yury Kirpichev <ykirpichev@yandex-team.ru>
+
+Daniel Stenberg (17 Jan 2016)
+- README: updated to new repo URL
+
+David Drysdale (14 Jan 2016)
+- [Lei Shi brought this change]
+
+ Fixing slow DNS lookup issue
+
+ 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.
+
+- Merge pull request #30 from p-push/vs-2015
+
+ Support Visual Studio 2015
+
+Oleg Pudeyev (3 Jan 2016)
+- [Gisle Vanem brought this change]
+
+ Support Visual Studio 2015
+
+David Drysdale (11 Nov 2015)
+- [Andrew Andkjar brought this change]
+
+ added another version case to Makefile.msvc
+
+ nmake version 11.00.61030.0 resolves to CC_VERS_NUM = 110
+
+- Merge pull request #26 from bitbouncer/vs-2013
+
+ added define for visual studio 2013
+
+svante karlsson (25 Jun 2015)
+- added define for visual studio 2013
+
+Jakub Hrozek (6 Nov 2014)
+- ares__read_line: free buf on realloc failure
+
+- Destroy options if ares_save_options fails
+
+ 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]
+
+ Continue loop if space for hostname not large enough
+
+ 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.
+
+Daniel Stenberg (30 Oct 2014)
+- ares_getnameinfo.3: there is no ares_getaddrinfo
+
+David Drysdale (30 Sep 2014)
+- [Gregor Jasny brought this change]
+
+ Prevent tmpbuf from overrunning
+
+ Fix Coverity error CID 56886.
+
+ Signed-off-by: Gregor Jasny <gjasny@googlemail.com>
+
+- [Gregor Jasny brought this change]
+
+ Re-start loop if select fails
+
+ Fix Coverity error CID 56882
+
+ Signed-off-by: Gregor Jasny <gjasny@googlemail.com>
+
+- [Gregor Jasny brought this change]
+
+ Free temporary variable in error path
+
+ Fix Coverity CID 56890
+
+ Signed-off-by: Gregor Jasny <gjasny@googlemail.com>
+
+- [Gregor Jasny brought this change]
+
+ 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 <gjasny@googlemail.com>
+
+- [Gregor Jasny brought this change]
+
+ Null check before dereference
+
+ Fix Coverity error CID 56880
+
+ Signed-off-by: Gregor Jasny <gjasny@googlemail.com>
+
+Jakub Hrozek (28 Jul 2014)
+- [Gisle Vanem brought this change]
+
+ Comment in ares_ipv6.h
+
+David Drysdale (25 Jul 2014)
+- CONTRIBUTING: add file to indicate mailing list is preferred
+
+- Add -t u option to ahost
+
+ Add an option to allow specification of the AF_UNSPEC
+ address family.
+
+Jakub Hrozek (24 Jul 2014)
+- host_callback: Fall back to AF_INET on searching with AF_UNSPEC
+
+ 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.
+
+ This patch makes sure than on ARES_SUCCESS, the result of AF_INET6 is
+ taken as authoritative only if the result contains some addresses.
+
+- [David Drysdale brought this change]
+
+ 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
+
+- [David Drysdale brought this change]
+
+ Update ahost man page to describe -s option.
+
+ Commit ee22246507c9 added the -s <domain> option to the
+ ahost command, but neglected to update the man page to
+ describe it.
+
+ Also fix typo in description of -t option.
+
+- 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.
+
+- [David Drysdale brought this change]
+
+ 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.
+
+- [David Drysdale brought this change]
+
+ Allow specification of search domain in ahost
+
+ Add the "-s domain" command line option to override the search
+ domains.
+
+Daniel Stenberg (12 May 2014)
+- Revert "ares_parse_aaaa_reply: fix leak when reply contains 1 alias and no address"
+
+ This reverts commit 440110b303fdbfadb3ad53d30eeb98cc45d70451.
+
+- [Frederic Germain brought this change]
+
+ ares_parse_aaaa_reply: fix leak when reply contains 1 alias and no address
+
+- [Doug Kwan brought this change]
+
+ ares_build.h: fix building on 64-bit powerpc
+
+ There are two issues.
+
+ 1. gcc actually does not use __ppc__ and __ppc64__ but __PPC__ and
+ __PPC64__. The tests of __ILP32__ and __LP64__ are sufficient for gcc.
+
+ 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.
+
+ 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]
+
+ single_domain: Invalid memory access for empty string input
+
+ 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).
+
+Guenter Knauf (31 Aug 2013)
+- Fixed warning 'type specifier missing'.
+
+Daniel Stenberg (30 Aug 2013)
+- [Tor Arntsen brought this change]
+
+ ares_rules.h: CARES_SIZEOF_LONG doesn't exist anymore, don't test for it
+
+ It was removed in f19387dd72432
+
+- nowarn: use <limits.h> instead of configure for size of long
+
+ This makes the header file much more multi-arch friendly and can be used
+ as-is with both 32 bit and 64 bit builds.
+
+- timeoffset: made static and private
+
+ ares__timeoffset() was only used once within this single source file
+
+- timeadd: make static
+
+ ares__timeadd() was only ever used from within the same source
+
+Yang Tse (18 Jul 2013)
+- xc-am-iface.m4: comments refinement
+
+- configure: fix 'subdir-objects' distclean related issue
+
+ See XC_AMEND_DISTCLEAN comments for details.
+
+- configure: automake 1.14 compatibility tweak (use XC_AUTOMAKE)
+
+- xc-am-iface.m4: provide XC_AUTOMAKE macro
+
+Daniel Stenberg (12 May 2013)
+- gitignore: ignore all ares_*pdf but also CHANGES.dist
+
+- bump: start working towards 1.10.1
+
+Version 1.10.0 (12 May 2013)
+
+Daniel Stenberg (12 May 2013)
+- RELEASE-NOTES: two more bug fixes
+
+- [Keith Shaw brought this change]
+
+ ares_set_servers_csv: fixed IPv6 address parsing
+
+ 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.
+
+- 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
+
+- [Alex Loukissas brought this change]
+
+ build: fix build on msvc11
+
+- Makefile.am: increment -version-info for 1.10.0 release
+
+- README: remove unnecessary comment
+
+- ares_version.h: copyright end range year is now 2013
+
+- RELEASE-NOTES: synced with fb0737f3a0a1c37
+
+- [Paul Saab brought this change]
+
+ ares_parse_aaaa_reply: Plug memory leak
+
+ This change is similar to ares_parse_a_reply.c in commit
+ bffd67f16a8f42fe6dbf79ab2e39d92eea05c8a6
+
+- [Patrick Valsecchi brought this change]
+
+ ares_parse_txt_reply: return a ares_txt_reply node for each sub-string
+
+ Previously, the function would wrongly return all substrings merged into
+ one.
+
+- [Alexander Klauer brought this change]
+
+ library init: documentation update
+
+ 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]
+
+ 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().
+
+- [Patrick Valsecchi brought this change]
+
+ protocol parsing: check input data stricter
+
+ ... so that bad length fields aren't blindly accepted
+
+ Bug: http://c-ares.haxx.se/mail/c-ares-archive-2013-04/0016.shtml
+
+Guenter Knauf (11 Apr 2013)
+- Create ares_build.h when buidling from Git.
+
+- Added -DCARES_STATICLIB to CFLAGS.
+
+ 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
+
+ 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
+
+ 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
+
+ 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
+
+ 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
+
+ No API change involved.
+
+- ares_build.h.dist: enhance non-configure GCC ABI detection logic
+
+ GCC specific adjustments:
+
+ - 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.
+
+ - keep 32bit processor architecture checks in order to support gcc
+ versions older than 4.7 which don't define __ILP32__
+
+ - 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
+
+ Make sure that the symbols are always exported and present in c-ares.
+
+ Make the headers prefixed with 'ares'.
+
+ 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]
+
+ curl_setup_once.h: definition of HAVE_CLOSE_S defines sclose() to close_s()
+
+- [Gisle Vanem brought this change]
+
+ config-dos.h: define HAVE_CLOSE_S for MSDOS/Watt-32
+
+- [Gisle Vanem brought this change]
+
+ config-dos.h: define strerror() to strerror_s_() for High-C
+
+Daniel Stenberg (13 Feb 2013)
+- ares_get_datatype: removed unused function
+
+ it was also wrongly named as internal functions require two underscores
+
+- ares__bitncmp: use two underscores for private functions
+
+ It used a single one previously making it look like a public one
+
+- ares__generate_new_id: moved to ares_query.c
+
+ ... and ares__rc4 is turned into a local static function.
+
+- ares__swap_lists: make private and static
+
+ ... 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
+
+Yang Tse (30 Jan 2013)
+- zz40-xc-ovr.m4: fix 'wc' detection - follow-up 2
+
+ - Fix a pair of single quotes to double quotes.
+
+ URL: http://curl.haxx.se/mail/lib-2013-01/0355.html
+ Reported by: Tor Arntsen
+
+- zz40-xc-ovr.m4: fix 'wc' detection - follow-up
+
+ - Take into account that 'wc' may return leading spaces and/or tabs.
+
+ - Set initial IFS to space, tab and newline.
+
+- 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.
+
+ URL: http://curl.haxx.se/mail/lib-2013-01/0351.html
+
+- zz40-xc-ovr.m4: check another three basic utilities
+
+- 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
+
+- 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.
+
+- zz40-xc-ovr.m4: truly do version conditional overriding
+
+ - version conditional overriding
+ - catch unexpanded XC macros
+ - fix double words in comments
+
+- 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
+
+- zz40-xc-ovr.m4: reinstate strict AC_REQUIRE macro dependencies
+
+- zz40-xc-ovr.m4: avoid double single-quote usage
+
+- zz40-xc-ovr.m4: parentheses balancing of 'case' statements
+
+ m4 quadrigraph shell comment technique allows proper autoconf
+ parentheses balancing in shell 'case' statements. The presence
+ of unbalanced parentheses may otherwise trigger expansion bugs.
+
+- zz40-xc-ovr.m4: internals overhauling
+
+ - Update comments
+ - Execute commands in subshells
+ - Faster path separator check
+ - Fix missing 'test' command
+ - Rename private macros
+ - Minimize AC_REQUIRE usage
+
+- zz40-xc-ovr.m4: redirect errors and warnings to stderr
+
+- 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.
+
+- zz40-xc-ovr.m4: provide XC_CONFIGURE_PREAMBLE macro
+
+- configure: autotools compatibility fixes - step I
+
+ Fix proper macro expansion order across autotools versions for
+ C compiler and preprocessor program checks.
+
+- 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_private.h: use again memdebug.h instead of curl_memdebug.h
+
+- configure.ac: replace AM_CONFIG_HEADER with AC_CONFIG_HEADERS
+
+ automake 1.13 errors if AM_CONFIG_HEADER is used in configure script.
+
+- cares-override.m4: provide AC_CONFIG_MACRO_DIR definition conditionally
+
+ 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.
+
+- ares_private.h: use curl_memdebug.h instead of memdebug.h
+
+- vc6cares.dsp: add ares_create_query.c and ares_parse_soa_reply.c
+
+- cares-functions.m4: improve gethostname arg 2 data type check
+
+- setup_once.h: HP-UX specific 'bool', 'false' and 'true' definitions.
+
+ Also reverts commit bceb40095a
+
+- configure: check if compiler halts on function prototype mismatch
+
+- cares-functions.m4: add gethostname arg 2 data type check and definition
+
+- 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.
+
+ Take in account that h_errno might be a modifiable lvalue not defined as
+ a C preprocessor macro.
+
+- setup_once.h: HP-UX <sys/socket.h> issue workaround
+
+ Issue: When building a 32bit target with large file support HP-UX
+ <sys/socket.h> 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.
+
+ Mentioned issue is now fixed as long as we don't use sendfile nor
+ sendpath functions.
+
+- setup_once.h: refactor inclusion of <unistd.h> and <sys/socket.h>
+
+ Inclusion of these two header files now done in setup_once.h
+
+- Header inclusion clean-up
+
+ Remove header inclusions already done in setup_once.h
+
+- setup_once.h: HP-UX specific TRUE and FALSE definitions
+
+ Some HP-UX system headers require TRUE defined to 1 and FALSE to 0.
+
+- ares_timeout.c: fix compiler warning
+
+- ares_create_query.c: IRIX compilation fix
+
+- c-ares/nameser.h: add some T_* defines for ns_t_* values
+
+Daniel Stenberg (7 Nov 2012)
+- Revert "ares_parse_aaaa_reply: fix memory leak"
+
+ This reverts commit 50f25d8a4b2d16f4c5e0ef620238688b7a315c7a.
+
+- ares_parse_aaaa_reply: fix memory leak
+
+ an allocated buffer was not freed in the successful case.
+
+- [Gisle Vanem brought this change]
+
+ adig: perror() doesn't work for socket errors on windows
+
+ ... so print the SOCKERRNO instead
+
+- get_DNS_AdaptersAddresses: fix IPv6 parsing
+
+ Use of the wrong define made the function not parse IPv6 addresses
+ properly.
+
+ Bug: http://c-ares.haxx.se/mail/c-ares-archive-2012-06/0028.shtml
+ Reported by: Saúl Ibarra Corretgé
+
+- version: bumped to 1.10.0
+
+ Due to the newly added function: ares_create_query()
+
+- AUTHORS: synced with 83093ac450
+
+ Added 21 authors since this document was last updated
+
+- ares_create_query.3: mention when this is added
+
+- [hpopescu@ixiacom.com brought this change]
+
+ Added new feature (rfc2671)
+
+- code police: fix indents, < 80 columns, reflowed comments
+
+Guenter Knauf (11 Jul 2012)
+- Cleaned up version awk script.
+
+Daniel Stenberg (30 Jun 2012)
+- [Gisle Vanem brought this change]
+
+ read_udp_packets: bail out loop on bad sockets
+
+ 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
+
+ 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
+
+Daniel Stenberg (18 Jun 2012)
+- version: work towards 1.9.2 (at least)
+
+Version 1.9.1 (18 Jun 2012)
+
+Daniel Stenberg (18 Jun 2012)
+- RELEASE-NOTES: 1.9.1 coming up
+
+Version 1.9.0 (16 Jun 2012)
+
+Daniel Stenberg (16 Jun 2012)
+- ares_version.h: next version is 1.9.0
+
+- [Marko Kreen brought this change]
+
+ ares_data.h: ARES_DATATYPE_SOA_REPLY is added in 1.9.0
+
+- RELEASE-NOTES: synced with 979bf951d
+
+ Next release deemed to become 1.9.0 due to the new function
+
+- [Marko Kreen brought this change]
+
+ SOA parser added
+
+ I need to do SOA queries, so here is a parser for them.
+
+ - 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
+
+Daniel Stenberg (21 May 2012)
+- [Nick Alcock brought this change]
+
+ 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.
+
+Yang Tse (28 Apr 2012)
+- version: start working on 1.8.1-DEV
+
+Version 1.8.0 (27 Apr 2012)
+
+Daniel Stenberg (27 Apr 2012)
+- RELEASE-NOTES: call next 1.8 instead
+
+ Since we added a function, let's use a stricter bumping scheme
+
+Yang Tse (25 Apr 2012)
+- INSTALL: some adjustments
+
+Daniel Stenberg (25 Apr 2012)
+- GIT-INFO: mention buildconf
+
+Yang Tse (25 Apr 2012)
+- INSTALL: remove more sections that don't apply to c-ares
+
+- ares_timeout.c: fix compiler warning
+
+Daniel Stenberg (25 Apr 2012)
+- [Ben Noordhuis brought this change]
+
+ Makefile.m32: fix mingw32 build
+
+ * add . to include path so ares_build.h is picked up
+ * make ar configurable to ease cross-compiling
+
+- RELEASE-NOTES: added what's happened since 1.7.5
+
+Guenter Knauf (22 Apr 2012)
+- Updated copyright year.
+
+Yang Tse (21 Apr 2012)
+- ares_init.c: Further refactoring of Windows system's DNS fetching code
+
+Guenter Knauf (20 Apr 2012)
+- Android: small changes to dns property part.
+
+ Prefix prop vars; kill var; use DNS_PROP_NAME_PREFIX macro.
+
+- Handle CNAME-only in ares_parse_aaaa_reply().
+
+ posted to the c-ares list by Peter Griess <pg@std.in>.
+
+- Add support for multiple DNS servers on Android.
+
+ Before, c-ares always used the first DNS server on Android, causing
+ network problems if this DNS server was not available.
+
+ Signed-off-by: Geert Uytterhoeven <Geert.Uytterhoeven@sonycom.com>
+
+- Added INSTALL so it gets into tarballs.
+
+- Added some more ifdefs to silent compiler warnings.
+
+Yang Tse (17 Apr 2012)
+- INSTALL: remove a non c-ares section
+
+- 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.
+
+- setup_once.h: tighten requirements for stdbool.h header inclusion
+
+ Include stdbool.h only when it is available and configure is capable of
+ detecting a proper 'bool' data type when the header is included.
+
+- configure: NATIVE_WINDOWS no longer defined in config file
+
+- cares-compilers.m4: double underscore decoration for visibility attribute
+
+- 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.
+
+- 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.
+
+Guenter Knauf (17 Apr 2012)
+- Added INSTALL file adapted from libcurl.
+
+ Not yet ready, and needs further edits.
+
+Yang Tse (16 Apr 2012)
+- ares_init.c: get_iphlpapi_dns_info() refactoring
+
+Guenter Knauf (16 Apr 2012)
+- Kill some more compiler warnings.
+
+- Kill compiler warning about unused var.
+
+- Fixed my last commit: wrong preprocessor directive.
+
+- Check for __ANDROID__ in addition to ANDROID macro.
+
+- Check for __ANDROID__ in addition to ANDROID macro.
+
+ Posted to c-ares list by Wayne.
+
+- Fix for Android to disable useless arpa/nameser.h.
+
+- Fix for Android to include sys/select.h for fd_set.
+
+Yang Tse (17 Mar 2012)
+- ares_data.c: some NAPTR related 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
+
+- white space cleanup
+
+ - Keep code within 80 columns
+
+ - Removed funny spaces after open paren and before closing paren
+
+- [Poul Thomas Lomholt brought this change]
+
+ 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().
+
+ 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
+
+ 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
+
+- configure: libtool 1.5 tweaks
+
+Daniel Stenberg (19 Dec 2011)
+- ares_timeout.3: fix the NAME section
+
+ It was clearly a copy n' paste error
+
+Yang Tse (27 Sep 2011)
+- [Albert Chin brought this change]
+
+ 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.
+
+- ares_init.c: fix segfault triggered in ares_init_options() upon previous
+ failure of init_by_defaults() and incomplete cleanup there.
+
+- ares_process.c: fix compiler warning
+
+- fix MSVC compiler warning 'conditional expression is constant'
+
+- setup_once.h cleanup and sync
+
+- [Denis Bilenko brought this change]
+
+ ares_getnameinfo: fix random results with c-ares 1.7.5
+
+ In ares_getnameinfo memcpy did not copy enough bytes, causing
+ it to return arbitrary memory contents as a result.
+
+- warnings: fix another 'conversion may lose significant bits' compiler warning
+
+- ares_dns.h: adjust DNS__16BIT and DNS__32BIT macro definitions
+
+ Fixing compiler warnings existing definitions triggered on these.
+
+- ares_destroy.c: fix segfault in ares_destroy_options()
+
+Daniel Stenberg (21 Aug 2011)
+- ares_parse_srv_reply: silence compiler warnings
+
+ ... by adding ugly typecasts.
+
+- CHANGES: generate from script
+
+ The CHANGES file is now generated automatically with 'git2changes.pl',
+ invoked by the maketgz script which is used to build release archives.
+
+ The former human edited CHANGES file was renamed to CHANGES.0 in git.
+
+Yang Tse (21 Aug 2011)
+- Makefile.netware: SIZEOF_SHORT definition
+
+- warnings: fix some 'conversion may lose significant bits' compiler warnings
+
+- configure: fix symbol hiding usability check
+
+ 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...
+
+Version 1.7.5 (16 Aug 2011)
+
+Daniel Stenberg (16 Aug 2011)
+- CHANGES: synced for 1.7.5 release
+
+- RELEASE-NOTES: synced with bb4096effef7f000
+
+Jakub Hrozek (15 Aug 2011)
+- Only fall back to AF_INET searches when looking for AF_UNSPEC addresses
+
+Yang Tse (10 Aug 2011)
+- [Gisle Vanem brought this change]
+
+ ares_iphlpapi.h: Watcom C fix
+
+ 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
+ <ws2def.h> instead.
+
+- [Gisle Vanem brought this change]
+
+ 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().
+
+- cares-compilers.m4: CARES_CONVERT_INCLUDE_TO_ISYSTEM adjustments
+
+ Add CARES_CHECK_COMPILER as a requirement.
+
+ Ensure macro does nothing unless GNU_C or CLANG compiler is used.
+
+ This should allow usage of this macro in unforeseen placements.
+
+- config-win32.h: comments adjustments - followup
+
+- config-win32.h: comments adjustments
+
+Daniel Stenberg (5 Aug 2011)
+- [Tom Hughes brought this change]
+
+ ares_parse_a_reply: fix memleak
+
+Yang Tse (29 Jul 2011)
+- cares-functions.m4 serial # bump
+
+- Revert "configure: additional flag checks for fcntl() and socket()"
+
+ This reverts commit 5f2a3b0e48f26d24cb1fefea0dccb92d417dcbf7.
+
+- configure: additional flag checks for fcntl() and socket()
+
+- xc-translit.m4 fix quoting
+
+- configure: avoid direct usage of AS_TR_* macros
+
+- xc-translit.m4 provides transliteration macros with well defined behavior.
+
+Jakub Hrozek (15 Jun 2011)
+- Revert "Only fall back to AF_INET searches when looking for AF_UNSPEC addresses"
+
+ This reverts commit b5823d65706af687c0e5110af8f0cfdcd068997d.
+
+ This patch was not reviewed properly before pushing
+
+- Revert "Do not use sized constants in public headers"
+
+ This reverts commit 22c01e96f7b2ae9923e1baa50bfe3c0d22297a7d.
+
+ 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
+
+- Fix incorrect sizeof() in ares_save_options
+
+- Fix incorrect allocation in ares_parse_ptr_reply()
+
+- Only fall back to AF_INET searches when looking for AF_UNSPEC addresses
+
+- Do not use sized constants in public headers
+
+Daniel Stenberg (13 Jun 2011)
+- [Jakub Hrozek brought this change]
+
+ ares_free_hostent(NULL) should be a noop
+
+Yang Tse (8 Jun 2011)
+- configure: fix recvfrom 5th arg type qualifier detection (followup)
+
+- configure: fix recvfrom 5th arg type qualifier detection
+
+ Additionally remove whitespace from EOL
+
+Daniel Stenberg (4 Jun 2011)
+- strlen: use size_t to receive the return
+
+Yang Tse (4 Jun 2011)
+- xlc: avoid preprocessor definition usage when linking
+
+- ares_nowarn: icc 9.1 workaround
+
+- ares_nowarn: header inclusion fix
+
+- ares_init: make ares_private.h last included header again
+
+- compiler warning: fix
+
+ Fix compiler warning: conversion may lose significant bits
+
+- compiler warning: fix
+
+ Fix compiler warning: variable was set but never used
+
+ Fix compiler warning: clobber ignored
+
+- ares_iphlpapi: fix compiler warnings
+
+- winsock: compilation fixes
+
+ Provide winsock iphlpapi alternative definitions to prevent compilation
+ failures when using a variety of winsock header implementations.
+
+Daniel Stenberg (17 May 2011)
+- [David Stuart brought this change]
+
+ IPv6-on-windows: find DNS servers correctly
+
+- man pages: docs for the c-ares utility programs
+
+- ares_parse_ns_reply.c: remove CVSism
+
+Yang Tse (27 Mar 2011)
+- build: fix header inclusion
+
+- getservbyport replacement for Win CE
+
+- renamed getplatform() to ares__getplatform() to avoid namespace pollution
+
+- configure: fix libtool warning
+
+ 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.
+
+- adig: RFC4034 resource record type detection
+
+ Can be tested with: adig -s 8.8.8.8 -t ANY example.com
+
+- nameser.h: RFC4034 resource record type definitions
+
+- build: move platform stuff to ares_platform.c and ares_platform.h
+
+- build: find out windows platform using GetVersionEx()
+
+- build: use getenv() replacement function for systems which lack it
+
+- setup_once: system error codes for Windows CE
+
+- ares_search: use ERRNO macro for portability sake
+
+- System's errno.h inclusion cleanup follow-up.
+
+ System's errno.h is conditionally included from setup_once.h
+
+- Windows CE specific adjustment
+
+ All versions of Windows CE support Winsock 1.1
+
+- System's errno.h inclusion cleanup.
+
+ System's errno.h is conditionally included from setup_once.h
+
+- ares_init: fix gethostname error detection on winsock platforms
+
+- configure: r-enable temporarily disabled detection of system's inet_ntop()
+
+ Detection was temporarily disabled in commit 674e044ccb21f2f63537da53565fce868f
+
+Daniel Stenberg (15 Mar 2011)
+- configure: stop using the deprecated AM_INIT_AUTOMAKE syntax
+
+- [Gisle Vanem brought this change]
+
+ Watt-32: use errno
+
+ Make sure Watt-32 programs use 'errno' even on Win32 targets
+
+Guenter Knauf (18 Feb 2011)
+- Removed commented CLFAGS no longer needed.
+
+- Fixed CFLAGS for NetWare.
+
+ Added -m32 to enable compilation with x86_64 compilers;
+ added conditional to set -fpcc-struct-return only for gcc compiler.
+
+Daniel Stenberg (18 Feb 2011)
+- [Gisle Vanem brought this change]
+
+ Watt32: fix server init
+
+ Somewhere in the process, programs using the Watt-32 tcp/ip stack
+ stopped working.
+
+- [Dima Tisnek brought this change]
+
+ config_sortlist: (win32) missing else
+
+ 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
+
+- Makefile.msvc: add a couple of VS version strings
+
+- build: add install target to Makefile.msvc
+
+Daniel Stenberg (27 Dec 2010)
+- ares_set_servers_csv: remove unused variables
+
+- init_by_resolv_conf: fix compiler warnings
+
+ 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
+
+- advance_tcp_send_queue: avoid NULL ptr dereference
+
+ 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]
+
+ configure: fix a bashism
+
+- cleanup: avoid unsafe typecasts
+
+ 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
+
+- configure: temporarily disable detection of system's inet_ntop()
+
+ 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
+
+ Existing definition of SPRINTF always resulted in sprintf() being used,
+ and sprintf() returning 'int' is already used throughout the library.
+
+- ares_inet_ntop: reapply changes from previous c-ares version (III)
+
+ - Replace 'u_char' with 'unsigned char'.
+ - Replace 'u_int' with 'unsigned int'.
+ - use macros ERRNO and SET_ERRNO() for errno handling.
+
+- ares_inet_ntop: reapply changes from previous c-ares version (II)
+
+ - Remove rcsid.
+ - Adjust header file inclusions.
+ - ares_inet_ntop used only on systems without a proper inet_ntop function.
+
+- 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_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.
+
+- ares_nowarn: add conditional inclusion of assert.h header
+
+- fix compiler warning: conversion may lose significant bits
+
+- 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.
+
+- setup_once: provide ISASCII macro
+
+- 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.
+
+ HAVE_INET_NET_PTON_IPV6 is no longer defined nor used.
+
+- ares_init: fix detection of semicolon comments in resolv.conf
+
+ 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
+
+Version 1.7.4 (8 Dec 2010)
+
+Daniel Stenberg (8 Dec 2010)
+- release-preps: CHANGES and RELEASE-NOTES synced
+
+- ares_set_local_*: added in 1.7.4, not before
+
+Yang Tse (3 Dec 2010)
+- build: provide SIZEOF_SIZE_T definition for non-configure builds
+
+- build: config.dos renamed to config-dos.h
+
+- build: provide SIZEOF_SIZE_T netware definition
+
+- ares_gethostbyaddr: fix compiler warning: conversion may lose significant bits
+
+- configure: undo using autobuilds to temporarily verify strict aliasing warnings.
+
+- fix compiler warning: rounding, sign extension, or loss of accuracy may result
+
+Daniel Stenberg (2 Dec 2010)
+- [Ben Noordhuis brought this change]
+
+ ares_parse_a_reply: fix CNAME response parsing
+
+ Reply to a CNAME query doesn't contain addresses, causing
+ ares_parse_a_reply() to bail out with ARES_ENODATA
+
+ Bug: http://groups.google.com/group/nodejs/browse_thread/thread/a1268c9ea5e9ad9b
+
+Yang Tse (1 Dec 2010)
+- fix compiler warning: conversion may lose significant bits
+
+- atoi: remove atoi usage
+
+- ares_init: fix compiler warning: conversion may lose significant bits
+
+- configure: fix autoconf warning
+
+- inet_pton: fix compiler warning
+
+- configure: use autobuilds to temporarily verify strict aliasing warnings.
+
+ 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
+
+- 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.
+
+- 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.
+
+- ares_getnameinfo: fix two compiler warnings
+
+- Added another VS10 version string
+
+- Fix GCC 4 compiler warning 'dereferencing type-punned pointer might break strict-aliasing rules'.
+
+- Revert commit 494274e653936335c255a47599970de3df21e7c4
+
+- configure: fix autoconf 2.68 warning: no AC_LANG_SOURCE call detected in body
+
+- Fix compiler warning: array subscript has type 'char'
+
+- Fix GCC 4 compiler warning 'dereferencing type-punned pointer might break strict-aliasing rules'.
+
+- 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'.
+
+ 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.
+
+Daniel Stenberg (12 Nov 2010)
+- [Patrik Thunstrom brought this change]
+
+ adig: fix NAPTR parsing
+
+ I ran across a small "issue" in your adig example.
+
+ 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
+
+- 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.
+
+Guenter Knauf (3 Oct 2010)
+- Minor Watcom makefile tweaks.
+
+Daniel Stenberg (30 Sep 2010)
+- [Mike Crowe brought this change]
+
+ 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.
+
+ Signed-off-by: Mike Crowe <mac@mcrowe.com>
+
+Ben Greear (24 Aug 2010)
+- Add missing break that caused get_ares_servers to fail.
+
+ Reported-by: Ning Dong <flintning@163.com>
+ Signed-off-by: Ben Greear <greearb@candelatech.com>
+
+Yang Tse (11 Aug 2010)
+- configure: werror related adjustments
+
+Guenter Knauf (8 Aug 2010)
+- Added copyright string to ares_version.h and make use of it in other files.
+
+- Block created ares_build.h for NetWare to avoid usage from other platforms.
+
+- Fix to overwrite default libname.
+
+- Some more Watcom makefile massage ...
+
+- Some more Watcom makefile massage ...
+
+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 <greearb@candelatech.com>
+ Tested-by: Tor Arntsen <tor@spacetec.no>
+
+Guenter Knauf (3 Aug 2010)
+- Added Watcom makefile based on libcurl's Makefile.Watcom.
+
+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 <greearb@candelatech.com>
+
+- 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 <greearb@candelatech.com>
+
+Daniel Stenberg (31 Jul 2010)
+- ares_set_servers_csv: use ISDIGIT
+
+ The IS*() set of macros are preferred to the regular is*() functions as
+ they help us avoid the most common pitfalls.
+
+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 <greearb@candelatech.com>
+
+- remove all uses of uint32_t
+
+ Previous fix forgot a few.
+
+ Signed-off-by: Ben Greear <greearb@candelatech.com>
+
+- fix signed v/s unsigned casts warning in ares_gethostbyaddr.c
+
+ Signed-off-by: Ben Greear <greearb@candelatech.com>
+
+- local-bind-fixup: Fix inet_pton warning.
+
+ Conditionally include <arpa/inet.h> for inet_pton
+ headers.
+
+ Signed-off-by: Ben Greear <greearb@candelatech.com>
+
+- build: Enable compiling with -Werror.
+
+ This helps find compile warnings because they simply break
+ the build.
+
+ To use:
+ ./configure --enable-warnings --enable-werror
+
+ Signed-off-by: Ben Greear <greearb@candelatech.com>
+
+- ipv6: Fix some build issues related to the local-bind feature.
+
+ Signed-off-by: Ben Greear <greearb@candelatech.com>
+
+Guenter Knauf (29 Jul 2010)
+- Replaced uint32_t with unsigned int to fix broken builds on a couple of platforms.
+
+Daniel Stenberg (18 Jul 2010)
+- [Ben Greear brought this change]
+
+ local-bind: Support binding to local interface/IPs
+
+ 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.
+
+ Signed-off-by: Ben Greear <greearb@candelatech.com>
+
+- 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
+
+Daniel Stenberg (10 Jun 2010)
+- tarball: add $(CSOURCES) $(HHEADERS) to EXTRA_DIST
+
+ 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
+
+- repair the file mode
+
+- remove all $Id$ lines
+
+- remove all .cvsignore files
+
+- spell fix
+
+ 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)
+
+Daniel Stenberg (23 Mar 2010)
+- 1.7.1
+
+- made README the primary readme file
+
+ ... and did README.cares to contain a historic reason etc.
+
+- s/CVS/git
+
+- git now, not CVS
+
+- ignore lots of generated files
+
+- [Daniel Johnson brought this change]
+
+ Fix warnings for clang
+
+Yang Tse (17 Mar 2010)
+- replaced intel compiler option -no-ansi-alias with -fno-strict-aliasing
+
+- update outdated serial number
+
+- fix compiler warning
+
+- watt32 compilation fix
+
+- Added another VS10 version string
+
+- fix line break
+
+- removed usage of 's6_addr', fixing compilation issue triggered with no
+ longer using 'in6_addr' but only our 'ares_in6_addr' struct
+
+Daniel Stenberg (5 Mar 2010)
+- Daniel Johnson provided fixes for building with the clang compiler
+
+Yang Tse (5 Mar 2010)
+- Added IPv6 name servers support
+
+Gisle Vanem (5 Mar 2010)
+- Ops!. Readded ares_nowarn.h.
+
+- Added ares_nowarn.c.
+
+Yang Tse (28 Feb 2010)
+- Added SIZEOF_INT and SIZEOF_SHORT definitions for non-configure systems
+
+- Added ares_nowarn.* to VC6 project file
+
+- Added SIZEOF_INT definition
+
+- fix compiler warning
+
+- fix compiler warning
+
+- fix compiler warning
+
+Daniel Stenberg (17 Feb 2010)
+- 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
+
+- - Tommie Gannert pointed out a silly bug in ares_process_fd() since it didn't
+ check for broken connections like ares_process() did. Based on that, I
+ merged the two functions into a single generic one with two front-ends.
+
+Yang Tse (30 Dec 2009)
+- VMS specific preprocessor symbol checking adjustments
+
+- Mention last changes
+
+- - Fix configure_socket() to use ares_socket_t instead of int data type.
+
+- - Where run-time error checks enabling compiler option /GZ was used it is now
+ replaced with equivalent /RTCsu for Visual Studio 2003 and newer versions.
+
+ - Compiler option /GX is now replaced with equivalent /EHsc for all versions.
+
+- - Ingmar Runge noticed that Windows config-win32.h configuration file
+ did not include a definition for HAVE_CLOSESOCKET which resulted in
+ function close() being inappropriately used to close sockets.
+
+Daniel Stenberg (30 Nov 2009)
+- start working on 1.7.1
+
+Version 1.7.0 (27 Nov 2009)
+
+Yang Tse (27 Nov 2009)
+- Preserve empty line following last target
+
+- - Larry Lansing fixed ares_parse_srv_reply to properly parse replies
+ which might contain non-SRV answers, skipping over potential non-SRV
+ ones such as CNAMEs.
+
+- When using icc, compile with -fpic and link with intel dynamic libraries.
+
+- Added 'currently' in italics to insist on transient situation.
+
+- Fix language
+
+- Daniel wants upcoming release to be 1.7.0
+
+- Mention last changes
+
+- - Removed from external interface preprocessor symbol definition for
+ CARES_HAVE_ARES_FREE_DATA. Current functionality of ares_free_data()
+ makes it unnecessary.
+
+- Added README.msvc
+
+- Changed c-ares naming conventions when using MSVC as described in README.msvc
+
+- - Mention other recent changes
+
+- - Jakub Hrozek renamed addrttl and addr6ttl structs to ares_addrttl and
+ ares_addr6ttl in order to prevent name space pollution, along with
+ necessary changes to code base and man pages.This change does not break
+ ABI, there is no need to recompile existing applications. But existing
+ applications using these structs with the old name will need source code
+ adjustments when recompiled using c-ares 1.6.1.
+
+- - Jakub Hrozek fixed more function prototypes in man pages to sync them
+ with the ones declared in ares.h
+
+- Make configure remove the ares_build.h file included in distribution tarballs.
+
+- Fix macro redefinition.
+
+- Fix name space pollution.
+
+- Allow using different extra import libraries for debug and release builds.
+
+- Add manifest stuff to msvc makefile
+
+- Sync man page with reality
+
+- Add missing external API decoration for ares_set_socket_callback()
+
+- Add ares_free_data() man page.
+
+- - Provide in external interface preprocessor symbol definitions for
+ CARES_HAVE_ARES_FREE_DATA as an indication of function availability.
+
+- Remove typecast
+
+- Fix comment
+
+- Add ares_data.c and ares_data.h
+
+- Jakub Hrozek modified ares_parse_srv_reply() and ares_parse_txt_reply() API
+ to return a linked lists of results. These were also modified to internally
+ use the ares_data memory struct and as such its result must be free'ed with
+ ares_free_data().
+
+- Initial support for the generic ares_free_data() function that will allow
+ applications to free memory allocated and returned by some c-ares funtions.
+
+- Make usage of calloc()'s arguments consistent with rest of code base
+
+- workaround icc 9.1 optimizer issue
+
+- Add icc fvisibility bug test
+
+- Fix icc 9.0 compiler warning: external definition with no prior declaration
+
+- Fix three var names
+
+- Add check for assert.h header file
+
+- getaddrinfo is fully thread safe on solaris versions which
+ implement the function even when h_errno is not a macro.
+
+ The h_errno macro test now only done on systems for which there
+ is no hard coded knowledge about getaddrinfo's thread safeness.
+
+- Remove files generated on previous buildconf/configure run
+
+- Remove enable-thread / disable-thread configure option. These were only placebo
+ options. The library is always built as thread safe as possible on every system.
+
+- Refactor how preprocessor symbol _THREAD_SAFE definition is done.
+
+- Assume that getaddrinfo is thread safe, unless hard coded
+ knowledge says the contrary or h_errno is not defined.
+
+- Related with the threadsafe capability of getaddrinfo:
+
+ - Constantine Sapuntzakis reported that Darwin 6.0 a.k.a. MAC OS X 10.2
+ and newer have a threadsafe getaddrinfo.
+
+ - Fix Dragonfly BSD triplet detection.
+
+ - In case the hard-coded knowledge says that getaddrinfo is threadsafe,
+ an additional check is done to verify that h_errno is also defined.
+ If h_errno isn't defined, we finally assume that it isn't threadsafe.
+ Jamie Lokier provided the inspiration for this extra check.
+
+- AIX 5.2 and newer have threadsafe getaddrinfo.
+
+ Add some comments to better understand what the regex's pretend to achieve.
+
+- HP-UX 11.11 and later have threadsafe getaddrinfo
+
+- Check if getaddrinfo is threadsafe when function check allows it to be used
+
+- Renamed fpGetNetworkParams and fpSystemFunction036 to avoid namespace pollution with static library
+
+- Add kernel32.lib
+
+- Mention last changes
+
+- Reinstate copyright symbol lost in previous commit
+
+- Make some strings different in resource file for debug or release builds
+
+- Ignore more subdirs
+
+- Fix compiler warning: conditional expression is constant
+
+- Sync linker and resource compiler options with Makefile.msvc
+
+- Follow Makefile.msvc subdirectory naming scheme, and sync compiler options
+
+- Updated MSVC makefile that allows building dynamic and static
+ c-ares libraries in debug and release flavours.
+
+ Additionally each of the three sample programs is built against
+ each of the four possible c-ares libraries, generating all this
+ a total number of 12 executables and 4 libraries.
+
+- Test for USE_WINSOCK since it is more restrictive than WIN32
+
+- Make header inclusion depend on HAVE_*_H definition
+
+- Remove unneeded preprocessor directives
+
+- Adjust c-ares include paths for memory tracking enabled (--enable-curldebug) builds
+
+- source files used by sample programs
+
+- Renamed c-ares setup.h to ares_setup.h
+
+- Adjust include paths to take in account that currently:
+
+ c-ares with --enable-curldebug uses memdebug.h from libcurl's lib subdirectory.
+
+ memdebug.h needs access to libcurl's setup.h from libcurl's lib subdirectory
+ and also needs access to libcurl's generated curl_config.h
+
+- Undo old temporary change once used for testing purposes
+
+- Mention many changes
+
+- Mention --enable-symbol-hiding configure option
+
+- Symbol hiding configure options renamed to the hopefully less ambiguous
+ --enable-symbol-hiding and --disable-symbol-hiding as well as related
+ macro names and some internal variables used for them.
+
+ Related configuration file preprocessor symbols named to
+ CARES_SYMBOL_HIDING and CARES_SYMBOL_SCOPE_EXTERN.
+
+- Header inclusion depending on HAVE_* symbol.
+ Fix two typos.
+
+- Comparison of the Initial revision of this file with ares_parse_a_reply.c
+ shows that this one is actually a modified copy of ares_parse_a_reply.c.
+
+ In order to comply with ares_parse_a_reply.c's M.I.T. license, the old
+ 1998 M.I.T. copyright notice is now also preserved in this file the same
+ as it is done in other ares_parse_*.c files.
+
+- Add CVS Id tag.
+ Fix identation of some license lines.
+
+- Add CVS Id tag.
+
+- Fix comment
+
+- In no particular order, changed/fixed all of the following in
+ ares_parse_txt_reply() current version:
+
+ - Fixed a couple of potential double free's.
+
+ - Fixed memory leaks upon out of memory condition.
+
+ - Fixed pointer arithmetic.
+
+ - Setting ntxtreply to zero upon entry for all failure cases.
+
+ - Changed data type to size_t for variables substr_len, str_len and
+ the length member of ares_txt_reply struct.
+
+ - Avoided a couple of memcpy() calls.
+
+ - Changed i data type to unsigned int to prevent compiler warnings.
+
+ - Adjusted a comment.
+
+ - Use ARES_SUCCESS literal for successfull completion.
+
+ - Added CVS Id tag.
+
+- Add c-ares DLL resource file to distribution archive
+
+- ignore files
+
+- Empty subdir
+
+- Updated MSVC 6.0 workspace and project files that allows building
+ dynamic and static c-ares libraries in debug and release flavours.
+
+ Additionally each of the three sample programs is built against
+ each of the four possible c-ares libraries, generating all this
+ a total number of 12 executables and 4 libraries.
+
+Daniel Stenberg (29 Oct 2009)
+- no need to check for NULL pointers before dereferencing, as the pointers
+ MUST be valid and they are dereferenced further down in the function
+ unconditionally!
+
+- shorten the descriptions somewhat
+
+- update to the new struct name
+
+- Jakub Hrozek added ares_parse_txt_reply() for TXT parsing
+
+- use 'ares_srv_reply' for proper name-spacing
+
+Yang Tse (29 Oct 2009)
+- Add reference for ares_parse_srv_reply.pdf
+
+- Add reference for ares_parse_srv_reply docs
+
+- External API function linkage decoration adjustment
+
+- External API function linkage decoration adjustment
+
+- Initial step towards the ability to reduce c-ares exported symbols
+ based on the 'visibility' attribute for GNUC and __global for Sun
+ compilers, taking also in account __declspec function decoration
+ for Win32 and Symbian DLL's.
+
+ Introducing configure options --enable-hidden-symbols and
+ --disable-hidden-symbols following libcurl's naming.
+
+- Fix comment
+
+- Fix spelling
+
+- Fix Pelles C Win32 target compilation issues
+
+- John Engelhart noticed an unreleased problem relative to a duplicate
+ ARES_ECANCELLED error code value and missing error code description.
+
+- Fix compiler warning: local variable may be used without having been initialized
+
+- Use *_CHECK_PATH_SEPARATOR_REQUIRED to ensure that *_CHECK_PATH_SEPARATOR
+ is only expanded and included once in the configure script.
+
+- Our _AS_PATH_SEPARATOR_PREPARE override is now m4_defun'd instead of m4_define'd
+ due to autoconf 2.64 m4_require'ing it in _AS_SHELL_SANITIZE indirectly through
+ _AS_PATH_WALK.
+
+- Fix compiler warning: argument is incompatible with corresponding format string conversion
+
+- Fix potential out-of-bounds read
+
+- Fix compiler warning: loop without body
+
+- Fix compiler warning
+
+- Fix compiler warning
+
+- Fix compiler warning
+
+- Fix compiler warning: addition result could be truncated before cast to bigger sized type
+
+- Overhauled ares__get_hostent()
+
+ - Fixing out of bounds memory overwrite triggered with malformed /etc/hosts file.
+ - Improving parsing of /etc/hosts file.
+ - Validating requested address family.
+ - Ensuring that failures always return a NULL pointer.
+ - Adjusting header inclusions.
+
+- Fix ssize_t redefinition errors on WIN64 reported by Alexey Simak
+
+- more files to ignore
+
+- Check if _REENTRANT definition is required to
+ make errno available as a preprocessor macro.
+
+- Attempt to silence bogus compiler warning: "Potential null pointer dereference"
+
+- ignore more files
+
+Gisle Vanem (7 Sep 2009)
+- Suppress warnings about unused prototypes in Watt32 and Win32 programs.
+
+- Update email address.
+
+- Update my email address. Add ares_config.h as dependency for 'make depend'.
+
+Yang Tse (6 Sep 2009)
+- T_SRV portability check
+
+Gunter Knauf (5 Sep 2009)
+- changed includes to match style how we do with all other *.c files.
+
+- changed u_int16_t to unsigned short because it is the only place within ares and curl where such a type would be used;
+ also it broke many autobuilds. We should probably introduce an ares_port_t if we want to use a type here.
+
+Gisle Vanem (5 Sep 2009)
+- Replace 'uint16_t' with 'u_int16_t' since the latter is used in ares.h.
+
+- Added 'ares_parse_srv_reply.obj'. Added definition of 'u_int16_t'. This is I don't like; we should not depend on such non-universal types in a public header. But this is just a quick fix.
+
+Daniel Stenberg (4 Sep 2009)
+- - Jakub Hrozek added ares_parse_srv_reply() for SRV parsing
+
+Steinar H. Gunderson (27 Aug 2009)
+- Support lookup of IPv4 literals in ares_gethostbyname(), even when the address family is set to AF_INET6.
+
+Gisle Vanem (3 Aug 2009)
+- Remove call to LoadLibrary(). (leftover from debugging).
+
+- Fix bad sentence.
+
+Daniel Stenberg (3 Aug 2009)
+- - Timo Teras changed the reason code used in the resolve callback done when
+ ares_cancel() is used, to be ARES_ECANCELLED instead of ARES_ETIMEOUT to
+ better allow the callback to know what's happening.
+
+- - Joshua Kwan fixed the init routine to fill in the defaults for stuff that
+ fails to get inited by other means. This fixes a case of when the c-ares
+ init fails when internet access is fone.
+
+Gunter Knauf (16 Jul 2009)
+- test if adding ../lib to includes can fix the current break ...
+
+- renamed generated config.h to ares_config.h in order to avoid clashes when libcurl is used with other projects which also have a config.h.
+
+Yang Tse (21 Jun 2009)
+- Refactor how libraries are checked for connect() function, follow-up.
+
+- Refactor how libraries are checked for connect() function,
+ and check for connect() as it is done for other functions.
+
+Gisle Vanem (20 Jun 2009)
+- Remove unneeded defines.
+
+- Use select_s() and not select().
+
+Yang Tse (19 Jun 2009)
+- sclose() function-like macro definition used to close a socket,
+ now solely based on HAVE_CLOSESOCKET and HAVE_CLOSESOCKET_CAMEL
+ config file preprocessor definitions.
+
+- add CloseSocket camel case function check
+
+- check for socket() and closesocket() as it is done for other functions
+
+- Remove HAVE_CONFIG_H definition from here,
+ CFLAGS from common.dj already defines it.
+
+- initial step towards decoupling c-ares from libcurl for DOS
+
+- don't ignore these subdirs, they must be removed first
+
+- Remove DEBUGBUILD symbol definition, is not required for programs using the library.
+
+- DEBUGBUILD symbol definition for debug builds
+
+- ignore some subdirs
+
+- fix comment
+
+- Try to make more clear that --enable-curldebug has nothing to do with --enable-debug for this library.
+
+- Revert last change, it is inappropriate.
+
+Gisle Vanem (12 Jun 2009)
+- Replace CURLDEBUG with DEBUGBUILD.
+
+Yang Tse (11 Jun 2009)
+- when running automake copy missing files instead of symlinking them
+
+- Adjusted to take in account that...
+
+ With the curl memory tracking feature decoupled from the debug build feature,
+ CURLDEBUG and DEBUGBUILD preprocessor symbol definitions are used as follows:
+
+ CURLDEBUG used for curl debug memory tracking specific code (--enable-curldebug)
+
+ DEBUGBUILD used for debug enabled specific code (--enable-debug)
+
+- c-ares' --enable-debug --enable-curldebug decoupling follow-up
+
+- mention last changes
+
+- Remove buildconf.bat from release and daily snapshot archives.
+
+ buildconf.bat is only for CVS tree builds.
+
+- Ensure that buildconf.bat does nothing unless it is used with a CVS checkout.
+
+- CVS-INFO file only present in CVS tree, never in release nor daily snapshot
+ archives. Used as a sentinel file in buildconf.bat to differentiate CVS builds.
+
+Gisle Vanem (8 Jun 2009)
+- Update comment about "ML". Removed "-D_USE_32BIT_TIME_T" (not a requirement).
+
+Yang Tse (8 Jun 2009)
+- just comment it out
+
+- For debugging purposes...
+
+ Disable the '-export-symbols-regex' to discard this as the origin
+ of link failures related with shared libraries and non-GNU linkers.
+
+- c-ares Makefile.am back to using $(top_builddir) for *_LDADD
+
+- c-ares' -no-undefined and --enable-curldebug adjustments
+
+- Use relative path to built c-ares tree libtool library
+
+- John E. Malmberg noticed that the configure script was failing to detect the
+ timeval struct on VMS when building with _XOPEN_SOURCE_EXTENDED undefined due
+ to definition taking place in socket.h instead of time.h
+
+- Fix compiler warning: out of bound access
+
+- fix compilation on AIX
+
+- c-ares' --enable-curldebug adjustments
+
+- Remove temporarily introduced memory leak.
+
+- Temporarily introduce a memory leak to verify curl debug memory tracking works.
+
+- Allow curl debug memory tracking when building a shared library on
+ systems which support external, undefined, symbols in shared libraries.
+
+Daniel Stenberg (26 May 2009)
+- language fix
+
+Yang Tse (26 May 2009)
+- Make ares_init(), ares_dup() and ares_init_options() return ARES_ENOTINITIALIZED
+ if library initialization has not been performed calling ares_library_init().
+
+- c-ares's --enable-curldebug configure option decoupled from c-ares's --enable-debug
+
+- Prevent copying 'sourced' manpages for build targets that don't use them.
+
+Daniel Stenberg (23 May 2009)
+- minor edits
+
+Yang Tse (21 May 2009)
+- Include .pdf versions of c-ares man pages in distribution tarball.
+
+- Allow generation of .html and .pdf versions of c-ares man pages.
+
+Gisle Vanem (21 May 2009)
+- $(OBJ_DIR)/ares_getopt.o must be cleaned explicitly.
+
+Yang Tse (20 May 2009)
+- Mention last changes
+
+- Initial ares_library_cleanup(3) man page
+
+- Update man page
+
+- Update man page
+
+- Initial ares_library_init(3) man page attempt
+
+- Force revision update, to force CVS to update the $Id date string format
+
+- Add same copyright notice as other c-ares files
+
+- Fix case
+
+- Remove run-time requirement for advapi32.dll since
+ c-ares can work even with no advapi32.dll at all.
+
+- Intentionally avoid checking if the address of SystemFunction036, a.k.a.
+ RtlGenRandom, has been located or not. This function is only available on
+ WinXP and later. When unavailable c-ares uses portable rand() function.
+
+- - Provide in external interface preprocessor symbol definitions for
+ CARES_HAVE_ARES_LIBRARY_INIT and CARES_HAVE_ARES_LIBRARY_CLEANUP
+ to ease the use of new capabilities.
+
+ - Move ares_version() prototype to ares.h
+
+- Introduction of ares_library_init() and ares_library_cleanup()
+
+- Introduction of ares_library_init() and ares_library_cleanup()
+
+- remove outdated comment
+
+- Fix preprocessor conditional expression
+
+- fiX *__SOCKLEN_T definitions for remaining targets
+
+- *__SOCKLEN_T definitions for OS400 already fixed
+
+- fIX *__SOCKLEN_T definitions for SYMBIAN32 and VMS targets
+
+Daniel Stenberg (11 May 2009)
+- - Gregor Jasny made c-ares link with libtool 's -export-symbols-regex option to
+ only expose functions starting with ares_.
+
+Yang Tse (11 May 2009)
+- Remove experimental check. Currently there's no need for it.
+
+- Fix an m4 overquoting triggering a spurious 'AS_TR_CPP' symbol definition
+ attempt in generated config.h
+
+- Proper naming for the experimental compiler test and moved to *-compilers.m4
+
+- Moved *_CHECK_COMPILER_HALT_ON_ERROR and *_CHECK_COMPILER_ARRAY_SIZE_NEGATIVE to *-compilers.m4 along with other *_CHECK_COMPILER_*
+
+- fIX *__SOCKLEN_T definitions for OS400 and generic GCC targets
+
+- fIX *__SOCKLEN_T definitions for MVS and 370 targets
+
+- fIX *__SOCKLEN_T definitions for several Windows target tool-chains
+
+- HP-UX's X/Open network library requirement check follow-up
+
+- HP-UX's X/Open network library requirement check follow-up
+
+- Use build-time configured ares_socklen_t instead of socklen_t
+
+- David McCreedy's "TPF-platform specific changes to various files" patch follow-up
+
+Daniel Stenberg (1 May 2009)
+- s/libcurl/c-ares
+
+- version number typo fix
+
+Yang Tse (1 May 2009)
+- David McCreedy's "TPF-platform specific changes to various files" patch
diff --git a/contrib/libs/c-ares/INSTALL.md b/contrib/libs/c-ares/INSTALL.md
new file mode 100644
index 0000000000..cbf1fc8f9b
--- /dev/null
+++ b/contrib/libs/c-ares/INSTALL.md
@@ -0,0 +1,415 @@
+** This file is adapted from libcurl and not yet fully rewritten for c-ares! **
+
+```
+ ___ __ _ _ __ ___ ___
+ / __| ___ / _` | '__/ _ \/ __|
+ | (_ |___| (_| | | | __/\__ \
+ \___| \__,_|_| \___||___/
+
+ How To Compile
+```
+
+Installing Binary Packages
+==========================
+
+Lots of people download binary distributions of c-ares. This document
+does not describe how to install c-ares using such a binary package.
+This document describes how to compile, build and install c-ares from
+source code.
+
+Building from Git
+=================
+
+If you get your code off a Git repository rather than an official
+release tarball, see the [GIT-INFO](GIT-INFO) file in the root directory
+for specific instructions on how to proceed.
+
+In particular, if not using CMake you will need to run `./buildconf` (Unix) or
+`buildconf.bat` (Windows) to generate build files, and for the former
+you will need a local installation of Autotools. If using CMake the steps are
+the same for both Git and official release tarballs.
+
+AutoTools Build
+===============
+
+### General Information, works on most Unix Platforms (Linux, FreeBSD, etc)
+
+A normal Unix installation is made in three or four steps (after you've
+unpacked the source archive):
+
+ ./configure
+ make
+ make ahost adig acountry (optional)
+ make install
+
+You probably need to be root when doing the last command.
+
+If you have checked out the sources from the git repository, read the
+[GIT-INFO](GIT_INFO) on how to proceed.
+
+Get a full listing of all available configure options by invoking it like:
+
+ ./configure --help
+
+If you want to install c-ares in a different file hierarchy than /usr/local,
+you need to specify that already when running configure:
+
+ ./configure --prefix=/path/to/c-ares/tree
+
+If you happen to have write permission in that directory, you can do `make
+install` without being root. An example of this would be to make a local
+install in your own home directory:
+
+ ./configure --prefix=$HOME
+ make
+ make install
+
+### More Options
+
+To force configure to use the standard cc compiler if both cc and gcc are
+present, run configure like
+
+ CC=cc ./configure
+ # or
+ env CC=cc ./configure
+
+To force a static library compile, disable the shared library creation
+by running configure like:
+
+ ./configure --disable-shared
+
+If you're a c-ares developer and use gcc, you might want to enable more
+debug options with the `--enable-debug` option.
+
+### Special Cases
+
+Some versions of uClibc require configuring with `CPPFLAGS=-D_GNU_SOURCE=1`
+to get correct large file support.
+
+The Open Watcom C compiler on Linux requires configuring with the variables:
+
+ ./configure CC=owcc AR="$WATCOM/binl/wlib" AR_FLAGS=-q \
+ RANLIB=/bin/true STRIP="$WATCOM/binl/wstrip" CFLAGS=-Wextra
+
+
+### CROSS COMPILE
+
+(This section was graciously brought to us by Jim Duey, with additions by
+Dan Fandrich)
+
+Download and unpack the c-ares package.
+
+`cd` to the new directory. (e.g. `cd c-ares-1.7.6`)
+
+Set environment variables to point to the cross-compile toolchain and call
+configure with any options you need. Be sure and specify the `--host` and
+`--build` parameters at configuration time. The following script is an
+example of cross-compiling for the IBM 405GP PowerPC processor using the
+toolchain from MonteVista for Hardhat Linux.
+
+```sh
+#! /bin/sh
+
+export PATH=$PATH:/opt/hardhat/devkit/ppc/405/bin
+export CPPFLAGS="-I/opt/hardhat/devkit/ppc/405/target/usr/include"
+export AR=ppc_405-ar
+export AS=ppc_405-as
+export LD=ppc_405-ld
+export RANLIB=ppc_405-ranlib
+export CC=ppc_405-gcc
+export NM=ppc_405-nm
+
+./configure --target=powerpc-hardhat-linux \
+ --host=powerpc-hardhat-linux \
+ --build=i586-pc-linux-gnu \
+ --prefix=/opt/hardhat/devkit/ppc/405/target/usr/local \
+ --exec-prefix=/usr/local
+```
+
+You may also need to provide a parameter like `--with-random=/dev/urandom`
+to configure as it cannot detect the presence of a random number
+generating device for a target system. The `--prefix` parameter
+specifies where c-ares will be installed. If `configure` completes
+successfully, do `make` and `make install` as usual.
+
+In some cases, you may be able to simplify the above commands to as
+little as:
+
+ ./configure --host=ARCH-OS
+
+
+### Cygwin (Windows)
+
+Almost identical to the unix installation. Run the configure script in the
+c-ares root with `sh configure`. Make sure you have the sh executable in
+`/bin/` or you'll see the configure fail toward the end.
+
+Run `make`
+
+
+### QNX
+
+(This section was graciously brought to us by David Bentham)
+
+As QNX is targeted for resource constrained environments, the QNX headers
+set conservative limits. This includes the `FD_SETSIZE` macro, set by default
+to 32. Socket descriptors returned within the c-ares library may exceed this,
+resulting in memory faults/SIGSEGV crashes when passed into `select(..)`
+calls using `fd_set` macros.
+
+A good all-round solution to this is to override the default when building
+c-ares, by overriding `CFLAGS` during configure, example:
+
+ # configure CFLAGS='-DFD_SETSIZE=64 -g -O2'
+
+
+### RISC OS
+
+The library can be cross-compiled using gccsdk as follows:
+
+ CC=riscos-gcc AR=riscos-ar RANLIB='riscos-ar -s' ./configure \
+ --host=arm-riscos-aof --without-random --disable-shared
+ make
+
+where `riscos-gcc` and `riscos-ar` are links to the gccsdk tools.
+You can then link your program with `c-ares/lib/.libs/libcares.a`.
+
+
+### Android
+
+Method using a configure cross-compile (tested with Android NDK r7b):
+
+ - prepare the toolchain of the Android NDK for standalone use; this can
+ be done by invoking the script:
+
+ ./tools/make-standalone-toolchain.sh
+
+ which creates a usual cross-compile toolchain. Lets assume that you put
+ this toolchain below `/opt` then invoke configure with something
+ like:
+
+ ```
+ export PATH=/opt/arm-linux-androideabi-4.4.3/bin:$PATH
+ ./configure --host=arm-linux-androideabi [more configure options]
+ make
+ ```
+ - if you want to compile directly from our GIT repo you might run into
+ this issue with older automake stuff:
+
+ ```
+ checking host system type...
+ Invalid configuration `arm-linux-androideabi':
+ system `androideabi' not recognized
+ configure: error: /bin/sh ./config.sub arm-linux-androideabi failed
+ ```
+ this issue can be fixed with using more recent versions of `config.sub`
+ and `config.guess` which can be obtained here:
+ http://git.savannah.gnu.org/gitweb/?p=config.git;a=tree
+ you need to replace your system-own versions which usually can be
+ found in your automake folder:
+ `find /usr -name config.sub`
+
+
+CMake builds
+============
+
+Current releases of c-ares introduce a CMake v3+ build system that has been
+tested on most platforms including Windows, Linux, FreeBSD, MacOS, AIX and
+Solaris.
+
+In the most basic form, building with CMake might look like:
+
+```sh
+cd /path/to/cmake/source
+mkdir build
+cd build
+cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local/cares ..
+make
+sudo make install
+```
+
+Options
+-------
+
+Options to CMake are passed on the command line using "-D${OPTION}=${VALUE}".
+The values defined are all boolean and take values like On, Off, True, False.
+
+* CARES_STATIC - Build the static library (off by default)
+* CARES_SHARED - Build the shared library (on by default)
+* CARES_INSTALL - Hook in installation, useful to disable if chain building
+* CARES_STATIC_PIC - Build the static library as position-independent (off by
+ default)
+
+
+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:
+
+```sh
+cd /path/to/cmake/source
+mkdir build
+cd build
+cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local/cares -G "Ninja" ..
+ninja
+sudo ninja install
+```
+
+Windows MSVC Command Line
+-------------------------
+
+```
+cd \path\to\cmake\source
+mkdir build
+cd build
+cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=C:\cares -G "NMake Makefiles" ..
+nmake
+nmake install
+```
+
+Windows MinGW-w64 Command Line via MSYS
+---------------------------------------
+```
+cd \path\to\cmake\source
+mkdir build
+cd build
+cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=C:\cares -G "MSYS Makefiles" ..
+make
+make install
+```
+
+
+Platform-specific build systems
+===============================
+
+Win32
+-----
+
+### Building Windows DLLs and C run-time (CRT) linkage issues
+
+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
+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
+
+If your app is misbehaving in some strange way, or it is suffering
+from memory corruption, before asking for further help, please try
+first to rebuild every single library your app uses as well as your
+app using the debug multithreaded dynamic C runtime.
+
+
+### MingW32
+
+Make sure that MinGW32's bin dir is in the search path, for example:
+
+ set PATH=c:\mingw32\bin;%PATH%
+
+then run 'make -f Makefile.m32' in the root dir.
+
+
+### MSVC 6 caveats
+
+If you use MSVC 6 it is required that you use the February 2003 edition PSDK:
+http://www.microsoft.com/msdownload/platformsdk/sdkupdate/psdk-full.htm
+
+
+### MSVC from command line
+
+Run the `vcvars32.bat` file to get a proper environment. The
+`vcvars32.bat` file is part of the Microsoft development environment and
+you may find it in `C:\Program Files\Microsoft Visual Studio\vc98\bin`
+provided that you installed Visual C/C++ 6 in the default directory.
+
+Further details in [README.msvc](README.msvc)
+
+
+### MSVC IDEs
+
+Details in [README.msvc](README.msvc)
+
+
+### Important static c-ares usage note
+
+When building an application that uses the static c-ares library, you must
+add `-DCARES_STATICLIB` to your `CFLAGS`. Otherwise the linker will look for
+dynamic import symbols.
+
+
+IBM OS/2
+--------
+
+Building under OS/2 is not much different from building under unix.
+You need:
+
+ - emx 0.9d
+ - GNU make
+ - GNU patch
+ - ksh
+ - GNU bison
+ - GNU file utilities
+ - GNU sed
+ - autoconf 2.13
+
+If during the linking you get an error about `_errno` being an undefined
+symbol referenced from the text segment, you need to add `-D__ST_MT_ERRNO__`
+in your definitions.
+
+If you're getting huge binaries, probably your makefiles have the `-g` in
+`CFLAGS`.
+
+
+NetWare
+-------
+
+To compile `libcares.a` / `libcares.lib` you need:
+
+ - either any gcc / nlmconv, or CodeWarrior 7 PDK 4 or later.
+ - gnu make and awk running on the platform you compile on;
+ native Win32 versions can be downloaded from:
+ http://www.gknw.net/development/prgtools/
+ - recent Novell LibC SDK available from:
+ http://developer.novell.com/ndk/libc.htm
+ - or recent Novell CLib SDK available from:
+ http://developer.novell.com/ndk/clib.htm
+
+Set a search path to your compiler, linker and tools; on Linux make
+sure that the var `OSTYPE` contains the string 'linux'; set the var
+`NDKBASE` to point to the base of your Novell NDK; and then type
+`make -f Makefile.netware` from the top source directory;
+
+
+PORTS
+=====
+
+This is a probably incomplete list of known hardware and operating systems
+that c-ares has been compiled for. If you know a system c-ares compiles and
+runs on, that isn't listed, please let us know!
+
+ - Alpha Tru64 v5.0 5.1
+ - ARM Android 1.5, 2.1, 2.3
+ - MIPS IRIX 6.2, 6.5
+ - Power AIX 3.2.5, 4.2, 4.3.1, 4.3.2, 5.1, 5.2
+ - i386 Linux 1.3, 2.0, 2.2, 2.3, 2.4, 2.6
+ - i386 Novell NetWare
+ - i386 Windows 95, 98, ME, NT, 2000, XP, 2003
+ - x86_64 Linux
+
+
+Useful URLs
+===========
+
+ - c-ares: https://c-ares.haxx.se/
+ - MingW: http://www.mingw.org/
+ - MinGW-w64: http://mingw-w64.sourceforge.net/
+ - OpenWatcom: http://www.openwatcom.org/
diff --git a/contrib/libs/c-ares/LICENSE.md b/contrib/libs/c-ares/LICENSE.md
new file mode 100644
index 0000000000..ad6bb52b72
--- /dev/null
+++ b/contrib/libs/c-ares/LICENSE.md
@@ -0,0 +1,15 @@
+# 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/contrib/libs/c-ares/NEWS b/contrib/libs/c-ares/NEWS
new file mode 100644
index 0000000000..95a2eeea27
--- /dev/null
+++ b/contrib/libs/c-ares/NEWS
@@ -0,0 +1,21 @@
+Major changes since:
+* see the CHANGES file
+
+Major changes in release 1.1.1:
+* ares should now compile as C++ code (no longer uses reserved word
+ "class").
+* Added SRV support to adig test program.
+* Fixed a few error handling bugs in query processing.
+
+Major changes in release 1.1.0:
+* Added ares_free_string() function so that memory can be freed in the
+ same layer as it is allocated, a desirable feature in some
+ environments.
+* A few of the ares_dns.h macros are fixed to use the proper bitwise
+ operator.
+* Fixed a couple of fenceposts fixed in ares_expand_name()'s
+ bounds-checking.
+* In process_timeouts(), extract query->next before calling
+ next_server() and possibly freeing the query structure.
+* Casted arguments to ctype macros casted to unsigned char, since not
+ all char values are valid inputs to those macros according to ANSI.
diff --git a/contrib/libs/c-ares/README.cares b/contrib/libs/c-ares/README.cares
new file mode 100644
index 0000000000..4dee46eabf
--- /dev/null
+++ b/contrib/libs/c-ares/README.cares
@@ -0,0 +1,15 @@
+c-ares
+======
+
+This package is based on ares 1.1.1 (written by Greg Hudson). Daniel Stenberg
+decided to fork and release a separate project since the original ares author
+didn't want the improvements that were vital for our use of it.
+
+This package is dubbed 'c-ares' since Daniel wanted this for use within the
+curl project (hence the letter C) and it makes a nice pun. c-ares is not API
+compatible with ares: a new name makes that more obvious to the public.
+
+The original libares was distributed at
+ftp://athena-dist.mit.edu:pub/ATHENA/ares (which seems to not be alive
+anymore). A local copy of the original ares package is kept here:
+https://c-ares.haxx.se/download/ares-1.1.1.tar.gz
diff --git a/contrib/libs/c-ares/README.md b/contrib/libs/c-ares/README.md
new file mode 100644
index 0000000000..148338f9e1
--- /dev/null
+++ b/contrib/libs/c-ares/README.md
@@ -0,0 +1,67 @@
+c-ares
+======
+
+[![Build Status](https://travis-ci.org/c-ares/c-ares.svg?branch=master)](https://travis-ci.org/c-ares/c-ares)
+[![Windows Build Status](https://ci.appveyor.com/api/projects/status/aevgc5914tm72pvs/branch/master?svg=true)](https://ci.appveyor.com/project/c-ares/c-ares/branch/master)
+[![Coverage Status](https://coveralls.io/repos/c-ares/c-ares/badge.svg?branch=master&service=github)](https://coveralls.io/github/c-ares/c-ares?branch=master)
+[![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)
+
+This is c-ares, an asynchronous resolver library. It is intended for
+applications which need to perform DNS queries without blocking, or need to
+perform multiple DNS queries in parallel. The primary examples of such
+applications are servers which communicate with multiple clients and programs
+with graphical user interfaces.
+
+The full source code is available in the ['c-ares' release archives](https://c-ares.haxx.se/download/),
+and in a git repository: http://github.com/c-ares/c-ares. See the
+[INSTALL.md](INSTALL.md) file for build information.
+
+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: http://cool.haxx.se/mailman/listinfo/c-ares
+
+c-ares is of course distributed under the same MIT-style license as the
+original ares.
+
+You'll find all c-ares details and news here:
+ https://c-ares.haxx.se/
+
+
+Notes for c-ares hackers
+------------------------
+
+* The distributed `ares_build.h` file is only intended to be used on systems
+ which can not run the also distributed configure script.
+
+* The distributed `ares_build.h` file is generated as a copy of `ares_build.h.dist`
+ when the c-ares source code distribution archive file is originally created.
+
+* If you check out from git on a non-configure platform, you must run the
+ appropriate `buildconf*` script to set up `ares_build.h` and other local files
+ before being able to compile the library.
+
+* On systems capable of running the `configure` script, the `configure` process
+ will overwrite the distributed `ares_build.h` file with one that is suitable
+ and specific to the library being configured and built, this new file is
+ generated from the `ares_build.h.in` template file.
+
+* If you intend to distribute an already compiled c-ares library you **MUST**
+ also distribute along with it the generated `ares_build.h` which has been
+ used to compile it. Otherwise the library will be of no use for the users of
+ the library that you have built. It is **your** responsibility to provide this
+ file. No one at the c-ares project can know how you have built the library.
+
+* File `ares_build.h` includes platform and configuration dependent info,
+ and must not be modified by anyone. Configure script generates it for you.
+
+* We cannot assume anything else but very basic compiler features being
+ present. While c-ares requires an ANSI C compiler to build, some of the
+ earlier ANSI compilers clearly can't deal with some preprocessor operators.
+
+* Newlines must remain unix-style for older compilers' sake.
+
+* Comments must be written in the old-style /* unnested C-fashion */
+
+* Try to keep line lengths below 80 columns.
diff --git a/contrib/libs/c-ares/README.msvc b/contrib/libs/c-ares/README.msvc
new file mode 100644
index 0000000000..4ff8700cb8
--- /dev/null
+++ b/contrib/libs/c-ares/README.msvc
@@ -0,0 +1,142 @@
+
+
+ ___ __ _ _ __ ___ ___
+ / __| ___ / _` | '__/ _ \/ __|
+ | (_ |___| (_| | | | __/\__ \
+ \___| \__,_|_| \___||___/
+
+
+ How to build c-ares using MSVC or Visual Studio
+ =================================================
+
+
+
+ How to build using MSVC from the command line
+ ---------------------------------------------
+
+ Open a command prompt window and ensure that the environment is properly
+ set up in order to use MSVC or Visual Studio compiler tools.
+
+ Change to c-ares source folder where Makefile.msvc file is located and run:
+
+ > nmake -f Makefile.msvc
+
+ This will build all c-ares libraries as well as three sample programs.
+
+ Once the above command has finished a new folder named MSVCXX will exist
+ below the folder where makefile.msvc is found. The name of the folder
+ 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
+ holds the c-ares libraries you have just generated, the other three
+ hold sample programs that use the libraries.
+
+ The above command builds four versions of the c-ares library, dynamic
+ and static versions and each one in release and debug flavours. Each
+ of these is found in folders named dll-release, dll-debug, lib-release,
+ and lib-debug, which hang from the 'cares' folder mentioned above. Each
+ sample program also has folders with the same names to reflect which
+ library version it is using.
+
+
+ How to install using MSVC from the command line
+ -----------------------------------------------
+
+ In order to allow easy usage of c-ares libraries it may be convenient to
+ install c-ares libraries and header files to a common subdirectory tree.
+
+ Once that c-ares libraries have been built using procedure described above,
+ use same command prompt window to define environment variable INSTALL_DIR
+ to designate the top subdirectory where installation of c-ares libraries and
+ header files will be done.
+
+ > set INSTALL_DIR=c:\c-ares
+
+ Afterwards, run following command to actually perform the installation:
+
+ > nmake -f Makefile.msvc install
+
+ Installation procedure will copy c-ares libraries to subdirectory 'lib' and
+ c-ares header files to subdirectory 'include' below the INSTALL_DIR subdir.
+
+ When environment variable INSTALL_DIR is not defined, installation is done
+ to c-ares source folder where Makefile.msvc file is located.
+
+
+ How to build using Visual Studio 6 IDE
+ --------------------------------------
+
+ A VC++ 6.0 reference workspace (vc6aws.dsw) is available within the 'vc'
+ folder to allow proper building of the library and sample programs.
+
+ 1) Open the vc6aws.dsw workspace with MSVC6's IDE.
+ 2) Select 'Build' from top menu.
+ 3) Select 'Batch Build' from dropdown menu.
+ 4) Make sure that the sixteen project configurations are 'checked'.
+ 5) Click on the 'Build' button.
+ 6) Once the sixteen project configurations are built you are done.
+
+ Dynamic and static c-ares libraries are built in debug and release flavours,
+ and can be located each one in its own subdirectory, dll-debug, dll-release,
+ lib-debug and lib-release, all of them below the 'vc\cares' subdirectory.
+
+ In the same way four executable versions of each sample program are built,
+ each using its respective library. The resulting sample executables are
+ located in its own subdirectory, dll-debug, dll-release, lib-debug and
+ lib-release, below the 'vc\acountry', 'vc\adig' and 'vc\ahost'folders.
+
+ These reference VC++ 6.0 configurations are generated using the dynamic CRT.
+
+
+ How to build using Visual Studio 2003 or newer IDE
+ --------------------------------------------------
+
+ First you have to convert the VC++ 6.0 reference workspace and project files
+ to the Visual Studio IDE version you are using, following next steps:
+
+ 1) Open vc\vc6aws.dsw with VS20XX.
+ 2) Allow VS20XX to update all projects and workspaces.
+ 3) Save ALL and close VS20XX.
+ 4) Open vc\vc6aws.sln with VS20XX.
+ 5) Select batch build, check 'all' projects and click 'build' button.
+
+ Same comments relative to generated files and folders as done above for
+ Visual Studio 6 IDE apply here.
+
+
+ Relationship between c-ares library file names and versions
+ -----------------------------------------------------------
+
+ c-ares static release library version files:
+
+ libcares.lib -> static release library
+
+ c-ares static debug library version files:
+
+ libcaresd.lib -> static debug library
+
+ c-ares dynamic release library version files:
+
+ cares.dll -> dynamic release library
+ cares.lib -> import library for the dynamic release library
+ cares.exp -> export file for the dynamic release library
+
+ c-ares dynamic debug library version files:
+
+ caresd.dll -> dynamic debug library
+ caresd.lib -> import library for the dynamic debug library
+ caresd.exp -> export file for the dynamic debug library
+ caresd.pdb -> debug symbol file for the dynamic debug library
+
+
+ How to use c-ares static libraries
+ ----------------------------------
+
+ When using the c-ares static library in your program, you will have to
+ define preprocessor symbol CARES_STATICLIB while building your program,
+ otherwise you will get errors at linkage stage.
+
+
+Have Fun!
+
diff --git a/contrib/libs/c-ares/RELEASE-NOTES b/contrib/libs/c-ares/RELEASE-NOTES
new file mode 100644
index 0000000000..7a9d75fe78
--- /dev/null
+++ b/contrib/libs/c-ares/RELEASE-NOTES
@@ -0,0 +1,30 @@
+c-ares version 1.16.1
+
+Security:
+ o Prevent possible use-after-free and double-free in ares_getaddrinfo() if
+ ares_destroy() is called prior to ares_getaddrinfo() completing. Reported
+ by Jann Horn at Google Project Zero.
+
+Changes:
+ o Allow TXT records on CHAOS qclass. Used for retriving things like
+ version.bind, version.server, authoris.bind, hostname.bind, and id.server.
+ [3]
+
+Bug fixes:
+ o Fix Windows Unicode incompatibilities with ares_getaddrinfo() [1]
+ o Silence false cast-align compiler warnings due to valid casts of
+ struct sockaddr to struct sockaddr_in and struct sockaddr_in6.
+ o MacOS should use libresolv for retrieving DNS servers, like iOS
+ o CMake build system should populate the INCLUDE_DIRECTORIES property of
+ installed targets [2]
+ o Correct macros in use for the ares_getaddrinfo.3 man page
+
+Thanks go to these friendly people for their efforts and contributions:
+ Brad House (@bradh352), Daniel Stenberg (@bagder), Dmitry Igrishin (@dmitigr),
+ Jann Horn, Shelly Vohr, Teemu R (@rytilahti)
+ (6 contributors)
+
+References to bug reports and discussions on issues:
+ [1] = https://github.com/c-ares/c-ares/pull/328
+ [2] = https://github.com/c-ares/c-ares/pull/323
+ [3] = https://github.com/c-ares/c-ares/pull/321
diff --git a/contrib/libs/c-ares/RELEASE-PROCEDURE.md b/contrib/libs/c-ares/RELEASE-PROCEDURE.md
new file mode 100644
index 0000000000..b2fe58639b
--- /dev/null
+++ b/contrib/libs/c-ares/RELEASE-PROCEDURE.md
@@ -0,0 +1,53 @@
+c-ares release procedure - how to do a release
+==============================================
+
+in the source code repo
+-----------------------
+
+- edit `RELEASE-NOTES` to be accurate
+
+- edit `Makefile.am`'s `CARES_VERSION_INFO`, and `CMakeLists.txt`'s
+ `CARES_LIB_VERSIONINFO` set to the same value to denote the current shared
+ object versioning.
+
+- make sure all relevant changes are committed on the master branch
+
+- tag the git repo in this style: `git tag -a cares-1_14_0` -a annotates the
+ tag and we use underscores instead of dots in the version number.
+
+- run "./maketgz 1.14.0" to build the release tarball. It is important that
+ you run this on a machine with the correct set of autotools etc installed
+ as this is what then will be shipped and used by most users on *nix like
+ systems.
+
+- push the git commits and the new tag
+
+- gpg sign the tarball
+
+- upload the resulting files to https://c-ares.haxx.se/download/
+
+- update `ares_version.h` for the next version
+
+in the c-ares-www repo
+----------------------
+
+- edit `index.t` (version number and date),
+
+- edit `changelog.t` (add the new release in there)
+
+- commit all local changes
+
+- tag the repo with the same tag as used for the source repo
+
+- push the git commits and the new tag
+
+inform
+------
+
+- send an email to the c-ares mailing list. Insert the RELEASE-NOTES into the
+ mail.
+
+celebrate
+---------
+
+- suitable beverage intake is encouraged for the festivities
diff --git a/contrib/libs/c-ares/TODO b/contrib/libs/c-ares/TODO
new file mode 100644
index 0000000000..fa31cea6fb
--- /dev/null
+++ b/contrib/libs/c-ares/TODO
@@ -0,0 +1,23 @@
+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/contrib/libs/c-ares/acountry.c b/contrib/libs/c-ares/acountry.c
new file mode 100644
index 0000000000..c486824434
--- /dev/null
+++ b/contrib/libs/c-ares/acountry.c
@@ -0,0 +1,626 @@
+/*
+ *
+ * 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<CC>.countries.nerd.dk with address 127.0.x.y (ver 1) or
+ * CNAME = <a.b.c.d>.zz.countries.nerd.dk with address 127.0.x.y (ver 2)
+ *
+ * The 2 letter country code is in <CC> and the ISO-3166 country
+ * number is in x.y (number = x*256 + y). Version 2 of the protocol is missing
+ * the <CC> number.
+ *
+ * Ref: http://countries.nerd.dk/more.html
+ *
+ * Written by G. Vanem <gvanem@yahoo.no> 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 <strings.h>
+#endif
+
+#if defined(WIN32) && !defined(WATT32)
+ #include <winsock.h>
+#else
+ #include <arpa/inet.h>
+ #include <netinet/in.h>
+ #include <netdb.h>
+#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 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':
+ case '?':
+ 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[100];
+
+ /* 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;
+ }
+ }
+
+ 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));
+ 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)));
+}
+
+/*
+ * 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: ftp://ftp.ripe.net/iso3166-countrycodes.txt
+ */
+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" },
+ { 70, "ba", "Bosnia & Herzegowina" },
+ { 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" },
+ { 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" },
+ { 231, "et", "Ethiopia" },
+ { 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" },
+ { 324, "gn", "Guinea" },
+ { 624, "gw", "Guinea-Bissau" },
+ { 328, "gy", "Guyana" },
+ { 332, "ht", "Haiti" },
+ { 334, "hm", "Heard & Mc Donald Islands" },
+ { 336, "va", "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" },
+ { 376, "il", "Israel" },
+ { 380, "it", "Italy" },
+ { 388, "jm", "Jamaica" },
+ { 392, "jp", "Japan" },
+ { 400, "jo", "Jordan" },
+ { 398, "kz", "Kazakhstan" },
+ { 404, "ke", "Kenya" },
+ { 296, "ki", "Kiribati" },
+ { 408, "kp", "Korea (north)" },
+ { 410, "kr", "Korea (south)" },
+ { 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" },
+ { 807, "mk", "Macedonia" },
+ { 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" },
+ { 500, "ms", "Montserrat" },
+ { 504, "ma", "Morocco" },
+ { 508, "mz", "Mozambique" },
+ { 104, "mm", "Myanmar" },
+ { 516, "na", "Namibia" },
+ { 520, "nr", "Nauru" },
+ { 524, "np", "Nepal" },
+ { 528, "nl", "Netherlands" },
+ { 530, "an", "Netherlands Antilles" },
+ { 540, "nc", "New Caledonia" },
+ { 554, "nz", "New Zealand" },
+ { 558, "ni", "Nicaragua" },
+ { 562, "ne", "Niger" },
+ { 566, "ng", "Nigeria" },
+ { 570, "nu", "Niue" },
+ { 574, "nf", "Norfolk Island" },
+ { 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", "Russia" },
+ { 646, "rw", "Rwanda" },
+ { 659, "kn", "Saint Kitts & Nevis" },
+ { 662, "lc", "Saint Lucia" },
+ { 670, "vc", "Saint Vincent" },
+ { 882, "ws", "Samoa" },
+ { 674, "sm", "San Marino" },
+ { 678, "st", "Sao Tome & Principe" },
+ { 682, "sa", "Saudi Arabia" },
+ { 686, "sn", "Senegal" },
+ { 891, "cs", "Serbia and Montenegro" },
+ { 690, "sc", "Seychelles" },
+ { 694, "sl", "Sierra Leone" },
+ { 702, "sg", "Singapore" },
+ { 703, "sk", "Slovakia" },
+ { 705, "si", "Slovenia" },
+ { 90, "sb", "Solomon Islands" },
+ { 706, "so", "Somalia" },
+ { 710, "za", "South Africa" },
+ { 239, "gs", "South Georgia" },
+ { 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" },
+ { 748, "sz", "Swaziland" },
+ { 752, "se", "Sweden" },
+ { 756, "ch", "Switzerland" },
+ { 760, "sy", "Syrian Arab Republic" },
+ { 626, "tl", "Timor-Leste" },
+ { 158, "tw", "Taiwan" },
+ { 762, "tj", "Tajikistan" },
+ { 834, "tz", "Tanzania" },
+ { 764, "th", "Thailand" },
+ { 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 = <a.b.c.d>.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 : "<n/a>", 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);
+}
diff --git a/contrib/libs/c-ares/acountry/ya.make b/contrib/libs/c-ares/acountry/ya.make
new file mode 100644
index 0000000000..58b533d30c
--- /dev/null
+++ b/contrib/libs/c-ares/acountry/ya.make
@@ -0,0 +1,35 @@
+# Generated by devtools/yamaker.
+
+PROGRAM(acountry)
+
+OWNER(max42 g:cpp-contrib)
+
+LICENSE(MIT)
+
+PEERDIR(
+ contrib/libs/c-ares
+)
+
+ADDINCL(
+ contrib/libs/c-ares
+)
+
+NO_COMPILER_WARNINGS()
+
+CFLAGS(
+ -DHAVE_CONFIG_H
+)
+
+SRCDIR(contrib/libs/c-ares)
+
+IF (NOT DLL_FOR)
+ CFLAGS(
+ -DCARES_STATICLIB
+ )
+ENDIF()
+
+SRCS(
+ acountry.c
+)
+
+END()
diff --git a/contrib/libs/c-ares/adig.c b/contrib/libs/c-ares/adig.c
new file mode 100644
index 0000000000..2d5cb8c876
--- /dev/null
+++ b/contrib/libs/c-ares/adig.c
@@ -0,0 +1,827 @@
+/* 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 <netinet/in.h>
+#endif
+#ifdef HAVE_ARPA_INET_H
+# include <arpa/inet.h>
+#endif
+#ifdef HAVE_NETDB_H
+# include <netdb.h>
+#endif
+#ifdef HAVE_ARPA_NAMESER_H
+# include <arpa/nameser.h>
+#else
+# include "nameser.h"
+#endif
+#ifdef HAVE_ARPA_NAMESER_COMPAT_H
+# include <arpa/nameser_compat.h>
+#endif
+
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#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
+
+#ifndef T_SRV
+# define T_SRV 33 /* Server selection */
+#endif
+#ifndef T_NAPTR
+# define T_NAPTR 35 /* Naming authority pointer */
+#endif
+#ifndef T_DS
+# define T_DS 43 /* Delegation Signer (RFC4034) */
+#endif
+#ifndef T_SSHFP
+# define T_SSHFP 44 /* SSH Key Fingerprint (RFC4255) */
+#endif
+#ifndef T_RRSIG
+# define T_RRSIG 46 /* Resource Record Signature (RFC4034) */
+#endif
+#ifndef T_NSEC
+# define T_NSEC 47 /* Next Secure (RFC4034) */
+#endif
+#ifndef T_DNSKEY
+# define T_DNSKEY 48 /* DNS Public Key (RFC4034) */
+#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 },
+ { "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 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);
+
+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;
+ 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, "df:s:c:t:T:U:")) != -1)
+ {
+ switch (c)
+ {
+ case 'd':
+#ifdef WATT32
+ dbug_init();
+#endif
+ 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);
+ 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;
+ }
+ }
+ 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.
+ */
+ if (argc == 1)
+ ares_query(channel, *argv, dnsclass, type, callback, (char *) NULL);
+ else
+ {
+ for (; *argv; argv++)
+ ares_query(channel, *argv, dnsclass, type, callback, *argv);
+ }
+
+ /* 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;
+ long len;
+ 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_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_NAPTR:
+
+ printf("\t%d", (int)DNS__16BIT(aptr)); /* order */
+ printf(" %d\n", (int)DNS__16BIT(aptr + 2)); /* preference */
+
+ p = aptr + 4;
+ status = ares_expand_string(p, abuf, alen, &name.as_uchar, &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;
+
+ status = ares_expand_string(p, abuf, alen, &name.as_uchar, &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;
+
+ status = ares_expand_string(p, abuf, alen, &name.as_uchar, &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;
+
+ 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", name.as_char);
+ ares_free_string(name.as_char);
+ break;
+
+ case T_DS:
+ case T_SSHFP:
+ case T_RRSIG:
+ case T_NSEC:
+ case T_DNSKEY:
+ printf("\t[RR type parsing unavailable]");
+ break;
+
+ default:
+ printf("\t[Unknown RR; cannot parse]");
+ break;
+ }
+ printf("\n");
+
+ return aptr + dlen;
+}
+
+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] 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;
+}
diff --git a/contrib/libs/c-ares/adig/ya.make b/contrib/libs/c-ares/adig/ya.make
new file mode 100644
index 0000000000..1c8404ebee
--- /dev/null
+++ b/contrib/libs/c-ares/adig/ya.make
@@ -0,0 +1,35 @@
+# Generated by devtools/yamaker.
+
+PROGRAM(adig)
+
+OWNER(max42 g:cpp-contrib)
+
+LICENSE(MIT)
+
+PEERDIR(
+ contrib/libs/c-ares
+)
+
+ADDINCL(
+ contrib/libs/c-ares
+)
+
+NO_COMPILER_WARNINGS()
+
+CFLAGS(
+ -DHAVE_CONFIG_H
+)
+
+SRCDIR(contrib/libs/c-ares)
+
+IF (NOT DLL_FOR)
+ CFLAGS(
+ -DCARES_STATICLIB
+ )
+ENDIF()
+
+SRCS(
+ adig.c
+)
+
+END()
diff --git a/contrib/libs/c-ares/ahost.c b/contrib/libs/c-ares/ahost.c
new file mode 100644
index 0000000000..89a7c14fcb
--- /dev/null
+++ b/contrib/libs/c-ares/ahost.c
@@ -0,0 +1,206 @@
+/* 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 <netinet/in.h>
+#include <arpa/inet.h>
+#include <netdb.h>
+#endif
+
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#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);
+
+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:hs:")) != -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':
+ 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);
+}
diff --git a/contrib/libs/c-ares/ahost/ya.make b/contrib/libs/c-ares/ahost/ya.make
new file mode 100644
index 0000000000..299e3f211c
--- /dev/null
+++ b/contrib/libs/c-ares/ahost/ya.make
@@ -0,0 +1,35 @@
+# Generated by devtools/yamaker.
+
+PROGRAM(ahost)
+
+OWNER(max42 g:cpp-contrib)
+
+LICENSE(MIT)
+
+PEERDIR(
+ contrib/libs/c-ares
+)
+
+ADDINCL(
+ contrib/libs/c-ares
+)
+
+NO_COMPILER_WARNINGS()
+
+CFLAGS(
+ -DHAVE_CONFIG_H
+)
+
+SRCDIR(contrib/libs/c-ares)
+
+IF (NOT DLL_FOR)
+ CFLAGS(
+ -DCARES_STATICLIB
+ )
+ENDIF()
+
+SRCS(
+ ahost.c
+)
+
+END()
diff --git a/contrib/libs/c-ares/ares.h b/contrib/libs/c-ares/ares.h
new file mode 100644
index 0000000000..3f8a6954d0
--- /dev/null
+++ b/contrib/libs/c-ares/ares.h
@@ -0,0 +1,741 @@
+
+/* 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 <sys/types.h>
+
+/* 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__)
+#include <sys/select.h>
+#endif
+#if (defined(NETWARE) && !defined(__NOVELL_LIBC__))
+#include <sys/bsdskt.h>
+#endif
+
+#if defined(WATT32)
+# include <netinet/in.h>
+# include <sys/socket.h>
+# include <tcp.h>
+#elif defined(_WIN32_WCE)
+# ifndef WIN32_LEAN_AND_MEAN
+# define WIN32_LEAN_AND_MEAN
+# endif
+# include <windows.h>
+# include <winsock.h>
+#elif defined(WIN32)
+# ifndef WIN32_LEAN_AND_MEAN
+# define WIN32_LEAN_AND_MEAN
+# endif
+# include <windows.h>
+# include <winsock2.h>
+# include <ws2tcpip.h>
+#else
+# include <sys/socket.h>
+# include <netinet/in.h>
+#endif
+
+#if defined(ANDROID) || defined(__ANDROID__)
+#include <jni.h>
+#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
+# 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_MAXTIMEOUTMS (1 << 18)
+#define ARES_OPT_JITTER (1 << 19)
+
+/* 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 maxtimeout; /* in milliseconds */
+ int jitter; /* in .001 */
+ unsigned int jitter_rand_seed;
+ 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;
+};
+
+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_srv_reply {
+ struct ares_srv_reply *next;
+ char *host;
+ unsigned short priority;
+ unsigned short weight;
+ unsigned short port;
+ int ttl;
+};
+
+struct ares_mx_reply {
+ struct ares_mx_reply *next;
+ char *host;
+ unsigned short priority;
+ int ttl;
+};
+
+struct ares_txt_reply {
+ struct ares_txt_reply *next;
+ unsigned char *txt;
+ size_t length; /* length excludes null termination */
+ int ttl;
+};
+
+/* 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;
+ int ttl;
+};
+
+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;
+ int ttl;
+};
+
+struct ares_soa_reply {
+ char *nsname;
+ char *hostmaster;
+ unsigned int serial;
+ unsigned int refresh;
+ unsigned int retry;
+ unsigned int expire;
+ unsigned int minttl;
+ 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;
+};
+
+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_ptr_reply(const unsigned char *abuf,
+ int alen,
+ const void *addr,
+ int addrlen,
+ int family,
+ struct hostent **host,
+ int *hostttl);
+
+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 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/contrib/libs/c-ares/ares__close_sockets.c b/contrib/libs/c-ares/ares__close_sockets.c
new file mode 100644
index 0000000000..0477174e3e
--- /dev/null
+++ b/contrib/libs/c-ares/ares__close_sockets.c
@@ -0,0 +1,61 @@
+
+/* 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/contrib/libs/c-ares/ares__get_hostent.c b/contrib/libs/c-ares/ares__get_hostent.c
new file mode 100644
index 0000000000..367f39037b
--- /dev/null
+++ b/contrib/libs/c-ares/ares__get_hostent.c
@@ -0,0 +1,260 @@
+
+/* 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 <netinet/in.h>
+#endif
+#ifdef HAVE_NETDB_H
+# include <netdb.h>
+#endif
+#ifdef HAVE_ARPA_INET_H
+# include <arpa/inet.h>
+#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/contrib/libs/c-ares/ares__parse_into_addrinfo.c b/contrib/libs/c-ares/ares__parse_into_addrinfo.c
new file mode 100644
index 0000000000..b0801632b4
--- /dev/null
+++ b/contrib/libs/c-ares/ares__parse_into_addrinfo.c
@@ -0,0 +1,266 @@
+/* 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 <netinet/in.h>
+#endif
+#ifdef HAVE_NETDB_H
+# include <netdb.h>
+#endif
+#ifdef HAVE_ARPA_INET_H
+# include <arpa/inet.h>
+#endif
+#ifdef HAVE_ARPA_NAMESER_H
+# include <arpa/nameser.h>
+#else
+# include "nameser.h"
+#endif
+#ifdef HAVE_ARPA_NAMESER_COMPAT_H
+# include <arpa/nameser_compat.h>
+#endif
+
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif
+
+#ifdef HAVE_LIMITS_H
+# include <limits.h>
+#endif
+
+#include "ares.h"
+#include "ares_dns.h"
+#include "ares_private.h"
+
+int ares__parse_into_addrinfo2(const unsigned char *abuf,
+ int alen,
+ char **question_hostname,
+ 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 *hostname, *rr_name = NULL, *rr_data;
+ struct ares_addrinfo_cname *cname, *cnames = NULL;
+ struct ares_addrinfo_node *node, *nodes = NULL;
+ struct sockaddr_in *sin;
+ struct sockaddr_in6 *sin6;
+
+ *question_hostname = 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);
+ if (status != ARES_SUCCESS)
+ return status;
+ if (aptr + len + QFIXEDSZ > abuf + alen)
+ {
+ return ARES_EBADRESP;
+ }
+
+ 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);
+ 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 */
+
+ node = ares__append_addrinfo_node(&nodes);
+ if (!node)
+ {
+ status = ARES_ENOMEM;
+ goto failed_stat;
+ }
+
+ sin = ares_malloc(sizeof(struct sockaddr_in));
+ if (!sin)
+ {
+ status = ARES_ENOMEM;
+ goto failed_stat;
+ }
+ memset(sin, 0, sizeof(struct sockaddr_in));
+ memcpy(&sin->sin_addr.s_addr, aptr, sizeof(struct in_addr));
+ sin->sin_family = AF_INET;
+
+ node->ai_addr = (struct sockaddr *)sin;
+ node->ai_family = AF_INET;
+ node->ai_addrlen = sizeof(struct sockaddr_in);
+
+ node->ai_ttl = rr_ttl;
+
+ status = ARES_SUCCESS;
+ }
+ 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 */
+
+ node = ares__append_addrinfo_node(&nodes);
+ if (!node)
+ {
+ status = ARES_ENOMEM;
+ goto failed_stat;
+ }
+
+ sin6 = ares_malloc(sizeof(struct sockaddr_in6));
+ if (!sin6)
+ {
+ status = ARES_ENOMEM;
+ goto failed_stat;
+ }
+
+ memset(sin6, 0, sizeof(struct sockaddr_in6));
+ memcpy(&sin6->sin6_addr.s6_addr, aptr, sizeof(struct ares_in6_addr));
+ sin6->sin6_family = AF_INET6;
+
+ node->ai_addr = (struct sockaddr *)sin6;
+ node->ai_family = AF_INET6;
+ node->ai_addrlen = sizeof(struct sockaddr_in6);
+
+ node->ai_ttl = rr_ttl;
+
+ status = ARES_SUCCESS;
+ }
+
+ if (rr_class == C_IN && rr_type == T_CNAME)
+ {
+ got_cname = 1;
+ status = ares__expand_name_for_response(aptr, abuf, alen, &rr_data,
+ &len);
+ 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;
+ }
+ else
+ {
+ ares_free(rr_name);
+ }
+
+
+ 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)
+ {
+ ares__addrinfo_cat_nodes(&ai->nodes, nodes);
+ if (got_cname)
+ {
+ ares__addrinfo_cat_cnames(&ai->cnames, cnames);
+ return status;
+ }
+ else if (got_a == 0 && got_aaaa == 0)
+ {
+ /* the check for naliases to be zero is to make sure CNAME responses
+ don't get caught here */
+ status = ARES_ENODATA;
+ }
+ }
+
+ return status;
+
+failed_stat:
+ ares_free(rr_name);
+ ares__freeaddrinfo_cnames(cnames);
+ ares__freeaddrinfo_nodes(nodes);
+ return status;
+}
+
+int ares__parse_into_addrinfo(const unsigned char *abuf,
+ int alen,
+ struct ares_addrinfo *ai)
+{
+ int status;
+ char *question_hostname;
+ status = ares__parse_into_addrinfo2(abuf, alen, &question_hostname, ai);
+ ares_free(question_hostname);
+ return status;
+}
diff --git a/contrib/libs/c-ares/ares__read_line.c b/contrib/libs/c-ares/ares__read_line.c
new file mode 100644
index 0000000000..c62ad2a2b4
--- /dev/null
+++ b/contrib/libs/c-ares/ares__read_line.c
@@ -0,0 +1,73 @@
+
+/* 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/contrib/libs/c-ares/ares__readaddrinfo.c b/contrib/libs/c-ares/ares__readaddrinfo.c
new file mode 100644
index 0000000000..dd3abe2e9f
--- /dev/null
+++ b/contrib/libs/c-ares/ares__readaddrinfo.c
@@ -0,0 +1,260 @@
+/* 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 <netinet/in.h>
+#endif
+#ifdef HAVE_NETDB_H
+# include <netdb.h>
+#endif
+#ifdef HAVE_ARPA_INET_H
+# include <arpa/inet.h>
+#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;
+ size_t linesize;
+ ares_sockaddr addr;
+ struct ares_addrinfo_cname *cname = NULL, *cnames = NULL;
+ struct ares_addrinfo_node *node = NULL, *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;
+ }
+
+
+ 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))
+ {
+ addr.sa4.sin_port = htons(port);
+ if (ares_inet_pton(AF_INET, txtaddr, &addr.sa4.sin_addr) > 0)
+ {
+ node = ares__append_addrinfo_node(&nodes);
+ if(!node)
+ {
+ goto enomem;
+ }
+
+ node->ai_family = addr.sa.sa_family = AF_INET;
+ node->ai_addrlen = sizeof(sizeof(addr.sa4));
+ node->ai_addr = ares_malloc(sizeof(addr.sa4));
+ if (!node->ai_addr)
+ {
+ goto enomem;
+ }
+ memcpy(node->ai_addr, &addr.sa4, sizeof(addr.sa4));
+ }
+ }
+ if ((hints->ai_family == AF_INET6) || (hints->ai_family == AF_UNSPEC))
+ {
+ addr.sa6.sin6_port = htons(port);
+ if (ares_inet_pton(AF_INET6, txtaddr, &addr.sa6.sin6_addr) > 0)
+ {
+ node = ares__append_addrinfo_node(&nodes);
+ if (!node)
+ {
+ goto enomem;
+ }
+
+ node->ai_family = addr.sa.sa_family = AF_INET6;
+ node->ai_addrlen = sizeof(sizeof(addr.sa6));
+ node->ai_addr = ares_malloc(sizeof(addr.sa6));
+ if (!node->ai_addr)
+ {
+ goto enomem;
+ }
+ memcpy(node->ai_addr, &addr.sa6, sizeof(addr.sa6));
+ }
+ }
+ if (!node)
+ /* 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)
+ {
+ goto enomem;
+ }
+ 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)
+ {
+ goto enomem;
+ }
+ cname->name = ares_strdup(txthost);
+ }
+ }
+ }
+
+ /* Last read failed. */
+ if (status == ARES_ENOMEM)
+ {
+ goto enomem;
+ }
+
+ /* Free line buffer. */
+ ares_free(line);
+
+ ares__addrinfo_cat_cnames(&ai->cnames, cnames);
+ ares__addrinfo_cat_nodes(&ai->nodes, nodes);
+
+ return node ? ARES_SUCCESS : ARES_ENOTFOUND;
+
+enomem:
+ ares_free(line);
+ ares__freeaddrinfo_cnames(cnames);
+ ares__freeaddrinfo_nodes(nodes);
+ return ARES_ENOMEM;
+}
diff --git a/contrib/libs/c-ares/ares__sortaddrinfo.c b/contrib/libs/c-ares/ares__sortaddrinfo.c
new file mode 100644
index 0000000000..c0e2ea1528
--- /dev/null
+++ b/contrib/libs/c-ares/ares__sortaddrinfo.c
@@ -0,0 +1,495 @@
+/*
+ * 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 <netinet/in.h>
+#endif
+#ifdef HAVE_NETDB_H
+# include <netdb.h>
+#endif
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif
+
+#include <assert.h>
+#include <limits.h>
+
+#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 <netinet/in6.h>. */
+/* 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 = get_scope(&a1->src_addr.sa);
+ scope_dst1 = get_scope(a1->ai->ai_addr);
+ scope_match1 = (scope_src1 == scope_dst1);
+
+ 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 = get_label(&a1->src_addr.sa);
+ label_dst1 = get_label(a1->ai->ai_addr);
+ label_match1 = (label_src1 == label_dst1);
+
+ 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)
+{
+ int 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 == -1)
+ {
+ 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) == -1)
+ {
+ 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;
+ }
+ 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/contrib/libs/c-ares/ares__timeval.c b/contrib/libs/c-ares/ares__timeval.c
new file mode 100644
index 0000000000..94efb7db1e
--- /dev/null
+++ b/contrib/libs/c-ares/ares__timeval.c
@@ -0,0 +1,111 @@
+
+/* 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/contrib/libs/c-ares/ares_android.c b/contrib/libs/c-ares/ares_android.c
new file mode 100644
index 0000000000..5b00b8065c
--- /dev/null
+++ b/contrib/libs/c-ares/ares_android.c
@@ -0,0 +1,444 @@
+/* Copyright (C) 2017 by John Schember <john@nachtimwald.com>
+ *
+ * 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(ANDROID) || defined(__ANDROID__)
+
+#include <jni.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;
+
+/* ConnectivityManager.getActiveNetwork */
+static jmethodID android_cm_active_net_mid = NULL;
+/* ConnectivityManager.getLinkProperties */
+static jmethodID android_cm_link_props_mid = NULL;
+/* LinkProperties.getDnsServers */
+static jmethodID android_lp_dns_servers_mid = NULL;
+/* LinkProperties.getDomains */
+static jmethodID android_lp_domains_mid = NULL;
+/* List.size */
+static jmethodID android_list_size_mid = NULL;
+/* List.get */
+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)
+{
+ jclass cls = NULL;
+
+ if (env == NULL || path == NULL || *path == '\0')
+ return NULL;
+
+ cls = (*env)->FindClass(env, path);
+ if ((*env)->ExceptionOccurred(env)) {
+ (*env)->ExceptionClear(env);
+ return NULL;
+ }
+ return cls;
+}
+
+static jmethodID jni_get_method_id(JNIEnv *env, jclass cls,
+ const char *func_name, const char *signature)
+{
+ jmethodID mid = NULL;
+
+ if (env == NULL || cls == NULL || func_name == NULL || *func_name == '\0' ||
+ signature == NULL || *signature == '\0')
+ {
+ return NULL;
+ }
+
+ mid = (*env)->GetMethodID(env, cls, func_name, signature);
+ if ((*env)->ExceptionOccurred(env))
+ {
+ (*env)->ExceptionClear(env);
+ return NULL;
+ }
+
+ return mid;
+}
+
+void ares_library_init_jvm(JavaVM *jvm)
+{
+ android_jvm = 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;
+
+ 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);
+ need_detatch = 1;
+ }
+ if (res != JNI_OK || env == NULL)
+ goto cleanup;
+
+ android_connectivity_manager =
+ (*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. */
+ ret = ARES_SUCCESS;
+
+ /* ConnectivityManager in API 1. */
+ obj_cls = jni_get_class(env, "android/net/ConnectivityManager");
+ 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)
+ 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)
+ goto cleanup;
+
+ /* LinkProperties in API 21. */
+ (*env)->DeleteLocalRef(env, obj_cls);
+ obj_cls = jni_get_class(env, "android/net/LinkProperties");
+ 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)
+ 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)
+ goto cleanup;
+
+ (*env)->DeleteLocalRef(env, obj_cls);
+ obj_cls = jni_get_class(env, "java/util/List");
+ 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)
+ goto cleanup;
+
+ 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)
+ 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)
+ goto cleanup;
+
+ (*env)->DeleteLocalRef(env, obj_cls);
+ goto done;
+
+cleanup:
+ if (obj_cls != NULL)
+ (*env)->DeleteLocalRef(env, obj_cls);
+
+ 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;
+
+done:
+ if (need_detatch)
+ (*android_jvm)->DetachCurrentThread(android_jvm);
+
+ return ret;
+}
+
+int ares_library_android_initialized(void)
+{
+ 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;
+
+ 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);
+ need_detatch = 1;
+ }
+ if (res != JNI_OK || env == NULL)
+ return;
+
+ 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;
+
+ (*env)->DeleteGlobalRef(env, android_connectivity_manager);
+ android_connectivity_manager = NULL;
+
+ if (need_detatch)
+ (*android_jvm)->DetachCurrentThread(android_jvm);
+}
+
+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;
+ const char *ch_server_address;
+ 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)
+ {
+ 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)
+ {
+ 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);
+ need_detatch = 1;
+ }
+ if (res != JNI_OK || env == NULL)
+ goto done;
+
+ /* JNI below is equivalent to this Java code.
+ import android.content.Context;
+ import android.net.ConnectivityManager;
+ import android.net.LinkProperties;
+ import android.net.Network;
+ import java.net.InetAddress;
+ import java.util.List;
+
+ ConnectivityManager cm = (ConnectivityManager)this.getApplicationContext()
+ .getSystemService(Context.CONNECTIVITY_SERVICE);
+ Network an = cm.getActiveNetwork();
+ LinkProperties lp = cm.getLinkProperties(an);
+ List<InetAddress> dns = lp.getDnsServers();
+ for (InetAddress ia: dns) {
+ String ha = ia.getHostAddress();
+ }
+
+ Note: The JNI ConnectivityManager object and all method IDs were previously
+ initialized in ares_library_init_android.
+ */
+
+ active_network = (*env)->CallObjectMethod(env, android_connectivity_manager,
+ android_cm_active_net_mid);
+ 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)
+ goto done;
+
+ 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)
+ nserv = (jint)max_servers;
+ 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[i][0] = 0;
+ 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);
+ (*env)->ReleaseStringUTFChars(env, str, ch_server_address);
+ (*env)->DeleteLocalRef(env, str);
+ (*env)->DeleteLocalRef(env, server);
+ }
+
+done:
+ if ((*env)->ExceptionOccurred(env))
+ (*env)->ExceptionClear(env);
+
+ if (server_list != NULL)
+ (*env)->DeleteLocalRef(env, server_list);
+ if (link_properties != NULL)
+ (*env)->DeleteLocalRef(env, link_properties);
+ if (active_network != NULL)
+ (*env)->DeleteLocalRef(env, active_network);
+
+ 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;
+ const char *domain;
+ int res;
+ char *domain_list = NULL;
+ int need_detatch = 0;
+
+ 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)
+ {
+ 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);
+ need_detatch = 1;
+ }
+ if (res != JNI_OK || env == NULL)
+ goto done;
+
+ /* JNI below is equivalent to this Java code.
+ import android.content.Context;
+ import android.net.ConnectivityManager;
+ import android.net.LinkProperties;
+
+ ConnectivityManager cm = (ConnectivityManager)this.getApplicationContext()
+ .getSystemService(Context.CONNECTIVITY_SERVICE);
+ Network an = cm.getActiveNetwork();
+ LinkProperties lp = cm.getLinkProperties(an);
+ String domains = lp.getDomains();
+ for (String domain: domains.split(",")) {
+ String d = domain;
+ }
+
+ Note: The JNI ConnectivityManager object and all method IDs were previously
+ initialized in ares_library_init_android.
+ */
+
+ active_network = (*env)->CallObjectMethod(env, android_connectivity_manager,
+ android_cm_active_net_mid);
+ 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)
+ 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)
+ goto done;
+
+ /* Split on , */
+ 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))
+ (*env)->ExceptionClear(env);
+
+ if (link_properties != NULL)
+ (*env)->DeleteLocalRef(env, link_properties);
+ if (active_network != NULL)
+ (*env)->DeleteLocalRef(env, active_network);
+
+ if (need_detatch)
+ (*android_jvm)->DetachCurrentThread(android_jvm);
+ return domain_list;
+}
+#else
+/* warning: ISO C forbids an empty translation unit */
+typedef int dummy_make_iso_compilers_happy;
+#endif
diff --git a/contrib/libs/c-ares/ares_android.h b/contrib/libs/c-ares/ares_android.h
new file mode 100644
index 0000000000..93fb75f585
--- /dev/null
+++ b/contrib/libs/c-ares/ares_android.h
@@ -0,0 +1,27 @@
+/* Copyright (C) 2017 by John Schember <john@nachtimwald.com>
+ *
+ * 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/contrib/libs/c-ares/ares_build.h b/contrib/libs/c-ares/ares_build.h
new file mode 100644
index 0000000000..e0a2ed784b
--- /dev/null
+++ b/contrib/libs/c-ares/ares_build.h
@@ -0,0 +1,211 @@
+#ifndef __CARES_BUILD_H
+#define __CARES_BUILD_H
+
+
+/* Copyright (C) 2009 - 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.
+ */
+
+/* ================================================================ */
+/* NOTES FOR CONFIGURE CAPABLE SYSTEMS */
+/* ================================================================ */
+
+/*
+ * NOTE 1:
+ * -------
+ *
+ * See file ares_build.h.in, run configure, and forget that this file
+ * exists it is only used for non-configure systems.
+ * But you can keep reading if you want ;-)
+ *
+ */
+
+/* ================================================================ */
+/* NOTES FOR NON-CONFIGURE SYSTEMS */
+/* ================================================================ */
+
+/*
+ * NOTE 1:
+ * -------
+ *
+ * Nothing in this file is intended to be modified or adjusted by the
+ * c-ares library user nor by the c-ares library builder.
+ *
+ * If you think that something actually needs to be changed, adjusted
+ * or fixed in this file, then, report it on the c-ares development
+ * mailing list: http://cool.haxx.se/mailman/listinfo/c-ares/
+ *
+ * Try to keep one section per platform, compiler and architecture,
+ * otherwise, if an existing section is reused for a different one and
+ * later on the original is adjusted, probably the piggybacking one can
+ * be adversely changed.
+ *
+ * In order to differentiate between platforms/compilers/architectures
+ * use only compiler built in predefined preprocessor symbols.
+ *
+ * This header file shall only export symbols which are 'cares' or 'CARES'
+ * prefixed, otherwise public name space would be polluted.
+ *
+ * NOTE 2:
+ * -------
+ *
+ * Right now you might be staring at file ares_build.h.dist or ares_build.h,
+ * this is due to the following reason: file ares_build.h.dist is renamed
+ * to ares_build.h when the c-ares source code distribution archive file is
+ * created.
+ *
+ * File ares_build.h.dist is not included in the distribution archive.
+ * File ares_build.h is not present in the git tree.
+ *
+ * The distributed ares_build.h file is only intended to be used on systems
+ * which can not run the also distributed configure script.
+ *
+ * On systems capable of running the configure script, the configure process
+ * will overwrite the distributed ares_build.h file with one that is suitable
+ * and specific to the library being configured and built, which is generated
+ * from the ares_build.h.in template file.
+ *
+ * If you check out from git on a non-configure platform, you must run the
+ * appropriate buildconf* script to set up ares_build.h and other local files.
+ *
+ */
+
+/* ================================================================ */
+/* DEFINITION OF THESE SYMBOLS SHALL NOT TAKE PLACE ANYWHERE ELSE */
+/* ================================================================ */
+
+#ifdef CARES_TYPEOF_ARES_SOCKLEN_T
+# error "CARES_TYPEOF_ARES_SOCKLEN_T shall not be defined except in ares_build.h"
+ Error Compilation_aborted_CARES_TYPEOF_ARES_SOCKLEN_T_already_defined
+#endif
+
+/* ================================================================ */
+/* EXTERNAL INTERFACE SETTINGS FOR NON-CONFIGURE SYSTEMS ONLY */
+/* ================================================================ */
+
+#if defined(__DJGPP__) || defined(__GO32__)
+# define CARES_TYPEOF_ARES_SOCKLEN_T int
+
+#elif defined(__SALFORDC__)
+# define CARES_TYPEOF_ARES_SOCKLEN_T int
+
+#elif defined(__BORLANDC__)
+# define CARES_TYPEOF_ARES_SOCKLEN_T int
+
+#elif defined(__TURBOC__)
+# define CARES_TYPEOF_ARES_SOCKLEN_T int
+
+#elif defined(__WATCOMC__)
+# define CARES_TYPEOF_ARES_SOCKLEN_T int
+
+#elif defined(__POCC__)
+# define CARES_TYPEOF_ARES_SOCKLEN_T int
+
+#elif defined(__LCC__)
+# define CARES_TYPEOF_ARES_SOCKLEN_T int
+
+#elif defined(__SYMBIAN32__)
+# define CARES_TYPEOF_ARES_SOCKLEN_T unsigned int
+
+#elif defined(__MWERKS__)
+# define CARES_TYPEOF_ARES_SOCKLEN_T int
+
+#elif defined(_WIN32_WCE)
+# define CARES_TYPEOF_ARES_SOCKLEN_T int
+
+#elif defined(__MINGW32__)
+# define CARES_TYPEOF_ARES_SOCKLEN_T int
+
+#elif defined(__VMS)
+# define CARES_TYPEOF_ARES_SOCKLEN_T unsigned int
+
+#elif defined(__OS400__)
+# if defined(__ILEC400__)
+# define CARES_TYPEOF_ARES_SOCKLEN_T socklen_t
+# define CARES_PULL_SYS_TYPES_H 1
+# define CARES_PULL_SYS_SOCKET_H 1
+# endif
+
+#elif defined(__MVS__)
+# if defined(__IBMC__) || defined(__IBMCPP__)
+# define CARES_TYPEOF_ARES_SOCKLEN_T socklen_t
+# define CARES_PULL_SYS_TYPES_H 1
+# define CARES_PULL_SYS_SOCKET_H 1
+# endif
+
+#elif defined(__370__)
+# if defined(__IBMC__) || defined(__IBMCPP__)
+# define CARES_TYPEOF_ARES_SOCKLEN_T socklen_t
+# define CARES_PULL_SYS_TYPES_H 1
+# define CARES_PULL_SYS_SOCKET_H 1
+# endif
+
+#elif defined(TPF)
+# define CARES_TYPEOF_ARES_SOCKLEN_T int
+
+/* ===================================== */
+/* KEEP MSVC THE PENULTIMATE ENTRY */
+/* ===================================== */
+
+#elif defined(_MSC_VER)
+# define CARES_TYPEOF_ARES_SOCKLEN_T int
+
+/* ===================================== */
+/* KEEP GENERIC GCC THE LAST ENTRY */
+/* ===================================== */
+
+#elif defined(__GNUC__)
+# define CARES_TYPEOF_ARES_SOCKLEN_T socklen_t
+# define CARES_PULL_SYS_TYPES_H 1
+# define CARES_PULL_SYS_SOCKET_H 1
+
+#else
+# error "Unknown non-configure build target!"
+ Error Compilation_aborted_Unknown_non_configure_build_target
+#endif
+
+/* CARES_PULL_SYS_TYPES_H is defined above when inclusion of header file */
+/* sys/types.h is required here to properly make type definitions below. */
+#ifdef CARES_PULL_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+
+/* CARES_PULL_SYS_SOCKET_H is defined above when inclusion of header file */
+/* sys/socket.h is required here to properly make type definitions below. */
+#ifdef CARES_PULL_SYS_SOCKET_H
+#ifdef _WIN32
+# include <ws2tcpip.h>
+#else
+# include <sys/socket.h>
+#endif
+#endif
+
+/* Data type definition of ares_socklen_t. */
+
+#ifdef CARES_TYPEOF_ARES_SOCKLEN_T
+ typedef CARES_TYPEOF_ARES_SOCKLEN_T ares_socklen_t;
+#endif
+
+/* Data type definition of ares_ssize_t. */
+#ifdef _WIN32
+# ifdef _WIN64
+# define CARES_TYPEOF_ARES_SSIZE_T __int64
+# else
+# define CARES_TYPEOF_ARES_SSIZE_T long
+# endif
+#else
+# define CARES_TYPEOF_ARES_SSIZE_T ssize_t
+#endif
+
+typedef CARES_TYPEOF_ARES_SSIZE_T ares_ssize_t;
+
+#endif /* __CARES_BUILD_H */
diff --git a/contrib/libs/c-ares/ares_cancel.c b/contrib/libs/c-ares/ares_cancel.c
new file mode 100644
index 0000000000..465cc9e95e
--- /dev/null
+++ b/contrib/libs/c-ares/ares_cancel.c
@@ -0,0 +1,63 @@
+
+/* 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 <assert.h>
+
+#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/contrib/libs/c-ares/ares_config.h b/contrib/libs/c-ares/ares_config.h
new file mode 100644
index 0000000000..6695a6ad21
--- /dev/null
+++ b/contrib/libs/c-ares/ares_config.h
@@ -0,0 +1,537 @@
+/* ares_config.h. Generated from ares_config.h.in by configure. */
+/* ares_config.h.in. Generated from configure.ac by autoheader. */
+
+/* Define if building universal (internal helper macro) */
+/* #undef AC_APPLE_UNIVERSAL_BUILD */
+
+/* define this if ares is built for a big endian system */
+/* #undef ARES_BIG_ENDIAN */
+
+/* when building as static part of libcurl */
+/* #undef BUILDING_LIBCURL */
+
+/* Definition to make a library symbol externally visible. */
+#define CARES_SYMBOL_SCOPE_EXTERN __attribute__ ((__visibility__ ("default")))
+
+/* if a /etc/inet dir is being used */
+/* #undef ETC_INET */
+
+/* Define to the type of arg 2 for gethostname. */
+#define GETHOSTNAME_TYPE_ARG2 size_t
+
+/* Define to the type qualifier of arg 1 for getnameinfo. */
+#define GETNAMEINFO_QUAL_ARG1 const
+
+/* Define to the type of arg 1 for getnameinfo. */
+#define GETNAMEINFO_TYPE_ARG1 struct sockaddr *
+
+/* Define to the type of arg 2 for getnameinfo. */
+#define GETNAMEINFO_TYPE_ARG2 socklen_t
+
+/* Define to the type of args 4 and 6 for getnameinfo. */
+#define GETNAMEINFO_TYPE_ARG46 socklen_t
+
+/* Define to the type of arg 7 for getnameinfo. */
+#define GETNAMEINFO_TYPE_ARG7 int
+
+/* Specifies the number of arguments to getservbyport_r */
+#define GETSERVBYPORT_R_ARGS 6
+
+/* Specifies the size of the buffer to pass to getservbyport_r */
+#define GETSERVBYPORT_R_BUFSIZE 4096
+
+/* Define to 1 if you have AF_INET6. */
+#define HAVE_AF_INET6 1
+
+/* Define to 1 if you have the <arpa/inet.h> header file. */
+#define HAVE_ARPA_INET_H 1
+
+#if defined(__ANDROID__)
+#else
+/* Define to 1 if you have the <arpa/nameser_compat.h> header file. */
+#define HAVE_ARPA_NAMESER_COMPAT_H 1
+#endif
+
+/* Define to 1 if you have the <arpa/nameser.h> header file. */
+#define HAVE_ARPA_NAMESER_H 1
+
+/* Define to 1 if you have the <assert.h> header file. */
+#define HAVE_ASSERT_H 1
+
+/* Define to 1 if you have the `bitncmp' function. */
+/* #undef HAVE_BITNCMP */
+
+/* Define to 1 if bool is an available type. */
+#define HAVE_BOOL_T 1
+
+/* Define to 1 if you have the clock_gettime function and monotonic timer. */
+// #define HAVE_CLOCK_GETTIME_MONOTONIC 1
+
+/* Define to 1 if you have the closesocket function. */
+/* #undef HAVE_CLOSESOCKET */
+
+/* Define to 1 if you have the CloseSocket camel case function. */
+/* #undef HAVE_CLOSESOCKET_CAMEL */
+
+/* Define to 1 if you have the connect function. */
+#define HAVE_CONNECT 1
+
+/* Define to 1 if you have the <dlfcn.h> header file. */
+#define HAVE_DLFCN_H 1
+
+/* Define to 1 if you have the <errno.h> header file. */
+#define HAVE_ERRNO_H 1
+
+/* Define to 1 if you have the fcntl function. */
+#define HAVE_FCNTL 1
+
+/* Define to 1 if you have the <fcntl.h> header file. */
+#define HAVE_FCNTL_H 1
+
+/* Define to 1 if you have a working fcntl O_NONBLOCK function. */
+#define HAVE_FCNTL_O_NONBLOCK 1
+
+/* Define to 1 if you have the freeaddrinfo function. */
+#define HAVE_FREEADDRINFO 1
+
+/* Define to 1 if you have a working getaddrinfo function. */
+#define HAVE_GETADDRINFO 1
+
+/* Define to 1 if the getaddrinfo function is threadsafe. */
+#define HAVE_GETADDRINFO_THREADSAFE 1
+
+/* Define to 1 if you have the getenv function. */
+#define HAVE_GETENV 1
+
+/* Define to 1 if you have the gethostbyaddr function. */
+#define HAVE_GETHOSTBYADDR 1
+
+/* Define to 1 if you have the gethostbyname function. */
+#define HAVE_GETHOSTBYNAME 1
+
+/* Define to 1 if you have the gethostname function. */
+#define HAVE_GETHOSTNAME 1
+
+/* Define to 1 if you have the getnameinfo function. */
+#define HAVE_GETNAMEINFO 1
+
+/* Define to 1 if you have the getservbyport_r function. */
+#define HAVE_GETSERVBYPORT_R 1
+
+#if defined(__APPLE__)
+#undef HAVE_GETSERVBYPORT_R
+#endif
+
+#if defined(__ANDROID__)
+#undef HAVE_GETSERVBYPORT_R
+#endif
+
+/* Define to 1 if you have the `gettimeofday' function. */
+#define HAVE_GETTIMEOFDAY 1
+
+/* Define to 1 if you have the `if_indextoname' function. */
+#define HAVE_IF_INDEXTONAME 1
+
+/* Define to 1 if you have a IPv6 capable working inet_net_pton function. */
+/* #undef HAVE_INET_NET_PTON */
+
+/* Define to 1 if you have a IPv6 capable working inet_ntop function. */
+#define HAVE_INET_NTOP 1
+
+/* Define to 1 if you have a IPv6 capable working inet_pton function. */
+// #define HAVE_INET_PTON 1
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#define HAVE_INTTYPES_H 1
+
+/* Define to 1 if you have the ioctl function. */
+#define HAVE_IOCTL 1
+
+/* Define to 1 if you have the ioctlsocket function. */
+/* #undef HAVE_IOCTLSOCKET */
+
+/* Define to 1 if you have the IoctlSocket camel case function. */
+/* #undef HAVE_IOCTLSOCKET_CAMEL */
+
+/* Define to 1 if you have a working IoctlSocket camel case FIONBIO function.
+ */
+/* #undef HAVE_IOCTLSOCKET_CAMEL_FIONBIO */
+
+/* Define to 1 if you have a working ioctlsocket FIONBIO function. */
+/* #undef HAVE_IOCTLSOCKET_FIONBIO */
+
+/* Define to 1 if you have a working ioctl FIONBIO function. */
+#define HAVE_IOCTL_FIONBIO 1
+
+/* Define to 1 if you have a working ioctl SIOCGIFADDR function. */
+#define HAVE_IOCTL_SIOCGIFADDR 1
+
+/* Define to 1 if you have the `resolve' library (-lresolve). */
+/* #undef HAVE_LIBRESOLVE */
+
+/* Define to 1 if you have the <limits.h> header file. */
+#define HAVE_LIMITS_H 1
+
+/* if your compiler supports LL */
+#define HAVE_LL 1
+
+/* Define to 1 if the compiler supports the 'long long' data type. */
+#define HAVE_LONGLONG 1
+
+/* Define to 1 if you have the malloc.h header file. */
+#define HAVE_MALLOC_H 1
+
+/* Define to 1 if you have the memory.h header file. */
+#define HAVE_MEMORY_H 1
+
+/* Define to 1 if you have the MSG_NOSIGNAL flag. */
+#if defined(__FreeBSD__) && (__FreeBSD__ < 5)
+/* #undef HAVE_MSG_NOSIGNAL */
+#else
+#define HAVE_MSG_NOSIGNAL 1
+#endif
+
+/* Define to 1 if you have the <netdb.h> header file. */
+#define HAVE_NETDB_H 1
+
+/* Define to 1 if you have the <netinet/in.h> header file. */
+#define HAVE_NETINET_IN_H 1
+
+/* Define to 1 if you have the <netinet/tcp.h> header file. */
+#define HAVE_NETINET_TCP_H 1
+
+/* Define to 1 if you have the <net/if.h> header file. */
+#define HAVE_NET_IF_H 1
+
+/* Define to 1 if you have PF_INET6. */
+#define HAVE_PF_INET6 1
+
+/* Define to 1 if you have the recv function. */
+#define HAVE_RECV 1
+
+/* Define to 1 if you have the recvfrom function. */
+#define HAVE_RECVFROM 1
+
+/* Define to 1 if you have the send function. */
+#define HAVE_SEND 1
+
+/* Define to 1 if you have the setsockopt function. */
+#define HAVE_SETSOCKOPT 1
+
+/* Define to 1 if you have a working setsockopt SO_NONBLOCK function. */
+/* #undef HAVE_SETSOCKOPT_SO_NONBLOCK */
+
+/* Define to 1 if you have the <signal.h> header file. */
+#define HAVE_SIGNAL_H 1
+
+/* Define to 1 if sig_atomic_t is an available typedef. */
+#define HAVE_SIG_ATOMIC_T 1
+
+/* Define to 1 if sig_atomic_t is already defined as volatile. */
+/* #undef HAVE_SIG_ATOMIC_T_VOLATILE */
+
+/* Define to 1 if your struct sockaddr_in6 has sin6_scope_id. */
+#define HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID 1
+
+/* Define to 1 if you have the socket function. */
+#define HAVE_SOCKET 1
+
+/* Define to 1 if you have the <socket.h> header file. */
+/* #undef HAVE_SOCKET_H */
+
+/* Define to 1 if you have the <stdbool.h> header file. */
+#define HAVE_STDBOOL_H 1
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#define HAVE_STDINT_H 1
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#define HAVE_STDLIB_H 1
+
+/* Define to 1 if you have the strcasecmp function. */
+#define HAVE_STRCASECMP 1
+
+/* Define to 1 if you have the strcmpi function. */
+/* #undef HAVE_STRCMPI */
+
+/* Potential ares_malloc/ares_free mismatch in ares_strdup.c/ares_strsplit.c. */
+/* #undef HAVE_STRDUP */
+
+/* Define to 1 if you have the stricmp function. */
+/* #undef HAVE_STRICMP */
+
+/* Define to 1 if you have the <strings.h> header file. */
+#define HAVE_STRINGS_H 1
+
+/* Define to 1 if you have the <string.h> header file. */
+#define HAVE_STRING_H 1
+
+/* Define to 1 if you have the strncasecmp function. */
+#define HAVE_STRNCASECMP 1
+
+/* Define to 1 if you have the strncmpi function. */
+/* #undef HAVE_STRNCMPI */
+
+/* Define to 1 if you have the strnicmp function. */
+/* #undef HAVE_STRNICMP */
+
+/* Define to 1 if you have the <stropts.h> header file. */
+#define HAVE_STROPTS_H 1
+
+/* Define to 1 if you have struct addrinfo. */
+#define HAVE_STRUCT_ADDRINFO 1
+
+/* Define to 1 if you have struct in6_addr. */
+#define HAVE_STRUCT_IN6_ADDR 1
+
+/* Define to 1 if you have struct sockaddr_in6. */
+#define HAVE_STRUCT_SOCKADDR_IN6 1
+
+/* if struct sockaddr_storage is defined */
+#define HAVE_STRUCT_SOCKADDR_STORAGE 1
+
+/* Define to 1 if you have the timeval struct. */
+#define HAVE_STRUCT_TIMEVAL 1
+
+/* Define to 1 if you have the <sys/ioctl.h> header file. */
+#define HAVE_SYS_IOCTL_H 1
+
+/* Define to 1 if you have the <sys/param.h> header file. */
+#define HAVE_SYS_PARAM_H 1
+
+/* Define to 1 if you have the <sys/select.h> header file. */
+#define HAVE_SYS_SELECT_H 1
+
+/* Define to 1 if you have the <sys/socket.h> header file. */
+#define HAVE_SYS_SOCKET_H 1
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#define HAVE_SYS_STAT_H 1
+
+/* Define to 1 if you have the <sys/time.h> header file. */
+#define HAVE_SYS_TIME_H 1
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#define HAVE_SYS_TYPES_H 1
+
+/* Define to 1 if you have the <sys/uio.h> header file. */
+#define HAVE_SYS_UIO_H 1
+
+/* Define to 1 if you have the <time.h> header file. */
+#define HAVE_TIME_H 1
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#define HAVE_UNISTD_H 1
+
+/* Define to 1 if you have the windows.h header file. */
+/* #undef HAVE_WINDOWS_H */
+
+/* Define to 1 if you have the winsock2.h header file. */
+/* #undef HAVE_WINSOCK2_H */
+
+/* Define to 1 if you have the winsock.h header file. */
+/* #undef HAVE_WINSOCK_H */
+
+/* Define to 1 if you have the writev function. */
+#define HAVE_WRITEV 1
+
+/* Define to 1 if you have the ws2tcpip.h header file. */
+/* #undef HAVE_WS2TCPIP_H */
+
+/* Define to the sub-directory in which libtool stores uninstalled libraries.
+ */
+#define LT_OBJDIR ".libs/"
+
+/* Define to 1 if you need the malloc.h header file even with stdlib.h */
+/* #undef NEED_MALLOC_H */
+
+/* Define to 1 if you need the memory.h header file even with stdlib.h */
+/* #undef NEED_MEMORY_H */
+
+/* Define to 1 if _REENTRANT preprocessor symbol must be defined. */
+/* #undef NEED_REENTRANT */
+
+/* Define to 1 if _THREAD_SAFE preprocessor symbol must be defined. */
+/* #undef NEED_THREAD_SAFE */
+
+/* Define to 1 if your C compiler doesn't accept -c and -o together. */
+/* #undef NO_MINUS_C_MINUS_O */
+
+/* cpu-machine-OS */
+#define OS "x86_64-unknown-linux-gnu"
+
+/* Name of package */
+#define PACKAGE "c-ares"
+
+/* Define to the address where bug reports for this package should be sent. */
+#define PACKAGE_BUGREPORT "c-ares mailing list: http://cool.haxx.se/mailman/listinfo/c-ares"
+
+/* Define to the full name of this package. */
+#define PACKAGE_NAME "c-ares"
+
+/* Define to the full name and version of this package. */
+#define PACKAGE_STRING "c-ares 1.15.0"
+
+/* Define to the one symbol short name of this package. */
+#define PACKAGE_TARNAME "c-ares"
+
+/* Define to the home page for this package. */
+#define PACKAGE_URL ""
+
+/* Define to the version of this package. */
+#define PACKAGE_VERSION "1.15.0"
+
+/* a suitable file/device to read random data from */
+#define RANDOM_FILE "/dev/urandom"
+
+/* Define to the type qualifier pointed by arg 5 for recvfrom. */
+#define RECVFROM_QUAL_ARG5
+
+/* Define to the type of arg 1 for recvfrom. */
+#define RECVFROM_TYPE_ARG1 int
+
+/* Define to the type pointed by arg 2 for recvfrom. */
+#define RECVFROM_TYPE_ARG2 void
+
+/* Define to 1 if the type pointed by arg 2 for recvfrom is void. */
+#define RECVFROM_TYPE_ARG2_IS_VOID 1
+
+/* Define to the type of arg 3 for recvfrom. */
+#define RECVFROM_TYPE_ARG3 size_t
+
+/* Define to the type of arg 4 for recvfrom. */
+#define RECVFROM_TYPE_ARG4 int
+
+/* Define to the type pointed by arg 5 for recvfrom. */
+#define RECVFROM_TYPE_ARG5 struct sockaddr
+
+/* Define to 1 if the type pointed by arg 5 for recvfrom is void. */
+/* #undef RECVFROM_TYPE_ARG5_IS_VOID */
+
+/* Define to the type pointed by arg 6 for recvfrom. */
+#define RECVFROM_TYPE_ARG6 socklen_t
+
+/* Define to 1 if the type pointed by arg 6 for recvfrom is void. */
+/* #undef RECVFROM_TYPE_ARG6_IS_VOID */
+
+/* Define to the function return type for recvfrom. */
+#define RECVFROM_TYPE_RETV ssize_t
+
+/* Define to the type of arg 1 for recv. */
+#define RECV_TYPE_ARG1 int
+
+/* Define to the type of arg 2 for recv. */
+#define RECV_TYPE_ARG2 void *
+
+/* Define to the type of arg 3 for recv. */
+#define RECV_TYPE_ARG3 size_t
+
+/* Define to the type of arg 4 for recv. */
+#define RECV_TYPE_ARG4 int
+
+/* Define to the function return type for recv. */
+#define RECV_TYPE_RETV ssize_t
+
+/* Define as the return type of signal handlers (`int' or `void'). */
+#define RETSIGTYPE void
+
+/* Define to the type qualifier of arg 2 for send. */
+#define SEND_QUAL_ARG2 const
+
+/* Define to the type of arg 1 for send. */
+#define SEND_TYPE_ARG1 int
+
+/* Define to the type of arg 2 for send. */
+#define SEND_TYPE_ARG2 void *
+
+/* Define to the type of arg 3 for send. */
+#define SEND_TYPE_ARG3 size_t
+
+/* Define to the type of arg 4 for send. */
+#define SEND_TYPE_ARG4 int
+
+/* Define to the function return type for send. */
+#define SEND_TYPE_RETV ssize_t
+
+/* The size of `int', as computed by sizeof. */
+#define SIZEOF_INT 4
+
+#if defined(_MSC_VER)
+#define SIZEOF_LONG 4
+#elif defined(__SIZEOF_LONG__)
+#define SIZEOF_LONG __SIZEOF_LONG__
+#else
+/* The size of `long', as computed by sizeof. */
+#define SIZEOF_LONG 8
+#endif
+
+/* The size of `short', as computed by sizeof. */
+#define SIZEOF_SHORT 2
+
+#if defined(__SIZEOF_SIZE_T__)
+#define SIZEOF_SIZE_T __SIZEOF_SIZE_T__
+#else
+/* The size of `size_t', as computed by sizeof. */
+#define SIZEOF_SIZE_T 8
+#endif
+
+/* The size of `struct in6_addr', as computed by sizeof. */
+#define SIZEOF_STRUCT_IN6_ADDR 16
+
+/* The size of `struct in_addr', as computed by sizeof. */
+#define SIZEOF_STRUCT_IN_ADDR 4
+
+/* Define to 1 if you have the ANSI C header files. */
+#define STDC_HEADERS 1
+
+/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
+#define TIME_WITH_SYS_TIME 1
+
+/* Define to disable non-blocking sockets. */
+/* #undef USE_BLOCKING_SOCKETS */
+
+/* Version number of package */
+#define VERSION "1.15.0"
+
+/* Define to avoid automatic inclusion of winsock.h */
+/* #undef WIN32_LEAN_AND_MEAN */
+
+/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
+ significant byte first (like Motorola and SPARC, unlike Intel). */
+#if defined AC_APPLE_UNIVERSAL_BUILD
+# if defined __BIG_ENDIAN__
+# define WORDS_BIGENDIAN 1
+# endif
+#else
+# ifndef WORDS_BIGENDIAN
+/* # undef WORDS_BIGENDIAN */
+# endif
+#endif
+
+/* Define to 1 if OS is AIX. */
+#ifndef _ALL_SOURCE
+/* # undef _ALL_SOURCE */
+#endif
+
+/* Enable large inode numbers on Mac OS X 10.5. */
+#ifndef _DARWIN_USE_64_BIT_INODE
+# define _DARWIN_USE_64_BIT_INODE 1
+#endif
+
+/* Number of bits in a file offset, on hosts where this is settable. */
+/* #undef _FILE_OFFSET_BITS */
+
+/* Define for large files, on AIX-style hosts. */
+/* #undef _LARGE_FILES */
+
+/* Define to empty if `const' does not conform to ANSI C. */
+/* #undef const */
+
+/* Type to use in place of in_addr_t when system does not provide it. */
+/* #undef in_addr_t */
+
+/* Define to `unsigned int' if <sys/types.h> does not define. */
+/* #undef size_t */
+
+/* the signed version of size_t */
+/* #undef ssize_t */
diff --git a/contrib/libs/c-ares/ares_create_query.c b/contrib/libs/c-ares/ares_create_query.c
new file mode 100644
index 0000000000..9efce17cfa
--- /dev/null
+++ b/contrib/libs/c-ares/ares_create_query.c
@@ -0,0 +1,206 @@
+
+/* 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 <netinet/in.h>
+#endif
+#ifdef HAVE_ARPA_NAMESER_H
+# include <arpa/nameser.h>
+#else
+# include "nameser.h"
+#endif
+#ifdef HAVE_ARPA_NAMESER_COMPAT_H
+# include <arpa/nameser_compat.h>
+#endif
+
+#include "ares.h"
+#include "ares_dns.h"
+#include "ares_private.h"
+
+#ifndef T_OPT
+# define T_OPT 41 /* EDNS0 option (meta-RR) */
+#endif
+
+/* 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 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, 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/contrib/libs/c-ares/ares_data.c b/contrib/libs/c-ares/ares_data.c
new file mode 100644
index 0000000000..18dd650c7b
--- /dev/null
+++ b/contrib/libs/c-ares/ares_data.c
@@ -0,0 +1,222 @@
+
+/* 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 <stddef.h>
+
+#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_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;
+
+ 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_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_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/contrib/libs/c-ares/ares_data.h b/contrib/libs/c-ares/ares_data.h
new file mode 100644
index 0000000000..ee54a4b1f5
--- /dev/null
+++ b/contrib/libs/c-ares/ares_data.h
@@ -0,0 +1,73 @@
+#pragma once
+
+/* 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 */
+#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_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;
+ } data;
+};
+
+void *ares_malloc_data(ares_datatype type);
+
diff --git a/contrib/libs/c-ares/ares_destroy.c b/contrib/libs/c-ares/ares_destroy.c
new file mode 100644
index 0000000000..fed2009ab3
--- /dev/null
+++ b/contrib/libs/c-ares/ares_destroy.c
@@ -0,0 +1,113 @@
+
+/* 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 <assert.h>
+
+#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);
+}
+
+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);
+
+ 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/contrib/libs/c-ares/ares_dns.h b/contrib/libs/c-ares/ares_dns.h
new file mode 100644
index 0000000000..79f993b904
--- /dev/null
+++ b/contrib/libs/c-ares/ares_dns.h
@@ -0,0 +1,103 @@
+#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.
+ */
+
+/*
+ * 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/contrib/libs/c-ares/ares_expand_name.c b/contrib/libs/c-ares/ares_expand_name.c
new file mode 100644
index 0000000000..3a38e6737e
--- /dev/null
+++ b/contrib/libs/c-ares/ares_expand_name.c
@@ -0,0 +1,209 @@
+
+/* 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 <netinet/in.h>
+#endif
+#ifdef HAVE_ARPA_NAMESER_H
+# include <arpa/nameser.h>
+#else
+# include "nameser.h"
+#endif
+#ifdef HAVE_ARPA_NAMESER_COMPAT_H
+# include <arpa/nameser_compat.h>
+#endif
+
+#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);
+
+/* 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.
+ */
+
+int ares_expand_name(const unsigned char *encoded, const unsigned char *abuf,
+ int alen, char **s, long *enclen)
+{
+ 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);
+ 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
+ {
+ len = *p;
+ p++;
+ while (len--)
+ {
+ if (*p == '.' || *p == '\\')
+ *q++ = '\\';
+ *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;
+}
+
+/* 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 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)
+ {
+ offset = *encoded;
+ if (encoded + offset + 1 >= abuf + alen)
+ return -1;
+ encoded++;
+ while (offset--)
+ {
+ n += (*encoded == '.' || *encoded == '\\') ? 2 : 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 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 status = ares_expand_name(encoded, abuf, alen, s, enclen);
+ if (status == ARES_EBADNAME)
+ status = ARES_EBADRESP;
+ return status;
+}
diff --git a/contrib/libs/c-ares/ares_expand_string.c b/contrib/libs/c-ares/ares_expand_string.c
new file mode 100644
index 0000000000..d35df75248
--- /dev/null
+++ b/contrib/libs/c-ares/ares_expand_string.c
@@ -0,0 +1,70 @@
+
+/* 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 <netinet/in.h>
+#endif
+#ifdef HAVE_ARPA_NAMESER_H
+# include <arpa/nameser.h>
+#else
+# include "nameser.h"
+#endif
+
+#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/contrib/libs/c-ares/ares_fds.c b/contrib/libs/c-ares/ares_fds.c
new file mode 100644
index 0000000000..f405fc047c
--- /dev/null
+++ b/contrib/libs/c-ares/ares_fds.c
@@ -0,0 +1,59 @@
+
+/* 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/contrib/libs/c-ares/ares_free_hostent.c b/contrib/libs/c-ares/ares_free_hostent.c
new file mode 100644
index 0000000000..cfc5f81feb
--- /dev/null
+++ b/contrib/libs/c-ares/ares_free_hostent.c
@@ -0,0 +1,41 @@
+
+/* 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 <netdb.h>
+#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++)
+ ares_free(*p);
+ ares_free(host->h_aliases);
+ 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/contrib/libs/c-ares/ares_free_string.c b/contrib/libs/c-ares/ares_free_string.c
new file mode 100644
index 0000000000..024992e1c2
--- /dev/null
+++ b/contrib/libs/c-ares/ares_free_string.c
@@ -0,0 +1,25 @@
+
+/* 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/contrib/libs/c-ares/ares_freeaddrinfo.c b/contrib/libs/c-ares/ares_freeaddrinfo.c
new file mode 100644
index 0000000000..128f5daec4
--- /dev/null
+++ b/contrib/libs/c-ares/ares_freeaddrinfo.c
@@ -0,0 +1,57 @@
+
+/* 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 <netdb.h>
+#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)
+{
+ ares__freeaddrinfo_cnames(ai->cnames);
+ ares__freeaddrinfo_nodes(ai->nodes);
+ ares_free(ai);
+}
diff --git a/contrib/libs/c-ares/ares_getaddrinfo.c b/contrib/libs/c-ares/ares_getaddrinfo.c
new file mode 100644
index 0000000000..be168068b1
--- /dev/null
+++ b/contrib/libs/c-ares/ares_getaddrinfo.c
@@ -0,0 +1,765 @@
+
+/* 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 <netinet/in.h>
+#endif
+#ifdef HAVE_NETDB_H
+# include <netdb.h>
+#endif
+#ifdef HAVE_ARPA_INET_H
+# include <arpa/inet.h>
+#endif
+#ifdef HAVE_ARPA_NAMESER_H
+# include <arpa/nameser.h>
+#else
+# include "nameser.h"
+#endif
+#ifdef HAVE_ARPA_NAMESER_COMPAT_H
+# include <arpa/nameser_compat.h>
+#endif
+
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+#include <assert.h>
+
+#ifdef HAVE_LIMITS_H
+#include <limits.h>
+#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 */
+};
+
+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 */
+};
+
+/* 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 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;
+ struct ares_addrinfo_node *node;
+ ares_sockaddr addr;
+ size_t addrlen;
+ 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++;
+ }
+ }
+
+ memset(&addr, 0, sizeof(addr));
+
+ /* if we don't have 3 dots, it is illegal
+ * (although inet_pton doesn't think so).
+ */
+ if (numdots != 3 || !valid)
+ result = 0;
+ else
+ result =
+ (ares_inet_pton(AF_INET, name, &addr.sa4.sin_addr) < 1 ? 0 : 1);
+
+ if (result)
+ {
+ family = addr.sa.sa_family = AF_INET;
+ addr.sa4.sin_port = htons(port);
+ addrlen = sizeof(addr.sa4);
+ }
+ }
+
+ if (family == AF_INET6 || family == AF_UNSPEC)
+ {
+ result =
+ (ares_inet_pton(AF_INET6, name, &addr.sa6.sin6_addr) < 1 ? 0 : 1);
+ addr.sa6.sin6_family = AF_INET6;
+ addr.sa6.sin6_port = htons(port);
+ addrlen = sizeof(addr.sa6);
+ }
+
+ if (!result)
+ return 0;
+
+ node = ares__malloc_addrinfo_node();
+ if (!node)
+ {
+ ares_freeaddrinfo(ai);
+ callback(arg, ARES_ENOMEM, 0, NULL);
+ return 1;
+ }
+
+ ai->nodes = node;
+
+ node->ai_addr = ares_malloc(addrlen);
+ if (!node->ai_addr)
+ {
+ ares_freeaddrinfo(ai);
+ callback(arg, ARES_ENOMEM, 0, NULL);
+ return 1;
+ }
+
+ node->ai_addrlen = (unsigned int)addrlen;
+ node->ai_family = addr.sa.sa_family;
+ if (addr.sa.sa_family == AF_INET)
+ memcpy(node->ai_addr, &addr.sa4, sizeof(addr.sa4));
+ else
+ memcpy(node->ai_addr, &addr.sa6, sizeof(addr.sa6));
+
+ 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;
+ }
+ }
+
+ 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))
+ {
+ sentinel.ai_next = hquery->ai->nodes;
+ ares__sortaddrinfo(hquery->channel, &sentinel);
+ hquery->ai->nodes = sentinel.ai_next;
+ }
+ next = hquery->ai->nodes;
+ /* Set port into each address (resolved separately). */
+ while (next)
+ {
+ if (next->ai_family == AF_INET)
+ {
+ (CARES_INADDR_CAST(struct sockaddr_in *, next->ai_addr))->sin_port = htons(hquery->port);
+ }
+ else
+ {
+ (CARES_INADDR_CAST(struct sockaddr_in6 *, next->ai_addr))->sin6_port = htons(hquery->port);
+ }
+ 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 file_lookup(struct host_query *hquery)
+{
+ FILE *fp;
+ int error;
+ int status;
+ const char *path_hosts = NULL;
+
+ if (hquery->hints.ai_flags & ARES_AI_ENVHOSTS)
+ {
+ path_hosts = getenv("CARES_HOSTS");
+ }
+
+ 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);
+ path_hosts = PATH_HOSTS;
+
+#elif defined(WATT32)
+ const char *PATH_HOSTS = _w32_GetHostsFile();
+
+ if (!PATH_HOSTS)
+ return ARES_ENOTFOUND;
+#endif
+ path_hosts = PATH_HOSTS;
+ }
+
+ 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));
+ return ARES_EFILE;
+ }
+ }
+ status = ares__readaddrinfo(fp, hquery->name, hquery->port, &hquery->hints, hquery->ai);
+ fclose(fp);
+ return status;
+}
+
+static void next_lookup(struct host_query *hquery, int status)
+{
+ switch (*hquery->remaining_lookups)
+ {
+ case 'b':
+ /* 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, hquery->ai);
+ }
+ else if (status == ARES_EDESTRUCTION)
+ {
+ end_hquery(hquery, status);
+ return;
+ }
+
+ if (!hquery->remaining)
+ {
+ if (addinfostatus != ARES_SUCCESS)
+ {
+ /* error in parsing result e.g. no memory */
+ 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)
+ {
+ next_lookup(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;
+
+ 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;
+ }
+
+ if (service)
+ {
+ if (hints->ai_flags & ARES_AI_NUMERICSERV)
+ {
+ port = (unsigned short)strtoul(service, NULL, 0);
+ if (!port)
+ {
+ callback(arg, ARES_ESERVICE, 0, NULL);
+ return;
+ }
+ }
+ else
+ {
+ port = lookup_service(service, 0);
+ if (!port)
+ {
+ port = (unsigned short)strtoul(service, NULL, 0);
+ if (!port)
+ {
+ callback(arg, ARES_ESERVICE, 0, NULL);
+ return;
+ }
+ }
+ }
+ }
+
+ ai = ares__malloc_addrinfo();
+ if (!ai)
+ {
+ callback(arg, ARES_ENOMEM, 0, NULL);
+ return;
+ }
+
+ if (fake_addrinfo(name, port, hints, ai, callback, arg))
+ {
+ return;
+ }
+
+ /* Allocate and fill in the host query structure. */
+ hquery = ares_malloc(sizeof(struct host_query));
+ if (!hquery)
+ {
+ ares_freeaddrinfo(ai);
+ callback(arg, ARES_ENOMEM, 0, NULL);
+ return;
+ }
+
+ hquery->name = ares_strdup(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;
+
+ /* 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)
+ {
+ 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;
+ for (p = hquery->name; *p; p++)
+ {
+ if (*p == '.')
+ {
+ ndots++;
+ }
+ }
+ return ndots >= hquery->channel->ndots;
+}
diff --git a/contrib/libs/c-ares/ares_getenv.c b/contrib/libs/c-ares/ares_getenv.c
new file mode 100644
index 0000000000..f6e4dc2952
--- /dev/null
+++ b/contrib/libs/c-ares/ares_getenv.c
@@ -0,0 +1,28 @@
+
+
+/* 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/contrib/libs/c-ares/ares_getenv.h b/contrib/libs/c-ares/ares_getenv.h
new file mode 100644
index 0000000000..6da6cc5081
--- /dev/null
+++ b/contrib/libs/c-ares/ares_getenv.h
@@ -0,0 +1,26 @@
+#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/contrib/libs/c-ares/ares_gethostbyaddr.c b/contrib/libs/c-ares/ares_gethostbyaddr.c
new file mode 100644
index 0000000000..f37fb8b815
--- /dev/null
+++ b/contrib/libs/c-ares/ares_gethostbyaddr.c
@@ -0,0 +1,301 @@
+
+/* 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 <netinet/in.h>
+#endif
+#ifdef HAVE_NETDB_H
+# include <netdb.h>
+#endif
+#ifdef HAVE_ARPA_INET_H
+# include <arpa/inet.h>
+#endif
+#ifdef HAVE_ARPA_NAMESER_H
+# include <arpa/nameser.h>
+#else
+# include "nameser.h"
+#endif
+#ifdef HAVE_ARPA_NAMESER_COMPAT_H
+# include <arpa/nameser_compat.h>
+#endif
+
+#include "ares.h"
+#include "ares_inet_net_pton.h"
+#include "ares_platform.h"
+#include "ares_private.h"
+
+#ifdef WATT32
+#undef WIN32
+#endif
+
+#define next_lookup next_lookup_x
+#define file_lookup file_lookup_x
+
+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, NULL);
+ }
+ else
+ {
+ addrlen = sizeof(aquery->addr.addrV6);
+ status = ares_parse_ptr_reply(abuf, alen, &aquery->addr.addrV6,
+ (int)addrlen, AF_INET6, &host, NULL);
+ }
+ 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)
+ extern const char *_w32_GetHostsFile (void);
+ 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);
+ }
+}
+
+#undef next_lookup
+#undef file_lookup
+
diff --git a/contrib/libs/c-ares/ares_gethostbyname.c b/contrib/libs/c-ares/ares_gethostbyname.c
new file mode 100644
index 0000000000..ecd03e7931
--- /dev/null
+++ b/contrib/libs/c-ares/ares_gethostbyname.c
@@ -0,0 +1,537 @@
+
+/* 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 <netinet/in.h>
+#endif
+#ifdef HAVE_NETDB_H
+# include <netdb.h>
+#endif
+#ifdef HAVE_ARPA_INET_H
+# include <arpa/inet.h>
+#endif
+#ifdef HAVE_ARPA_NAMESER_H
+# include <arpa/nameser.h>
+#else
+# include "nameser.h"
+#endif
+#ifdef HAVE_ARPA_NAMESER_COMPAT_H
+# include <arpa/nameser_compat.h>
+#endif
+
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#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"
+
+#ifdef WATT32
+#undef WIN32
+#endif
+
+struct host_query {
+ /* Arguments passed to ares_gethostbyname() */
+ ares_channel channel;
+ char *name;
+ ares_host_callback callback;
+ void *arg;
+ int sent_family; /* this family is what was is being used */
+ int want_family; /* this family is what is asked for in the API */
+ const char *remaining_lookups;
+ int timeouts;
+};
+
+static void next_lookup(struct host_query *hquery, int status_code);
+static void host_callback(void *arg, int status, int timeouts,
+ unsigned char *abuf, int alen);
+static void end_hquery(struct host_query *hquery, int status,
+ struct hostent *host);
+static int fake_hostent(const char *name, int family,
+ ares_host_callback callback, void *arg);
+static int file_lookup(const char *name, int family, struct hostent **host);
+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);
+
+void ares_gethostbyname(ares_channel channel, const char *name, int family,
+ ares_host_callback callback, void *arg)
+{
+ struct host_query *hquery;
+
+ /* Right now we only know how to look up Internet addresses - and unspec
+ means try both basically. */
+ switch (family) {
+ case AF_INET:
+ case AF_INET6:
+ case AF_UNSPEC:
+ break;
+ default:
+ callback(arg, ARES_ENOTIMP, 0, NULL);
+ return;
+ }
+
+ /* Per RFC 7686, reject queries for ".onion" domain names with NXDOMAIN. */
+ if (ares__is_onion_domain(name))
+ {
+ callback(arg, ARES_ENOTFOUND, 0, NULL);
+ return;
+ }
+
+ if (fake_hostent(name, family, callback, arg))
+ return;
+
+ /* Allocate and fill in the host query structure. */
+ hquery = ares_malloc(sizeof(struct host_query));
+ if (!hquery)
+ {
+ callback(arg, ARES_ENOMEM, 0, NULL);
+ return;
+ }
+ hquery->channel = channel;
+ hquery->name = ares_strdup(name);
+ hquery->want_family = family;
+ hquery->sent_family = -1; /* nothing is sent yet */
+ if (!hquery->name) {
+ ares_free(hquery);
+ callback(arg, ARES_ENOMEM, 0, NULL);
+ return;
+ }
+ hquery->callback = callback;
+ hquery->arg = arg;
+ hquery->remaining_lookups = channel->lookups;
+ hquery->timeouts = 0;
+
+ /* Start performing lookups according to channel->lookups. */
+ next_lookup(hquery, ARES_ECONNREFUSED /* initial error code */);
+}
+
+static void next_lookup(struct host_query *hquery, int status_code)
+{
+ const char *p;
+ struct hostent *host;
+ int status = status_code;
+
+ for (p = hquery->remaining_lookups; *p; p++)
+ {
+ switch (*p)
+ {
+ case 'b':
+ /* DNS lookup */
+ hquery->remaining_lookups = p + 1;
+ if ((hquery->want_family == AF_INET6) ||
+ (hquery->want_family == AF_UNSPEC)) {
+ /* if inet6 or unspec, start out with AAAA */
+ hquery->sent_family = AF_INET6;
+ ares_search(hquery->channel, hquery->name, C_IN, T_AAAA,
+ host_callback, hquery);
+ }
+ else {
+ hquery->sent_family = AF_INET;
+ ares_search(hquery->channel, hquery->name, C_IN, T_A,
+ host_callback, hquery);
+ }
+ return;
+
+ case 'f':
+ /* Host file lookup */
+ status = file_lookup(hquery->name, hquery->want_family, &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_hquery(hquery, status, host);
+ return;
+ }
+ status = status_code; /* Use original status code */
+ break;
+ }
+ }
+ end_hquery(hquery, status, NULL);
+}
+
+static void host_callback(void *arg, int status, int timeouts,
+ unsigned char *abuf, int alen)
+{
+ struct host_query *hquery = (struct host_query *) arg;
+ ares_channel channel = hquery->channel;
+ struct hostent *host = NULL;
+
+ hquery->timeouts += timeouts;
+ if (status == ARES_SUCCESS)
+ {
+ if (hquery->sent_family == AF_INET)
+ {
+ status = ares_parse_a_reply(abuf, alen, &host, NULL, NULL);
+ if (host && channel->nsort)
+ sort_addresses(host, channel->sortlist, channel->nsort);
+ }
+ else if (hquery->sent_family == AF_INET6)
+ {
+ status = ares_parse_aaaa_reply(abuf, alen, &host, NULL, NULL);
+ if ((status == ARES_ENODATA || status == ARES_EBADRESP ||
+ (status == ARES_SUCCESS && host && host->h_addr_list[0] == NULL)) &&
+ hquery->want_family == AF_UNSPEC) {
+ /* The query returned something but either there were no AAAA
+ records (e.g. just CNAME) or the response was malformed. Try
+ looking up A instead. */
+ if (host)
+ ares_free_hostent(host);
+ hquery->sent_family = AF_INET;
+ ares_search(hquery->channel, hquery->name, C_IN, T_A,
+ host_callback, hquery);
+ return;
+ }
+ if (host && channel->nsort)
+ sort6_addresses(host, channel->sortlist, channel->nsort);
+ }
+ if (status == ARES_SUCCESS && host && host->h_addr_list[0] == NULL)
+ {
+ /* The query returned something but had no A/AAAA record
+ (even after potentially retrying AAAA with A)
+ so we should treat this as an error */
+ status = ARES_ENODATA;
+ }
+ end_hquery(hquery, status, host);
+ }
+ else if ((status == ARES_ENODATA || status == ARES_EBADRESP ||
+ status == ARES_ETIMEOUT) && (hquery->sent_family == AF_INET6 &&
+ hquery->want_family == AF_UNSPEC))
+ {
+ /* The AAAA query yielded no useful result. Now look up an A instead. */
+ hquery->sent_family = AF_INET;
+ ares_search(hquery->channel, hquery->name, C_IN, T_A, host_callback,
+ hquery);
+ }
+ else if (status == ARES_EDESTRUCTION)
+ end_hquery(hquery, status, NULL);
+ else
+ next_lookup(hquery, status);
+}
+
+static void end_hquery(struct host_query *hquery, int status,
+ struct hostent *host)
+{
+ hquery->callback(hquery->arg, status, hquery->timeouts, host);
+ if (host)
+ ares_free_hostent(host);
+ ares_free(hquery->name);
+ ares_free(hquery);
+}
+
+/* If the name looks like an IP address, fake up a host entry, end the
+ * query immediately, and return true. Otherwise return false.
+ */
+static int fake_hostent(const char *name, int family,
+ ares_host_callback callback, void *arg)
+{
+ struct hostent hostent;
+ char *aliases[1] = { NULL };
+ char *addrs[2];
+ int result = 0;
+ struct in_addr in;
+ struct ares_in6_addr in6;
+
+ if (family == AF_INET || family == AF_INET6)
+ {
+ /* 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
+ result = (ares_inet_pton(AF_INET, name, &in) < 1 ? 0 : 1);
+
+ if (result)
+ family = AF_INET;
+ }
+ if (family == AF_INET6)
+ result = (ares_inet_pton(AF_INET6, name, &in6) < 1 ? 0 : 1);
+
+ if (!result)
+ return 0;
+
+ if (family == AF_INET)
+ {
+ hostent.h_length = (int)sizeof(struct in_addr);
+ addrs[0] = (char *)&in;
+ }
+ else if (family == AF_INET6)
+ {
+ hostent.h_length = (int)sizeof(struct ares_in6_addr);
+ addrs[0] = (char *)&in6;
+ }
+ /* Duplicate the name, to avoid a constness violation. */
+ hostent.h_name = ares_strdup(name);
+ if (!hostent.h_name)
+ {
+ callback(arg, ARES_ENOMEM, 0, NULL);
+ return 1;
+ }
+
+ /* Fill in the rest of the host structure and terminate the query. */
+ addrs[1] = NULL;
+ hostent.h_aliases = aliases;
+ hostent.h_addrtype = aresx_sitoss(family);
+ hostent.h_addr_list = addrs;
+ callback(arg, ARES_SUCCESS, 0, &hostent);
+
+ ares_free((char *)(hostent.h_name));
+ return 1;
+}
+
+/* This is an API method */
+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)
+ extern const char *_w32_GetHostsFile (void);
+ 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;
+}
+
+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;
+}
diff --git a/contrib/libs/c-ares/ares_getnameinfo.c b/contrib/libs/c-ares/ares_getnameinfo.c
new file mode 100644
index 0000000000..53f91ca845
--- /dev/null
+++ b/contrib/libs/c-ares/ares_getnameinfo.c
@@ -0,0 +1,453 @@
+
+/* 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 <netinet/in.h>
+#endif
+#ifdef HAVE_NETDB_H
+# include <netdb.h>
+#endif
+#ifdef HAVE_ARPA_INET_H
+# include <arpa/inet.h>
+#endif
+#ifdef HAVE_ARPA_NAMESER_H
+# include <arpa/nameser.h>
+#else
+# include "nameser.h"
+#endif
+#ifdef HAVE_ARPA_NAMESER_COMPAT_H
+# include <arpa/nameser_compat.h>
+#endif
+
+#ifdef HAVE_NET_IF_H
+#include <net/if.h>
+#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/contrib/libs/c-ares/ares_getopt.c b/contrib/libs/c-ares/ares_getopt.c
new file mode 100644
index 0000000000..1e02d08686
--- /dev/null
+++ b/contrib/libs/c-ares/ares_getopt.c
@@ -0,0 +1,122 @@
+/*
+ * 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 <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#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/contrib/libs/c-ares/ares_getopt.h b/contrib/libs/c-ares/ares_getopt.h
new file mode 100644
index 0000000000..63acb3b423
--- /dev/null
+++ b/contrib/libs/c-ares/ares_getopt.h
@@ -0,0 +1,53 @@
+#ifndef ARES_GETOPT_H
+#define ARES_GETOPT_H
+
+/*
+ * 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.
+ */
+
+
+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
+
+extern char *optarg;
+extern int optind;
+extern int opterr;
+extern int optopt;
+
+#endif /* ARES_GETOPT_H */
diff --git a/contrib/libs/c-ares/ares_getsock.c b/contrib/libs/c-ares/ares_getsock.c
new file mode 100644
index 0000000000..22d344679f
--- /dev/null
+++ b/contrib/libs/c-ares/ares_getsock.c
@@ -0,0 +1,66 @@
+
+/* 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/contrib/libs/c-ares/ares_inet_net_pton.h b/contrib/libs/c-ares/ares_inet_net_pton.h
new file mode 100644
index 0000000000..90da2cc651
--- /dev/null
+++ b/contrib/libs/c-ares/ares_inet_net_pton.h
@@ -0,0 +1,25 @@
+#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/contrib/libs/c-ares/ares_init.c b/contrib/libs/c-ares/ares_init.c
new file mode 100644
index 0000000000..e06265c6a2
--- /dev/null
+++ b/contrib/libs/c-ares/ares_init.c
@@ -0,0 +1,2646 @@
+
+/* 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 <sys/param.h>
+#endif
+
+#ifdef HAVE_NETINET_IN_H
+#include <netinet/in.h>
+#endif
+
+#ifdef HAVE_NETDB_H
+#include <netdb.h>
+#endif
+
+#ifdef HAVE_ARPA_INET_H
+#include <arpa/inet.h>
+#endif
+
+#ifdef HAVE_ARPA_NAMESER_H
+# include <arpa/nameser.h>
+#else
+# include "nameser.h"
+#endif
+#ifdef HAVE_ARPA_NAMESER_COMPAT_H
+# include <arpa/nameser_compat.h>
+#endif
+
+#if defined(ANDROID) || defined(__ANDROID__)
+#include <sys/system_properties.h>
+#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 <resolv.h>
+#endif
+
+#include "ares.h"
+#include "ares_inet_net_pton.h"
+#include "ares_library_init.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 init_id_key(rc4_key* key,int key_data_len);
+
+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;
+
+#ifdef CURLDEBUG
+ const char *env = getenv("CARES_MEMDEBUG");
+
+ if (env)
+ curl_memdebug(env);
+ env = getenv("CARES_MEMLIMIT");
+ if (env) {
+ char *endptr;
+ long num = strtol(env, &endptr, 10);
+ if((endptr != env) && (endptr == env + strlen(env)) && (num > 0))
+ curl_memlimit(num);
+ }
+#endif
+
+ 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->maxtimeout = -1;
+ channel->jitter = -1;
+ channel->jitter_rand_state = -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->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) {
+ status = init_id_key(&channel->id_key, ARES_ID_KEY_LEN);
+ if (status == ARES_SUCCESS)
+ channel->next_id = ares__generate_new_id(&channel->id_key);
+ 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);
+ 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|ARES_OPT_MAXTIMEOUTMS|
+ ARES_OPT_JITTER);
+ (*optmask) |= (channel->rotate ? ARES_OPT_ROTATE : ARES_OPT_NOROTATE);
+
+ if (channel->resolvconf_path)
+ (*optmask) |= ARES_OPT_RESOLVCONF;
+
+ /* 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->maxtimeout = channel->maxtimeout;
+ options->jitter = channel->jitter;
+ options->jitter_rand_seed = channel->jitter_rand_state;
+ 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;
+ }
+
+ 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_MAXTIMEOUTMS) && channel->maxtimeout == -1)
+ channel->maxtimeout = options->maxtimeout;
+ if ((optmask & ARES_OPT_JITTER) && channel->jitter == -1)
+ {
+ channel->jitter = options->jitter;
+ channel->jitter_rand_state = options->jitter_rand_seed;
+ }
+ 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;
+ }
+
+ 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;
+}
+
+/*
+ * get_REG_SZ_9X()
+ *
+ * Functionally identical to get_REG_SZ()
+ *
+ * Supported on Windows 95, 98 and ME.
+ */
+static int get_REG_SZ_9X(HKEY hKey, const char *leafKeyName, char **outptr)
+{
+ DWORD dataType = 0;
+ DWORD size = 0;
+ int res;
+
+ *outptr = NULL;
+
+ /* Find out size of string stored in registry */
+ res = RegQueryValueExA(hKey, leafKeyName, 0, &dataType, 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, &dataType,
+ (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;
+}
+
+/*
+ * get_enum_REG_SZ()
+ *
+ * Given a 'hKeyParent' handle to an open registry key and a 'leafKeyName'
+ * pointer to the name of the registry leaf key to be queried, parent key
+ * is enumerated searching in child keys for given leaf key name and its
+ * associated string value. When located, this returns 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_enum_REG_SZ(HKEY hKeyParent, const char *leafKeyName,
+ char **outptr)
+{
+ char enumKeyName[256];
+ DWORD enumKeyNameBuffSize;
+ DWORD enumKeyIdx = 0;
+ HKEY hKeyEnum;
+ int gotString;
+ int res;
+
+ *outptr = NULL;
+
+ for(;;)
+ {
+ enumKeyNameBuffSize = sizeof(enumKeyName);
+ res = RegEnumKeyExA(hKeyParent, enumKeyIdx++, enumKeyName,
+ &enumKeyNameBuffSize, 0, NULL, NULL, NULL);
+ if (res != ERROR_SUCCESS)
+ break;
+ res = RegOpenKeyExA(hKeyParent, enumKeyName, 0, KEY_QUERY_VALUE,
+ &hKeyEnum);
+ if (res != ERROR_SUCCESS)
+ continue;
+ gotString = get_REG_SZ(hKeyEnum, leafKeyName, outptr);
+ RegCloseKey(hKeyEnum);
+ if (gotString)
+ break;
+ }
+
+ if (!*outptr)
+ return 0;
+
+ return 1;
+}
+
+/*
+ * get_DNS_Registry_9X()
+ *
+ * Functionally identical to get_DNS_Registry()
+ *
+ * Implementation supports Windows 95, 98 and ME.
+ */
+static int get_DNS_Registry_9X(char **outptr)
+{
+ HKEY hKey_VxD_MStcp;
+ int gotString;
+ int res;
+
+ *outptr = NULL;
+
+ res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, WIN_NS_9X, 0, KEY_READ,
+ &hKey_VxD_MStcp);
+ if (res != ERROR_SUCCESS)
+ return 0;
+
+ gotString = get_REG_SZ_9X(hKey_VxD_MStcp, NAMESERVER, outptr);
+ RegCloseKey(hKey_VxD_MStcp);
+
+ if (!gotString || !*outptr)
+ return 0;
+
+ return 1;
+}
+
+/*
+ * get_DNS_Registry_NT()
+ *
+ * Functionally identical to get_DNS_Registry()
+ *
+ * Refs: Microsoft Knowledge Base articles KB120642 and KB314053.
+ *
+ * Implementation supports Windows NT 3.5 and newer.
+ */
+static int get_DNS_Registry_NT(char **outptr)
+{
+ HKEY hKey_Interfaces = NULL;
+ HKEY hKey_Tcpip_Parameters;
+ int gotString;
+ int res;
+
+ *outptr = NULL;
+
+ res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, WIN_NS_NT_KEY, 0, KEY_READ,
+ &hKey_Tcpip_Parameters);
+ if (res != ERROR_SUCCESS)
+ return 0;
+
+ /*
+ ** Global DNS settings override adapter specific parameters when both
+ ** are set. Additionally static DNS settings override DHCP-configured
+ ** parameters when both are set.
+ */
+
+ /* Global DNS static parameters */
+ gotString = get_REG_SZ(hKey_Tcpip_Parameters, NAMESERVER, outptr);
+ if (gotString)
+ goto done;
+
+ /* Global DNS DHCP-configured parameters */
+ gotString = get_REG_SZ(hKey_Tcpip_Parameters, DHCPNAMESERVER, outptr);
+ if (gotString)
+ goto done;
+
+ /* Try adapter specific parameters */
+ res = RegOpenKeyExA(hKey_Tcpip_Parameters, "Interfaces", 0,
+ KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS,
+ &hKey_Interfaces);
+ if (res != ERROR_SUCCESS)
+ {
+ hKey_Interfaces = NULL;
+ goto done;
+ }
+
+ /* Adapter specific DNS static parameters */
+ gotString = get_enum_REG_SZ(hKey_Interfaces, NAMESERVER, outptr);
+ if (gotString)
+ goto done;
+
+ /* Adapter specific DNS DHCP-configured parameters */
+ gotString = get_enum_REG_SZ(hKey_Interfaces, DHCPNAMESERVER, outptr);
+
+done:
+ if (hKey_Interfaces)
+ RegCloseKey(hKey_Interfaces);
+
+ RegCloseKey(hKey_Tcpip_Parameters);
+
+ if (!gotString || !*outptr)
+ return 0;
+
+ return 1;
+}
+
+/*
+ * get_DNS_Registry()
+ *
+ * Locates DNS info in the registry. 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.
+ */
+static int get_DNS_Registry(char **outptr)
+{
+ win_platform platform;
+ int gotString = 0;
+
+ *outptr = NULL;
+
+ platform = ares__getplatform();
+
+ if (platform == WIN_NT)
+ gotString = get_DNS_Registry_NT(outptr);
+ else if (platform == WIN_9X)
+ gotString = get_DNS_Registry_9X(outptr);
+
+ if (!gotString)
+ return 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));
+}
+
+/*
+ * get_DNS_NetworkParams()
+ *
+ * Locates DNS info using GetNetworkParams() 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 98 and newer.
+ *
+ * Note: Ancient PSDK required in order to build a W98 target.
+ */
+static int get_DNS_NetworkParams(char **outptr)
+{
+ FIXED_INFO *fi, *newfi;
+ struct ares_addr namesrvr;
+ char *txtaddr;
+ IP_ADDR_STRING *ipAddr;
+ int res;
+ DWORD size = sizeof (*fi);
+
+ *outptr = NULL;
+
+ /* Verify run-time availability of GetNetworkParams() */
+ if (ares_fpGetNetworkParams == ZERO_NULL)
+ return 0;
+
+ fi = ares_malloc(size);
+ if (!fi)
+ return 0;
+
+ res = (*ares_fpGetNetworkParams) (fi, &size);
+ if ((res != ERROR_BUFFER_OVERFLOW) && (res != ERROR_SUCCESS))
+ goto done;
+
+ newfi = ares_realloc(fi, size);
+ if (!newfi)
+ goto done;
+
+ fi = newfi;
+ res = (*ares_fpGetNetworkParams) (fi, &size);
+ if (res != ERROR_SUCCESS)
+ goto done;
+
+ for (ipAddr = &fi->DnsServerList; ipAddr; ipAddr = ipAddr->Next)
+ {
+ txtaddr = &ipAddr->IpAddress.String[0];
+
+ /* Validate converting textual address to binary format. */
+ if (ares_inet_pton(AF_INET, txtaddr, &namesrvr.addrV4) == 1)
+ {
+ if ((namesrvr.addrV4.S_un.S_addr == INADDR_ANY) ||
+ (namesrvr.addrV4.S_un.S_addr == INADDR_NONE))
+ continue;
+ }
+ else if (ares_inet_pton(AF_INET6, txtaddr, &namesrvr.addrV6) == 1)
+ {
+ if (memcmp(&namesrvr.addrV6, &ares_in6addr_any,
+ sizeof(namesrvr.addrV6)) == 0)
+ continue;
+ }
+ else
+ continue;
+
+ commajoin(outptr, txtaddr);
+
+ if (!*outptr)
+ break;
+ }
+
+done:
+ if (fi)
+ ares_free(fi);
+
+ if (!*outptr)
+ return 0;
+
+ return 1;
+}
+
+static BOOL ares_IsWindowsVistaOrGreater(void)
+{
+ OSVERSIONINFO vinfo;
+ memset(&vinfo, 0, sizeof(vinfo));
+ vinfo.dwOSVersionInfoSize = sizeof(vinfo);
+#ifdef _MSC_VER
+#pragma warning(push)
+#pragma warning(disable:4996) /* warning C4996: 'GetVersionExW': was declared deprecated */
+#endif
+ if (!GetVersionEx(&vinfo) || vinfo.dwMajorVersion < 6)
+ return FALSE;
+ return TRUE;
+#ifdef _MSC_VER
+#pragma warning(pop)
+#endif
+}
+
+/* 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. */
+ MIB_IPFORWARD_ROW2 row;
+ SOCKADDR_INET ignored;
+ if(!ares_fpGetBestRoute2 ||
+ ares_fpGetBestRoute2(/* 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;
+}
+
+/*
+ * get_DNS_AdaptersAddresses()
+ *
+ * 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_AdaptersAddresses(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;
+
+ /* Verify run-time availability of GetAdaptersAddresses() */
+ if (ares_fpGetAdaptersAddresses == ZERO_NULL)
+ return 0;
+
+ 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 = (*ares_fpGetAdaptersAddresses) (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 = (*ares_fpGetAdaptersAddresses) (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;
+ }
+
+ /* Vista required for Luid or Ipv4Metric */
+ if (ares_IsWindowsVistaOrGreater())
+ {
+ /* Save the address as the next element in addresses. */
+ addresses[addressesIndex].metric =
+ getBestRouteMetric(&ipaaEntry->Luid,
+ (SOCKADDR_INET*)(namesrvr.sa),
+ ipaaEntry->Ipv4Metric);
+ }
+ else
+ {
+ addresses[addressesIndex].metric = (ULONG)-1;
+ }
+
+ /* 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;
+ }
+
+ /* Vista required for Luid or Ipv4Metric */
+ if (ares_IsWindowsVistaOrGreater())
+ {
+ /* Save the address as the next element in addresses. */
+ addresses[addressesIndex].metric =
+ getBestRouteMetric(&ipaaEntry->Luid,
+ (SOCKADDR_INET*)(namesrvr.sa),
+ ipaaEntry->Ipv6Metric);
+ }
+ else
+ {
+ addresses[addressesIndex].metric = (ULONG)-1;
+ }
+
+ /* 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_DNS_Windows()
+ *
+ * Locates DNS info from Windows employing most suitable methods available at
+ * run-time no matter which Windows version it is. When located, this returns
+ * a pointer in *outptr to a newly allocated memory area holding a string with
+ * a space or comma seperated list of DNS IP addresses, null-terminated.
+ *
+ * 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 95 and newer.
+ */
+static int get_DNS_Windows(char **outptr)
+{
+ /* Try using IP helper API GetAdaptersAddresses(). IPv4 + IPv6, also sorts
+ * DNS servers by interface route metrics to try to use the best DNS server. */
+ if (get_DNS_AdaptersAddresses(outptr))
+ return 1;
+
+ /* Try using IP helper API GetNetworkParams(). IPv4 only. */
+ if (get_DNS_NetworkParams(outptr))
+ return 1;
+
+ /* Fall-back to registry information */
+ return get_DNS_Registry(outptr);
+}
+
+/*
+ * 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(__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);
+ for (int 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++;
+
+ channel->domains = ares_malloc(entries * sizeof(char *));
+ if (!channel->domains) {
+ status = ARES_ENOMEM;
+ } else {
+ channel->ndomains = entries;
+ for (int 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;
+
+ 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(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++;
+ 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++;
+ 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, ", ", 1, &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, "timeout:");
+ if (val && channel->timeout == -1)
+ channel->timeout = aresx_sltosi(strtol(val, NULL, 10)) * 1000;
+ val = try_option(p, q, "maxtimeout:");
+ if (val && channel->maxtimeout == -1)
+ channel->maxtimeout = aresx_sltosi(strtol(val, NULL, 10)) * 1000;
+ val = try_option(p, q, "retry:");
+ if (val && channel->tries == -1)
+ channel->tries = aresx_sltosi(strtol(val, NULL, 10));
+ val = try_option(p, q, "attempts:");
+ 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;
+ val = try_option(p, q, "jitter:");
+ if (val && channel->jitter == -1)
+ channel->jitter = aresx_sltosi(strtol(val, NULL, 10));
+ 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;
+}
+
+/* initialize an rc4 key. If possible a cryptographically secure random key
+ is generated using a suitable function (for example win32's RtlGenRandom as
+ described in
+ http://blogs.msdn.com/michael_howard/archive/2005/01/14/353379.aspx
+ otherwise the code defaults to cross-platform albeit less secure mechanism
+ using rand
+*/
+static void randomize_key(unsigned char* key,int key_data_len)
+{
+ int randomized = 0;
+ int counter=0;
+#ifdef WIN32
+ BOOLEAN res;
+ if (ares_fpSystemFunction036)
+ {
+ res = (*ares_fpSystemFunction036) (key, key_data_len);
+ if (res)
+ randomized = 1;
+ }
+#else /* !WIN32 */
+#ifdef RANDOM_FILE
+ FILE *f = fopen(RANDOM_FILE, "rb");
+ if(f) {
+ counter = aresx_uztosi(fread(key, 1, key_data_len, f));
+ fclose(f);
+ }
+#endif
+#endif /* WIN32 */
+
+ if (!randomized) {
+ for (;counter<key_data_len;counter++)
+ key[counter]=(unsigned char)(rand() % 256); /* LCOV_EXCL_LINE */
+ }
+}
+
+static int init_id_key(rc4_key* key,int key_data_len)
+{
+ unsigned char index1;
+ unsigned char index2;
+ unsigned char* state;
+ short counter;
+ unsigned char *key_data_ptr = 0;
+
+ key_data_ptr = ares_malloc(key_data_len);
+ if (!key_data_ptr)
+ return ARES_ENOMEM;
+ memset(key_data_ptr, 0, key_data_len);
+
+ state = &key->state[0];
+ for(counter = 0; counter < 256; counter++)
+ /* unnecessary AND but it keeps some compilers happier */
+ state[counter] = (unsigned char)(counter & 0xff);
+ randomize_key(key->state,key_data_len);
+ key->x = 0;
+ key->y = 0;
+ index1 = 0;
+ index2 = 0;
+ for(counter = 0; counter < 256; counter++)
+ {
+ index2 = (unsigned char)((key_data_ptr[index1] + state[counter] +
+ index2) % 256);
+ ARES_SWAP_BYTE(&state[counter], &state[index2]);
+
+ index1 = (unsigned char)((index1 + 1) % key_data_len);
+ }
+ ares_free(key_data_ptr);
+ return ARES_SUCCESS;
+}
+
+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/contrib/libs/c-ares/ares_iphlpapi.h b/contrib/libs/c-ares/ares_iphlpapi.h
new file mode 100644
index 0000000000..343aee3ffb
--- /dev/null
+++ b/contrib/libs/c-ares/ares_iphlpapi.h
@@ -0,0 +1,221 @@
+#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/contrib/libs/c-ares/ares_ipv6.h b/contrib/libs/c-ares/ares_ipv6.h
new file mode 100644
index 0000000000..fdbc21fe8f
--- /dev/null
+++ b/contrib/libs/c-ares/ares_ipv6.h
@@ -0,0 +1,85 @@
+
+/* 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/contrib/libs/c-ares/ares_library_init.c b/contrib/libs/c-ares/ares_library_init.c
new file mode 100644
index 0000000000..3c7ad37200
--- /dev/null
+++ b/contrib/libs/c-ares/ares_library_init.c
@@ -0,0 +1,201 @@
+
+/* 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_library_init.h"
+#include "ares_private.h"
+
+#include "atomic.h"
+
+/* library-private global and unique instance vars */
+
+#ifdef USE_WINSOCK
+fpGetNetworkParams_t ares_fpGetNetworkParams = ZERO_NULL;
+fpSystemFunction036_t ares_fpSystemFunction036 = ZERO_NULL;
+fpGetAdaptersAddresses_t ares_fpGetAdaptersAddresses = ZERO_NULL;
+fpGetBestRoute2_t ares_fpGetBestRoute2 = ZERO_NULL;
+#endif
+
+#if defined(ANDROID) || defined(__ANDROID__)
+#include "ares_android.h"
+#endif
+
+/* library-private global vars with source visibility restricted to this file */
+
+static atomic_t ares_init_lock;
+static unsigned int ares_initialized;
+static int ares_init_flags;
+
+/* library-private global vars with visibility across the whole library */
+#if defined(WIN32)
+/* We need indirections to handle Windows DLL rules. */
+static void *default_malloc(size_t size) { return malloc(size); }
+static void *default_realloc(void *p, size_t size) { return realloc(p, size); }
+static void default_free(void *p) { free(p); }
+#else
+# define default_malloc malloc
+# 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;
+
+#ifdef USE_WINSOCK
+static HMODULE hnd_iphlpapi;
+static HMODULE hnd_advapi32;
+#endif
+
+
+static int ares_win32_init(void)
+{
+#ifdef USE_WINSOCK
+
+ hnd_iphlpapi = 0;
+ hnd_iphlpapi = LoadLibraryW(L"iphlpapi.dll");
+ if (!hnd_iphlpapi)
+ return ARES_ELOADIPHLPAPI;
+
+ ares_fpGetNetworkParams = (fpGetNetworkParams_t)
+ GetProcAddress(hnd_iphlpapi, "GetNetworkParams");
+ if (!ares_fpGetNetworkParams)
+ {
+ FreeLibrary(hnd_iphlpapi);
+ return ARES_EADDRGETNETWORKPARAMS;
+ }
+
+ ares_fpGetAdaptersAddresses = (fpGetAdaptersAddresses_t)
+ GetProcAddress(hnd_iphlpapi, "GetAdaptersAddresses");
+ if (!ares_fpGetAdaptersAddresses)
+ {
+ /* This can happen on clients before WinXP, I don't
+ think it should be an error, unless we don't want to
+ support Windows 2000 anymore */
+ }
+
+ ares_fpGetBestRoute2 = (fpGetBestRoute2_t)
+ GetProcAddress(hnd_iphlpapi, "GetBestRoute2");
+ if (!ares_fpGetBestRoute2)
+ {
+ /* This can happen on clients before Vista, I don't
+ think it should be an error, unless we don't want to
+ support Windows XP anymore */
+ }
+
+ /*
+ * When advapi32.dll is unavailable or advapi32.dll has no SystemFunction036,
+ * also known as RtlGenRandom, which is the case for Windows versions prior
+ * to WinXP then c-ares uses portable rand() function. Then don't error here.
+ */
+
+ hnd_advapi32 = 0;
+ hnd_advapi32 = LoadLibraryW(L"advapi32.dll");
+ if (hnd_advapi32)
+ {
+ ares_fpSystemFunction036 = (fpSystemFunction036_t)
+ GetProcAddress(hnd_advapi32, "SystemFunction036");
+ }
+
+#endif
+ return ARES_SUCCESS;
+}
+
+
+static void ares_win32_cleanup(void)
+{
+#ifdef USE_WINSOCK
+ if (hnd_advapi32)
+ FreeLibrary(hnd_advapi32);
+ if (hnd_iphlpapi)
+ FreeLibrary(hnd_iphlpapi);
+#endif
+}
+
+
+int ares_library_init(int flags)
+{
+ int res = ARES_SUCCESS;
+
+ acquire_lock(&ares_init_lock);
+
+ ares_initialized++;
+ if (ares_initialized == 1)
+ {
+ if (flags & ARES_LIB_INIT_WIN32)
+ res = ares_win32_init();
+
+ if (res == ARES_SUCCESS)
+ ares_init_flags = flags;
+ }
+
+ release_lock(&ares_init_lock);
+
+ return res;
+}
+
+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)
+{
+ acquire_lock(&ares_init_lock);
+
+ if (ares_initialized)
+ {
+ ares_initialized--;
+ if (!ares_initialized)
+ {
+ if (ares_init_flags & ARES_LIB_INIT_WIN32)
+ ares_win32_cleanup();
+
+#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;
+ }
+ }
+
+ release_lock(&ares_init_lock);
+}
+
+
+int ares_library_initialized(void)
+{
+#ifdef USE_WINSOCK
+ if (!ares_initialized)
+ return ARES_ENOTINITIALIZED;
+#endif
+ return ARES_SUCCESS;
+}
diff --git a/contrib/libs/c-ares/ares_library_init.h b/contrib/libs/c-ares/ares_library_init.h
new file mode 100644
index 0000000000..2a2ba118b5
--- /dev/null
+++ b/contrib/libs/c-ares/ares_library_init.h
@@ -0,0 +1,43 @@
+#ifndef HEADER_CARES_LIBRARY_INIT_H
+#define HEADER_CARES_LIBRARY_INIT_H
+
+
+/* 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"
+
+#ifdef USE_WINSOCK
+
+#include <iphlpapi.h>
+#include <ares_iphlpapi.h>
+
+typedef DWORD (WINAPI *fpGetNetworkParams_t) (FIXED_INFO*, DWORD*);
+typedef BOOLEAN (APIENTRY *fpSystemFunction036_t) (void*, ULONG);
+typedef ULONG (WINAPI *fpGetAdaptersAddresses_t) ( ULONG, ULONG, void*, IP_ADAPTER_ADDRESSES*, ULONG* );
+typedef NETIO_STATUS (WINAPI *fpGetBestRoute2_t) ( NET_LUID *, NET_IFINDEX, const SOCKADDR_INET *, const SOCKADDR_INET *, ULONG, PMIB_IPFORWARD_ROW2, SOCKADDR_INET * );
+/* Forward-declaration of variables defined in ares_library_init.c */
+/* that are global and unique instances for whole c-ares library. */
+
+extern fpGetNetworkParams_t ares_fpGetNetworkParams;
+extern fpSystemFunction036_t ares_fpSystemFunction036;
+extern fpGetAdaptersAddresses_t ares_fpGetAdaptersAddresses;
+extern fpGetBestRoute2_t ares_fpGetBestRoute2;
+
+#endif /* USE_WINSOCK */
+
+#endif /* HEADER_CARES_LIBRARY_INIT_H */
+
diff --git a/contrib/libs/c-ares/ares_llist.c b/contrib/libs/c-ares/ares_llist.c
new file mode 100644
index 0000000000..36ca84c43e
--- /dev/null
+++ b/contrib/libs/c-ares/ares_llist.c
@@ -0,0 +1,63 @@
+
+/* 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/contrib/libs/c-ares/ares_llist.h b/contrib/libs/c-ares/ares_llist.h
new file mode 100644
index 0000000000..20f4d1ce42
--- /dev/null
+++ b/contrib/libs/c-ares/ares_llist.h
@@ -0,0 +1,39 @@
+#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/contrib/libs/c-ares/ares_mkquery.c b/contrib/libs/c-ares/ares_mkquery.c
new file mode 100644
index 0000000000..5aea914bd0
--- /dev/null
+++ b/contrib/libs/c-ares/ares_mkquery.c
@@ -0,0 +1,24 @@
+
+/* 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/contrib/libs/c-ares/ares_nowarn.c b/contrib/libs/c-ares/ares_nowarn.c
new file mode 100644
index 0000000000..f63d9135ec
--- /dev/null
+++ b/contrib/libs/c-ares/ares_nowarn.c
@@ -0,0 +1,260 @@
+
+/* 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 <assert.h>
+#endif
+
+#ifdef HAVE_LIMITS_H
+#include <limits.h>
+#endif
+
+#if defined(__INTEL_COMPILER) && defined(__unix__)
+
+#ifdef HAVE_NETINET_IN_H
+# include <netinet/in.h>
+#endif
+#ifdef HAVE_ARPA_INET_H
+# include <arpa/inet.h>
+#endif
+
+#endif /* __INTEL_COMPILER && __unix__ */
+
+#define BUILDING_ARES_NOWARN_C 1
+
+#include "ares_nowarn.h"
+
+#ifndef HAVE_LIMITS_H
+/* systems without <limits.h> 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/contrib/libs/c-ares/ares_nowarn.h b/contrib/libs/c-ares/ares_nowarn.h
new file mode 100644
index 0000000000..505e622098
--- /dev/null
+++ b/contrib/libs/c-ares/ares_nowarn.h
@@ -0,0 +1,61 @@
+#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/contrib/libs/c-ares/ares_options.c b/contrib/libs/c-ares/ares_options.c
new file mode 100644
index 0000000000..de49de4625
--- /dev/null
+++ b/contrib/libs/c-ares/ares_options.c
@@ -0,0 +1,406 @@
+
+/* 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 <arpa/inet.h>
+#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/contrib/libs/c-ares/ares_parse_a_reply.c b/contrib/libs/c-ares/ares_parse_a_reply.c
new file mode 100644
index 0000000000..d8a9e9b578
--- /dev/null
+++ b/contrib/libs/c-ares/ares_parse_a_reply.c
@@ -0,0 +1,214 @@
+
+/* 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 <netinet/in.h>
+#endif
+#ifdef HAVE_NETDB_H
+# include <netdb.h>
+#endif
+#ifdef HAVE_ARPA_INET_H
+# include <arpa/inet.h>
+#endif
+#ifdef HAVE_ARPA_NAMESER_H
+# include <arpa/nameser.h>
+#else
+# include "nameser.h"
+#endif
+#ifdef HAVE_ARPA_NAMESER_COMPAT_H
+# include <arpa/nameser_compat.h>
+#endif
+
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif
+
+#ifdef HAVE_LIMITS_H
+# include <limits.h>
+#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;
+ struct ares_addrinfo_node *next;
+ struct ares_addrinfo_cname *next_cname;
+ char **aliases = NULL;
+ char *question_hostname = NULL;
+ struct hostent *hostent = NULL;
+ struct in_addr *addrs = NULL;
+ int naliases = 0, naddrs = 0, alias = 0, i;
+ int cname_ttl = INT_MAX;
+ int status;
+
+ memset(&ai, 0, sizeof(ai));
+
+ status = ares__parse_into_addrinfo2(abuf, alen, &question_hostname, &ai);
+ if (status != ARES_SUCCESS)
+ {
+ ares_free(question_hostname);
+
+ if (naddrttls)
+ {
+ *naddrttls = 0;
+ }
+
+ return status;
+ }
+
+ hostent = ares_malloc(sizeof(struct hostent));
+ if (!hostent)
+ {
+ goto enomem;
+ }
+
+ next = ai.nodes;
+ while (next)
+ {
+ if (next->ai_family == AF_INET)
+ {
+ ++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;
+ }
+
+ if (naliases)
+ {
+ next_cname = ai.cnames;
+ while (next_cname)
+ {
+ if(next_cname->alias)
+ aliases[alias++] = strdup(next_cname->alias);
+ if(next_cname->ttl < cname_ttl)
+ cname_ttl = next_cname->ttl;
+ next_cname = next_cname->next;
+ }
+ }
+
+ aliases[alias] = NULL;
+
+ hostent->h_addr_list = ares_malloc((naddrs + 1) * sizeof(char *));
+ if (!hostent->h_addr_list)
+ {
+ goto enomem;
+ }
+
+ for (i = 0; i < naddrs + 1; ++i)
+ {
+ hostent->h_addr_list[i] = NULL;
+ }
+
+ if (ai.cnames)
+ {
+ hostent->h_name = strdup(ai.cnames->name);
+ ares_free(question_hostname);
+ }
+ else
+ {
+ hostent->h_name = question_hostname;
+ }
+
+ hostent->h_aliases = aliases;
+ hostent->h_addrtype = AF_INET;
+ hostent->h_length = sizeof(struct in_addr);
+
+ if (naddrs)
+ {
+ addrs = ares_malloc(naddrs * sizeof(struct in_addr));
+ if (!addrs)
+ {
+ goto enomem;
+ }
+
+ i = 0;
+ next = ai.nodes;
+ while (next)
+ {
+ if (next->ai_family == AF_INET)
+ {
+ hostent->h_addr_list[i] = (char *)&addrs[i];
+ memcpy(hostent->h_addr_list[i],
+ &(CARES_INADDR_CAST(struct sockaddr_in *, next->ai_addr)->sin_addr),
+ sizeof(struct in_addr));
+ if (naddrttls && i < *naddrttls)
+ {
+ if (next->ai_ttl > cname_ttl)
+ addrttls[i].ttl = cname_ttl;
+ else
+ addrttls[i].ttl = next->ai_ttl;
+
+ memcpy(&addrttls[i].ipaddr,
+ &(CARES_INADDR_CAST(struct sockaddr_in *, next->ai_addr)->sin_addr),
+ sizeof(struct in_addr));
+ }
+ ++i;
+ }
+ next = next->ai_next;
+ }
+ if (i == 0)
+ {
+ ares_free(addrs);
+ }
+ }
+
+ if (host)
+ {
+ *host = hostent;
+ }
+ else
+ {
+ ares_free_hostent(hostent);
+ }
+
+ if (naddrttls)
+ {
+ *naddrttls = naddrs;
+ }
+
+ ares__freeaddrinfo_cnames(ai.cnames);
+ ares__freeaddrinfo_nodes(ai.nodes);
+ return ARES_SUCCESS;
+
+enomem:
+ ares_free(aliases);
+ ares_free(hostent);
+ ares__freeaddrinfo_cnames(ai.cnames);
+ ares__freeaddrinfo_nodes(ai.nodes);
+ ares_free(question_hostname);
+ return ARES_ENOMEM;
+}
diff --git a/contrib/libs/c-ares/ares_parse_aaaa_reply.c b/contrib/libs/c-ares/ares_parse_aaaa_reply.c
new file mode 100644
index 0000000000..0d39bfa826
--- /dev/null
+++ b/contrib/libs/c-ares/ares_parse_aaaa_reply.c
@@ -0,0 +1,217 @@
+
+/* 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 <netinet/in.h>
+#endif
+#ifdef HAVE_NETDB_H
+# include <netdb.h>
+#endif
+#ifdef HAVE_ARPA_INET_H
+# include <arpa/inet.h>
+#endif
+#ifdef HAVE_ARPA_NAMESER_H
+# include <arpa/nameser.h>
+#else
+# include "nameser.h"
+#endif
+#ifdef HAVE_ARPA_NAMESER_COMPAT_H
+# include <arpa/nameser_compat.h>
+#endif
+
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif
+
+#ifdef HAVE_LIMITS_H
+# include <limits.h>
+#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;
+ struct ares_addrinfo_node *next;
+ struct ares_addrinfo_cname *next_cname;
+ char **aliases = NULL;
+ char *question_hostname = NULL;
+ struct hostent *hostent = NULL;
+ struct ares_in6_addr *addrs = NULL;
+ int naliases = 0, naddrs = 0, alias = 0, i;
+ int cname_ttl = INT_MAX;
+ int status;
+
+ memset(&ai, 0, sizeof(ai));
+
+ status = ares__parse_into_addrinfo2(abuf, alen, &question_hostname, &ai);
+ if (status != ARES_SUCCESS)
+ {
+ ares_free(question_hostname);
+
+ if (naddrttls)
+ {
+ *naddrttls = 0;
+ }
+
+ return status;
+ }
+
+ hostent = ares_malloc(sizeof(struct hostent));
+ if (!hostent)
+ {
+ goto enomem;
+ }
+
+ next = ai.nodes;
+ while (next)
+ {
+ if(next->ai_family == AF_INET6)
+ {
+ ++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;
+ }
+
+ if (naliases)
+ {
+ next_cname = ai.cnames;
+ while (next_cname)
+ {
+ if(next_cname->alias)
+ aliases[alias++] = strdup(next_cname->alias);
+ if(next_cname->ttl < cname_ttl)
+ cname_ttl = next_cname->ttl;
+ next_cname = next_cname->next;
+ }
+ }
+
+ aliases[alias] = NULL;
+
+ hostent->h_addr_list = ares_malloc((naddrs + 1) * sizeof(char *));
+ if (!hostent->h_addr_list)
+ {
+ goto enomem;
+ }
+
+ for (i = 0; i < naddrs + 1; ++i)
+ {
+ hostent->h_addr_list[i] = NULL;
+ }
+
+ if (ai.cnames)
+ {
+ hostent->h_name = strdup(ai.cnames->name);
+ ares_free(question_hostname);
+ }
+ else
+ {
+ hostent->h_name = question_hostname;
+ }
+
+ hostent->h_aliases = aliases;
+ hostent->h_addrtype = AF_INET6;
+ hostent->h_length = sizeof(struct ares_in6_addr);
+
+ if (naddrs)
+ {
+ addrs = ares_malloc(naddrs * sizeof(struct ares_in6_addr));
+ if (!addrs)
+ {
+ goto enomem;
+ }
+
+ i = 0;
+ next = ai.nodes;
+ while (next)
+ {
+ if(next->ai_family == AF_INET6)
+ {
+ hostent->h_addr_list[i] = (char*)&addrs[i];
+ memcpy(hostent->h_addr_list[i],
+ &(CARES_INADDR_CAST(struct sockaddr_in6 *, next->ai_addr)->sin6_addr),
+ sizeof(struct ares_in6_addr));
+ if (naddrttls && i < *naddrttls)
+ {
+ if(next->ai_ttl > cname_ttl)
+ addrttls[i].ttl = cname_ttl;
+ else
+ addrttls[i].ttl = next->ai_ttl;
+
+ memcpy(&addrttls[i].ip6addr,
+ &(CARES_INADDR_CAST(struct sockaddr_in6 *, next->ai_addr)->sin6_addr),
+ sizeof(struct ares_in6_addr));
+ }
+ ++i;
+ }
+ next = next->ai_next;
+ }
+
+ if (i == 0)
+ {
+ ares_free(addrs);
+ }
+ }
+
+ if (host)
+ {
+ *host = hostent;
+ }
+ else
+ {
+ ares_free_hostent(hostent);
+ }
+
+ if (naddrttls)
+ {
+ *naddrttls = naddrs;
+ }
+
+ ares__freeaddrinfo_cnames(ai.cnames);
+ ares__freeaddrinfo_nodes(ai.nodes);
+ return ARES_SUCCESS;
+
+enomem:
+ ares_free(aliases);
+ ares_free(hostent);
+ ares__freeaddrinfo_cnames(ai.cnames);
+ ares__freeaddrinfo_nodes(ai.nodes);
+ ares_free(question_hostname);
+ return ARES_ENOMEM;
+}
diff --git a/contrib/libs/c-ares/ares_parse_mx_reply.c b/contrib/libs/c-ares/ares_parse_mx_reply.c
new file mode 100644
index 0000000000..8d1703020c
--- /dev/null
+++ b/contrib/libs/c-ares/ares_parse_mx_reply.c
@@ -0,0 +1,172 @@
+
+/* Copyright 1998 by the Massachusetts Institute of Technology.
+ * Copyright (C) 2010 Jeremy Lal <kapouer@melix.org>
+ *
+ * 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 <netinet/in.h>
+#endif
+#ifdef HAVE_NETDB_H
+# include <netdb.h>
+#endif
+#ifdef HAVE_ARPA_INET_H
+# include <arpa/inet.h>
+#endif
+#ifdef HAVE_ARPA_NAMESER_H
+# include <arpa/nameser.h>
+#else
+# include "nameser.h"
+#endif
+#ifdef HAVE_ARPA_NAMESER_COMPAT_H
+# include <arpa/nameser_compat.h>
+#endif
+
+#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, rr_ttl;
+ 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);
+ rr_ttl = DNS_RR_TTL (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);
+ mx_curr->ttl = rr_ttl;
+ 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/contrib/libs/c-ares/ares_parse_naptr_reply.c b/contrib/libs/c-ares/ares_parse_naptr_reply.c
new file mode 100644
index 0000000000..04abc3c7ee
--- /dev/null
+++ b/contrib/libs/c-ares/ares_parse_naptr_reply.c
@@ -0,0 +1,196 @@
+
+/* Copyright 1998 by the Massachusetts Institute of Technology.
+ * Copyright (C) 2009 by Jakub Hrozek <jhrozek@redhat.com>
+ *
+ * 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 <netinet/in.h>
+#endif
+#ifdef HAVE_NETDB_H
+# include <netdb.h>
+#endif
+#ifdef HAVE_ARPA_INET_H
+# include <arpa/inet.h>
+#endif
+#ifdef HAVE_ARPA_NAMESER_H
+# include <arpa/nameser.h>
+#else
+# include "nameser.h"
+#endif
+#ifdef HAVE_ARPA_NAMESER_COMPAT_H
+# include <arpa/nameser_compat.h>
+#endif
+
+#include "ares.h"
+#include "ares_dns.h"
+#include "ares_data.h"
+#include "ares_private.h"
+
+/* AIX portability check */
+#ifndef T_NAPTR
+ #define T_NAPTR 35 /* naming authority pointer */
+#endif
+
+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, rr_ttl;
+ 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);
+ rr_ttl = DNS_RR_TTL (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;
+
+ naptr_curr->ttl = rr_ttl;
+ 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/contrib/libs/c-ares/ares_parse_ns_reply.c b/contrib/libs/c-ares/ares_parse_ns_reply.c
new file mode 100644
index 0000000000..7bb51429db
--- /dev/null
+++ b/contrib/libs/c-ares/ares_parse_ns_reply.c
@@ -0,0 +1,183 @@
+/* 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 <vlad.dinulescu@avira.com>
+ * on behalf of AVIRA Gmbh - http://www.avira.com
+ */
+
+#include "ares_setup.h"
+
+#ifdef HAVE_NETINET_IN_H
+# include <netinet/in.h>
+#endif
+#ifdef HAVE_NETDB_H
+# include <netdb.h>
+#endif
+#ifdef HAVE_ARPA_INET_H
+# include <arpa/inet.h>
+#endif
+#ifdef HAVE_ARPA_NAMESER_H
+# include <arpa/nameser.h>
+#else
+# include "nameser.h"
+#endif
+#ifdef HAVE_ARPA_NAMESER_COMPAT_H
+# include <arpa/nameser_compat.h>
+#endif
+
+#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);
+ 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 );
+ 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);
+ 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/contrib/libs/c-ares/ares_parse_ptr_reply.c b/contrib/libs/c-ares/ares_parse_ptr_reply.c
new file mode 100644
index 0000000000..0e2b064bb4
--- /dev/null
+++ b/contrib/libs/c-ares/ares_parse_ptr_reply.c
@@ -0,0 +1,236 @@
+
+/* 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 <netinet/in.h>
+#endif
+#ifdef HAVE_NETDB_H
+# include <netdb.h>
+#endif
+#ifdef HAVE_ARPA_NAMESER_H
+# include <arpa/nameser.h>
+#else
+# include "nameser.h"
+#endif
+#ifdef HAVE_ARPA_NAMESER_COMPAT_H
+# include <arpa/nameser_compat.h>
+#endif
+
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif
+
+#ifdef HAVE_LIMITS_H
+# include <limits.h>
+#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,
+ int *hostttl)
+{
+ unsigned int qdcount, ancount;
+ int status, i, rr_type, rr_class, rr_len, rr_ttl;
+ long len;
+ const unsigned char *aptr;
+ char *ptrname, *hostname, *rr_name, *rr_data;
+ struct hostent *hostent;
+ int aliascnt = 0;
+ int alias_alloc = 8;
+ char ** aliases;
+ size_t rr_data_len;
+
+ /* Set *host to NULL for all failure cases. */
+ *host = NULL;
+ if (hostttl)
+ *hostttl = INT_MAX;
+
+ /* 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);
+ 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);
+ 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);
+ rr_ttl = DNS_RR_TTL(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);
+ 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 (hostttl)
+ {
+ if (*hostttl > rr_ttl)
+ {
+ *hostttl = rr_ttl;
+ }
+ }
+ }
+
+ 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);
+ 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)
+ {
+ /* We got our answer. Allocate memory to build the host entry. */
+ hostent = ares_malloc(sizeof(struct hostent));
+ if (hostent)
+ {
+ hostent->h_addr_list = ares_malloc(2 * sizeof(char *));
+ if (hostent->h_addr_list)
+ {
+ hostent->h_addr_list[0] = ares_malloc(addrlen);
+ if (hostent->h_addr_list[0])
+ {
+ hostent->h_aliases = ares_malloc((aliascnt+1) * sizeof (char *));
+ if (hostent->h_aliases)
+ {
+ /* Fill in the hostent and return successfully. */
+ hostent->h_name = hostname;
+ for (i=0 ; i<aliascnt ; i++)
+ hostent->h_aliases[i] = aliases[i];
+ hostent->h_aliases[aliascnt] = NULL;
+ hostent->h_addrtype = aresx_sitoss(family);
+ hostent->h_length = aresx_sitoss(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;
+ }
+ ares_free(hostent->h_addr_list[0]);
+ }
+ ares_free(hostent->h_addr_list);
+ }
+ ares_free(hostent);
+ }
+ status = ARES_ENOMEM;
+ }
+ for (i=0 ; i<aliascnt ; i++)
+ if (aliases[i])
+ ares_free(aliases[i]);
+ ares_free(aliases);
+ if (hostname)
+ ares_free(hostname);
+ ares_free(ptrname);
+ return status;
+}
diff --git a/contrib/libs/c-ares/ares_parse_soa_reply.c b/contrib/libs/c-ares/ares_parse_soa_reply.c
new file mode 100644
index 0000000000..8b84a368db
--- /dev/null
+++ b/contrib/libs/c-ares/ares_parse_soa_reply.c
@@ -0,0 +1,185 @@
+
+/* Copyright 1998 by the Massachusetts Institute of Technology.
+ * Copyright (C) 2012 Marko Kreen <markokr@gmail.com>
+ *
+ * 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 <netinet/in.h>
+#endif
+#ifdef HAVE_NETDB_H
+# include <netdb.h>
+#endif
+#ifdef HAVE_ARPA_INET_H
+# include <arpa/inet.h>
+#endif
+#ifdef HAVE_ARPA_NAMESER_H
+# include <arpa/nameser.h>
+#else
+# include "nameser.h"
+#endif
+#ifdef HAVE_ARPA_NAMESER_COMPAT_H
+# include <arpa/nameser_compat.h>
+#endif
+
+#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;
+ int ttl;
+
+ 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);
+ if (status != ARES_SUCCESS)
+ goto failed_stat;
+ 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);
+ 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 );
+ ttl = DNS_RR_TTL(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);
+ 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);
+ 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);
+ soa->ttl = ttl;
+
+ 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/contrib/libs/c-ares/ares_parse_srv_reply.c b/contrib/libs/c-ares/ares_parse_srv_reply.c
new file mode 100644
index 0000000000..72a2dd4e96
--- /dev/null
+++ b/contrib/libs/c-ares/ares_parse_srv_reply.c
@@ -0,0 +1,181 @@
+
+/* Copyright 1998 by the Massachusetts Institute of Technology.
+ * Copyright (C) 2009 by Jakub Hrozek <jhrozek@redhat.com>
+ *
+ * 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 <netinet/in.h>
+#endif
+#ifdef HAVE_NETDB_H
+# include <netdb.h>
+#endif
+#ifdef HAVE_ARPA_INET_H
+# include <arpa/inet.h>
+#endif
+#ifdef HAVE_ARPA_NAMESER_H
+# include <arpa/nameser.h>
+#else
+# include "nameser.h"
+#endif
+#ifdef HAVE_ARPA_NAMESER_COMPAT_H
+# include <arpa/nameser_compat.h>
+#endif
+
+#include "ares.h"
+#include "ares_dns.h"
+#include "ares_data.h"
+#include "ares_private.h"
+
+/* AIX portability check */
+#ifndef T_SRV
+# define T_SRV 33 /* server selection */
+#endif
+
+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, rr_ttl;
+ 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);
+ rr_ttl = DNS_RR_TTL(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);
+ srv_curr->ttl = rr_ttl;
+
+ 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/contrib/libs/c-ares/ares_parse_txt_reply.c b/contrib/libs/c-ares/ares_parse_txt_reply.c
new file mode 100644
index 0000000000..c685dfd052
--- /dev/null
+++ b/contrib/libs/c-ares/ares_parse_txt_reply.c
@@ -0,0 +1,222 @@
+
+/* Copyright 1998 by the Massachusetts Institute of Technology.
+ * Copyright (C) 2009 by Jakub Hrozek <jhrozek@redhat.com>
+ *
+ * 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 <netinet/in.h>
+#endif
+#ifdef HAVE_NETDB_H
+# include <netdb.h>
+#endif
+#ifdef HAVE_ARPA_INET_H
+# include <arpa/inet.h>
+#endif
+#ifdef HAVE_ARPA_NAMESER_H
+# include <arpa/nameser.h>
+#else
+# include "nameser.h"
+#endif
+#ifdef HAVE_ARPA_NAMESER_COMPAT_H
+# include <arpa/nameser_compat.h>
+#endif
+
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#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, rr_ttl;
+ 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);
+ rr_ttl = DNS_RR_TTL (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;
+ txt_curr->ttl = rr_ttl;
+
+ 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/contrib/libs/c-ares/ares_platform.c b/contrib/libs/c-ares/ares_platform.c
new file mode 100644
index 0000000000..6c749dccb2
--- /dev/null
+++ b/contrib/libs/c-ares/ares_platform.c
@@ -0,0 +1,11042 @@
+
+
+/* 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/contrib/libs/c-ares/ares_platform.h b/contrib/libs/c-ares/ares_platform.h
new file mode 100644
index 0000000000..e6885ae546
--- /dev/null
+++ b/contrib/libs/c-ares/ares_platform.h
@@ -0,0 +1,43 @@
+#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/contrib/libs/c-ares/ares_private.h b/contrib/libs/c-ares/ares_private.h
new file mode 100644
index 0000000000..3312ed1932
--- /dev/null
+++ b/contrib/libs/c-ares/ares_private.h
@@ -0,0 +1,430 @@
+#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 <netinet/in.h>
+#endif
+
+#ifdef WATT32
+#include <tcp.h>
+#include <sys/ioctl.h>
+#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"
+
+#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"
+
+#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
+
+#define ARES_ID_KEY_LEN 31
+
+#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;
+};
+
+typedef struct rc4_key
+{
+ unsigned char state[256];
+ unsigned char x;
+ unsigned char y;
+} rc4_key;
+
+struct ares_channeldata {
+ /* Configuration data */
+ int flags;
+ int timeout; /* in milliseconds */
+ int maxtimeout; /* in milliseconds */
+ int jitter; /* in .001 */
+ unsigned int jitter_rand_state;
+ 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;
+ /* key to use when generating new ids */
+ rc4_key id_key;
+
+ /* 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;
+};
+
+/* 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);
+unsigned short ares__generate_new_id(rc4_key* key);
+struct timeval ares__tvnow(void);
+int ares__expand_name_for_response(const unsigned char *encoded,
+ const unsigned char *abuf, int alen,
+ char **s, long *enclen);
+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);
+
+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,
+ struct ares_addrinfo *ai);
+
+int ares__parse_into_addrinfo2(const unsigned char *abuf,
+ int alen,
+ char **question_hostname,
+ 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
+
+#ifdef CURLDEBUG
+/* This is low-level hard-hacking memory leak tracking and similar. Using the
+ libcurl lowlevel code from within library is ugly and only works when
+ c-ares is built and linked with a similarly curldebug-enabled libcurl,
+ but we do this anyway for convenience. */
+#define HEADER_CURL_SETUP_ONCE_H
+#include "../lib/memdebug.h"
+#endif
+
+#endif /* __ARES_PRIVATE_H */
diff --git a/contrib/libs/c-ares/ares_process.c b/contrib/libs/c-ares/ares_process.c
new file mode 100644
index 0000000000..25095d0f05
--- /dev/null
+++ b/contrib/libs/c-ares/ares_process.c
@@ -0,0 +1,1496 @@
+
+/* 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 <sys/uio.h>
+#endif
+#ifdef HAVE_NETINET_IN_H
+# include <netinet/in.h>
+#endif
+#ifdef HAVE_NETINET_TCP_H
+# include <netinet/tcp.h>
+#endif
+#ifdef HAVE_NETDB_H
+# include <netdb.h>
+#endif
+#ifdef HAVE_ARPA_INET_H
+# include <arpa/inet.h>
+#endif
+#ifdef HAVE_ARPA_NAMESER_H
+# include <arpa/nameser.h>
+#else
+# include "nameser.h"
+#endif
+#ifdef HAVE_ARPA_NAMESER_COMPAT_H
+# include <arpa/nameser_compat.h>
+#endif
+
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#ifdef HAVE_SYS_IOCTL_H
+# include <sys/ioctl.h>
+#endif
+#ifdef NETWARE
+# include <sys/filio.h>
+#endif
+
+#include <assert.h>
+#include <fcntl.h>
+#include <limits.h>
+
+#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 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;
+
+ 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++;
+ }
+ 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 count;
+ 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)
+ count = 0;
+
+ else {
+ if (server->addr.family == AF_INET)
+ fromlen = sizeof(from.sa4);
+ else
+ fromlen = sizeof(from.sa6);
+ count = socket_recvfrom(channel, server->udp_socket, (void *)buf,
+ sizeof(buf), 0, &from.sa, &fromlen);
+ }
+
+ if (count == -1 && try_again(SOCKERRNO))
+ continue;
+ else if (count <= 0)
+ 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. */
+ break;
+#endif
+ else
+ process_answer(channel, buf, (int)count, i, 0, now);
+ } while (count > 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 one of these RCODES, 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 == NOTIMP || rcode == FORMERR || rcode == SERVFAIL)
+ {
+ 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;
+ }
+ }
+
+ if (channel->maxtimeout != -1 && timeplus > channel->maxtimeout)
+ timeplus = channel->maxtimeout;
+
+ if (channel->jitter != -1)
+ {
+ int r;
+ #ifdef WIN32
+ /* Windows does not have rand_r function, so we use regular rand().
+ * It is thread-unsafe, but it is better than nothing.
+ */
+ r = rand();
+ #else
+ r = rand_r(&channel->jitter_rand_state);
+ #endif
+ long long delta = (long long)(r - (RAND_MAX >> 1)) * timeplus * channel->jitter;
+ delta /= RAND_MAX;
+ /* Recall that jitter is expressed in .001 */
+ delta /= 1000;
+ timeplus += delta;
+ }
+
+ 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
+}
+
+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;
+ }
+ }
+
+ 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 */
+}
+
+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/contrib/libs/c-ares/ares_query.c b/contrib/libs/c-ares/ares_query.c
new file mode 100644
index 0000000000..b38b8a6c22
--- /dev/null
+++ b/contrib/libs/c-ares/ares_query.c
@@ -0,0 +1,186 @@
+
+/* 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 <netinet/in.h>
+#endif
+#ifdef HAVE_ARPA_NAMESER_H
+# include <arpa/nameser.h>
+#else
+# include "nameser.h"
+#endif
+#ifdef HAVE_ARPA_NAMESER_COMPAT_H
+# include <arpa/nameser_compat.h>
+#endif
+
+#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 void rc4(rc4_key* key, unsigned char *buffer_ptr, int buffer_len)
+{
+ unsigned char x;
+ unsigned char y;
+ unsigned char* state;
+ unsigned char xorIndex;
+ short counter;
+
+ x = key->x;
+ y = key->y;
+
+ state = &key->state[0];
+ for(counter = 0; counter < buffer_len; counter ++)
+ {
+ x = (unsigned char)((x + 1) % 256);
+ y = (unsigned char)((state[x] + y) % 256);
+ ARES_SWAP_BYTE(&state[x], &state[y]);
+
+ xorIndex = (unsigned char)((state[x] + state[y]) % 256);
+
+ buffer_ptr[counter] = (unsigned char)(buffer_ptr[counter]^state[xorIndex]);
+ }
+ key->x = x;
+ key->y = y;
+}
+
+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->id_key);
+ } while (find_query_by_id(channel, id));
+
+ return (unsigned short)id;
+}
+
+unsigned short ares__generate_new_id(rc4_key* key)
+{
+ unsigned short r=0;
+ rc4(key, (unsigned char *)&r, sizeof(r));
+ return r;
+}
+
+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/contrib/libs/c-ares/ares_rules.h b/contrib/libs/c-ares/ares_rules.h
new file mode 100644
index 0000000000..cac23cf2e3
--- /dev/null
+++ b/contrib/libs/c-ares/ares_rules.h
@@ -0,0 +1,125 @@
+#ifndef __CARES_RULES_H
+#define __CARES_RULES_H
+
+
+/* Copyright (C) 2009 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.
+ */
+
+/* ================================================================ */
+/* COMPILE TIME SANITY CHECKS */
+/* ================================================================ */
+
+/*
+ * NOTE 1:
+ * -------
+ *
+ * All checks done in this file are intentionally placed in a public
+ * header file which is pulled by ares.h when an application is
+ * being built using an already built c-ares library. Additionally
+ * this file is also included and used when building the library.
+ *
+ * If compilation fails on this file it is certainly sure that the
+ * problem is elsewhere. It could be a problem in the ares_build.h
+ * header file, or simply that you are using different compilation
+ * settings than those used to build the library.
+ *
+ * Nothing in this file is intended to be modified or adjusted by the
+ * c-ares library user nor by the c-ares library builder.
+ *
+ * Do not deactivate any check, these are done to make sure that the
+ * library is properly built and used.
+ *
+ * You can find further help on the c-ares development mailing list:
+ * http://cool.haxx.se/mailman/listinfo/c-ares/
+ *
+ * NOTE 2
+ * ------
+ *
+ * Some of the following compile time checks are based on the fact
+ * that the dimension of a constant array can not be a negative one.
+ * In this way if the compile time verification fails, the compilation
+ * will fail issuing an error. The error description wording is compiler
+ * dependent but it will be quite similar to one of the following:
+ *
+ * "negative subscript or subscript is too large"
+ * "array must have at least one element"
+ * "-1 is an illegal array size"
+ * "size of array is negative"
+ *
+ * If you are building an application which tries to use an already
+ * built c-ares library and you are getting this kind of errors on
+ * this file, it is a clear indication that there is a mismatch between
+ * how the library was built and how you are trying to use it for your
+ * application. Your already compiled or binary library provider is the
+ * only one who can give you the details you need to properly use it.
+ */
+
+/*
+ * Verify that some macros are actually defined.
+ */
+
+#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
+#endif
+
+/*
+ * Macros private to this header file.
+ */
+
+#define CareschkszEQ(t, s) sizeof(t) == s ? 1 : -1
+
+#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.
+ */
+
+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
+ * by sizeof() is greater or equal than the one reported for int for
+ * the current compilation.
+ */
+
+typedef char
+ __cares_rule_03__
+ [CareschkszGE(ares_socklen_t, int)];
+
+/* ================================================================ */
+/* EXTERNALLY AND INTERNALLY VISIBLE DEFINITIONS */
+/* ================================================================ */
+
+/*
+ * Get rid of macros private to this header file.
+ */
+
+#undef CareschkszEQ
+#undef CareschkszGE
+
+/*
+ * Get rid of macros not intended to exist beyond this point.
+ */
+
+#undef CARES_PULL_WS2TCPIP_H
+#undef CARES_PULL_SYS_TYPES_H
+#undef CARES_PULL_SYS_SOCKET_H
+
+#undef CARES_TYPEOF_ARES_SOCKLEN_T
+
+#endif /* __CARES_RULES_H */
diff --git a/contrib/libs/c-ares/ares_search.c b/contrib/libs/c-ares/ares_search.c
new file mode 100644
index 0000000000..c4b0424f5b
--- /dev/null
+++ b/contrib/libs/c-ares/ares_search.c
@@ -0,0 +1,321 @@
+
+/* 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 <strings.h>
+#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/contrib/libs/c-ares/ares_send.c b/contrib/libs/c-ares/ares_send.c
new file mode 100644
index 0000000000..f4f1f95119
--- /dev/null
+++ b/contrib/libs/c-ares/ares_send.c
@@ -0,0 +1,137 @@
+
+/* 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 <netinet/in.h>
+#endif
+#ifdef HAVE_ARPA_NAMESER_H
+# include <arpa/nameser.h>
+#else
+# include "nameser.h"
+#endif
+#ifdef HAVE_ARPA_NAMESER_COMPAT_H
+# include <arpa/nameser_compat.h>
+#endif
+
+#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;
+ }
+
+ /* 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;
+ }
+ if (channel->nservers < 1)
+ {
+ ares_free(query);
+ callback(arg, ARES_ESERVFAIL, 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/contrib/libs/c-ares/ares_setup.h b/contrib/libs/c-ares/ares_setup.h
new file mode 100644
index 0000000000..b9a1fd5b52
--- /dev/null
+++ b/contrib/libs/c-ares/ares_setup.h
@@ -0,0 +1,217 @@
+#ifndef HEADER_CARES_SETUP_H
+#define HEADER_CARES_SETUP_H
+
+
+/* Copyright (C) 2004 - 2012 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.
+ */
+
+/*
+ * Define WIN32 when build target is Win32 API
+ */
+
+#if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32)
+#define WIN32
+#endif
+
+/*
+ * Include configuration script results or hand-crafted
+ * configuration file for platforms which lack config tool.
+ */
+
+#if defined(HAVE_CONFIG_H) && !defined(_MSC_VER)
+#include "ares_config.h"
+#else
+
+#ifdef WIN32
+#include "config-win32.h"
+#endif
+
+#endif /* HAVE_CONFIG_H */
+
+/* ================================================================ */
+/* Definition of preprocessor macros/symbols which modify compiler */
+/* behaviour or generated code characteristics must be done here, */
+/* as appropriate, before any system header file is included. It is */
+/* also possible to have them defined in the config file included */
+/* before this point. As a result of all this we frown inclusion of */
+/* system header files in our config files, avoid this at any cost. */
+/* ================================================================ */
+
+/*
+ * AIX 4.3 and newer needs _THREAD_SAFE defined to build
+ * proper reentrant code. Others may also need it.
+ */
+
+#ifdef NEED_THREAD_SAFE
+# ifndef _THREAD_SAFE
+# define _THREAD_SAFE
+# endif
+#endif
+
+/*
+ * Tru64 needs _REENTRANT set for a few function prototypes and
+ * things to appear in the system header files. Unixware needs it
+ * to build proper reentrant code. Others may also need it.
+ */
+
+#ifdef NEED_REENTRANT
+# ifndef _REENTRANT
+# define _REENTRANT
+# endif
+#endif
+
+/* ================================================================ */
+/* If you need to include a system header file for your platform, */
+/* please, do it beyond the point further indicated in this file. */
+/* ================================================================ */
+
+/*
+ * c-ares external interface definitions are also used internally,
+ * and might also include required system header files to define them.
+ */
+
+#include <ares_build.h>
+
+/*
+ * Compile time sanity checks must also be done when building the library.
+ */
+
+#include <ares_rules.h>
+
+/* ================================================================= */
+/* No system header file shall be included in this file before this */
+/* point. The only allowed ones are those included from ares_build.h */
+/* ================================================================= */
+
+/*
+ * Include header files for windows builds before redefining anything.
+ * Use this preproessor block only to include or exclude windows.h,
+ * winsock2.h, ws2tcpip.h or winsock.h. Any other windows thing belongs
+ * to any other further and independent block. Under Cygwin things work
+ * just as under linux (e.g. <sys/socket.h>) and the winsock headers should
+ * never be included when __CYGWIN__ is defined. configure script takes
+ * care of this, not defining HAVE_WINDOWS_H, HAVE_WINSOCK_H, HAVE_WINSOCK2_H,
+ * neither HAVE_WS2TCPIP_H when __CYGWIN__ is defined.
+ */
+
+#ifdef HAVE_WINDOWS_H
+# ifndef WIN32_LEAN_AND_MEAN
+# define WIN32_LEAN_AND_MEAN
+# endif
+# include <windows.h>
+# ifdef HAVE_WINSOCK2_H
+# include <winsock2.h>
+# ifdef HAVE_WS2TCPIP_H
+# include <ws2tcpip.h>
+# endif
+# else
+# ifdef HAVE_WINSOCK_H
+# include <winsock.h>
+# endif
+# endif
+#endif
+
+/*
+ * Define USE_WINSOCK to 2 if we have and use WINSOCK2 API, else
+ * define USE_WINSOCK to 1 if we have and use WINSOCK API, else
+ * undefine USE_WINSOCK.
+ */
+
+#undef USE_WINSOCK
+
+#ifdef HAVE_WINSOCK2_H
+# define USE_WINSOCK 2
+#else
+# ifdef HAVE_WINSOCK_H
+# define USE_WINSOCK 1
+# endif
+#endif
+
+/*
+ * Work-arounds for systems without configure support
+ */
+
+#ifndef HAVE_CONFIG_H
+
+#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_SYS_UIO_H) && !defined(WIN32) && !defined(MSDOS)
+#define HAVE_SYS_UIO_H
+#endif
+
+#endif /* HAVE_CONFIG_H */
+
+/*
+ * Arg 2 type for gethostname in case it hasn't been defined in config file.
+ */
+
+#ifndef GETHOSTNAME_TYPE_ARG2
+# ifdef USE_WINSOCK
+# define GETHOSTNAME_TYPE_ARG2 int
+# else
+# define GETHOSTNAME_TYPE_ARG2 size_t
+# endif
+#endif
+
+#ifdef __POCC__
+# include <sys/types.h>
+# include <unistd.h>
+# define ESRCH 3
+#endif
+
+/*
+ * Android does have the arpa/nameser.h header which is detected by configure
+ * but it appears to be empty with recent NDK r7b / r7c, so we undefine here.
+ */
+#if (defined(ANDROID) || defined(__ANDROID__)) && defined(HAVE_ARPA_NAMESER_H)
+# undef HAVE_ARPA_NAMESER_H
+#endif
+
+/*
+ * Recent autoconf versions define these symbols in ares_config.h. We don't
+ * want them (since they collide with the libcurl ones when we build
+ * --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
+
+/* 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
+#endif
+
+/*
+ * Include macros and defines that should only be processed once.
+ */
+
+#ifndef __SETUP_ONCE_H
+#include "setup_once.h"
+#endif
+
+#endif /* HEADER_CARES_SETUP_H */
diff --git a/contrib/libs/c-ares/ares_strcasecmp.c b/contrib/libs/c-ares/ares_strcasecmp.c
new file mode 100644
index 0000000000..f9c85e2096
--- /dev/null
+++ b/contrib/libs/c-ares/ares_strcasecmp.c
@@ -0,0 +1,66 @@
+
+
+/* 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/contrib/libs/c-ares/ares_strcasecmp.h b/contrib/libs/c-ares/ares_strcasecmp.h
new file mode 100644
index 0000000000..57d86f9634
--- /dev/null
+++ b/contrib/libs/c-ares/ares_strcasecmp.h
@@ -0,0 +1,30 @@
+#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/contrib/libs/c-ares/ares_strdup.c b/contrib/libs/c-ares/ares_strdup.c
new file mode 100644
index 0000000000..0c3dcffc30
--- /dev/null
+++ b/contrib/libs/c-ares/ares_strdup.c
@@ -0,0 +1,49 @@
+
+
+/* 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)
+{
+#ifdef HAVE_STRDUP
+ if (ares_malloc == malloc)
+ return strdup(s1);
+ else
+#endif
+ {
+ size_t sz;
+ char * s2;
+
+ if(s1) {
+ sz = strlen(s1);
+ if(sz < (size_t)-1) {
+ sz++;
+ if(sz < ((size_t)-1) / sizeof(char)) {
+ s2 = ares_malloc(sz * sizeof(char));
+ if(s2) {
+ memcpy(s2, s1, sz * sizeof(char));
+ return s2;
+ }
+ }
+ }
+ }
+ return (char *)NULL;
+ }
+}
diff --git a/contrib/libs/c-ares/ares_strdup.h b/contrib/libs/c-ares/ares_strdup.h
new file mode 100644
index 0000000000..67f2a74f5f
--- /dev/null
+++ b/contrib/libs/c-ares/ares_strdup.h
@@ -0,0 +1,24 @@
+#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/contrib/libs/c-ares/ares_strerror.c b/contrib/libs/c-ares/ares_strerror.c
new file mode 100644
index 0000000000..c3ecbd7b43
--- /dev/null
+++ b/contrib/libs/c-ares/ares_strerror.c
@@ -0,0 +1,56 @@
+
+/* 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 <assert.h>
+#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/contrib/libs/c-ares/ares_strsplit.c b/contrib/libs/c-ares/ares_strsplit.c
new file mode 100644
index 0000000000..b57a30f2a9
--- /dev/null
+++ b/contrib/libs/c-ares/ares_strsplit.c
@@ -0,0 +1,174 @@
+/* Copyright (C) 2018 by John Schember <john@nachtimwald.com>
+ *
+ * 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_strsplit.h"
+#include "ares.h"
+#include "ares_private.h"
+
+static int list_contains(char * const *list, size_t num_elem, const char *str, int insensitive)
+{
+ size_t len;
+ size_t i;
+
+ len = strlen(str);
+ for (i=0; i<num_elem; i++)
+ {
+ if (insensitive)
+ {
+#ifdef WIN32
+ if (strnicmp(list[i], str, len) == 0)
+#else
+ if (strncasecmp(list[i], str, len) == 0)
+#endif
+ return 1;
+ }
+ else
+ {
+ if (strncmp(list[i], str, len) == 0)
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+static int is_delim(char c, const char *delims, size_t num_delims)
+{
+ size_t i;
+
+ for (i=0; i<num_delims; i++)
+ {
+ if (c == delims[i])
+ return 1;
+ }
+ return 0;
+}
+
+
+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(const char *in, const char *delms, int make_set, size_t *num_elm)
+{
+ char *parsestr;
+ char **temp;
+ char **out;
+ size_t cnt;
+ size_t nelms;
+ size_t in_len;
+ size_t num_delims;
+ size_t i;
+
+ if (in == NULL || delms == NULL || num_elm == NULL)
+ return NULL;
+
+ *num_elm = 0;
+
+ in_len = strlen(in);
+ num_delims = strlen(delms);
+
+ /* Figure out how many elements. */
+ nelms = 1;
+ for (i=0; i<in_len; i++)
+ {
+ if (is_delim(in[i], delms, num_delims))
+ {
+ nelms++;
+ }
+ }
+
+ /* Copy of input so we can cut it up. */
+ parsestr = ares_strdup(in);
+ if (parsestr == NULL)
+ return NULL;
+
+ /* Temporary array to store locations of start of each element
+ * within parsestr. */
+ temp = ares_malloc(nelms * sizeof(*temp));
+ if (temp == NULL)
+ {
+ ares_free(parsestr);
+ return NULL;
+ }
+ temp[0] = parsestr;
+ cnt = 1;
+ for (i=0; i<in_len && cnt<nelms; i++)
+ {
+ if (!is_delim(parsestr[i], delms, num_delims))
+ continue;
+
+ /* Replace sep with NULL. */
+ parsestr[i] = '\0';
+ /* Add the pointer to the array of elements */
+ temp[cnt] = parsestr+i+1;
+ cnt++;
+ }
+
+ /* Copy each element to our output array. */
+ out = ares_malloc(nelms * sizeof(*out));
+ if (out == NULL)
+ {
+ ares_free(parsestr);
+ ares_free(temp);
+ return NULL;
+ }
+
+ nelms = 0;
+ for (i=0; i<cnt; i++)
+ {
+ if (temp[i][0] == '\0')
+ continue;
+
+ if (make_set && list_contains(out, nelms, temp[i], 1))
+ continue;
+
+ out[nelms] = ares_strdup(temp[i]);
+ if (out[nelms] == NULL)
+ {
+ ares_strsplit_free(out, nelms);
+ ares_free(parsestr);
+ ares_free(temp);
+ return NULL;
+ }
+ nelms++;
+ }
+
+
+ /* If there are no elements don't return an empty allocated
+ * array. */
+ if (nelms == 0)
+ {
+ ares_strsplit_free(out, nelms);
+ out = NULL;
+ }
+
+ /* Get the true number of elements (recalculated because of make_set) */
+ *num_elm = nelms;
+
+ ares_free(parsestr);
+ ares_free(temp);
+ return out;
+}
diff --git a/contrib/libs/c-ares/ares_strsplit.h b/contrib/libs/c-ares/ares_strsplit.h
new file mode 100644
index 0000000000..e00fd14dd5
--- /dev/null
+++ b/contrib/libs/c-ares/ares_strsplit.h
@@ -0,0 +1,43 @@
+#ifndef HEADER_CARES_STRSPLIT_H
+#define HEADER_CARES_STRSPLIT_H
+
+/* Copyright (C) 2018 by John Schember <john@nachtimwald.com>
+ *
+ * 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 delem skipping empty elements.
+ *
+ * param in String to split.
+ * param delims 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.
+ * param make_set Have the list be a Set where there are no
+ * duplicate entries. 1 for true, 0 or false.
+ * 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, int make_set, 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/contrib/libs/c-ares/ares_timeout.c b/contrib/libs/c-ares/ares_timeout.c
new file mode 100644
index 0000000000..293e4af021
--- /dev/null
+++ b/contrib/libs/c-ares/ares_timeout.c
@@ -0,0 +1,88 @@
+
+/* 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 <limits.h>
+#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/contrib/libs/c-ares/ares_version.c b/contrib/libs/c-ares/ares_version.c
new file mode 100644
index 0000000000..4f8c42f2c9
--- /dev/null
+++ b/contrib/libs/c-ares/ares_version.c
@@ -0,0 +1,11 @@
+
+#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/contrib/libs/c-ares/ares_version.h b/contrib/libs/c-ares/ares_version.h
new file mode 100644
index 0000000000..c041d574de
--- /dev/null
+++ b/contrib/libs/c-ares/ares_version.h
@@ -0,0 +1,24 @@
+
+#ifndef ARES__VERSION_H
+#define ARES__VERSION_H
+
+/* This is the global package copyright */
+#define ARES_COPYRIGHT "2004 - 2020 Daniel Stenberg, <daniel@haxx.se>."
+
+#define ARES_VERSION_MAJOR 1
+#define ARES_VERSION_MINOR 16
+#define ARES_VERSION_PATCH 1
+#define ARES_VERSION ((ARES_VERSION_MAJOR<<16)|\
+ (ARES_VERSION_MINOR<<8)|\
+ (ARES_VERSION_PATCH))
+#define ARES_VERSION_STR "1.16.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/contrib/libs/c-ares/ares_writev.c b/contrib/libs/c-ares/ares_writev.c
new file mode 100644
index 0000000000..e812c09e1c
--- /dev/null
+++ b/contrib/libs/c-ares/ares_writev.c
@@ -0,0 +1,79 @@
+
+
+/* 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 <limits.h>
+#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/contrib/libs/c-ares/ares_writev.h b/contrib/libs/c-ares/ares_writev.h
new file mode 100644
index 0000000000..65cea8708f
--- /dev/null
+++ b/contrib/libs/c-ares/ares_writev.h
@@ -0,0 +1,36 @@
+#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/contrib/libs/c-ares/atomic.cpp b/contrib/libs/c-ares/atomic.cpp
new file mode 100644
index 0000000000..e193a64b37
--- /dev/null
+++ b/contrib/libs/c-ares/atomic.cpp
@@ -0,0 +1,13 @@
+#include <util/system/spinlock.h>
+
+#include "atomic.h"
+
+EXTERN_C void acquire_lock(atomic_t *lock)
+{
+ AcquireAdaptiveLock(lock);
+}
+
+EXTERN_C void release_lock(atomic_t *lock)
+{
+ ReleaseAdaptiveLock(lock);
+}
diff --git a/contrib/libs/c-ares/atomic.h b/contrib/libs/c-ares/atomic.h
new file mode 100644
index 0000000000..9b26bcdc0b
--- /dev/null
+++ b/contrib/libs/c-ares/atomic.h
@@ -0,0 +1,15 @@
+#ifndef ATOMIC__H
+#define ATOMIC__H
+
+typedef volatile intptr_t atomic_t;
+
+#ifdef __cplusplus
+ #define EXTERN_C extern "C"
+#else
+ #define EXTERN_C
+#endif
+
+EXTERN_C void acquire_lock(atomic_t *lock);
+EXTERN_C void release_lock(atomic_t *lock);
+
+#endif
diff --git a/contrib/libs/c-ares/bitncmp.c b/contrib/libs/c-ares/bitncmp.c
new file mode 100644
index 0000000000..bbf1cff4a6
--- /dev/null
+++ b/contrib/libs/c-ares/bitncmp.c
@@ -0,0 +1,59 @@
+
+/*
+ * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (c) 1996,1999 by Internet Software Consortium.
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * 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.
+ */
+
+#ifndef HAVE_BITNCMP
+
+#include "ares_setup.h"
+#include "bitncmp.h"
+
+/*
+ * int
+ * bitncmp(l, r, n)
+ * compare bit masks l and r, for n bits.
+ * return:
+ * <0, >0, or 0 in the libc tradition.
+ * note:
+ * network byte order assumed. this means 192.5.5.240/28 has
+ * 0x11110000 in its fourth octet.
+ * author:
+ * Paul Vixie (ISC), June 1996
+ */
+int ares__bitncmp(const void *l, const void *r, int n)
+{
+ unsigned int lb, rb;
+ int x, b;
+
+ b = n / 8;
+ x = memcmp(l, r, b);
+ if (x || (n & 7) == 0)
+ return (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)
+ return (1);
+ return (-1);
+ }
+ lb <<= 1;
+ rb <<= 1;
+ }
+ return (0);
+}
+#endif
diff --git a/contrib/libs/c-ares/bitncmp.h b/contrib/libs/c-ares/bitncmp.h
new file mode 100644
index 0000000000..7b8d66c166
--- /dev/null
+++ b/contrib/libs/c-ares/bitncmp.h
@@ -0,0 +1,26 @@
+#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/contrib/libs/c-ares/config-dos.h b/contrib/libs/c-ares/config-dos.h
new file mode 100644
index 0000000000..114db511c6
--- /dev/null
+++ b/contrib/libs/c-ares/config-dos.h
@@ -0,0 +1,108 @@
+#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 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)
+ #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
+#endif
+
+#undef word
+#undef byte
+
+#endif /* HEADER_CONFIG_DOS_H */
+
diff --git a/contrib/libs/c-ares/config-win32.h b/contrib/libs/c-ares/config-win32.h
new file mode 100644
index 0000000000..da7eba44d8
--- /dev/null
+++ b/contrib/libs/c-ares/config-win32.h
@@ -0,0 +1,357 @@
+#ifndef HEADER_CARES_CONFIG_WIN32_H
+#define HEADER_CARES_CONFIG_WIN32_H
+
+/* 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.
+ */
+
+/* ================================================================ */
+/* c-ares/config-win32.h - Hand crafted config file for Windows */
+/* ================================================================ */
+
+/* ---------------------------------------------------------------- */
+/* HEADER FILES */
+/* ---------------------------------------------------------------- */
+
+/* Define if you have the <assert.h> header file. */
+#define HAVE_ASSERT_H 1
+
+/* Define if you have the <errno.h> header file. */
+#define HAVE_ERRNO_H 1
+
+/* Define if you have the <getopt.h> header file. */
+#if defined(__MINGW32__) || defined(__POCC__)
+#define HAVE_GETOPT_H 1
+#endif
+
+/* Define if you have the <limits.h> header file. */
+#define HAVE_LIMITS_H 1
+
+/* Define if you have the <process.h> header file. */
+#ifndef __SALFORDC__
+#define HAVE_PROCESS_H 1
+#endif
+
+/* Define if you have the <signal.h> header file. */
+#define HAVE_SIGNAL_H 1
+
+/* Define if you have the <sys/time.h> header file */
+/* #define HAVE_SYS_TIME_H 1 */
+
+/* Define if you have the <time.h> header file. */
+#define HAVE_TIME_H 1
+
+/* Define if you have the <unistd.h> header file. */
+#if defined(__MINGW32__) || defined(__WATCOMC__) || defined(__LCC__) || \
+ defined(__POCC__)
+#define HAVE_UNISTD_H 1
+#endif
+
+/* Define if you have the <windows.h> header file. */
+#define HAVE_WINDOWS_H 1
+
+/* Define if you have the <winsock.h> header file. */
+#define HAVE_WINSOCK_H 1
+
+/* Define if you have the <winsock2.h> header file. */
+#ifndef __SALFORDC__
+#define HAVE_WINSOCK2_H 1
+#endif
+
+/* Define if you have the <ws2tcpip.h> header file. */
+#ifndef __SALFORDC__
+#define HAVE_WS2TCPIP_H 1
+#endif
+
+/* Define to 1 if you have the <sys/uio.h> header file. */
+#define HAVE_SYS_UIO_H 1
+
+/* Define to 1 if you have the writev function. */
+#define HAVE_WRITEV 1
+
+/* ---------------------------------------------------------------- */
+/* OTHER HEADER INFO */
+/* ---------------------------------------------------------------- */
+
+/* Define if sig_atomic_t is an available typedef. */
+#define HAVE_SIG_ATOMIC_T 1
+
+/* Define if you have the ANSI C header files. */
+#define STDC_HEADERS 1
+
+/* Define if you can safely include both <sys/time.h> and <time.h>. */
+/* #define TIME_WITH_SYS_TIME 1 */
+
+/* ---------------------------------------------------------------- */
+/* FUNCTIONS */
+/* ---------------------------------------------------------------- */
+
+/* Define if you have the closesocket function. */
+#define HAVE_CLOSESOCKET 1
+
+/* Define if you have the getenv function. */
+#define HAVE_GETENV 1
+
+/* Define if you have the gethostname function. */
+#define HAVE_GETHOSTNAME 1
+
+/* Define if you have the ioctlsocket function. */
+#define HAVE_IOCTLSOCKET 1
+
+/* Define if you have a working ioctlsocket FIONBIO function. */
+#define HAVE_IOCTLSOCKET_FIONBIO 1
+
+/* Define if you have the strcasecmp function. */
+/* #define HAVE_STRCASECMP 1 */
+
+/* Define if you have the strdup function. */
+#define HAVE_STRDUP 1
+
+/* Define if you have the stricmp function. */
+#define HAVE_STRICMP 1
+
+/* Define if you have the strncasecmp function. */
+/* #define HAVE_STRNCASECMP 1 */
+
+/* Define if you have the strnicmp function. */
+#define HAVE_STRNICMP 1
+
+/* Define if you have the recv function. */
+#define HAVE_RECV 1
+
+/* Define to the type of arg 1 for recv. */
+#define RECV_TYPE_ARG1 SOCKET
+
+/* Define to the type of arg 2 for recv. */
+#define RECV_TYPE_ARG2 char *
+
+/* Define to the type of arg 3 for recv. */
+#define RECV_TYPE_ARG3 int
+
+/* Define to the type of arg 4 for recv. */
+#define RECV_TYPE_ARG4 int
+
+/* Define to the function return type for recv. */
+#define RECV_TYPE_RETV int
+
+/* Define if you have the recvfrom function. */
+#define HAVE_RECVFROM 1
+
+/* Define to the type of arg 1 for recvfrom. */
+#define RECVFROM_TYPE_ARG1 SOCKET
+
+/* Define to the type pointed by arg 2 for recvfrom. */
+#define RECVFROM_TYPE_ARG2 char
+
+/* Define to the type of arg 3 for recvfrom. */
+#define RECVFROM_TYPE_ARG3 int
+
+/* Define to the type of arg 4 for recvfrom. */
+#define RECVFROM_TYPE_ARG4 int
+
+/* Define to the type pointed by arg 5 for recvfrom. */
+#define RECVFROM_TYPE_ARG5 struct sockaddr
+
+/* Define to the type pointed by arg 6 for recvfrom. */
+#define RECVFROM_TYPE_ARG6 int
+
+/* Define to the function return type for recvfrom. */
+#define RECVFROM_TYPE_RETV int
+
+/* Define if you have the send function. */
+#define HAVE_SEND 1
+
+/* Define to the type of arg 1 for send. */
+#define SEND_TYPE_ARG1 SOCKET
+
+/* Define to the type qualifier of arg 2 for send. */
+#define SEND_QUAL_ARG2 const
+
+/* Define to the type of arg 2 for send. */
+#define SEND_TYPE_ARG2 char *
+
+/* Define to the type of arg 3 for send. */
+#define SEND_TYPE_ARG3 int
+
+/* Define to the type of arg 4 for send. */
+#define SEND_TYPE_ARG4 int
+
+/* Define to the function return type for send. */
+#define SEND_TYPE_RETV int
+
+/* 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
+#endif
+
+/* ---------------------------------------------------------------- */
+/* TYPEDEF REPLACEMENTS */
+/* ---------------------------------------------------------------- */
+
+/* Define if in_addr_t is not an available 'typedefed' type. */
+#define in_addr_t unsigned long
+
+/* Define to the return type of signal handlers (int or void). */
+#define RETSIGTYPE void
+
+#ifdef __cplusplus
+/* Compiling headers in C++ mode means bool is available */
+#define HAVE_BOOL_T
+#endif
+
+/* ---------------------------------------------------------------- */
+/* TYPE SIZES */
+/* ---------------------------------------------------------------- */
+
+/* ---------------------------------------------------------------- */
+/* STRUCT RELATED */
+/* ---------------------------------------------------------------- */
+
+/* Define if you have struct addrinfo. */
+#define HAVE_STRUCT_ADDRINFO 1
+
+/* Define if you have struct sockaddr_storage. */
+#if !defined(__SALFORDC__) && !defined(__BORLANDC__)
+#define HAVE_STRUCT_SOCKADDR_STORAGE 1
+#endif
+
+/* Define if you have struct timeval. */
+#define HAVE_STRUCT_TIMEVAL 1
+
+/* ---------------------------------------------------------------- */
+/* COMPILER SPECIFIC */
+/* ---------------------------------------------------------------- */
+
+/* Define to avoid VS2005 complaining about portable C functions. */
+#if defined(_MSC_VER) && (_MSC_VER >= 1400)
+# define _CRT_SECURE_NO_DEPRECATE 1
+# define _CRT_NONSTDC_NO_DEPRECATE 1
+#endif
+
+/* Set the Target to Vista. However, any symbols required above Win2000
+ * should be loaded via LoadLibrary() */
+#if defined(_MSC_VER) && (_MSC_VER >= 1500)
+# define VS2008_MIN_TARGET 0x0600
+#endif
+
+/* VS2008 default target settings and minimum build target check. */
+#if defined(_MSC_VER) && (_MSC_VER >= 1500)
+# ifndef _WIN32_WINNT
+# define _WIN32_WINNT VS2008_MIN_TARGET
+# endif
+# ifndef WINVER
+# define WINVER VS2008_MIN_TARGET
+# endif
+# if (_WIN32_WINNT < VS2008_MIN_TARGET) || (WINVER < VS2008_MIN_TARGET)
+# error VS2008 does not support Windows build targets prior to Windows 2000
+# endif
+#endif
+
+/* When no build target is specified Pelles C 5.00 and later default build
+ target is Windows Vista. */
+#if defined(__POCC__) && (__POCC__ >= 500)
+# ifndef _WIN32_WINNT
+# define _WIN32_WINNT 0x0600
+# endif
+# ifndef WINVER
+# define WINVER 0x0600
+# endif
+#endif
+
+/* Availability of freeaddrinfo, getaddrinfo and getnameinfo functions is
+ quite convoluted, compiler dependent and even build target dependent. */
+#if defined(HAVE_WS2TCPIP_H)
+# if defined(__POCC__)
+# define HAVE_FREEADDRINFO 1
+# define HAVE_GETADDRINFO 1
+# define HAVE_GETNAMEINFO 1
+# elif defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0501)
+# define HAVE_FREEADDRINFO 1
+# define HAVE_GETADDRINFO 1
+# define HAVE_GETNAMEINFO 1
+# elif defined(_MSC_VER) && (_MSC_VER >= 1200)
+# define HAVE_FREEADDRINFO 1
+# define HAVE_GETADDRINFO 1
+# define HAVE_GETNAMEINFO 1
+# endif
+#endif
+
+#if defined(__POCC__)
+# ifndef _MSC_VER
+# error Microsoft extensions /Ze compiler option is required
+# endif
+# ifndef __POCC__OLDNAMES
+# error Compatibility names /Go compiler option is required
+# endif
+#endif
+
+/* ---------------------------------------------------------------- */
+/* IPV6 COMPATIBILITY */
+/* ---------------------------------------------------------------- */
+
+/* Define if you have address family AF_INET6. */
+#ifdef HAVE_WINSOCK2_H
+#define HAVE_AF_INET6 1
+#endif
+
+/* Define if you have protocol family PF_INET6. */
+#ifdef HAVE_WINSOCK2_H
+#define HAVE_PF_INET6 1
+#endif
+
+/* Define if you have struct in6_addr. */
+#ifdef HAVE_WS2TCPIP_H
+#define HAVE_STRUCT_IN6_ADDR 1
+#endif
+
+/* Define if you have struct sockaddr_in6. */
+#ifdef HAVE_WS2TCPIP_H
+#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
+#endif
+
+/* ---------------------------------------------------------------- */
+/* Win CE */
+/* ---------------------------------------------------------------- */
+
+/* FIXME: A proper config-win32ce.h should be created to hold these */
+
+/*
+ * System error codes for Windows CE
+ */
+
+#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
+#endif
+
+#endif /* HEADER_CARES_CONFIG_WIN32_H */
diff --git a/contrib/libs/c-ares/inet_net_pton.c b/contrib/libs/c-ares/inet_net_pton.c
new file mode 100644
index 0000000000..af1a534a05
--- /dev/null
+++ b/contrib/libs/c-ares/inet_net_pton.c
@@ -0,0 +1,450 @@
+
+/*
+ * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (c) 1996,1999 by Internet Software Consortium.
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * 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.
+ */
+
+#include "ares_setup.h"
+
+#ifdef HAVE_NETINET_IN_H
+# include <netinet/in.h>
+#endif
+#ifdef HAVE_ARPA_INET_H
+# include <arpa/inet.h>
+#endif
+#ifdef HAVE_ARPA_NAMESER_H
+# include <arpa/nameser.h>
+#else
+# include "nameser.h"
+#endif
+#ifdef HAVE_ARPA_NAMESER_COMPAT_H
+# include <arpa/nameser_compat.h>
+#endif
+
+#include "ares.h"
+#include "ares_ipv6.h"
+#include "ares_nowarn.h"
+#include "ares_inet_net_pton.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 } } };
+
+
+#ifndef HAVE_INET_NET_PTON
+
+/*
+ * static int
+ * inet_net_pton_ipv4(src, dst, size)
+ * convert IPv4 network number from presentation to network format.
+ * accepts hex octets, hex strings, decimal octets, and /CIDR.
+ * "size" is in bytes and describes "dst".
+ * return:
+ * number of bits, either imputed classfully or specified with /CIDR,
+ * or -1 if some failure occurred (check errno). ENOENT means it was
+ * not an IPv4 network specification.
+ * note:
+ * network byte order assumed. this means 192.5.5.240/28 has
+ * 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
+ * actual last winsock error. So use macro ERRNO to fetch the
+ * errno this funtion sets when returning (-1), not SOCKERRNO.
+ * author:
+ * Paul Vixie (ISC), June 1996
+ */
+static int
+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;
+ const unsigned char *odst = dst;
+
+ ch = *src++;
+ if (ch == '0' && (src[0] == 'x' || src[0] == 'X')
+ && ISASCII(src[1])
+ && ISXDIGIT(src[1])) {
+ /* Hexadecimal: Eat nybble string. */
+ if (!size)
+ goto emsgsize;
+ dirty = 0;
+ src++; /* skip x or X. */
+ while ((ch = *src++) != '\0' && ISASCII(ch) && ISXDIGIT(ch)) {
+ if (ISUPPER(ch))
+ ch = tolower(ch);
+ n = aresx_sztosi(strchr(xdigits, ch) - xdigits);
+ if (dirty == 0)
+ tmp = n;
+ else
+ tmp = (tmp << 4) | n;
+ if (++dirty == 2) {
+ if (!size--)
+ goto emsgsize;
+ *dst++ = (unsigned char) tmp;
+ dirty = 0;
+ }
+ }
+ if (dirty) { /* Odd trailing nybble? */
+ if (!size--)
+ goto emsgsize;
+ *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);
+ tmp *= 10;
+ tmp += n;
+ if (tmp > 255)
+ goto enoent;
+ } while ((ch = *src++) != '\0' &&
+ ISASCII(ch) && ISDIGIT(ch));
+ if (!size--)
+ goto emsgsize;
+ *dst++ = (unsigned char) tmp;
+ if (ch == '\0' || ch == '/')
+ break;
+ if (ch != '.')
+ goto enoent;
+ ch = *src++;
+ if (!ISASCII(ch) || !ISDIGIT(ch))
+ goto enoent;
+ }
+ } else
+ goto enoent;
+
+ bits = -1;
+ if (ch == '/' && ISASCII(src[0]) &&
+ ISDIGIT(src[0]) && dst > odst) {
+ /* CIDR width specifier. Nothing can follow it. */
+ ch = *src++; /* Skip over the /. */
+ bits = 0;
+ do {
+ n = aresx_sztosi(strchr(digits, ch) - digits);
+ bits *= 10;
+ bits += n;
+ if (bits > 32)
+ goto enoent;
+ } while ((ch = *src++) != '\0' && ISASCII(ch) && ISDIGIT(ch));
+ if (ch != '\0')
+ goto enoent;
+ }
+
+ /* Firey death and destruction unless we prefetched EOS. */
+ 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 no CIDR spec was given, infer width from net class. */
+ if (bits == -1) {
+ if (*odst >= 240) /* Class E */
+ bits = 32;
+ else if (*odst >= 224) /* Class D */
+ bits = 8;
+ else if (*odst >= 192) /* Class C */
+ bits = 24;
+ else if (*odst >= 128) /* Class B */
+ bits = 16;
+ 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 there are no additional bits specified for a class D
+ * address adjust bits to 4.
+ */
+ if (bits == 8 && *odst == 224)
+ bits = 4;
+ }
+ /* Extend network to cover the actual mask. */
+ while (bits > ((dst - odst) * 8)) {
+ if (!size--)
+ goto emsgsize;
+ *dst++ = '\0';
+ }
+ return (bits);
+
+ enoent:
+ SET_ERRNO(ENOENT);
+ return (-1);
+
+ emsgsize:
+ SET_ERRNO(EMSGSIZE);
+ return (-1);
+}
+
+static int
+getbits(const char *src, int *bitsp)
+{
+ static const char digits[] = "0123456789";
+ int n;
+ int val;
+ char ch;
+
+ val = 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);
+ val *= 10;
+ val += aresx_sztosi(pch - digits);
+ if (val > 128) /* range */
+ return (0);
+ continue;
+ }
+ return (0);
+ }
+ if (n == 0)
+ return (0);
+ *bitsp = val;
+ return (1);
+}
+
+static int
+getv4(const char *src, unsigned char *dst, int *bitsp)
+{
+ static const char digits[] = "0123456789";
+ unsigned char *odst = dst;
+ int n;
+ unsigned int val;
+ char ch;
+
+ val = 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);
+ val *= 10;
+ val += aresx_sztoui(pch - digits);
+ if (val > 255) /* range */
+ return (0);
+ continue;
+ }
+ if (ch == '.' || ch == '/') {
+ if (dst - odst > 3) /* too many octets? */
+ return (0);
+ *dst++ = (unsigned char)val;
+ if (ch == '/')
+ return (getbits(src, bitsp));
+ val = 0;
+ n = 0;
+ continue;
+ }
+ return (0);
+ }
+ if (n == 0)
+ return (0);
+ if (dst - odst > 3) /* too many octets? */
+ return (0);
+ *dst = (unsigned char)val;
+ return 1;
+}
+
+static int
+inet_net_pton_ipv6(const char *src, unsigned char *dst, size_t size)
+{
+ 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;
+ unsigned int val;
+ int digits;
+ int bits;
+ size_t bytes;
+ int words;
+ int ipv4;
+
+ memset((tp = tmp), '\0', NS_IN6ADDRSZ);
+ endp = tp + NS_IN6ADDRSZ;
+ colonp = NULL;
+ /* Leading :: requires some special handling. */
+ if (*src == ':')
+ if (*++src != ':')
+ goto enoent;
+ curtok = src;
+ saw_xdigit = 0;
+ val = 0;
+ digits = 0;
+ bits = -1;
+ ipv4 = 0;
+ while ((ch = *src++) != '\0') {
+ const char *pch;
+
+ if ((pch = strchr((xdigits = xdigits_l), ch)) == NULL)
+ pch = strchr((xdigits = xdigits_u), ch);
+ if (pch != NULL) {
+ val <<= 4;
+ val |= aresx_sztoui(pch - xdigits);
+ if (++digits > 4)
+ goto enoent;
+ saw_xdigit = 1;
+ continue;
+ }
+ if (ch == ':') {
+ curtok = src;
+ if (!saw_xdigit) {
+ if (colonp)
+ goto enoent;
+ colonp = tp;
+ continue;
+ } else if (*src == '\0')
+ goto enoent;
+ if (tp + NS_INT16SZ > endp)
+ return (0);
+ *tp++ = (unsigned char)((val >> 8) & 0xff);
+ *tp++ = (unsigned char)(val & 0xff);
+ saw_xdigit = 0;
+ digits = 0;
+ val = 0;
+ continue;
+ }
+ if (ch == '.' && ((tp + NS_INADDRSZ) <= endp) &&
+ getv4(curtok, tp, &bits) > 0) {
+ tp += NS_INADDRSZ;
+ saw_xdigit = 0;
+ ipv4 = 1;
+ break; /* '\0' was seen by inet_pton4(). */
+ }
+ if (ch == '/' && getbits(src, &bits) > 0)
+ break;
+ goto enoent;
+ }
+ if (saw_xdigit) {
+ if (tp + NS_INT16SZ > endp)
+ goto enoent;
+ *tp++ = (unsigned char)((val >> 8) & 0xff);
+ *tp++ = (unsigned char)(val & 0xff);
+ }
+ if (bits == -1)
+ bits = 128;
+
+ words = (bits + 15) / 16;
+ if (words < 2)
+ words = 2;
+ if (ipv4)
+ words = 8;
+ endp = tmp + 2 * words;
+
+ if (colonp != NULL) {
+ /*
+ * Since some memmove()'s erroneously fail to handle
+ * overlapping regions, we'll do the shift by hand.
+ */
+ const ares_ssize_t n = tp - colonp;
+ ares_ssize_t i;
+
+ if (tp == endp)
+ goto enoent;
+ for (i = 1; i <= n; i++) {
+ *(endp - i) = *(colonp + n - i);
+ *(colonp + n - i) = 0;
+ }
+ tp = endp;
+ }
+ if (tp != endp)
+ goto enoent;
+
+ bytes = (bits + 7) / 8;
+ if (bytes > size)
+ goto emsgsize;
+ memcpy(dst, tmp, bytes);
+ return (bits);
+
+ enoent:
+ SET_ERRNO(ENOENT);
+ return (-1);
+
+ emsgsize:
+ SET_ERRNO(EMSGSIZE);
+ return (-1);
+}
+
+/*
+ * int
+ * inet_net_pton(af, src, dst, size)
+ * convert network number from presentation to network format.
+ * accepts hex octets, hex strings, decimal octets, and /CIDR.
+ * "size" is in bytes and describes "dst".
+ * return:
+ * number of bits, either imputed classfully or specified with /CIDR,
+ * or -1 if some failure occurred (check errno). ENOENT means it was
+ * 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
+ * actual last winsock error. So use macro ERRNO to fetch the
+ * errno this funtion 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)
+{
+ switch (af) {
+ case AF_INET:
+ return (inet_net_pton_ipv4(src, dst, size));
+ case AF_INET6:
+ return (inet_net_pton_ipv6(src, dst, size));
+ default:
+ SET_ERRNO(EAFNOSUPPORT);
+ return (-1);
+ }
+}
+
+#endif /* HAVE_INET_NET_PTON */
+
+#ifndef HAVE_INET_PTON
+int ares_inet_pton(int af, const char *src, void *dst)
+{
+ int result;
+ size_t size;
+
+ if (af == AF_INET)
+ size = sizeof(struct in_addr);
+ else if (af == AF_INET6)
+ size = sizeof(struct ares_in6_addr);
+ else
+ {
+ SET_ERRNO(EAFNOSUPPORT);
+ return -1;
+ }
+ result = ares_inet_net_pton(af, src, dst, size);
+ if (result == -1 && ERRNO == ENOENT)
+ return 0;
+ return (result > -1 ? 1 : -1);
+}
+#else /* HAVE_INET_PTON */
+int ares_inet_pton(int af, const char *src, void *dst)
+{
+ /* just relay this to the underlying function */
+ return inet_pton(af, src, dst);
+}
+
+#endif
diff --git a/contrib/libs/c-ares/inet_ntop.c b/contrib/libs/c-ares/inet_ntop.c
new file mode 100644
index 0000000000..1935a871ce
--- /dev/null
+++ b/contrib/libs/c-ares/inet_ntop.c
@@ -0,0 +1,207 @@
+/*
+ * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (c) 1996-1999 by Internet Software Consortium.
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * 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.
+ */
+
+#include "ares_setup.h"
+
+#ifdef HAVE_NETINET_IN_H
+# include <netinet/in.h>
+#endif
+#ifdef HAVE_ARPA_INET_H
+# include <arpa/inet.h>
+#endif
+#ifdef HAVE_ARPA_NAMESER_H
+# include <arpa/nameser.h>
+#else
+# include "nameser.h"
+#endif
+#ifdef HAVE_ARPA_NAMESER_COMPAT_H
+# include <arpa/nameser_compat.h>
+#endif
+
+#include "ares.h"
+#include "ares_ipv6.h"
+
+#ifndef HAVE_INET_NTOP
+
+/*
+ * WARNING: Don't even consider trying to compile this on a system where
+ * sizeof(int) < 4. sizeof(int) > 4 is fine; all the world's not a VAX.
+ */
+
+static const char *inet_ntop4(const unsigned char *src, char *dst, size_t size);
+static const char *inet_ntop6(const unsigned char *src, char *dst, size_t size);
+
+/* char *
+ * inet_ntop(af, src, dst, size)
+ * convert a network format address to presentation format.
+ * return:
+ * 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
+ * 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)
+{
+ 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);
+ }
+ /* NOTREACHED */
+}
+
+/* const char *
+ * inet_ntop4(src, dst, size)
+ * format an IPv4 address
+ * return:
+ * `dst' (as a const)
+ * notes:
+ * (1) uses no statics
+ * (2) takes a unsigned char* not an in_addr as input
+ * author:
+ * Paul Vixie, 1996.
+ */
+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")];
+
+ if ((size_t)sprintf(tmp, fmt, src[0], src[1], src[2], src[3]) >= size) {
+ SET_ERRNO(ENOSPC);
+ return (NULL);
+ }
+ strcpy(dst, tmp);
+ return (dst);
+}
+
+/* const char *
+ * inet_ntop6(src, dst, size)
+ * convert IPv6 binary address into presentation (printable) format
+ * author:
+ * Paul Vixie, 1996.
+ */
+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
+ * to contain a value of the specified size. On some systems, like
+ * Crays, there is no such thing as an integer variable with 16 bits.
+ * 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 *tp;
+ struct { int base, len; } best, cur;
+ unsigned int words[NS_IN6ADDRSZ / NS_INT16SZ];
+ int i;
+
+ /*
+ * Preprocess:
+ * Copy the input (bytewise) array into a wordwise array.
+ * Find the longest run of 0x00's in src[] for :: shorthanding.
+ */
+ memset(words, '\0', sizeof(words));
+ 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;
+ for (i = 0; i < (NS_IN6ADDRSZ / NS_INT16SZ); i++) {
+ if (words[i] == 0) {
+ if (cur.base == -1)
+ cur.base = i, cur.len = 1;
+ else
+ cur.len++;
+ } else {
+ if (cur.base != -1) {
+ 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)
+ best = cur;
+ }
+ if (best.base != -1 && best.len < 2)
+ best.base = -1;
+
+ /*
+ * Format the result.
+ */
+ 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)
+ *tp++ = ':';
+ continue;
+ }
+ /* Are we following an initial run of 0x00s or any real hex? */
+ 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)))
+ return (NULL);
+ tp += strlen(tp);
+ break;
+ }
+ tp += sprintf(tp, "%x", words[i]);
+ }
+ /* Was it a trailing run of 0x00's? */
+ if (best.base != -1 && (best.base + best.len) == (NS_IN6ADDRSZ / NS_INT16SZ))
+ *tp++ = ':';
+ *tp++ = '\0';
+
+ /*
+ * Check for overflow, copy, and we're done.
+ */
+ if ((size_t)(tp - tmp) > size) {
+ SET_ERRNO(ENOSPC);
+ return (NULL);
+ }
+ strcpy(dst, tmp);
+ return (dst);
+}
+
+#else /* HAVE_INET_NTOP */
+
+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);
+}
+
+#endif /* HAVE_INET_NTOP */
diff --git a/contrib/libs/c-ares/nameser.h b/contrib/libs/c-ares/nameser.h
new file mode 100644
index 0000000000..a0302fd398
--- /dev/null
+++ b/contrib/libs/c-ares/nameser.h
@@ -0,0 +1,211 @@
+
+#ifndef ARES_NAMESER_H
+#define ARES_NAMESER_H
+
+/* header file provided by liren@vivisimo.com */
+
+#ifndef HAVE_ARPA_NAMESER_H
+
+#define NS_PACKETSZ 512 /* maximum packet size */
+#define NS_MAXDNAME 256 /* maximum domain name */
+#define NS_MAXCDNAME 255 /* maximum compressed domain name */
+#define NS_MAXLABEL 63
+#define NS_HFIXEDSZ 12 /* #/bytes of fixed data in header */
+#define NS_QFIXEDSZ 4 /* #/bytes of fixed data in query */
+#define NS_RRFIXEDSZ 10 /* #/bytes of fixed data in r record */
+#define NS_INT16SZ 2
+#define NS_INADDRSZ 4
+#define NS_IN6ADDRSZ 16
+#define NS_CMPRSFLGS 0xc0 /* Flag bits indicating name compression. */
+#define NS_DEFAULTPORT 53 /* For both TCP and UDP. */
+
+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_zxfr = 256, /* BIND-specific, nonstandard. */
+ 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 /* HAVE_ARPA_NAMESER_H */
+
+#ifndef HAVE_ARPA_NAMESER_COMPAT_H
+
+#define PACKETSZ NS_PACKETSZ
+#define MAXDNAME NS_MAXDNAME
+#define MAXCDNAME NS_MAXCDNAME
+#define MAXLABEL NS_MAXLABEL
+#define HFIXEDSZ NS_HFIXEDSZ
+#define QFIXEDSZ NS_QFIXEDSZ
+#define RRFIXEDSZ NS_RRFIXEDSZ
+#define INDIR_MASK NS_CMPRSFLGS
+#define NAMESERVER_PORT NS_DEFAULTPORT
+
+#define QUERY ns_o_query
+
+#define SERVFAIL ns_r_servfail
+#define NOTIMP ns_r_notimpl
+#define REFUSED ns_r_refused
+#undef NOERROR /* it seems this is already defined in winerror.h */
+#define NOERROR ns_r_noerror
+#define FORMERR ns_r_formerr
+#define NXDOMAIN ns_r_nxdomain
+
+#define C_IN ns_c_in
+#define C_CHAOS ns_c_chaos
+#define C_HS ns_c_hs
+#define C_NONE ns_c_none
+#define C_ANY ns_c_any
+
+#define T_A ns_t_a
+#define T_NS ns_t_ns
+#define T_MD ns_t_md
+#define T_MF ns_t_mf
+#define T_CNAME ns_t_cname
+#define T_SOA ns_t_soa
+#define T_MB ns_t_mb
+#define T_MG ns_t_mg
+#define T_MR ns_t_mr
+#define T_NULL ns_t_null
+#define T_WKS ns_t_wks
+#define T_PTR ns_t_ptr
+#define T_HINFO ns_t_hinfo
+#define T_MINFO ns_t_minfo
+#define T_MX ns_t_mx
+#define T_TXT ns_t_txt
+#define T_RP ns_t_rp
+#define T_AFSDB ns_t_afsdb
+#define T_X25 ns_t_x25
+#define T_ISDN ns_t_isdn
+#define T_RT ns_t_rt
+#define T_NSAP ns_t_nsap
+#define T_NSAP_PTR ns_t_nsap_ptr
+#define T_SIG ns_t_sig
+#define T_KEY ns_t_key
+#define T_PX ns_t_px
+#define T_GPOS ns_t_gpos
+#define T_AAAA ns_t_aaaa
+#define T_LOC ns_t_loc
+#define T_NXT ns_t_nxt
+#define T_EID ns_t_eid
+#define T_NIMLOC ns_t_nimloc
+#define T_SRV ns_t_srv
+#define T_ATMA ns_t_atma
+#define T_NAPTR ns_t_naptr
+#define T_KX ns_t_kx
+#define T_CERT ns_t_cert
+#define T_A6 ns_t_a6
+#define T_DNAME ns_t_dname
+#define T_SINK ns_t_sink
+#define T_OPT ns_t_opt
+#define T_APL ns_t_apl
+#define T_DS ns_t_ds
+#define T_SSHFP ns_t_sshfp
+#define T_RRSIG ns_t_rrsig
+#define T_NSEC ns_t_nsec
+#define T_DNSKEY ns_t_dnskey
+#define T_TKEY ns_t_tkey
+#define T_TSIG ns_t_tsig
+#define T_IXFR ns_t_ixfr
+#define T_AXFR ns_t_axfr
+#define T_MAILB ns_t_mailb
+#define T_MAILA ns_t_maila
+#define T_ANY ns_t_any
+
+#endif /* HAVE_ARPA_NAMESER_COMPAT_H */
+
+#endif /* ARES_NAMESER_H */
diff --git a/contrib/libs/c-ares/setup_once.h b/contrib/libs/c-ares/setup_once.h
new file mode 100644
index 0000000000..d4b0a954ed
--- /dev/null
+++ b/contrib/libs/c-ares/setup_once.h
@@ -0,0 +1,554 @@
+#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 <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdarg.h>
+#include <ctype.h>
+
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
+
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+
+#ifdef NEED_MALLOC_H
+#include <malloc.h>
+#endif
+
+#ifdef NEED_MEMORY_H
+#include <memory.h>
+#endif
+
+#ifdef HAVE_SYS_STAT_H
+#include <sys/stat.h>
+#endif
+
+#ifdef HAVE_SYS_TIME_H
+#include <sys/time.h>
+#ifdef TIME_WITH_SYS_TIME
+#include <time.h>
+#endif
+#else
+#ifdef HAVE_TIME_H
+#include <time.h>
+#endif
+#endif
+
+#ifdef WIN32
+#include <io.h>
+#include <fcntl.h>
+#endif
+
+#if defined(HAVE_STDBOOL_H) && defined(HAVE_BOOL_T)
+#include <stdbool.h>
+#endif
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#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 <sys/socket.h>
+#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()
+ */
+
+#if defined(HAVE_MSG_NOSIGNAL) && defined(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 <stdbool.h>, 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/contrib/libs/c-ares/test/ares-test-ai.h b/contrib/libs/c-ares/test/ares-test-ai.h
new file mode 100644
index 0000000000..7cf27e3306
--- /dev/null
+++ b/contrib/libs/c-ares/test/ares-test-ai.h
@@ -0,0 +1,57 @@
+#ifndef ARES_TEST_AI_H
+#define ARES_TEST_AI_H
+
+#include <utility>
+#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<int, bool> > {
+ public:
+ MockChannelTestAI() : MockChannelOptsTest(1, GetParam().first, GetParam().second, nullptr, 0) {}
+};
+
+class MockUDPChannelTestAI
+ : public MockChannelOptsTest,
+ public ::testing::WithParamInterface<int> {
+ public:
+ MockUDPChannelTestAI() : MockChannelOptsTest(1, GetParam(), false, nullptr, 0) {}
+};
+
+class MockTCPChannelTestAI
+ : public MockChannelOptsTest,
+ public ::testing::WithParamInterface<int> {
+ 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/contrib/libs/c-ares/test/ares-test-init.cc b/contrib/libs/c-ares/test/ares-test-init.cc
new file mode 100644
index 0000000000..842b0e15ac
--- /dev/null
+++ b/contrib/libs/c-ares/test/ares-test-init.cc
@@ -0,0 +1,703 @@
+#include "ares-test.h"
+
+// library initialization is only needed for windows builds
+#ifdef WIN32
+#define EXPECTED_NONINIT ARES_ENOTINITIALIZED
+#else
+#define EXPECTED_NONINIT ARES_SUCCESS
+#endif
+
+namespace ares {
+namespace test {
+
+TEST(LibraryInit, Basic) {
+ EXPECT_EQ(EXPECTED_NONINIT, ares_library_initialized());
+ EXPECT_EQ(ARES_SUCCESS, ares_library_init(ARES_LIB_INIT_ALL));
+ EXPECT_EQ(ARES_SUCCESS, ares_library_initialized());
+ ares_library_cleanup();
+ EXPECT_EQ(EXPECTED_NONINIT, ares_library_initialized());
+}
+
+TEST(LibraryInit, UnexpectedCleanup) {
+ EXPECT_EQ(EXPECTED_NONINIT, ares_library_initialized());
+ ares_library_cleanup();
+ EXPECT_EQ(EXPECTED_NONINIT, ares_library_initialized());
+}
+
+TEST(LibraryInit, DISABLED_InvalidParam) {
+ // TODO: police flags argument to ares_library_init()
+ EXPECT_EQ(ARES_EBADQUERY, ares_library_init(ARES_LIB_INIT_ALL << 2));
+ EXPECT_EQ(EXPECTED_NONINIT, ares_library_initialized());
+ ares_library_cleanup();
+}
+
+TEST(LibraryInit, Nested) {
+ EXPECT_EQ(EXPECTED_NONINIT, ares_library_initialized());
+ EXPECT_EQ(ARES_SUCCESS, ares_library_init(ARES_LIB_INIT_ALL));
+ EXPECT_EQ(ARES_SUCCESS, ares_library_initialized());
+ EXPECT_EQ(ARES_SUCCESS, ares_library_init(ARES_LIB_INIT_ALL));
+ EXPECT_EQ(ARES_SUCCESS, ares_library_initialized());
+ ares_library_cleanup();
+ EXPECT_EQ(ARES_SUCCESS, ares_library_initialized());
+ ares_library_cleanup();
+ EXPECT_EQ(EXPECTED_NONINIT, ares_library_initialized());
+}
+
+TEST(LibraryInit, BasicChannelInit) {
+ EXPECT_EQ(ARES_SUCCESS, ares_library_init(ARES_LIB_INIT_ALL));
+ ares_channel channel = nullptr;
+ EXPECT_EQ(ARES_SUCCESS, ares_init(&channel));
+ EXPECT_NE(nullptr, channel);
+ ares_destroy(channel);
+ ares_library_cleanup();
+}
+
+TEST_F(LibraryTest, OptionsChannelInit) {
+ struct ares_options opts = {0};
+ int optmask = 0;
+ opts.flags = ARES_FLAG_USEVC | ARES_FLAG_PRIMARY;
+ optmask |= ARES_OPT_FLAGS;
+ opts.timeout = 2000;
+ optmask |= ARES_OPT_TIMEOUTMS;
+ opts.tries = 2;
+ optmask |= ARES_OPT_TRIES;
+ opts.ndots = 4;
+ optmask |= ARES_OPT_NDOTS;
+ opts.udp_port = 54;
+ optmask |= ARES_OPT_UDP_PORT;
+ opts.tcp_port = 54;
+ optmask |= ARES_OPT_TCP_PORT;
+ opts.socket_send_buffer_size = 514;
+ optmask |= ARES_OPT_SOCK_SNDBUF;
+ opts.socket_receive_buffer_size = 514;
+ optmask |= ARES_OPT_SOCK_RCVBUF;
+ opts.ednspsz = 1280;
+ optmask |= ARES_OPT_EDNSPSZ;
+ opts.nservers = 2;
+ opts.servers = (struct in_addr *)malloc(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[0] = strdup("example.com");
+ opts.domains[1] = strdup("example2.com");
+ optmask |= ARES_OPT_DOMAINS;
+ opts.lookups = strdup("b");
+ optmask |= ARES_OPT_LOOKUPS;
+ optmask |= ARES_OPT_ROTATE;
+ opts.resolvconf_path = strdup("/etc/resolv.conf");
+ optmask |= ARES_OPT_RESOLVCONF;
+
+ ares_channel channel = nullptr;
+ EXPECT_EQ(ARES_SUCCESS, ares_init_options(&channel, &opts, optmask));
+ EXPECT_NE(nullptr, channel);
+
+ ares_channel channel2 = nullptr;
+ EXPECT_EQ(ARES_SUCCESS, ares_dup(&channel2, channel));
+
+ struct ares_options opts2 = {0};
+ int optmask2 = 0;
+ EXPECT_EQ(ARES_SUCCESS, ares_save_options(channel2, &opts2, &optmask2));
+
+ // Note that not all opts-settable fields are saved (e.g.
+ // ednspsz, socket_{send,receive}_buffer_size).
+ EXPECT_EQ(opts.flags, opts2.flags);
+ EXPECT_EQ(opts.timeout, opts2.timeout);
+ EXPECT_EQ(opts.tries, opts2.tries);
+ EXPECT_EQ(opts.ndots, opts2.ndots);
+ 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
+ EXPECT_EQ(opts.servers[0].s_addr, opts2.servers[0].s_addr);
+ EXPECT_EQ(opts.ndomains, opts2.ndomains);
+ EXPECT_EQ(std::string(opts.domains[0]), std::string(opts2.domains[0]));
+ EXPECT_EQ(std::string(opts.domains[1]), std::string(opts2.domains[1]));
+ EXPECT_EQ(std::string(opts.lookups), std::string(opts2.lookups));
+ EXPECT_EQ(std::string(opts.resolvconf_path), std::string(opts2.resolvconf_path));
+
+ ares_destroy_options(&opts);
+ ares_destroy_options(&opts2);
+ ares_destroy(channel);
+ ares_destroy(channel2);
+}
+
+TEST_F(LibraryTest, ChannelAllocFail) {
+ ares_channel channel;
+ for (int ii = 1; ii <= 25; ii++) {
+ ClearFails();
+ SetAllocFail(ii);
+ channel = nullptr;
+ int rc = ares_init(&channel);
+ // The number of allocations depends on local environment, so don't expect ENOMEM.
+ if (rc == ARES_ENOMEM) {
+ EXPECT_EQ(nullptr, channel);
+ } else {
+ ares_destroy(channel);
+ }
+ }
+}
+
+TEST_F(LibraryTest, OptionsChannelAllocFail) {
+ struct ares_options opts = {0};
+ int optmask = 0;
+ opts.flags = ARES_FLAG_USEVC;
+ optmask |= ARES_OPT_FLAGS;
+ opts.timeout = 2;
+ optmask |= ARES_OPT_TIMEOUT;
+ opts.tries = 2;
+ optmask |= ARES_OPT_TRIES;
+ opts.ndots = 4;
+ optmask |= ARES_OPT_NDOTS;
+ opts.udp_port = 54;
+ optmask |= ARES_OPT_UDP_PORT;
+ opts.tcp_port = 54;
+ optmask |= ARES_OPT_TCP_PORT;
+ opts.socket_send_buffer_size = 514;
+ optmask |= ARES_OPT_SOCK_SNDBUF;
+ opts.socket_receive_buffer_size = 514;
+ optmask |= ARES_OPT_SOCK_RCVBUF;
+ opts.ednspsz = 1280;
+ optmask |= ARES_OPT_EDNSPSZ;
+ opts.nservers = 2;
+ opts.servers = (struct in_addr *)malloc(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[0] = strdup("example.com");
+ opts.domains[1] = strdup("example2.com");
+ optmask |= ARES_OPT_DOMAINS;
+ opts.lookups = strdup("b");
+ optmask |= ARES_OPT_LOOKUPS;
+ optmask |= ARES_OPT_ROTATE;
+ opts.resolvconf_path = strdup("/etc/resolv.conf");
+ optmask |= ARES_OPT_RESOLVCONF;
+
+ ares_channel channel = nullptr;
+ for (int ii = 1; ii <= 8; ii++) {
+ ClearFails();
+ SetAllocFail(ii);
+ int rc = ares_init_options(&channel, &opts, optmask);
+ if (rc == ARES_ENOMEM) {
+ EXPECT_EQ(nullptr, channel);
+ } else {
+ EXPECT_EQ(ARES_SUCCESS, rc);
+ ares_destroy(channel);
+ channel = nullptr;
+ }
+ }
+ ClearFails();
+
+ EXPECT_EQ(ARES_SUCCESS, ares_init_options(&channel, &opts, optmask));
+ EXPECT_NE(nullptr, channel);
+
+ // Add some servers and a sortlist for flavour.
+ 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"));
+ EXPECT_EQ(ARES_SUCCESS, ares_set_sortlist(channel, "1.2.3.4 2.3.4.5"));
+
+ ares_channel channel2 = nullptr;
+ for (int ii = 1; ii <= 18; ii++) {
+ ClearFails();
+ SetAllocFail(ii);
+ EXPECT_EQ(ARES_ENOMEM, ares_dup(&channel2, channel)) << ii;
+ EXPECT_EQ(nullptr, channel2) << ii;
+ }
+
+ struct ares_options opts2;
+ int optmask2 = 0;
+ for (int ii = 1; ii <= 6; ii++) {
+ memset(&opts2, 0, sizeof(opts2));
+ ClearFails();
+ SetAllocFail(ii);
+ EXPECT_EQ(ARES_ENOMEM, ares_save_options(channel, &opts2, &optmask2)) << ii;
+ // May still have allocations even after ARES_ENOMEM return code.
+ ares_destroy_options(&opts2);
+ }
+ ares_destroy_options(&opts);
+ ares_destroy(channel);
+}
+
+TEST_F(LibraryTest, FailChannelInit) {
+ EXPECT_EQ(ARES_SUCCESS,
+ ares_library_init_mem(ARES_LIB_INIT_ALL,
+ &LibraryTest::amalloc,
+ &LibraryTest::afree,
+ &LibraryTest::arealloc));
+ SetAllocFail(1);
+ ares_channel channel = nullptr;
+ EXPECT_EQ(ARES_ENOMEM, ares_init(&channel));
+ EXPECT_EQ(nullptr, channel);
+ ares_library_cleanup();
+}
+
+#ifndef WIN32
+TEST_F(LibraryTest, EnvInit) {
+ ares_channel 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, EnvInitYt) {
+ ares_channel channel = nullptr;
+ EnvValue v1("LOCALDOMAIN", "this.is.local");
+ EnvValue v2("RES_OPTIONS", "options debug timeout:5 attempts:6");
+ EXPECT_EQ(ARES_SUCCESS, ares_init(&channel));
+ struct ares_options opts;
+ int optmask = 0;
+ ares_save_options(channel, &opts, &optmask);
+ EXPECT_EQ(5000, opts.timeout);
+ EXPECT_EQ(6, opts.tries);
+ ares_destroy(channel);
+}
+
+TEST_F(LibraryTest, EnvInitYtTimeouts) {
+ ares_channel channel = nullptr;
+ EnvValue v1("LOCALDOMAIN", "this.is.local");
+ EnvValue v2("RES_OPTIONS", "options debug jitter:42 maxtimeout:10");
+ EXPECT_EQ(ARES_SUCCESS, ares_init(&channel));
+ struct ares_options opts;
+ int optmask = 0;
+ ares_save_options(channel, &opts, &optmask);
+ EXPECT_EQ(42, opts.jitter);
+ EXPECT_EQ(10000, opts.maxtimeout);
+ ares_destroy(channel);
+}
+
+TEST_F(LibraryTest, EnvInitAllocFail) {
+ ares_channel 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++) {
+ ClearFails();
+ SetAllocFail(ii);
+ channel = nullptr;
+ int rc = ares_init(&channel);
+ if (rc == ARES_SUCCESS) {
+ ares_destroy(channel);
+ } else {
+ EXPECT_EQ(ARES_ENOMEM, rc);
+ }
+ }
+}
+#endif
+
+TEST_F(DefaultChannelTest, SetAddresses) {
+ ares_set_local_ip4(channel_, 0x01020304);
+ byte addr6[16] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
+ 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10};
+ ares_set_local_ip6(channel_, addr6);
+ ares_set_local_dev(channel_, "dummy");
+}
+
+TEST_F(DefaultChannelTest, SetSortlistFailures) {
+ EXPECT_EQ(ARES_ENODATA, ares_set_sortlist(nullptr, "1.2.3.4"));
+ EXPECT_EQ(ARES_SUCCESS, ares_set_sortlist(channel_, "xyzzy ; lwk"));
+ EXPECT_EQ(ARES_SUCCESS, ares_set_sortlist(channel_, "xyzzy ; 0x123"));
+}
+
+TEST_F(DefaultChannelTest, SetSortlistVariants) {
+ EXPECT_EQ(ARES_SUCCESS, ares_set_sortlist(channel_, "1.2.3.4"));
+ EXPECT_EQ(ARES_SUCCESS, ares_set_sortlist(channel_, "1.2.3.4 ; 2.3.4.5"));
+ EXPECT_EQ(ARES_SUCCESS, ares_set_sortlist(channel_, "129.1.1.1"));
+ EXPECT_EQ(ARES_SUCCESS, ares_set_sortlist(channel_, "192.1.1.1"));
+ EXPECT_EQ(ARES_SUCCESS, ares_set_sortlist(channel_, "224.1.1.1"));
+ EXPECT_EQ(ARES_SUCCESS, ares_set_sortlist(channel_, "225.1.1.1"));
+}
+
+TEST_F(DefaultChannelTest, SetSortlistAllocFail) {
+ for (int ii = 1; ii <= 3; ii++) {
+ ClearFails();
+ SetAllocFail(ii);
+ EXPECT_EQ(ARES_ENOMEM, ares_set_sortlist(channel_, "12.13.0.0/16 1234::5678/40 1.2.3.4")) << ii;
+ }
+}
+
+#ifdef USE_WINSOCK
+TEST(Init, NoLibraryInit) {
+ ares_channel channel = nullptr;
+ EXPECT_EQ(ARES_ENOTINITIALIZED, ares_init(&channel));
+}
+#endif
+
+#ifdef HAVE_CONTAINER
+// These tests rely on the ability of non-root users to create a chroot
+// using Linux namespaces.
+
+
+// The library uses a variety of information sources to initialize a channel,
+// in particular to determine:
+// - search: the search domains to use
+// - servers: the name servers to use
+// - lookup: whether to check files or DNS or both (e.g. "fb")
+// - options: various resolver options
+// - sortlist: the order of preference for IP addresses
+//
+// The first source from the following list is used:
+// - init_by_options(): explicitly specified values in struct ares_options
+// - init_by_environment(): values from the environment:
+// - LOCALDOMAIN -> search (single value)
+// - RES_OPTIONS -> options
+// - init_by_resolv_conf(): values from various config files:
+// - /etc/resolv.conf -> search, lookup, servers, sortlist, options
+// - /etc/nsswitch.conf -> lookup
+// - /etc/host.conf -> lookup
+// - /etc/svc.conf -> lookup
+// - init_by_defaults(): fallback values:
+// - gethostname(3) -> domain
+// - "fb" -> lookup
+
+NameContentList filelist = {
+ {"/etc/resolv.conf", "nameserver 1.2.3.4\n"
+ "sortlist 1.2.3.4/16 2.3.4.5\n"
+ "search first.com second.com\n"},
+ {"/etc/hosts", "3.4.5.6 ahostname.com\n"},
+ {"/etc/nsswitch.conf", "hosts: files\n"}};
+CONTAINED_TEST_F(LibraryTest, ContainerChannelInit,
+ "myhostname", "mydomainname.org", filelist) {
+ ares_channel channel = nullptr;
+ EXPECT_EQ(ARES_SUCCESS, ares_init(&channel));
+ std::vector<std::string> actual = GetNameServers(channel);
+ std::vector<std::string> expected = {"1.2.3.4"};
+ 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);
+
+ HostResult result;
+ ares_gethostbyname(channel, "ahostname.com", AF_INET, HostCallback, &result);
+ ProcessWork(channel, NoExtraFDs, nullptr);
+ 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);
+ return HasFailure();
+}
+
+CONTAINED_TEST_F(LibraryTest, ContainerSortlistOptionInit,
+ "myhostname", "mydomainname.org", filelist) {
+ ares_channel channel = nullptr;
+ struct ares_options opts = {0};
+ int optmask = 0;
+ optmask |= ARES_OPT_SORTLIST;
+ opts.nsort = 0;
+ // 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);
+
+ ares_destroy(channel);
+ return HasFailure();
+}
+
+NameContentList fullresolv = {
+ {"/etc/resolv.conf", " nameserver 1.2.3.4 \n"
+ "search first.com second.com\n"
+ "lookup bind\n"
+ "options debug ndots:5\n"
+ "sortlist 1.2.3.4/16 2.3.4.5\n"}};
+CONTAINED_TEST_F(LibraryTest, ContainerFullResolvInit,
+ "myhostname", "mydomainname.org", fullresolv) {
+ ares_channel 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);
+
+ ares_destroy(channel);
+ return HasFailure();
+}
+
+// Allow path for resolv.conf to be configurable
+NameContentList myresolvconf = {
+ {"/tmp/myresolv.cnf", " nameserver 1.2.3.4 \n"
+ "search first.com second.com\n"
+ "lookup bind\n"
+ "options debug ndots:5\n"
+ "sortlist 1.2.3.4/16 2.3.4.5\n"}};
+CONTAINED_TEST_F(LibraryTest, ContainerMyResolvConfInit,
+ "myhostname", "mydomain.org", myresolvconf) {
+ char filename[] = "/tmp/myresolv.cnf";
+ ares_channel channel = nullptr;
+ struct ares_options options = {0};
+ options.resolvconf_path = strdup(filename);
+ int optmask = ARES_OPT_RESOLVCONF;
+ EXPECT_EQ(ARES_SUCCESS, ares_init_options(&channel, &options, optmask));
+
+ optmask = 0;
+ free(options.resolvconf_path);
+ options.resolvconf_path = NULL;
+
+ EXPECT_EQ(ARES_SUCCESS, ares_save_options(channel, &options, &optmask));
+ EXPECT_EQ(ARES_OPT_RESOLVCONF, (optmask & ARES_OPT_RESOLVCONF));
+ EXPECT_EQ(std::string(filename), std::string(options.resolvconf_path));
+
+ ares_destroy_options(&options);
+ ares_destroy(channel);
+ return HasFailure();
+}
+
+NameContentList hostconf = {
+ {"/etc/resolv.conf", "nameserver 1.2.3.4\n"
+ "sortlist1.2.3.4\n" // malformed line
+ "search first.com second.com\n"},
+ {"/etc/host.conf", "order bind hosts\n"}};
+CONTAINED_TEST_F(LibraryTest, ContainerHostConfInit,
+ "myhostname", "mydomainname.org", hostconf) {
+ ares_channel 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);
+
+ ares_destroy(channel);
+ return HasFailure();
+}
+
+NameContentList svcconf = {
+ {"/etc/resolv.conf", "nameserver 1.2.3.4\n"
+ "search first.com second.com\n"},
+ {"/etc/svc.conf", "hosts= bind\n"}};
+CONTAINED_TEST_F(LibraryTest, ContainerSvcConfInit,
+ "myhostname", "mydomainname.org", svcconf) {
+ ares_channel 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);
+
+ ares_destroy(channel);
+ return HasFailure();
+}
+
+NameContentList malformedresolvconflookup = {
+ {"/etc/resolv.conf", "nameserver 1.2.3.4\n"
+ "lookup garbage\n"}}; // malformed line
+CONTAINED_TEST_F(LibraryTest, ContainerMalformedResolvConfLookup,
+ "myhostname", "mydomainname.org", malformedresolvconflookup) {
+ ares_channel 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);
+
+ ares_destroy(channel);
+ return HasFailure();
+}
+
+// Failures when expected config filenames are inaccessible.
+class MakeUnreadable {
+ public:
+ explicit MakeUnreadable(const std::string& filename)
+ : filename_(filename) {
+ chmod(filename_.c_str(), 0000);
+ }
+ ~MakeUnreadable() { chmod(filename_.c_str(), 0644); }
+ private:
+ std::string filename_;
+};
+
+CONTAINED_TEST_F(LibraryTest, ContainerResolvConfNotReadable,
+ "myhostname", "mydomainname.org", filelist) {
+ ares_channel channel = nullptr;
+ MakeUnreadable hide("/etc/resolv.conf");
+ // Unavailable /etc/resolv.conf falls back to defaults
+ EXPECT_EQ(ARES_SUCCESS, ares_init(&channel));
+ return HasFailure();
+}
+CONTAINED_TEST_F(LibraryTest, ContainerNsswitchConfNotReadable,
+ "myhostname", "mydomainname.org", filelist) {
+ ares_channel 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);
+
+ ares_destroy(channel);
+ return HasFailure();
+}
+CONTAINED_TEST_F(LibraryTest, ContainerHostConfNotReadable,
+ "myhostname", "mydomainname.org", hostconf) {
+ ares_channel channel = nullptr;
+ // Unavailable /etc/host.conf falls back to defaults.
+ MakeUnreadable hide("/etc/host.conf");
+ EXPECT_EQ(ARES_SUCCESS, ares_init(&channel));
+ ares_destroy(channel);
+ return HasFailure();
+}
+CONTAINED_TEST_F(LibraryTest, ContainerSvcConfNotReadable,
+ "myhostname", "mydomainname.org", svcconf) {
+ ares_channel channel = nullptr;
+ // Unavailable /etc/svc.conf falls back to defaults.
+ MakeUnreadable hide("/etc/svc.conf");
+ EXPECT_EQ(ARES_SUCCESS, ares_init(&channel));
+ ares_destroy(channel);
+ return HasFailure();
+}
+
+NameContentList rotateenv = {
+ {"/etc/resolv.conf", "nameserver 1.2.3.4\n"
+ "search first.com second.com\n"
+ "options rotate\n"}};
+CONTAINED_TEST_F(LibraryTest, ContainerRotateInit,
+ "myhostname", "mydomainname.org", rotateenv) {
+ ares_channel 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);
+
+ ares_destroy(channel);
+ return HasFailure();
+}
+
+CONTAINED_TEST_F(LibraryTest, ContainerRotateOverride,
+ "myhostname", "mydomainname.org", rotateenv) {
+ ares_channel 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));
+ ares_destroy_options(&opts);
+
+ ares_destroy(channel);
+ return HasFailure();
+}
+
+// Test that blacklisted IPv6 resolves are ignored. They're filtered from any
+// source, so resolv.conf is as good as any.
+NameContentList blacklistedIpv6 = {
+ {"/etc/resolv.conf", " nameserver 254.192.1.1\n" // 0xfe.0xc0.0x01.0x01
+ " nameserver fec0::dead\n" // Blacklisted
+ " nameserver ffc0::c001\n" // Not blacklisted
+ " domain first.com\n"},
+ {"/etc/nsswitch.conf", "hosts: files\n"}};
+CONTAINED_TEST_F(LibraryTest, ContainerBlacklistedIpv6,
+ "myhostname", "mydomainname.org", blacklistedIpv6) {
+ ares_channel channel = nullptr;
+ EXPECT_EQ(ARES_SUCCESS, ares_init(&channel));
+ std::vector<std::string> actual = GetNameServers(channel);
+ std::vector<std::string> expected = {
+ "254.192.1.1",
+ "ffc0:0000:0000:0000:0000:0000:0000:c001"
+ };
+ 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);
+
+ ares_destroy(channel);
+ return HasFailure();
+}
+
+NameContentList multiresolv = {
+ {"/etc/resolv.conf", " nameserver 1::2 ; ;;\n"
+ " domain first.com\n"},
+ {"/etc/nsswitch.conf", "hosts: files\n"}};
+CONTAINED_TEST_F(LibraryTest, ContainerMultiResolvInit,
+ "myhostname", "mydomainname.org", multiresolv) {
+ ares_channel channel = nullptr;
+ EXPECT_EQ(ARES_SUCCESS, ares_init(&channel));
+ std::vector<std::string> actual = GetNameServers(channel);
+ std::vector<std::string> expected = {"0001:0000:0000:0000:0000:0000:0000:0002"};
+ 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);
+
+ ares_destroy(channel);
+ return HasFailure();
+}
+
+NameContentList systemdresolv = {
+ {"/etc/resolv.conf", "nameserver 1.2.3.4\n"
+ "domain first.com\n"},
+ {"/etc/nsswitch.conf", "hosts: junk resolve files\n"}};
+CONTAINED_TEST_F(LibraryTest, ContainerSystemdResolvInit,
+ "myhostname", "mydomainname.org", systemdresolv) {
+ ares_channel 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);
+
+ ares_destroy(channel);
+ return HasFailure();
+}
+
+NameContentList empty = {}; // no files
+CONTAINED_TEST_F(LibraryTest, ContainerEmptyInit,
+ "host.domain.org", "domain.org", empty) {
+ ares_channel channel = nullptr;
+ EXPECT_EQ(ARES_SUCCESS, ares_init(&channel));
+ std::vector<std::string> actual = GetNameServers(channel);
+ std::vector<std::string> expected = {"127.0.0.1"};
+ 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);
+
+
+ ares_destroy(channel);
+ return HasFailure();
+}
+
+#endif
+
+} // namespace test
+} // namespace ares
diff --git a/contrib/libs/c-ares/test/ares-test-internal.cc b/contrib/libs/c-ares/test/ares-test-internal.cc
new file mode 100644
index 0000000000..96d4edece5
--- /dev/null
+++ b/contrib/libs/c-ares/test/ares-test-internal.cc
@@ -0,0 +1,591 @@
+#include "ares-test.h"
+#include "dns-proto.h"
+
+#include <stdio.h>
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <fcntl.h>
+
+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_private.h"
+#include "bitncmp.h"
+
+#ifdef HAVE_ARPA_INET_H
+#include <arpa/inet.h>
+#endif
+#ifdef HAVE_SYS_UIO_H
+# include <sys/uio.h>
+#endif
+}
+
+#include <string>
+#include <vector>
+
+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
+
+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)));
+
+ // 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)));
+ // TODO(drysdale): check whether the next two tests should give -1.
+ EXPECT_EQ(0, ares_inet_net_pton(AF_INET6, "1234:1234:1234:1234:1234:1234:1234:1234:5678:5678", &a6, sizeof(a6)));
+ EXPECT_EQ(0, 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:002.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<RECV_TYPE_ARG2>(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/contrib/libs/c-ares/test/ares-test-live.cc b/contrib/libs/c-ares/test/ares-test-live.cc
new file mode 100644
index 0000000000..5510163e95
--- /dev/null
+++ b/contrib/libs/c-ares/test/ares-test-live.cc
@@ -0,0 +1,749 @@
+// 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
+// for varying local configurations.
+
+#include "ares-test.h"
+
+#ifdef HAVE_NETDB_H
+#include <netdb.h>
+#endif
+
+namespace ares {
+namespace test {
+
+// Use the address of Google's public DNS servers as example addresses that are
+// likely to be accessible everywhere/everywhen.
+unsigned char gdns_addr4[4] = {0x08, 0x08, 0x08, 0x08};
+unsigned char gdns_addr6[16] = {0x20, 0x01, 0x48, 0x60, 0x48, 0x60, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x88};
+
+MATCHER_P(IncludesAtLeastNumAddresses, n, "") {
+ if(!arg)
+ return false;
+ int cnt = 0;
+ for (const ares_addrinfo_node* ai = arg->nodes; ai != NULL; ai = ai->ai_next)
+ cnt++;
+ return cnt >= n;
+}
+
+MATCHER_P(OnlyIncludesAddrType, addrtype, "") {
+ if(!arg)
+ return false;
+ for (const ares_addrinfo_node* ai = arg->nodes; ai != NULL; ai = ai->ai_next)
+ if (ai->ai_family != addrtype)
+ return false;
+ return true;
+}
+
+MATCHER_P(IncludesAddrType, addrtype, "") {
+ if(!arg)
+ return false;
+ for (const ares_addrinfo_node* ai = arg->nodes; ai != NULL; ai = ai->ai_next)
+ if (ai->ai_family == addrtype)
+ return true;
+ return false;
+}
+
+//VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetAddrInfoV4) {
+ //struct ares_addrinfo_hints hints = {};
+ //hints.ai_family = AF_INET;
+ //AddrInfoResult result;
+ //ares_getaddrinfo(channel_, "www.google.com.", NULL, &hints, AddrInfoCallback, &result);
+ //Process();
+ //EXPECT_TRUE(result.done_);
+ //EXPECT_EQ(ARES_SUCCESS, result.status_);
+ //EXPECT_THAT(result.ai_, IncludesAtLeastNumAddresses(1));
+ //EXPECT_THAT(result.ai_, OnlyIncludesAddrType(AF_INET));
+//}
+
+//VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetAddrInfoV6) {
+ //struct ares_addrinfo_hints hints = {};
+ //hints.ai_family = AF_INET6;
+ //AddrInfoResult result;
+ //ares_getaddrinfo(channel_, "www.google.com.", NULL, &hints, AddrInfoCallback, &result);
+ //Process();
+ //EXPECT_TRUE(result.done_);
+ //EXPECT_EQ(ARES_SUCCESS, result.status_);
+ //EXPECT_THAT(result.ai_, IncludesAtLeastNumAddresses(1));
+ //EXPECT_THAT(result.ai_, OnlyIncludesAddrType(AF_INET6));
+//}
+
+//VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetAddrInfoUnspec) {
+ //struct ares_addrinfo_hints hints = {};
+ //hints.ai_family = AF_UNSPEC;
+ //AddrInfoResult result;
+ //ares_getaddrinfo(channel_, "www.google.com.", NULL, &hints, AddrInfoCallback, &result);
+ //Process();
+ //EXPECT_TRUE(result.done_);
+ //EXPECT_EQ(ARES_SUCCESS, result.status_);
+ //EXPECT_THAT(result.ai_, IncludesAtLeastNumAddresses(2));
+ //EXPECT_THAT(result.ai_, IncludesAddrType(AF_INET6));
+ //EXPECT_THAT(result.ai_, IncludesAddrType(AF_INET));
+//}
+
+VIRT_NONVIRT_TEST_F(DefaultChannelTest, DISABLED_LiveGetHostByNameV4) {
+ HostResult result;
+ ares_gethostbyname(channel_, "www.google.com.", AF_INET, HostCallback, &result);
+ Process();
+ EXPECT_TRUE(result.done_);
+ EXPECT_EQ(ARES_SUCCESS, result.status_);
+ EXPECT_LT(0, (int)result.host_.addrs_.size());
+ EXPECT_EQ(AF_INET, result.host_.addrtype_);
+}
+
+VIRT_NONVIRT_TEST_F(DefaultChannelTest, DISABLED_LiveGetHostByNameV6) {
+ HostResult result;
+ ares_gethostbyname(channel_, "www.google.com.", AF_INET6, HostCallback, &result);
+ Process();
+ EXPECT_TRUE(result.done_);
+ EXPECT_EQ(ARES_SUCCESS, result.status_);
+ EXPECT_LT(0, (int)result.host_.addrs_.size());
+ EXPECT_EQ(AF_INET6, result.host_.addrtype_);
+}
+
+VIRT_NONVIRT_TEST_F(DefaultChannelTest, DISABLED_LiveGetHostByAddrV4) {
+ HostResult result;
+ ares_gethostbyaddr(channel_, gdns_addr4, sizeof(gdns_addr4), AF_INET, HostCallback, &result);
+ Process();
+ EXPECT_TRUE(result.done_);
+ EXPECT_EQ(ARES_SUCCESS, result.status_);
+ EXPECT_LT(0, (int)result.host_.addrs_.size());
+ EXPECT_EQ(AF_INET, result.host_.addrtype_);
+}
+
+VIRT_NONVIRT_TEST_F(DefaultChannelTest, DISABLED_LiveGetHostByAddrV6) {
+ HostResult result;
+ ares_gethostbyaddr(channel_, gdns_addr6, sizeof(gdns_addr6), AF_INET6, HostCallback, &result);
+ Process();
+ EXPECT_TRUE(result.done_);
+ EXPECT_EQ(ARES_SUCCESS, result.status_);
+ EXPECT_LT(0, (int)result.host_.addrs_.size());
+ EXPECT_EQ(AF_INET6, result.host_.addrtype_);
+}
+
+VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetHostByNameFile) {
+ struct hostent *host = nullptr;
+
+ // Still need a channel even to query /etc/hosts.
+ EXPECT_EQ(ARES_ENOTFOUND,
+ ares_gethostbyname_file(nullptr, "localhost", AF_INET, &host));
+
+ int rc = ares_gethostbyname_file(channel_, "bogus.mcname", AF_INET, &host);
+ EXPECT_EQ(nullptr, host);
+ EXPECT_EQ(ARES_ENOTFOUND, rc);
+
+ rc = ares_gethostbyname_file(channel_, "localhost", AF_INET, &host);
+ if (rc == ARES_SUCCESS) {
+ EXPECT_NE(nullptr, host);
+ ares_free_hostent(host);
+ }
+}
+
+TEST_P(DefaultChannelModeTest, LiveGetLocalhostByNameV4) {
+ HostResult result;
+ ares_gethostbyname(channel_, "localhost", AF_INET, HostCallback, &result);
+ Process();
+ EXPECT_TRUE(result.done_);
+ if ((result.status_ != ARES_ENOTFOUND) && (result.status_ != ARES_ECONNREFUSED)) {
+ EXPECT_EQ(ARES_SUCCESS, result.status_);
+ EXPECT_EQ(1, (int)result.host_.addrs_.size());
+ EXPECT_EQ(AF_INET, result.host_.addrtype_);
+ EXPECT_NE(std::string::npos, result.host_.name_.find("localhost"));
+ }
+}
+
+TEST_P(DefaultChannelModeTest, LiveGetLocalhostByNameV6) {
+ HostResult result;
+ ares_gethostbyname(channel_, "localhost", AF_INET6, HostCallback, &result);
+ Process();
+ EXPECT_TRUE(result.done_);
+ if (result.status_ == ARES_SUCCESS) {
+ EXPECT_EQ(1, (int)result.host_.addrs_.size());
+ EXPECT_EQ(AF_INET6, result.host_.addrtype_);
+ std::stringstream ss;
+ ss << HostEnt(result.host_);
+ EXPECT_NE(std::string::npos, result.host_.name_.find("localhost"));
+ }
+}
+
+TEST_P(DefaultChannelModeTest, LiveGetLocalhostByNameIPV4) {
+ HostResult result;
+ ares_gethostbyname(channel_, "127.0.0.1", AF_INET, HostCallback, &result);
+ Process();
+ EXPECT_TRUE(result.done_);
+ EXPECT_EQ(ARES_SUCCESS, result.status_);
+ EXPECT_EQ(1, (int)result.host_.addrs_.size());
+ EXPECT_EQ(AF_INET, result.host_.addrtype_);
+ std::stringstream ss;
+ ss << HostEnt(result.host_);
+ EXPECT_EQ("{'127.0.0.1' aliases=[] addrs=[127.0.0.1]}", ss.str());
+}
+
+TEST_P(DefaultChannelModeTest, LiveGetLocalhostByNameIPV6) {
+ HostResult result;
+ ares_gethostbyname(channel_, "::1", AF_INET6, HostCallback, &result);
+ Process();
+ EXPECT_TRUE(result.done_);
+ if (result.status_ != ARES_ENOTFOUND) {
+ EXPECT_EQ(ARES_SUCCESS, result.status_);
+ EXPECT_EQ(1, (int)result.host_.addrs_.size());
+ EXPECT_EQ(AF_INET6, result.host_.addrtype_);
+ std::stringstream ss;
+ ss << HostEnt(result.host_);
+ EXPECT_EQ("{'::1' aliases=[] addrs=[0000:0000:0000:0000:0000:0000:0000:0001]}", ss.str());
+ }
+}
+
+TEST_P(DefaultChannelModeTest, LiveGetLocalhostFailFamily) {
+ HostResult result;
+ ares_gethostbyname(channel_, "127.0.0.1", AF_INET+AF_INET6, HostCallback, &result);
+ Process();
+ EXPECT_TRUE(result.done_);
+ EXPECT_EQ(ARES_ENOTIMP, result.status_);
+}
+
+TEST_P(DefaultChannelModeTest, LiveGetLocalhostByAddrV4) {
+ HostResult result;
+ struct in_addr addr;
+ addr.s_addr = htonl(INADDR_LOOPBACK);
+ ares_gethostbyaddr(channel_, &addr, sizeof(addr), AF_INET, HostCallback, &result);
+ Process();
+ EXPECT_TRUE(result.done_);
+ if (result.status_ != ARES_ENOTFOUND) {
+ EXPECT_EQ(ARES_SUCCESS, result.status_);
+ EXPECT_LT(0, (int)result.host_.addrs_.size());
+ EXPECT_EQ(AF_INET, result.host_.addrtype_);
+ // oddly, travis does not resolve to localhost, but a random hostname starting with travis-job
+ if (result.host_.name_.find("travis-job") == std::string::npos) {
+ EXPECT_NE(std::string::npos,
+ result.host_.name_.find("localhost"));
+ }
+ }
+}
+
+TEST_P(DefaultChannelModeTest, LiveGetLocalhostByAddrV6) {
+ HostResult result;
+ struct in6_addr addr;
+ memset(&addr, 0, sizeof(addr));
+ addr.s6_addr[15] = 1; // in6addr_loopback
+ ares_gethostbyaddr(channel_, &addr, sizeof(addr), AF_INET6, HostCallback, &result);
+ Process();
+ EXPECT_TRUE(result.done_);
+ if (result.status_ != ARES_ENOTFOUND) {
+ EXPECT_EQ(ARES_SUCCESS, result.status_);
+ EXPECT_LT(0, (int)result.host_.addrs_.size());
+ EXPECT_EQ(AF_INET6, result.host_.addrtype_);
+ const std::string& name = result.host_.name_;
+ EXPECT_TRUE(std::string::npos != name.find("localhost") ||
+ std::string::npos != name.find("ip6-loopback"));
+ }
+}
+
+TEST_P(DefaultChannelModeTest, LiveGetHostByAddrFailFamily) {
+ HostResult result;
+ unsigned char addr[4] = {8, 8, 8, 8};
+ ares_gethostbyaddr(channel_, addr, sizeof(addr), AF_INET6+AF_INET,
+ HostCallback, &result);
+ EXPECT_TRUE(result.done_);
+ EXPECT_EQ(ARES_ENOTIMP, result.status_);
+}
+
+TEST_P(DefaultChannelModeTest, LiveGetHostByAddrFailAddrSize) {
+ HostResult result;
+ unsigned char addr[4] = {8, 8, 8, 8};
+ ares_gethostbyaddr(channel_, addr, sizeof(addr) - 1, AF_INET,
+ HostCallback, &result);
+ EXPECT_TRUE(result.done_);
+ EXPECT_EQ(ARES_ENOTIMP, result.status_);
+}
+
+TEST_P(DefaultChannelModeTest, LiveGetHostByAddrFailAlloc) {
+ HostResult result;
+ unsigned char addr[4] = {8, 8, 8, 8};
+ SetAllocFail(1);
+ ares_gethostbyaddr(channel_, addr, sizeof(addr), AF_INET,
+ HostCallback, &result);
+ EXPECT_TRUE(result.done_);
+ EXPECT_EQ(ARES_ENOMEM, result.status_);
+}
+
+INSTANTIATE_TEST_CASE_P(Modes, DefaultChannelModeTest,
+ ::testing::Values("f", "b", "fb", "bf"));
+
+VIRT_NONVIRT_TEST_F(DefaultChannelTest, DISABLED_LiveSearchA) {
+ SearchResult result;
+ ares_search(channel_, "www.youtube.com.", ns_c_in, ns_t_a,
+ SearchCallback, &result);
+ Process();
+ EXPECT_TRUE(result.done_);
+ EXPECT_EQ(ARES_SUCCESS, result.status_);
+}
+
+VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveSearchEmptyA) {
+ SearchResult result;
+ ares_search(channel_, "", ns_c_in, ns_t_a,
+ SearchCallback, &result);
+ Process();
+ EXPECT_TRUE(result.done_);
+ EXPECT_NE(ARES_SUCCESS, result.status_);
+}
+
+VIRT_NONVIRT_TEST_F(DefaultChannelTest, DISABLED_LiveSearchNS) {
+ SearchResult result;
+ ares_search(channel_, "google.com.", ns_c_in, ns_t_ns,
+ SearchCallback, &result);
+ Process();
+ EXPECT_TRUE(result.done_);
+ EXPECT_EQ(ARES_SUCCESS, result.status_);
+}
+
+VIRT_NONVIRT_TEST_F(DefaultChannelTest, DISABLED_LiveSearchMX) {
+ SearchResult result;
+ ares_search(channel_, "google.com.", ns_c_in, ns_t_mx,
+ SearchCallback, &result);
+ Process();
+ EXPECT_TRUE(result.done_);
+ EXPECT_EQ(ARES_SUCCESS, result.status_);
+}
+
+VIRT_NONVIRT_TEST_F(DefaultChannelTest, DISABLED_LiveSearchTXT) {
+ SearchResult result;
+ ares_search(channel_, "google.com.", ns_c_in, ns_t_txt,
+ SearchCallback, &result);
+ Process();
+ EXPECT_TRUE(result.done_);
+ EXPECT_EQ(ARES_SUCCESS, result.status_);
+}
+
+VIRT_NONVIRT_TEST_F(DefaultChannelTest, DISABLED_LiveSearchSOA) {
+ SearchResult result;
+ ares_search(channel_, "google.com.", ns_c_in, ns_t_soa,
+ SearchCallback, &result);
+ Process();
+ EXPECT_TRUE(result.done_);
+ EXPECT_EQ(ARES_SUCCESS, result.status_);
+}
+
+VIRT_NONVIRT_TEST_F(DefaultChannelTest, DISABLED_LiveSearchSRV) {
+ SearchResult result;
+ ares_search(channel_, "_imap._tcp.gmail.com.", ns_c_in, ns_t_srv,
+ SearchCallback, &result);
+ Process();
+ EXPECT_TRUE(result.done_);
+ EXPECT_EQ(ARES_SUCCESS, result.status_);
+}
+
+VIRT_NONVIRT_TEST_F(DefaultChannelTest, DISABLED_LiveSearchANY) {
+ SearchResult result;
+ ares_search(channel_, "google.com.", ns_c_in, ns_t_any,
+ SearchCallback, &result);
+ Process();
+ EXPECT_TRUE(result.done_);
+ EXPECT_EQ(ARES_SUCCESS, result.status_);
+}
+
+VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetNameInfoV4) {
+ NameInfoResult result;
+ struct sockaddr_in sockaddr;
+ memset(&sockaddr, 0, sizeof(sockaddr));
+ sockaddr.sin_family = AF_INET;
+ sockaddr.sin_port = htons(53);
+ sockaddr.sin_addr.s_addr = htonl(0x08080808);
+ ares_getnameinfo(channel_, (const struct sockaddr*)&sockaddr, sizeof(sockaddr),
+ ARES_NI_LOOKUPHOST|ARES_NI_LOOKUPSERVICE|ARES_NI_UDP,
+ NameInfoCallback, &result);
+ Process();
+ EXPECT_TRUE(result.done_);
+ EXPECT_EQ(ARES_SUCCESS, result.status_);
+ if (verbose) std::cerr << "8.8.8.8:53 => " << result.node_ << "/" << result.service_ << std::endl;
+}
+
+VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetNameInfoV4NoPort) {
+ NameInfoResult result;
+ struct sockaddr_in sockaddr;
+ memset(&sockaddr, 0, sizeof(sockaddr));
+ sockaddr.sin_family = AF_INET;
+ sockaddr.sin_port = htons(0);
+ sockaddr.sin_addr.s_addr = htonl(0x08080808);
+ ares_getnameinfo(channel_, (const struct sockaddr*)&sockaddr, sizeof(sockaddr),
+ ARES_NI_LOOKUPHOST|ARES_NI_LOOKUPSERVICE|ARES_NI_UDP,
+ NameInfoCallback, &result);
+ Process();
+ EXPECT_TRUE(result.done_);
+ EXPECT_EQ(ARES_SUCCESS, result.status_);
+ if (verbose) std::cerr << "8.8.8.8:0 => " << result.node_ << "/" << result.service_ << std::endl;
+}
+
+VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetNameInfoV4UnassignedPort) {
+ NameInfoResult result;
+ struct sockaddr_in sockaddr;
+ memset(&sockaddr, 0, sizeof(sockaddr));
+ sockaddr.sin_family = AF_INET;
+ sockaddr.sin_port = htons(4); // Unassigned at IANA
+ sockaddr.sin_addr.s_addr = htonl(0x08080808);
+ ares_getnameinfo(channel_, (const struct sockaddr*)&sockaddr, sizeof(sockaddr),
+ ARES_NI_LOOKUPHOST|ARES_NI_LOOKUPSERVICE|ARES_NI_UDP,
+ NameInfoCallback, &result);
+ Process();
+ EXPECT_TRUE(result.done_);
+ EXPECT_EQ(ARES_SUCCESS, result.status_);
+ if (verbose) std::cerr << "8.8.8.8:4 => " << result.node_ << "/" << result.service_ << std::endl;
+}
+
+VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetNameInfoV6Both) {
+ NameInfoResult result;
+ struct sockaddr_in6 sockaddr;
+ memset(&sockaddr, 0, sizeof(sockaddr));
+ sockaddr.sin6_family = AF_INET6;
+ sockaddr.sin6_port = htons(53);
+ memcpy(sockaddr.sin6_addr.s6_addr, gdns_addr6, 16);
+ ares_getnameinfo(channel_, (const struct sockaddr*)&sockaddr, sizeof(sockaddr),
+ ARES_NI_TCP|ARES_NI_LOOKUPHOST|ARES_NI_LOOKUPSERVICE|ARES_NI_NOFQDN,
+ NameInfoCallback, &result);
+ Process();
+ EXPECT_TRUE(result.done_);
+ EXPECT_EQ(ARES_SUCCESS, result.status_);
+ if (verbose) std::cerr << "[2001:4860:4860::8888]:53 => " << result.node_ << "/" << result.service_ << std::endl;
+}
+
+VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetNameInfoV6Neither) {
+ NameInfoResult result;
+ struct sockaddr_in6 sockaddr;
+ memset(&sockaddr, 0, sizeof(sockaddr));
+ sockaddr.sin6_family = AF_INET6;
+ sockaddr.sin6_port = htons(53);
+ memcpy(sockaddr.sin6_addr.s6_addr, gdns_addr6, 16);
+ ares_getnameinfo(channel_, (const struct sockaddr*)&sockaddr, sizeof(sockaddr),
+ ARES_NI_TCP|ARES_NI_NOFQDN, // Neither specified => assume lookup host.
+ NameInfoCallback, &result);
+ Process();
+ EXPECT_TRUE(result.done_);
+ EXPECT_EQ(ARES_SUCCESS, result.status_);
+ if (verbose) std::cerr << "[2001:4860:4860::8888]:53 => " << result.node_ << "/" << result.service_ << std::endl;
+}
+
+VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetNameInfoV4Numeric) {
+ NameInfoResult result;
+ struct sockaddr_in sockaddr;
+ memset(&sockaddr, 0, sizeof(sockaddr));
+ sockaddr.sin_family = AF_INET;
+ sockaddr.sin_port = htons(53);
+ sockaddr.sin_addr.s_addr = htonl(0x08080808);
+ ares_getnameinfo(channel_, (const struct sockaddr*)&sockaddr, sizeof(sockaddr),
+ ARES_NI_LOOKUPHOST|ARES_NI_LOOKUPSERVICE|ARES_NI_TCP|ARES_NI_NUMERICHOST,
+ NameInfoCallback, &result);
+ Process();
+ EXPECT_TRUE(result.done_);
+ EXPECT_EQ(ARES_SUCCESS, result.status_);
+ EXPECT_EQ("8.8.8.8", result.node_);
+ if (verbose) std::cerr << "8.8.8.8:53 => " << result.node_ << "/" << result.service_ << std::endl;
+}
+
+VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetNameInfoV6Numeric) {
+ NameInfoResult result;
+ struct sockaddr_in6 sockaddr;
+ memset(&sockaddr, 0, sizeof(sockaddr));
+ sockaddr.sin6_family = AF_INET6;
+ sockaddr.sin6_port = htons(53);
+ memcpy(sockaddr.sin6_addr.s6_addr, gdns_addr6, 16);
+ ares_getnameinfo(channel_, (const struct sockaddr*)&sockaddr, sizeof(sockaddr),
+ ARES_NI_LOOKUPHOST|ARES_NI_LOOKUPSERVICE|ARES_NI_DCCP|ARES_NI_NUMERICHOST,
+ NameInfoCallback, &result);
+ Process();
+ EXPECT_TRUE(result.done_);
+ EXPECT_EQ(ARES_SUCCESS, result.status_);
+ EXPECT_EQ("2001:4860:4860::8888%0", result.node_);
+ if (verbose) std::cerr << "[2001:4860:4860::8888]:53 => " << result.node_ << "/" << result.service_ << std::endl;
+}
+
+VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetNameInfoV6LinkLocal) {
+ NameInfoResult result;
+ struct sockaddr_in6 sockaddr;
+ memset(&sockaddr, 0, sizeof(sockaddr));
+ sockaddr.sin6_family = AF_INET6;
+ sockaddr.sin6_port = htons(53);
+ unsigned char addr6[16] = {0xfe, 0x80, 0x01, 0x02, 0x01, 0x02, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x04};
+ memcpy(sockaddr.sin6_addr.s6_addr, addr6, 16);
+ ares_getnameinfo(channel_, (const struct sockaddr*)&sockaddr, sizeof(sockaddr),
+ ARES_NI_LOOKUPHOST|ARES_NI_LOOKUPSERVICE|ARES_NI_DCCP|ARES_NI_NUMERICHOST,
+ NameInfoCallback, &result);
+ Process();
+ EXPECT_TRUE(result.done_);
+ EXPECT_EQ(ARES_SUCCESS, result.status_);
+ EXPECT_EQ("fe80:102:102::304%0", result.node_);
+ if (verbose) std::cerr << "[fe80:102:102::304]:53 => " << result.node_ << "/" << result.service_ << std::endl;
+}
+
+VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetNameInfoV4NotFound) {
+ NameInfoResult result;
+ struct sockaddr_in sockaddr;
+ 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.
+ 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,
+ NameInfoCallback, &result);
+ Process();
+ EXPECT_TRUE(result.done_);
+ EXPECT_EQ(ARES_SUCCESS, result.status_);
+ EXPECT_EQ("192.0.2.0", result.node_);
+ if (verbose) std::cerr << "192.0.2.0:53 => " << result.node_ << "/" << result.service_ << std::endl;
+}
+
+VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetNameInfoV4NotFoundFail) {
+ NameInfoResult result;
+ struct sockaddr_in sockaddr;
+ 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.
+ 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,
+ NameInfoCallback, &result);
+ Process();
+ EXPECT_TRUE(result.done_);
+ EXPECT_EQ(ARES_ENOTFOUND, result.status_);
+}
+
+VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetNameInfoV6NotFound) {
+ NameInfoResult result;
+ struct sockaddr_in6 sockaddr;
+ memset(&sockaddr, 0, sizeof(sockaddr));
+ sockaddr.sin6_family = AF_INET6;
+ sockaddr.sin6_port = htons(53);
+ // 2001:db8::/32 is only supposed to be used in documentation.
+ unsigned char addr6[16] = {0x20, 0x01, 0x0d, 0xb8, 0x01, 0x02, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x04};
+ memcpy(sockaddr.sin6_addr.s6_addr, addr6, 16);
+ ares_getnameinfo(channel_, (const struct sockaddr*)&sockaddr, sizeof(sockaddr),
+ ARES_NI_LOOKUPHOST|ARES_NI_LOOKUPSERVICE|ARES_NI_UDP,
+ NameInfoCallback, &result);
+ Process();
+ EXPECT_TRUE(result.done_);
+ EXPECT_EQ(ARES_SUCCESS, result.status_);
+ EXPECT_EQ("2001:db8:102::304%0", result.node_);
+ if (verbose) std::cerr << "[2001:db8:102::304]:53 => " << result.node_ << "/" << result.service_ << std::endl;
+}
+
+VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetNameInvalidFamily) {
+ NameInfoResult result;
+ struct sockaddr_in6 sockaddr;
+ memset(&sockaddr, 0, sizeof(sockaddr));
+ sockaddr.sin6_family = AF_INET6 + AF_INET;
+ sockaddr.sin6_port = htons(53);
+ memcpy(sockaddr.sin6_addr.s6_addr, gdns_addr6, 16);
+ ares_getnameinfo(channel_, (const struct sockaddr*)&sockaddr, sizeof(sockaddr),
+ ARES_NI_LOOKUPHOST|ARES_NI_LOOKUPSERVICE|ARES_NI_UDP,
+ NameInfoCallback, &result);
+ Process();
+ EXPECT_TRUE(result.done_);
+ EXPECT_EQ(ARES_ENOTIMP, result.status_);
+}
+
+VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetNameInvalidFlags) {
+ NameInfoResult result;
+ struct sockaddr_in6 sockaddr;
+ memset(&sockaddr, 0, sizeof(sockaddr));
+ sockaddr.sin6_family = AF_INET6;
+ sockaddr.sin6_port = htons(53);
+ memcpy(sockaddr.sin6_addr.s6_addr, gdns_addr6, 16);
+ // Ask for both a name-required, and a numeric host.
+ ares_getnameinfo(channel_, (const struct sockaddr*)&sockaddr, sizeof(sockaddr),
+ ARES_NI_LOOKUPHOST|ARES_NI_LOOKUPSERVICE|ARES_NI_UDP|ARES_NI_NUMERICHOST|ARES_NI_NAMEREQD,
+ NameInfoCallback, &result);
+ Process();
+ EXPECT_TRUE(result.done_);
+ EXPECT_EQ(ARES_EBADFLAGS, result.status_);
+}
+
+VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetServiceInfo) {
+ NameInfoResult result;
+ struct sockaddr_in sockaddr;
+ memset(&sockaddr, 0, sizeof(sockaddr));
+ sockaddr.sin_family = AF_INET;
+ sockaddr.sin_port = htons(53);
+ sockaddr.sin_addr.s_addr = htonl(0x08080808);
+ // Just look up service info
+ ares_getnameinfo(channel_, (const struct sockaddr*)&sockaddr, sizeof(sockaddr),
+ ARES_NI_LOOKUPSERVICE|ARES_NI_SCTP,
+ NameInfoCallback, &result);
+ Process();
+ EXPECT_TRUE(result.done_);
+ EXPECT_EQ(ARES_SUCCESS, result.status_);
+ EXPECT_EQ("", result.node_);
+}
+
+VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetServiceInfoNumeric) {
+ NameInfoResult result;
+ struct sockaddr_in sockaddr;
+ memset(&sockaddr, 0, sizeof(sockaddr));
+ sockaddr.sin_family = AF_INET;
+ sockaddr.sin_port = htons(53);
+ sockaddr.sin_addr.s_addr = htonl(0x08080808);
+ // Just look up service info
+ ares_getnameinfo(channel_, (const struct sockaddr*)&sockaddr, sizeof(sockaddr),
+ ARES_NI_LOOKUPSERVICE|ARES_NI_SCTP|ARES_NI_NUMERICSERV,
+ NameInfoCallback, &result);
+ Process();
+ EXPECT_TRUE(result.done_);
+ EXPECT_EQ(ARES_SUCCESS, result.status_);
+ EXPECT_EQ("", result.node_);
+ EXPECT_EQ("53", result.service_);
+}
+
+VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetNameInfoAllocFail) {
+ NameInfoResult result;
+ struct sockaddr_in sockaddr;
+ memset(&sockaddr, 0, sizeof(sockaddr));
+ sockaddr.sin_family = AF_INET;
+ sockaddr.sin_port = htons(53);
+ sockaddr.sin_addr.s_addr = htonl(0x08080808);
+ SetAllocFail(1);
+ ares_getnameinfo(channel_, (const struct sockaddr*)&sockaddr, sizeof(sockaddr),
+ ARES_NI_LOOKUPHOST|ARES_NI_LOOKUPSERVICE|ARES_NI_UDP,
+ NameInfoCallback, &result);
+ Process();
+ EXPECT_TRUE(result.done_);
+ EXPECT_EQ(ARES_ENOMEM, result.status_);
+}
+
+VIRT_NONVIRT_TEST_F(DefaultChannelTest, DISABLED_GetSock) {
+ ares_socket_t socks[3] = {ARES_SOCKET_BAD, ARES_SOCKET_BAD, ARES_SOCKET_BAD};
+ int bitmask = ares_getsock(channel_, socks, 3);
+ EXPECT_EQ(0, bitmask);
+ bitmask = ares_getsock(channel_, nullptr, 0);
+ EXPECT_EQ(0, bitmask);
+
+ // Ask again with a pending query.
+ HostResult result;
+ ares_gethostbyname(channel_, "www.google.com.", AF_INET, HostCallback, &result);
+ bitmask = ares_getsock(channel_, socks, 3);
+ EXPECT_NE(0, bitmask);
+ bitmask = ares_getsock(channel_, nullptr, 0);
+ EXPECT_EQ(0, bitmask);
+
+ Process();
+}
+
+TEST_F(LibraryTest, DISABLED_GetTCPSock) {
+ ares_channel channel;
+ struct ares_options opts = {0};
+ opts.tcp_port = 53;
+ opts.flags = ARES_FLAG_USEVC;
+ int optmask = ARES_OPT_TCP_PORT | ARES_OPT_FLAGS;
+ EXPECT_EQ(ARES_SUCCESS, ares_init_options(&channel, &opts, optmask));
+ EXPECT_NE(nullptr, channel);
+
+ ares_socket_t socks[3] = {ARES_SOCKET_BAD, ARES_SOCKET_BAD, ARES_SOCKET_BAD};
+ int bitmask = ares_getsock(channel, socks, 3);
+ EXPECT_EQ(0, bitmask);
+ bitmask = ares_getsock(channel, nullptr, 0);
+ EXPECT_EQ(0, bitmask);
+
+ // Ask again with a pending query.
+ HostResult result;
+ ares_gethostbyname(channel, "www.google.com.", AF_INET, HostCallback, &result);
+ bitmask = ares_getsock(channel, socks, 3);
+ EXPECT_NE(0, bitmask);
+ bitmask = ares_getsock(channel, nullptr, 0);
+ EXPECT_EQ(0, bitmask);
+
+ ProcessWork(channel, NoExtraFDs, nullptr);
+
+ ares_destroy(channel);
+}
+
+TEST_F(DefaultChannelTest, VerifySocketFunctionCallback) {
+ VirtualizeIO vio(channel_);
+
+ auto my_functions = VirtualizeIO::default_functions;
+ size_t count = 0;
+
+ my_functions.asocket = [](int af, int type, int protocol, void * p) {
+ EXPECT_NE(nullptr, p);
+ (*reinterpret_cast<size_t *>(p))++;
+ return ::socket(af, type, protocol);
+ };
+
+ ares_set_socket_functions(channel_, &my_functions, &count);
+
+ {
+ count = 0;
+ HostResult result;
+ ares_gethostbyname(channel_, "www.google.com.", AF_INET, HostCallback, &result);
+ Process();
+ EXPECT_TRUE(result.done_);
+ EXPECT_NE(0, count);
+ }
+
+ {
+ count = 0;
+ ares_channel copy;
+ EXPECT_EQ(ARES_SUCCESS, ares_dup(&copy, 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);
+ }
+
+}
+
+TEST_F(DefaultChannelTest, LiveSetServers) {
+ struct ares_addr_node server1;
+ struct ares_addr_node server2;
+ server1.next = &server2;
+ server1.family = AF_INET;
+ server1.addr.addr4.s_addr = htonl(0x01020304);
+ server2.next = nullptr;
+ 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));
+ ares_cancel(channel_);
+}
+
+TEST_F(DefaultChannelTest, LiveSetServersPorts) {
+ struct ares_addr_port_node server1;
+ struct ares_addr_port_node server2;
+ server1.next = &server2;
+ server1.family = AF_INET;
+ server1.addr.addr4.s_addr = htonl(0x01020304);
+ server1.udp_port = 111;
+ server1.tcp_port = 111;
+ server2.next = nullptr;
+ server2.family = AF_INET;
+ server2.addr.addr4.s_addr = htonl(0x02030405);
+ server2.udp_port = 0;
+ server2.tcp_port = 0;;
+ EXPECT_EQ(ARES_ENODATA, ares_set_servers_ports(nullptr, &server1));
+
+ // 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_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"));
+ ares_cancel(channel_);
+}
+
+
+} // namespace test
+} // namespace ares
diff --git a/contrib/libs/c-ares/test/ares-test-misc.cc b/contrib/libs/c-ares/test/ares-test-misc.cc
new file mode 100644
index 0000000000..6fc28a8f97
--- /dev/null
+++ b/contrib/libs/c-ares/test/ares-test-misc.cc
@@ -0,0 +1,526 @@
+#include "ares-test.h"
+#include "dns-proto.h"
+
+#include <string>
+#include <vector>
+
+namespace ares {
+namespace test {
+
+TEST_F(DefaultChannelTest, GetServers) {
+ std::vector<std::string> servers = GetNameServers(channel_);
+ if (verbose) {
+ for (const std::string& server : servers) {
+ std::cerr << "Nameserver: " << server << std::endl;
+ }
+ }
+}
+
+TEST_F(DefaultChannelTest, GetServersFailures) {
+ EXPECT_EQ(ARES_SUCCESS,
+ ares_set_servers_csv(channel_, "1.2.3.4,2.3.4.5"));
+ struct ares_addr_node* servers = nullptr;
+ SetAllocFail(1);
+ EXPECT_EQ(ARES_ENOMEM, ares_get_servers(channel_, &servers));
+ SetAllocFail(2);
+ EXPECT_EQ(ARES_ENOMEM, ares_get_servers(channel_, &servers));
+ EXPECT_EQ(ARES_ENODATA, ares_get_servers(nullptr, &servers));
+}
+
+TEST_F(DefaultChannelTest, SetServers) {
+ EXPECT_EQ(ARES_SUCCESS, ares_set_servers(channel_, nullptr));
+ std::vector<std::string> empty;
+ EXPECT_EQ(empty, GetNameServers(channel_));
+
+ struct ares_addr_node server1;
+ struct ares_addr_node server2;
+ server1.next = &server2;
+ server1.family = AF_INET;
+ server1.addr.addr4.s_addr = htonl(0x01020304);
+ server2.next = nullptr;
+ server2.family = AF_INET;
+ server2.addr.addr4.s_addr = htonl(0x02030405);
+ EXPECT_EQ(ARES_ENODATA, ares_set_servers(nullptr, &server1));
+
+ EXPECT_EQ(ARES_SUCCESS, ares_set_servers(channel_, &server1));
+ std::vector<std::string> expected = {"1.2.3.4", "2.3.4.5"};
+ EXPECT_EQ(expected, GetNameServers(channel_));
+}
+
+TEST_F(DefaultChannelTest, SetServersPorts) {
+ EXPECT_EQ(ARES_SUCCESS, ares_set_servers_ports(channel_, nullptr));
+ std::vector<std::string> empty;
+ EXPECT_EQ(empty, GetNameServers(channel_));
+
+ struct ares_addr_port_node server1;
+ struct ares_addr_port_node server2;
+ server1.next = &server2;
+ server1.family = AF_INET;
+ server1.addr.addr4.s_addr = htonl(0x01020304);
+ server1.udp_port = 111;
+ server1.tcp_port = 111;
+ server2.next = nullptr;
+ server2.family = AF_INET;
+ server2.addr.addr4.s_addr = htonl(0x02030405);
+ server2.udp_port = 0;
+ server2.tcp_port = 0;;
+ EXPECT_EQ(ARES_ENODATA, ares_set_servers_ports(nullptr, &server1));
+
+ EXPECT_EQ(ARES_SUCCESS, ares_set_servers_ports(channel_, &server1));
+ std::vector<std::string> expected = {"1.2.3.4:111", "2.3.4.5"};
+ EXPECT_EQ(expected, GetNameServers(channel_));
+}
+
+TEST_F(DefaultChannelTest, SetServersCSV) {
+ EXPECT_EQ(ARES_ENODATA, ares_set_servers_csv(nullptr, "1.2.3.4"));
+ EXPECT_EQ(ARES_ENODATA, ares_set_servers_csv(nullptr, "xyzzy,plugh"));
+ EXPECT_EQ(ARES_ENODATA, ares_set_servers_csv(nullptr, "256.1.2.3"));
+ 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"));
+
+ 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<std::string> expected = {"1.2.3.4", "0102:0304:0506:0708:0910:1112:1314:1516", "2.3.4.5"};
+ 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"));
+
+ // Same, with ports
+ EXPECT_EQ(ARES_SUCCESS,
+ ares_set_servers_csv(channel_, "1.2.3.4:54,[0102:0304:0506:0708:0910:1112:1314:1516]:80,2.3.4.5:55"));
+ EXPECT_EQ(expected, GetNameServers(channel_));
+ EXPECT_EQ(ARES_SUCCESS,
+ ares_set_servers_ports_csv(channel_, "1.2.3.4:54,[0102:0304:0506:0708:0910:1112:1314:1516]:80,2.3.4.5:55"));
+ std::vector<std::string> expected2 = {"1.2.3.4:54", "[0102:0304:0506:0708:0910:1112:1314:1516]:80", "2.3.4.5:55"};
+ EXPECT_EQ(expected2, GetNameServers(channel_));
+
+ // Should survive duplication
+ ares_channel channel2;
+ EXPECT_EQ(ARES_SUCCESS, ares_dup(&channel2, channel_));
+ EXPECT_EQ(expected2, GetNameServers(channel2));
+ ares_destroy(channel2);
+
+ // Allocation failure cases
+ for (int fail = 1; fail <= 5; fail++) {
+ SetAllocFail(fail);
+ EXPECT_EQ(ARES_ENOMEM,
+ 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<std::string> 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"));
+}
+
+TEST_F(DefaultChannelTest, TimeoutValue) {
+ struct timeval tinfo;
+ tinfo.tv_sec = 0;
+ tinfo.tv_usec = 0;
+ struct timeval tmax;
+ tmax.tv_sec = 0;
+ tmax.tv_usec = 10;
+ struct timeval* pt;
+
+ // No timers => get max back.
+ pt = ares_timeout(channel_, &tmax, &tinfo);
+ EXPECT_EQ(&tmax, pt);
+ EXPECT_EQ(0, pt->tv_sec);
+ EXPECT_EQ(10, pt->tv_usec);
+
+ pt = ares_timeout(channel_, nullptr, &tinfo);
+ EXPECT_EQ(nullptr, pt);
+
+ HostResult result;
+ ares_gethostbyname(channel_, "www.google.com.", AF_INET, HostCallback, &result);
+
+ // Now there's a timer running.
+ pt = ares_timeout(channel_, &tmax, &tinfo);
+ EXPECT_EQ(&tmax, pt);
+ EXPECT_EQ(0, pt->tv_sec);
+ EXPECT_EQ(10, pt->tv_usec);
+
+ tmax.tv_sec = 100;
+ pt = ares_timeout(channel_, &tmax, &tinfo);
+ EXPECT_EQ(&tinfo, pt);
+
+ pt = ares_timeout(channel_, nullptr, &tinfo);
+ EXPECT_EQ(&tinfo, pt);
+
+ Process();
+}
+
+TEST_F(LibraryTest, InetNtoP) {
+ struct in_addr addr;
+ addr.s_addr = htonl(0x01020304);
+ char buffer[256];
+ EXPECT_EQ(buffer, ares_inet_ntop(AF_INET, &addr, buffer, sizeof(buffer)));
+ EXPECT_EQ("1.2.3.4", std::string(buffer));
+}
+
+TEST_F(LibraryTest, Mkquery) {
+ byte* p;
+ int len;
+ ares_mkquery("example.com", ns_c_in, ns_t_a, 0x1234, 0, &p, &len);
+ std::vector<byte> data(p, p + len);
+ ares_free_string(p);
+
+ std::string actual = PacketToString(data);
+ DNSPacket pkt;
+ pkt.set_qid(0x1234).add_question(new DNSQuestion("example.com", ns_t_a));
+ std::string expected = PacketToString(pkt.data());
+ EXPECT_EQ(expected, actual);
+}
+
+TEST_F(LibraryTest, CreateQuery) {
+ byte* p;
+ int len;
+ EXPECT_EQ(ARES_SUCCESS,
+ ares_create_query("exam\\@le.com", ns_c_in, ns_t_a, 0x1234, 0,
+ &p, &len, 0));
+ std::vector<byte> 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", ns_t_a));
+ std::string expected = PacketToString(pkt.data());
+ EXPECT_EQ(expected, actual);
+}
+
+TEST_F(LibraryTest, CreateQueryTrailingEscapedDot) {
+ byte* p;
+ int len;
+ EXPECT_EQ(ARES_SUCCESS,
+ ares_create_query("example.com\\.", ns_c_in, ns_t_a, 0x1234, 0,
+ &p, &len, 0));
+ std::vector<byte> data(p, p + len);
+ ares_free_string(p);
+
+ std::string actual = PacketToString(data);
+ EXPECT_EQ("REQ QRY Q:{'example.com\\.' IN A}", actual);
+}
+
+TEST_F(LibraryTest, CreateQueryNameTooLong) {
+ byte* p;
+ int len;
+ EXPECT_EQ(ARES_EBADNAME,
+ ares_create_query(
+ "a1234567890123456789.b1234567890123456789.c1234567890123456789.d1234567890123456789."
+ "a1234567890123456789.b1234567890123456789.c1234567890123456789.d1234567890123456789."
+ "a1234567890123456789.b1234567890123456789.c1234567890123456789.d1234567890123456789."
+ "x1234567890123456789.y1234567890123456789.",
+ ns_c_in, ns_t_a, 0x1234, 0, &p, &len, 0));
+}
+
+TEST_F(LibraryTest, CreateQueryFailures) {
+ byte* p;
+ int len;
+ // RC1035 has a 255 byte limit on names.
+ std::string longname;
+ for (int ii = 0; ii < 17; ii++) {
+ longname += "fedcba9876543210";
+ }
+ p = nullptr;
+ EXPECT_EQ(ARES_EBADNAME,
+ ares_create_query(longname.c_str(), ns_c_in, ns_t_a, 0x1234, 0,
+ &p, &len, 0));
+ if (p) ares_free_string(p);
+
+ SetAllocFail(1);
+
+ p = nullptr;
+ EXPECT_EQ(ARES_ENOMEM,
+ ares_create_query("example.com", ns_c_in, ns_t_a, 0x1234, 0,
+ &p, &len, 0));
+ if (p) ares_free_string(p);
+
+ // 63-char limit on a single label
+ std::string longlabel = "a.a123456789b123456789c123456789d123456789e123456789f123456789g123456789.org";
+ p = nullptr;
+ EXPECT_EQ(ARES_EBADNAME,
+ ares_create_query(longlabel.c_str(), ns_c_in, ns_t_a, 0x1234, 0,
+ &p, &len, 0));
+ if (p) ares_free_string(p);
+
+ // Empty non-terminal label
+ p = nullptr;
+ EXPECT_EQ(ARES_EBADNAME,
+ ares_create_query("example..com", ns_c_in, ns_t_a, 0x1234, 0,
+ &p, &len, 0));
+ if (p) ares_free_string(p);
+}
+
+TEST_F(LibraryTest, CreateQueryOnionDomain) {
+ byte* p;
+ int len;
+ EXPECT_EQ(ARES_ENOTFOUND,
+ ares_create_query("dontleak.onion", ns_c_in, ns_t_a, 0x1234, 0,
+ &p, &len, 0));
+}
+
+TEST_F(DefaultChannelTest, HostByNameOnionDomain) {
+ HostResult result;
+ ares_gethostbyname(channel_, "dontleak.onion", AF_INET, HostCallback, &result);
+ EXPECT_TRUE(result.done_);
+ EXPECT_EQ(ARES_ENOTFOUND, result.status_);
+}
+
+TEST_F(DefaultChannelTest, HostByNameFileOnionDomain) {
+ struct hostent *h;
+ EXPECT_EQ(ARES_ENOTFOUND,
+ ares_gethostbyname_file(channel_, "dontleak.onion", AF_INET, &h));
+}
+
+TEST_F(DefaultChannelTest, GetAddrinfoOnionDomain) {
+ AddrInfoResult result;
+ struct ares_addrinfo_hints hints = {};
+ hints.ai_family = AF_UNSPEC;
+ ares_getaddrinfo(channel_, "dontleak.onion", NULL, &hints, AddrInfoCallback, &result);
+ EXPECT_TRUE(result.done_);
+ EXPECT_EQ(ARES_ENOTFOUND, result.status_);
+}
+
+// Interesting question: should tacking on a search domain let the query
+// through? It seems safer to reject it because "supersecret.onion.search"
+// still leaks information about the query to malicious resolvers.
+TEST_F(DefaultChannelTest, SearchOnionDomain) {
+ SearchResult result;
+ ares_search(channel_, "dontleak.onion", ns_c_in, ns_t_a,
+ SearchCallback, &result);
+ EXPECT_TRUE(result.done_);
+ EXPECT_EQ(ARES_ENOTFOUND, result.status_);
+}
+
+TEST_F(DefaultChannelTest, SendFailure) {
+ unsigned char buf[2];
+ SearchResult result;
+ ares_send(channel_, buf, sizeof(buf), SearchCallback, &result);
+ EXPECT_TRUE(result.done_);
+ EXPECT_EQ(ARES_EBADQUERY, result.status_);
+}
+
+std::string ExpandName(const std::vector<byte>& data, int offset,
+ long *enclen) {
+ char *name = nullptr;
+ int rc = ares_expand_name(data.data() + offset, data.data(), data.size(),
+ &name, enclen);
+ EXPECT_EQ(ARES_SUCCESS, rc);
+ std::string result;
+ if (rc == ARES_SUCCESS) {
+ result = name;
+ } else {
+ result = "<error>";
+ }
+ ares_free_string(name);
+ return result;
+}
+
+TEST_F(LibraryTest, ExpandName) {
+ long enclen;
+ std::vector<byte> 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);
+
+ std::vector<byte> data2 = {0};
+ EXPECT_EQ("", ExpandName(data2, 0, &enclen));
+ EXPECT_EQ(1, enclen);
+
+ // Complete name indirection
+ std::vector<byte> data3 = {0x12, 0x23,
+ 3, 'd', 'e', 'f', 0,
+ 0xC0, 2};
+ EXPECT_EQ("def", ExpandName(data3, 2, &enclen));
+ EXPECT_EQ(5, enclen);
+ EXPECT_EQ("def", ExpandName(data3, 7, &enclen));
+ EXPECT_EQ(2, enclen);
+
+ // One label then indirection
+ std::vector<byte> data4 = {0x12, 0x23,
+ 3, 'd', 'e', 'f', 0,
+ 1, 'a', 0xC0, 2};
+ EXPECT_EQ("def", ExpandName(data4, 2, &enclen));
+ EXPECT_EQ(5, enclen);
+ EXPECT_EQ("a.def", ExpandName(data4, 7, &enclen));
+ EXPECT_EQ(4, enclen);
+
+ // Two labels then indirection
+ std::vector<byte> data5 = {0x12, 0x23,
+ 3, 'd', 'e', 'f', 0,
+ 1, 'a', 1, 'b', 0xC0, 2};
+ EXPECT_EQ("def", ExpandName(data5, 2, &enclen));
+ EXPECT_EQ(5, enclen);
+ EXPECT_EQ("a.b.def", ExpandName(data5, 7, &enclen));
+ EXPECT_EQ(6, enclen);
+
+ // Empty name, indirection to empty name
+ std::vector<byte> data6 = {0x12, 0x23,
+ 0,
+ 0xC0, 2};
+ EXPECT_EQ("", ExpandName(data6, 2, &enclen));
+ EXPECT_EQ(1, enclen);
+ EXPECT_EQ("", ExpandName(data6, 3, &enclen));
+ EXPECT_EQ(2, enclen);
+}
+
+TEST_F(LibraryTest, ExpandNameFailure) {
+ std::vector<byte> data1 = {0x03, 'c', 'o', 'm', 0x00};
+ char *name = nullptr;
+ long enclen;
+ SetAllocFail(1);
+ EXPECT_EQ(ARES_ENOMEM,
+ ares_expand_name(data1.data(), data1.data(), data1.size(),
+ &name, &enclen));
+
+ // Empty packet
+ EXPECT_EQ(ARES_EBADNAME,
+ ares_expand_name(data1.data(), data1.data(), 0, &name, &enclen));
+
+ // Start beyond enclosing data
+ EXPECT_EQ(ARES_EBADNAME,
+ ares_expand_name(data1.data() + data1.size(), data1.data(), data1.size(),
+ &name, &enclen));
+
+ // Length beyond size of enclosing data
+ std::vector<byte> data2a = {0x13, 'c', 'o', 'm', 0x00};
+ EXPECT_EQ(ARES_EBADNAME,
+ ares_expand_name(data2a.data(), data2a.data(), data2a.size(),
+ &name, &enclen));
+ std::vector<byte> data2b = {0x1};
+ EXPECT_EQ(ARES_EBADNAME,
+ ares_expand_name(data2b.data(), data2b.data(), data2b.size(),
+ &name, &enclen));
+ std::vector<byte> data2c = {0xC0};
+ EXPECT_EQ(ARES_EBADNAME,
+ ares_expand_name(data2c.data(), data2c.data(), data2c.size(),
+ &name, &enclen));
+
+ // Indirection beyond enclosing data
+ std::vector<byte> data3a = {0xC0, 0x02};
+ EXPECT_EQ(ARES_EBADNAME,
+ ares_expand_name(data3a.data(), data3a.data(), data3a.size(),
+ &name, &enclen));
+ std::vector<byte> data3b = {0xC0, 0x0A, 'c', 'o', 'm', 0x00};
+ EXPECT_EQ(ARES_EBADNAME,
+ ares_expand_name(data3b.data(), data3b.data(), data3b.size(),
+ &name, &enclen));
+
+ // Invalid top bits in label length
+ std::vector<byte> data4 = {0x03, 'c', 'o', 'm', 0x00, 0x80, 0x00};
+ EXPECT_EQ(ARES_EBADNAME,
+ ares_expand_name(data4.data() + 5, data4.data(), data4.size(),
+ &name, &enclen));
+
+ // Label too long: 64-byte label, with invalid top 2 bits of length (01).
+ std::vector<byte> data5 = {0x40,
+ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f',
+ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f',
+ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f',
+ '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(),
+ &name, &enclen)) << name;
+
+ // Incomplete indirect length
+ std::vector<byte> data6 = {0x03, 'c', 'o', 'm', 0x00, 0xC0};
+ EXPECT_EQ(ARES_EBADNAME,
+ ares_expand_name(data6.data() + 5, data6.data(), data6.size(),
+ &name, &enclen));
+
+ // Indirection loops
+ std::vector<byte> data7 = {0xC0, 0x02, 0xC0, 0x00};
+ EXPECT_EQ(ARES_EBADNAME,
+ ares_expand_name(data7.data(), data7.data(), data7.size(),
+ &name, &enclen));
+ std::vector<byte> 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(),
+ &name, &enclen));
+ std::vector<byte> 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(),
+ &name, &enclen));
+}
+
+TEST_F(LibraryTest, CreateEDNSQuery) {
+ byte* p;
+ int len;
+ EXPECT_EQ(ARES_SUCCESS,
+ ares_create_query("example.com", ns_c_in, ns_t_a, 0x1234, 0,
+ &p, &len, 1280));
+ std::vector<byte> data(p, p + len);
+ ares_free_string(p);
+
+ std::string actual = PacketToString(data);
+ DNSPacket pkt;
+ pkt.set_qid(0x1234).add_question(new DNSQuestion("example.com", ns_t_a))
+ .add_additional(new DNSOptRR(0, 1280));
+ std::string expected = PacketToString(pkt.data());
+ EXPECT_EQ(expected, actual);
+}
+
+TEST_F(LibraryTest, CreateRootQuery) {
+ byte* p;
+ int len;
+ ares_create_query(".", ns_c_in, ns_t_a, 0x1234, 0, &p, &len, 0);
+ std::vector<byte> data(p, p + len);
+ ares_free_string(p);
+
+ std::string actual = PacketToString(data);
+ DNSPacket pkt;
+ pkt.set_qid(0x1234).add_question(new DNSQuestion("", ns_t_a));
+ std::string expected = PacketToString(pkt.data());
+ EXPECT_EQ(expected, actual);
+}
+
+TEST_F(LibraryTest, Version) {
+ // Assume linked to same version
+ EXPECT_EQ(std::string(ARES_VERSION_STR),
+ std::string(ares_version(nullptr)));
+ int version;
+ ares_version(&version);
+ EXPECT_EQ(ARES_VERSION, version);
+}
+
+TEST_F(LibraryTest, Strerror) {
+ EXPECT_EQ("Successful completion",
+ std::string(ares_strerror(ARES_SUCCESS)));
+ EXPECT_EQ("DNS query cancelled",
+ std::string(ares_strerror(ARES_ECANCELLED)));
+ EXPECT_EQ("unknown",
+ std::string(ares_strerror(99)));
+}
+
+TEST_F(LibraryTest, ExpandString) {
+ std::vector<byte> s1 = { 3, 'a', 'b', 'c'};
+ char* result = nullptr;
+ long len;
+ EXPECT_EQ(ARES_SUCCESS,
+ ares_expand_string(s1.data(), s1.data(), 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(),
+ (unsigned char**)&result, &len));
+ EXPECT_EQ(ARES_EBADSTR,
+ ares_expand_string(s1.data() + 4, s1.data(), s1.size(),
+ (unsigned char**)&result, &len));
+ SetAllocSizeFail(3 + 1);
+ EXPECT_EQ(ARES_ENOMEM,
+ ares_expand_string(s1.data(), s1.data(), s1.size(),
+ (unsigned char**)&result, &len));
+}
+
+} // namespace test
+} // namespace ares
diff --git a/contrib/libs/c-ares/test/ares-test-mock-ai.cc b/contrib/libs/c-ares/test/ares-test-mock-ai.cc
new file mode 100644
index 0000000000..d0df867fef
--- /dev/null
+++ b/contrib/libs/c-ares/test/ares-test-mock-ai.cc
@@ -0,0 +1,723 @@
+#include "ares-test-ai.h"
+#include "dns-proto.h"
+
+#ifdef HAVE_NETINET_IN_H
+#include <netinet/in.h>
+#endif
+
+#include <sstream>
+#include <vector>
+
+using testing::InvokeWithoutArgs;
+using testing::DoAll;
+
+namespace ares {
+namespace test {
+
+MATCHER_P(IncludesNumAddresses, n, "") {
+ if(!arg)
+ return false;
+ int cnt = 0;
+ for (const ares_addrinfo_node* ai = arg->nodes; ai != NULL; ai = ai->ai_next)
+ cnt++;
+ return n == cnt;
+}
+
+MATCHER_P(IncludesV4Address, address, "") {
+ if(!arg)
+ return false;
+ in_addr addressnum = {};
+ if (!ares_inet_pton(AF_INET, address, &addressnum))
+ return false; // wrong number format?
+ for (const ares_addrinfo_node* ai = arg->nodes; ai != NULL; ai = ai->ai_next) {
+ if (ai->ai_family != AF_INET)
+ continue;
+ if (reinterpret_cast<sockaddr_in*>(ai->ai_addr)->sin_addr.s_addr ==
+ addressnum.s_addr)
+ return true; // found
+ }
+ return false;
+}
+
+MATCHER_P(IncludesV6Address, address, "") {
+ if(!arg)
+ return false;
+ in6_addr addressnum = {};
+ if (!ares_inet_pton(AF_INET6, address, &addressnum)) {
+ return false; // wrong number format?
+ }
+ for (const ares_addrinfo_node* ai = arg->nodes; ai != NULL; ai = ai->ai_next) {
+ if (ai->ai_family != AF_INET6)
+ continue;
+ if (!memcmp(
+ reinterpret_cast<sockaddr_in6*>(ai->ai_addr)->sin6_addr.s6_addr,
+ addressnum.s6_addr, sizeof(addressnum.s6_addr)))
+ return true; // found
+ }
+ return false;
+}
+
+// UDP only so mock server doesn't get confused by concatenated requests
+TEST_P(MockUDPChannelTestAI, GetAddrInfoParallelLookups) {
+ DNSPacket rsp1;
+ rsp1.set_response().set_aa()
+ .add_question(new DNSQuestion("www.google.com", ns_t_a))
+ .add_answer(new DNSARR("www.google.com", 100, {2, 3, 4, 5}));
+ ON_CALL(server_, OnRequest("www.google.com", ns_t_a))
+ .WillByDefault(SetReply(&server_, &rsp1));
+ DNSPacket rsp2;
+ rsp2.set_response().set_aa()
+ .add_question(new DNSQuestion("www.example.com", ns_t_a))
+ .add_answer(new DNSARR("www.example.com", 100, {1, 2, 3, 4}));
+ ON_CALL(server_, OnRequest("www.example.com", ns_t_a))
+ .WillByDefault(SetReply(&server_, &rsp2));
+
+ struct ares_addrinfo_hints hints = {};
+ hints.ai_family = AF_INET;
+ hints.ai_flags = ARES_AI_NOSORT;
+ AddrInfoResult result1;
+ ares_getaddrinfo(channel_, "www.google.com.", NULL, &hints, AddrInfoCallback, &result1);
+ AddrInfoResult result2;
+ ares_getaddrinfo(channel_, "www.example.com.", NULL, &hints, AddrInfoCallback, &result2);
+ AddrInfoResult result3;
+ ares_getaddrinfo(channel_, "www.google.com.", NULL, &hints, AddrInfoCallback, &result3);
+ Process();
+
+ EXPECT_TRUE(result1.done_);
+ EXPECT_EQ(result1.status_, ARES_SUCCESS);
+ EXPECT_THAT(result1.ai_, IncludesNumAddresses(1));
+ EXPECT_THAT(result1.ai_, IncludesV4Address("2.3.4.5"));
+
+ EXPECT_TRUE(result2.done_);
+ EXPECT_EQ(result2.status_, ARES_SUCCESS);
+ EXPECT_THAT(result2.ai_, IncludesNumAddresses(1));
+ EXPECT_THAT(result2.ai_, IncludesV4Address("1.2.3.4"));
+
+ EXPECT_TRUE(result3.done_);
+ EXPECT_EQ(result3.status_, ARES_SUCCESS);
+ EXPECT_THAT(result3.ai_, IncludesNumAddresses(1));
+ EXPECT_THAT(result3.ai_, IncludesV4Address("2.3.4.5"));
+}
+
+// UDP to TCP specific test
+TEST_P(MockUDPChannelTestAI, TruncationRetry) {
+ DNSPacket rsptruncated;
+ rsptruncated.set_response().set_aa().set_tc()
+ .add_question(new DNSQuestion("www.google.com", ns_t_a));
+ DNSPacket rspok;
+ rspok.set_response()
+ .add_question(new DNSQuestion("www.google.com", ns_t_a))
+ .add_answer(new DNSARR("www.google.com", 100, {1, 2, 3, 4}));
+ EXPECT_CALL(server_, OnRequest("www.google.com", ns_t_a))
+ .WillOnce(SetReply(&server_, &rsptruncated))
+ .WillOnce(SetReply(&server_, &rspok));
+
+ AddrInfoResult result;
+ struct ares_addrinfo_hints hints = {};
+ hints.ai_family = AF_INET;
+ hints.ai_flags = ARES_AI_NOSORT;
+ ares_getaddrinfo(channel_, "www.google.com.", NULL, &hints, AddrInfoCallback, &result);
+ Process();
+ EXPECT_TRUE(result.done_);
+ EXPECT_EQ(result.status_, ARES_SUCCESS);
+ EXPECT_THAT(result.ai_, IncludesNumAddresses(1));
+ EXPECT_THAT(result.ai_, IncludesV4Address("1.2.3.4"));
+}
+
+// TCP only to prevent retries
+TEST_P(MockTCPChannelTestAI, MalformedResponse) {
+ std::vector<byte> one = {0x01};
+ EXPECT_CALL(server_, OnRequest("www.google.com", ns_t_a))
+ .WillOnce(SetReplyData(&server_, one));
+
+ AddrInfoResult result;
+ struct ares_addrinfo_hints hints = {};
+ hints.ai_family = AF_INET;
+ hints.ai_flags = ARES_AI_NOSORT;
+ ares_getaddrinfo(channel_, "www.google.com.", NULL, &hints, AddrInfoCallback, &result);
+ Process();
+ EXPECT_TRUE(result.done_);
+ EXPECT_EQ(ARES_ETIMEOUT, result.status_);
+}
+
+TEST_P(MockTCPChannelTestAI, FormErrResponse) {
+ DNSPacket rsp;
+ rsp.set_response().set_aa()
+ .add_question(new DNSQuestion("www.google.com", ns_t_a));
+ rsp.set_rcode(ns_r_formerr);
+ EXPECT_CALL(server_, OnRequest("www.google.com", ns_t_a))
+ .WillOnce(SetReply(&server_, &rsp));
+
+ AddrInfoResult result;
+ struct ares_addrinfo_hints hints = {};
+ hints.ai_family = AF_INET;
+ hints.ai_flags = ARES_AI_NOSORT;
+ ares_getaddrinfo(channel_, "www.google.com.", NULL, &hints, AddrInfoCallback, &result);
+ Process();
+ EXPECT_TRUE(result.done_);
+ EXPECT_EQ(ARES_EFORMERR, result.status_);
+}
+
+TEST_P(MockTCPChannelTestAI, ServFailResponse) {
+ DNSPacket rsp;
+ rsp.set_response().set_aa()
+ .add_question(new DNSQuestion("www.google.com", ns_t_a));
+ rsp.set_rcode(ns_r_servfail);
+ EXPECT_CALL(server_, OnRequest("www.google.com", ns_t_a))
+ .WillOnce(SetReply(&server_, &rsp));
+
+ AddrInfoResult result;
+ struct ares_addrinfo_hints hints = {};
+ hints.ai_family = AF_INET;
+ hints.ai_flags = ARES_AI_NOSORT;
+ 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_);
+}
+
+TEST_P(MockTCPChannelTestAI, NotImplResponse) {
+ DNSPacket rsp;
+ rsp.set_response().set_aa()
+ .add_question(new DNSQuestion("www.google.com", ns_t_a));
+ rsp.set_rcode(ns_r_notimpl);
+ EXPECT_CALL(server_, OnRequest("www.google.com", ns_t_a))
+ .WillOnce(SetReply(&server_, &rsp));
+
+ AddrInfoResult result;
+ struct ares_addrinfo_hints hints = {};
+ hints.ai_family = AF_INET;
+ hints.ai_flags = ARES_AI_NOSORT;
+ ares_getaddrinfo(channel_, "www.google.com.", NULL, &hints, AddrInfoCallback, &result);
+ Process();
+ EXPECT_TRUE(result.done_);
+ // ARES_FLAG_NOCHECKRESP not set, so NOTIMPL consumed
+ EXPECT_EQ(ARES_ECONNREFUSED, result.status_);
+}
+
+TEST_P(MockTCPChannelTestAI, RefusedResponse) {
+ DNSPacket rsp;
+ rsp.set_response().set_aa()
+ .add_question(new DNSQuestion("www.google.com", ns_t_a));
+ rsp.set_rcode(ns_r_refused);
+ EXPECT_CALL(server_, OnRequest("www.google.com", ns_t_a))
+ .WillOnce(SetReply(&server_, &rsp));
+
+ AddrInfoResult result;
+ struct ares_addrinfo_hints hints = {};
+ hints.ai_family = AF_INET;
+ hints.ai_flags = ARES_AI_NOSORT;
+ 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_);
+}
+
+TEST_P(MockTCPChannelTestAI, YXDomainResponse) {
+ DNSPacket rsp;
+ rsp.set_response().set_aa()
+ .add_question(new DNSQuestion("www.google.com", ns_t_a));
+ rsp.set_rcode(ns_r_yxdomain);
+ EXPECT_CALL(server_, OnRequest("www.google.com", ns_t_a))
+ .WillOnce(SetReply(&server_, &rsp));
+
+ AddrInfoResult result;
+ struct ares_addrinfo_hints hints = {};
+ hints.ai_family = AF_INET;
+ hints.ai_flags = ARES_AI_NOSORT;
+ ares_getaddrinfo(channel_, "www.google.com.", NULL, &hints, AddrInfoCallback, &result);
+ Process();
+ EXPECT_TRUE(result.done_);
+ EXPECT_EQ(ARES_ENODATA, result.status_);
+}
+
+class MockExtraOptsTestAI
+ : public MockChannelOptsTest,
+ public ::testing::WithParamInterface< std::pair<int, bool> > {
+ public:
+ MockExtraOptsTestAI()
+ : MockChannelOptsTest(1, GetParam().first, GetParam().second,
+ FillOptions(&opts_),
+ ARES_OPT_SOCK_SNDBUF|ARES_OPT_SOCK_RCVBUF) {}
+ static struct ares_options* FillOptions(struct ares_options * opts) {
+ memset(opts, 0, sizeof(struct ares_options));
+ // Set a few options that affect socket communications
+ opts->socket_send_buffer_size = 514;
+ opts->socket_receive_buffer_size = 514;
+ return opts;
+ }
+ private:
+ struct ares_options opts_;
+};
+
+TEST_P(MockExtraOptsTestAI, SimpleQuery) {
+ ares_set_local_ip4(channel_, 0x7F000001);
+ byte addr6[16] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01};
+ ares_set_local_ip6(channel_, addr6);
+ ares_set_local_dev(channel_, "dummy");
+
+ DNSPacket rsp;
+ rsp.set_response().set_aa()
+ .add_question(new DNSQuestion("www.google.com", ns_t_a))
+ .add_answer(new DNSARR("www.google.com", 100, {2, 3, 4, 5}));
+ ON_CALL(server_, OnRequest("www.google.com", ns_t_a))
+ .WillByDefault(SetReply(&server_, &rsp));
+
+ AddrInfoResult result;
+ struct ares_addrinfo_hints hints = {};
+ hints.ai_family = AF_INET;
+ hints.ai_flags = ARES_AI_NOSORT;
+ ares_getaddrinfo(channel_, "www.google.com.", NULL, &hints, AddrInfoCallback, &result);
+ Process();
+ EXPECT_TRUE(result.done_);
+ EXPECT_EQ(ARES_SUCCESS, result.status_);
+ EXPECT_THAT(result.ai_, IncludesNumAddresses(1));
+ EXPECT_THAT(result.ai_, IncludesV4Address("2.3.4.5"));
+}
+
+class MockFlagsChannelOptsTestAI
+ : public MockChannelOptsTest,
+ public ::testing::WithParamInterface< std::pair<int, bool> > {
+ public:
+ MockFlagsChannelOptsTestAI(int flags)
+ : MockChannelOptsTest(1, GetParam().first, GetParam().second,
+ FillOptions(&opts_, flags), ARES_OPT_FLAGS) {}
+ static struct ares_options* FillOptions(struct ares_options * opts, int flags) {
+ memset(opts, 0, sizeof(struct ares_options));
+ opts->flags = flags;
+ return opts;
+ }
+ private:
+ struct ares_options opts_;
+};
+
+class MockNoCheckRespChannelTestAI : public MockFlagsChannelOptsTestAI {
+ public:
+ MockNoCheckRespChannelTestAI() : MockFlagsChannelOptsTestAI(ARES_FLAG_NOCHECKRESP) {}
+};
+
+TEST_P(MockNoCheckRespChannelTestAI, ServFailResponse) {
+ DNSPacket rsp;
+ rsp.set_response().set_aa()
+ .add_question(new DNSQuestion("www.google.com", ns_t_a));
+ rsp.set_rcode(ns_r_servfail);
+ ON_CALL(server_, OnRequest("www.google.com", ns_t_a))
+ .WillByDefault(SetReply(&server_, &rsp));
+
+ AddrInfoResult result;
+ struct ares_addrinfo_hints hints = {};
+ hints.ai_family = AF_INET;
+ hints.ai_flags = ARES_AI_NOSORT;
+ ares_getaddrinfo(channel_, "www.google.com.", NULL, &hints, AddrInfoCallback, &result);
+ Process();
+ EXPECT_TRUE(result.done_);
+ EXPECT_EQ(ARES_ESERVFAIL, result.status_);
+}
+
+TEST_P(MockNoCheckRespChannelTestAI, NotImplResponse) {
+ DNSPacket rsp;
+ rsp.set_response().set_aa()
+ .add_question(new DNSQuestion("www.google.com", ns_t_a));
+ rsp.set_rcode(ns_r_notimpl);
+ ON_CALL(server_, OnRequest("www.google.com", ns_t_a))
+ .WillByDefault(SetReply(&server_, &rsp));
+
+ AddrInfoResult result;
+ struct ares_addrinfo_hints hints = {};
+ hints.ai_family = AF_INET;
+ hints.ai_flags = ARES_AI_NOSORT;
+ ares_getaddrinfo(channel_, "www.google.com.", NULL, &hints, AddrInfoCallback, &result);
+ Process();
+ EXPECT_TRUE(result.done_);
+ EXPECT_EQ(ARES_ENOTIMP, result.status_);
+}
+
+TEST_P(MockNoCheckRespChannelTestAI, RefusedResponse) {
+ DNSPacket rsp;
+ rsp.set_response().set_aa()
+ .add_question(new DNSQuestion("www.google.com", ns_t_a));
+ rsp.set_rcode(ns_r_refused);
+ ON_CALL(server_, OnRequest("www.google.com", ns_t_a))
+ .WillByDefault(SetReply(&server_, &rsp));
+
+ AddrInfoResult result;
+ struct ares_addrinfo_hints hints = {};
+ hints.ai_family = AF_INET;
+ hints.ai_flags = ARES_AI_NOSORT;
+ ares_getaddrinfo(channel_, "www.google.com.", NULL, &hints, AddrInfoCallback, &result);
+ Process();
+ EXPECT_TRUE(result.done_);
+ EXPECT_EQ(ARES_EREFUSED, result.status_);
+}
+
+TEST_P(MockChannelTestAI, FamilyV6) {
+ DNSPacket rsp6;
+ rsp6.set_response().set_aa()
+ .add_question(new DNSQuestion("example.com", ns_t_aaaa))
+ .add_answer(new DNSAaaaRR("example.com", 100,
+ {0x21, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03}));
+ ON_CALL(server_, OnRequest("example.com", ns_t_aaaa))
+ .WillByDefault(SetReply(&server_, &rsp6));
+ AddrInfoResult result;
+ struct ares_addrinfo_hints hints = {};
+ hints.ai_family = AF_INET6;
+ hints.ai_flags = ARES_AI_NOSORT;
+ ares_getaddrinfo(channel_, "example.com.", NULL, &hints,
+ AddrInfoCallback, &result);
+ Process();
+ EXPECT_TRUE(result.done_);
+ EXPECT_THAT(result.ai_, IncludesNumAddresses(1));
+ EXPECT_THAT(result.ai_, IncludesV6Address("2121:0000:0000:0000:0000:0000:0000:0303"));
+}
+
+TEST_P(MockChannelTestAI, FamilyV4) {
+ DNSPacket rsp4;
+ rsp4.set_response().set_aa()
+ .add_question(new DNSQuestion("example.com", ns_t_a))
+ .add_answer(new DNSARR("example.com", 100, {2, 3, 4, 5}));
+ ON_CALL(server_, OnRequest("example.com", ns_t_a))
+ .WillByDefault(SetReply(&server_, &rsp4));
+ AddrInfoResult result = {};
+ struct ares_addrinfo_hints hints = {};
+ hints.ai_family = AF_INET;
+ hints.ai_flags = ARES_AI_NOSORT;
+ ares_getaddrinfo(channel_, "example.com.", NULL, &hints,
+ AddrInfoCallback, &result);
+ Process();
+ EXPECT_TRUE(result.done_);
+ EXPECT_THAT(result.ai_, IncludesNumAddresses(1));
+ EXPECT_THAT(result.ai_, IncludesV4Address("2.3.4.5"));
+}
+
+TEST_P(MockChannelTestAI, FamilyV4_MultipleAddresses) {
+ DNSPacket rsp4;
+ rsp4.set_response().set_aa()
+ .add_question(new DNSQuestion("example.com", ns_t_a))
+ .add_answer(new DNSARR("example.com", 100, {2, 3, 4, 5}))
+ .add_answer(new DNSARR("example.com", 100, {7, 8, 9, 0}));
+ ON_CALL(server_, OnRequest("example.com", ns_t_a))
+ .WillByDefault(SetReply(&server_, &rsp4));
+ AddrInfoResult result = {};
+ struct ares_addrinfo_hints hints = {};
+ hints.ai_family = AF_INET;
+ hints.ai_flags = 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("{addr=[2.3.4.5], addr=[7.8.9.0]}", ss.str());
+}
+
+TEST_P(MockChannelTestAI, FamilyUnspecified) {
+ DNSPacket rsp6;
+ rsp6.set_response().set_aa()
+ .add_question(new DNSQuestion("example.com", ns_t_aaaa))
+ .add_answer(new DNSAaaaRR("example.com", 100,
+ {0x21, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03}));
+ ON_CALL(server_, OnRequest("example.com", ns_t_aaaa))
+ .WillByDefault(SetReply(&server_, &rsp6));
+ DNSPacket rsp4;
+ rsp4.set_response().set_aa()
+ .add_question(new DNSQuestion("example.com", ns_t_a))
+ .add_answer(new DNSARR("example.com", 100, {2, 3, 4, 5}));
+ ON_CALL(server_, OnRequest("example.com", ns_t_a))
+ .WillByDefault(SetReply(&server_, &rsp4));
+ AddrInfoResult result;
+ struct ares_addrinfo_hints hints = {};
+ hints.ai_family = AF_UNSPEC;
+ hints.ai_flags = ARES_AI_NOSORT;
+ ares_getaddrinfo(channel_, "example.com.", NULL, &hints,
+ AddrInfoCallback, &result);
+ Process();
+ EXPECT_TRUE(result.done_);
+ EXPECT_THAT(result.ai_, IncludesNumAddresses(2));
+ EXPECT_THAT(result.ai_, IncludesV4Address("2.3.4.5"));
+ EXPECT_THAT(result.ai_, IncludesV6Address("2121:0000:0000:0000:0000:0000:0000:0303"));
+}
+
+class MockEDNSChannelTestAI : public MockFlagsChannelOptsTestAI {
+ public:
+ MockEDNSChannelTestAI() : MockFlagsChannelOptsTestAI(ARES_FLAG_EDNS) {}
+};
+
+TEST_P(MockEDNSChannelTestAI, RetryWithoutEDNS) {
+ DNSPacket rspfail;
+ rspfail.set_response().set_aa().set_rcode(ns_r_servfail)
+ .add_question(new DNSQuestion("www.google.com", ns_t_a));
+ DNSPacket rspok;
+ rspok.set_response()
+ .add_question(new DNSQuestion("www.google.com", ns_t_a))
+ .add_answer(new DNSARR("www.google.com", 100, {1, 2, 3, 4}));
+ EXPECT_CALL(server_, OnRequest("www.google.com", ns_t_a))
+ .WillOnce(SetReply(&server_, &rspfail))
+ .WillOnce(SetReply(&server_, &rspok));
+
+ AddrInfoResult result;
+ struct ares_addrinfo_hints hints = {};
+ hints.ai_family = AF_INET;
+ hints.ai_flags = ARES_AI_NOSORT;
+ ares_getaddrinfo(channel_, "www.google.com.", NULL, &hints, AddrInfoCallback, &result);
+ Process();
+ EXPECT_TRUE(result.done_);
+ EXPECT_THAT(result.ai_, IncludesNumAddresses(1));
+ EXPECT_THAT(result.ai_, IncludesV4Address("1.2.3.4"));
+}
+
+TEST_P(MockChannelTestAI, SearchDomains) {
+ DNSPacket nofirst;
+ nofirst.set_response().set_aa().set_rcode(ns_r_nxdomain)
+ .add_question(new DNSQuestion("www.first.com", ns_t_a));
+ ON_CALL(server_, OnRequest("www.first.com", ns_t_a))
+ .WillByDefault(SetReply(&server_, &nofirst));
+ DNSPacket nosecond;
+ nosecond.set_response().set_aa().set_rcode(ns_r_nxdomain)
+ .add_question(new DNSQuestion("www.second.org", ns_t_a));
+ ON_CALL(server_, OnRequest("www.second.org", ns_t_a))
+ .WillByDefault(SetReply(&server_, &nosecond));
+ DNSPacket yesthird;
+ yesthird.set_response().set_aa()
+ .add_question(new DNSQuestion("www.third.gov", ns_t_a))
+ .add_answer(new DNSARR("www.third.gov", 0x0200, {2, 3, 4, 5}));
+ ON_CALL(server_, OnRequest("www.third.gov", ns_t_a))
+ .WillByDefault(SetReply(&server_, &yesthird));
+
+ AddrInfoResult result;
+ struct ares_addrinfo_hints hints = {};
+ hints.ai_family = AF_INET;
+ hints.ai_flags = ARES_AI_NOSORT;
+ ares_getaddrinfo(channel_, "www", NULL, &hints, AddrInfoCallback, &result);
+ Process();
+ EXPECT_TRUE(result.done_);
+ EXPECT_THAT(result.ai_, IncludesNumAddresses(1));
+ EXPECT_THAT(result.ai_, IncludesV4Address("2.3.4.5"));
+}
+
+TEST_P(MockChannelTestAI, SearchDomainsServFailOnAAAA) {
+ DNSPacket nofirst;
+ nofirst.set_response().set_aa().set_rcode(ns_r_nxdomain)
+ .add_question(new DNSQuestion("www.first.com", ns_t_aaaa));
+ ON_CALL(server_, OnRequest("www.first.com", ns_t_aaaa))
+ .WillByDefault(SetReply(&server_, &nofirst));
+ DNSPacket nofirst4;
+ nofirst4.set_response().set_aa().set_rcode(ns_r_nxdomain)
+ .add_question(new DNSQuestion("www.first.com", ns_t_a));
+ ON_CALL(server_, OnRequest("www.first.com", ns_t_a))
+ .WillByDefault(SetReply(&server_, &nofirst4));
+
+ DNSPacket nosecond;
+ nosecond.set_response().set_aa().set_rcode(ns_r_nxdomain)
+ .add_question(new DNSQuestion("www.second.org", ns_t_aaaa));
+ ON_CALL(server_, OnRequest("www.second.org", ns_t_aaaa))
+ .WillByDefault(SetReply(&server_, &nosecond));
+ DNSPacket yessecond4;
+ yessecond4.set_response().set_aa()
+ .add_question(new DNSQuestion("www.second.org", ns_t_a))
+ .add_answer(new DNSARR("www.second.org", 0x0200, {2, 3, 4, 5}));
+ ON_CALL(server_, OnRequest("www.second.org", ns_t_a))
+ .WillByDefault(SetReply(&server_, &yessecond4));
+
+ DNSPacket failthird;
+ failthird.set_response().set_aa().set_rcode(ns_r_servfail)
+ .add_question(new DNSQuestion("www.third.gov", ns_t_aaaa));
+ ON_CALL(server_, OnRequest("www.third.gov", ns_t_aaaa))
+ .WillByDefault(SetReply(&server_, &failthird));
+ DNSPacket failthird4;
+ failthird4.set_response().set_aa().set_rcode(ns_r_servfail)
+ .add_question(new DNSQuestion("www.third.gov", ns_t_a));
+ ON_CALL(server_, OnRequest("www.third.gov", ns_t_a))
+ .WillByDefault(SetReply(&server_, &failthird4));
+
+ AddrInfoResult result;
+ struct ares_addrinfo_hints hints = {};
+ hints.ai_family = AF_UNSPEC;
+ hints.ai_flags = ARES_AI_NOSORT;
+ ares_getaddrinfo(channel_, "www", NULL, &hints, AddrInfoCallback, &result);
+ Process();
+ EXPECT_TRUE(result.done_);
+ EXPECT_THAT(result.ai_, IncludesNumAddresses(1));
+ EXPECT_THAT(result.ai_, IncludesV4Address("2.3.4.5"));
+}
+
+class MockMultiServerChannelTestAI
+ : public MockChannelOptsTest,
+ public ::testing::WithParamInterface< std::pair<int, bool> > {
+ public:
+ MockMultiServerChannelTestAI(bool rotate)
+ : MockChannelOptsTest(3, GetParam().first, GetParam().second, nullptr, rotate ? ARES_OPT_ROTATE : ARES_OPT_NOROTATE) {}
+ void CheckExample() {
+ AddrInfoResult result;
+ struct ares_addrinfo_hints hints = {};
+ hints.ai_family = AF_INET;
+ hints.ai_flags = ARES_AI_NOSORT;
+ ares_getaddrinfo(channel_, "www.example.com.", NULL, &hints, AddrInfoCallback, &result);
+ Process();
+ EXPECT_TRUE(result.done_);
+ EXPECT_EQ(result.status_, ARES_SUCCESS);
+ EXPECT_THAT(result.ai_, IncludesNumAddresses(1));
+ EXPECT_THAT(result.ai_, IncludesV4Address("2.3.4.5"));
+ }
+};
+
+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};
+ int optmask = 0;
+ EXPECT_EQ(ARES_SUCCESS, ares_save_options(channel_, &opts, &optmask));
+ EXPECT_EQ(0, (optmask & ARES_OPT_NOROTATE));
+ ares_destroy_options(&opts);
+
+ DNSPacket servfailrsp;
+ servfailrsp.set_response().set_aa().set_rcode(ns_r_servfail)
+ .add_question(new DNSQuestion("www.example.com", ns_t_a));
+ DNSPacket notimplrsp;
+ notimplrsp.set_response().set_aa().set_rcode(ns_r_notimpl)
+ .add_question(new DNSQuestion("www.example.com", ns_t_a));
+ DNSPacket okrsp;
+ okrsp.set_response().set_aa()
+ .add_question(new DNSQuestion("www.example.com", ns_t_a))
+ .add_answer(new DNSARR("www.example.com", 100, {2,3,4,5}));
+
+ EXPECT_CALL(*servers_[0], OnRequest("www.example.com", ns_t_a))
+ .WillOnce(SetReply(servers_[0].get(), &servfailrsp));
+ EXPECT_CALL(*servers_[1], OnRequest("www.example.com", ns_t_a))
+ .WillOnce(SetReply(servers_[1].get(), &notimplrsp));
+ EXPECT_CALL(*servers_[2], OnRequest("www.example.com", ns_t_a))
+ .WillOnce(SetReply(servers_[2].get(), &okrsp));
+ CheckExample();
+
+ // Second time around, starts from server [1].
+ EXPECT_CALL(*servers_[1], OnRequest("www.example.com", ns_t_a))
+ .WillOnce(SetReply(servers_[1].get(), &servfailrsp));
+ EXPECT_CALL(*servers_[2], OnRequest("www.example.com", ns_t_a))
+ .WillOnce(SetReply(servers_[2].get(), &notimplrsp));
+ EXPECT_CALL(*servers_[0], OnRequest("www.example.com", ns_t_a))
+ .WillOnce(SetReply(servers_[0].get(), &okrsp));
+ CheckExample();
+
+ // Third time around, starts from server [2].
+ EXPECT_CALL(*servers_[2], OnRequest("www.example.com", ns_t_a))
+ .WillOnce(SetReply(servers_[2].get(), &servfailrsp));
+ EXPECT_CALL(*servers_[0], OnRequest("www.example.com", ns_t_a))
+ .WillOnce(SetReply(servers_[0].get(), &notimplrsp));
+ EXPECT_CALL(*servers_[1], OnRequest("www.example.com", ns_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(ns_r_servfail)
+ .add_question(new DNSQuestion("www.example.com", ns_t_a));
+ DNSPacket notimplrsp;
+ notimplrsp.set_response().set_aa().set_rcode(ns_r_notimpl)
+ .add_question(new DNSQuestion("www.example.com", ns_t_a));
+ DNSPacket okrsp;
+ okrsp.set_response().set_aa()
+ .add_question(new DNSQuestion("www.example.com", ns_t_a))
+ .add_answer(new DNSARR("www.example.com", 100, {2,3,4,5}));
+
+ EXPECT_CALL(*servers_[0], OnRequest("www.example.com", ns_t_a))
+ .WillOnce(SetReply(servers_[0].get(), &servfailrsp));
+ EXPECT_CALL(*servers_[1], OnRequest("www.example.com", ns_t_a))
+ .WillOnce(SetReply(servers_[1].get(), &notimplrsp));
+ EXPECT_CALL(*servers_[2], OnRequest("www.example.com", ns_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", ns_t_a))
+ .WillOnce(SetReply(servers_[0].get(), &servfailrsp));
+ EXPECT_CALL(*servers_[1], OnRequest("www.example.com", ns_t_a))
+ .WillOnce(SetReply(servers_[1].get(), &notimplrsp));
+ EXPECT_CALL(*servers_[2], OnRequest("www.example.com", ns_t_a))
+ .WillOnce(SetReply(servers_[2].get(), &okrsp));
+ CheckExample();
+
+ // Third time around, still starts from server [0].
+ EXPECT_CALL(*servers_[0], OnRequest("www.example.com", ns_t_a))
+ .WillOnce(SetReply(servers_[0].get(), &servfailrsp));
+ EXPECT_CALL(*servers_[1], OnRequest("www.example.com", ns_t_a))
+ .WillOnce(SetReply(servers_[1].get(), &notimplrsp));
+ EXPECT_CALL(*servers_[2], OnRequest("www.example.com", ns_t_a))
+ .WillOnce(SetReply(servers_[2].get(), &okrsp));
+ CheckExample();
+}
+
+TEST_P(MockChannelTestAI, FamilyV4ServiceName) {
+ DNSPacket rsp4;
+ rsp4.set_response().set_aa()
+ .add_question(new DNSQuestion("example.com", ns_t_a))
+ .add_answer(new DNSARR("example.com", 100, {1, 1, 1, 1}))
+ .add_answer(new DNSARR("example.com", 100, {2, 2, 2, 2}));
+ ON_CALL(server_, OnRequest("example.com", ns_t_a))
+ .WillByDefault(SetReply(&server_, &rsp4));
+ AddrInfoResult result = {};
+ struct ares_addrinfo_hints hints = {};
+ hints.ai_family = AF_INET;
+ hints.ai_flags = ARES_AI_NOSORT;
+ ares_getaddrinfo(channel_, "example.com", "http", &hints, AddrInfoCallback, &result);
+ Process();
+ EXPECT_TRUE(result.done_);
+ std::stringstream ss;
+ ss << result.ai_;
+ EXPECT_EQ("{addr=[1.1.1.1:80], addr=[2.2.2.2:80]}", ss.str());
+}
+
+// force-tcp does currently not work, possibly test DNS server swallows
+// bytes from second query
+//INSTANTIATE_TEST_CASE_P(AddressFamiliesAI, MockChannelTestAI,
+// ::testing::ValuesIn(ares::test::families_modes));
+//const std::vector<std::pair<int, bool>> both_families_udponly = {
+// std::make_pair<int, bool>(AF_INET, false),
+// std::make_pair<int, bool>(AF_INET6, false)
+//};
+INSTANTIATE_TEST_CASE_P(AddressFamiliesAI, MockChannelTestAI,
+ ::testing::Values(std::make_pair<int, bool>(AF_INET, false)));
+
+INSTANTIATE_TEST_CASE_P(AddressFamiliesAI, MockUDPChannelTestAI,
+ ::testing::ValuesIn(ares::test::families));
+
+INSTANTIATE_TEST_CASE_P(AddressFamiliesAI, MockTCPChannelTestAI,
+ ::testing::ValuesIn(ares::test::families));
+
+INSTANTIATE_TEST_CASE_P(AddressFamiliesAI, MockExtraOptsTestAI,
+ ::testing::ValuesIn(ares::test::families_modes));
+
+INSTANTIATE_TEST_CASE_P(AddressFamiliesAI, MockNoCheckRespChannelTestAI,
+ ::testing::ValuesIn(ares::test::families_modes));
+
+INSTANTIATE_TEST_CASE_P(AddressFamiliesAI, MockEDNSChannelTestAI,
+ ::testing::ValuesIn(ares::test::families_modes));
+
+INSTANTIATE_TEST_CASE_P(TransportModesAI, RotateMultiMockTestAI,
+ ::testing::ValuesIn(ares::test::families_modes));
+
+INSTANTIATE_TEST_CASE_P(TransportModesAI, NoRotateMultiMockTestAI,
+ ::testing::ValuesIn(ares::test::families_modes));
+
+
+} // namespace test
+} // namespace ares
diff --git a/contrib/libs/c-ares/test/ares-test-mock.cc b/contrib/libs/c-ares/test/ares-test-mock.cc
new file mode 100644
index 0000000000..80e9fc02b0
--- /dev/null
+++ b/contrib/libs/c-ares/test/ares-test-mock.cc
@@ -0,0 +1,1173 @@
+#include "ares-test.h"
+#include "dns-proto.h"
+
+#include <sstream>
+#include <vector>
+
+using testing::InvokeWithoutArgs;
+using testing::DoAll;
+
+namespace ares {
+namespace test {
+
+TEST_P(MockChannelTest, Basic) {
+ std::vector<byte> reply = {
+ 0x00, 0x00, // qid
+ 0x84, // response + query + AA + not-TC + not-RD
+ 0x00, // not-RA + not-Z + not-AD + not-CD + rc=NoError
+ 0x00, 0x01, // 1 question
+ 0x00, 0x01, // 1 answer RRs
+ 0x00, 0x00, // 0 authority RRs
+ 0x00, 0x00, // 0 additional RRs
+ // Question
+ 0x03, 'w', 'w', 'w',
+ 0x06, 'g', 'o', 'o', 'g', 'l', 'e',
+ 0x03, 'c', 'o', 'm',
+ 0x00,
+ 0x00, 0x01, // type A
+ 0x00, 0x01, // class IN
+ // Answer
+ 0x03, 'w', 'w', 'w',
+ 0x06, 'g', 'o', 'o', 'g', 'l', 'e',
+ 0x03, 'c', 'o', 'm',
+ 0x00,
+ 0x00, 0x01, // type A
+ 0x00, 0x01, // class IN
+ 0x00, 0x00, 0x01, 0x00, // TTL
+ 0x00, 0x04, // rdata length
+ 0x01, 0x02, 0x03, 0x04
+ };
+
+ ON_CALL(server_, OnRequest("www.google.com", ns_t_a))
+ .WillByDefault(SetReplyData(&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());
+}
+
+// UDP only so mock server doesn't get confused by concatenated requests
+TEST_P(MockUDPChannelTest, GetHostByNameParallelLookups) {
+ DNSPacket rsp1;
+ rsp1.set_response().set_aa()
+ .add_question(new DNSQuestion("www.google.com", ns_t_a))
+ .add_answer(new DNSARR("www.google.com", 100, {2, 3, 4, 5}));
+ ON_CALL(server_, OnRequest("www.google.com", ns_t_a))
+ .WillByDefault(SetReply(&server_, &rsp1));
+ DNSPacket rsp2;
+ rsp2.set_response().set_aa()
+ .add_question(new DNSQuestion("www.example.com", ns_t_a))
+ .add_answer(new DNSARR("www.example.com", 100, {1, 2, 3, 4}));
+ ON_CALL(server_, OnRequest("www.example.com", ns_t_a))
+ .WillByDefault(SetReply(&server_, &rsp2));
+
+ HostResult result1;
+ ares_gethostbyname(channel_, "www.google.com.", AF_INET, HostCallback, &result1);
+ HostResult result2;
+ ares_gethostbyname(channel_, "www.example.com.", AF_INET, HostCallback, &result2);
+ HostResult result3;
+ ares_gethostbyname(channel_, "www.google.com.", AF_INET, HostCallback, &result3);
+ Process();
+ EXPECT_TRUE(result1.done_);
+ EXPECT_TRUE(result2.done_);
+ EXPECT_TRUE(result3.done_);
+ std::stringstream ss1;
+ ss1 << result1.host_;
+ EXPECT_EQ("{'www.google.com' aliases=[] addrs=[2.3.4.5]}", ss1.str());
+ std::stringstream ss2;
+ ss2 << result2.host_;
+ EXPECT_EQ("{'www.example.com' aliases=[] addrs=[1.2.3.4]}", ss2.str());
+ std::stringstream ss3;
+ ss3 << result3.host_;
+ EXPECT_EQ("{'www.google.com' aliases=[] addrs=[2.3.4.5]}", ss3.str());
+}
+
+// UDP to TCP specific test
+TEST_P(MockUDPChannelTest, TruncationRetry) {
+ DNSPacket rsptruncated;
+ rsptruncated.set_response().set_aa().set_tc()
+ .add_question(new DNSQuestion("www.google.com", ns_t_a));
+ DNSPacket rspok;
+ rspok.set_response()
+ .add_question(new DNSQuestion("www.google.com", ns_t_a))
+ .add_answer(new DNSARR("www.google.com", 100, {1, 2, 3, 4}));
+ EXPECT_CALL(server_, OnRequest("www.google.com", ns_t_a))
+ .WillOnce(SetReply(&server_, &rsptruncated))
+ .WillOnce(SetReply(&server_, &rspok));
+ 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());
+}
+
+static int sock_cb_count = 0;
+static int SocketConnectCallback(ares_socket_t fd, int type, void *data) {
+ int rc = *(int*)data;
+ if (verbose) std::cerr << "SocketConnectCallback(" << fd << ") invoked" << std::endl;
+ sock_cb_count++;
+ return rc;
+}
+
+TEST_P(MockChannelTest, SockCallback) {
+ DNSPacket rsp;
+ rsp.set_response().set_aa()
+ .add_question(new DNSQuestion("www.google.com", ns_t_a))
+ .add_answer(new DNSARR("www.google.com", 100, {2, 3, 4, 5}));
+ EXPECT_CALL(server_, OnRequest("www.google.com", ns_t_a))
+ .WillOnce(SetReply(&server_, &rsp));
+
+ // Get notified of new sockets
+ int rc = ARES_SUCCESS;
+ ares_set_socket_callback(channel_, SocketConnectCallback, &rc);
+
+ HostResult result;
+ sock_cb_count = 0;
+ ares_gethostbyname(channel_, "www.google.com.", AF_INET, HostCallback, &result);
+ Process();
+ EXPECT_EQ(1, sock_cb_count);
+ EXPECT_TRUE(result.done_);
+ std::stringstream ss;
+ ss << result.host_;
+ EXPECT_EQ("{'www.google.com' aliases=[] addrs=[2.3.4.5]}", ss.str());
+}
+
+TEST_P(MockChannelTest, SockFailCallback) {
+ // Notification of new sockets gives an error.
+ int rc = -1;
+ ares_set_socket_callback(channel_, SocketConnectCallback, &rc);
+
+ HostResult result;
+ sock_cb_count = 0;
+ ares_gethostbyname(channel_, "www.google.com.", AF_INET, HostCallback, &result);
+ Process();
+ EXPECT_LT(1, sock_cb_count);
+ EXPECT_TRUE(result.done_);
+ EXPECT_EQ(ARES_ECONNREFUSED, result.status_);
+}
+
+static int sock_config_cb_count = 0;
+static int SocketConfigureCallback(ares_socket_t fd, int type, void *data) {
+ int rc = *(int*)data;
+ if (verbose) std::cerr << "SocketConfigureCallback(" << fd << ") invoked" << std::endl;
+ sock_config_cb_count++;
+ return rc;
+}
+
+TEST_P(MockChannelTest, SockConfigureCallback) {
+ DNSPacket rsp;
+ rsp.set_response().set_aa()
+ .add_question(new DNSQuestion("www.google.com", ns_t_a))
+ .add_answer(new DNSARR("www.google.com", 100, {2, 3, 4, 5}));
+ EXPECT_CALL(server_, OnRequest("www.google.com", ns_t_a))
+ .WillOnce(SetReply(&server_, &rsp));
+
+ // Get notified of new sockets
+ int rc = ARES_SUCCESS;
+ ares_set_socket_configure_callback(channel_, SocketConfigureCallback, &rc);
+
+ HostResult result;
+ sock_config_cb_count = 0;
+ ares_gethostbyname(channel_, "www.google.com.", AF_INET, HostCallback, &result);
+ Process();
+ EXPECT_EQ(1, sock_config_cb_count);
+ EXPECT_TRUE(result.done_);
+ std::stringstream ss;
+ ss << result.host_;
+ EXPECT_EQ("{'www.google.com' aliases=[] addrs=[2.3.4.5]}", ss.str());
+}
+
+TEST_P(MockChannelTest, SockConfigureFailCallback) {
+ // Notification of new sockets gives an error.
+ int rc = -1;
+ ares_set_socket_configure_callback(channel_, SocketConfigureCallback, &rc);
+
+ HostResult result;
+ sock_config_cb_count = 0;
+ ares_gethostbyname(channel_, "www.google.com.", AF_INET, HostCallback, &result);
+ Process();
+ EXPECT_LT(1, sock_config_cb_count);
+ EXPECT_TRUE(result.done_);
+ EXPECT_EQ(ARES_ECONNREFUSED, result.status_);
+}
+
+// TCP only to prevent retries
+TEST_P(MockTCPChannelTest, MalformedResponse) {
+ std::vector<byte> one = {0x01};
+ EXPECT_CALL(server_, OnRequest("www.google.com", ns_t_a))
+ .WillOnce(SetReplyData(&server_, one));
+
+ HostResult result;
+ ares_gethostbyname(channel_, "www.google.com.", AF_INET, HostCallback, &result);
+ Process();
+ EXPECT_TRUE(result.done_);
+ EXPECT_EQ(ARES_ETIMEOUT, result.status_);
+}
+
+TEST_P(MockTCPChannelTest, FormErrResponse) {
+ DNSPacket rsp;
+ rsp.set_response().set_aa()
+ .add_question(new DNSQuestion("www.google.com", ns_t_a));
+ rsp.set_rcode(ns_r_formerr);
+ EXPECT_CALL(server_, OnRequest("www.google.com", ns_t_a))
+ .WillOnce(SetReply(&server_, &rsp));
+ HostResult result;
+ ares_gethostbyname(channel_, "www.google.com.", AF_INET, HostCallback, &result);
+ Process();
+ EXPECT_TRUE(result.done_);
+ EXPECT_EQ(ARES_EFORMERR, result.status_);
+}
+
+TEST_P(MockTCPChannelTest, ServFailResponse) {
+ DNSPacket rsp;
+ rsp.set_response().set_aa()
+ .add_question(new DNSQuestion("www.google.com", ns_t_a));
+ rsp.set_rcode(ns_r_servfail);
+ EXPECT_CALL(server_, OnRequest("www.google.com", ns_t_a))
+ .WillOnce(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_);
+}
+
+TEST_P(MockTCPChannelTest, NotImplResponse) {
+ DNSPacket rsp;
+ rsp.set_response().set_aa()
+ .add_question(new DNSQuestion("www.google.com", ns_t_a));
+ rsp.set_rcode(ns_r_notimpl);
+ EXPECT_CALL(server_, OnRequest("www.google.com", ns_t_a))
+ .WillOnce(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 NOTIMPL consumed
+ EXPECT_EQ(ARES_ECONNREFUSED, result.status_);
+}
+
+TEST_P(MockTCPChannelTest, RefusedResponse) {
+ DNSPacket rsp;
+ rsp.set_response().set_aa()
+ .add_question(new DNSQuestion("www.google.com", ns_t_a));
+ rsp.set_rcode(ns_r_refused);
+ EXPECT_CALL(server_, OnRequest("www.google.com", ns_t_a))
+ .WillOnce(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_);
+}
+
+TEST_P(MockTCPChannelTest, YXDomainResponse) {
+ DNSPacket rsp;
+ rsp.set_response().set_aa()
+ .add_question(new DNSQuestion("www.google.com", ns_t_a));
+ rsp.set_rcode(ns_r_yxdomain);
+ EXPECT_CALL(server_, OnRequest("www.google.com", ns_t_a))
+ .WillOnce(SetReply(&server_, &rsp));
+ HostResult result;
+ ares_gethostbyname(channel_, "www.google.com.", AF_INET, HostCallback, &result);
+ Process();
+ EXPECT_TRUE(result.done_);
+ EXPECT_EQ(ARES_ENODATA, result.status_);
+}
+
+class MockExtraOptsTest
+ : public MockChannelOptsTest,
+ public ::testing::WithParamInterface< std::pair<int, bool> > {
+ public:
+ MockExtraOptsTest()
+ : MockChannelOptsTest(1, GetParam().first, GetParam().second,
+ FillOptions(&opts_),
+ ARES_OPT_SOCK_SNDBUF|ARES_OPT_SOCK_RCVBUF) {}
+ static struct ares_options* FillOptions(struct ares_options * opts) {
+ memset(opts, 0, sizeof(struct ares_options));
+ // Set a few options that affect socket communications
+ opts->socket_send_buffer_size = 514;
+ opts->socket_receive_buffer_size = 514;
+ return opts;
+ }
+ private:
+ struct ares_options opts_;
+};
+
+TEST_P(MockExtraOptsTest, SimpleQuery) {
+ ares_set_local_ip4(channel_, 0x7F000001);
+ byte addr6[16] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01};
+ ares_set_local_ip6(channel_, addr6);
+ ares_set_local_dev(channel_, "dummy");
+
+ DNSPacket rsp;
+ rsp.set_response().set_aa()
+ .add_question(new DNSQuestion("www.google.com", ns_t_a))
+ .add_answer(new DNSARR("www.google.com", 100, {2, 3, 4, 5}));
+ ON_CALL(server_, OnRequest("www.google.com", ns_t_a))
+ .WillByDefault(SetReply(&server_, &rsp));
+
+ 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=[2.3.4.5]}", ss.str());
+}
+
+class MockFlagsChannelOptsTest
+ : public MockChannelOptsTest,
+ public ::testing::WithParamInterface< std::pair<int, bool> > {
+ public:
+ MockFlagsChannelOptsTest(int flags)
+ : MockChannelOptsTest(1, GetParam().first, GetParam().second,
+ FillOptions(&opts_, flags), ARES_OPT_FLAGS) {}
+ static struct ares_options* FillOptions(struct ares_options * opts, int flags) {
+ memset(opts, 0, sizeof(struct ares_options));
+ opts->flags = flags;
+ return opts;
+ }
+ private:
+ struct ares_options opts_;
+};
+
+class MockNoCheckRespChannelTest : public MockFlagsChannelOptsTest {
+ public:
+ MockNoCheckRespChannelTest() : MockFlagsChannelOptsTest(ARES_FLAG_NOCHECKRESP) {}
+};
+
+TEST_P(MockNoCheckRespChannelTest, ServFailResponse) {
+ DNSPacket rsp;
+ rsp.set_response().set_aa()
+ .add_question(new DNSQuestion("www.google.com", ns_t_a));
+ rsp.set_rcode(ns_r_servfail);
+ ON_CALL(server_, OnRequest("www.google.com", ns_t_a))
+ .WillByDefault(SetReply(&server_, &rsp));
+ HostResult result;
+ ares_gethostbyname(channel_, "www.google.com.", AF_INET, HostCallback, &result);
+ Process();
+ EXPECT_TRUE(result.done_);
+ EXPECT_EQ(ARES_ESERVFAIL, result.status_);
+}
+
+TEST_P(MockNoCheckRespChannelTest, NotImplResponse) {
+ DNSPacket rsp;
+ rsp.set_response().set_aa()
+ .add_question(new DNSQuestion("www.google.com", ns_t_a));
+ rsp.set_rcode(ns_r_notimpl);
+ ON_CALL(server_, OnRequest("www.google.com", ns_t_a))
+ .WillByDefault(SetReply(&server_, &rsp));
+ HostResult result;
+ ares_gethostbyname(channel_, "www.google.com.", AF_INET, HostCallback, &result);
+ Process();
+ EXPECT_TRUE(result.done_);
+ EXPECT_EQ(ARES_ENOTIMP, result.status_);
+}
+
+TEST_P(MockNoCheckRespChannelTest, RefusedResponse) {
+ DNSPacket rsp;
+ rsp.set_response().set_aa()
+ .add_question(new DNSQuestion("www.google.com", ns_t_a));
+ rsp.set_rcode(ns_r_refused);
+ ON_CALL(server_, OnRequest("www.google.com", ns_t_a))
+ .WillByDefault(SetReply(&server_, &rsp));
+ HostResult result;
+ ares_gethostbyname(channel_, "www.google.com.", AF_INET, HostCallback, &result);
+ Process();
+ EXPECT_TRUE(result.done_);
+ EXPECT_EQ(ARES_EREFUSED, result.status_);
+}
+
+class MockEDNSChannelTest : public MockFlagsChannelOptsTest {
+ public:
+ MockEDNSChannelTest() : MockFlagsChannelOptsTest(ARES_FLAG_EDNS) {}
+};
+
+TEST_P(MockEDNSChannelTest, RetryWithoutEDNS) {
+ DNSPacket rspfail;
+ rspfail.set_response().set_aa().set_rcode(ns_r_servfail)
+ .add_question(new DNSQuestion("www.google.com", ns_t_a));
+ DNSPacket rspok;
+ rspok.set_response()
+ .add_question(new DNSQuestion("www.google.com", ns_t_a))
+ .add_answer(new DNSARR("www.google.com", 100, {1, 2, 3, 4}));
+ EXPECT_CALL(server_, OnRequest("www.google.com", ns_t_a))
+ .WillOnce(SetReply(&server_, &rspfail))
+ .WillOnce(SetReply(&server_, &rspok));
+ 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, SearchDomains) {
+ DNSPacket nofirst;
+ nofirst.set_response().set_aa().set_rcode(ns_r_nxdomain)
+ .add_question(new DNSQuestion("www.first.com", ns_t_a));
+ ON_CALL(server_, OnRequest("www.first.com", ns_t_a))
+ .WillByDefault(SetReply(&server_, &nofirst));
+ DNSPacket nosecond;
+ nosecond.set_response().set_aa().set_rcode(ns_r_nxdomain)
+ .add_question(new DNSQuestion("www.second.org", ns_t_a));
+ ON_CALL(server_, OnRequest("www.second.org", ns_t_a))
+ .WillByDefault(SetReply(&server_, &nosecond));
+ DNSPacket yesthird;
+ yesthird.set_response().set_aa()
+ .add_question(new DNSQuestion("www.third.gov", ns_t_a))
+ .add_answer(new DNSARR("www.third.gov", 0x0200, {2, 3, 4, 5}));
+ ON_CALL(server_, OnRequest("www.third.gov", ns_t_a))
+ .WillByDefault(SetReply(&server_, &yesthird));
+
+ HostResult result;
+ ares_gethostbyname(channel_, "www", AF_INET, HostCallback, &result);
+ Process();
+ EXPECT_TRUE(result.done_);
+ std::stringstream ss;
+ ss << result.host_;
+ EXPECT_EQ("{'www.third.gov' aliases=[] addrs=[2.3.4.5]}", ss.str());
+}
+
+// Relies on retries so is UDP-only
+TEST_P(MockUDPChannelTest, SearchDomainsWithResentReply) {
+ DNSPacket nofirst;
+ nofirst.set_response().set_aa().set_rcode(ns_r_nxdomain)
+ .add_question(new DNSQuestion("www.first.com", ns_t_a));
+ EXPECT_CALL(server_, OnRequest("www.first.com", ns_t_a))
+ .WillOnce(SetReply(&server_, &nofirst));
+ DNSPacket nosecond;
+ nosecond.set_response().set_aa().set_rcode(ns_r_nxdomain)
+ .add_question(new DNSQuestion("www.second.org", ns_t_a));
+ EXPECT_CALL(server_, OnRequest("www.second.org", ns_t_a))
+ .WillOnce(SetReply(&server_, &nosecond));
+ DNSPacket yesthird;
+ yesthird.set_response().set_aa()
+ .add_question(new DNSQuestion("www.third.gov", ns_t_a))
+ .add_answer(new DNSARR("www.third.gov", 0x0200, {2, 3, 4, 5}));
+ // Before sending the real answer, resend an earlier reply
+ EXPECT_CALL(server_, OnRequest("www.third.gov", ns_t_a))
+ .WillOnce(DoAll(SetReply(&server_, &nofirst),
+ SetReplyQID(&server_, 123)))
+ .WillOnce(DoAll(SetReply(&server_, &yesthird),
+ SetReplyQID(&server_, -1)));
+
+ HostResult result;
+ ares_gethostbyname(channel_, "www", AF_INET, HostCallback, &result);
+ Process();
+ EXPECT_TRUE(result.done_);
+ std::stringstream ss;
+ ss << result.host_;
+ EXPECT_EQ("{'www.third.gov' aliases=[] addrs=[2.3.4.5]}", ss.str());
+}
+
+TEST_P(MockChannelTest, SearchDomainsBare) {
+ DNSPacket nofirst;
+ nofirst.set_response().set_aa().set_rcode(ns_r_nxdomain)
+ .add_question(new DNSQuestion("www.first.com", ns_t_a));
+ ON_CALL(server_, OnRequest("www.first.com", ns_t_a))
+ .WillByDefault(SetReply(&server_, &nofirst));
+ DNSPacket nosecond;
+ nosecond.set_response().set_aa().set_rcode(ns_r_nxdomain)
+ .add_question(new DNSQuestion("www.second.org", ns_t_a));
+ ON_CALL(server_, OnRequest("www.second.org", ns_t_a))
+ .WillByDefault(SetReply(&server_, &nosecond));
+ DNSPacket nothird;
+ nothird.set_response().set_aa().set_rcode(ns_r_nxdomain)
+ .add_question(new DNSQuestion("www.third.gov", ns_t_a));
+ ON_CALL(server_, OnRequest("www.third.gov", ns_t_a))
+ .WillByDefault(SetReply(&server_, &nothird));
+ DNSPacket yesbare;
+ yesbare.set_response().set_aa()
+ .add_question(new DNSQuestion("www", ns_t_a))
+ .add_answer(new DNSARR("www", 0x0200, {2, 3, 4, 5}));
+ ON_CALL(server_, OnRequest("www", ns_t_a))
+ .WillByDefault(SetReply(&server_, &yesbare));
+
+ HostResult result;
+ ares_gethostbyname(channel_, "www", AF_INET, HostCallback, &result);
+ Process();
+ EXPECT_TRUE(result.done_);
+ std::stringstream ss;
+ ss << result.host_;
+ EXPECT_EQ("{'www' aliases=[] addrs=[2.3.4.5]}", ss.str());
+}
+
+TEST_P(MockChannelTest, SearchNoDataThenSuccess) {
+ // First two search domains recognize the name but have no A records.
+ DNSPacket nofirst;
+ nofirst.set_response().set_aa()
+ .add_question(new DNSQuestion("www.first.com", ns_t_a));
+ ON_CALL(server_, OnRequest("www.first.com", ns_t_a))
+ .WillByDefault(SetReply(&server_, &nofirst));
+ DNSPacket nosecond;
+ nosecond.set_response().set_aa()
+ .add_question(new DNSQuestion("www.second.org", ns_t_a));
+ ON_CALL(server_, OnRequest("www.second.org", ns_t_a))
+ .WillByDefault(SetReply(&server_, &nosecond));
+ DNSPacket yesthird;
+ yesthird.set_response().set_aa()
+ .add_question(new DNSQuestion("www.third.gov", ns_t_a))
+ .add_answer(new DNSARR("www.third.gov", 0x0200, {2, 3, 4, 5}));
+ ON_CALL(server_, OnRequest("www.third.gov", ns_t_a))
+ .WillByDefault(SetReply(&server_, &yesthird));
+
+ HostResult result;
+ ares_gethostbyname(channel_, "www", AF_INET, HostCallback, &result);
+ Process();
+ EXPECT_TRUE(result.done_);
+ std::stringstream ss;
+ ss << result.host_;
+ EXPECT_EQ("{'www.third.gov' aliases=[] addrs=[2.3.4.5]}", ss.str());
+}
+
+TEST_P(MockChannelTest, SearchNoDataThenNoDataBare) {
+ // First two search domains recognize the name but have no A records.
+ DNSPacket nofirst;
+ nofirst.set_response().set_aa()
+ .add_question(new DNSQuestion("www.first.com", ns_t_a));
+ ON_CALL(server_, OnRequest("www.first.com", ns_t_a))
+ .WillByDefault(SetReply(&server_, &nofirst));
+ DNSPacket nosecond;
+ nosecond.set_response().set_aa()
+ .add_question(new DNSQuestion("www.second.org", ns_t_a));
+ ON_CALL(server_, OnRequest("www.second.org", ns_t_a))
+ .WillByDefault(SetReply(&server_, &nosecond));
+ DNSPacket nothird;
+ nothird.set_response().set_aa()
+ .add_question(new DNSQuestion("www.third.gov", ns_t_a));
+ ON_CALL(server_, OnRequest("www.third.gov", ns_t_a))
+ .WillByDefault(SetReply(&server_, &nothird));
+ DNSPacket nobare;
+ nobare.set_response().set_aa()
+ .add_question(new DNSQuestion("www", ns_t_a));
+ ON_CALL(server_, OnRequest("www", ns_t_a))
+ .WillByDefault(SetReply(&server_, &nobare));
+
+ HostResult result;
+ ares_gethostbyname(channel_, "www", AF_INET, HostCallback, &result);
+ Process();
+ EXPECT_TRUE(result.done_);
+ EXPECT_EQ(ARES_ENODATA, result.status_);
+}
+
+TEST_P(MockChannelTest, SearchNoDataThenFail) {
+ // First two search domains recognize the name but have no A records.
+ DNSPacket nofirst;
+ nofirst.set_response().set_aa()
+ .add_question(new DNSQuestion("www.first.com", ns_t_a));
+ ON_CALL(server_, OnRequest("www.first.com", ns_t_a))
+ .WillByDefault(SetReply(&server_, &nofirst));
+ DNSPacket nosecond;
+ nosecond.set_response().set_aa()
+ .add_question(new DNSQuestion("www.second.org", ns_t_a));
+ ON_CALL(server_, OnRequest("www.second.org", ns_t_a))
+ .WillByDefault(SetReply(&server_, &nosecond));
+ DNSPacket nothird;
+ nothird.set_response().set_aa()
+ .add_question(new DNSQuestion("www.third.gov", ns_t_a));
+ ON_CALL(server_, OnRequest("www.third.gov", ns_t_a))
+ .WillByDefault(SetReply(&server_, &nothird));
+ DNSPacket nobare;
+ nobare.set_response().set_aa().set_rcode(ns_r_nxdomain)
+ .add_question(new DNSQuestion("www", ns_t_a));
+ ON_CALL(server_, OnRequest("www", ns_t_a))
+ .WillByDefault(SetReply(&server_, &nobare));
+
+ HostResult result;
+ ares_gethostbyname(channel_, "www", AF_INET, HostCallback, &result);
+ Process();
+ EXPECT_TRUE(result.done_);
+ EXPECT_EQ(ARES_ENODATA, result.status_);
+}
+
+TEST_P(MockChannelTest, SearchAllocFailure) {
+ SearchResult result;
+ SetAllocFail(1);
+ ares_search(channel_, "fully.qualified.", ns_c_in, ns_t_a, SearchCallback, &result);
+ /* Already done */
+ EXPECT_TRUE(result.done_);
+ EXPECT_EQ(ARES_ENOMEM, result.status_);
+}
+
+TEST_P(MockChannelTest, SearchHighNdots) {
+ DNSPacket nobare;
+ nobare.set_response().set_aa().set_rcode(ns_r_nxdomain)
+ .add_question(new DNSQuestion("a.b.c.w.w.w", ns_t_a));
+ ON_CALL(server_, OnRequest("a.b.c.w.w.w", ns_t_a))
+ .WillByDefault(SetReply(&server_, &nobare));
+ DNSPacket yesfirst;
+ yesfirst.set_response().set_aa()
+ .add_question(new DNSQuestion("a.b.c.w.w.w.first.com", ns_t_a))
+ .add_answer(new DNSARR("a.b.c.w.w.w.first.com", 0x0200, {2, 3, 4, 5}));
+ ON_CALL(server_, OnRequest("a.b.c.w.w.w.first.com", ns_t_a))
+ .WillByDefault(SetReply(&server_, &yesfirst));
+
+ SearchResult result;
+ ares_search(channel_, "a.b.c.w.w.w", ns_c_in, ns_t_a, SearchCallback, &result);
+ Process();
+ EXPECT_TRUE(result.done_);
+ EXPECT_EQ(ARES_SUCCESS, result.status_);
+ std::stringstream ss;
+ ss << PacketToString(result.data_);
+ EXPECT_EQ("RSP QRY AA NOERROR Q:{'a.b.c.w.w.w.first.com' IN A} "
+ "A:{'a.b.c.w.w.w.first.com' IN A TTL=512 2.3.4.5}",
+ ss.str());
+}
+
+TEST_P(MockChannelTest, UnspecifiedFamilyV6) {
+ DNSPacket rsp6;
+ rsp6.set_response().set_aa()
+ .add_question(new DNSQuestion("example.com", ns_t_aaaa))
+ .add_answer(new DNSAaaaRR("example.com", 100,
+ {0x21, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03}));
+ ON_CALL(server_, OnRequest("example.com", ns_t_aaaa))
+ .WillByDefault(SetReply(&server_, &rsp6));
+
+ HostResult result;
+ ares_gethostbyname(channel_, "example.com.", AF_UNSPEC, HostCallback, &result);
+ Process();
+ EXPECT_TRUE(result.done_);
+ std::stringstream ss;
+ ss << result.host_;
+ // Default to IPv6 when both are available.
+ EXPECT_EQ("{'example.com' aliases=[] addrs=[2121:0000:0000:0000:0000:0000:0000:0303]}", ss.str());
+}
+
+TEST_P(MockChannelTest, UnspecifiedFamilyV4) {
+ DNSPacket rsp6;
+ rsp6.set_response().set_aa()
+ .add_question(new DNSQuestion("example.com", ns_t_aaaa));
+ ON_CALL(server_, OnRequest("example.com", ns_t_aaaa))
+ .WillByDefault(SetReply(&server_, &rsp6));
+ DNSPacket rsp4;
+ rsp4.set_response().set_aa()
+ .add_question(new DNSQuestion("example.com", ns_t_a))
+ .add_answer(new DNSARR("example.com", 100, {2, 3, 4, 5}));
+ ON_CALL(server_, OnRequest("example.com", ns_t_a))
+ .WillByDefault(SetReply(&server_, &rsp4));
+
+ HostResult result;
+ ares_gethostbyname(channel_, "example.com.", AF_UNSPEC, HostCallback, &result);
+ Process();
+ EXPECT_TRUE(result.done_);
+ std::stringstream ss;
+ ss << result.host_;
+ EXPECT_EQ("{'example.com' aliases=[] addrs=[2.3.4.5]}", ss.str());
+}
+
+TEST_P(MockChannelTest, UnspecifiedFamilyNoData) {
+ DNSPacket rsp6;
+ rsp6.set_response().set_aa()
+ .add_question(new DNSQuestion("example.com", ns_t_aaaa))
+ .add_answer(new DNSCnameRR("example.com", 100, "elsewhere.com"));
+ ON_CALL(server_, OnRequest("example.com", ns_t_aaaa))
+ .WillByDefault(SetReply(&server_, &rsp6));
+ DNSPacket rsp4;
+ rsp4.set_response().set_aa()
+ .add_question(new DNSQuestion("example.com", ns_t_a));
+ ON_CALL(server_, OnRequest("example.com", ns_t_a))
+ .WillByDefault(SetReply(&server_, &rsp4));
+
+ HostResult result;
+ ares_gethostbyname(channel_, "example.com.", AF_UNSPEC, HostCallback, &result);
+ Process();
+ EXPECT_TRUE(result.done_);
+ std::stringstream ss;
+ ss << result.host_;
+ EXPECT_EQ("{'' aliases=[] addrs=[]}", ss.str());
+}
+
+TEST_P(MockChannelTest, UnspecifiedFamilyCname6A4) {
+ DNSPacket rsp6;
+ rsp6.set_response().set_aa()
+ .add_question(new DNSQuestion("example.com", ns_t_aaaa))
+ .add_answer(new DNSCnameRR("example.com", 100, "elsewhere.com"));
+ ON_CALL(server_, OnRequest("example.com", ns_t_aaaa))
+ .WillByDefault(SetReply(&server_, &rsp6));
+ DNSPacket rsp4;
+ rsp4.set_response().set_aa()
+ .add_question(new DNSQuestion("example.com", ns_t_a))
+ .add_answer(new DNSARR("example.com", 100, {1, 2, 3, 4}));
+ ON_CALL(server_, OnRequest("example.com", ns_t_a))
+ .WillByDefault(SetReply(&server_, &rsp4));
+
+ HostResult result;
+ ares_gethostbyname(channel_, "example.com.", AF_UNSPEC, HostCallback, &result);
+ Process();
+ EXPECT_TRUE(result.done_);
+ std::stringstream ss;
+ ss << result.host_;
+ EXPECT_EQ("{'example.com' aliases=[] addrs=[1.2.3.4]}", ss.str());
+}
+
+TEST_P(MockChannelTest, ExplicitIP) {
+ HostResult result;
+ ares_gethostbyname(channel_, "1.2.3.4", AF_INET, HostCallback, &result);
+ EXPECT_TRUE(result.done_); // Immediate return
+ EXPECT_EQ(ARES_SUCCESS, result.status_);
+ std::stringstream ss;
+ ss << result.host_;
+ EXPECT_EQ("{'1.2.3.4' aliases=[] addrs=[1.2.3.4]}", ss.str());
+}
+
+TEST_P(MockChannelTest, ExplicitIPAllocFail) {
+ HostResult result;
+ SetAllocSizeFail(strlen("1.2.3.4") + 1);
+ ares_gethostbyname(channel_, "1.2.3.4", AF_INET, HostCallback, &result);
+ EXPECT_TRUE(result.done_); // Immediate return
+ EXPECT_EQ(ARES_ENOMEM, result.status_);
+}
+
+TEST_P(MockChannelTest, SortListV4) {
+ DNSPacket rsp;
+ rsp.set_response().set_aa()
+ .add_question(new DNSQuestion("example.com", ns_t_a))
+ .add_answer(new DNSARR("example.com", 100, {22, 23, 24, 25}))
+ .add_answer(new DNSARR("example.com", 100, {12, 13, 14, 15}))
+ .add_answer(new DNSARR("example.com", 100, {2, 3, 4, 5}));
+ ON_CALL(server_, OnRequest("example.com", ns_t_a))
+ .WillByDefault(SetReply(&server_, &rsp));
+
+ {
+ EXPECT_EQ(ARES_SUCCESS, ares_set_sortlist(channel_, "12.13.0.0/255.255.0.0 1234::5678"));
+ HostResult result;
+ ares_gethostbyname(channel_, "example.com.", AF_INET, HostCallback, &result);
+ Process();
+ EXPECT_TRUE(result.done_);
+ std::stringstream ss;
+ ss << result.host_;
+ EXPECT_EQ("{'example.com' aliases=[] addrs=[12.13.14.15, 22.23.24.25, 2.3.4.5]}", ss.str());
+ }
+ {
+ EXPECT_EQ(ARES_SUCCESS, ares_set_sortlist(channel_, "2.3.0.0/16 130.140.150.160/26"));
+ HostResult result;
+ ares_gethostbyname(channel_, "example.com.", AF_INET, HostCallback, &result);
+ Process();
+ EXPECT_TRUE(result.done_);
+ std::stringstream ss;
+ ss << result.host_;
+ EXPECT_EQ("{'example.com' aliases=[] addrs=[2.3.4.5, 22.23.24.25, 12.13.14.15]}", ss.str());
+ }
+ struct ares_options options;
+ memset(&options, 0, sizeof(options));
+ int optmask = 0;
+ EXPECT_EQ(ARES_SUCCESS, ares_save_options(channel_, &options, &optmask));
+ EXPECT_TRUE((optmask & ARES_OPT_SORTLIST) == ARES_OPT_SORTLIST);
+ ares_destroy_options(&options);
+}
+
+TEST_P(MockChannelTest, SortListV6) {
+ DNSPacket rsp;
+ rsp.set_response().set_aa()
+ .add_question(new DNSQuestion("example.com", ns_t_aaaa))
+ .add_answer(new DNSAaaaRR("example.com", 100,
+ {0x11, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02}))
+ .add_answer(new DNSAaaaRR("example.com", 100,
+ {0x21, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03}));
+ ON_CALL(server_, OnRequest("example.com", ns_t_aaaa))
+ .WillByDefault(SetReply(&server_, &rsp));
+
+ {
+ ares_set_sortlist(channel_, "1111::/16 2.3.0.0/255.255.0.0");
+ HostResult result;
+ ares_gethostbyname(channel_, "example.com.", AF_INET6, HostCallback, &result);
+ Process();
+ EXPECT_TRUE(result.done_);
+ std::stringstream ss;
+ ss << result.host_;
+ EXPECT_EQ("{'example.com' aliases=[] addrs=[1111:0000:0000:0000:0000:0000:0000:0202, "
+ "2121:0000:0000:0000:0000:0000:0000:0303]}", ss.str());
+ }
+ {
+ ares_set_sortlist(channel_, "2121::/8");
+ HostResult result;
+ ares_gethostbyname(channel_, "example.com.", AF_INET6, HostCallback, &result);
+ Process();
+ EXPECT_TRUE(result.done_);
+ std::stringstream ss;
+ ss << result.host_;
+ EXPECT_EQ("{'example.com' aliases=[] addrs=[2121:0000:0000:0000:0000:0000:0000:0303, "
+ "1111:0000:0000:0000:0000:0000:0000:0202]}", ss.str());
+ }
+}
+
+// Relies on retries so is UDP-only
+TEST_P(MockUDPChannelTest, SearchDomainsAllocFail) {
+ DNSPacket nofirst;
+ nofirst.set_response().set_aa().set_rcode(ns_r_nxdomain)
+ .add_question(new DNSQuestion("www.first.com", ns_t_a));
+ ON_CALL(server_, OnRequest("www.first.com", ns_t_a))
+ .WillByDefault(SetReply(&server_, &nofirst));
+ DNSPacket nosecond;
+ nosecond.set_response().set_aa().set_rcode(ns_r_nxdomain)
+ .add_question(new DNSQuestion("www.second.org", ns_t_a));
+ ON_CALL(server_, OnRequest("www.second.org", ns_t_a))
+ .WillByDefault(SetReply(&server_, &nosecond));
+ DNSPacket yesthird;
+ yesthird.set_response().set_aa()
+ .add_question(new DNSQuestion("www.third.gov", ns_t_a))
+ .add_answer(new DNSARR("www.third.gov", 0x0200, {2, 3, 4, 5}));
+ ON_CALL(server_, OnRequest("www.third.gov", ns_t_a))
+ .WillByDefault(SetReply(&server_, &yesthird));
+
+ // 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;
+ HostResult results[kCount];
+ for (int ii = 1; ii <= kCount; ii++) {
+ HostResult* result = &(results[ii - 1]);
+ ClearFails();
+ SetAllocFail(ii);
+ ares_gethostbyname(channel_, "www", AF_INET, HostCallback, result);
+ Process();
+ EXPECT_TRUE(result->done_);
+ if (result->status_ == ARES_SUCCESS) {
+ std::stringstream ss;
+ ss << result->host_;
+ EXPECT_EQ("{'www.third.gov' aliases=[] addrs=[2.3.4.5]}", ss.str()) << " failed alloc #" << ii;
+ if (verbose) std::cerr << "Succeeded despite failure of alloc #" << ii << std::endl;
+ }
+ }
+
+ // Explicitly destroy the channel now, so that the HostResult objects
+ // are still valid (in case any pending work refers to them).
+ ares_destroy(channel_);
+ channel_ = nullptr;
+}
+
+// Relies on retries so is UDP-only
+TEST_P(MockUDPChannelTest, Resend) {
+ std::vector<byte> nothing;
+ DNSPacket reply;
+ reply.set_response().set_aa()
+ .add_question(new DNSQuestion("www.google.com", ns_t_a))
+ .add_answer(new DNSARR("www.google.com", 0x0100, {0x01, 0x02, 0x03, 0x04}));
+
+ EXPECT_CALL(server_, OnRequest("www.google.com", ns_t_a))
+ .WillOnce(SetReplyData(&server_, nothing))
+ .WillOnce(SetReplyData(&server_, nothing))
+ .WillOnce(SetReply(&server_, &reply));
+
+ HostResult result;
+ ares_gethostbyname(channel_, "www.google.com.", AF_INET, HostCallback, &result);
+ Process();
+ EXPECT_TRUE(result.done_);
+ EXPECT_EQ(2, result.timeouts_);
+ std::stringstream ss;
+ ss << result.host_;
+ EXPECT_EQ("{'www.google.com' aliases=[] addrs=[1.2.3.4]}", ss.str());
+}
+
+TEST_P(MockChannelTest, CancelImmediate) {
+ HostResult result;
+ ares_gethostbyname(channel_, "www.google.com.", AF_INET, HostCallback, &result);
+ ares_cancel(channel_);
+ EXPECT_TRUE(result.done_);
+ EXPECT_EQ(ARES_ECANCELLED, result.status_);
+ EXPECT_EQ(0, result.timeouts_);
+}
+
+TEST_P(MockChannelTest, CancelImmediateGetHostByAddr) {
+ HostResult result;
+ struct in_addr addr;
+ addr.s_addr = htonl(0x08080808);
+
+ ares_gethostbyaddr(channel_, &addr, sizeof(addr), AF_INET, HostCallback, &result);
+ ares_cancel(channel_);
+ EXPECT_TRUE(result.done_);
+ EXPECT_EQ(ARES_ECANCELLED, result.status_);
+ EXPECT_EQ(0, result.timeouts_);
+}
+
+// Relies on retries so is UDP-only
+TEST_P(MockUDPChannelTest, CancelLater) {
+ std::vector<byte> nothing;
+
+ // On second request, cancel the channel.
+ EXPECT_CALL(server_, OnRequest("www.google.com", ns_t_a))
+ .WillOnce(SetReplyData(&server_, nothing))
+ .WillOnce(CancelChannel(&server_, channel_));
+
+ HostResult result;
+ ares_gethostbyname(channel_, "www.google.com.", AF_INET, HostCallback, &result);
+ Process();
+ EXPECT_TRUE(result.done_);
+ EXPECT_EQ(ARES_ECANCELLED, result.status_);
+ EXPECT_EQ(0, result.timeouts_);
+}
+
+TEST_P(MockChannelTest, GetHostByNameDestroyAbsolute) {
+ HostResult result;
+ ares_gethostbyname(channel_, "www.google.com.", AF_INET, HostCallback, &result);
+
+ ares_destroy(channel_);
+ channel_ = nullptr;
+
+ EXPECT_TRUE(result.done_); // Synchronous
+ EXPECT_EQ(ARES_EDESTRUCTION, result.status_);
+ EXPECT_EQ(0, result.timeouts_);
+}
+
+TEST_P(MockChannelTest, GetHostByNameDestroyRelative) {
+ HostResult result;
+ ares_gethostbyname(channel_, "www", AF_INET, HostCallback, &result);
+
+ ares_destroy(channel_);
+ channel_ = nullptr;
+
+ EXPECT_TRUE(result.done_); // Synchronous
+ EXPECT_EQ(ARES_EDESTRUCTION, result.status_);
+ EXPECT_EQ(0, result.timeouts_);
+}
+
+TEST_P(MockChannelTest, GetHostByNameCNAMENoData) {
+ DNSPacket response;
+ response.set_response().set_aa()
+ .add_question(new DNSQuestion("cname.first.com", ns_t_a))
+ .add_answer(new DNSCnameRR("cname.first.com", 100, "a.first.com"));
+ ON_CALL(server_, OnRequest("cname.first.com", ns_t_a))
+ .WillByDefault(SetReply(&server_, &response));
+
+ HostResult result;
+ ares_gethostbyname(channel_, "cname.first.com", AF_INET, HostCallback, &result);
+ Process();
+ EXPECT_TRUE(result.done_);
+ EXPECT_EQ(ARES_ENODATA, result.status_);
+}
+
+TEST_P(MockChannelTest, GetHostByAddrDestroy) {
+ unsigned char gdns_addr4[4] = {0x08, 0x08, 0x08, 0x08};
+ HostResult result;
+ ares_gethostbyaddr(channel_, gdns_addr4, sizeof(gdns_addr4), AF_INET, HostCallback, &result);
+
+ ares_destroy(channel_);
+ channel_ = nullptr;
+
+ EXPECT_TRUE(result.done_); // Synchronous
+ EXPECT_EQ(ARES_EDESTRUCTION, result.status_);
+ EXPECT_EQ(0, result.timeouts_);
+}
+
+#ifndef WIN32
+TEST_P(MockChannelTest, HostAlias) {
+ DNSPacket reply;
+ reply.set_response().set_aa()
+ .add_question(new DNSQuestion("www.google.com", ns_t_a))
+ .add_answer(new DNSARR("www.google.com", 0x0100, {0x01, 0x02, 0x03, 0x04}));
+ ON_CALL(server_, OnRequest("www.google.com", ns_t_a))
+ .WillByDefault(SetReply(&server_, &reply));
+
+ TempFile aliases("\n\n# www commentedout\nwww www.google.com\n");
+ EnvValue with_env("HOSTALIASES", aliases.filename());
+
+ HostResult result;
+ ares_gethostbyname(channel_, "www", 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, HostAliasMissing) {
+ DNSPacket yesfirst;
+ yesfirst.set_response().set_aa()
+ .add_question(new DNSQuestion("www.first.com", ns_t_a))
+ .add_answer(new DNSARR("www.first.com", 0x0200, {2, 3, 4, 5}));
+ ON_CALL(server_, OnRequest("www.first.com", ns_t_a))
+ .WillByDefault(SetReply(&server_, &yesfirst));
+
+ TempFile aliases("\n\n# www commentedout\nww www.google.com\n");
+ EnvValue with_env("HOSTALIASES", aliases.filename());
+ HostResult result;
+ ares_gethostbyname(channel_, "www", AF_INET, HostCallback, &result);
+ Process();
+ EXPECT_TRUE(result.done_);
+ std::stringstream ss;
+ ss << result.host_;
+ EXPECT_EQ("{'www.first.com' aliases=[] addrs=[2.3.4.5]}", ss.str());
+}
+
+TEST_P(MockChannelTest, HostAliasMissingFile) {
+ DNSPacket yesfirst;
+ yesfirst.set_response().set_aa()
+ .add_question(new DNSQuestion("www.first.com", ns_t_a))
+ .add_answer(new DNSARR("www.first.com", 0x0200, {2, 3, 4, 5}));
+ ON_CALL(server_, OnRequest("www.first.com", ns_t_a))
+ .WillByDefault(SetReply(&server_, &yesfirst));
+
+ EnvValue with_env("HOSTALIASES", "bogus.mcfile");
+ HostResult result;
+ ares_gethostbyname(channel_, "www", AF_INET, HostCallback, &result);
+ Process();
+ EXPECT_TRUE(result.done_);
+ std::stringstream ss;
+ ss << result.host_;
+ EXPECT_EQ("{'www.first.com' aliases=[] addrs=[2.3.4.5]}", ss.str());
+}
+
+TEST_P(MockChannelTest, HostAliasUnreadable) {
+ TempFile aliases("www www.google.com\n");
+ chmod(aliases.filename(), 0);
+ EnvValue with_env("HOSTALIASES", aliases.filename());
+
+ HostResult result;
+ ares_gethostbyname(channel_, "www", AF_INET, HostCallback, &result);
+ EXPECT_TRUE(result.done_);
+ EXPECT_EQ(ARES_EFILE, result.status_);
+ chmod(aliases.filename(), 0777);
+}
+#endif
+
+class MockMultiServerChannelTest
+ : public MockChannelOptsTest,
+ public ::testing::WithParamInterface< std::pair<int, bool> > {
+ public:
+ MockMultiServerChannelTest(bool rotate)
+ : MockChannelOptsTest(3, GetParam().first, GetParam().second, nullptr, rotate ? ARES_OPT_ROTATE : ARES_OPT_NOROTATE) {}
+ void CheckExample() {
+ HostResult result;
+ ares_gethostbyname(channel_, "www.example.com.", AF_INET, HostCallback, &result);
+ Process();
+ EXPECT_TRUE(result.done_);
+ std::stringstream ss;
+ ss << result.host_;
+ EXPECT_EQ("{'www.example.com' aliases=[] addrs=[2.3.4.5]}", ss.str());
+ }
+};
+
+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};
+ int optmask = 0;
+ EXPECT_EQ(ARES_SUCCESS, ares_save_options(channel_, &opts, &optmask));
+ EXPECT_EQ(0, (optmask & ARES_OPT_NOROTATE));
+ ares_destroy_options(&opts);
+
+ DNSPacket servfailrsp;
+ servfailrsp.set_response().set_aa().set_rcode(ns_r_servfail)
+ .add_question(new DNSQuestion("www.example.com", ns_t_a));
+ DNSPacket notimplrsp;
+ notimplrsp.set_response().set_aa().set_rcode(ns_r_notimpl)
+ .add_question(new DNSQuestion("www.example.com", ns_t_a));
+ DNSPacket okrsp;
+ okrsp.set_response().set_aa()
+ .add_question(new DNSQuestion("www.example.com", ns_t_a))
+ .add_answer(new DNSARR("www.example.com", 100, {2,3,4,5}));
+
+ EXPECT_CALL(*servers_[0], OnRequest("www.example.com", ns_t_a))
+ .WillOnce(SetReply(servers_[0].get(), &servfailrsp));
+ EXPECT_CALL(*servers_[1], OnRequest("www.example.com", ns_t_a))
+ .WillOnce(SetReply(servers_[1].get(), &notimplrsp));
+ EXPECT_CALL(*servers_[2], OnRequest("www.example.com", ns_t_a))
+ .WillOnce(SetReply(servers_[2].get(), &okrsp));
+ CheckExample();
+
+ // Second time around, starts from server [1].
+ EXPECT_CALL(*servers_[1], OnRequest("www.example.com", ns_t_a))
+ .WillOnce(SetReply(servers_[1].get(), &servfailrsp));
+ EXPECT_CALL(*servers_[2], OnRequest("www.example.com", ns_t_a))
+ .WillOnce(SetReply(servers_[2].get(), &notimplrsp));
+ EXPECT_CALL(*servers_[0], OnRequest("www.example.com", ns_t_a))
+ .WillOnce(SetReply(servers_[0].get(), &okrsp));
+ CheckExample();
+
+ // Third time around, starts from server [2].
+ EXPECT_CALL(*servers_[2], OnRequest("www.example.com", ns_t_a))
+ .WillOnce(SetReply(servers_[2].get(), &servfailrsp));
+ EXPECT_CALL(*servers_[0], OnRequest("www.example.com", ns_t_a))
+ .WillOnce(SetReply(servers_[0].get(), &notimplrsp));
+ EXPECT_CALL(*servers_[1], OnRequest("www.example.com", ns_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(ns_r_servfail)
+ .add_question(new DNSQuestion("www.example.com", ns_t_a));
+ DNSPacket notimplrsp;
+ notimplrsp.set_response().set_aa().set_rcode(ns_r_notimpl)
+ .add_question(new DNSQuestion("www.example.com", ns_t_a));
+ DNSPacket okrsp;
+ okrsp.set_response().set_aa()
+ .add_question(new DNSQuestion("www.example.com", ns_t_a))
+ .add_answer(new DNSARR("www.example.com", 100, {2,3,4,5}));
+
+ EXPECT_CALL(*servers_[0], OnRequest("www.example.com", ns_t_a))
+ .WillOnce(SetReply(servers_[0].get(), &servfailrsp));
+ EXPECT_CALL(*servers_[1], OnRequest("www.example.com", ns_t_a))
+ .WillOnce(SetReply(servers_[1].get(), &notimplrsp));
+ EXPECT_CALL(*servers_[2], OnRequest("www.example.com", ns_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", ns_t_a))
+ .WillOnce(SetReply(servers_[0].get(), &servfailrsp));
+ EXPECT_CALL(*servers_[1], OnRequest("www.example.com", ns_t_a))
+ .WillOnce(SetReply(servers_[1].get(), &notimplrsp));
+ EXPECT_CALL(*servers_[2], OnRequest("www.example.com", ns_t_a))
+ .WillOnce(SetReply(servers_[2].get(), &okrsp));
+ CheckExample();
+
+ // Third time around, still starts from server [0].
+ EXPECT_CALL(*servers_[0], OnRequest("www.example.com", ns_t_a))
+ .WillOnce(SetReply(servers_[0].get(), &servfailrsp));
+ EXPECT_CALL(*servers_[1], OnRequest("www.example.com", ns_t_a))
+ .WillOnce(SetReply(servers_[1].get(), &notimplrsp));
+ EXPECT_CALL(*servers_[2], OnRequest("www.example.com", ns_t_a))
+ .WillOnce(SetReply(servers_[2].get(), &okrsp));
+ CheckExample();
+}
+
+INSTANTIATE_TEST_CASE_P(AddressFamilies, MockChannelTest, ::testing::ValuesIn(ares::test::families_modes));
+
+INSTANTIATE_TEST_CASE_P(AddressFamilies, MockUDPChannelTest, ::testing::ValuesIn(ares::test::families));
+
+INSTANTIATE_TEST_CASE_P(AddressFamilies, MockTCPChannelTest, ::testing::ValuesIn(ares::test::families));
+
+INSTANTIATE_TEST_CASE_P(AddressFamilies, MockExtraOptsTest, ::testing::ValuesIn(ares::test::families_modes));
+
+INSTANTIATE_TEST_CASE_P(AddressFamilies, MockNoCheckRespChannelTest, ::testing::ValuesIn(ares::test::families_modes));
+
+INSTANTIATE_TEST_CASE_P(AddressFamilies, MockEDNSChannelTest, ::testing::ValuesIn(ares::test::families_modes));
+
+INSTANTIATE_TEST_CASE_P(TransportModes, RotateMultiMockTest, ::testing::ValuesIn(ares::test::families_modes));
+
+INSTANTIATE_TEST_CASE_P(TransportModes, NoRotateMultiMockTest, ::testing::ValuesIn(ares::test::families_modes));
+
+} // namespace test
+} // namespace ares
diff --git a/contrib/libs/c-ares/test/ares-test-ns.cc b/contrib/libs/c-ares/test/ares-test-ns.cc
new file mode 100644
index 0000000000..c3c455214d
--- /dev/null
+++ b/contrib/libs/c-ares/test/ares-test-ns.cc
@@ -0,0 +1,199 @@
+#include "ares-test.h"
+
+#ifdef HAVE_CONTAINER
+
+#include <sys/mount.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+#include <iostream>
+#include <functional>
+#include <string>
+#include <sstream>
+#include <vector>
+
+namespace ares {
+namespace test {
+
+namespace {
+
+struct ContainerInfo {
+ ContainerFilesystem* fs_;
+ std::string hostname_;
+ std::string domainname_;
+ VoidToIntFn fn_;
+};
+
+int EnterContainer(void *data) {
+ ContainerInfo *container = (ContainerInfo*)data;
+
+ if (verbose) {
+ std::cerr << "Running function in container {chroot='"
+ << container->fs_->root() << "', hostname='" << container->hostname_
+ << "', domainname='" << container->domainname_ << "'}"
+ << std::endl;
+ }
+
+ // Ensure we are apparently root before continuing.
+ int count = 10;
+ while (getuid() != 0 && count > 0) {
+ usleep(100000);
+ count--;
+ }
+ if (getuid() != 0) {
+ std::cerr << "Child in user namespace has uid " << getuid() << std::endl;
+ return -1;
+ }
+ if (!container->fs_->mountpt().empty()) {
+ // We want to bind mount this inside the specified directory.
+ std::string innerdir = container->fs_->root() + container->fs_->mountpt();
+ if (verbose) std::cerr << " mount --bind " << container->fs_->mountpt()
+ << " " << innerdir << std::endl;
+ int rc = mount(container->fs_->mountpt().c_str(), innerdir.c_str(),
+ "none", MS_BIND, 0);
+ if (rc != 0) {
+ std::cerr << "Warning: failed to bind mount " << container->fs_->mountpt() << " at "
+ << innerdir << ", errno=" << errno << std::endl;
+ }
+ }
+
+ // Move into the specified directory.
+ if (chdir(container->fs_->root().c_str()) != 0) {
+ std::cerr << "Failed to chdir('" << container->fs_->root()
+ << "'), errno=" << errno << std::endl;
+ return -1;
+ }
+ // And make it the new root directory;
+ char buffer[PATH_MAX + 1];
+ if (getcwd(buffer, PATH_MAX) == NULL) {
+ std::cerr << "failed to retrieve cwd, errno=" << errno << std::endl;
+ return -1;
+ }
+ buffer[PATH_MAX] = '\0';
+ if (chroot(buffer) != 0) {
+ std::cerr << "chroot('" << buffer << "') failed, errno=" << errno << std::endl;
+ return -1;
+ }
+
+ // Set host/domainnames if specified
+ if (!container->hostname_.empty()) {
+ if (sethostname(container->hostname_.c_str(),
+ container->hostname_.size()) != 0) {
+ std::cerr << "Failed to sethostname('" << container->hostname_
+ << "'), errno=" << errno << std::endl;
+ return -1;
+ }
+ }
+ if (!container->domainname_.empty()) {
+ if (setdomainname(container->domainname_.c_str(),
+ container->domainname_.size()) != 0) {
+ std::cerr << "Failed to setdomainname('" << container->domainname_
+ << "'), errno=" << errno << std::endl;
+ return -1;
+ }
+ }
+
+ return container->fn_();
+}
+
+} // namespace
+
+// Run a function while:
+// - chroot()ed into a particular directory
+// - having a specified hostname/domainname
+
+int RunInContainer(ContainerFilesystem* fs, const std::string& hostname,
+ const std::string& domainname, VoidToIntFn fn) {
+ const int stack_size = 1024 * 1024;
+ std::vector<byte> stack(stack_size, 0);
+ ContainerInfo container = {fs, hostname, domainname, fn};
+
+ // Start a child process in a new user and UTS namespace
+ pid_t child = clone(EnterContainer, stack.data() + stack_size,
+ CLONE_VM|CLONE_NEWNS|CLONE_NEWUSER|CLONE_NEWUTS|SIGCHLD,
+ (void *)&container);
+ if (child < 0) {
+ std::cerr << "Failed to clone(), errno=" << errno << std::endl;
+ return -1;
+ }
+
+ // Build the UID map that makes us look like root inside the namespace.
+ std::stringstream mapfiless;
+ mapfiless << "/proc/" << child << "/uid_map";
+ std::string mapfile = mapfiless.str();
+ int fd = open(mapfile.c_str(), O_CREAT|O_WRONLY|O_TRUNC, 0644);
+ if (fd < 0) {
+ std::cerr << "Failed to create '" << mapfile << "'" << std::endl;
+ return -1;
+ }
+ std::stringstream contentss;
+ contentss << "0 " << getuid() << " 1" << std::endl;
+ std::string content = contentss.str();
+ int rc = write(fd, content.c_str(), content.size());
+ if (rc != (int)content.size()) {
+ std::cerr << "Failed to write uid map to '" << mapfile << "'" << std::endl;
+ }
+ close(fd);
+
+ // Wait for the child process and retrieve its status.
+ int status;
+ waitpid(child, &status, 0);
+ if (rc <= 0) {
+ std::cerr << "Failed to waitpid(" << child << ")" << std::endl;
+ return -1;
+ }
+ if (!WIFEXITED(status)) {
+ std::cerr << "Child " << child << " did not exit normally" << std::endl;
+ return -1;
+ }
+ return status;
+}
+
+ContainerFilesystem::ContainerFilesystem(NameContentList files, const std::string& mountpt) {
+ rootdir_ = TempNam(nullptr, "ares-chroot");
+ mkdir(rootdir_.c_str(), 0755);
+ dirs_.push_front(rootdir_);
+ for (const auto& nc : files) {
+ std::string fullpath = rootdir_ + nc.first;
+ int idx = fullpath.rfind('/');
+ std::string dir = fullpath.substr(0, idx);
+ EnsureDirExists(dir);
+ files_.push_back(std::unique_ptr<TransientFile>(
+ new TransientFile(fullpath, nc.second)));
+ }
+ if (!mountpt.empty()) {
+ char buffer[PATH_MAX + 1];
+ if (realpath(mountpt.c_str(), buffer)) {
+ mountpt_ = buffer;
+ std::string fullpath = rootdir_ + mountpt_;
+ EnsureDirExists(fullpath);
+ }
+ }
+}
+
+ContainerFilesystem::~ContainerFilesystem() {
+ files_.clear();
+ for (const std::string& dir : dirs_) {
+ rmdir(dir.c_str());
+ }
+}
+
+void ContainerFilesystem::EnsureDirExists(const std::string& dir) {
+ if (std::find(dirs_.begin(), dirs_.end(), dir) != dirs_.end()) {
+ return;
+ }
+ size_t idx = dir.rfind('/');
+ if (idx != std::string::npos) {
+ std::string prevdir = dir.substr(0, idx);
+ EnsureDirExists(prevdir);
+ }
+ // Ensure this directory is in the list before its ancestors.
+ mkdir(dir.c_str(), 0755);
+ dirs_.push_front(dir);
+}
+
+} // namespace test
+} // namespace ares
+
+#endif
diff --git a/contrib/libs/c-ares/test/ares-test-parse-a.cc b/contrib/libs/c-ares/test/ares-test-parse-a.cc
new file mode 100644
index 0000000000..7f6a987c13
--- /dev/null
+++ b/contrib/libs/c-ares/test/ares-test-parse-a.cc
@@ -0,0 +1,378 @@
+#include "ares-test.h"
+#include "dns-proto.h"
+
+#include <sstream>
+#include <vector>
+
+namespace ares {
+namespace test {
+
+TEST_F(LibraryTest, ParseAReplyOK) {
+ DNSPacket pkt;
+ pkt.set_qid(0x1234).set_response().set_aa()
+ .add_question(new DNSQuestion("example.com", ns_t_a))
+ .add_answer(new DNSARR("example.com", 0x01020304, {2,3,4,5}))
+ .add_answer(new DNSAaaaRR("example.com", 0x01020304, {0,0,0,0,0,0,0,0,0,0,0,0,2,3,4,5}));
+ std::vector<byte> 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, 0x02, // num answer RRs
+ 0x00, 0x00, // num authority RRs
+ 0x00, 0x00, // num additional RRs
+ // Question
+ 0x07, 'e', 'x', 'a', 'm', 'p', 'l', 'e',
+ 0x03, 'c', 'o', 'm',
+ 0x00,
+ 0x00, 0x01, // type A
+ 0x00, 0x01, // class IN
+ // Answer 1
+ 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,
+ // Answer 2
+ 0x07, 'e', 'x', 'a', 'm', 'p', 'l', 'e',
+ 0x03, 'c', 'o', 'm',
+ 0x00,
+ 0x00, 0x1c, // RR type
+ 0x00, 0x01, // class IN
+ 0x01, 0x02, 0x03, 0x04, // TTL
+ 0x00, 0x10, // rdata length
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0x04, 0x05,
+ };
+ EXPECT_EQ(data, pkt.data());
+ struct hostent *host = nullptr;
+ struct ares_addrttl info[5];
+ int count = 5;
+ EXPECT_EQ(ARES_SUCCESS, ares_parse_a_reply(data.data(), data.size(),
+ &host, info, &count));
+ EXPECT_EQ(1, count);
+ EXPECT_EQ(0x01020304, info[0].ttl);
+ unsigned long expected_addr = htonl(0x02030405);
+ EXPECT_EQ(expected_addr, info[0].ipaddr.s_addr);
+ EXPECT_EQ("2.3.4.5", AddressToString(&(info[0].ipaddr), 4));
+ ASSERT_NE(nullptr, host);
+ std::stringstream ss;
+ ss << HostEnt(host);
+ EXPECT_EQ("{'example.com' aliases=[] addrs=[2.3.4.5]}", ss.str());
+ ares_free_hostent(host);
+
+ // Repeat without providing a hostent
+ EXPECT_EQ(ARES_SUCCESS, ares_parse_a_reply(data.data(), data.size(),
+ nullptr, info, &count));
+ EXPECT_EQ(1, count);
+ EXPECT_EQ(0x01020304, info[0].ttl);
+ EXPECT_EQ(expected_addr, info[0].ipaddr.s_addr);
+ EXPECT_EQ("2.3.4.5", AddressToString(&(info[0].ipaddr), 4));
+}
+
+TEST_F(LibraryTest, ParseMalformedAReply) {
+ std::vector<byte> data = {
+ 0x12, 0x34, // [0:2) qid
+ 0x84, // [2] response + query + AA + not-TC + not-RD
+ 0x00, // [3] not-RA + not-Z + not-AD + not-CD + rc=NoError
+ 0x00, 0x01, // [4:6) num questions
+ 0x00, 0x02, // [6:8) num answer RRs
+ 0x00, 0x00, // [8:10) num authority RRs
+ 0x00, 0x00, // [10:12) num additional RRs
+ // Question
+ 0x07, 'e', 'x', 'a', 'm', 'p', 'l', 'e', // [12:20)
+ 0x03, 'c', 'o', 'm', // [20,24)
+ 0x00, // [24]
+ 0x00, 0x01, // [25:26) type A
+ 0x00, 0x01, // [27:29) class IN
+ // Answer 1
+ 0x07, 'e', 'x', 'a', 'm', 'p', 'l', 'e', // [29:37)
+ 0x03, 'c', 'o', 'm', // [37:41)
+ 0x00, // [41]
+ 0x00, 0x01, // [42:44) RR type
+ 0x00, 0x01, // [44:46) class IN
+ 0x01, 0x02, 0x03, 0x04, // [46:50) TTL
+ 0x00, 0x04, // [50:52) rdata length
+ 0x02, 0x03, 0x04, 0x05, // [52,56)
+ };
+ struct hostent *host = nullptr;
+ struct ares_addrttl info[2];
+ int count = 2;
+
+ // Invalid RR-len.
+ std::vector<byte> invalid_rrlen(data);
+ invalid_rrlen[51] = 180;
+ EXPECT_EQ(ARES_EBADRESP, ares_parse_a_reply(invalid_rrlen.data(), invalid_rrlen.size(),
+ &host, info, &count));
+
+ // Truncate mid-question.
+ EXPECT_EQ(ARES_EBADRESP, ares_parse_a_reply(data.data(), 26,
+ &host, info, &count));
+
+ // Truncate mid-answer.
+ EXPECT_EQ(ARES_EBADRESP, ares_parse_a_reply(data.data(), 42,
+ &host, info, &count));
+}
+
+TEST_F(LibraryTest, ParseAReplyNoData) {
+ DNSPacket pkt;
+ pkt.set_qid(0x1234).set_response().set_aa()
+ .add_question(new DNSQuestion("example.com", ns_t_a));
+ std::vector<byte> data = pkt.data();
+ struct hostent *host = nullptr;
+ struct ares_addrttl info[2];
+ int count = 2;
+ EXPECT_EQ(ARES_ENODATA, ares_parse_a_reply(data.data(), 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"));
+ 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(),
+ &host, info, &count));
+ EXPECT_EQ(0, count);
+ EXPECT_NE(nullptr, host);
+ std::stringstream ss;
+ ss << HostEnt(host);
+ EXPECT_EQ("{'c.example.com' aliases=[example.com] addrs=[]}", ss.str());
+ ares_free_hostent(host);
+}
+
+TEST_F(LibraryTest, ParseAReplyVariantA) {
+ DNSPacket pkt;
+ pkt.set_qid(6366).set_rd().set_ra()
+ .add_question(new DNSQuestion("mit.edu", ns_t_a))
+ .add_answer(new DNSARR("mit.edu", 52, {18,7,22,69}))
+ .add_auth(new DNSNsRR("mit.edu", 292, "W20NS.mit.edu"))
+ .add_auth(new DNSNsRR("mit.edu", 292, "BITSY.mit.edu"))
+ .add_auth(new DNSNsRR("mit.edu", 292, "STRAWB.mit.edu"))
+ .add_additional(new DNSARR("STRAWB.mit.edu", 292, {18,71,0,151}));
+ struct hostent *host = nullptr;
+ struct ares_addrttl info[2];
+ int count = 2;
+ std::vector<byte> data = pkt.data();
+ EXPECT_EQ(ARES_SUCCESS, ares_parse_a_reply(data.data(), data.size(),
+ &host, info, &count));
+ EXPECT_EQ(1, count);
+ EXPECT_EQ("18.7.22.69", AddressToString(&(info[0].ipaddr), 4));
+ EXPECT_EQ(52, info[0].ttl);
+ ares_free_hostent(host);
+}
+
+TEST_F(LibraryTest, ParseAReplyJustCname) {
+ DNSPacket pkt;
+ pkt.set_qid(6366).set_rd().set_ra()
+ .add_question(new DNSQuestion("mit.edu", ns_t_a))
+ .add_answer(new DNSCnameRR("mit.edu", 52, "other.mit.edu"));
+ struct hostent *host = nullptr;
+ struct ares_addrttl info[2];
+ int count = 2;
+ std::vector<byte> data = pkt.data();
+ EXPECT_EQ(ARES_SUCCESS, ares_parse_a_reply(data.data(), data.size(),
+ &host, info, &count));
+ EXPECT_EQ(0, count);
+ ASSERT_NE(nullptr, host);
+ std::stringstream ss;
+ ss << HostEnt(host);
+ EXPECT_EQ("{'other.mit.edu' aliases=[mit.edu] addrs=[]}", ss.str());
+ ares_free_hostent(host);
+}
+
+TEST_F(LibraryTest, ParseAReplyVariantCname) {
+ DNSPacket pkt;
+ pkt.set_qid(6366).set_rd().set_ra()
+ .add_question(new DNSQuestion("query.example.com", ns_t_a))
+ .add_answer(new DNSCnameRR("query.example.com", 200, "redirect.query.example.com"))
+ .add_answer(new DNSARR("redirect.query.example.com", 300, {129,97,123,22}))
+ .add_auth(new DNSNsRR("example.com", 218, "aa.ns1.example.com"))
+ .add_auth(new DNSNsRR("example.com", 218, "ns2.example.com"))
+ .add_auth(new DNSNsRR("example.com", 218, "ns3.example.com"))
+ .add_auth(new DNSNsRR("example.com", 218, "ns4.example.com"))
+ .add_additional(new DNSARR("aa.ns1.example.com", 218, {129,97,1,1}))
+ .add_additional(new DNSARR("ns2.example.com", 218, {129,97,1,2}))
+ .add_additional(new DNSARR("ns3.example.com", 218, {129,97,1,3}))
+ .add_additional(new DNSARR("ns4.example.com", 218, {129,97,1,4}));
+ struct hostent *host = nullptr;
+ struct ares_addrttl info[2];
+ int count = 2;
+ std::vector<byte> data = pkt.data();
+ EXPECT_EQ(ARES_SUCCESS, ares_parse_a_reply(data.data(), data.size(),
+ &host, info, &count));
+ EXPECT_EQ(1, count);
+ EXPECT_EQ("129.97.123.22", AddressToString(&(info[0].ipaddr), 4));
+ // TTL is reduced to match CNAME's.
+ EXPECT_EQ(200, info[0].ttl);
+ ares_free_hostent(host);
+
+ // Repeat parsing without places to put the results.
+ count = 0;
+ EXPECT_EQ(ARES_SUCCESS, ares_parse_a_reply(data.data(), data.size(),
+ nullptr, info, &count));
+}
+
+TEST_F(LibraryTest, ParseAReplyVariantCnameChain) {
+ DNSPacket pkt;
+ pkt.set_qid(6366).set_rd().set_ra()
+ .add_question(new DNSQuestion("c1.localhost", ns_t_a))
+ .add_answer(new DNSCnameRR("c1.localhost", 604800, "c2.localhost"))
+ .add_answer(new DNSCnameRR("c2.localhost", 604800, "c3.localhost"))
+ .add_answer(new DNSCnameRR("c3.localhost", 604800, "c4.localhost"))
+ .add_answer(new DNSARR("c4.localhost", 604800, {8,8,8,8}))
+ .add_auth(new DNSNsRR("localhost", 604800, "localhost"))
+ .add_additional(new DNSARR("localhost", 604800, {127,0,0,1}))
+ .add_additional(new DNSAaaaRR("localhost", 604800,
+ {0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}));
+ struct hostent *host = nullptr;
+ struct ares_addrttl info[2];
+ int count = 2;
+ std::vector<byte> data = pkt.data();
+ EXPECT_EQ(ARES_SUCCESS, ares_parse_a_reply(data.data(), data.size(),
+ &host, info, &count));
+ EXPECT_EQ(1, count);
+ EXPECT_EQ("8.8.8.8", AddressToString(&(info[0].ipaddr), 4));
+ EXPECT_EQ(604800, info[0].ttl);
+ ares_free_hostent(host);
+}
+
+TEST_F(LibraryTest, DISABLED_ParseAReplyVariantCnameLast) {
+ DNSPacket pkt;
+ pkt.set_qid(6366).set_rd().set_ra()
+ .add_question(new DNSQuestion("query.example.com", ns_t_a))
+ .add_answer(new DNSARR("redirect.query.example.com", 300, {129,97,123,221}))
+ .add_answer(new DNSARR("redirect.query.example.com", 300, {129,97,123,222}))
+ .add_answer(new DNSARR("redirect.query.example.com", 300, {129,97,123,223}))
+ .add_answer(new DNSARR("redirect.query.example.com", 300, {129,97,123,224}))
+ .add_answer(new DNSCnameRR("query.example.com", 60, "redirect.query.example.com"))
+ .add_additional(new DNSTxtRR("query.example.com", 60, {"text record"}));
+ struct hostent *host = nullptr;
+ struct ares_addrttl info[8];
+ int count = 8;
+ std::vector<byte> data = pkt.data();
+ EXPECT_EQ(ARES_SUCCESS, ares_parse_a_reply(data.data(), data.size(),
+ &host, info, &count));
+ EXPECT_EQ(4, count);
+ EXPECT_EQ("129.97.123.221", AddressToString(&(info[0].ipaddr), 4));
+ EXPECT_EQ("129.97.123.222", AddressToString(&(info[1].ipaddr), 4));
+ EXPECT_EQ("129.97.123.223", AddressToString(&(info[2].ipaddr), 4));
+ EXPECT_EQ("129.97.123.224", AddressToString(&(info[3].ipaddr), 4));
+ EXPECT_EQ(300, info[0].ttl);
+ EXPECT_EQ(300, info[1].ttl);
+ EXPECT_EQ(300, info[2].ttl);
+ EXPECT_EQ(300, info[3].ttl);
+ ares_free_hostent(host);
+}
+
+TEST_F(LibraryTest, ParseAReplyErrors) {
+ DNSPacket pkt;
+ pkt.set_qid(0x1234).set_response().set_aa()
+ .add_question(new DNSQuestion("example.com", ns_t_a))
+ .add_answer(new DNSARR("example.com", 100, {0x02, 0x03, 0x04, 0x05}));
+ std::vector<byte> data;
+
+ struct hostent *host = nullptr;
+ struct ares_addrttl info[2];
+ int count = 2;
+
+ // No question.
+ pkt.questions_.clear();
+ data = pkt.data();
+ EXPECT_EQ(ARES_EBADRESP, ares_parse_a_reply(data.data(), data.size(),
+ &host, info, &count));
+ EXPECT_EQ(nullptr, host);
+ pkt.add_question(new DNSQuestion("example.com", ns_t_a));
+
+ // Question != answer
+ pkt.questions_.clear();
+ pkt.add_question(new DNSQuestion("Axample.com", ns_t_a));
+ data = pkt.data();
+ EXPECT_EQ(ARES_ENODATA, ares_parse_a_reply(data.data(), data.size(),
+ &host, info, &count));
+ EXPECT_EQ(nullptr, host);
+ pkt.questions_.clear();
+ pkt.add_question(new DNSQuestion("example.com", ns_t_a));
+
+#ifdef DISABLED
+ // Not a response.
+ pkt.set_response(false);
+ data = pkt.data();
+ EXPECT_EQ(ARES_EBADRESP, ares_parse_a_reply(data.data(), data.size(),
+ &host, info, &count));
+ EXPECT_EQ(nullptr, host);
+ pkt.set_response(true);
+
+ // Bad return code.
+ pkt.set_rcode(ns_r_formerr);
+ data = pkt.data();
+ EXPECT_EQ(ARES_ENODATA, ares_parse_a_reply(data.data(), data.size(),
+ &host, info, &count));
+ EXPECT_EQ(nullptr, host);
+ pkt.set_rcode(ns_r_noerror);
+#endif
+
+ // Two questions
+ pkt.add_question(new DNSQuestion("example.com", ns_t_a));
+ data = pkt.data();
+ EXPECT_EQ(ARES_EBADRESP, ares_parse_a_reply(data.data(), data.size(),
+ &host, info, &count));
+ EXPECT_EQ(nullptr, host);
+ pkt.questions_.clear();
+ pkt.add_question(new DNSQuestion("example.com", ns_t_a));
+
+ // Wrong sort of answer.
+ 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(),
+ &host, info, &count));
+ EXPECT_EQ(nullptr, host);
+ pkt.answers_.clear();
+ pkt.add_answer(new DNSARR("example.com", 100, {0x02, 0x03, 0x04, 0x05}));
+
+ // No answer.
+ pkt.answers_.clear();
+ data = pkt.data();
+ EXPECT_EQ(ARES_ENODATA, ares_parse_a_reply(data.data(), data.size(),
+ &host, info, &count));
+ EXPECT_EQ(nullptr, host);
+ pkt.add_answer(new DNSARR("example.com", 100, {0x02, 0x03, 0x04, 0x05}));
+
+ // 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,
+ &host, info, &count));
+ EXPECT_EQ(nullptr, host);
+ EXPECT_EQ(ARES_EBADRESP, ares_parse_a_reply(data.data(), len,
+ nullptr, info, &count));
+ }
+}
+
+TEST_F(LibraryTest, ParseAReplyAllocFail) {
+ DNSPacket pkt;
+ pkt.set_qid(0x1234).set_response().set_aa()
+ .add_question(new DNSQuestion("example.com", ns_t_a))
+ .add_answer(new DNSCnameRR("example.com", 300, "c.example.com"))
+ .add_answer(new DNSARR("c.example.com", 500, {0x02, 0x03, 0x04, 0x05}));
+ std::vector<byte> data = pkt.data();
+
+ struct hostent *host = nullptr;
+ struct ares_addrttl info[2];
+ int count = 2;
+
+ for (int ii = 1; ii <= 8; ii++) {
+ ClearFails();
+ SetAllocFail(ii);
+ EXPECT_EQ(ARES_ENOMEM, ares_parse_a_reply(data.data(), data.size(),
+ &host, info, &count)) << ii;
+ EXPECT_EQ(nullptr, host);
+ }
+}
+
+} // namespace test
+} // namespace ares
diff --git a/contrib/libs/c-ares/test/ares-test-parse-aaaa.cc b/contrib/libs/c-ares/test/ares-test-parse-aaaa.cc
new file mode 100644
index 0000000000..1314c837a6
--- /dev/null
+++ b/contrib/libs/c-ares/test/ares-test-parse-aaaa.cc
@@ -0,0 +1,192 @@
+#include "ares-test.h"
+#include "dns-proto.h"
+
+#include <sstream>
+#include <vector>
+
+namespace ares {
+namespace test {
+
+TEST_F(LibraryTest, ParseAaaaReplyOK) {
+ DNSPacket pkt;
+ pkt.set_qid(0x1234).set_response().set_aa()
+ .add_question(new DNSQuestion("example.com", ns_t_aaaa))
+ .add_answer(new DNSAaaaRR("example.com", 100,
+ {0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02,
+ 0x03, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, 0x04}))
+ .add_answer(new DNSARR("example.com", 0x01020304, {2,3,4,5}));
+ std::vector<byte> data = pkt.data();
+ struct hostent *host = nullptr;
+ struct ares_addr6ttl info[5];
+ int count = 5;
+ EXPECT_EQ(ARES_SUCCESS, ares_parse_aaaa_reply(data.data(), data.size(),
+ &host, info, &count));
+ EXPECT_EQ(1, count);
+ EXPECT_EQ(100, info[0].ttl);
+ EXPECT_EQ(0x01, info[0].ip6addr._S6_un._S6_u8[0]);
+ EXPECT_EQ(0x02, info[0].ip6addr._S6_un._S6_u8[4]);
+ ASSERT_NE(nullptr, host);
+ std::stringstream ss;
+ ss << HostEnt(host);
+ EXPECT_EQ("{'example.com' aliases=[] addrs=[0101:0101:0202:0202:0303:0303:0404:0404]}", ss.str());
+ ares_free_hostent(host);
+
+ // Repeat without providing places to put the results
+ count = 0;
+ EXPECT_EQ(ARES_SUCCESS, ares_parse_aaaa_reply(data.data(), data.size(),
+ nullptr, info, &count));
+}
+
+TEST_F(LibraryTest, ParseAaaaReplyCname) {
+ DNSPacket pkt;
+ pkt.set_qid(0x1234).set_response().set_aa()
+ .add_question(new DNSQuestion("example.com", ns_t_aaaa))
+ .add_answer(new DNSCnameRR("example.com", 50, "c.example.com"))
+ .add_answer(new DNSAaaaRR("c.example.com", 100,
+ {0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02,
+ 0x03, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, 0x04}));
+ std::vector<byte> data = pkt.data();
+ struct hostent *host = nullptr;
+ struct ares_addr6ttl info[5];
+ int count = 5;
+ EXPECT_EQ(ARES_SUCCESS, ares_parse_aaaa_reply(data.data(), data.size(),
+ &host, info, &count));
+ EXPECT_EQ(1, count);
+ // CNAME TTL overrides AAAA TTL.
+ EXPECT_EQ(50, info[0].ttl);
+ EXPECT_EQ(0x01, info[0].ip6addr._S6_un._S6_u8[0]);
+ EXPECT_EQ(0x02, info[0].ip6addr._S6_un._S6_u8[4]);
+ ASSERT_NE(nullptr, host);
+ std::stringstream ss;
+ ss << HostEnt(host);
+ EXPECT_EQ("{'c.example.com' aliases=[example.com] addrs=[0101:0101:0202:0202:0303:0303:0404:0404]}", ss.str());
+ ares_free_hostent(host);
+
+ // Repeat without providing a hostent
+ count = 5;
+ EXPECT_EQ(ARES_SUCCESS, ares_parse_aaaa_reply(data.data(), data.size(),
+ nullptr, info, &count));
+ EXPECT_EQ(1, count);
+ EXPECT_EQ(50, info[0].ttl);
+ EXPECT_EQ(0x01, info[0].ip6addr._S6_un._S6_u8[0]);
+ EXPECT_EQ(0x02, info[0].ip6addr._S6_un._S6_u8[4]);
+}
+
+TEST_F(LibraryTest, ParseAaaaReplyNoData) {
+ DNSPacket pkt;
+ pkt.set_qid(0x1234).set_response().set_aa()
+ .add_question(new DNSQuestion("example.com", ns_t_aaaa));
+ std::vector<byte> data = pkt.data();
+ struct hostent *host = nullptr;
+ struct ares_addr6ttl info[2];
+ int count = 2;
+ EXPECT_EQ(ARES_ENODATA, ares_parse_aaaa_reply(data.data(), 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(),
+ &host, info, &count));
+ EXPECT_EQ(0, count);
+ EXPECT_EQ(nullptr, host);
+}
+
+TEST_F(LibraryTest, ParseAaaaReplyErrors) {
+ DNSPacket pkt;
+ pkt.set_qid(0x1234).set_response().set_aa()
+ .add_question(new DNSQuestion("example.com", ns_t_aaaa))
+ .add_answer(new DNSAaaaRR("example.com", 100,
+ {0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02,
+ 0x03, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, 0x04}));
+ std::vector<byte> data;
+
+ struct hostent *host = nullptr;
+ struct ares_addr6ttl info[2];
+ int count = 2;
+
+ // No question.
+ pkt.questions_.clear();
+ data = pkt.data();
+ EXPECT_EQ(ARES_EBADRESP, ares_parse_aaaa_reply(data.data(), data.size(),
+ &host, info, &count));
+ EXPECT_EQ(nullptr, host);
+ pkt.add_question(new DNSQuestion("example.com", ns_t_aaaa));
+
+ // Question != answer
+ pkt.questions_.clear();
+ pkt.add_question(new DNSQuestion("Axample.com", ns_t_aaaa));
+ data = pkt.data();
+ EXPECT_EQ(ARES_ENODATA, ares_parse_aaaa_reply(data.data(), data.size(),
+ &host, info, &count));
+ EXPECT_EQ(nullptr, host);
+ pkt.questions_.clear();
+ pkt.add_question(new DNSQuestion("example.com", ns_t_aaaa));
+
+ // Two questions.
+ pkt.add_question(new DNSQuestion("example.com", ns_t_aaaa));
+ data = pkt.data();
+ EXPECT_EQ(ARES_EBADRESP, ares_parse_aaaa_reply(data.data(), data.size(),
+ &host, info, &count));
+ EXPECT_EQ(nullptr, host);
+ pkt.questions_.clear();
+ pkt.add_question(new DNSQuestion("example.com", ns_t_aaaa));
+
+ // Wrong sort of answer.
+ 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(),
+ &host, info, &count));
+ EXPECT_EQ(nullptr, host);
+ pkt.answers_.clear();
+ pkt.add_answer(new DNSAaaaRR("example.com", 100,
+ {0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02,
+ 0x03, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, 0x04}));
+
+ // No answer.
+ pkt.answers_.clear();
+ data = pkt.data();
+ EXPECT_EQ(ARES_ENODATA, ares_parse_aaaa_reply(data.data(), data.size(),
+ &host, info, &count));
+ EXPECT_EQ(nullptr, host);
+ pkt.add_answer(new DNSAaaaRR("example.com", 100,
+ {0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02,
+ 0x03, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, 0x04}));
+
+ // 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,
+ &host, info, &count));
+ EXPECT_EQ(nullptr, host);
+ EXPECT_EQ(ARES_EBADRESP, ares_parse_aaaa_reply(data.data(), len,
+ nullptr, info, &count));
+ }
+}
+
+TEST_F(LibraryTest, ParseAaaaReplyAllocFail) {
+ DNSPacket pkt;
+ pkt.set_qid(0x1234).set_response().set_aa()
+ .add_question(new DNSQuestion("example.com", ns_t_aaaa))
+ .add_answer(new DNSCnameRR("example.com", 300, "c.example.com"))
+ .add_answer(new DNSAaaaRR("c.example.com", 100,
+ {0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02,
+ 0x03, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, 0x04}));
+ std::vector<byte> data = pkt.data();
+ struct hostent *host = nullptr;
+ struct ares_addr6ttl info[2];
+ int count = 2;
+
+ for (int ii = 1; ii <= 8; ii++) {
+ ClearFails();
+ SetAllocFail(ii);
+ EXPECT_EQ(ARES_ENOMEM, ares_parse_aaaa_reply(data.data(), data.size(),
+ &host, info, &count)) << ii;
+ EXPECT_EQ(nullptr, host);
+ }
+}
+
+} // namespace test
+} // namespace ares
diff --git a/contrib/libs/c-ares/test/ares-test-parse-mx.cc b/contrib/libs/c-ares/test/ares-test-parse-mx.cc
new file mode 100644
index 0000000000..37324a6d4c
--- /dev/null
+++ b/contrib/libs/c-ares/test/ares-test-parse-mx.cc
@@ -0,0 +1,141 @@
+#include "ares-test.h"
+#include "dns-proto.h"
+
+#include <sstream>
+#include <vector>
+
+namespace ares {
+namespace test {
+
+TEST_F(LibraryTest, ParseMxReplyOK) {
+ DNSPacket pkt;
+ pkt.set_qid(0x1234).set_response().set_aa()
+ .add_question(new DNSQuestion("example.com", ns_t_mx))
+ .add_answer(new DNSMxRR("example.com", 100, 100, "mx1.example.com"))
+ .add_answer(new DNSMxRR("example.com", 100, 200, "mx2.example.com"));
+ std::vector<byte> data = pkt.data();
+
+ struct ares_mx_reply* mx = nullptr;
+ EXPECT_EQ(ARES_SUCCESS, ares_parse_mx_reply(data.data(), data.size(), &mx));
+ ASSERT_NE(nullptr, mx);
+ EXPECT_EQ("mx1.example.com", std::string(mx->host));
+ EXPECT_EQ(100, mx->priority);
+
+ struct ares_mx_reply* mx2 = mx->next;
+ ASSERT_NE(nullptr, mx2);
+ EXPECT_EQ("mx2.example.com", std::string(mx2->host));
+ EXPECT_EQ(200, mx2->priority);
+ EXPECT_EQ(nullptr, mx2->next);
+
+ ares_free_data(mx);
+}
+
+TEST_F(LibraryTest, ParseMxReplyMalformed) {
+ std::vector<byte> 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
+ 0x07, 'e', 'x', 'a', 'm', 'p', 'l', 'e',
+ 0x03, 'c', 'o', 'm',
+ 0x00,
+ 0x00, 0x0F, // type MX
+ 0x00, 0x01, // class IN
+ // Answer 1
+ 0x07, 'e', 'x', 'a', 'm', 'p', 'l', 'e',
+ 0x03, 'c', 'o', 'm',
+ 0x00,
+ 0x00, 0x0F, // RR type
+ 0x00, 0x01, // class IN
+ 0x01, 0x02, 0x03, 0x04, // TTL
+ 0x00, 0x01, // rdata length -- too short
+ 0x02,
+ };
+
+ struct ares_mx_reply* mx = nullptr;
+ EXPECT_EQ(ARES_EBADRESP, ares_parse_mx_reply(data.data(), data.size(), &mx));
+ ASSERT_EQ(nullptr, mx);
+}
+
+
+TEST_F(LibraryTest, ParseMxReplyErrors) {
+ DNSPacket pkt;
+ pkt.set_qid(0x1234).set_response().set_aa()
+ .add_question(new DNSQuestion("example.com", ns_t_mx))
+ .add_answer(new DNSMxRR("example.com", 100, 100, "mx1.example.com"));
+ std::vector<byte> data;
+ struct ares_mx_reply* mx = nullptr;
+
+ // No question.
+ pkt.questions_.clear();
+ data = pkt.data();
+ EXPECT_EQ(ARES_EBADRESP, ares_parse_mx_reply(data.data(), data.size(), &mx));
+ EXPECT_EQ(nullptr, mx);
+ pkt.add_question(new DNSQuestion("example.com", ns_t_mx));
+
+#ifdef DISABLED
+ // Question != answer
+ pkt.questions_.clear();
+ pkt.add_question(new DNSQuestion("Axample.com", ns_t_mx));
+ data = pkt.data();
+ EXPECT_EQ(ARES_EBADRESP, ares_parse_mx_reply(data.data(), data.size(), &mx));
+ pkt.questions_.clear();
+ pkt.add_question(new DNSQuestion("example.com", ns_t_mx));
+#endif
+
+ // Two questions.
+ pkt.add_question(new DNSQuestion("example.com", ns_t_mx));
+ data = pkt.data();
+ EXPECT_EQ(ARES_EBADRESP, ares_parse_mx_reply(data.data(), data.size(), &mx));
+ EXPECT_EQ(nullptr, mx);
+ pkt.questions_.clear();
+ pkt.add_question(new DNSQuestion("example.com", ns_t_mx));
+
+ // Wrong sort of answer.
+ // TODO(drysdale): check if this should be ARES_ENODATA?
+ 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(nullptr, mx);
+ pkt.answers_.clear();
+ pkt.add_answer(new DNSMxRR("example.com", 100, 100, "mx1.example.com"));
+
+ // No answer.
+ pkt.answers_.clear();
+ data = pkt.data();
+ EXPECT_EQ(ARES_ENODATA, ares_parse_mx_reply(data.data(), 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);
+ EXPECT_EQ(nullptr, mx);
+ EXPECT_TRUE(rc == ARES_EBADRESP || rc == ARES_EBADNAME);
+ }
+}
+
+TEST_F(LibraryTest, ParseMxReplyAllocFail) {
+ DNSPacket pkt;
+ pkt.set_qid(0x1234).set_response().set_aa()
+ .add_question(new DNSQuestion("example.com", ns_t_mx))
+ .add_answer(new DNSCnameRR("example.com", 300, "c.example.com"))
+ .add_answer(new DNSMxRR("c.example.com", 100, 100, "mx1.example.com"));
+ std::vector<byte> data = pkt.data();
+ struct ares_mx_reply* mx = nullptr;
+
+ for (int ii = 1; ii <= 5; ii++) {
+ ClearFails();
+ SetAllocFail(ii);
+ EXPECT_EQ(ARES_ENOMEM, ares_parse_mx_reply(data.data(), data.size(), &mx)) << ii;
+ }
+}
+
+} // namespace test
+} // namespace ares
diff --git a/contrib/libs/c-ares/test/ares-test-parse-naptr.cc b/contrib/libs/c-ares/test/ares-test-parse-naptr.cc
new file mode 100644
index 0000000000..3238a1923d
--- /dev/null
+++ b/contrib/libs/c-ares/test/ares-test-parse-naptr.cc
@@ -0,0 +1,148 @@
+#include "ares-test.h"
+#include "dns-proto.h"
+
+#include <sstream>
+#include <vector>
+
+namespace ares {
+namespace test {
+
+TEST_F(LibraryTest, ParseNaptrReplyOK) {
+ DNSPacket pkt;
+ pkt.set_qid(0x1234).set_response().set_aa()
+ .add_question(new DNSQuestion("example.com", ns_t_naptr))
+ .add_answer(new DNSNaptrRR("example.com", 100,
+ 10, 20, "SP", "service", "regexp", "replace"))
+ .add_answer(new DNSNaptrRR("example.com", 0x0010,
+ 11, 21, "SP", "service2", "regexp2", "replace2"));
+ std::vector<byte> data = pkt.data();
+
+ struct ares_naptr_reply* naptr = nullptr;
+ EXPECT_EQ(ARES_SUCCESS, ares_parse_naptr_reply(data.data(), data.size(), &naptr));
+ ASSERT_NE(nullptr, naptr);
+ EXPECT_EQ("SP", std::string((char*)naptr->flags));
+ EXPECT_EQ("service", std::string((char*)naptr->service));
+ EXPECT_EQ("regexp", std::string((char*)naptr->regexp));
+ EXPECT_EQ("replace", std::string((char*)naptr->replacement));
+ EXPECT_EQ(10, naptr->order);
+ EXPECT_EQ(20, naptr->preference);
+
+ struct ares_naptr_reply* naptr2 = naptr->next;
+ ASSERT_NE(nullptr, naptr2);
+ EXPECT_EQ("SP", std::string((char*)naptr2->flags));
+ EXPECT_EQ("service2", std::string((char*)naptr2->service));
+ EXPECT_EQ("regexp2", std::string((char*)naptr2->regexp));
+ EXPECT_EQ("replace2", std::string((char*)naptr2->replacement));
+ EXPECT_EQ(11, naptr2->order);
+ EXPECT_EQ(21, naptr2->preference);
+ EXPECT_EQ(nullptr, naptr2->next);
+
+ ares_free_data(naptr);
+}
+
+TEST_F(LibraryTest, ParseNaptrReplyErrors) {
+ DNSPacket pkt;
+ pkt.set_qid(0x1234).set_response().set_aa()
+ .add_question(new DNSQuestion("example.com", ns_t_naptr))
+ .add_answer(new DNSNaptrRR("example.com", 100,
+ 10, 20, "SP", "service", "regexp", "replace"));
+ std::vector<byte> data;
+ struct ares_naptr_reply* naptr = nullptr;
+
+ // No question.
+ pkt.questions_.clear();
+ data = pkt.data();
+ EXPECT_EQ(ARES_EBADRESP, ares_parse_naptr_reply(data.data(), data.size(), &naptr));
+ pkt.add_question(new DNSQuestion("example.com", ns_t_naptr));
+
+#ifdef DISABLED
+ // Question != answer
+ pkt.questions_.clear();
+ pkt.add_question(new DNSQuestion("Axample.com", ns_t_naptr));
+ data = pkt.data();
+ EXPECT_EQ(ARES_ENODATA, ares_parse_naptr_reply(data.data(), data.size(), &naptr));
+ pkt.questions_.clear();
+ pkt.add_question(new DNSQuestion("example.com", ns_t_naptr));
+#endif
+
+ // Two questions
+ pkt.add_question(new DNSQuestion("example.com", ns_t_naptr));
+ data = pkt.data();
+ EXPECT_EQ(ARES_EBADRESP, ares_parse_naptr_reply(data.data(), data.size(), &naptr));
+ pkt.questions_.clear();
+ pkt.add_question(new DNSQuestion("example.com", ns_t_naptr));
+
+ // Wrong sort of answer.
+ 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(nullptr, naptr);
+ pkt.answers_.clear();
+ pkt.add_answer(new DNSNaptrRR("example.com", 100,
+ 10, 20, "SP", "service", "regexp", "replace"));
+
+ // No answer.
+ pkt.answers_.clear();
+ data = pkt.data();
+ EXPECT_EQ(ARES_ENODATA, ares_parse_naptr_reply(data.data(), 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);
+ EXPECT_TRUE(rc == ARES_EBADRESP || rc == ARES_EBADNAME);
+ }
+}
+
+TEST_F(LibraryTest, ParseNaptrReplyTooShort) {
+ std::vector<byte> 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
+ 0x07, 'e', 'x', 'a', 'm', 'p', 'l', 'e',
+ 0x03, 'c', 'o', 'm',
+ 0x00,
+ 0x00, 0x23, // type NAPTR
+ 0x00, 0x01, // class IN
+ // Answer 1
+ 0x07, 'e', 'x', 'a', 'm', 'p', 'l', 'e',
+ 0x03, 'c', 'o', 'm',
+ 0x00,
+ 0x00, 0x23, // RR type
+ 0x00, 0x01, // class IN
+ 0x01, 0x02, 0x03, 0x04, // TTL
+ 0x00, 0x01, // rdata length
+ 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));
+}
+
+TEST_F(LibraryTest, ParseNaptrReplyAllocFail) {
+ DNSPacket pkt;
+ pkt.set_qid(0x1234).set_response().set_aa()
+ .add_question(new DNSQuestion("example.com", ns_t_naptr))
+ .add_answer(new DNSNaptrRR("example.com", 100,
+ 10, 20, "SP", "service", "regexp", "replace"))
+ .add_answer(new DNSNaptrRR("example.com", 0x0010,
+ 11, 21, "SP", "service2", "regexp2", "replace2"));
+ std::vector<byte> data = pkt.data();
+ struct ares_naptr_reply* naptr = nullptr;
+
+ for (int ii = 1; ii <= 13; ii++) {
+ ClearFails();
+ SetAllocFail(ii);
+ EXPECT_EQ(ARES_ENOMEM, ares_parse_naptr_reply(data.data(), data.size(), &naptr));
+ }
+}
+
+} // namespace test
+} // namespace ares
diff --git a/contrib/libs/c-ares/test/ares-test-parse-ns.cc b/contrib/libs/c-ares/test/ares-test-parse-ns.cc
new file mode 100644
index 0000000000..cd65318969
--- /dev/null
+++ b/contrib/libs/c-ares/test/ares-test-parse-ns.cc
@@ -0,0 +1,119 @@
+#include "ares-test.h"
+#include "dns-proto.h"
+
+#include <sstream>
+#include <vector>
+
+namespace ares {
+namespace test {
+
+TEST_F(LibraryTest, ParseNsReplyOK) {
+ DNSPacket pkt;
+ pkt.set_qid(0x1234).set_response().set_aa()
+ .add_question(new DNSQuestion("example.com", ns_t_ns))
+ .add_answer(new DNSNsRR("example.com", 100, "ns.example.com"));
+ std::vector<byte> data = pkt.data();
+
+ struct hostent *host = nullptr;
+ EXPECT_EQ(ARES_SUCCESS, ares_parse_ns_reply(data.data(), data.size(), &host));
+ ASSERT_NE(nullptr, host);
+ std::stringstream ss;
+ ss << HostEnt(host);
+ EXPECT_EQ("{'example.com' aliases=[ns.example.com] addrs=[]}", ss.str());
+ ares_free_hostent(host);
+}
+
+TEST_F(LibraryTest, ParseNsReplyMultiple) {
+ DNSPacket pkt;
+ pkt.set_qid(10501).set_response().set_rd().set_ra()
+ .add_question(new DNSQuestion("google.com", ns_t_ns))
+ .add_answer(new DNSNsRR("google.com", 59, "ns1.google.com"))
+ .add_answer(new DNSNsRR("google.com", 59, "ns2.google.com"))
+ .add_answer(new DNSNsRR("google.com", 59, "ns3.google.com"))
+ .add_answer(new DNSNsRR("google.com", 59, "ns4.google.com"))
+ .add_additional(new DNSARR("ns4.google.com", 247, {216,239,38,10}))
+ .add_additional(new DNSARR("ns2.google.com", 247, {216,239,34,10}))
+ .add_additional(new DNSARR("ns1.google.com", 247, {216,239,32,10}))
+ .add_additional(new DNSARR("ns3.google.com", 247, {216,239,36,10}));
+ std::vector<byte> data = pkt.data();
+
+ struct hostent *host = nullptr;
+ EXPECT_EQ(ARES_SUCCESS, ares_parse_ns_reply(data.data(), data.size(), &host));
+ ASSERT_NE(nullptr, host);
+ std::stringstream ss;
+ ss << HostEnt(host);
+ EXPECT_EQ("{'google.com' aliases=[ns1.google.com, ns2.google.com, ns3.google.com, ns4.google.com] addrs=[]}", ss.str());
+ ares_free_hostent(host);
+}
+
+TEST_F(LibraryTest, ParseNsReplyErrors) {
+ DNSPacket pkt;
+ pkt.set_qid(0x1234).set_response().set_aa()
+ .add_question(new DNSQuestion("example.com", ns_t_ns))
+ .add_answer(new DNSNsRR("example.com", 100, "ns.example.com"));
+ std::vector<byte> data;
+ struct hostent *host = nullptr;
+
+ // No question.
+ pkt.questions_.clear();
+ data = pkt.data();
+ EXPECT_EQ(ARES_EBADRESP, ares_parse_ns_reply(data.data(), data.size(), &host));
+ pkt.add_question(new DNSQuestion("example.com", ns_t_ns));
+
+#ifdef DISABLED
+ // Question != answer
+ pkt.questions_.clear();
+ pkt.add_question(new DNSQuestion("Axample.com", ns_t_ns));
+ data = pkt.data();
+ EXPECT_EQ(ARES_ENODATA, ares_parse_ns_reply(data.data(), data.size(), &host));
+ pkt.questions_.clear();
+ pkt.add_question(new DNSQuestion("example.com", ns_t_ns));
+#endif
+
+ // Two questions.
+ pkt.add_question(new DNSQuestion("example.com", ns_t_ns));
+ data = pkt.data();
+ EXPECT_EQ(ARES_EBADRESP, ares_parse_ns_reply(data.data(), data.size(), &host));
+ pkt.questions_.clear();
+ pkt.add_question(new DNSQuestion("example.com", ns_t_ns));
+
+ // Wrong sort of answer.
+ 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));
+ 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));
+ 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));
+ }
+}
+
+TEST_F(LibraryTest, ParseNsReplyAllocFail) {
+ DNSPacket pkt;
+ pkt.set_qid(0x1234).set_response().set_aa()
+ .add_question(new DNSQuestion("example.com", ns_t_ns))
+ .add_answer(new DNSCnameRR("example.com", 300, "c.example.com"))
+ .add_answer(new DNSNsRR("c.example.com", 100, "ns.example.com"));
+ std::vector<byte> data = pkt.data();
+ struct hostent *host = nullptr;
+
+ for (int ii = 1; ii <= 8; ii++) {
+ ClearFails();
+ SetAllocFail(ii);
+ EXPECT_EQ(ARES_ENOMEM, ares_parse_ns_reply(data.data(), data.size(), &host)) << ii;
+ }
+}
+
+
+} // namespace test
+} // namespace ares
diff --git a/contrib/libs/c-ares/test/ares-test-parse-ptr.cc b/contrib/libs/c-ares/test/ares-test-parse-ptr.cc
new file mode 100644
index 0000000000..75f74c16f7
--- /dev/null
+++ b/contrib/libs/c-ares/test/ares-test-parse-ptr.cc
@@ -0,0 +1,249 @@
+#include "ares-test.h"
+#include "dns-proto.h"
+
+#include <sstream>
+#include <vector>
+
+namespace ares {
+namespace test {
+
+TEST_F(LibraryTest, ParsePtrReplyOK) {
+ byte addrv4[4] = {0x10, 0x20, 0x30, 0x40};
+ DNSPacket pkt;
+ pkt.set_qid(0x1234).set_response().set_aa()
+ .add_question(new DNSQuestion("64.48.32.16.in-addr.arpa", ns_t_ptr))
+ .add_answer(new DNSPtrRR("64.48.32.16.in-addr.arpa", 100, "other.com"));
+ std::vector<byte> data = pkt.data();
+
+ struct hostent *host = nullptr;
+ EXPECT_EQ(ARES_SUCCESS, ares_parse_ptr_reply(data.data(), data.size(),
+ addrv4, sizeof(addrv4), AF_INET, &host, NULL));
+ ASSERT_NE(nullptr, host);
+ std::stringstream ss;
+ ss << HostEnt(host);
+ EXPECT_EQ("{'other.com' aliases=[other.com] addrs=[16.32.48.64]}", ss.str());
+ ares_free_hostent(host);
+}
+
+TEST_F(LibraryTest, ParsePtrReplyCname) {
+ byte addrv4[4] = {0x10, 0x20, 0x30, 0x40};
+ DNSPacket pkt;
+ pkt.set_qid(0x1234).set_response().set_aa()
+ .add_question(new DNSQuestion("64.48.32.16.in-addr.arpa", ns_t_ptr))
+ .add_answer(new DNSCnameRR("64.48.32.16.in-addr.arpa", 50, "64.48.32.8.in-addr.arpa"))
+ .add_answer(new DNSPtrRR("64.48.32.8.in-addr.arpa", 100, "other.com"));
+ std::vector<byte> data = pkt.data();
+
+ struct hostent *host = nullptr;
+ EXPECT_EQ(ARES_SUCCESS, ares_parse_ptr_reply(data.data(), data.size(),
+ addrv4, sizeof(addrv4), AF_INET, &host, NULL));
+ ASSERT_NE(nullptr, host);
+ std::stringstream ss;
+ ss << HostEnt(host);
+ EXPECT_EQ("{'other.com' aliases=[other.com] addrs=[16.32.48.64]}", ss.str());
+ ares_free_hostent(host);
+}
+
+
+struct DNSMalformedCnameRR : public DNSCnameRR {
+ DNSMalformedCnameRR(const std::string& name, int ttl, const std::string& other)
+ : DNSCnameRR(name, ttl, other) {}
+ std::vector<byte> data() const {
+ std::vector<byte> data = DNSRR::data();
+ std::vector<byte> encname = EncodeString(other_);
+ encname[0] = encname[0] + 63; // invalid label length
+ int len = encname.size();
+ PushInt16(&data, len);
+ data.insert(data.end(), encname.begin(), encname.end());
+ return data;
+ }
+};
+
+TEST_F(LibraryTest, ParsePtrReplyMalformedCname) {
+ byte addrv4[4] = {0x10, 0x20, 0x30, 0x40};
+ DNSPacket pkt;
+ pkt.set_qid(0x1234).set_response().set_aa()
+ .add_question(new DNSQuestion("64.48.32.16.in-addr.arpa", ns_t_ptr))
+ .add_answer(new DNSMalformedCnameRR("64.48.32.16.in-addr.arpa", 50, "64.48.32.8.in-addr.arpa"))
+ .add_answer(new DNSPtrRR("64.48.32.8.in-addr.arpa", 100, "other.com"));
+ std::vector<byte> data = pkt.data();
+
+ struct hostent *host = nullptr;
+ EXPECT_EQ(ARES_EBADRESP, ares_parse_ptr_reply(data.data(), data.size(),
+ addrv4, sizeof(addrv4), AF_INET, &host, NULL));
+ ASSERT_EQ(nullptr, host);
+}
+
+TEST_F(LibraryTest, ParseManyPtrReply) {
+ byte addrv4[4] = {0x10, 0x20, 0x30, 0x40};
+ DNSPacket pkt;
+ pkt.set_qid(0x1234).set_response().set_aa()
+ .add_question(new DNSQuestion("64.48.32.16.in-addr.arpa", ns_t_ptr))
+ .add_answer(new DNSPtrRR("64.48.32.16.in-addr.arpa", 100, "main.com"))
+ .add_answer(new DNSPtrRR("64.48.32.16.in-addr.arpa", 100, "other1.com"))
+ .add_answer(new DNSPtrRR("64.48.32.16.in-addr.arpa", 100, "other2.com"))
+ .add_answer(new DNSPtrRR("64.48.32.16.in-addr.arpa", 100, "other3.com"))
+ .add_answer(new DNSPtrRR("64.48.32.16.in-addr.arpa", 100, "other4.com"))
+ .add_answer(new DNSPtrRR("64.48.32.16.in-addr.arpa", 100, "other5.com"))
+ .add_answer(new DNSPtrRR("64.48.32.16.in-addr.arpa", 100, "other6.com"))
+ .add_answer(new DNSPtrRR("64.48.32.16.in-addr.arpa", 100, "other7.com"))
+ .add_answer(new DNSPtrRR("64.48.32.16.in-addr.arpa", 100, "other8.com"))
+ .add_answer(new DNSPtrRR("64.48.32.16.in-addr.arpa", 100, "other9.com"));
+ std::vector<byte> data = pkt.data();
+
+ struct hostent *host = nullptr;
+ EXPECT_EQ(ARES_SUCCESS, ares_parse_ptr_reply(data.data(), data.size(),
+ addrv4, sizeof(addrv4), AF_INET, &host, NULL));
+ ASSERT_NE(nullptr, host);
+ ares_free_hostent(host);
+}
+
+TEST_F(LibraryTest, ParsePtrReplyAdditional) {
+ byte addrv4[4] = {0x10, 0x20, 0x30, 0x40};
+ DNSPacket pkt;
+ pkt.set_qid(0x1234).set_response().set_aa()
+ .add_question(new DNSQuestion("64.48.32.16.in-addr.arpa", ns_t_ptr))
+ .add_answer(new DNSPtrRR("64.48.32.16.in-addr.arpa", 55, "other.com"))
+ .add_auth(new DNSNsRR("16.in-addr.arpa", 234, "ns1.other.com"))
+ .add_auth(new DNSNsRR("16.in-addr.arpa", 234, "bb.ns2.other.com"))
+ .add_auth(new DNSNsRR("16.in-addr.arpa", 234, "ns3.other.com"))
+ .add_additional(new DNSARR("ns1.other.com", 229, {10,20,30,41}))
+ .add_additional(new DNSARR("bb.ns2.other.com", 229, {10,20,30,42}))
+ .add_additional(new DNSARR("ns3.other.com", 229, {10,20,30,43}));
+ std::vector<byte> data = pkt.data();
+
+ struct hostent *host = nullptr;
+ EXPECT_EQ(ARES_SUCCESS, ares_parse_ptr_reply(data.data(), data.size(),
+ addrv4, sizeof(addrv4), AF_INET, &host, NULL));
+ ASSERT_NE(nullptr, host);
+ std::stringstream ss;
+ ss << HostEnt(host);
+ EXPECT_EQ("{'other.com' aliases=[other.com] addrs=[16.32.48.64]}", ss.str());
+ ares_free_hostent(host);
+}
+
+TEST_F(LibraryTest, ParsePtrReplyErrors) {
+ byte addrv4[4] = {0x10, 0x20, 0x30, 0x40};
+ DNSPacket pkt;
+ pkt.set_qid(0x1234).set_response().set_aa()
+ .add_question(new DNSQuestion("64.48.32.16.in-addr.arpa", ns_t_ptr))
+ .add_answer(new DNSPtrRR("64.48.32.16.in-addr.arpa", 100, "other.com"));
+ std::vector<byte> data;
+ struct hostent *host = nullptr;
+
+ // No question.
+ pkt.questions_.clear();
+ data = pkt.data();
+ EXPECT_EQ(ARES_EBADRESP, ares_parse_ptr_reply(data.data(), data.size(),
+ addrv4, sizeof(addrv4), AF_INET, &host, NULL));
+ pkt.add_question(new DNSQuestion("64.48.32.16.in-addr.arpa", ns_t_ptr));
+
+ // Question != answer
+ pkt.questions_.clear();
+ pkt.add_question(new DNSQuestion("99.48.32.16.in-addr.arpa", ns_t_ptr));
+ data = pkt.data();
+ EXPECT_EQ(ARES_ENODATA, ares_parse_ptr_reply(data.data(), data.size(),
+ addrv4, sizeof(addrv4), AF_INET, &host, NULL));
+ EXPECT_EQ(nullptr, host);
+ pkt.questions_.clear();
+ pkt.add_question(new DNSQuestion("64.48.32.16.in-addr.arpa", ns_t_ptr));
+
+ // Two questions.
+ pkt.add_question(new DNSQuestion("64.48.32.16.in-addr.arpa", ns_t_ptr));
+ data = pkt.data();
+ EXPECT_EQ(ARES_EBADRESP, ares_parse_ptr_reply(data.data(), data.size(),
+ addrv4, sizeof(addrv4), AF_INET, &host, NULL));
+ EXPECT_EQ(nullptr, host);
+ pkt.questions_.clear();
+ pkt.add_question(new DNSQuestion("64.48.32.16.in-addr.arpa", ns_t_ptr));
+
+ // Wrong sort of answer.
+ 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(),
+ addrv4, sizeof(addrv4), AF_INET, &host, NULL));
+ EXPECT_EQ(nullptr, host);
+ pkt.answers_.clear();
+ pkt.add_answer(new DNSPtrRR("64.48.32.16.in-addr.arpa", 100, "other.com"));
+
+ // No answer.
+ pkt.answers_.clear();
+ data = pkt.data();
+ EXPECT_EQ(ARES_ENODATA, ares_parse_ptr_reply(data.data(), data.size(),
+ addrv4, sizeof(addrv4), AF_INET, &host, NULL));
+ EXPECT_EQ(nullptr, host);
+ pkt.add_answer(new DNSPtrRR("64.48.32.16.in-addr.arpa", 100, "other.com"));
+
+ // 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,
+ addrv4, sizeof(addrv4), AF_INET, &host, NULL));
+ EXPECT_EQ(nullptr, host);
+ }
+
+ // Truncated packets with CNAME.
+ 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,
+ addrv4, sizeof(addrv4), AF_INET, &host, NULL));
+ EXPECT_EQ(nullptr, host);
+ }
+}
+
+TEST_F(LibraryTest, ParsePtrReplyAllocFailSome) {
+ byte addrv4[4] = {0x10, 0x20, 0x30, 0x40};
+ DNSPacket pkt;
+ pkt.set_qid(0x1234).set_response().set_aa()
+ .add_question(new DNSQuestion("64.48.32.16.in-addr.arpa", ns_t_ptr))
+ .add_answer(new DNSPtrRR("64.48.32.16.in-addr.arpa", 100, "main.com"))
+ .add_answer(new DNSPtrRR("64.48.32.16.in-addr.arpa", 100, "other1.com"))
+ .add_answer(new DNSPtrRR("64.48.32.16.in-addr.arpa", 100, "other2.com"))
+ .add_answer(new DNSPtrRR("64.48.32.16.in-addr.arpa", 100, "other3.com"));
+ std::vector<byte> data = pkt.data();
+ struct hostent *host = nullptr;
+
+ for (int ii = 1; ii <= 18; ii++) {
+ ClearFails();
+ SetAllocFail(ii);
+ EXPECT_EQ(ARES_ENOMEM, ares_parse_ptr_reply(data.data(), data.size(),
+ addrv4, sizeof(addrv4), AF_INET, &host, NULL)) << ii;
+ }
+}
+
+TEST_F(LibraryTest, ParsePtrReplyAllocFailMany) {
+ byte addrv4[4] = {0x10, 0x20, 0x30, 0x40};
+ DNSPacket pkt;
+ pkt.set_qid(0x1234).set_response().set_aa()
+ .add_question(new DNSQuestion("64.48.32.16.in-addr.arpa", ns_t_ptr))
+ .add_answer(new DNSPtrRR("64.48.32.16.in-addr.arpa", 100, "main.com"))
+ .add_answer(new DNSPtrRR("64.48.32.16.in-addr.arpa", 100, "other1.com"))
+ .add_answer(new DNSPtrRR("64.48.32.16.in-addr.arpa", 100, "other2.com"))
+ .add_answer(new DNSPtrRR("64.48.32.16.in-addr.arpa", 100, "other3.com"))
+ .add_answer(new DNSPtrRR("64.48.32.16.in-addr.arpa", 100, "other4.com"))
+ .add_answer(new DNSPtrRR("64.48.32.16.in-addr.arpa", 100, "other5.com"))
+ .add_answer(new DNSPtrRR("64.48.32.16.in-addr.arpa", 100, "other6.com"))
+ .add_answer(new DNSPtrRR("64.48.32.16.in-addr.arpa", 100, "other7.com"))
+ .add_answer(new DNSPtrRR("64.48.32.16.in-addr.arpa", 100, "other8.com"))
+ .add_answer(new DNSPtrRR("64.48.32.16.in-addr.arpa", 100, "other9.com"));
+ std::vector<byte> data = pkt.data();
+ struct hostent *host = nullptr;
+
+ for (int ii = 1; ii <= 63; ii++) {
+ ClearFails();
+ SetAllocFail(ii);
+ int rc = ares_parse_ptr_reply(data.data(), data.size(),
+ addrv4, sizeof(addrv4), AF_INET, &host, NULL);
+ if (rc != ARES_ENOMEM) {
+ EXPECT_EQ(ARES_SUCCESS, rc);
+ ares_free_hostent(host);
+ host = nullptr;
+ }
+ }
+}
+
+
+} // namespace test
+} // namespace ares
diff --git a/contrib/libs/c-ares/test/ares-test-parse-soa-any.cc b/contrib/libs/c-ares/test/ares-test-parse-soa-any.cc
new file mode 100644
index 0000000000..804c6a0060
--- /dev/null
+++ b/contrib/libs/c-ares/test/ares-test-parse-soa-any.cc
@@ -0,0 +1,111 @@
+#include "ares-test.h"
+#include "dns-proto.h"
+
+#include <sstream>
+#include <vector>
+
+namespace ares {
+namespace test {
+
+TEST_F(LibraryTest, ParseSoaAnyReplyOK) {
+ DNSPacket pkt;
+ pkt.set_qid(0x1234).set_response().set_aa()
+ .add_question(new DNSQuestion("example.com", ns_t_any))\
+ .add_answer(new DNSARR("example.com", 0x01020304, {2,3,4,5}))
+ .add_answer(new DNSMxRR("example.com", 100, 100, "mx1.example.com"))
+ .add_answer(new DNSMxRR("example.com", 100, 200, "mx2.example.com"))
+ .add_answer(new DNSSoaRR("example.com", 100,
+ "soa1.example.com", "fred.example.com",
+ 1, 2, 3, 4, 5));
+ std::vector<byte> data = pkt.data();
+
+ struct ares_soa_reply* soa = nullptr;
+ EXPECT_EQ(ARES_SUCCESS, ares_parse_soa_reply(data.data(), 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);
+ ares_free_data(soa);
+}
+
+TEST_F(LibraryTest, ParseSoaAnyReplyErrors) {
+ DNSPacket pkt;
+ pkt.set_qid(0x1234).set_response().set_aa()
+ .add_question(new DNSQuestion("example.com", ns_t_any))
+ .add_answer(new DNSSoaRR("example.com", 100,
+ "soa1.example.com", "fred.example.com",
+ 1, 2, 3, 4, 5));
+ std::vector<byte> data;
+ struct ares_soa_reply* soa = nullptr;
+
+ // No question.
+ pkt.questions_.clear();
+ data = pkt.data();
+ EXPECT_EQ(ARES_EBADRESP, ares_parse_soa_reply(data.data(), data.size(), &soa));
+ pkt.add_question(new DNSQuestion("example.com", ns_t_any));
+
+#ifdef DISABLED
+ // Question != answer
+ pkt.questions_.clear();
+ pkt.add_question(new DNSQuestion("Axample.com", ns_t_any));
+ data = pkt.data();
+ EXPECT_EQ(ARES_EBADRESP, ares_parse_soa_reply(data.data(), data.size(), &soa));
+ pkt.questions_.clear();
+ pkt.add_question(new DNSQuestion("example.com", ns_t_any));
+#endif
+
+ // Two questions
+ pkt.add_question(new DNSQuestion("example.com", ns_t_any));
+ data = pkt.data();
+ EXPECT_EQ(ARES_EBADRESP, ares_parse_soa_reply(data.data(), data.size(), &soa));
+ pkt.questions_.clear();
+ pkt.add_question(new DNSQuestion("example.com", ns_t_any));
+
+ // Wrong sort of answer.
+ 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));
+ pkt.answers_.clear();
+ pkt.add_answer(new DNSSoaRR("example.com", 100,
+ "soa1.example.com", "fred.example.com",
+ 1, 2, 3, 4, 5));
+
+ // No answer.
+ pkt.answers_.clear();
+ data = pkt.data();
+ EXPECT_EQ(ARES_EBADRESP, ares_parse_soa_reply(data.data(), data.size(), &soa));
+ pkt.add_answer(new DNSSoaRR("example.com", 100,
+ "soa1.example.com", "fred.example.com",
+ 1, 2, 3, 4, 5));
+
+ // 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));
+ }
+}
+
+TEST_F(LibraryTest, ParseSoaAnyReplyAllocFail) {
+ DNSPacket pkt;
+ pkt.set_qid(0x1234).set_response().set_aa()
+ .add_question(new DNSQuestion("example.com", ns_t_any))
+ .add_answer(new DNSSoaRR("example.com", 100,
+ "soa1.example.com", "fred.example.com",
+ 1, 2, 3, 4, 5));
+ std::vector<byte> data = pkt.data();
+ struct ares_soa_reply* soa = nullptr;
+
+ for (int ii = 1; ii <= 5; ii++) {
+ ClearFails();
+ SetAllocFail(ii);
+ EXPECT_EQ(ARES_ENOMEM, ares_parse_soa_reply(data.data(), data.size(), &soa)) << ii;
+ }
+}
+
+} // namespace test
+} // namespace ares
diff --git a/contrib/libs/c-ares/test/ares-test-parse-soa.cc b/contrib/libs/c-ares/test/ares-test-parse-soa.cc
new file mode 100644
index 0000000000..c0ffaaed50
--- /dev/null
+++ b/contrib/libs/c-ares/test/ares-test-parse-soa.cc
@@ -0,0 +1,108 @@
+#include "ares-test.h"
+#include "dns-proto.h"
+
+#include <sstream>
+#include <vector>
+
+namespace ares {
+namespace test {
+
+TEST_F(LibraryTest, ParseSoaReplyOK) {
+ DNSPacket pkt;
+ pkt.set_qid(0x1234).set_response().set_aa()
+ .add_question(new DNSQuestion("example.com", ns_t_soa))
+ .add_answer(new DNSSoaRR("example.com", 100,
+ "soa1.example.com", "fred.example.com",
+ 1, 2, 3, 4, 5));
+ std::vector<byte> data = pkt.data();
+
+ struct ares_soa_reply* soa = nullptr;
+ EXPECT_EQ(ARES_SUCCESS, ares_parse_soa_reply(data.data(), 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);
+ ares_free_data(soa);
+}
+
+TEST_F(LibraryTest, ParseSoaReplyErrors) {
+ DNSPacket pkt;
+ pkt.set_qid(0x1234).set_response().set_aa()
+ .add_question(new DNSQuestion("example.com", ns_t_soa))
+ .add_answer(new DNSSoaRR("example.com", 100,
+ "soa1.example.com", "fred.example.com",
+ 1, 2, 3, 4, 5));
+ std::vector<byte> data;
+ struct ares_soa_reply* soa = nullptr;
+
+ // No question.
+ pkt.questions_.clear();
+ data = pkt.data();
+ EXPECT_EQ(ARES_EBADRESP, ares_parse_soa_reply(data.data(), data.size(), &soa));
+ pkt.add_question(new DNSQuestion("example.com", ns_t_soa));
+
+#ifdef DISABLED
+ // Question != answer
+ pkt.questions_.clear();
+ pkt.add_question(new DNSQuestion("Axample.com", ns_t_soa));
+ data = pkt.data();
+ EXPECT_EQ(ARES_EBADRESP, ares_parse_soa_reply(data.data(), data.size(), &soa));
+ pkt.questions_.clear();
+ pkt.add_question(new DNSQuestion("example.com", ns_t_soa));
+#endif
+
+ // Two questions
+ pkt.add_question(new DNSQuestion("example.com", ns_t_soa));
+ data = pkt.data();
+ EXPECT_EQ(ARES_EBADRESP, ares_parse_soa_reply(data.data(), data.size(), &soa));
+ pkt.questions_.clear();
+ pkt.add_question(new DNSQuestion("example.com", ns_t_soa));
+
+ // Wrong sort of answer.
+ 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));
+ pkt.answers_.clear();
+ pkt.add_answer(new DNSSoaRR("example.com", 100,
+ "soa1.example.com", "fred.example.com",
+ 1, 2, 3, 4, 5));
+
+ // No answer.
+ pkt.answers_.clear();
+ data = pkt.data();
+ EXPECT_EQ(ARES_EBADRESP, ares_parse_soa_reply(data.data(), data.size(), &soa));
+ pkt.add_answer(new DNSSoaRR("example.com", 100,
+ "soa1.example.com", "fred.example.com",
+ 1, 2, 3, 4, 5));
+
+ // 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));
+ }
+}
+
+TEST_F(LibraryTest, ParseSoaReplyAllocFail) {
+ DNSPacket pkt;
+ pkt.set_qid(0x1234).set_response().set_aa()
+ .add_question(new DNSQuestion("example.com", ns_t_soa))
+ .add_answer(new DNSSoaRR("example.com", 100,
+ "soa1.example.com", "fred.example.com",
+ 1, 2, 3, 4, 5));
+ std::vector<byte> data = pkt.data();
+ struct ares_soa_reply* soa = nullptr;
+
+ for (int ii = 1; ii <= 5; ii++) {
+ ClearFails();
+ SetAllocFail(ii);
+ EXPECT_EQ(ARES_ENOMEM, ares_parse_soa_reply(data.data(), data.size(), &soa)) << ii;
+ }
+}
+
+} // namespace test
+} // namespace ares
diff --git a/contrib/libs/c-ares/test/ares-test-parse-srv.cc b/contrib/libs/c-ares/test/ares-test-parse-srv.cc
new file mode 100644
index 0000000000..cc651d6d4e
--- /dev/null
+++ b/contrib/libs/c-ares/test/ares-test-parse-srv.cc
@@ -0,0 +1,288 @@
+#include "ares-test.h"
+#include "dns-proto.h"
+
+#include <sstream>
+#include <vector>
+
+namespace ares {
+namespace test {
+
+TEST_F(LibraryTest, ParseSrvReplyOK) {
+ DNSPacket pkt;
+ pkt.set_qid(0x1234).set_response().set_aa()
+ .add_question(new DNSQuestion("example.com", ns_t_srv))
+ .add_answer(new DNSSrvRR("example.com", 100, 10, 20, 30, "srv.example.com"))
+ .add_answer(new DNSSrvRR("example.com", 100, 11, 21, 31, "srv2.example.com"));
+ std::vector<byte> data = pkt.data();
+
+ struct ares_srv_reply* srv = nullptr;
+ EXPECT_EQ(ARES_SUCCESS, ares_parse_srv_reply(data.data(), data.size(), &srv));
+ ASSERT_NE(nullptr, srv);
+
+ EXPECT_EQ("srv.example.com", std::string(srv->host));
+ EXPECT_EQ(10, srv->priority);
+ EXPECT_EQ(20, srv->weight);
+ EXPECT_EQ(30, srv->port);
+
+ struct ares_srv_reply* srv2 = srv->next;
+ ASSERT_NE(nullptr, srv2);
+ EXPECT_EQ("srv2.example.com", std::string(srv2->host));
+ EXPECT_EQ(11, srv2->priority);
+ EXPECT_EQ(21, srv2->weight);
+ EXPECT_EQ(31, srv2->port);
+ EXPECT_EQ(nullptr, srv2->next);
+
+ ares_free_data(srv);
+}
+
+TEST_F(LibraryTest, ParseSrvReplySingle) {
+ DNSPacket pkt;
+ pkt.set_qid(0x1234).set_response().set_aa()
+ .add_question(new DNSQuestion("example.abc.def.com", ns_t_srv))
+ .add_answer(new DNSSrvRR("example.abc.def.com", 180, 0, 10, 8160, "example.abc.def.com"))
+ .add_auth(new DNSNsRR("abc.def.com", 44, "else1.where.com"))
+ .add_auth(new DNSNsRR("abc.def.com", 44, "else2.where.com"))
+ .add_auth(new DNSNsRR("abc.def.com", 44, "else3.where.com"))
+ .add_auth(new DNSNsRR("abc.def.com", 44, "else4.where.com"))
+ .add_auth(new DNSNsRR("abc.def.com", 44, "else5.where.com"))
+ .add_additional(new DNSARR("else2.where.com", 42, {172,19,0,1}))
+ .add_additional(new DNSARR("else5.where.com", 42, {172,19,0,2}));
+ std::vector<byte> data = pkt.data();
+
+ struct ares_srv_reply* srv = nullptr;
+ EXPECT_EQ(ARES_SUCCESS, ares_parse_srv_reply(data.data(), data.size(), &srv));
+ ASSERT_NE(nullptr, srv);
+
+ EXPECT_EQ("example.abc.def.com", std::string(srv->host));
+ EXPECT_EQ(0, srv->priority);
+ EXPECT_EQ(10, srv->weight);
+ EXPECT_EQ(8160, srv->port);
+ EXPECT_EQ(nullptr, srv->next);
+
+ ares_free_data(srv);
+}
+
+TEST_F(LibraryTest, ParseSrvReplyMalformed) {
+ std::vector<byte> 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
+ 0x07, 'e', 'x', 'a', 'm', 'p', 'l', 'e',
+ 0x03, 'c', 'o', 'm',
+ 0x00,
+ 0x00, 0x21, // type SRV
+ 0x00, 0x01, // class IN
+ // Answer 1
+ 0x07, 'e', 'x', 'a', 'm', 'p', 'l', 'e',
+ 0x03, 'c', 'o', 'm',
+ 0x00,
+ 0x00, 0x21, // RR type
+ 0x00, 0x01, // class IN
+ 0x01, 0x02, 0x03, 0x04, // TTL
+ 0x00, 0x04, // rdata length -- too short
+ 0x02, 0x03, 0x04, 0x05,
+ };
+
+ struct ares_srv_reply* srv = nullptr;
+ EXPECT_EQ(ARES_EBADRESP, ares_parse_srv_reply(data.data(), data.size(), &srv));
+ ASSERT_EQ(nullptr, srv);
+}
+
+TEST_F(LibraryTest, ParseSrvReplyMultiple) {
+ DNSPacket pkt;
+ pkt.set_qid(0x1234).set_response().set_ra().set_rd()
+ .add_question(new DNSQuestion("srv.example.com", ns_t_srv))
+ .add_answer(new DNSSrvRR("srv.example.com", 300, 0, 5, 6789, "a1.srv.example.com"))
+ .add_answer(new DNSSrvRR("srv.example.com", 300, 0, 5, 4567, "a2.srv.example.com"))
+ .add_answer(new DNSSrvRR("srv.example.com", 300, 0, 5, 5678, "a3.srv.example.com"))
+ .add_auth(new DNSNsRR("example.com", 300, "ns1.example.com"))
+ .add_auth(new DNSNsRR("example.com", 300, "ns2.example.com"))
+ .add_auth(new DNSNsRR("example.com", 300, "ns3.example.com"))
+ .add_additional(new DNSARR("a1.srv.example.com", 300, {172,19,1,1}))
+ .add_additional(new DNSARR("a2.srv.example.com", 300, {172,19,1,2}))
+ .add_additional(new DNSARR("a3.srv.example.com", 300, {172,19,1,3}))
+ .add_additional(new DNSARR("n1.example.com", 300, {172,19,0,1}))
+ .add_additional(new DNSARR("n2.example.com", 300, {172,19,0,2}))
+ .add_additional(new DNSARR("n3.example.com", 300, {172,19,0,3}));
+ std::vector<byte> data = pkt.data();
+
+ struct ares_srv_reply* srv0 = nullptr;
+ EXPECT_EQ(ARES_SUCCESS, ares_parse_srv_reply(data.data(), data.size(), &srv0));
+ ASSERT_NE(nullptr, srv0);
+ struct ares_srv_reply* srv = srv0;
+
+ EXPECT_EQ("a1.srv.example.com", std::string(srv->host));
+ EXPECT_EQ(0, srv->priority);
+ EXPECT_EQ(5, srv->weight);
+ EXPECT_EQ(6789, srv->port);
+ EXPECT_NE(nullptr, srv->next);
+ srv = srv->next;
+
+ EXPECT_EQ("a2.srv.example.com", std::string(srv->host));
+ EXPECT_EQ(0, srv->priority);
+ EXPECT_EQ(5, srv->weight);
+ EXPECT_EQ(4567, srv->port);
+ EXPECT_NE(nullptr, srv->next);
+ srv = srv->next;
+
+ EXPECT_EQ("a3.srv.example.com", std::string(srv->host));
+ EXPECT_EQ(0, srv->priority);
+ EXPECT_EQ(5, srv->weight);
+ EXPECT_EQ(5678, srv->port);
+ EXPECT_EQ(nullptr, srv->next);
+
+ ares_free_data(srv0);
+}
+
+TEST_F(LibraryTest, ParseSrvReplyCname) {
+ DNSPacket pkt;
+ pkt.set_qid(0x1234).set_response().set_aa()
+ .add_question(new DNSQuestion("example.abc.def.com", ns_t_srv))
+ .add_answer(new DNSCnameRR("example.abc.def.com", 300, "cname.abc.def.com"))
+ .add_answer(new DNSSrvRR("cname.abc.def.com", 300, 0, 10, 1234, "srv.abc.def.com"))
+ .add_auth(new DNSNsRR("abc.def.com", 44, "else1.where.com"))
+ .add_auth(new DNSNsRR("abc.def.com", 44, "else2.where.com"))
+ .add_auth(new DNSNsRR("abc.def.com", 44, "else3.where.com"))
+ .add_additional(new DNSARR("example.abc.def.com", 300, {172,19,0,1}))
+ .add_additional(new DNSARR("else1.where.com", 42, {172,19,0,1}))
+ .add_additional(new DNSARR("else2.where.com", 42, {172,19,0,2}))
+ .add_additional(new DNSARR("else3.where.com", 42, {172,19,0,3}));
+ std::vector<byte> data = pkt.data();
+
+ struct ares_srv_reply* srv = nullptr;
+ EXPECT_EQ(ARES_SUCCESS, ares_parse_srv_reply(data.data(), data.size(), &srv));
+ ASSERT_NE(nullptr, srv);
+
+ EXPECT_EQ("srv.abc.def.com", std::string(srv->host));
+ EXPECT_EQ(0, srv->priority);
+ EXPECT_EQ(10, srv->weight);
+ EXPECT_EQ(1234, srv->port);
+ EXPECT_EQ(nullptr, srv->next);
+
+ ares_free_data(srv);
+}
+
+TEST_F(LibraryTest, ParseSrvReplyCnameMultiple) {
+ DNSPacket pkt;
+ pkt.set_qid(0x1234).set_response().set_ra().set_rd()
+ .add_question(new DNSQuestion("query.example.com", ns_t_srv))
+ .add_answer(new DNSCnameRR("query.example.com", 300, "srv.example.com"))
+ .add_answer(new DNSSrvRR("srv.example.com", 300, 0, 5, 6789, "a1.srv.example.com"))
+ .add_answer(new DNSSrvRR("srv.example.com", 300, 0, 5, 4567, "a2.srv.example.com"))
+ .add_answer(new DNSSrvRR("srv.example.com", 300, 0, 5, 5678, "a3.srv.example.com"))
+ .add_auth(new DNSNsRR("example.com", 300, "ns1.example.com"))
+ .add_auth(new DNSNsRR("example.com", 300, "ns2.example.com"))
+ .add_auth(new DNSNsRR("example.com", 300, "ns3.example.com"))
+ .add_additional(new DNSARR("a1.srv.example.com", 300, {172,19,1,1}))
+ .add_additional(new DNSARR("a2.srv.example.com", 300, {172,19,1,2}))
+ .add_additional(new DNSARR("a3.srv.example.com", 300, {172,19,1,3}))
+ .add_additional(new DNSARR("n1.example.com", 300, {172,19,0,1}))
+ .add_additional(new DNSARR("n2.example.com", 300, {172,19,0,2}))
+ .add_additional(new DNSARR("n3.example.com", 300, {172,19,0,3}));
+ std::vector<byte> data = pkt.data();
+
+ struct ares_srv_reply* srv0 = nullptr;
+ EXPECT_EQ(ARES_SUCCESS, ares_parse_srv_reply(data.data(), data.size(), &srv0));
+ ASSERT_NE(nullptr, srv0);
+ struct ares_srv_reply* srv = srv0;
+
+ EXPECT_EQ("a1.srv.example.com", std::string(srv->host));
+ EXPECT_EQ(0, srv->priority);
+ EXPECT_EQ(5, srv->weight);
+ EXPECT_EQ(6789, srv->port);
+ EXPECT_NE(nullptr, srv->next);
+ srv = srv->next;
+
+ EXPECT_EQ("a2.srv.example.com", std::string(srv->host));
+ EXPECT_EQ(0, srv->priority);
+ EXPECT_EQ(5, srv->weight);
+ EXPECT_EQ(4567, srv->port);
+ EXPECT_NE(nullptr, srv->next);
+ srv = srv->next;
+
+ EXPECT_EQ("a3.srv.example.com", std::string(srv->host));
+ EXPECT_EQ(0, srv->priority);
+ EXPECT_EQ(5, srv->weight);
+ EXPECT_EQ(5678, srv->port);
+ EXPECT_EQ(nullptr, srv->next);
+
+ ares_free_data(srv0);
+}
+
+TEST_F(LibraryTest, ParseSrvReplyErrors) {
+ DNSPacket pkt;
+ pkt.set_qid(0x1234).set_response().set_aa()
+ .add_question(new DNSQuestion("example.abc.def.com", ns_t_srv))
+ .add_answer(new DNSSrvRR("example.abc.def.com", 180, 0, 10, 8160, "example.abc.def.com"));
+ std::vector<byte> data;
+ struct ares_srv_reply* srv = nullptr;
+
+ // No question.
+ pkt.questions_.clear();
+ data = pkt.data();
+ EXPECT_EQ(ARES_EBADRESP, ares_parse_srv_reply(data.data(), data.size(), &srv));
+ pkt.add_question(new DNSQuestion("example.abc.def.com", ns_t_srv));
+
+#ifdef DISABLED
+ // Question != answer
+ pkt.questions_.clear();
+ pkt.add_question(new DNSQuestion("Axample.com", ns_t_srv));
+ data = pkt.data();
+ EXPECT_EQ(ARES_ENODATA, ares_parse_srv_reply(data.data(), data.size(), &srv));
+ pkt.questions_.clear();
+ pkt.add_question(new DNSQuestion("example.com", ns_t_srv));
+#endif
+
+ // Two questions.
+ pkt.add_question(new DNSQuestion("example.abc.def.com", ns_t_srv));
+ data = pkt.data();
+ EXPECT_EQ(ARES_EBADRESP, ares_parse_srv_reply(data.data(), data.size(), &srv));
+ pkt.questions_.clear();
+ pkt.add_question(new DNSQuestion("64.48.32.16.in-addr.arpa", ns_t_ptr));
+
+ // Wrong sort of answer.
+ 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(nullptr, srv);
+ pkt.answers_.clear();
+ pkt.add_answer(new DNSSrvRR("example.abc.def.com", 180, 0, 10, 8160, "example.abc.def.com"));
+
+ // No answer.
+ pkt.answers_.clear();
+ data = pkt.data();
+ EXPECT_EQ(ARES_ENODATA, ares_parse_srv_reply(data.data(), 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);
+ EXPECT_TRUE(rc == ARES_EBADRESP || rc == ARES_EBADNAME);
+ }
+}
+
+TEST_F(LibraryTest, ParseSrvReplyAllocFail) {
+ DNSPacket pkt;
+ pkt.set_qid(0x1234).set_response().set_aa()
+ .add_question(new DNSQuestion("example.abc.def.com", ns_t_srv))
+ .add_answer(new DNSCnameRR("example.com", 300, "c.example.com"))
+ .add_answer(new DNSSrvRR("example.abc.def.com", 180, 0, 10, 8160, "example.abc.def.com"));
+ std::vector<byte> data = pkt.data();
+ struct ares_srv_reply* srv = nullptr;
+
+ for (int ii = 1; ii <= 5; ii++) {
+ ClearFails();
+ SetAllocFail(ii);
+ EXPECT_EQ(ARES_ENOMEM, ares_parse_srv_reply(data.data(), data.size(), &srv)) << ii;
+ }
+}
+
+} // namespace test
+} // namespace ares
diff --git a/contrib/libs/c-ares/test/ares-test-parse-txt.cc b/contrib/libs/c-ares/test/ares-test-parse-txt.cc
new file mode 100644
index 0000000000..8aaaaa3b47
--- /dev/null
+++ b/contrib/libs/c-ares/test/ares-test-parse-txt.cc
@@ -0,0 +1,266 @@
+#include "ares-test.h"
+#include "dns-proto.h"
+
+#include <sstream>
+#include <vector>
+
+namespace ares {
+namespace test {
+
+TEST_F(LibraryTest, ParseTxtReplyOK) {
+ DNSPacket pkt;
+ std::string expected1 = "txt1.example.com";
+ std::string expected2a = "txt2a";
+ std::string expected2b("ABC\0ABC", 7);
+ pkt.set_qid(0x1234).set_response().set_aa()
+ .add_question(new DNSQuestion("example.com", ns_t_mx))
+ .add_answer(new DNSTxtRR("example.com", 100, {expected1}))
+ .add_answer(new DNSTxtRR("example.com", 100, {expected2a, expected2b}));
+ std::vector<byte> data = pkt.data();
+
+ struct ares_txt_reply* txt = nullptr;
+ EXPECT_EQ(ARES_SUCCESS, ares_parse_txt_reply(data.data(), data.size(), &txt));
+ ASSERT_NE(nullptr, txt);
+ EXPECT_EQ(std::vector<byte>(expected1.data(), expected1.data() + expected1.size()),
+ std::vector<byte>(txt->txt, txt->txt + txt->length));
+
+ struct ares_txt_reply* txt2 = txt->next;
+ ASSERT_NE(nullptr, txt2);
+ EXPECT_EQ(std::vector<byte>(expected2a.data(), expected2a.data() + expected2a.size()),
+ std::vector<byte>(txt2->txt, txt2->txt + txt2->length));
+
+ struct ares_txt_reply* txt3 = txt2->next;
+ ASSERT_NE(nullptr, txt3);
+ EXPECT_EQ(std::vector<byte>(expected2b.data(), expected2b.data() + expected2b.size()),
+ std::vector<byte>(txt3->txt, txt3->txt + txt3->length));
+ EXPECT_EQ(nullptr, txt3->next);
+
+ ares_free_data(txt);
+}
+
+TEST_F(LibraryTest, ParseTxtExtReplyOK) {
+ DNSPacket pkt;
+ std::string expected1 = "txt1.example.com";
+ std::string expected2a = "txt2a";
+ std::string expected2b("ABC\0ABC", 7);
+ pkt.set_qid(0x1234).set_response().set_aa()
+ .add_question(new DNSQuestion("example.com", ns_t_mx))
+ .add_answer(new DNSTxtRR("example.com", 100, {expected1}))
+ .add_answer(new DNSTxtRR("example.com", 100, {expected2a, expected2b}));
+ std::vector<byte> data = pkt.data();
+
+ struct ares_txt_ext* txt = nullptr;
+ EXPECT_EQ(ARES_SUCCESS, ares_parse_txt_reply_ext(data.data(), data.size(), &txt));
+ ASSERT_NE(nullptr, txt);
+ EXPECT_EQ(std::vector<byte>(expected1.data(), expected1.data() + expected1.size()),
+ std::vector<byte>(txt->txt, txt->txt + txt->length));
+ EXPECT_EQ(1, txt->record_start);
+
+ struct ares_txt_ext* txt2 = txt->next;
+ ASSERT_NE(nullptr, txt2);
+ EXPECT_EQ(std::vector<byte>(expected2a.data(), expected2a.data() + expected2a.size()),
+ std::vector<byte>(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<byte>(expected2b.data(), expected2b.data() + expected2b.size()),
+ std::vector<byte>(txt3->txt, txt3->txt + txt3->length));
+ EXPECT_EQ(nullptr, txt3->next);
+ EXPECT_EQ(0, txt3->record_start);
+
+ ares_free_data(txt);
+}
+
+TEST_F(LibraryTest, ParseTxtMalformedReply1) {
+ std::vector<byte> 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
+ 0x07, 'e', 'x', 'a', 'm', 'p', 'l', 'e',
+ 0x03, 'c', 'o', 'm',
+ 0x00,
+ 0x00, 0x10, // type TXT
+ 0x00, 0x01, // class IN
+ // Answer 1
+ 0x07, 'e', 'x', 'a', 'm', 'p', 'l', 'e',
+ 0x03, 'c', 'o', 'm',
+ 0x00,
+ 0x00, 0x10, // RR type
+ 0x00, 0x01, // class IN
+ 0x01, 0x02, 0x03, 0x04, // TTL
+ 0x00, 0x03, // rdata length
+ 0x12, 'a', 'b', // invalid length
+ };
+
+ struct ares_txt_reply* txt = nullptr;
+ EXPECT_EQ(ARES_EBADRESP, ares_parse_txt_reply(data.data(), data.size(), &txt));
+ ASSERT_EQ(nullptr, txt);
+}
+
+TEST_F(LibraryTest, ParseTxtMalformedReply2) {
+ std::vector<byte> 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
+ 0x07, 'e', 'x', 'a', 'm', 'p', 'l', 'e',
+ 0x03, 'c', 'o', 'm',
+ 0x00,
+ 0x00, 0x10, // type TXT
+ 0x00, 0x01, // class IN
+ // Answer 1
+ 0x07, 'e', 'x', 'a', 'm', 'p', 'l', 'e',
+ 0x03, 'c', 'o', 'm',
+ 0x00,
+ 0x00, 0x10, // RR type
+ // truncated
+ };
+
+ struct ares_txt_reply* txt = nullptr;
+ EXPECT_EQ(ARES_EBADRESP, ares_parse_txt_reply(data.data(), data.size(), &txt));
+ ASSERT_EQ(nullptr, txt);
+}
+
+TEST_F(LibraryTest, ParseTxtMalformedReply3) {
+ std::vector<byte> 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
+ 0x07, 'e', 'x', 'a', 'm', 'p', 'l', 'e',
+ 0x03, 'c', 'o', 'm',
+ 0x00,
+ 0x00, 0x10, // type TXT
+ 0x00, 0x01, // class IN
+ // Answer 1
+ 0x07, 'e', 'x', 'a', 'm', 'p', 'l', 'e',
+ 0x03, 'c', 'o', 'm',
+ 0x00,
+ 0x00, 0x10, // RR type
+ 0x00, 0x01, // class IN
+ 0x01, 0x02, 0x03, 0x04, // TTL
+ 0x00, 0x13, // rdata length INVALID
+ 0x02, 'a', 'b',
+ };
+
+ struct ares_txt_reply* txt = nullptr;
+ EXPECT_EQ(ARES_EBADRESP, ares_parse_txt_reply(data.data(), data.size(), &txt));
+ ASSERT_EQ(nullptr, txt);
+}
+
+TEST_F(LibraryTest, ParseTxtMalformedReply4) {
+ std::vector<byte> 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
+ 0x07, 'e', 'x', 'a', 'm', 'p', 'l', 'e',
+ 0x03, 'c', 'o', 'm',
+ 0x00,
+ 0x00, 0x10, // type TXT
+ 0x00, // TRUNCATED
+ };
+
+ struct ares_txt_reply* txt = nullptr;
+ EXPECT_EQ(ARES_EBADRESP, ares_parse_txt_reply(data.data(), data.size(), &txt));
+ ASSERT_EQ(nullptr, txt);
+}
+
+TEST_F(LibraryTest, ParseTxtReplyErrors) {
+ DNSPacket pkt;
+ std::string expected1 = "txt1.example.com";
+ std::string expected2a = "txt2a";
+ std::string expected2b = "txt2b";
+ pkt.set_qid(0x1234).set_response().set_aa()
+ .add_question(new DNSQuestion("example.com", ns_t_mx))
+ .add_answer(new DNSTxtRR("example.com", 100, {expected1}))
+ .add_answer(new DNSTxtRR("example.com", 100, {expected1}))
+ .add_answer(new DNSTxtRR("example.com", 100, {expected2a, expected2b}));
+ std::vector<byte> data = pkt.data();
+ struct ares_txt_reply* txt = nullptr;
+
+ // No question.
+ pkt.questions_.clear();
+ data = pkt.data();
+ txt = nullptr;
+ EXPECT_EQ(ARES_EBADRESP, ares_parse_txt_reply(data.data(), data.size(), &txt));
+ EXPECT_EQ(nullptr, txt);
+ pkt.add_question(new DNSQuestion("example.com", ns_t_mx));
+
+#ifdef DISABLED
+ // Question != answer
+ pkt.questions_.clear();
+ pkt.add_question(new DNSQuestion("Axample.com", ns_t_txt));
+ data = pkt.data();
+ EXPECT_EQ(ARES_ENODATA, ares_parse_txt_reply(data.data(), data.size(), &txt));
+ pkt.questions_.clear();
+ pkt.add_question(new DNSQuestion("example.com", ns_t_txt));
+#endif
+
+ // Two questions.
+ pkt.add_question(new DNSQuestion("example.com", ns_t_mx));
+ data = pkt.data();
+ txt = nullptr;
+ EXPECT_EQ(ARES_EBADRESP, ares_parse_txt_reply(data.data(), data.size(), &txt));
+ EXPECT_EQ(nullptr, txt);
+ pkt.questions_.clear();
+ pkt.add_question(new DNSQuestion("example.com", ns_t_mx));
+
+ // No answer.
+ pkt.answers_.clear();
+ data = pkt.data();
+ txt = nullptr;
+ EXPECT_EQ(ARES_ENODATA, ares_parse_txt_reply(data.data(), 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_EQ(nullptr, txt);
+ }
+}
+
+TEST_F(LibraryTest, ParseTxtReplyAllocFail) {
+ DNSPacket pkt;
+ std::string expected1 = "txt1.example.com";
+ std::string expected2a = "txt2a";
+ std::string expected2b = "txt2b";
+ pkt.set_qid(0x1234).set_response().set_aa()
+ .add_question(new DNSQuestion("example.com", ns_t_mx))
+ .add_answer(new DNSCnameRR("example.com", 300, "c.example.com"))
+ .add_answer(new DNSTxtRR("c.example.com", 100, {expected1}))
+ .add_answer(new DNSTxtRR("c.example.com", 100, {expected1}))
+ .add_answer(new DNSTxtRR("c.example.com", 100, {expected2a, expected2b}));
+ std::vector<byte> data = pkt.data();
+ struct ares_txt_reply* txt = nullptr;
+
+ for (int ii = 1; ii <= 13; ii++) {
+ ClearFails();
+ SetAllocFail(ii);
+ EXPECT_EQ(ARES_ENOMEM, ares_parse_txt_reply(data.data(), data.size(), &txt)) << ii;
+ }
+}
+
+
+} // namespace test
+} // namespace ares
diff --git a/contrib/libs/c-ares/test/ares-test-parse.cc b/contrib/libs/c-ares/test/ares-test-parse.cc
new file mode 100644
index 0000000000..4c54fc9902
--- /dev/null
+++ b/contrib/libs/c-ares/test/ares-test-parse.cc
@@ -0,0 +1,219 @@
+#include "ares-test.h"
+#include "dns-proto.h"
+
+#include <sstream>
+#include <vector>
+
+namespace ares {
+namespace test {
+
+TEST_F(LibraryTest, ParseRootName) {
+ DNSPacket pkt;
+ pkt.set_qid(0x1234).set_response().set_aa()
+ .add_question(new DNSQuestion(".", ns_t_a))
+ .add_answer(new DNSARR(".", 100, {0x02, 0x03, 0x04, 0x05}));
+ std::vector<byte> data = pkt.data();
+
+ 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));
+ EXPECT_EQ(1, count);
+ std::stringstream ss;
+ ss << HostEnt(host);
+ EXPECT_EQ("{'' aliases=[] addrs=[2.3.4.5]}", ss.str());
+ ares_free_hostent(host);
+}
+
+TEST_F(LibraryTest, ParseIndirectRootName) {
+ std::vector<byte> 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, 0x04, // weird: pointer to a random zero earlier in the message
+ 0x00, 0x01, // type A
+ 0x00, 0x01, // class IN
+ // Answer 1
+ 0xC0, 0x04,
+ 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));
+ EXPECT_EQ(1, count);
+ std::stringstream ss;
+ ss << HostEnt(host);
+ EXPECT_EQ("{'' aliases=[] addrs=[2.3.4.5]}", ss.str());
+ ares_free_hostent(host);
+}
+
+TEST_F(LibraryTest, ParseEscapedName) {
+ std::vector<byte> 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
+ 0x05, 'a', '\\', 'b', '.', 'c',
+ 0x03, 'c', 'o', 'm',
+ 0x00,
+ 0x00, 0x01, // type A
+ 0x00, 0x01, // class IN
+ // Answer 1
+ 0x05, 'a', '\\', 'b', '.', 'c',
+ 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));
+ EXPECT_EQ(1, count);
+ HostEnt hent(host);
+ std::stringstream ss;
+ ss << hent;
+ // The printable name is expanded with escapes.
+ EXPECT_EQ(11, hent.name_.size());
+ EXPECT_EQ('a', hent.name_[0]);
+ EXPECT_EQ('\\', hent.name_[1]);
+ EXPECT_EQ('\\', hent.name_[2]);
+ EXPECT_EQ('b', hent.name_[3]);
+ EXPECT_EQ('\\', hent.name_[4]);
+ EXPECT_EQ('.', hent.name_[5]);
+ EXPECT_EQ('c', hent.name_[6]);
+ ares_free_hostent(host);
+}
+
+TEST_F(LibraryTest, ParsePartialCompressedName) {
+ std::vector<byte> 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
+ 0x03, 'w', 'w', 'w',
+ 0x07, 'e', 'x', 'a', 'm', 'p', 'l', 'e',
+ 0x03, 'c', 'o', 'm',
+ 0x00,
+ 0x00, 0x01, // type A
+ 0x00, 0x01, // class IN
+ // Answer 1
+ 0x03, 'w', 'w', 'w',
+ 0xc0, 0x10, // offset 16
+ 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);
+}
+
+TEST_F(LibraryTest, ParseFullyCompressedName) {
+ std::vector<byte> 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
+ 0x03, 'w', 'w', 'w',
+ 0x07, 'e', 'x', 'a', 'm', 'p', 'l', 'e',
+ 0x03, 'c', 'o', 'm',
+ 0x00,
+ 0x00, 0x01, // type A
+ 0x00, 0x01, // class IN
+ // Answer 1
+ 0xc0, 0x0c, // offset 12
+ 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);
+}
+
+TEST_F(LibraryTest, ParseFullyCompressedName2) {
+ std::vector<byte> 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/contrib/libs/c-ares/test/ares-test.cc b/contrib/libs/c-ares/test/ares-test.cc
new file mode 100644
index 0000000000..ec4b460549
--- /dev/null
+++ b/contrib/libs/c-ares/test/ares-test.cc
@@ -0,0 +1,772 @@
+#include "ares-test.h"
+#include "ares-test-ai.h"
+#include "dns-proto.h"
+
+// Include ares internal files for DNS protocol details
+#include "nameser.h"
+#include "ares_dns.h"
+
+#ifdef HAVE_NETDB_H
+#include <netdb.h>
+#endif
+#ifdef HAVE_NETINET_TCP_H
+#include <netinet/tcp.h>
+#endif
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <functional>
+#include <sstream>
+
+#ifdef WIN32
+#define BYTE_CAST (char *)
+#define mkdir_(d, p) mkdir(d)
+#else
+#define BYTE_CAST
+#define mkdir_(d, p) mkdir(d, p)
+#endif
+
+namespace ares {
+namespace test {
+
+bool verbose = false;
+int mock_port = 5300;
+
+const std::vector<int> both_families = {AF_INET, AF_INET6};
+const std::vector<int> ipv4_family = {AF_INET};
+const std::vector<int> ipv6_family = {AF_INET6};
+
+const std::vector<std::pair<int, bool>> both_families_both_modes = {
+ std::make_pair<int, bool>(AF_INET, false),
+ std::make_pair<int, bool>(AF_INET, true),
+ std::make_pair<int, bool>(AF_INET6, false),
+ std::make_pair<int, bool>(AF_INET6, true)
+};
+const std::vector<std::pair<int, bool>> ipv4_family_both_modes = {
+ std::make_pair<int, bool>(AF_INET, false),
+ std::make_pair<int, bool>(AF_INET, true)
+};
+const std::vector<std::pair<int, bool>> ipv6_family_both_modes = {
+ std::make_pair<int, bool>(AF_INET6, false),
+ std::make_pair<int, bool>(AF_INET6, true)
+};
+
+// Which parameters to use in tests
+std::vector<int> families = both_families;
+std::vector<std::pair<int, bool>> families_modes = both_families_both_modes;
+
+unsigned long long LibraryTest::fails_ = 0;
+std::map<size_t, int> LibraryTest::size_fails_;
+
+void ProcessWork(ares_channel channel,
+ std::function<std::set<int>()> get_extrafds,
+ std::function<void(int)> process_extra) {
+ int nfds, count;
+ fd_set readers, writers;
+ struct timeval tv;
+ while (true) {
+ // Retrieve the set of file descriptors that the library wants us to monitor.
+ FD_ZERO(&readers);
+ FD_ZERO(&writers);
+ nfds = ares_fds(channel, &readers, &writers);
+ if (nfds == 0) // no work left to do in the library
+ return;
+
+ // Add in the extra FDs if present.
+ std::set<int> extrafds = get_extrafds();
+ for (int extrafd : extrafds) {
+ FD_SET(extrafd, &readers);
+ if (extrafd >= nfds) {
+ nfds = extrafd + 1;
+ }
+ }
+
+ // Wait for activity or timeout.
+ tv.tv_sec = 0;
+ tv.tv_usec = 100000; // 100ms
+ count = select(nfds, &readers, &writers, nullptr, &tv);
+ if (count < 0) {
+ fprintf(stderr, "select() failed, errno %d\n", errno);
+ return;
+ }
+
+ // Let the library process any activity.
+ ares_process(channel, &readers, &writers);
+
+ // Let the provided callback process any activity on the extra FD.
+ for (int extrafd : extrafds) {
+ if (FD_ISSET(extrafd, &readers)) {
+ process_extra(extrafd);
+ }
+ }
+ }
+}
+
+// static
+void LibraryTest::SetAllocFail(int nth) {
+ assert(nth > 0);
+ assert(nth <= (int)(8 * sizeof(fails_)));
+ fails_ |= (1LL << (nth - 1));
+}
+
+// static
+void LibraryTest::SetAllocSizeFail(size_t size) {
+ size_fails_[size]++;
+}
+
+// static
+void LibraryTest::ClearFails() {
+ fails_ = 0;
+ size_fails_.clear();
+}
+
+
+// static
+bool LibraryTest::ShouldAllocFail(size_t size) {
+ bool fail = (fails_ & 0x01);
+ fails_ >>= 1;
+ if (size_fails_[size] > 0) {
+ size_fails_[size]--;
+ fail = true;
+ }
+ return fail;
+}
+
+// static
+void* LibraryTest::amalloc(size_t size) {
+ if (ShouldAllocFail(size)) {
+ if (verbose) std::cerr << "Failing malloc(" << size << ") request" << std::endl;
+ return nullptr;
+ } else {
+ return malloc(size);
+ }
+}
+
+// static
+void* LibraryTest::arealloc(void *ptr, size_t size) {
+ if (ShouldAllocFail(size)) {
+ if (verbose) std::cerr << "Failing realloc(" << ptr << ", " << size << ") request" << std::endl;
+ return nullptr;
+ } else {
+ return realloc(ptr, size);
+ }
+}
+
+// static
+void LibraryTest::afree(void *ptr) {
+ free(ptr);
+}
+
+std::set<int> NoExtraFDs() {
+ return std::set<int>();
+}
+
+void DefaultChannelTest::Process() {
+ ProcessWork(channel_, NoExtraFDs, nullptr);
+}
+
+void DefaultChannelModeTest::Process() {
+ ProcessWork(channel_, NoExtraFDs, nullptr);
+}
+
+MockServer::MockServer(int family, int port, int tcpport)
+ : udpport_(port), tcpport_(tcpport ? tcpport : udpport_), qid_(-1) {
+ // Create a TCP socket to receive data on.
+ tcpfd_ = socket(family, SOCK_STREAM, 0);
+ EXPECT_NE(-1, tcpfd_);
+ int optval = 1;
+ setsockopt(tcpfd_, SOL_SOCKET, SO_REUSEADDR,
+ BYTE_CAST &optval , sizeof(int));
+ // Send TCP data right away.
+ setsockopt(tcpfd_, IPPROTO_TCP, TCP_NODELAY,
+ BYTE_CAST &optval , sizeof(int));
+
+ // Create a UDP socket to receive data on.
+ udpfd_ = socket(family, SOCK_DGRAM, 0);
+ EXPECT_NE(-1, udpfd_);
+
+ // Bind the sockets to the given port.
+ if (family == AF_INET) {
+ struct sockaddr_in addr;
+ memset(&addr, 0, sizeof(addr));
+ addr.sin_family = AF_INET;
+ addr.sin_addr.s_addr = htonl(INADDR_ANY);
+ addr.sin_port = htons(tcpport_);
+ int tcprc = bind(tcpfd_, (struct sockaddr*)&addr, sizeof(addr));
+ EXPECT_EQ(0, tcprc) << "Failed to bind AF_INET to TCP port " << tcpport_;
+ addr.sin_port = htons(udpport_);
+ int udprc = bind(udpfd_, (struct sockaddr*)&addr, sizeof(addr));
+ EXPECT_EQ(0, udprc) << "Failed to bind AF_INET to UDP port " << udpport_;
+ } else {
+ EXPECT_EQ(AF_INET6, family);
+ struct sockaddr_in6 addr;
+ memset(&addr, 0, sizeof(addr));
+ addr.sin6_family = AF_INET6;
+ memset(&addr.sin6_addr, 0, sizeof(addr.sin6_addr)); // in6addr_any
+ addr.sin6_port = htons(tcpport_);
+ int tcprc = bind(tcpfd_, (struct sockaddr*)&addr, sizeof(addr));
+ EXPECT_EQ(0, tcprc) << "Failed to bind AF_INET6 to TCP port " << tcpport_;
+ addr.sin6_port = htons(udpport_);
+ int udprc = bind(udpfd_, (struct sockaddr*)&addr, sizeof(addr));
+ EXPECT_EQ(0, udprc) << "Failed to bind AF_INET6 to UDP port " << udpport_;
+ }
+ if (verbose) std::cerr << "Configured "
+ << (family == AF_INET ? "IPv4" : "IPv6")
+ << " mock server with TCP socket " << tcpfd_
+ << " on port " << tcpport_
+ << " and UDP socket " << udpfd_
+ << " on port " << udpport_ << std::endl;
+
+ // For TCP, also need to listen for connections.
+ EXPECT_EQ(0, listen(tcpfd_, 5)) << "Failed to listen for TCP connections";
+}
+
+MockServer::~MockServer() {
+ for (int fd : connfds_) {
+ sclose(fd);
+ }
+ sclose(tcpfd_);
+ sclose(udpfd_);
+}
+
+void MockServer::ProcessFD(int 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);
+ if (connfd < 0) {
+ std::cerr << "Error accepting connection on fd " << fd << std::endl;
+ } else {
+ connfds_.insert(connfd);
+ }
+ return;
+ }
+
+ // Activity on a data-bearing file descriptor.
+ struct sockaddr_storage addr;
+ socklen_t addrlen = sizeof(addr);
+ 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);
+ return;
+ }
+ if (len < 2) {
+ std::cerr << "Packet too short (" << len << ")" << std::endl;
+ return;
+ }
+ 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;
+ }
+ }
+
+ // Assume the packet is a well-formed DNS request and extract the request
+ // details.
+ if (len < NS_HFIXEDSZ) {
+ std::cerr << "Packet too short (" << len << ")" << std::endl;
+ return;
+ }
+ int qid = DNS_HEADER_QID(data);
+ if (DNS_HEADER_QR(data) != 0) {
+ std::cerr << "Not a request" << std::endl;
+ return;
+ }
+ if (DNS_HEADER_OPCODE(data) != ns_o_query) {
+ std::cerr << "Not a query (opcode " << DNS_HEADER_OPCODE(data)
+ << ")" << std::endl;
+ return;
+ }
+ if (DNS_HEADER_QDCOUNT(data) != 1) {
+ std::cerr << "Unexpected question count (" << DNS_HEADER_QDCOUNT(data)
+ << ")" << std::endl;
+ return;
+ }
+ byte* question = data + 12;
+ int qlen = len - 12;
+
+ char *name = nullptr;
+ long enclen;
+ ares_expand_name(question, data, len, &name, &enclen);
+ if (!name) {
+ std::cerr << "Failed to retrieve name" << std::endl;
+ return;
+ }
+ qlen -= enclen;
+ question += enclen;
+ std::string namestr(name);
+ ares_free_string(name);
+
+ if (qlen < 4) {
+ std::cerr << "Unexpected question size (" << qlen
+ << " bytes after name)" << std::endl;
+ return;
+ }
+ if (DNS_QUESTION_CLASS(question) != ns_c_in) {
+ std::cerr << "Unexpected question class (" << DNS_QUESTION_CLASS(question)
+ << ")" << std::endl;
+ return;
+ }
+ int rrtype = DNS_QUESTION_TYPE(question);
+
+ if (verbose) {
+ std::vector<byte> req(data, data + len);
+ std::cerr << "received " << (fd == udpfd_ ? "UDP" : "TCP") << " request " << PacketToString(req)
+ << " on port " << (fd == udpfd_ ? udpport_ : tcpport_) << std::endl;
+ std::cerr << "ProcessRequest(" << qid << ", '" << namestr
+ << "', " << RRTypeToString(rrtype) << ")" << std::endl;
+ }
+ ProcessRequest(fd, &addr, addrlen, qid, namestr, rrtype);
+}
+
+std::set<int> MockServer::fds() const {
+ std::set<int> result = connfds_;
+ result.insert(tcpfd_);
+ result.insert(udpfd_);
+ return result;
+}
+
+void MockServer::ProcessRequest(int fd, struct sockaddr_storage* addr, int addrlen,
+ int qid, const std::string& name, int rrtype) {
+ // Before processing, let gMock know the request is happening.
+ OnRequest(name, rrtype);
+
+ if (reply_.size() == 0) {
+ return;
+ }
+
+ // Make a local copy of the current pending reply.
+ std::vector<byte> reply = reply_;
+
+ if (qid_ >= 0) {
+ // Use the explicitly specified query ID.
+ qid = qid_;
+ }
+ if (reply.size() >= 2) {
+ // Overwrite the query ID if space to do so.
+ reply[0] = (byte)((qid >> 8) & 0xff);
+ reply[1] = (byte)(qid & 0xff);
+ }
+ if (verbose) std::cerr << "sending reply " << PacketToString(reply)
+ << " on port " << ((fd == udpfd_) ? udpport_ : tcpport_) << std::endl;
+
+ // Prefix with 2-byte length if TCP.
+ if (fd != udpfd_) {
+ int len = reply.size();
+ std::vector<byte> vlen = {(byte)((len & 0xFF00) >> 8), (byte)(len & 0xFF)};
+ reply.insert(reply.begin(), vlen.begin(), vlen.end());
+ // Also, don't bother with the destination address.
+ addr = nullptr;
+ addrlen = 0;
+ }
+
+ int rc = sendto(fd, BYTE_CAST reply.data(), reply.size(), 0,
+ (struct sockaddr *)addr, addrlen);
+ if (rc < static_cast<int>(reply.size())) {
+ std::cerr << "Failed to send full reply, rc=" << rc << std::endl;
+ }
+}
+
+// static
+MockChannelOptsTest::NiceMockServers MockChannelOptsTest::BuildServers(int count, int family, int base_port) {
+ NiceMockServers servers;
+ assert(count > 0);
+ for (int ii = 0; ii < count; ii++) {
+ std::unique_ptr<NiceMockServer> server(new NiceMockServer(family, base_port + ii));
+ servers.push_back(std::move(server));
+ }
+ return servers;
+}
+
+MockChannelOptsTest::MockChannelOptsTest(int count,
+ int family,
+ bool force_tcp,
+ struct ares_options* givenopts,
+ int optmask)
+ : servers_(BuildServers(count, family, mock_port)),
+ server_(*servers_[0].get()), channel_(nullptr) {
+ // Set up channel options.
+ struct ares_options opts;
+ if (givenopts) {
+ memcpy(&opts, givenopts, sizeof(opts));
+ } else {
+ memset(&opts, 0, sizeof(opts));
+ }
+
+ // Point the library at the first mock server by default (overridden below).
+ opts.udp_port = mock_port;
+ optmask |= ARES_OPT_UDP_PORT;
+ opts.tcp_port = mock_port;
+ optmask |= ARES_OPT_TCP_PORT;
+
+ // If not already overridden, set short-ish timeouts.
+ if (!(optmask & (ARES_OPT_TIMEOUTMS|ARES_OPT_TIMEOUT))) {
+ opts.timeout = 1500;
+ optmask |= ARES_OPT_TIMEOUTMS;
+ }
+ // If not already overridden, set 3 retries.
+ if (!(optmask & ARES_OPT_TRIES)) {
+ opts.tries = 3;
+ optmask |= ARES_OPT_TRIES;
+ }
+ // If not already overridden, set search domains.
+ const char *domains[3] = {"first.com", "second.org", "third.gov"};
+ if (!(optmask & ARES_OPT_DOMAINS)) {
+ opts.ndomains = 3;
+ opts.domains = (char**)domains;
+ optmask |= ARES_OPT_DOMAINS;
+ }
+ if (force_tcp) {
+ opts.flags |= ARES_FLAG_USEVC;
+ optmask |= ARES_OPT_FLAGS;
+ }
+
+ EXPECT_EQ(ARES_SUCCESS, ares_init_options(&channel_, &opts, optmask));
+ EXPECT_NE(nullptr, channel_);
+
+ // Set up servers after construction so we can set individual ports
+ struct ares_addr_port_node* prev = nullptr;
+ struct ares_addr_port_node* first = nullptr;
+ for (const auto& server : servers_) {
+ struct ares_addr_port_node* node = (struct ares_addr_port_node*)malloc(sizeof(*node));
+ if (prev) {
+ prev->next = node;
+ } else {
+ first = node;
+ }
+ node->next = nullptr;
+ node->family = family;
+ node->udp_port = server->udpport();
+ node->tcp_port = server->tcpport();
+ if (family == AF_INET) {
+ node->addr.addr4.s_addr = htonl(0x7F000001);
+ } else {
+ memset(&node->addr.addr6, 0, sizeof(node->addr.addr6));
+ node->addr.addr6._S6_un._S6_u8[15] = 1;
+ }
+ prev = node;
+ }
+ EXPECT_EQ(ARES_SUCCESS, ares_set_servers_ports(channel_, first));
+
+ while (first) {
+ prev = first;
+ first = first->next;
+ free(prev);
+ }
+ if (verbose) {
+ std::cerr << "Configured library with servers:";
+ std::vector<std::string> servers = GetNameServers(channel_);
+ for (const auto& server : servers) {
+ std::cerr << " " << server;
+ }
+ std::cerr << std::endl;
+ }
+}
+
+MockChannelOptsTest::~MockChannelOptsTest() {
+ if (channel_) {
+ ares_destroy(channel_);
+ }
+ channel_ = nullptr;
+}
+
+std::set<int> MockChannelOptsTest::fds() const {
+ std::set<int> fds;
+ for (const auto& server : servers_) {
+ std::set<int> serverfds = server->fds();
+ fds.insert(serverfds.begin(), serverfds.end());
+ }
+ return fds;
+}
+
+void MockChannelOptsTest::ProcessFD(int fd) {
+ for (auto& server : servers_) {
+ server->ProcessFD(fd);
+ }
+}
+
+void MockChannelOptsTest::Process() {
+ using namespace std::placeholders;
+ ProcessWork(channel_,
+ std::bind(&MockChannelOptsTest::fds, this),
+ std::bind(&MockChannelOptsTest::ProcessFD, this, _1));
+}
+
+std::ostream& operator<<(std::ostream& os, const HostResult& result) {
+ os << '{';
+ if (result.done_) {
+ os << StatusToString(result.status_) << " " << result.host_;
+ } else {
+ os << "(incomplete)";
+ }
+ os << '}';
+ return os;
+}
+
+HostEnt::HostEnt(const struct hostent *hostent) : addrtype_(-1) {
+ if (!hostent)
+ return;
+ if (hostent->h_name)
+ name_ = hostent->h_name;
+ if (hostent->h_aliases) {
+ char** palias = hostent->h_aliases;
+ while (*palias != nullptr) {
+ aliases_.push_back(*palias);
+ palias++;
+ }
+ }
+ addrtype_ = hostent->h_addrtype;
+ if (hostent->h_addr_list) {
+ char** paddr = hostent->h_addr_list;
+ while (*paddr != nullptr) {
+ std::string addr = AddressToString(*paddr, hostent->h_length);
+ addrs_.push_back(addr);
+ paddr++;
+ }
+ }
+}
+
+std::ostream& operator<<(std::ostream& os, const HostEnt& host) {
+ os << '{';
+ os << "'" << host.name_ << "' "
+ << "aliases=[";
+ for (size_t ii = 0; ii < host.aliases_.size(); ii++) {
+ if (ii > 0) os << ", ";
+ os << host.aliases_[ii];
+ }
+ os << "] ";
+ os << "addrs=[";
+ for (size_t ii = 0; ii < host.addrs_.size(); ii++) {
+ if (ii > 0) os << ", ";
+ os << host.addrs_[ii];
+ }
+ os << "]";
+ os << '}';
+ return os;
+}
+
+void HostCallback(void *data, int status, int timeouts,
+ struct hostent *hostent) {
+ EXPECT_NE(nullptr, data);
+ HostResult* result = reinterpret_cast<HostResult*>(data);
+ result->done_ = true;
+ result->status_ = status;
+ result->timeouts_ = timeouts;
+ result->host_ = HostEnt(hostent);
+ if (verbose) std::cerr << "HostCallback(" << *result << ")" << std::endl;
+}
+
+std::ostream& operator<<(std::ostream& os, const AddrInfoResult& result) {
+ os << '{';
+ if (result.done_ && result.ai_) {
+ os << StatusToString(result.status_) << " " << result.ai_;
+ } else {
+ os << "(incomplete)";
+ }
+ os << '}';
+ return os;
+}
+
+std::ostream& operator<<(std::ostream& os, const AddrInfo& ai) {
+ os << '{';
+ if (ai == nullptr) {
+ os << "nullptr}";
+ return os;
+ }
+
+ struct ares_addrinfo_cname *next_cname = ai->cnames;
+ while(next_cname) {
+ if(next_cname->alias) {
+ os << next_cname->alias << "->";
+ }
+ if(next_cname->name) {
+ os << next_cname->name;
+ }
+ if((next_cname = next_cname->next))
+ os << ", ";
+ else
+ os << " ";
+ }
+
+ struct ares_addrinfo_node *next = ai->nodes;
+ while(next) {
+ //if(next->ai_canonname) {
+ //os << "'" << next->ai_canonname << "' ";
+ //}
+ unsigned short port = 0;
+ os << "addr=[";
+ if(next->ai_family == AF_INET) {
+ sockaddr_in* sin = (sockaddr_in*)next->ai_addr;
+ port = ntohs(sin->sin_port);
+ os << AddressToString(&sin->sin_addr, 4);
+ }
+ else if (next->ai_family == AF_INET6) {
+ sockaddr_in6* sin = (sockaddr_in6*)next->ai_addr;
+ port = ntohs(sin->sin6_port);
+ os << "[" << AddressToString(&sin->sin6_addr, 16) << "]";
+ }
+ else
+ os << "unknown family";
+ if(port) {
+ os << ":" << port;
+ }
+ os << "]";
+ if((next = next->ai_next))
+ os << ", ";
+ }
+ os << '}';
+ return os;
+}
+
+void AddrInfoCallback(void *data, int status, int timeouts,
+ struct ares_addrinfo *ai) {
+ EXPECT_NE(nullptr, data);
+ AddrInfoResult* result = reinterpret_cast<AddrInfoResult*>(data);
+ result->done_ = true;
+ result->status_ = status;
+ result->timeouts_= timeouts;
+ result->ai_ = AddrInfo(ai);
+ if (verbose) std::cerr << "AddrInfoCallback(" << *result << ")" << std::endl;
+}
+
+std::ostream& operator<<(std::ostream& os, const SearchResult& result) {
+ os << '{';
+ if (result.done_) {
+ os << StatusToString(result.status_) << " " << PacketToString(result.data_);
+ } else {
+ os << "(incomplete)";
+ }
+ os << '}';
+ return os;
+}
+
+void SearchCallback(void *data, int status, int timeouts,
+ unsigned char *abuf, int alen) {
+ EXPECT_NE(nullptr, data);
+ SearchResult* result = reinterpret_cast<SearchResult*>(data);
+ result->done_ = true;
+ result->status_ = status;
+ result->timeouts_ = timeouts;
+ result->data_.assign(abuf, abuf + alen);
+ if (verbose) std::cerr << "SearchCallback(" << *result << ")" << std::endl;
+}
+
+std::ostream& operator<<(std::ostream& os, const NameInfoResult& result) {
+ os << '{';
+ if (result.done_) {
+ os << StatusToString(result.status_) << " " << result.node_ << " " << result.service_;
+ } else {
+ os << "(incomplete)";
+ }
+ os << '}';
+ return os;
+}
+
+void NameInfoCallback(void *data, int status, int timeouts,
+ char *node, char *service) {
+ EXPECT_NE(nullptr, data);
+ NameInfoResult* result = reinterpret_cast<NameInfoResult*>(data);
+ result->done_ = true;
+ result->status_ = status;
+ result->timeouts_ = timeouts;
+ result->node_ = std::string(node ? node : "");
+ result->service_ = std::string(service ? service : "");
+ if (verbose) std::cerr << "NameInfoCallback(" << *result << ")" << std::endl;
+}
+
+std::vector<std::string> GetNameServers(ares_channel 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;
+ std::vector<std::string> results;
+ while (server) {
+ std::stringstream ss;
+ switch (server->family) {
+ case AF_INET:
+ ss << AddressToString((char*)&server->addr.addr4, 4);
+ break;
+ case AF_INET6:
+ if (server->udp_port != 0) {
+ ss << '[';
+ }
+ ss << AddressToString((char*)&server->addr.addr6, 16);
+ if (server->udp_port != 0) {
+ ss << ']';
+ }
+ break;
+ default:
+ results.push_back("<unknown family>");
+ break;
+ }
+ if (server->udp_port != 0) {
+ ss << ":" << server->udp_port;
+ }
+ results.push_back(ss.str());
+ server = server->next;
+ }
+ if (servers) ares_free_data(servers);
+ return results;
+}
+
+TransientDir::TransientDir(const std::string& dirname) : dirname_(dirname) {
+ if (mkdir_(dirname_.c_str(), 0755) != 0) {
+ std::cerr << "Failed to create subdirectory '" << dirname_ << "'" << std::endl;
+ }
+}
+
+TransientDir::~TransientDir() {
+ rmdir(dirname_.c_str());
+}
+
+TransientFile::TransientFile(const std::string& filename,
+ const std::string& contents)
+ : filename_(filename) {
+ FILE *f = fopen(filename.c_str(), "w");
+ if (f == nullptr) {
+ std::cerr << "Error: failed to create '" << filename << "'" << std::endl;
+ return;
+ }
+ int rc = fwrite(contents.data(), 1, contents.size(), f);
+ if (rc != (int)contents.size()) {
+ std::cerr << "Error: failed to write contents of '" << filename << "'" << std::endl;
+ }
+ fclose(f);
+}
+
+TransientFile::~TransientFile() {
+ unlink(filename_.c_str());
+}
+
+std::string TempNam(const char *dir, const char *prefix) {
+ char *p = tempnam(dir, prefix);
+ std::string result(p);
+ free(p);
+ return result;
+}
+
+TempFile::TempFile(const std::string& contents)
+ : TransientFile(TempNam(nullptr, "ares"), contents) {
+
+}
+
+VirtualizeIO::VirtualizeIO(ares_channel c)
+ : channel_(c)
+{
+ ares_set_socket_functions(channel_, &default_functions, 0);
+}
+
+VirtualizeIO::~VirtualizeIO() {
+ ares_set_socket_functions(channel_, 0, 0);
+}
+
+} // namespace test
+} // namespace ares
diff --git a/contrib/libs/c-ares/test/ares-test.h b/contrib/libs/c-ares/test/ares-test.h
new file mode 100644
index 0000000000..fd3bc31c27
--- /dev/null
+++ b/contrib/libs/c-ares/test/ares-test.h
@@ -0,0 +1,489 @@
+// -*- mode: c++ -*-
+#ifndef ARES_TEST_H
+#define ARES_TEST_H
+
+#include "dns-proto.h"
+// Include ares internal file for DNS protocol constants
+#include "nameser.h"
+
+#include "ares_setup.h"
+#include "ares.h"
+
+#include "gtest/gtest.h"
+#include "gmock/gmock.h"
+
+#if defined(HAVE_USER_NAMESPACE) && defined(HAVE_UTS_NAMESPACE)
+#define HAVE_CONTAINER
+#endif
+
+#include <functional>
+#include <list>
+#include <map>
+#include <memory>
+#include <set>
+#include <string>
+#include <utility>
+#include <vector>
+
+namespace ares {
+
+typedef unsigned char byte;
+
+namespace test {
+
+extern bool verbose;
+extern int mock_port;
+extern const std::vector<int> both_families;
+extern const std::vector<int> ipv4_family;
+extern const std::vector<int> ipv6_family;
+
+extern const std::vector<std::pair<int, bool>> both_families_both_modes;
+extern const std::vector<std::pair<int, bool>> ipv4_family_both_modes;
+extern const std::vector<std::pair<int, bool>> ipv6_family_both_modes;
+
+// Which parameters to use in tests
+extern std::vector<int> families;
+extern std::vector<std::pair<int, bool>> 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<std::set<int>()> get_extrafds,
+ std::function<void(int)> process_extra);
+std::set<int> 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_t, int> 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<std::string> {
+ 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, int tcpport = 0);
+ ~MockServer();
+
+ // Mock method indicating the processing of a particular <name, RRtype>
+ // 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<byte>& 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<int> 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);
+
+ int udpport_;
+ int tcpport_;
+ int udpfd_;
+ int tcpfd_;
+ std::set<int> connfds_;
+ std::vector<byte> 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<MockServer> NiceMockServer;
+ typedef std::vector< std::unique_ptr<NiceMockServer> > NiceMockServers;
+
+ std::set<int> 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<int, bool> > {
+ public:
+ MockChannelTest() : MockChannelOptsTest(1, GetParam().first, GetParam().second, nullptr, 0) {}
+};
+
+class MockUDPChannelTest
+ : public MockChannelOptsTest,
+ public ::testing::WithParamInterface<int> {
+ public:
+ MockUDPChannelTest() : MockChannelOptsTest(1, GetParam(), false, nullptr, 0) {}
+};
+
+class MockTCPChannelTest
+ : public MockChannelOptsTest,
+ public ::testing::WithParamInterface<int> {
+ 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<std::string> aliases_;
+ int addrtype_; // AF_INET or AF_INET6
+ std::vector<std::string> addrs_;
+};
+std::ostream& operator<<(std::ostream& os, const HostEnt& result);
+
+// Structure that describes the result of an ares_host_callback invocation.
+struct HostResult {
+ // 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<byte> 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<ares_addrinfo, AddrInfoDeleter>;
+
+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<std::string> 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<int(void)> VoidToIntFn;
+typedef std::vector<std::pair<std::string, std::string>> 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<std::string> dirs_;
+ std::vector<std::unique_ptr<TransientFile>> 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<casename>()) { \
+ InnerTestBody(); \
+ } \
+ GTEST_TEST_(casename, testname##_virtualized, \
+ VCLASS_NAME(casename, testname), \
+ ::testing::internal::GetTypeId<casename>()) { \
+ VirtualizeIO vio(channel_); \
+ InnerTestBody(); \
+ } \
+ void VCLASS_NAME(casename, testname)::InnerTestBody()
+
+} // namespace test
+} // namespace ares
+
+#endif
diff --git a/contrib/libs/c-ares/test/config.h b/contrib/libs/c-ares/test/config.h
new file mode 100644
index 0000000000..787575c8e0
--- /dev/null
+++ b/contrib/libs/c-ares/test/config.h
@@ -0,0 +1,81 @@
+/* config.h. Generated from config.h.in by configure. */
+/* config.h.in. Generated from configure.ac by autoheader. */
+
+/* define if the compiler supports basic C++11 syntax */
+/* #undef HAVE_CXX11 */
+
+/* Define to 1 if you have the <dlfcn.h> header file. */
+#define HAVE_DLFCN_H 1
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#define HAVE_INTTYPES_H 1
+
+/* Define to 1 if you have the <memory.h> header file. */
+#define HAVE_MEMORY_H 1
+
+/* Define to 1 if you have the <netdb.h> header file. */
+#define HAVE_NETDB_H 1
+
+/* Define to 1 if you have the <netinet/tcp.h> header file. */
+#define HAVE_NETINET_TCP_H 1
+
+/* Define if you have POSIX threads libraries and header files. */
+#define HAVE_PTHREAD 1
+
+/* Have PTHREAD_PRIO_INHERIT. */
+#define HAVE_PTHREAD_PRIO_INHERIT 1
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#define HAVE_STDINT_H 1
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#define HAVE_STDLIB_H 1
+
+/* Define to 1 if you have the <strings.h> header file. */
+#define HAVE_STRINGS_H 1
+
+/* Define to 1 if you have the <string.h> header file. */
+#define HAVE_STRING_H 1
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#define HAVE_SYS_STAT_H 1
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#define HAVE_SYS_TYPES_H 1
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#define HAVE_UNISTD_H 1
+
+/* Whether user namespaces are available */
+#define HAVE_USER_NAMESPACE 1
+
+/* Whether UTS namespaces are available */
+#define HAVE_UTS_NAMESPACE 1
+
+/* Define to the sub-directory where libtool stores uninstalled libraries. */
+#define LT_OBJDIR ".libs/"
+
+/* Define to the address where bug reports for this package should be sent. */
+#define PACKAGE_BUGREPORT "-"
+
+/* Define to the full name of this package. */
+#define PACKAGE_NAME "c-ares-test"
+
+/* Define to the full name and version of this package. */
+#define PACKAGE_STRING "c-ares-test -"
+
+/* Define to the one symbol short name of this package. */
+#define PACKAGE_TARNAME "c-ares-test"
+
+/* Define to the home page for this package. */
+#define PACKAGE_URL ""
+
+/* Define to the version of this package. */
+#define PACKAGE_VERSION "-"
+
+/* Define to necessary symbol if this constant uses a non-standard name on
+ your system. */
+/* #undef PTHREAD_CREATE_JOINABLE */
+
+/* Define to 1 if you have the ANSI C header files. */
+#define STDC_HEADERS 1
diff --git a/contrib/libs/c-ares/test/dns-proto-test.cc b/contrib/libs/c-ares/test/dns-proto-test.cc
new file mode 100644
index 0000000000..0c36a0c922
--- /dev/null
+++ b/contrib/libs/c-ares/test/dns-proto-test.cc
@@ -0,0 +1,131 @@
+#include "ares-test.h"
+#include "dns-proto.h"
+
+#include <vector>
+
+namespace ares {
+namespace test {
+
+TEST(DNSProto, EncodeQuestions) {
+ DNSPacket pkt;
+ pkt.set_qid(0x1234).set_response().set_aa()
+ .add_question(new DNSQuestion("example.com.", ns_t_a))
+ .add_question(new DNSQuestion("www.example.com", ns_t_aaaa, ns_c_chaos));
+
+ std::vector<byte> data = {
+ 0x12, 0x34, // qid
+ 0x84, // response + query + AA + not-TC + not-RD
+ 0x00, // not-RA + not-Z + not-AD + not-CD + rc=NoError
+ 0x00, 0x02, // num questions
+ 0x00, 0x00, // num answer RRs
+ 0x00, 0x00, // num authority RRs
+ 0x00, 0x00, // num additional RRs
+ // Question 1
+ 0x07, 'e', 'x', 'a', 'm', 'p', 'l', 'e',
+ 0x03, 'c', 'o', 'm',
+ 0x00,
+ 0x00, 0x01, // type A
+ 0x00, 0x01, // class IN
+ // Question 2
+ 0x03, 'w', 'w', 'w',
+ 0x07, 'e', 'x', 'a', 'm', 'p', 'l', 'e',
+ 0x03, 'c', 'o', 'm',
+ 0x00,
+ 0x00, 0x1C, // type AAAA = 28
+ 0x00, 0x03, // class CHAOS = 3
+ };
+ EXPECT_EQ(data, pkt.data());
+}
+
+TEST(DNSProto, EncodeSingleNameAnswers) {
+ DNSPacket pkt;
+ pkt.qid_ = 0x1234;
+ pkt.response_ = true;
+ pkt.aa_ = true;
+ pkt.opcode_ = ns_o_query;
+ pkt.add_answer(new DNSCnameRR("example.com", 0x01020304, "other.com."));
+ pkt.add_auth(new DNSPtrRR("www.example.com", 0x01020304, "www.other.com"));
+
+ std::vector<byte> data = {
+ 0x12, 0x34, // qid
+ 0x84, // response + query + AA + not-TC + not-RD
+ 0x00, // not-RA + not-Z + not-AD + not-CD + rc=NoError
+ 0x00, 0x00, // num questions
+ 0x00, 0x01, // num answer RRs
+ 0x00, 0x01, // num authority RRs
+ 0x00, 0x00, // num additional RRs
+ // Answer 1
+ 0x07, 'e', 'x', 'a', 'm', 'p', 'l', 'e',
+ 0x03, 'c', 'o', 'm',
+ 0x00,
+ 0x00, 0x05, // RR type
+ 0x00, 0x01, // class IN
+ 0x01, 0x02, 0x03, 0x04, // TTL
+ 0x00, 0x0B, // rdata length
+ 0x05, 'o', 't', 'h', 'e', 'r',
+ 0x03, 'c', 'o', 'm',
+ 0x00,
+ // Authority 1
+ 0x03, 'w', 'w', 'w',
+ 0x07, 'e', 'x', 'a', 'm', 'p', 'l', 'e',
+ 0x03, 'c', 'o', 'm',
+ 0x00,
+ 0x00, 0x0c, // RR type
+ 0x00, 0x01, // class IN
+ 0x01, 0x02, 0x03, 0x04, // TTL
+ 0x00, 0x0F, // rdata length
+ 0x03, 'w', 'w', 'w',
+ 0x05, 'o', 't', 'h', 'e', 'r',
+ 0x03, 'c', 'o', 'm',
+ 0x00,
+ };
+ EXPECT_EQ(data, pkt.data());
+}
+
+TEST(DNSProto, EncodeAddressAnswers) {
+ DNSPacket pkt;
+ pkt.qid_ = 0x1234;
+ pkt.response_ = true;
+ pkt.aa_ = true;
+ pkt.opcode_ = ns_o_query;
+ std::vector<byte> addrv4 = {0x02, 0x03, 0x04, 0x05};
+ pkt.add_answer(new DNSARR("example.com", 0x01020304, addrv4));
+ byte addrv6[16] = {0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02,
+ 0x03, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, 0x04};
+ pkt.add_additional(new DNSAaaaRR("www.example.com", 0x01020304, addrv6, 16));
+
+ std::vector<byte> data = {
+ 0x12, 0x34, // qid
+ 0x84, // response + query + AA + not-TC + not-RD
+ 0x00, // not-RA + not-Z + not-AD + not-CD + rc=NoError
+ 0x00, 0x00, // num questions
+ 0x00, 0x01, // num answer RRs
+ 0x00, 0x00, // num authority RRs
+ 0x00, 0x01, // num additional RRs
+ // Answer 1
+ 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,
+ // Additional 1
+ 0x03, 'w', 'w', 'w',
+ 0x07, 'e', 'x', 'a', 'm', 'p', 'l', 'e',
+ 0x03, 'c', 'o', 'm',
+ 0x00,
+ 0x00, 0x1c, // RR type
+ 0x00, 0x01, // class IN
+ 0x01, 0x02, 0x03, 0x04, // TTL
+ 0x00, 0x10, // rdata length
+ 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02,
+ 0x03, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, 0x04
+ };
+ EXPECT_EQ(data, pkt.data());
+}
+
+
+} // namespace test
+} // namespace ares
diff --git a/contrib/libs/c-ares/test/dns-proto.cc b/contrib/libs/c-ares/test/dns-proto.cc
new file mode 100644
index 0000000000..d2fa8b15be
--- /dev/null
+++ b/contrib/libs/c-ares/test/dns-proto.cc
@@ -0,0 +1,638 @@
+#include "dns-proto.h"
+
+// Include ares internal file for DNS protocol details
+#include "ares_setup.h"
+#include "ares.h"
+#include "ares_dns.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <sstream>
+
+namespace ares {
+
+std::string HexDump(std::vector<byte> data) {
+ std::stringstream ss;
+ for (size_t ii = 0; ii < data.size(); ii++) {
+ char buffer[2 + 1];
+ sprintf(buffer, "%02x", data[ii]);
+ ss << buffer;
+ }
+ return ss.str();
+}
+
+std::string HexDump(const byte *data, int len) {
+ return HexDump(std::vector<byte>(data, data + len));
+}
+
+std::string HexDump(const char *data, int len) {
+ return HexDump(reinterpret_cast<const byte*>(data), len);
+}
+
+std::string StatusToString(int status) {
+ switch (status) {
+ case ARES_SUCCESS: return "ARES_SUCCESS";
+ case ARES_ENODATA: return "ARES_ENODATA";
+ case ARES_EFORMERR: return "ARES_EFORMERR";
+ case ARES_ESERVFAIL: return "ARES_ESERVFAIL";
+ case ARES_ENOTFOUND: return "ARES_ENOTFOUND";
+ case ARES_ENOTIMP: return "ARES_ENOTIMP";
+ case ARES_EREFUSED: return "ARES_EREFUSED";
+ case ARES_EBADQUERY: return "ARES_EBADQUERY";
+ case ARES_EBADNAME: return "ARES_EBADNAME";
+ case ARES_EBADFAMILY: return "ARES_EBADFAMILY";
+ case ARES_EBADRESP: return "ARES_EBADRESP";
+ case ARES_ECONNREFUSED: return "ARES_ECONNREFUSED";
+ case ARES_ETIMEOUT: return "ARES_ETIMEOUT";
+ case ARES_EOF: return "ARES_EOF";
+ case ARES_EFILE: return "ARES_EFILE";
+ case ARES_ENOMEM: return "ARES_ENOMEM";
+ case ARES_EDESTRUCTION: return "ARES_EDESTRUCTION";
+ case ARES_EBADSTR: return "ARES_EBADSTR";
+ case ARES_EBADFLAGS: return "ARES_EBADFLAGS";
+ case ARES_ENONAME: return "ARES_ENONAME";
+ case ARES_EBADHINTS: return "ARES_EBADHINTS";
+ case ARES_ENOTINITIALIZED: return "ARES_ENOTINITIALIZED";
+ case ARES_ELOADIPHLPAPI: return "ARES_ELOADIPHLPAPI";
+ case ARES_EADDRGETNETWORKPARAMS: return "ARES_EADDRGETNETWORKPARAMS";
+ case ARES_ECANCELLED: return "ARES_ECANCELLED";
+ default: return "UNKNOWN";
+ }
+}
+
+std::string RcodeToString(int rcode) {
+ switch (rcode) {
+ case ns_r_noerror: return "NOERROR";
+ case ns_r_formerr: return "FORMERR";
+ case ns_r_servfail: return "SERVFAIL";
+ case ns_r_nxdomain: return "NXDOMAIN";
+ case ns_r_notimpl: return "NOTIMPL";
+ case ns_r_refused: return "REFUSED";
+ case ns_r_yxdomain: return "YXDOMAIN";
+ case ns_r_yxrrset: return "YXRRSET";
+ case ns_r_nxrrset: return "NXRRSET";
+ case ns_r_notauth: return "NOTAUTH";
+ case ns_r_notzone: return "NOTZONE";
+ case ns_r_badsig: return "BADSIG";
+ case ns_r_badkey: return "BADKEY";
+ case ns_r_badtime: return "BADTIME";
+ default: return "UNKNOWN";
+ }
+}
+
+std::string RRTypeToString(int rrtype) {
+ switch (rrtype) {
+ case ns_t_a: return "A";
+ case ns_t_ns: return "NS";
+ case ns_t_md: return "MD";
+ case ns_t_mf: return "MF";
+ case ns_t_cname: return "CNAME";
+ case ns_t_soa: return "SOA";
+ case ns_t_mb: return "MB";
+ case ns_t_mg: return "MG";
+ case ns_t_mr: return "MR";
+ case ns_t_null: return "NULL";
+ case ns_t_wks: return "WKS";
+ case ns_t_ptr: return "PTR";
+ case ns_t_hinfo: return "HINFO";
+ case ns_t_minfo: return "MINFO";
+ case ns_t_mx: return "MX";
+ case ns_t_txt: return "TXT";
+ case ns_t_rp: return "RP";
+ case ns_t_afsdb: return "AFSDB";
+ case ns_t_x25: return "X25";
+ case ns_t_isdn: return "ISDN";
+ case ns_t_rt: return "RT";
+ case ns_t_nsap: return "NSAP";
+ case ns_t_nsap_ptr: return "NSAP_PTR";
+ case ns_t_sig: return "SIG";
+ case ns_t_key: return "KEY";
+ case ns_t_px: return "PX";
+ case ns_t_gpos: return "GPOS";
+ case ns_t_aaaa: return "AAAA";
+ case ns_t_loc: return "LOC";
+ case ns_t_nxt: return "NXT";
+ case ns_t_eid: return "EID";
+ case ns_t_nimloc: return "NIMLOC";
+ case ns_t_srv: return "SRV";
+ case ns_t_atma: return "ATMA";
+ case ns_t_naptr: return "NAPTR";
+ case ns_t_kx: return "KX";
+ case ns_t_cert: return "CERT";
+ case ns_t_a6: return "A6";
+ case ns_t_dname: return "DNAME";
+ case ns_t_sink: return "SINK";
+ case ns_t_opt: return "OPT";
+ case ns_t_apl: return "APL";
+ case ns_t_ds: return "DS";
+ case ns_t_sshfp: return "SSHFP";
+ case ns_t_rrsig: return "RRSIG";
+ case ns_t_nsec: return "NSEC";
+ case ns_t_dnskey: return "DNSKEY";
+ case ns_t_tkey: return "TKEY";
+ case ns_t_tsig: return "TSIG";
+ case ns_t_ixfr: return "IXFR";
+ case ns_t_axfr: return "AXFR";
+ case ns_t_mailb: return "MAILB";
+ case ns_t_maila: return "MAILA";
+ case ns_t_any: return "ANY";
+ case ns_t_zxfr: return "ZXFR";
+ case ns_t_max: return "MAX";
+ default: return "UNKNOWN";
+ }
+}
+
+std::string ClassToString(int qclass) {
+ switch (qclass) {
+ case ns_c_in: return "IN";
+ case ns_c_chaos: return "CHAOS";
+ case ns_c_hs: return "HESIOD";
+ case ns_c_none: return "NONE";
+ case ns_c_any: return "ANY";
+ default: return "UNKNOWN";
+ }
+}
+
+std::string AddressToString(const void* vaddr, int len) {
+ const byte* addr = reinterpret_cast<const byte*>(vaddr);
+ 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]);
+ 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]);
+ ss << buffer;
+ }
+ } else {
+ ss << "!" << HexDump(addr, len) << "!";
+ }
+ return ss.str();
+}
+
+std::string PacketToString(const std::vector<byte>& packet) {
+ const byte* data = packet.data();
+ int len = packet.size();
+ std::stringstream ss;
+ if (len < NS_HFIXEDSZ) {
+ ss << "(too short, len " << len << ")";
+ return ss.str();
+ }
+ ss << ((DNS_HEADER_QR(data) == 0) ? "REQ " : "RSP ");
+ switch (DNS_HEADER_OPCODE(data)) {
+ case ns_o_query: ss << "QRY "; break;
+ case ns_o_iquery: ss << "IQRY "; break;
+ case ns_o_status: ss << "STATUS "; break;
+ case ns_o_notify: ss << "NOTIFY "; break;
+ case ns_o_update: ss << "UPDATE "; break;
+ default: ss << "UNKNOWN(" << DNS_HEADER_OPCODE(data) << ") "; break;
+ }
+ if (DNS_HEADER_AA(data)) ss << "AA ";
+ if (DNS_HEADER_TC(data)) ss << "TC ";
+ if (DNS_HEADER_RD(data)) ss << "RD ";
+ if (DNS_HEADER_RA(data)) ss << "RA ";
+ if (DNS_HEADER_Z(data)) ss << "Z ";
+ if (DNS_HEADER_QR(data) == 1) ss << RcodeToString(DNS_HEADER_RCODE(data));
+
+ int nquestions = DNS_HEADER_QDCOUNT(data);
+ int nanswers = DNS_HEADER_ANCOUNT(data);
+ int nauths = DNS_HEADER_NSCOUNT(data);
+ int nadds = DNS_HEADER_ARCOUNT(data);
+
+ const byte* pq = data + NS_HFIXEDSZ;
+ len -= NS_HFIXEDSZ;
+ for (int ii = 0; ii < nquestions; ii++) {
+ ss << " Q:" << QuestionToString(packet, &pq, &len);
+ }
+ const byte* prr = pq;
+ for (int ii = 0; ii < nanswers; ii++) {
+ ss << " A:" << RRToString(packet, &prr, &len);
+ }
+ for (int ii = 0; ii < nauths; ii++) {
+ ss << " AUTH:" << RRToString(packet, &prr, &len);
+ }
+ for (int ii = 0; ii < nadds; ii++) {
+ ss << " ADD:" << RRToString(packet, &prr, &len);
+ }
+ return ss.str();
+}
+
+std::string QuestionToString(const std::vector<byte>& packet,
+ const byte** data, int* len) {
+ std::stringstream ss;
+ ss << "{";
+ if (*len < NS_QFIXEDSZ) {
+ ss << "(too short, len " << *len << ")";
+ return ss.str();
+ }
+
+ char *name = nullptr;
+ long enclen;
+ int rc = ares_expand_name(*data, packet.data(), packet.size(), &name, &enclen);
+ if (rc != ARES_SUCCESS) {
+ ss << "(error from ares_expand_name)";
+ return ss.str();
+ }
+ if (enclen > *len) {
+ ss << "(error, encoded name len " << enclen << "bigger than remaining data " << *len << " bytes)";
+ return ss.str();
+ }
+ *len -= enclen;
+ *data += enclen;
+ ss << "'" << name << "' ";
+ ares_free_string(name);
+ if (*len < NS_QFIXEDSZ) {
+ ss << "(too short, len left " << *len << ")";
+ return ss.str();
+ }
+ ss << ClassToString(DNS_QUESTION_CLASS(*data)) << " ";
+ ss << RRTypeToString(DNS_QUESTION_TYPE(*data));
+ *data += NS_QFIXEDSZ;
+ *len -= NS_QFIXEDSZ;
+ ss << "}";
+ return ss.str();
+}
+
+std::string RRToString(const std::vector<byte>& packet,
+ const byte** data, int* len) {
+ std::stringstream ss;
+ ss << "{";
+ if (*len < NS_RRFIXEDSZ) {
+ ss << "too short, len " << *len << ")";
+ return ss.str();
+ }
+
+ char *name = nullptr;
+ long enclen;
+ int rc = ares_expand_name(*data, packet.data(), packet.size(), &name, &enclen);
+ if (rc != ARES_SUCCESS) {
+ ss << "(error from ares_expand_name)";
+ return ss.str();
+ }
+ if (enclen > *len) {
+ ss << "(error, encoded name len " << enclen << "bigger than remaining data " << *len << " bytes)";
+ return ss.str();
+ }
+ *len -= enclen;
+ *data += enclen;
+ ss << "'" << name << "' ";
+ ares_free_string(name);
+ name = nullptr;
+
+ if (*len < NS_RRFIXEDSZ) {
+ ss << "(too short, len left " << *len << ")";
+ return ss.str();
+ }
+ int rrtype = DNS_RR_TYPE(*data);
+ if (rrtype == ns_t_opt) {
+ ss << "MAXUDP=" << DNS_RR_CLASS(*data) << " ";
+ ss << RRTypeToString(rrtype) << " ";
+ ss << "RCODE2=" << DNS_RR_TTL(*data);
+ } else {
+ ss << ClassToString(DNS_RR_CLASS(*data)) << " ";
+ ss << RRTypeToString(rrtype) << " ";
+ ss << "TTL=" << DNS_RR_TTL(*data);
+ }
+ int rdatalen = DNS_RR_LEN(*data);
+
+ *data += NS_RRFIXEDSZ;
+ *len -= NS_RRFIXEDSZ;
+ if (*len < rdatalen) {
+ ss << "(RR too long at " << rdatalen << ", len left " << *len << ")";
+ } else {
+ switch (rrtype) {
+ case ns_t_a:
+ case ns_t_aaaa:
+ ss << " " << AddressToString(*data, rdatalen);
+ break;
+ case ns_t_txt: {
+ const byte* p = *data;
+ while (p < (*data + rdatalen)) {
+ int len = *p++;
+ if ((p + len) <= (*data + rdatalen)) {
+ std::string txt(p, p + len);
+ ss << " " << len << ":'" << txt << "'";
+ } else {
+ ss << "(string too long)";
+ }
+ p += len;
+ }
+ break;
+ }
+ case ns_t_cname:
+ case ns_t_ns:
+ case ns_t_ptr: {
+ int rc = ares_expand_name(*data, packet.data(), packet.size(), &name, &enclen);
+ if (rc != ARES_SUCCESS) {
+ ss << "(error from ares_expand_name)";
+ break;
+ }
+ ss << " '" << name << "'";
+ ares_free_string(name);
+ break;
+ }
+ case ns_t_mx:
+ if (rdatalen > 2) {
+ int rc = ares_expand_name(*data + 2, packet.data(), packet.size(), &name, &enclen);
+ if (rc != ARES_SUCCESS) {
+ ss << "(error from ares_expand_name)";
+ break;
+ }
+ ss << " " << DNS__16BIT(*data) << " '" << name << "'";
+ ares_free_string(name);
+ } else {
+ ss << "(RR too short)";
+ }
+ break;
+ case ns_t_srv: {
+ if (rdatalen > 6) {
+ const byte* p = *data;
+ unsigned long prio = DNS__16BIT(p);
+ 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);
+ if (rc != ARES_SUCCESS) {
+ ss << "(error from ares_expand_name)";
+ break;
+ }
+ ss << prio << " " << weight << " " << port << " '" << name << "'";
+ ares_free_string(name);
+ } else {
+ ss << "(RR too short)";
+ }
+ break;
+ }
+ case ns_t_soa: {
+ const byte* p = *data;
+ int rc = ares_expand_name(p, packet.data(), packet.size(), &name, &enclen);
+ if (rc != ARES_SUCCESS) {
+ ss << "(error from ares_expand_name)";
+ break;
+ }
+ ss << " '" << name << "'";
+ ares_free_string(name);
+ p += enclen;
+ rc = ares_expand_name(p, packet.data(), packet.size(), &name, &enclen);
+ if (rc != ARES_SUCCESS) {
+ ss << "(error from ares_expand_name)";
+ break;
+ }
+ ss << " '" << name << "'";
+ ares_free_string(name);
+ p += enclen;
+ if ((p + 20) <= (*data + rdatalen)) {
+ unsigned long serial = DNS__32BIT(p);
+ unsigned long refresh = DNS__32BIT(p + 4);
+ unsigned long retry = DNS__32BIT(p + 8);
+ unsigned long expire = DNS__32BIT(p + 12);
+ unsigned long minimum = DNS__32BIT(p + 16);
+ ss << " " << serial << " " << refresh << " " << retry << " " << expire << " " << minimum;
+ } else {
+ ss << "(RR too short)";
+ }
+ break;
+ }
+ case ns_t_naptr: {
+ if (rdatalen > 7) {
+ const byte* p = *data;
+ unsigned long order = DNS__16BIT(p);
+ unsigned long pref = DNS__16BIT(p + 2);
+ p += 4;
+ ss << order << " " << pref;
+
+ int len = *p++;
+ std::string flags(p, p + len);
+ ss << " " << flags;
+ p += len;
+
+ len = *p++;
+ std::string service(p, p + len);
+ ss << " '" << service << "'";
+ p += len;
+
+ len = *p++;
+ std::string regexp(p, p + len);
+ ss << " '" << regexp << "'";
+ p += len;
+
+ int rc = ares_expand_name(p, packet.data(), packet.size(), &name, &enclen);
+ if (rc != ARES_SUCCESS) {
+ ss << "(error from ares_expand_name)";
+ break;
+ }
+ ss << " '" << name << "'";
+ ares_free_string(name);
+ } else {
+ ss << "(RR too short)";
+ }
+ break;
+ }
+ default:
+ ss << " " << HexDump(*data, rdatalen);
+ break;
+ }
+ }
+ *data += rdatalen;
+ *len -= rdatalen;
+
+ ss << "}";
+ return ss.str();
+}
+
+void PushInt32(std::vector<byte>* 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);
+}
+
+void PushInt16(std::vector<byte>* data, int value) {
+ data->push_back((value & 0xff00) >> 8);
+ data->push_back(value & 0x00ff);
+}
+
+std::vector<byte> EncodeString(const std::string& name) {
+ std::vector<byte> data;
+ std::stringstream ss(name);
+ std::string label;
+ // TODO: cope with escapes
+ while (std::getline(ss, label, '.')) {
+ data.push_back(label.length());
+ data.insert(data.end(), label.begin(), label.end());
+ }
+ data.push_back(0);
+ return data;
+}
+
+std::vector<byte> DNSQuestion::data() const {
+ std::vector<byte> data;
+ std::vector<byte> encname = EncodeString(name_);
+ data.insert(data.end(), encname.begin(), encname.end());
+ PushInt16(&data, rrtype_);
+ PushInt16(&data, qclass_);
+ return data;
+}
+
+std::vector<byte> DNSRR::data() const {
+ std::vector<byte> data = DNSQuestion::data();
+ PushInt32(&data, ttl_);
+ return data;
+}
+
+std::vector<byte> DNSSingleNameRR::data() const {
+ std::vector<byte> data = DNSRR::data();
+ std::vector<byte> encname = EncodeString(other_);
+ int len = encname.size();
+ PushInt16(&data, len);
+ data.insert(data.end(), encname.begin(), encname.end());
+ return data;
+}
+
+std::vector<byte> DNSTxtRR::data() const {
+ std::vector<byte> data = DNSRR::data();
+ int len = 0;
+ for (const std::string& txt : txt_) {
+ len += (1 + txt.size());
+ }
+ PushInt16(&data, len);
+ for (const std::string& txt : txt_) {
+ data.push_back(txt.size());
+ data.insert(data.end(), txt.begin(), txt.end());
+ }
+ return data;
+}
+
+std::vector<byte> DNSMxRR::data() const {
+ std::vector<byte> data = DNSRR::data();
+ std::vector<byte> encname = EncodeString(other_);
+ int len = 2 + encname.size();
+ PushInt16(&data, len);
+ PushInt16(&data, pref_);
+ data.insert(data.end(), encname.begin(), encname.end());
+ return data;
+}
+
+std::vector<byte> DNSSrvRR::data() const {
+ std::vector<byte> data = DNSRR::data();
+ std::vector<byte> encname = EncodeString(target_);
+ int len = 6 + encname.size();
+ PushInt16(&data, len);
+ PushInt16(&data, prio_);
+ PushInt16(&data, weight_);
+ PushInt16(&data, port_);
+ data.insert(data.end(), encname.begin(), encname.end());
+ return data;
+}
+
+std::vector<byte> DNSAddressRR::data() const {
+ std::vector<byte> data = DNSRR::data();
+ int len = addr_.size();
+ PushInt16(&data, len);
+ data.insert(data.end(), addr_.begin(), addr_.end());
+ return data;
+}
+
+std::vector<byte> DNSSoaRR::data() const {
+ std::vector<byte> data = DNSRR::data();
+ std::vector<byte> encname1 = EncodeString(nsname_);
+ std::vector<byte> encname2 = EncodeString(rname_);
+ int len = encname1.size() + encname2.size() + 5*4;
+ PushInt16(&data, len);
+ data.insert(data.end(), encname1.begin(), encname1.end());
+ data.insert(data.end(), encname2.begin(), encname2.end());
+ PushInt32(&data, serial_);
+ PushInt32(&data, refresh_);
+ PushInt32(&data, retry_);
+ PushInt32(&data, expire_);
+ PushInt32(&data, minimum_);
+ return data;
+}
+
+std::vector<byte> DNSOptRR::data() const {
+ std::vector<byte> data = DNSRR::data();
+ int len = 0;
+ for (const DNSOption& opt : opts_) {
+ len += (4 + opt.data_.size());
+ }
+ PushInt16(&data, len);
+ for (const DNSOption& opt : opts_) {
+ PushInt16(&data, opt.code_);
+ PushInt16(&data, opt.data_.size());
+ data.insert(data.end(), opt.data_.begin(), opt.data_.end());
+ }
+ return data;
+}
+
+std::vector<byte> DNSNaptrRR::data() const {
+ std::vector<byte> data = DNSRR::data();
+ std::vector<byte> encname = EncodeString(replacement_);
+ int len = (4 + 1 + flags_.size() + 1 + service_.size() + 1 + regexp_.size() + encname.size());
+ PushInt16(&data, len);
+ PushInt16(&data, order_);
+ PushInt16(&data, pref_);
+ data.push_back(flags_.size());
+ data.insert(data.end(), flags_.begin(), flags_.end());
+ data.push_back(service_.size());
+ data.insert(data.end(), service_.begin(), service_.end());
+ data.push_back(regexp_.size());
+ data.insert(data.end(), regexp_.begin(), regexp_.end());
+ data.insert(data.end(), encname.begin(), encname.end());
+ return data;
+}
+
+std::vector<byte> DNSPacket::data() const {
+ std::vector<byte> data;
+ PushInt16(&data, qid_);
+ byte b = 0x00;
+ if (response_) b |= 0x80;
+ b |= ((opcode_ & 0x0f) << 3);
+ if (aa_) b |= 0x04;
+ if (tc_) b |= 0x02;
+ if (rd_) b |= 0x01;
+ data.push_back(b);
+ b = 0x00;
+ if (ra_) b |= 0x80;
+ if (z_) b |= 0x40;
+ if (ad_) b |= 0x20;
+ if (cd_) b |= 0x10;
+ b |= (rcode_ & 0x0f);
+ data.push_back(b);
+
+ int count = questions_.size();
+ PushInt16(&data, count);
+ count = answers_.size();
+ PushInt16(&data, count);
+ count = auths_.size();
+ PushInt16(&data, count);
+ count = adds_.size();
+ PushInt16(&data, count);
+
+ for (const std::unique_ptr<DNSQuestion>& question : questions_) {
+ std::vector<byte> qdata = question->data();
+ data.insert(data.end(), qdata.begin(), qdata.end());
+ }
+ for (const std::unique_ptr<DNSRR>& rr : answers_) {
+ std::vector<byte> rrdata = rr->data();
+ data.insert(data.end(), rrdata.begin(), rrdata.end());
+ }
+ for (const std::unique_ptr<DNSRR>& rr : auths_) {
+ std::vector<byte> rrdata = rr->data();
+ data.insert(data.end(), rrdata.begin(), rrdata.end());
+ }
+ for (const std::unique_ptr<DNSRR>& rr : adds_) {
+ std::vector<byte> rrdata = rr->data();
+ data.insert(data.end(), rrdata.begin(), rrdata.end());
+ }
+ return data;
+}
+
+} // namespace ares
diff --git a/contrib/libs/c-ares/test/dns-proto.h b/contrib/libs/c-ares/test/dns-proto.h
new file mode 100644
index 0000000000..346711dfe9
--- /dev/null
+++ b/contrib/libs/c-ares/test/dns-proto.h
@@ -0,0 +1,242 @@
+// -*- mode: c++ -*-
+#ifndef DNS_PROTO_H
+#define DNS_PROTO_H
+// Utilities for processing DNS packet contents
+
+// Include ares internal file for DNS protocol constants
+#include "nameser.h"
+
+#include <memory>
+#include <string>
+#include <vector>
+
+namespace ares {
+
+typedef unsigned char byte;
+
+std::string HexDump(std::vector<byte> 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<byte>& packet);
+std::string QuestionToString(const std::vector<byte>& packet,
+ const byte** data, int* len);
+std::string RRToString(const std::vector<byte>& packet,
+ const byte** data, int* len);
+
+
+// Manipulate DNS protocol data.
+void PushInt32(std::vector<byte>* data, int value);
+void PushInt16(std::vector<byte>* data, int value);
+std::vector<byte> EncodeString(const std::string& name);
+
+struct DNSQuestion {
+ DNSQuestion(const std::string& name, ns_type rrtype, ns_class qclass)
+ : name_(name), rrtype_(rrtype), qclass_(qclass) {}
+ DNSQuestion(const std::string& name, ns_type rrtype)
+ : name_(name), rrtype_(rrtype), qclass_(ns_c_in) {}
+ virtual ~DNSQuestion() {}
+ virtual std::vector<byte> data() const;
+ std::string name_;
+ ns_type rrtype_;
+ ns_class qclass_;
+};
+
+struct DNSRR : public DNSQuestion {
+ DNSRR(const std::string& name, ns_type rrtype, ns_class qclass, int ttl)
+ : DNSQuestion(name, rrtype, qclass), ttl_(ttl) {}
+ DNSRR(const std::string& name, ns_type rrtype, int ttl)
+ : DNSQuestion(name, rrtype), ttl_(ttl) {}
+ virtual ~DNSRR() {}
+ virtual std::vector<byte> data() const = 0;
+ int ttl_;
+};
+
+struct DNSAddressRR : public DNSRR {
+ DNSAddressRR(const std::string& name, ns_type rrtype, int ttl,
+ const byte* addr, int addrlen)
+ : DNSRR(name, rrtype, ttl), addr_(addr, addr + addrlen) {}
+ DNSAddressRR(const std::string& name, ns_type rrtype, int ttl,
+ const std::vector<byte>& addr)
+ : DNSRR(name, rrtype, ttl), addr_(addr) {}
+ virtual std::vector<byte> data() const;
+ std::vector<byte> addr_;
+};
+
+struct DNSARR : public DNSAddressRR {
+ DNSARR(const std::string& name, int ttl, const byte* addr, int addrlen)
+ : DNSAddressRR(name, ns_t_a, ttl, addr, addrlen) {}
+ DNSARR(const std::string& name, int ttl, const std::vector<byte>& addr)
+ : DNSAddressRR(name, ns_t_a, ttl, addr) {}
+};
+
+struct DNSAaaaRR : public DNSAddressRR {
+ DNSAaaaRR(const std::string& name, int ttl, const byte* addr, int addrlen)
+ : DNSAddressRR(name, ns_t_aaaa, ttl, addr, addrlen) {}
+ DNSAaaaRR(const std::string& name, int ttl, const std::vector<byte>& addr)
+ : DNSAddressRR(name, ns_t_aaaa, ttl, addr) {}
+};
+
+struct DNSSingleNameRR : public DNSRR {
+ DNSSingleNameRR(const std::string& name, ns_type rrtype, int ttl,
+ const std::string& other)
+ : DNSRR(name, rrtype, ttl), other_(other) {}
+ virtual std::vector<byte> data() const;
+ std::string other_;
+};
+
+struct DNSCnameRR : public DNSSingleNameRR {
+ DNSCnameRR(const std::string& name, int ttl, const std::string& other)
+ : DNSSingleNameRR(name, ns_t_cname, ttl, other) {}
+};
+
+struct DNSNsRR : public DNSSingleNameRR {
+ DNSNsRR(const std::string& name, int ttl, const std::string& other)
+ : DNSSingleNameRR(name, ns_t_ns, ttl, other) {}
+};
+
+struct DNSPtrRR : public DNSSingleNameRR {
+ DNSPtrRR(const std::string& name, int ttl, const std::string& other)
+ : DNSSingleNameRR(name, ns_t_ptr, ttl, other) {}
+};
+
+struct DNSTxtRR : public DNSRR {
+ DNSTxtRR(const std::string& name, int ttl, const std::vector<std::string>& txt)
+ : DNSRR(name, ns_t_txt, ttl), txt_(txt) {}
+ virtual std::vector<byte> data() const;
+ std::vector<std::string> txt_;
+};
+
+struct DNSMxRR : public DNSRR {
+ DNSMxRR(const std::string& name, int ttl, int pref, const std::string& other)
+ : DNSRR(name, ns_t_mx, ttl), pref_(pref), other_(other) {}
+ virtual std::vector<byte> 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, ns_t_srv, ttl), prio_(prio), weight_(weight), port_(port), target_(target) {}
+ virtual std::vector<byte> data() const;
+ int prio_;
+ int weight_;
+ int port_;
+ 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, ns_t_soa, ttl), nsname_(nsname), rname_(rname),
+ serial_(serial), refresh_(refresh), retry_(retry),
+ expire_(expire), minimum_(minimum) {}
+ virtual std::vector<byte> 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, ns_t_naptr, ttl), order_(order), pref_(pref),
+ flags_(flags), service_(service), regexp_(regexp), replacement_(replacement) {}
+ virtual std::vector<byte> data() const;
+ int order_;
+ int pref_;
+ std::string flags_;
+ std::string service_;
+ std::string regexp_;
+ std::string replacement_;
+};
+
+struct DNSOption {
+ int code_;
+ std::vector<byte> data_;
+};
+
+struct DNSOptRR : public DNSRR {
+ DNSOptRR(int extrcode, int udpsize)
+ : DNSRR("", ns_t_opt, static_cast<ns_class>(udpsize), extrcode) {}
+ virtual std::vector<byte> data() const;
+ std::vector<DNSOption> opts_;
+};
+
+struct DNSPacket {
+ DNSPacket()
+ : qid_(0), response_(false), opcode_(ns_o_query),
+ aa_(false), tc_(false), rd_(false), ra_(false),
+ z_(false), ad_(false), cd_(false), rcode_(ns_r_noerror) {}
+ // Convenience functions that take ownership of given pointers.
+ DNSPacket& add_question(DNSQuestion *q) {
+ questions_.push_back(std::unique_ptr<DNSQuestion>(q));
+ return *this;
+ }
+ DNSPacket& add_answer(DNSRR *q) {
+ answers_.push_back(std::unique_ptr<DNSRR>(q));
+ return *this;
+ }
+ DNSPacket& add_auth(DNSRR *q) {
+ auths_.push_back(std::unique_ptr<DNSRR>(q));
+ return *this;
+ }
+ DNSPacket& add_additional(DNSRR *q) {
+ adds_.push_back(std::unique_ptr<DNSRR>(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(ns_rcode rcode) { rcode_ = rcode; return *this; }
+
+ // Return the encoded packet.
+ std::vector<byte> data() const;
+
+ int qid_;
+ bool response_;
+ ns_opcode opcode_;
+ bool aa_;
+ bool tc_;
+ bool rd_;
+ bool ra_;
+ bool z_;
+ bool ad_;
+ bool cd_;
+ ns_rcode rcode_;
+ std::vector<std::unique_ptr<DNSQuestion>> questions_;
+ std::vector<std::unique_ptr<DNSRR>> answers_;
+ std::vector<std::unique_ptr<DNSRR>> auths_;
+ std::vector<std::unique_ptr<DNSRR>> adds_;
+};
+
+} // namespace ares
+
+#endif
diff --git a/contrib/libs/c-ares/test/ya.make b/contrib/libs/c-ares/test/ya.make
new file mode 100644
index 0000000000..ef42eab230
--- /dev/null
+++ b/contrib/libs/c-ares/test/ya.make
@@ -0,0 +1,60 @@
+# Generated by devtools/yamaker.
+
+GTEST(arestest)
+
+OWNER(max42 g:cpp-contrib)
+
+LICENSE(MIT)
+
+SIZE(MEDIUM)
+
+TAG(ya:external)
+
+REQUIREMENTS(network:full)
+
+PEERDIR(
+ contrib/libs/c-ares
+)
+
+ADDINCL(
+ contrib/libs/c-ares
+ contrib/libs/c-ares/test
+)
+
+NO_COMPILER_WARNINGS()
+
+CFLAGS(
+ -DHAVE_CONFIG_H
+)
+
+IF (NOT DLL_FOR)
+ CFLAGS(
+ -DCARES_STATICLIB
+ )
+ENDIF()
+
+SRCS(
+ ares-test-init.cc
+ ares-test-internal.cc
+ ares-test-live.cc
+ ares-test-misc.cc
+ ares-test-mock-ai.cc
+ ares-test-mock.cc
+ ares-test-ns.cc
+ ares-test-parse-a.cc
+ ares-test-parse-aaaa.cc
+ ares-test-parse-mx.cc
+ ares-test-parse-naptr.cc
+ ares-test-parse-ns.cc
+ ares-test-parse-ptr.cc
+ ares-test-parse-soa-any.cc
+ ares-test-parse-soa.cc
+ ares-test-parse-srv.cc
+ ares-test-parse-txt.cc
+ ares-test-parse.cc
+ ares-test.cc
+ dns-proto-test.cc
+ dns-proto.cc
+)
+
+END()
diff --git a/contrib/libs/c-ares/windows_port.c b/contrib/libs/c-ares/windows_port.c
new file mode 100644
index 0000000000..03acd1c1e2
--- /dev/null
+++ b/contrib/libs/c-ares/windows_port.c
@@ -0,0 +1,22 @@
+#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/contrib/libs/c-ares/ya.make b/contrib/libs/c-ares/ya.make
new file mode 100644
index 0000000000..bd35762e44
--- /dev/null
+++ b/contrib/libs/c-ares/ya.make
@@ -0,0 +1,120 @@
+# Generated by devtools/yamaker from nixpkgs e392df43c9f302d4a0892caaadcad3cd693edf9e.
+
+LIBRARY()
+
+OWNER(
+ max42
+ g:cpp-contrib
+)
+
+VERSION(1.16.1)
+
+ORIGINAL_SOURCE(https://c-ares.haxx.se/download/c-ares-1.16.1.tar.gz)
+
+LICENSE(
+ BSD-3-Clause AND
+ ISC AND
+ MIT AND
+ NTP
+)
+
+LICENSE_TEXTS(.yandex_meta/licenses.list.txt)
+
+PEERDIR(
+ contrib/libs/libc_compat
+)
+
+ADDINCL(
+ contrib/libs/c-ares
+)
+
+NO_COMPILER_WARNINGS()
+
+CFLAGS(
+ -DCARES_BUILDING_LIBRARY
+ -DCARES_SYMBOL_HIDING
+ -DHAVE_CONFIG_H
+)
+
+IF (NOT DLL_FOR)
+ CFLAGS(
+ -DCARES_STATICLIB
+ )
+ENDIF()
+
+IF (ARCH_ARM7)
+ CFLAGS(
+ GLOBAL -D__SIZEOF_LONG__=4
+ )
+ENDIF()
+
+SRCS(
+ ares__close_sockets.c
+ ares__get_hostent.c
+ ares__parse_into_addrinfo.c
+ ares__read_line.c
+ ares__readaddrinfo.c
+ ares__sortaddrinfo.c
+ ares__timeval.c
+ ares_android.c
+ ares_cancel.c
+ ares_create_query.c
+ ares_data.c
+ ares_destroy.c
+ ares_expand_name.c
+ ares_expand_string.c
+ ares_fds.c
+ ares_free_hostent.c
+ ares_free_string.c
+ ares_freeaddrinfo.c
+ ares_getaddrinfo.c
+ ares_getenv.c
+ ares_gethostbyaddr.c
+ ares_gethostbyname.c
+ ares_getnameinfo.c
+ ares_getopt.c
+ ares_getsock.c
+ ares_init.c
+ ares_library_init.c
+ ares_llist.c
+ ares_mkquery.c
+ ares_nowarn.c
+ ares_options.c
+ ares_parse_a_reply.c
+ ares_parse_aaaa_reply.c
+ ares_parse_mx_reply.c
+ ares_parse_naptr_reply.c
+ ares_parse_ns_reply.c
+ ares_parse_ptr_reply.c
+ ares_parse_soa_reply.c
+ ares_parse_srv_reply.c
+ ares_parse_txt_reply.c
+ ares_platform.c
+ ares_process.c
+ ares_query.c
+ ares_search.c
+ ares_send.c
+ ares_strcasecmp.c
+ ares_strdup.c
+ ares_strerror.c
+ ares_strsplit.c
+ ares_timeout.c
+ ares_version.c
+ ares_writev.c
+ atomic.cpp
+ bitncmp.c
+ inet_net_pton.c
+ inet_ntop.c
+ windows_port.c
+)
+
+CHECK_CONFIG_H(ares_setup.h)
+
+END()
+
+RECURSE(
+ acountry
+ adig
+ ahost
+ test
+)